Coverage Report

Created: 2025-11-24 06:38

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
} 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
                                               const wLogMessage* cmessage)
45
0
{
46
0
  WINPR_ASSERT(cmessage);
47
0
  if (!appender)
48
0
    return FALSE;
49
50
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
51
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
52
53
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
54
55
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->message)
56
0
  {
57
0
    wLogMessage message = *cmessage;
58
0
    message.PrefixString = prefix;
59
0
    return callbackAppender->callbacks->message(&message);
60
0
  }
61
0
  else
62
0
    return FALSE;
63
0
}
64
65
static BOOL WLog_CallbackAppender_WriteDataMessage(wLog* log, wLogAppender* appender,
66
                                                   const wLogMessage* cmessage)
67
0
{
68
0
  if (!appender)
69
0
    return FALSE;
70
71
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
72
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
73
74
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
75
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->data)
76
0
  {
77
0
    wLogMessage message = *cmessage;
78
0
    message.PrefixString = prefix;
79
0
    return callbackAppender->callbacks->data(&message);
80
0
  }
81
0
  else
82
0
    return FALSE;
83
0
}
84
85
static BOOL WLog_CallbackAppender_WriteImageMessage(wLog* log, wLogAppender* appender,
86
                                                    const wLogMessage* cmessage)
87
0
{
88
0
  WINPR_ASSERT(cmessage);
89
0
  if (!appender)
90
0
    return FALSE;
91
92
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
93
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
94
95
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
96
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->image)
97
0
  {
98
0
    wLogMessage message = *cmessage;
99
0
    message.PrefixString = prefix;
100
0
    return callbackAppender->callbacks->image(&message);
101
0
  }
102
0
  else
103
0
    return FALSE;
104
0
}
105
106
static BOOL WLog_CallbackAppender_WritePacketMessage(wLog* log, wLogAppender* appender,
107
                                                     const wLogMessage* cmessage)
108
0
{
109
0
  WINPR_ASSERT(cmessage);
110
0
  if (!appender)
111
0
    return FALSE;
112
113
0
  char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
114
0
  WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
115
116
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
117
0
  if (callbackAppender->callbacks && callbackAppender->callbacks->package)
118
0
  {
119
0
    wLogMessage message = *cmessage;
120
0
    message.PrefixString = prefix;
121
0
    return callbackAppender->callbacks->package(&message);
122
0
  }
123
0
  else
124
0
    return FALSE;
125
0
}
126
127
static BOOL WLog_CallbackAppender_Set(wLogAppender* appender, const char* setting, void* value)
128
0
{
129
0
  wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
130
131
0
  if (!value || (strcmp(setting, "callbacks") != 0))
132
0
    return FALSE;
133
134
0
  if (!(callbackAppender->callbacks = calloc(1, sizeof(wLogCallbacks))))
135
0
  {
136
0
    return FALSE;
137
0
  }
138
139
0
  callbackAppender->callbacks = memcpy(callbackAppender->callbacks, value, sizeof(wLogCallbacks));
140
0
  return TRUE;
141
0
}
142
143
static void WLog_CallbackAppender_Free(wLogAppender* appender)
144
0
{
145
0
  wLogCallbackAppender* callbackAppender = NULL;
146
0
  if (!appender)
147
0
  {
148
0
    return;
149
0
  }
150
151
0
  callbackAppender = (wLogCallbackAppender*)appender;
152
153
0
  free(callbackAppender->callbacks);
154
0
  free(appender);
155
0
}
156
157
wLogAppender* WLog_CallbackAppender_New(WINPR_ATTR_UNUSED wLog* log)
158
0
{
159
0
  wLogCallbackAppender* CallbackAppender =
160
0
      (wLogCallbackAppender*)calloc(1, sizeof(wLogCallbackAppender));
161
0
  if (!CallbackAppender)
162
0
    return NULL;
163
164
0
  CallbackAppender->common.Type = WLOG_APPENDER_CALLBACK;
165
0
  CallbackAppender->common.Open = WLog_CallbackAppender_Open;
166
0
  CallbackAppender->common.Close = WLog_CallbackAppender_Close;
167
0
  CallbackAppender->common.WriteMessage = WLog_CallbackAppender_WriteMessage;
168
0
  CallbackAppender->common.WriteDataMessage = WLog_CallbackAppender_WriteDataMessage;
169
0
  CallbackAppender->common.WriteImageMessage = WLog_CallbackAppender_WriteImageMessage;
170
0
  CallbackAppender->common.WritePacketMessage = WLog_CallbackAppender_WritePacketMessage;
171
0
  CallbackAppender->common.Free = WLog_CallbackAppender_Free;
172
0
  CallbackAppender->common.Set = WLog_CallbackAppender_Set;
173
174
0
  return &CallbackAppender->common;
175
0
}