Coverage Report

Created: 2026-07-16 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/FreeRDP/winpr/libwinpr/utils/wlog/CallbackAppender.c
Line
Count
Source
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
  wLogAppender common;
27
28
  wLogCallbacks callbacks;
29
  wLogCallbacksEx callbacksEx;
30
} wLogCallbackAppender;
31
32
static BOOL WLog_CallbackAppender_Open(WINPR_ATTR_UNUSED wLog* log,
33
                                       WINPR_ATTR_UNUSED wLogAppender* appender)
34
0
{
35
0
  return TRUE;
36
0
}
37
38
static BOOL WLog_CallbackAppender_Close(WINPR_ATTR_UNUSED wLog* log,
39
                                        WINPR_ATTR_UNUSED wLogAppender* appender)
40
0
{
41
0
  return TRUE;
42
0
}
43
44
static BOOL WLog_CallbackAppender_WriteMessage(wLog* log, wLogAppender* appender,
45
                                               const wLogMessage* cmessage)
46
0
{
47
0
  WINPR_ASSERT(cmessage);
48
0
  if (!appender)
49
0
    return FALSE;
50
51
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
52
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
53
54
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
55
56
0
  if (callbackAppender->callbacksEx.message)
57
0
  {
58
0
    wLogMessage message = *cmessage;
59
0
    message.PrefixString = prefix;
60
0
    return callbackAppender->callbacksEx.message(appender, &message);
61
0
  }
62
0
  else if (callbackAppender->callbacks.message)
63
0
  {
64
0
    wLogMessage message = *cmessage;
65
0
    message.PrefixString = prefix;
66
0
    return callbackAppender->callbacks.message(&message);
67
0
  }
68
0
  else
69
0
    return FALSE;
70
0
}
71
72
static BOOL WLog_CallbackAppender_WriteDataMessage(wLog* log, wLogAppender* appender,
73
                                                   const wLogMessage* cmessage)
74
0
{
75
0
  if (!appender)
76
0
    return FALSE;
77
78
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
79
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
80
81
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
82
0
  if (callbackAppender->callbacksEx.data)
83
0
  {
84
0
    wLogMessage message = *cmessage;
85
0
    message.PrefixString = prefix;
86
0
    return callbackAppender->callbacksEx.data(appender, &message);
87
0
  }
88
0
  else if (callbackAppender->callbacks.data)
89
0
  {
90
0
    wLogMessage message = *cmessage;
91
0
    message.PrefixString = prefix;
92
0
    return callbackAppender->callbacks.data(&message);
93
0
  }
94
0
  else
95
0
    return FALSE;
96
0
}
97
98
static BOOL WLog_CallbackAppender_WriteImageMessage(wLog* log, wLogAppender* appender,
99
                                                    const wLogMessage* cmessage)
100
0
{
101
0
  WINPR_ASSERT(cmessage);
102
0
  if (!appender)
103
0
    return FALSE;
104
105
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
106
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
107
108
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
109
0
  if (callbackAppender->callbacksEx.image)
110
0
  {
111
0
    wLogMessage message = *cmessage;
112
0
    message.PrefixString = prefix;
113
0
    return callbackAppender->callbacksEx.image(appender, &message);
114
0
  }
115
0
  else if (callbackAppender->callbacks.image)
116
0
  {
117
0
    wLogMessage message = *cmessage;
118
0
    message.PrefixString = prefix;
119
0
    return callbackAppender->callbacks.image(&message);
120
0
  }
121
0
  else
122
0
    return FALSE;
123
0
}
124
125
static BOOL WLog_CallbackAppender_WritePacketMessage(wLog* log, wLogAppender* appender,
126
                                                     const wLogMessage* cmessage)
127
0
{
128
0
  WINPR_ASSERT(cmessage);
129
0
  if (!appender)
130
0
    return FALSE;
131
132
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
133
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
134
135
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
136
0
  if (callbackAppender->callbacksEx.package)
137
0
  {
138
0
    wLogMessage message = *cmessage;
139
0
    message.PrefixString = prefix;
140
0
    return callbackAppender->callbacksEx.package(appender, &message);
141
0
  }
142
0
  else if (callbackAppender->callbacks.package)
143
0
  {
144
0
    wLogMessage message = *cmessage;
145
0
    message.PrefixString = prefix;
146
0
    return callbackAppender->callbacks.package(&message);
147
0
  }
148
0
  else
149
0
    return FALSE;
150
0
}
151
152
static BOOL WLog_CallbackAppender_Set(wLogAppender* appender, const char* setting, void* value)
153
0
{
154
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
155
156
0
  if (!value)
157
0
    return FALSE;
158
159
0
  if (strcmp(setting, "callbacks") == 0)
160
0
  {
161
0
    callbackAppender->callbacks = *(wLogCallbacks*)value;
162
0
    return TRUE;
163
0
  }
164
165
0
  if (strcmp(setting, "callbacksEx") == 0)
166
0
  {
167
0
    callbackAppender->callbacksEx = *(wLogCallbacksEx*)value;
168
0
    return TRUE;
169
0
  }
170
0
  return FALSE;
171
0
}
172
173
static void WLog_CallbackAppender_Free(wLogAppender* appender)
174
0
{
175
0
  free(appender);
176
0
}
177
178
wLogAppender* WLog_CallbackAppender_New(WINPR_ATTR_UNUSED wLog* log)
179
0
{
180
0
  wLogCallbackAppender* CallbackAppender =
181
0
      (wLogCallbackAppender*)calloc(1, sizeof(wLogCallbackAppender));
182
0
  if (!CallbackAppender)
183
0
    return nullptr;
184
185
0
  CallbackAppender->common.Type = WLOG_APPENDER_CALLBACK;
186
0
  CallbackAppender->common.Open = WLog_CallbackAppender_Open;
187
0
  CallbackAppender->common.Close = WLog_CallbackAppender_Close;
188
0
  CallbackAppender->common.WriteMessage = WLog_CallbackAppender_WriteMessage;
189
0
  CallbackAppender->common.WriteDataMessage = WLog_CallbackAppender_WriteDataMessage;
190
0
  CallbackAppender->common.WriteImageMessage = WLog_CallbackAppender_WriteImageMessage;
191
0
  CallbackAppender->common.WritePacketMessage = WLog_CallbackAppender_WritePacketMessage;
192
0
  CallbackAppender->common.Free = WLog_CallbackAppender_Free;
193
0
  CallbackAppender->common.Set = WLog_CallbackAppender_Set;
194
195
0
  return &CallbackAppender->common;
196
0
}