/*
 * 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/helpers/messagebuffer.h>
#include <log4cxx/helpers/transcoder.h>

using namespace log4cxx::helpers;

static bool gMessageBufferUseStaticStream = false;

namespace log4cxx {
namespace helpers {
      void MessageBufferUseStaticStream()
      {
         gMessageBufferUseStaticStream = true;
      }
   }
}

template <typename T>
void ResetStream(std::basic_ostringstream<T> &stream)
{
   stream.seekp(0);
   stream.str(std::basic_string<T>());
   stream.clear();
}

CharMessageBuffer::CharMessageBuffer() : stream(0) {
   if (gMessageBufferUseStaticStream)
   {
      thread_local static char ossBuf[8192];
      thread_local static std::basic_ostringstream<char> sStream;
      thread_local static bool inited = false;
      if (!inited)
      {
         inited = true;
         sStream.rdbuf()->pubsetbuf(ossBuf, 8192);

         ResetStream(sStream);
      }
      stream = &sStream;
   }
}

CharMessageBuffer::~CharMessageBuffer() {
   if (!gMessageBufferUseStaticStream) {
      delete stream;
   }
}

CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& 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<char>&() {
   if (stream == 0) {
     stream = new std::basic_ostringstream<char>();
     if (!buf.empty()) {
        *stream << buf;
     }
   }
   return *stream;
}

const std::basic_string<char>& CharMessageBuffer::str(std::basic_ostream<char>&) {
   buf = stream->str();

   ResetStream(*stream);

   return buf;
}

const std::basic_string<char>& 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) {
   if (gMessageBufferUseStaticStream)
   {
      thread_local static wchar_t ossBuf[8192];
      thread_local static std::basic_ostringstream<wchar_t> sStream;
      thread_local static bool inited = false;
      if (!inited)
      {
         inited = true;
         sStream.rdbuf()->pubsetbuf(ossBuf, 8192);

         ResetStream(sStream);
      }
      stream = &sStream;
   }
}

WideMessageBuffer::~WideMessageBuffer() {
   if (!gMessageBufferUseStaticStream) {
      delete stream;
   }
}

WideMessageBuffer& WideMessageBuffer::operator<<(const std::basic_string<wchar_t>& 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<wchar_t>&() {
   if (stream == 0) {
     stream = new std::basic_ostringstream<wchar_t>();
     if (!buf.empty()) {
        *stream << buf;
     }
   }
   return *stream;
}

const std::basic_string<wchar_t>& WideMessageBuffer::str(std::basic_ostream<wchar_t>&) {
   buf = stream->str();

   ResetStream(*stream);

   return buf;
}

const std::basic_string<wchar_t>& WideMessageBuffer::str(WideMessageBuffer&) {
   return buf;
}

bool WideMessageBuffer::hasStream() const {
    return (stream != 0);
}

std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(ios_base_manip manip) {
   std::basic_ostream<wchar_t>& s = *this;
   (*manip)(s);
   return s;
}

std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(bool val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(short val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(int val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(unsigned int val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(long val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(unsigned long val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(float val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(double val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(long double val) { return ((std::basic_ostream<wchar_t>&) *this).operator<<(val); }
std::basic_ostream<wchar_t>& WideMessageBuffer::operator<<(void* val) { return ((std::basic_ostream<wchar_t>&) *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<wchar_t>& 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<log4cxx::UniChar>& 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<log4cxx::UniChar>& MessageBuffer::str(UniCharMessageBuffer& buf) {
   return ubuf->str(buf);
}

const std::basic_string<log4cxx::UniChar>& MessageBuffer::str(std::basic_ostream<log4cxx::UniChar>& os) {
   return ubuf->str(os);
}


UniCharMessageBuffer::UniCharMessageBuffer() : stream(0) {
   if (gMessageBufferUseStaticStream)
   {
      thread_local static log4cxx::UniChar ossBuf[8192];
      thread_local static std::basic_ostringstream<log4cxx::UniChar> sStream;
      thread_local static bool inited = false;
      if (!inited)
      {
         inited = true;
         sStream.rdbuf()->pubsetbuf(ossBuf, 8192);

         ResetStream(sStream);
      }
      stream = &sStream;
   }
}

UniCharMessageBuffer::~UniCharMessageBuffer() {
   if (!gMessageBufferUseStaticStream) {
      delete stream;
   }
}


UniCharMessageBuffer& UniCharMessageBuffer::operator<<(const std::basic_string<log4cxx::UniChar>& 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<UniChar>();
     if (!buf.empty()) {
        *stream << buf;
     }
   }
   return *stream;
}

const std::basic_string<log4cxx::UniChar>& UniCharMessageBuffer::str(UniCharMessageBuffer::uostream&) {
   buf = stream->str();
   ResetStream(*stream);
   return buf;
}

const std::basic_string<log4cxx::UniChar>& 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 <CoreFoundation/CFString.h>
#include <vector>

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<log4cxx::UniChar> tmp(length);
         CFStringGetCharacters(msg, CFRangeMake(0, length), &tmp[0]);
         if (stream) {
            std::basic_string<UniChar> 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

