/* * 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 #include using namespace log4cxx::helpers; CharMessageBuffer::CharMessageBuffer() : stream(0) {} CharMessageBuffer::~CharMessageBuffer() { delete stream; } CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string& msg) { if (stream == 0) { buf.append(msg); } else { *stream << msg; } return *this; } CharMessageBuffer& CharMessageBuffer::operator<<(const char* msg) { const char* actualMsg = msg; if (actualMsg == 0) { actualMsg = "null"; } if (stream == 0) { buf.append(actualMsg); } else { *stream << actualMsg; } return *this; } CharMessageBuffer& CharMessageBuffer::operator<<(char* msg) { return operator<<((const char*) msg); } CharMessageBuffer& CharMessageBuffer::operator<<(const char msg) { if (stream == 0) { buf.append(1, msg); } else { buf.assign(1, msg); *stream << buf; } return *this; } CharMessageBuffer::operator std::basic_ostream&() { if (stream == 0) { stream = new std::basic_ostringstream(); if (!buf.empty()) { *stream << buf; } } return *stream; } const std::basic_string& CharMessageBuffer::str(std::basic_ostream&) { buf = stream->str(); return buf; } const std::basic_string& CharMessageBuffer::str(CharMessageBuffer&) { return buf; } bool CharMessageBuffer::hasStream() const { return (stream != 0); } std::ostream& CharMessageBuffer::operator<<(ios_base_manip manip) { std::ostream& s = *this; (*manip)(s); return s; } std::ostream& CharMessageBuffer::operator<<(bool val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(short val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(int val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(unsigned int val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(long val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(unsigned long val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(float val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(double val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(long double val) { return ((std::ostream&) *this).operator<<(val); } std::ostream& CharMessageBuffer::operator<<(void* val) { return ((std::ostream&) *this).operator<<(val); } #if LOG4CXX_WCHAR_T_API WideMessageBuffer::WideMessageBuffer() : stream(0) {} WideMessageBuffer::~WideMessageBuffer() { delete stream; } WideMessageBuffer& WideMessageBuffer::operator<<(const std::basic_string& msg) { if (stream == 0) { buf.append(msg); } else { *stream << msg; } return *this; } WideMessageBuffer& WideMessageBuffer::operator<<(const wchar_t* msg) { const wchar_t* actualMsg = msg; if (actualMsg == 0) { actualMsg = L"null"; } if (stream == 0) { buf.append(actualMsg); } else { *stream << actualMsg; } return *this; } WideMessageBuffer& WideMessageBuffer::operator<<(wchar_t* msg) { return operator<<((const wchar_t*) msg); } WideMessageBuffer& WideMessageBuffer::operator<<(const wchar_t msg) { if (stream == 0) { buf.append(1, msg); } else { buf.assign(1, msg); *stream << buf; } return *this; } WideMessageBuffer::operator std::basic_ostream&() { if (stream == 0) { stream = new std::basic_ostringstream(); if (!buf.empty()) { *stream << buf; } } return *stream; } const std::basic_string& WideMessageBuffer::str(std::basic_ostream&) { buf = stream->str(); return buf; } const std::basic_string& WideMessageBuffer::str(WideMessageBuffer&) { return buf; } bool WideMessageBuffer::hasStream() const { return (stream != 0); } std::basic_ostream& WideMessageBuffer::operator<<(ios_base_manip manip) { std::basic_ostream& s = *this; (*manip)(s); return s; } std::basic_ostream& WideMessageBuffer::operator<<(bool val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(short val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(int val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(unsigned int val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(long val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(unsigned long val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(float val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(double val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(long double val) { return ((std::basic_ostream&) *this).operator<<(val); } std::basic_ostream& WideMessageBuffer::operator<<(void* val) { return ((std::basic_ostream&) *this).operator<<(val); } MessageBuffer::MessageBuffer() : wbuf(0) #if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API , ubuf(0) #endif { } MessageBuffer::~MessageBuffer() { delete wbuf; #if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API delete ubuf; #endif } bool MessageBuffer::hasStream() const { bool retval = cbuf.hasStream() || (wbuf != 0 && wbuf->hasStream()); #if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API retval = retval || (ubuf != 0 && ubuf->hasStream()); #endif return retval; } std::ostream& MessageBuffer::operator<<(ios_base_manip manip) { std::ostream& s = *this; (*manip)(s); return s; } MessageBuffer::operator std::ostream&() { return (std::ostream&) cbuf; } CharMessageBuffer& MessageBuffer::operator<<(const std::string& msg) { return cbuf.operator<<(msg); } CharMessageBuffer& MessageBuffer::operator<<(const char* msg) { return cbuf.operator<<(msg); } CharMessageBuffer& MessageBuffer::operator<<(char* msg) { return cbuf.operator<<((const char*) msg); } CharMessageBuffer& MessageBuffer::operator<<(const char msg) { return cbuf.operator<<(msg); } const std::string& MessageBuffer::str(CharMessageBuffer& buf) { return cbuf.str(buf); } const std::string& MessageBuffer::str(std::ostream& os) { return cbuf.str(os); } WideMessageBuffer& MessageBuffer::operator<<(const std::wstring& msg) { wbuf = new WideMessageBuffer(); return (*wbuf) << msg; } WideMessageBuffer& MessageBuffer::operator<<(const wchar_t* msg) { wbuf = new WideMessageBuffer(); return (*wbuf) << msg; } WideMessageBuffer& MessageBuffer::operator<<(wchar_t* msg) { wbuf = new WideMessageBuffer(); return (*wbuf) << (const wchar_t*) msg; } WideMessageBuffer& MessageBuffer::operator<<(const wchar_t msg) { wbuf = new WideMessageBuffer(); return (*wbuf) << msg; } const std::wstring& MessageBuffer::str(WideMessageBuffer& buf) { return wbuf->str(buf); } const std::wstring& MessageBuffer::str(std::basic_ostream& os) { return wbuf->str(os); } std::ostream& MessageBuffer::operator<<(bool val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(short val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(int val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(unsigned int val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(long val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(unsigned long val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(float val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(double val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(long double val) { return cbuf.operator<<(val); } std::ostream& MessageBuffer::operator<<(void* val) { return cbuf.operator<<(val); } #endif #if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API UniCharMessageBuffer& MessageBuffer::operator<<(const std::basic_string& msg) { ubuf = new UniCharMessageBuffer(); return (*ubuf) << msg; } UniCharMessageBuffer& MessageBuffer::operator<<(const log4cxx::UniChar* msg) { ubuf = new UniCharMessageBuffer(); return (*ubuf) << msg; } UniCharMessageBuffer& MessageBuffer::operator<<(log4cxx::UniChar* msg) { ubuf = new UniCharMessageBuffer(); return (*ubuf) << (const log4cxx::UniChar*) msg; } UniCharMessageBuffer& MessageBuffer::operator<<(const log4cxx::UniChar msg) { ubuf = new UniCharMessageBuffer(); return (*ubuf) << msg; } const std::basic_string& MessageBuffer::str(UniCharMessageBuffer& buf) { return ubuf->str(buf); } const std::basic_string& MessageBuffer::str(std::basic_ostream& os) { return ubuf->str(os); } UniCharMessageBuffer::UniCharMessageBuffer() : stream(0) {} UniCharMessageBuffer::~UniCharMessageBuffer() { delete stream; } UniCharMessageBuffer& UniCharMessageBuffer::operator<<(const std::basic_string& msg) { if (stream == 0) { buf.append(msg); } else { *stream << buf; } return *this; } UniCharMessageBuffer& UniCharMessageBuffer::operator<<(const log4cxx::UniChar* msg) { const log4cxx::UniChar* actualMsg = msg; static log4cxx::UniChar nullLiteral[] = { 0x6E, 0x75, 0x6C, 0x6C, 0}; if (actualMsg == 0) { actualMsg = nullLiteral; } if (stream == 0) { buf.append(actualMsg); } else { *stream << actualMsg; } return *this; } UniCharMessageBuffer& UniCharMessageBuffer::operator<<(log4cxx::UniChar* msg) { return operator<<((const log4cxx::UniChar*) msg); } UniCharMessageBuffer& UniCharMessageBuffer::operator<<(const log4cxx::UniChar msg) { if (stream == 0) { buf.append(1, msg); } else { *stream << msg; } return *this; } UniCharMessageBuffer::operator UniCharMessageBuffer::uostream&() { if (stream == 0) { stream = new std::basic_ostringstream(); if (!buf.empty()) { *stream << buf; } } return *stream; } const std::basic_string& UniCharMessageBuffer::str(UniCharMessageBuffer::uostream&) { buf = stream->str(); return buf; } const std::basic_string& UniCharMessageBuffer::str(UniCharMessageBuffer&) { return buf; } bool UniCharMessageBuffer::hasStream() const { return (stream != 0); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(ios_base_manip manip) { UniCharMessageBuffer::uostream& s = *this; (*manip)(s); return s; } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(bool val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(short val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(int val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(unsigned int val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(long val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(unsigned long val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(float val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(double val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(long double val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } UniCharMessageBuffer::uostream& UniCharMessageBuffer::operator<<(void* val) { return ((UniCharMessageBuffer::uostream&) *this).operator<<(val); } #endif #if LOG4CXX_CFSTRING_API #include #include UniCharMessageBuffer& UniCharMessageBuffer::operator<<(const CFStringRef& msg) { const log4cxx::UniChar* chars = CFStringGetCharactersPtr(msg); if (chars != 0) { return operator<<(chars); } else { size_t length = CFStringGetLength(msg); std::vector tmp(length); CFStringGetCharacters(msg, CFRangeMake(0, length), &tmp[0]); if (stream) { std::basic_string s(&tmp[0], tmp.size()); *stream << s; } else { buf.append(&tmp[0], tmp.size()); } } return *this; } UniCharMessageBuffer& MessageBuffer::operator<<(const CFStringRef& msg) { ubuf = new UniCharMessageBuffer(); return (*ubuf) << msg; } #endif