diff options
Diffstat (limited to 'src/main/cpp/mdc.cpp')
-rw-r--r-- | src/main/cpp/mdc.cpp | 236 |
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 + |