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, LPSTR filename, bool append)
  14. {
  15. m_filename = NULL;
  16. m_append = false;
  17.     hlogfile = NULL;
  18.     m_todebug = false;
  19.     m_toconsole = false;
  20.     m_tofile = false;
  21.     SetFile(filename, append);
  22.     SetMode(mode);
  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. if (!m_tofile)
  32. OpenFile();
  33. } else {
  34. CloseFile();
  35.         m_tofile = false;
  36.     }
  37.     
  38.     if (mode & ToConsole) {
  39.         if (!m_toconsole)
  40.             AllocConsole();
  41.         m_toconsole = true;
  42.     } else {
  43.         m_toconsole = false;
  44.     }
  45. }
  46. void Log::SetLevel(int level) {
  47.     m_level = level;
  48. }
  49. void Log::SetFile(LPSTR filename, bool append) 
  50. {
  51. CloseFile();
  52. if (m_filename != NULL)
  53. free(m_filename);
  54. m_filename = strdup(filename);
  55. m_append = append;
  56. if (m_tofile)
  57. OpenFile();
  58. }
  59. void Log::OpenFile()
  60. {
  61. // Is there a file-name?
  62. if (m_filename == NULL)
  63. {
  64.         m_todebug = true;
  65.         m_tofile = false;
  66.         Print(0, "Error opening log filen");
  67. return;
  68. }
  69.     m_tofile  = true;
  70.     
  71.     // If filename is NULL or invalid we should throw an exception here
  72.     hlogfile = CreateFile(
  73.         m_filename,  GENERIC_WRITE, FILE_SHARE_READ, NULL,
  74.         OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL  );
  75.     
  76.     if (hlogfile == NULL) {
  77.         // We should throw an exception here
  78.         m_todebug = true;
  79.         m_tofile = false;
  80.         Print(0, "Error opening log file %sn", m_filename);
  81.     }
  82.     if (m_append) {
  83.         SetFilePointer( hlogfile, 0, NULL, FILE_END );
  84.     } else {
  85.         SetEndOfFile( hlogfile );
  86.     }
  87. }
  88. // if a log file is open, close it now.
  89. void Log::CloseFile() {
  90.     if (hlogfile != NULL) {
  91.         CloseHandle(hlogfile);
  92.         hlogfile = NULL;
  93.     }
  94. }
  95. void Log::ReallyPrint(LPSTR format, va_list ap) 
  96. {
  97.     TCHAR line[LINE_BUFFER_SIZE];
  98.     vsprintf(line, format, ap);
  99.     if (m_todebug) OutputDebugString(line);
  100.     if (m_toconsole) {
  101.         DWORD byteswritten;
  102.         WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), line, strlen(line), &byteswritten, NULL); 
  103.     };
  104.     if (m_tofile && (hlogfile != NULL)) {
  105.         DWORD byteswritten;
  106.         WriteFile(hlogfile, line, strlen(line), &byteswritten, NULL); 
  107.     }
  108. }
  109. Log::~Log()
  110. {
  111. if (m_filename != NULL)
  112. free(m_filename);
  113.     CloseFile();
  114. }