SimpleLogger.cpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:7k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #include "SimpleLogger.hpp"
  23. #include "VXIlog.h"
  24. #include <sstream>
  25. static unsigned int MESSAGE_BASE;
  26. static const VXIchar * const MODULE_NAME  = COMPANY_DOMAIN L".vxi";
  27. // ------*---------*---------*---------*---------*---------*---------*---------
  28. static const VXIchar * const TAG_ENCODING  = L"encoding";
  29. static const VXIchar * const TAG_EXCEPTION = L"exception";
  30. static const VXIchar * const TAG_MESSAGE   = L"message";
  31. static const VXIchar * const TAG_RECORDING = L"recording";
  32. static const VXIchar * const TAG_LABEL     = L"label";
  33. static const VXIchar * const TAG_EXPR      = L"expr";
  34. static const VXIchar * const TAG_CONTENT   = L"content";
  35. inline const VXIchar * const GetInfoTagText(SimpleLogger::InfoTag t)
  36. {
  37.   switch (t) {
  38.   case SimpleLogger::ENCODING:    return TAG_ENCODING;
  39.   case SimpleLogger::EXCEPTION:   return TAG_EXCEPTION;
  40.   case SimpleLogger::MESSAGE:     return TAG_MESSAGE;
  41.   case SimpleLogger::RECORDING:   return TAG_RECORDING;
  42.   default:                        return TAG_MESSAGE;
  43.   }
  44. }
  45. // ------*---------*---------*---------*---------*---------*---------*---------
  46. class SimpleLoggerImpl : public SimpleLogger {
  47. public:
  48.   SimpleLoggerImpl(VXIlogInterface * l) : log(l)
  49.   {
  50.     moduleName = MODULE_NAME;
  51.     isVectorSupported = LOG_EVENT_VECTOR_SUPPORTED(l);
  52.     isContentSupported = LOG_CONTENT_METHODS_SUPPORTED(l);
  53.   }
  54.   ~SimpleLoggerImpl() { }
  55.   
  56.   virtual void SetUri(const std::basic_string<wchar_t> & uri) 
  57.   { mUri = uri; }
  58.   
  59.   // Diagnostic...
  60.   typedef unsigned int TAGID;
  61.   virtual bool IsLogging(TAGID tagID) const
  62.   { return (log->DiagnosticIsEnabled(log, MESSAGE_BASE + tagID) == TRUE); }
  63.   virtual std::basic_ostream<wchar_t> & StartDiagnostic(TAGID tagID) const
  64.   { 
  65.     id = tagID;
  66.     buffer.str(L"");
  67.     return buffer; }
  68.   virtual void EndDiagnostic() const
  69.   { buffer << std::ends;
  70.     if (buffer.str().empty()) return;
  71.     log->Diagnostic(log, MESSAGE_BASE + id, moduleName.c_str(), L"%s", buffer.str().c_str()); }
  72.   virtual void LogDiagnostic(TAGID tagID, const wchar_t * text) const
  73.   { log->Diagnostic(log, MESSAGE_BASE + tagID, moduleName.c_str() , L"%s", text); }
  74.     
  75.   virtual void LogDiagnostic(TAGID tagID, const wchar_t* subtag,
  76.                              const wchar_t * format, ...)
  77.   {
  78.     va_list args;
  79.     va_start(args, format);
  80.     log->VDiagnostic(log, MESSAGE_BASE + tagID, subtag, format, args);
  81.     va_end(args);  
  82.   }
  83.   // Error
  84.   virtual void LogError(int errorNum,
  85.                         const wchar_t * key, const wchar_t * txt) const
  86.   { 
  87.     if( mUri.empty() )
  88.       log->Error(log, moduleName.c_str(), errorNum, L"%s%s", key, txt); 
  89.     else
  90.       log->Error(log, moduleName.c_str(), errorNum, L"%s%s%s%s", key, txt, L"URL", mUri.c_str());       
  91.   }
  92.   virtual void LogError(int errorNum,
  93.                         SimpleLogger::InfoTag i1, const wchar_t * txt1,
  94.                         SimpleLogger::InfoTag i2, const wchar_t * txt2) const
  95.   { 
  96.     if( mUri.empty() )
  97.       log->Error(log, moduleName.c_str(), errorNum, L"%s%s%s%s", 
  98.                GetInfoTagText(i1), txt1, GetInfoTagText(i2), txt2); 
  99.     else
  100.       log->Error(log, moduleName.c_str(), errorNum, L"%s%s%s%s%s%s", 
  101.                GetInfoTagText(i1), txt1, GetInfoTagText(i2), txt2, L"URL", mUri.c_str()); 
  102.   }
  103.   virtual void LogError(int errorNum,
  104.                         SimpleLogger::InfoTag i, const wchar_t * txt) const
  105.   { 
  106.     if( mUri.empty() )
  107.       log->Error(log, moduleName.c_str(), errorNum, L"%s%s", GetInfoTagText(i), txt); 
  108.     else
  109.       log->Error(log, moduleName.c_str(), errorNum, L"%s%s%s%s", GetInfoTagText(i), txt, L"URL", mUri.c_str()); 
  110.   }
  111.   virtual void LogError(int errorNum) const
  112.   { 
  113.     if( mUri.empty() )
  114.       log->Error(log, moduleName.c_str(), errorNum, NULL); 
  115.     else
  116.       log->Error(log, moduleName.c_str(), errorNum, L"%s%s", L"URL", mUri.c_str()); 
  117.   }
  118.   // Event
  119.   virtual void LogEvent(int eventNum, const VXIVector * keys,
  120.                         const VXIVector * values) const
  121.   { if (isVectorSupported)
  122.       log->EventVector(log, eventNum, keys, values); }
  123.   // Content logging.
  124.   virtual bool LogContent(const VXIchar *mimetype, 
  125.   const VXIbyte *content, 
  126.   VXIulong size, 
  127.   VXIString **key, 
  128.   VXIString **value) const;
  129.   // Set Module Name
  130.   virtual void SetModuleName(const wchar_t* modulename) 
  131.   { if( modulename ) moduleName = modulename; }
  132. private:
  133.   VXIlogInterface * log;
  134.   mutable TAGID id;
  135.   mutable std::basic_string<wchar_t> mUri;
  136.   mutable std::basic_ostringstream<wchar_t> buffer;
  137.   mutable std::basic_string<wchar_t> moduleName;
  138.   
  139.   bool isVectorSupported;
  140.   bool isContentSupported;
  141. };
  142. bool SimpleLoggerImpl::LogContent(const VXIchar *mimetype, 
  143.   const VXIbyte *content, 
  144.   VXIulong size, 
  145.   VXIString **key, 
  146.   VXIString **value) const 
  147. {
  148.   VXIlogResult ret = VXIlog_RESULT_SUCCESS;
  149.   *key = NULL;
  150.   *value = NULL;
  151.   
  152.   // Only dump the page if content logging is supported by the log
  153.   // implementation
  154.   if (isContentSupported) {
  155.     VXIlogStream *stream = NULL;
  156.     ret = log->ContentOpen(log, MODULE_NAME, mimetype, key, value, &stream);
  157.     if (ret == VXIlog_RESULT_SUCCESS) {
  158.       VXIulong nwrite = 0;
  159.       ret = log->ContentWrite(log, content, size, &nwrite, stream);
  160.       log->ContentClose(log, &stream);
  161.     }
  162.     
  163.     if (ret != VXIlog_RESULT_SUCCESS)
  164.       LogError(990);
  165.   } else {
  166.     ret = VXIlog_RESULT_FAILURE;
  167.   }
  168.   
  169.   return (ret == VXIlog_RESULT_SUCCESS ? true : false);
  170. }
  171. SimpleLogger * SimpleLogger::CreateResource(VXIlogInterface * l)
  172. {
  173.   return new SimpleLoggerImpl(l);
  174. }
  175. void SimpleLogger::DestroyResource(SimpleLogger * & log)
  176. {
  177.   if (log == NULL) return;
  178.   delete log;
  179.   log = NULL;
  180. }
  181. void SimpleLogger::SetMessageBase(unsigned int base)
  182. {
  183.   MESSAGE_BASE = base;
  184. }