summaryrefslogtreecommitdiff
path: root/src/main/cpp/mdc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/cpp/mdc.cpp')
-rw-r--r--src/main/cpp/mdc.cpp236
1 files changed, 236 insertions, 0 deletions
diff --git a/src/main/cpp/mdc.cpp b/src/main/cpp/mdc.cpp
new file mode 100644
index 0000000..a91bef6
--- /dev/null
+++ b/src/main/cpp/mdc.cpp
@@ -0,0 +1,236 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <log4cxx/mdc.h>
+#include <log4cxx/helpers/transcoder.h>
+#include <log4cxx/helpers/threadspecificdata.h>
+
+#if LOG4CXX_CFSTRING_API
+#include <CoreFoundation/CFString.h>
+#endif
+
+
+using namespace log4cxx;
+using namespace log4cxx::helpers;
+
+MDC::MDC(const std::string& key1, const std::string& value) : key()
+{
+ Transcoder::decode(key1, key);
+ LOG4CXX_DECODE_CHAR(v, value);
+ putLS(key, v);
+}
+
+MDC::~MDC()
+{
+ LogString prevVal;
+ remove(key, prevVal);
+}
+
+void MDC::putLS(const LogString& key, const LogString& value)
+{
+ ThreadSpecificData::put(key, value);
+}
+
+void MDC::put(const std::string& key, const std::string& value)
+{
+ LOG4CXX_DECODE_CHAR(lkey, key);
+ LOG4CXX_DECODE_CHAR(lvalue, value);
+ putLS(lkey, lvalue);
+}
+
+bool MDC::get(const LogString& key, LogString& value)
+{
+ ThreadSpecificData* data = ThreadSpecificData::getCurrentData();
+ if (data != 0) {
+ Map& map = data->getMap();
+
+ Map::iterator it = map.find(key);
+ if (it != map.end()) {
+ value.append(it->second);
+ return true;
+ }
+ data->recycle();
+ }
+ return false;
+}
+
+std::string MDC::get(const std::string& key)
+{
+ LOG4CXX_DECODE_CHAR(lkey, key);
+ LogString lvalue;
+ if (get(lkey, lvalue)) {
+ LOG4CXX_ENCODE_CHAR(value, lvalue);
+ return value;
+ }
+ return std::string();
+}
+
+bool MDC::remove(const LogString& key, LogString& value)
+{
+ ThreadSpecificData* data = ThreadSpecificData::getCurrentData();
+ if (data != 0) {
+ Map& map = data->getMap();
+ Map::iterator it;
+ if ((it = map.find(key)) != map.end()) {
+ value = it->second;
+ map.erase(it);
+ data->recycle();
+ return true;
+ }
+ }
+ return false;
+}
+
+std::string MDC::remove(const std::string& key)
+{
+ LOG4CXX_DECODE_CHAR(lkey, key);
+ LogString lvalue;
+ if (remove(lkey, lvalue)) {
+ LOG4CXX_ENCODE_CHAR(value, lvalue);
+ return value;
+ }
+ return std::string();
+}
+
+
+void MDC::clear()
+{
+ ThreadSpecificData* data = ThreadSpecificData::getCurrentData();
+ if (data != 0) {
+ Map& map = data->getMap();
+ map.erase(map.begin(), map.end());
+ data->recycle();
+ }
+}
+
+
+#if LOG4CXX_WCHAR_T_API
+MDC::MDC(const std::wstring& key1, const std::wstring& value) : key()
+{
+ Transcoder::decode(key1, key);
+ LOG4CXX_DECODE_WCHAR(v, value);
+ putLS(key, v);
+}
+
+std::wstring MDC::get(const std::wstring& key)
+{
+ LOG4CXX_DECODE_WCHAR(lkey, key);
+ LogString lvalue;
+ if (get(lkey, lvalue)) {
+ LOG4CXX_ENCODE_WCHAR(value, lvalue);
+ return value;
+ }
+ return std::wstring();
+}
+
+void MDC::put(const std::wstring& key, const std::wstring& value)
+{
+ LOG4CXX_DECODE_WCHAR(lkey, key);
+ LOG4CXX_DECODE_WCHAR(lvalue, value);
+ putLS(lkey, lvalue);
+}
+
+
+std::wstring MDC::remove(const std::wstring& key)
+{
+ LOG4CXX_DECODE_WCHAR(lkey, key);
+ LogString lvalue;
+ if (remove(lkey, lvalue)) {
+ LOG4CXX_ENCODE_WCHAR(value, lvalue);
+ return value;
+ }
+ return std::wstring();
+}
+#endif
+
+#if LOG4CXX_UNICHAR_API
+MDC::MDC(const std::basic_string<UniChar>& key1, const std::basic_string<UniChar>& value) {
+ Transcoder::decode(key1, key);
+ LOG4CXX_DECODE_UNICHAR(v, value);
+ putLS(key, v);
+}
+
+std::basic_string<log4cxx::UniChar> MDC::get(const std::basic_string<log4cxx::UniChar>& key)
+{
+ LOG4CXX_DECODE_UNICHAR(lkey, key);
+ LogString lvalue;
+ if (get(lkey, lvalue)) {
+ LOG4CXX_ENCODE_UNICHAR(value, lvalue);
+ return value;
+ }
+ return std::basic_string<UniChar>();
+}
+
+void MDC::put(const std::basic_string<UniChar>& key, const std::basic_string<log4cxx::UniChar>& value)
+{
+ LOG4CXX_DECODE_UNICHAR(lkey, key);
+ LOG4CXX_DECODE_UNICHAR(lvalue, value);
+ putLS(lkey, lvalue);
+}
+
+
+std::basic_string<log4cxx::UniChar> MDC::remove(const std::basic_string<log4cxx::UniChar>& key)
+{
+ LOG4CXX_DECODE_UNICHAR(lkey, key);
+ LogString lvalue;
+ if (remove(lkey, lvalue)) {
+ LOG4CXX_ENCODE_UNICHAR(value, lvalue);
+ return value;
+ }
+ return std::basic_string<UniChar>();
+}
+#endif
+
+#if LOG4CXX_CFSTRING_API
+
+MDC::MDC(const CFStringRef& key1, const CFStringRef& value) {
+ Transcoder::decode(key1, key);
+ LOG4CXX_DECODE_CFSTRING(v, value);
+ putLS(key, v);
+}
+
+CFStringRef MDC::get(const CFStringRef& key)
+{
+ LOG4CXX_DECODE_CFSTRING(lkey, key);
+ LogString lvalue;
+ if (get(lkey, lvalue)) {
+ LOG4CXX_ENCODE_CFSTRING(value, lvalue);
+ return value;
+ }
+ return CFSTR("");
+}
+
+void MDC::put(const CFStringRef& key, const CFStringRef& value)
+{
+ LOG4CXX_DECODE_CFSTRING(lkey, key);
+ LOG4CXX_DECODE_CFSTRING(lvalue, value);
+ putLS(lkey, lvalue);
+}
+
+
+CFStringRef MDC::remove(const CFStringRef& key)
+{
+ LOG4CXX_DECODE_CFSTRING(lkey, key);
+ LogString lvalue;
+ if (remove(lkey, lvalue)) {
+ LOG4CXX_ENCODE_CFSTRING(value, lvalue);
+ return value;
+ }
+ return CFSTR("");
+}
+#endif
+