Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
5.2 KiB

  1. //
  2. // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
  3. //
  4. #include <stdio.h>
  5. #include <time.h>
  6. #include <tchar.h>
  7. #include <windows.h>
  8. #include <comdef.h>
  9. #include "provlog.h"
  10. //***************************************************************************
  11. //
  12. // CDsLog::CDsLog
  13. //
  14. // Purpose: Contructs an empty CDsLog object.
  15. //
  16. // Parameters:
  17. // None
  18. //
  19. //***************************************************************************
  20. CDsLog :: CDsLog()
  21. {
  22. m_lpszLogFileName = NULL;
  23. m_fpLogFile = NULL;
  24. // Turn on logging by default
  25. m_bEnabled = TRUE;
  26. // Enable all severity levels
  27. m_iLevel = NONE;
  28. }
  29. //***************************************************************************
  30. //
  31. // CDsLog::~CDsLog
  32. //
  33. // Purpose: Destructor
  34. //
  35. //
  36. //***************************************************************************
  37. CDsLog :: ~CDsLog()
  38. {
  39. delete [] m_lpszLogFileName;
  40. if(m_fpLogFile)
  41. fclose(m_fpLogFile);
  42. }
  43. //***************************************************************************
  44. //
  45. // CDsLog::LogMessage
  46. //
  47. // Purpose: See Header
  48. //
  49. //***************************************************************************
  50. BOOLEAN CDsLog :: Initialise(LPCWSTR lpszRegistrySubTreeRoot)
  51. {
  52. // Get the various values from the registry
  53. if(!GetRegistryValues(lpszRegistrySubTreeRoot))
  54. return FALSE;
  55. // Open the Log File
  56. m_fpLogFile = _tfopen((LPTSTR)(_bstr_t)(m_lpszLogFileName), __TEXT("w"));
  57. if(m_fpLogFile)
  58. WriteInitialMessage();
  59. return (m_fpLogFile != NULL);
  60. }
  61. //***************************************************************************
  62. //
  63. // CDsLog::LogMessage
  64. //
  65. // Purpose: See Header
  66. //
  67. //***************************************************************************
  68. BOOLEAN CDsLog :: Initialise(LPCWSTR lpszFileName, BOOLEAN bEnabled, UINT iLevel)
  69. {
  70. m_bEnabled = bEnabled;
  71. m_iLevel = iLevel;
  72. m_fpLogFile = _tfopen((LPTSTR)(_bstr_t)(lpszFileName), __TEXT("w"));
  73. if(m_fpLogFile)
  74. WriteInitialMessage();
  75. return (m_fpLogFile != NULL);
  76. }
  77. //***************************************************************************
  78. //
  79. // CDsLog::LogMessage
  80. //
  81. // Purpose: See Header
  82. //
  83. //***************************************************************************
  84. void CDsLog :: LogMessage(UINT iLevel, LPCWSTR lpszMessage, ...)
  85. {
  86. va_list marker;
  87. va_start(marker, lpszMessage);
  88. if(m_bEnabled && iLevel >= m_iLevel)
  89. {
  90. EnterCriticalSection(&m_FileCriticalSection);
  91. _vftprintf(m_fpLogFile, lpszMessage, marker);
  92. fflush(m_fpLogFile);
  93. LeaveCriticalSection(&m_FileCriticalSection);
  94. }
  95. va_end(marker);
  96. }
  97. //***************************************************************************
  98. //
  99. // CDsLog::GetRegistryValues
  100. //
  101. // Purpose: See Header
  102. //***************************************************************************
  103. BOOLEAN CDsLog :: GetRegistryValues(LPCWSTR lpszRegistrySubTreeRoot)
  104. {
  105. HKEY subtreeRootKey;
  106. if( RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  107. (LPTSTR)(_bstr_t)(lpszRegistrySubTreeRoot),
  108. 0,
  109. KEY_READ,
  110. &subtreeRootKey) != ERROR_SUCCESS)
  111. return FALSE;
  112. BOOLEAN retVal = TRUE;
  113. // Retrieve the "File" value
  114. LONG lDataLength = 0;
  115. if(RegQueryValue(subtreeRootKey,
  116. FILE_STRING,
  117. NULL,
  118. &lDataLength) == ERROR_SUCCESS)
  119. {
  120. m_lpszLogFileName = new TCHAR [lDataLength + 1];
  121. if(RegQueryValue(subtreeRootKey,
  122. FILE_STRING,
  123. m_lpszLogFileName,
  124. &lDataLength) != ERROR_SUCCESS)
  125. {
  126. retVal = FALSE;
  127. }
  128. }
  129. else
  130. retVal = FALSE;
  131. // Retrieve the "Enabled" value
  132. lDataLength = 0;
  133. if(RegQueryValue(subtreeRootKey,
  134. ENABLED_STRING,
  135. NULL,
  136. &lDataLength) == ERROR_SUCCESS)
  137. {
  138. LPTSTR lpszEnabled = new TCHAR [lDataLength + 1];
  139. if(RegQueryValue(subtreeRootKey,
  140. FILE_STRING,
  141. lpszEnabled,
  142. &lDataLength) != ERROR_SUCCESS)
  143. {
  144. retVal = FALSE;
  145. }
  146. else // Convert the string to boolena
  147. {
  148. if(_tcscmp(lpszEnabled, ONE_STRING) == 0)
  149. m_bEnabled = TRUE;
  150. else
  151. m_bEnabled = FALSE;
  152. }
  153. delete [] lpszEnabled;
  154. }
  155. else
  156. retVal = FALSE;
  157. // Retrieve the "Level" value
  158. lDataLength = 0;
  159. if(RegQueryValue(subtreeRootKey,
  160. LEVEL_STRING,
  161. NULL,
  162. &lDataLength) == ERROR_SUCCESS)
  163. {
  164. LPTSTR lpszEnabled = new TCHAR [lDataLength + 1];
  165. if(RegQueryValue(subtreeRootKey,
  166. FILE_STRING,
  167. lpszEnabled,
  168. &lDataLength) != ERROR_SUCCESS)
  169. {
  170. retVal = FALSE;
  171. }
  172. else // Convert the string to boolena
  173. {
  174. if(_tcscmp(lpszEnabled, ONE_STRING) == 0)
  175. m_bEnabled = TRUE;
  176. else
  177. m_bEnabled = FALSE;
  178. }
  179. delete [] lpszEnabled;
  180. }
  181. else
  182. retVal = FALSE;
  183. // Close the registry key
  184. RegCloseKey(subtreeRootKey);
  185. return retVal;
  186. }
  187. //***************************************************************************
  188. //
  189. // CDsLog::WriteInitialMessage
  190. //
  191. // Purpose: See Header
  192. //***************************************************************************
  193. void CDsLog :: WriteInitialMessage()
  194. {
  195. if(m_bEnabled)
  196. {
  197. EnterCriticalSection(&m_FileCriticalSection);
  198. // Get the DateTime in Ascii format
  199. struct tm *newtime;
  200. time_t long_time;
  201. time( &long_time ); /* Get time as long integer. */
  202. newtime = localtime( &long_time ); /* Convert to local time. */
  203. _ftprintf(m_fpLogFile, __TEXT("Log File Created at : %s\n"), _tasctime(newtime));
  204. _ftprintf(m_fpLogFile, __TEXT("================================================\n\n"));
  205. fflush(m_fpLogFile);
  206. LeaveCriticalSection(&m_FileCriticalSection);
  207. }
  208. }