1 /**
2  * WinPR: Windows Portable Runtime
3  * WinPR Logger
4  *
5  * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23 
24 #include "Appender.h"
25 
WLog_Appender_Free(wLog * log,wLogAppender * appender)26 void WLog_Appender_Free(wLog* log, wLogAppender* appender)
27 {
28 	if (!appender)
29 		return;
30 
31 	if (appender->Layout)
32 	{
33 		WLog_Layout_Free(log, appender->Layout);
34 		appender->Layout = NULL;
35 	}
36 
37 	DeleteCriticalSection(&appender->lock);
38 	appender->Free(appender);
39 }
40 
WLog_GetLogAppender(wLog * log)41 wLogAppender* WLog_GetLogAppender(wLog* log)
42 {
43 	if (!log)
44 		return NULL;
45 
46 	if (!log->Appender)
47 		return WLog_GetLogAppender(log->Parent);
48 
49 	return log->Appender;
50 }
51 
WLog_OpenAppender(wLog * log)52 BOOL WLog_OpenAppender(wLog* log)
53 {
54 	int status = 0;
55 	wLogAppender* appender;
56 
57 	appender = WLog_GetLogAppender(log);
58 
59 	if (!appender)
60 		return FALSE;
61 
62 	if (!appender->Open)
63 		return TRUE;
64 
65 	if (!appender->active)
66 	{
67 		status = appender->Open(log, appender);
68 		appender->active = TRUE;
69 	}
70 
71 	return status;
72 }
73 
WLog_CloseAppender(wLog * log)74 BOOL WLog_CloseAppender(wLog* log)
75 {
76 	int status = 0;
77 	wLogAppender* appender;
78 
79 	appender = WLog_GetLogAppender(log);
80 
81 	if (!appender)
82 		return FALSE;
83 
84 	if (!appender->Close)
85 		return TRUE;
86 
87 	if (appender->active)
88 	{
89 		status = appender->Close(log, appender);
90 		appender->active = FALSE;
91 	}
92 
93 	return status;
94 }
95 
WLog_Appender_New(wLog * log,DWORD logAppenderType)96 static wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType)
97 {
98 	wLogAppender* appender;
99 
100 	if (!log)
101 		return NULL;
102 
103 	switch (logAppenderType)
104 	{
105 		case WLOG_APPENDER_CONSOLE:
106 			appender = WLog_ConsoleAppender_New(log);
107 			break;
108 		case WLOG_APPENDER_FILE:
109 			appender = WLog_FileAppender_New(log);
110 			break;
111 		case WLOG_APPENDER_BINARY:
112 			appender = WLog_BinaryAppender_New(log);
113 			break;
114 		case WLOG_APPENDER_CALLBACK:
115 			appender = WLog_CallbackAppender_New(log);
116 			break;
117 #ifdef HAVE_SYSLOG_H
118 		case WLOG_APPENDER_SYSLOG:
119 			appender = WLog_SyslogAppender_New(log);
120 			break;
121 #endif
122 #ifdef HAVE_JOURNALD_H
123 		case WLOG_APPENDER_JOURNALD:
124 			appender = WLog_JournaldAppender_New(log);
125 			break;
126 #endif
127 		case WLOG_APPENDER_UDP:
128 			appender = (wLogAppender*)WLog_UdpAppender_New(log);
129 			break;
130 		default:
131 			fprintf(stderr, "%s: unknown handler type %" PRIu32 "\n", __FUNCTION__,
132 			        logAppenderType);
133 			appender = NULL;
134 			break;
135 	}
136 
137 	if (!appender)
138 		appender = (wLogAppender*)WLog_ConsoleAppender_New(log);
139 
140 	if (!appender)
141 		return NULL;
142 
143 	if (!(appender->Layout = WLog_Layout_New(log)))
144 	{
145 		WLog_Appender_Free(log, appender);
146 		return NULL;
147 	}
148 
149 	InitializeCriticalSectionAndSpinCount(&appender->lock, 4000);
150 
151 	return appender;
152 }
153 
WLog_SetLogAppenderType(wLog * log,DWORD logAppenderType)154 BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType)
155 {
156 	if (!log)
157 		return FALSE;
158 
159 	if (log->Appender)
160 	{
161 		WLog_Appender_Free(log, log->Appender);
162 		log->Appender = NULL;
163 	}
164 
165 	log->Appender = WLog_Appender_New(log, logAppenderType);
166 	return log->Appender != NULL;
167 }
168 
WLog_ConfigureAppender(wLogAppender * appender,const char * setting,void * value)169 BOOL WLog_ConfigureAppender(wLogAppender* appender, const char* setting, void* value)
170 {
171 	/* Just check the settings string is not empty */
172 	if (!appender || !setting || (strnlen(setting, 2) == 0))
173 		return FALSE;
174 
175 	if (appender->Set)
176 		return appender->Set(appender, setting, value);
177 	else
178 		return FALSE;
179 }
180