| /* | |
| * 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_NS; | |
| using namespace LOG4CXX_NS::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_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 | |