8946d969533096b9e553b0973e809f81dfa9a9b8
[platform/upstream/freerdp.git] / winpr / libwinpr / utils / wlog / Appender.c
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
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
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
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->State)
66         {
67                 status = appender->Open(log, appender);
68                 appender->State = 1;
69         }
70
71         return status;
72 }
73
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->State)
88         {
89                 status = appender->Close(log, appender);
90                 appender->State = 0;
91         }
92
93         return status;
94 }
95
96 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 %d\n", __FUNCTION__, logAppenderType);
132                 appender = NULL;
133                 break;
134         }
135
136         if (!appender)
137                 appender = (wLogAppender*) WLog_ConsoleAppender_New(log);
138
139         if (!appender)
140                 return NULL;
141
142         if (!(appender->Layout = WLog_Layout_New(log)))
143         {
144                 WLog_Appender_Free(log, appender);
145                 return NULL;
146         }
147
148         InitializeCriticalSectionAndSpinCount(&appender->lock, 4000);
149
150         return appender;
151 }
152
153 BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType)
154 {
155         if (!log)
156                 return FALSE;
157
158         if (log->Appender)
159         {
160                 WLog_Appender_Free(log, log->Appender);
161                 log->Appender = NULL;
162         }
163
164         log->Appender = WLog_Appender_New(log, logAppenderType);
165         return log->Appender != NULL;
166 }
167
168 BOOL WLog_ConfigureAppender(wLogAppender *appender, const char *setting, void *value)
169 {
170         if (!appender || !setting || !strlen(setting))
171                 return FALSE;
172
173         if (appender->Set)
174                 return appender->Set(appender, setting, value);
175         else
176                 return FALSE;
177
178 }