Log.cpp
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:3k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. // Log.cpp: implementation of the Log class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdhdrs.h"
  5. #include "Log.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. const int Log::ToDebug   =  1;
  10. const int Log::ToFile    =  2;
  11. const int Log::ToConsole =  4;
  12. const static int LINE_BUFFER_SIZE = 1024;
  13. Log::Log(int mode, int level, LPTSTR filename, bool append)
  14. {
  15.     hlogfile = NULL;
  16.     m_todebug = false;
  17.     m_toconsole = false;
  18.     m_tofile = false;
  19.     SetMode(mode);
  20.     if (mode & ToFile)  {
  21.         SetFile(filename, append);
  22.     }
  23. }
  24. void Log::SetMode(int mode) {
  25.     
  26.     if (mode & ToDebug)
  27.         m_todebug = true;
  28.     else
  29.         m_todebug = false;
  30.     if (mode & ToFile)  {
  31.         m_tofile = true;
  32.     } else {
  33.         CloseFile();
  34.         m_tofile = false;
  35.     }
  36.     
  37. #ifdef _WIN32_WCE
  38. m_toconsole = false;
  39. #else
  40.     if (mode & ToConsole) {
  41.         if (!m_toconsole)
  42.             AllocConsole();
  43.         m_toconsole = true;
  44.     } else {
  45.         m_toconsole = false;
  46.     }
  47. #endif
  48. }
  49. void Log::SetLevel(int level) {
  50.     m_level = level;
  51. }
  52. void Log::SetFile(LPTSTR filename, bool append) 
  53. {
  54.     // if a log file is open, close it now.
  55.     CloseFile();
  56.     m_tofile  = true;
  57.     
  58.     // If filename is NULL or invalid we should throw an exception here
  59.     
  60.     hlogfile = CreateFile(
  61.         filename,  GENERIC_WRITE, FILE_SHARE_READ, NULL,
  62.         OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL  );
  63.     
  64.     if (hlogfile == NULL) {
  65.         // We should throw an exception here
  66.         m_todebug = true;
  67.         m_tofile = false;
  68.         Print(0, _T("Error opening log file %sn"), filename);
  69.     }
  70.     if (append) {
  71.         SetFilePointer( hlogfile, 0, NULL, FILE_END );
  72.     } else {
  73.         SetEndOfFile( hlogfile );
  74.     }
  75. }
  76. // if a log file is open, close it now.
  77. void Log::CloseFile() {
  78.     if (hlogfile != NULL) {
  79.         CloseHandle(hlogfile);
  80.         hlogfile = NULL;
  81.     }
  82. }
  83. #ifndef UNDER_CE
  84. // Non-CE version 
  85. void Log::ReallyPrint(LPTSTR format, va_list ap) 
  86. {
  87.     TCHAR line[LINE_BUFFER_SIZE];
  88.     _vstprintf(line, format, ap);
  89.     if (m_todebug) OutputDebugString(line);
  90.     if (m_toconsole) {
  91.         DWORD byteswritten;
  92.         WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), line, _tcslen(line)*sizeof(TCHAR), &byteswritten, NULL); 
  93.     };
  94.     if (m_tofile && (hlogfile != NULL)) {
  95.         DWORD byteswritten;
  96.         WriteFile(hlogfile, line, _tcslen(line)*sizeof(TCHAR), &byteswritten, NULL); 
  97.     }
  98. }
  99. #else
  100. // CE version 
  101. void Log::ReallyPrint(LPTSTR format, va_list ap) 
  102. {
  103.     TCHAR line[LINE_BUFFER_SIZE];
  104.     _vstprintf(line, format, ap);
  105.     if (m_todebug) OutputDebugString(line);
  106.     if (m_tofile && (hlogfile != NULL)) {
  107.         DWORD byteswritten;
  108. // Log file is more readable if non-unicode!
  109. char ansiline[LINE_BUFFER_SIZE];
  110. int origlen = _tcslen(line);
  111. int newlen = WideCharToMultiByte(
  112. CP_ACP,    // code page
  113. 0,         // performance and mapping flags
  114. line,      // address of wide-character string
  115. origlen,   // number of characters in string
  116. ansiline,  // address of buffer for new string
  117. 255,       // size of buffer
  118. NULL, NULL );
  119. WriteFile(hlogfile, ansiline, newlen, &byteswritten, NULL); 
  120.     }
  121. }
  122. #endif
  123. Log::~Log()
  124. {
  125.     CloseFile();
  126. }
  127. Log theLog;