00001
00002
00003 #include "ace/config-all.h"
00004
00005 #if defined (ACE_HAS_LOG_MSG_NT_EVENT_LOG)
00006
00007 #include "ace/Log_Msg_NT_Event_Log.h"
00008 #include "ace/Log_Msg.h"
00009 #include "ace/Log_Record.h"
00010 #include "ace/OS_NS_stdio.h"
00011 #include "ace/OS_NS_string.h"
00012
00013 ACE_RCSID(ace, Log_Msg_NT_Event_Log, "$Id: Log_Msg_NT_Event_Log.cpp 79134 2007-07-31 18:23:50Z johnnyw $")
00014
00015 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00016
00017 ACE_Log_Msg_NT_Event_Log::ACE_Log_Msg_NT_Event_Log (void)
00018 : evlog_handle_(0)
00019 {
00020 }
00021
00022 ACE_Log_Msg_NT_Event_Log::~ACE_Log_Msg_NT_Event_Log (void)
00023 {
00024 this->close ();
00025 }
00026
00027 int
00028 ACE_Log_Msg_NT_Event_Log::open (const ACE_TCHAR *logger_key)
00029 {
00030
00031
00032 ACE_TCHAR msg_file [MAXPATHLEN];
00033
00034 if (!ACE_TEXT_GetModuleFileName (ACE_OS::get_win32_resource_module (),
00035 msg_file,
00036 MAXPATHLEN))
00037 return -1;
00038 DWORD msg_file_length =
00039 static_cast<DWORD> ((ACE_OS::strlen (msg_file) + 1) * sizeof (ACE_TCHAR));
00040
00041
00042
00043 const ACE_TCHAR *event_source_name = logger_key ? logger_key : ACE_Log_Msg::program_name ();
00044
00045
00046
00047 ACE_TCHAR reg_key [MAXPATHLEN];
00048 ACE_OS::strcpy (reg_key,
00049 ACE_TEXT ("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"));
00050 size_t reg_key_length = ACE_OS::strlen(reg_key);
00051 ACE_OS::strncat (reg_key,
00052 event_source_name,
00053 MAXPATHLEN - reg_key_length);
00054
00055
00056
00057
00058 HKEY hkey;
00059 ACE_TEXT_RegCreateKey (HKEY_LOCAL_MACHINE,
00060 reg_key,
00061 &hkey);
00062 DWORD flags = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
00063 ACE_TEXT_RegSetValueEx (hkey,
00064 ACE_TEXT ("TypesSupported"),
00065 0,
00066 REG_DWORD,
00067 (LPBYTE) &flags,
00068 sizeof (DWORD));
00069 ACE_TEXT_RegSetValueEx (hkey,
00070 ACE_TEXT ("EventMessageFile"),
00071 0,
00072 REG_SZ,
00073 (LPBYTE) msg_file,
00074 msg_file_length);
00075 RegCloseKey (hkey);
00076
00077
00078 this->evlog_handle_ = ACE_TEXT_RegisterEventSource (0,
00079 event_source_name);
00080 return this->evlog_handle_ ? 0 : -1;
00081 }
00082
00083 int
00084 ACE_Log_Msg_NT_Event_Log::reset (void)
00085 {
00086 return this->close ();
00087 }
00088
00089 int
00090 ACE_Log_Msg_NT_Event_Log::close (void)
00091 {
00092 if (this->evlog_handle_ == 0
00093 || DeregisterEventSource (this->evlog_handle_))
00094 {
00095 this->evlog_handle_ = 0;
00096 return 0;
00097 }
00098 else
00099 return -1;
00100 }
00101
00102 ssize_t
00103 ACE_Log_Msg_NT_Event_Log::log (ACE_Log_Record &log_record)
00104 {
00105
00106
00107
00108
00109 const ACE_TCHAR* src_msg_data = log_record.msg_data ();
00110 ACE_TCHAR msg_data [ACE_Log_Record::MAXLOGMSGLEN * 2];
00111
00112 for (size_t i = 0, j = 0;
00113 i < log_record.msg_data_len ();
00114 ++i)
00115 {
00116 if (src_msg_data[i] == '\n')
00117 {
00118 msg_data[j++] = '\r';
00119 msg_data[j++] = '\n';
00120 }
00121 else
00122 msg_data[j++] = src_msg_data[i];
00123 }
00124
00125
00126 WORD event_type;
00127 switch (log_record.type ())
00128 {
00129 case LM_STARTUP:
00130 case LM_SHUTDOWN:
00131 case LM_TRACE:
00132 case LM_DEBUG:
00133 case LM_INFO:
00134 event_type = EVENTLOG_INFORMATION_TYPE;
00135 break;
00136 case LM_NOTICE:
00137 case LM_WARNING:
00138 event_type = EVENTLOG_WARNING_TYPE;
00139 break;
00140 case LM_ERROR:
00141 case LM_CRITICAL:
00142 case LM_ALERT:
00143 case LM_EMERGENCY:
00144 default:
00145 event_type = EVENTLOG_ERROR_TYPE;
00146 break;
00147 }
00148
00149
00150 const ACE_TCHAR* msgs [1];
00151 msgs[0] = msg_data;
00152
00153 if (ACE_TEXT_ReportEvent (this->evlog_handle_,
00154 event_type, 0, 0, 0, 1, 0, msgs, 0) == 0)
00155 return -1;
00156 else
00157 return 0;
00158 }
00159
00160 ACE_END_VERSIONED_NAMESPACE_DECL
00161
00162 #endif