Try to build PDB files even for releases.
[nssm.git] / event.cpp
1 #include "nssm.h"\r
2 \r
3 #define NSSM_SOURCE _T("nssm")\r
4 #define NSSM_ERROR_BUFSIZE 65535\r
5 #define NSSM_NUM_EVENT_STRINGS 16\r
6 unsigned long tls_index;\r
7 \r
8 /* Convert error code to error string - must call LocalFree() on return value */\r
9 TCHAR *error_string(unsigned long error) {\r
10   /* Thread-safe buffer */\r
11   TCHAR *error_message = (TCHAR *) TlsGetValue(tls_index);\r
12   if (! error_message) {\r
13     error_message = (TCHAR *) LocalAlloc(LPTR, NSSM_ERROR_BUFSIZE);\r
14     if (! error_message) return _T("<out of memory for error message>");\r
15     TlsSetValue(tls_index, (void *) error_message);\r
16   }\r
17 \r
18   if (! FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, GetUserDefaultLangID(), (TCHAR *) error_message, NSSM_ERROR_BUFSIZE, 0)) {\r
19     if (! FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, (TCHAR *) error_message, NSSM_ERROR_BUFSIZE, 0)) {\r
20       if (_sntprintf_s(error_message, NSSM_ERROR_BUFSIZE, _TRUNCATE, _T("system error %lu"), error) < 0) return 0;\r
21     }\r
22   }\r
23   return error_message;\r
24 }\r
25 \r
26 /* Convert message code to format string */\r
27 TCHAR *message_string(unsigned long error) {\r
28   TCHAR *ret;\r
29   if (! FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, GetUserDefaultLangID(), (LPTSTR) &ret, NSSM_ERROR_BUFSIZE, 0)) {\r
30     if (! FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, (LPTSTR) &ret, NSSM_ERROR_BUFSIZE, 0)) {\r
31       ret = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, 32 * sizeof(TCHAR));\r
32       if (_sntprintf_s(ret, NSSM_ERROR_BUFSIZE, _TRUNCATE, _T("system error %lu"), error) < 0) return 0;\r
33     }\r
34   }\r
35   return ret;\r
36 }\r
37 \r
38 /* Log a message to the Event Log */\r
39 void log_event(unsigned short type, unsigned long id, ...) {\r
40   va_list arg;\r
41   int count;\r
42   TCHAR *s;\r
43   TCHAR *strings[NSSM_NUM_EVENT_STRINGS];\r
44 \r
45   /* Open event log */\r
46   HANDLE handle = RegisterEventSource(0, NSSM_SOURCE);\r
47   if (! handle) return;\r
48 \r
49   /* Log it */\r
50   count = 0;\r
51   va_start(arg, id);\r
52   while ((s = va_arg(arg, TCHAR *)) && count < NSSM_NUM_EVENT_STRINGS - 1) strings[count++] = s;\r
53   strings[count] = 0;\r
54   va_end(arg);\r
55   ReportEvent(handle, type, 0, id, 0, count, 0, (const TCHAR **) strings, 0);\r
56 \r
57   /* Close event log */\r
58   DeregisterEventSource(handle);\r
59 }\r
60 \r
61 /* Log a message to the console */\r
62 void print_message(FILE *file, unsigned long id, ...) {\r
63   va_list arg;\r
64 \r
65   TCHAR *format = message_string(id);\r
66   if (! format) return;\r
67 \r
68   va_start(arg, id);\r
69   _vftprintf(file, format, arg);\r
70   va_end(arg);\r
71 \r
72   LocalFree(format);\r
73 }\r
74 \r
75 /* Show a GUI dialogue */\r
76 int popup_message(HWND owner, unsigned int type, unsigned long id, ...) {\r
77   va_list arg;\r
78 \r
79   TCHAR *format = message_string(id);\r
80   if (! format) {\r
81     return MessageBox(0, _T("The message which was supposed to go here is missing!"), NSSM, MB_OK | MB_ICONEXCLAMATION);\r
82   }\r
83 \r
84   TCHAR blurb[NSSM_ERROR_BUFSIZE];\r
85   va_start(arg, id);\r
86   if (_vsntprintf_s(blurb, _countof(blurb), _TRUNCATE, format, arg) < 0) {\r
87     va_end(arg);\r
88     LocalFree(format);\r
89     return MessageBox(0, _T("The message which was supposed to go here is too big!"), NSSM, MB_OK | MB_ICONEXCLAMATION);\r
90   }\r
91   va_end(arg);\r
92 \r
93   MSGBOXPARAMS params;\r
94   ZeroMemory(&params, sizeof(params));\r
95   params.cbSize = sizeof(params);\r
96   params.hInstance = GetModuleHandle(0);\r
97   params.hwndOwner = owner;\r
98   params.lpszText = blurb;\r
99   params.lpszCaption = NSSM;\r
100   params.dwStyle = type;\r
101   if (type == MB_OK) {\r
102     params.dwStyle |= MB_USERICON;\r
103     params.lpszIcon = MAKEINTRESOURCE(IDI_NSSM);\r
104   }\r
105 \r
106   int ret = MessageBoxIndirect(&params);\r
107 \r
108   LocalFree(format);\r
109 \r
110   return ret;\r
111 }\r