1 |
#ifndef _YEBISOCKS_LOGGER_H_ |
#ifndef _YEBISOCKS_LOGGER_H_ |
2 |
#define _YEBISOCKS_LOGGER_H_ |
#define _YEBISOCKS_LOGGER_H_ |
3 |
|
|
4 |
#include <YCL/String.h> |
#include <YCL/String.h> |
5 |
using namespace yebisuya; |
using namespace yebisuya; |
6 |
|
|
7 |
class Logger { |
class Logger { |
8 |
private: |
private: |
9 |
HANDLE logfile; |
HANDLE logfile; |
10 |
Logger():logfile(INVALID_HANDLE_VALUE) { |
Logger():logfile(INVALID_HANDLE_VALUE) { |
11 |
} |
} |
12 |
public: |
public: |
13 |
~Logger() { |
~Logger() { |
14 |
if (logfile != INVALID_HANDLE_VALUE) { |
if (logfile != INVALID_HANDLE_VALUE) { |
15 |
::CloseHandle(logfile); |
::CloseHandle(logfile); |
16 |
logfile = INVALID_HANDLE_VALUE; |
logfile = INVALID_HANDLE_VALUE; |
17 |
} |
} |
18 |
} |
} |
19 |
private: |
private: |
20 |
static Logger& instance() { |
static Logger& instance() { |
21 |
static Logger instance; |
static Logger instance; |
22 |
return instance; |
return instance; |
23 |
} |
} |
24 |
void debuglog_string(const char* label, const char* data) { |
void debuglog_string(const char* label, const char* data) { |
25 |
if (logfile != INVALID_HANDLE_VALUE) { |
if (logfile != INVALID_HANDLE_VALUE) { |
26 |
DWORD written; |
DWORD written; |
27 |
const char* start = data; |
const char* start = data; |
28 |
WriteFile(logfile, label, strlen(label), &written, NULL); |
WriteFile(logfile, label, strlen(label), &written, NULL); |
29 |
WriteFile(logfile, ": \"", 3, &written, NULL); |
WriteFile(logfile, ": \"", 3, &written, NULL); |
30 |
while (*data != '\0') { |
while (*data != '\0') { |
31 |
char escaped[2] = {'\\'}; |
char escaped[2] = {'\\'}; |
32 |
switch (*data) { |
switch (*data) { |
33 |
case '\n': |
case '\n': |
34 |
escaped[1] = 'n'; |
escaped[1] = 'n'; |
35 |
break; |
break; |
36 |
case '\r': |
case '\r': |
37 |
escaped[1] = 'r'; |
escaped[1] = 'r'; |
38 |
break; |
break; |
39 |
case '\t': |
case '\t': |
40 |
escaped[1] = 't'; |
escaped[1] = 't'; |
41 |
break; |
break; |
42 |
case '\\': |
case '\\': |
43 |
escaped[1] = '\\'; |
escaped[1] = '\\'; |
44 |
break; |
break; |
45 |
case '\"': |
case '\"': |
46 |
escaped[1] = '\"'; |
escaped[1] = '\"'; |
47 |
break; |
break; |
48 |
} |
} |
49 |
if (escaped[1] != '\0') { |
if (escaped[1] != '\0') { |
50 |
if (start < data) { |
if (start < data) { |
51 |
WriteFile(logfile, start, data - start, &written, NULL); |
WriteFile(logfile, start, data - start, &written, NULL); |
52 |
} |
} |
53 |
WriteFile(logfile, escaped, 2, &written, NULL); |
WriteFile(logfile, escaped, 2, &written, NULL); |
54 |
start = data + 1; |
start = data + 1; |
55 |
} |
} |
56 |
data++; |
data++; |
57 |
} |
} |
58 |
if (start < data) { |
if (start < data) { |
59 |
WriteFile(logfile, start, data - start, &written, NULL); |
WriteFile(logfile, start, data - start, &written, NULL); |
60 |
} |
} |
61 |
WriteFile(logfile, "\"\r\n", 3, &written, NULL); |
WriteFile(logfile, "\"\r\n", 3, &written, NULL); |
62 |
} |
} |
63 |
} |
} |
64 |
|
|
65 |
void debuglog_binary(const char* label, const unsigned char* data, int size) { |
void debuglog_binary(const char* label, const unsigned char* data, int size) { |
66 |
if (logfile != INVALID_HANDLE_VALUE) { |
if (logfile != INVALID_HANDLE_VALUE) { |
67 |
DWORD written; |
DWORD written; |
68 |
char buf[16]; |
char buf[16]; |
69 |
int len; |
int len; |
70 |
WriteFile(logfile, label, strlen(label), &written, NULL); |
WriteFile(logfile, label, strlen(label), &written, NULL); |
71 |
WriteFile(logfile, ": [", 3, &written, NULL); |
WriteFile(logfile, ": [", 3, &written, NULL); |
72 |
while (size-- > 0) { |
while (size-- > 0) { |
73 |
len = wsprintf(buf, " %02x", *data++); |
len = wsprintf(buf, " %02x", *data++); |
74 |
WriteFile(logfile, buf, 3, &written, NULL); |
WriteFile(logfile, buf, 3, &written, NULL); |
75 |
} |
} |
76 |
WriteFile(logfile, " ]\r\n", 4, &written, NULL); |
WriteFile(logfile, " ]\r\n", 4, &written, NULL); |
77 |
} |
} |
78 |
} |
} |
79 |
|
|
80 |
public: |
public: |
81 |
static void open(String filename) { |
static void open(String filename) { |
82 |
close(); |
close(); |
83 |
if (filename != NULL) { |
if (filename != NULL) { |
84 |
HANDLE logfile = ::CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
HANDLE logfile = ::CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
85 |
if (logfile != INVALID_HANDLE_VALUE) { |
if (logfile != INVALID_HANDLE_VALUE) { |
86 |
::SetFilePointer(logfile, 0, NULL, FILE_END); |
::SetFilePointer(logfile, 0, NULL, FILE_END); |
87 |
instance().logfile = logfile; |
instance().logfile = logfile; |
88 |
} |
} |
89 |
} |
} |
90 |
} |
} |
91 |
static void close() { |
static void close() { |
92 |
if (instance().logfile != INVALID_HANDLE_VALUE) { |
if (instance().logfile != INVALID_HANDLE_VALUE) { |
93 |
::CloseHandle(instance().logfile); |
::CloseHandle(instance().logfile); |
94 |
instance().logfile = INVALID_HANDLE_VALUE; |
instance().logfile = INVALID_HANDLE_VALUE; |
95 |
} |
} |
96 |
} |
} |
97 |
static void log(const char* label, const char* data) { |
static void log(const char* label, const char* data) { |
98 |
instance().debuglog_string(label, data); |
instance().debuglog_string(label, data); |
99 |
} |
} |
100 |
static void log(const char* label, const unsigned char* data, int size) { |
static void log(const char* label, const unsigned char* data, int size) { |
101 |
instance().debuglog_binary(label, data, size); |
instance().debuglog_binary(label, data, size); |
102 |
} |
} |
103 |
}; |
}; |
104 |
|
|
105 |
#endif//_YEBISOCKS_LOGGER_H_ |
#endif//_YEBISOCKS_LOGGER_H_ |