Coverage Report

Created: 2025-07-01 06:46

/src/FreeRDP/winpr/libwinpr/utils/wlog/CallbackAppender.c
Line
Count
Source (jump to first uncovered line)
1
/**
2
 * WinPR: Windows Portable Runtime
3
 * WinPR Logger
4
 *
5
 * Copyright 2014 Armin Novak <armin.novak@thincast.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
#include <winpr/config.h>
21
22
#include "CallbackAppender.h"
23
24
typedef struct
25
{
26
  WLOG_APPENDER_COMMON();
27
28
  wLogCallbacks* callbacks;
29
} wLogCallbackAppender;
30
31
static BOOL WLog_CallbackAppender_Open(WINPR_ATTR_UNUSED wLog* log,
32
                                       WINPR_ATTR_UNUSED wLogAppender* appender)
33
0
{
34
0
  return TRUE;
35
0
}
36
37
static BOOL WLog_CallbackAppender_Close(WINPR_ATTR_UNUSED wLog* log,
38
                                        WINPR_ATTR_UNUSED wLogAppender* appender)
39
0
{
40
0
  return TRUE;
41
0
}
42
43
static BOOL WLog_CallbackAppender_WriteMessage(wLog* log, wLogAppender* appender,
44
                                               wLogMessage* message)
45
0
{
46
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
47
0
  wLogCallbackAppender* callbackAppender = NULL;
48
49
0
  if (!appender)
50
0
    return FALSE;
51
52
0
  message->PrefixString = prefix;
53
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, message);
54
55
0
  callbackAppender = (wLogCallbackAppender*)appender;
56
57
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->message)
58
0
    return callbackAppender->callbacks->message(message);
59
0
  else
60
0
    return FALSE;
61
0
}
62
63
static BOOL WLog_CallbackAppender_WriteDataMessage(wLog* log, wLogAppender* appender,
64
                                                   wLogMessage* message)
65
0
{
66
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
67
0
  wLogCallbackAppender* callbackAppender = NULL;
68
69
0
  if (!appender)
70
0
    return FALSE;
71
72
0
  message->PrefixString = prefix;
73
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, message);
74
75
0
  callbackAppender = (wLogCallbackAppender*)appender;
76
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->data)
77
0
    return callbackAppender->callbacks->data(message);
78
0
  else
79
0
    return FALSE;
80
0
}
81
82
static BOOL WLog_CallbackAppender_WriteImageMessage(wLog* log, wLogAppender* appender,
83
                                                    wLogMessage* message)
84
0
{
85
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
86
0
  wLogCallbackAppender* callbackAppender = NULL;
87
88
0
  if (!appender)
89
0
    return FALSE;
90
91
0
  message->PrefixString = prefix;
92
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, message);
93
94
0
  callbackAppender = (wLogCallbackAppender*)appender;
95
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->image)
96
0
    return callbackAppender->callbacks->image(message);
97
0
  else
98
0
    return FALSE;
99
0
}
100
101
static BOOL WLog_CallbackAppender_WritePacketMessage(wLog* log, wLogAppender* appender,
102
                                                     wLogMessage* message)
103
0
{
104
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
105
0
  wLogCallbackAppender* callbackAppender = NULL;
106
107
0
  if (!appender)
108
0
    return FALSE;
109
110
0
  message->PrefixString = prefix;
111
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, message);
112
113
0
  callbackAppender = (wLogCallbackAppender*)appender;
114
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->package)
115
0
    return callbackAppender->callbacks->package(message);
116
0
  else
117
0
    return FALSE;
118
0
}
119
120
static BOOL WLog_CallbackAppender_Set(wLogAppender* appender, const char* setting, void* value)
121
0
{
122
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
123
124
0
  if (!value || (strcmp(setting, "callbacks") != 0))
125
0
    return FALSE;
126
127
0
  if (!(callbackAppender->callbacks = calloc(1, sizeof(wLogCallbacks))))
128
0
  {
129
0
    return FALSE;
130
0
  }
131
132
0
  callbackAppender->callbacks = memcpy(callbackAppender->callbacks, value, sizeof(wLogCallbacks));
133
0
  return TRUE;
134
0
}
135
136
static void WLog_CallbackAppender_Free(wLogAppender* appender)
137
0
{
138
0
  wLogCallbackAppender* callbackAppender = NULL;
139
0
  if (!appender)
140
0
  {
141
0
    return;
142
0
  }
143
144
0
  callbackAppender = (wLogCallbackAppender*)appender;
145
146
0
  free(callbackAppender->callbacks);
147
0
  free(appender);
148
0
}
149
150
wLogAppender* WLog_CallbackAppender_New(WINPR_ATTR_UNUSED wLog* log)
151
0
{
152
0
  wLogCallbackAppender* CallbackAppender = NULL;
153
154
0
  CallbackAppender = (wLogCallbackAppender*)calloc(1, sizeof(wLogCallbackAppender));
155
0
  if (!CallbackAppender)
156
0
    return NULL;
157
158
0
  CallbackAppender->Type = WLOG_APPENDER_CALLBACK;
159
160
0
  CallbackAppender->Open = WLog_CallbackAppender_Open;
161
0
  CallbackAppender->Close = WLog_CallbackAppender_Close;
162
0
  CallbackAppender->WriteMessage = WLog_CallbackAppender_WriteMessage;
163
0
  CallbackAppender->WriteDataMessage = WLog_CallbackAppender_WriteDataMessage;
164
0
  CallbackAppender->WriteImageMessage = WLog_CallbackAppender_WriteImageMessage;
165
0
  CallbackAppender->WritePacketMessage = WLog_CallbackAppender_WritePacketMessage;
166
0
  CallbackAppender->Free = WLog_CallbackAppender_Free;
167
0
  CallbackAppender->Set = WLog_CallbackAppender_Set;
168
169
0
  return (wLogAppender*)CallbackAppender;
170
0
}