blob: 79b4c9dce7987a7355196dde4ea3266ac9e0dc02 [file] [log] [blame]
/*
* 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