Coverage Report

Created: 2026-03-07 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/FreeRDP/libfreerdp/core/update.h
Line
Count
Source
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 * Update Data PDUs
4
 *
5
 * Copyright 2011 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
#ifndef FREERDP_LIB_CORE_UPDATE_H
21
#define FREERDP_LIB_CORE_UPDATE_H
22
23
#include "rdp.h"
24
#include "orders.h"
25
26
#include <freerdp/types.h>
27
#include <freerdp/update.h>
28
#include <freerdp/freerdp.h>
29
#include <freerdp/api.h>
30
31
#include <winpr/stream.h>
32
33
#include "../cache/bitmap.h"
34
#include "../cache/palette.h"
35
#include "../cache/pointer.h"
36
37
353
#define UPDATE_TYPE_ORDERS 0x0000
38
345
#define UPDATE_TYPE_BITMAP 0x0001
39
234
#define UPDATE_TYPE_PALETTE 0x0002
40
4
#define UPDATE_TYPE_SYNCHRONIZE 0x0003
41
42
97.8k
#define BITMAP_COMPRESSION 0x0001
43
87.5k
#define NO_BITMAP_COMPRESSION_HDR 0x0400
44
45
typedef struct
46
{
47
  rdpUpdate common;
48
49
  wLog* log;
50
51
  BOOL dump_rfx;
52
  BOOL play_rfx;
53
  rdpPcap* pcap_rfx;
54
  BOOL initialState;
55
56
  BOOL asynchronous;
57
  rdpUpdateProxy* proxy;
58
  wMessageQueue* queue;
59
60
  wStream* us;
61
  UINT16 numberOrders;
62
  size_t offsetOrders; /* the offset to patch numberOrders in the stream */
63
  BOOL combineUpdates;
64
  rdpBounds currentBounds;
65
  rdpBounds previousBounds;
66
  CRITICAL_SECTION mux;
67
  BOOL withinBeginEndPaint;
68
} rdp_update_internal;
69
70
typedef struct
71
{
72
  rdpAltSecUpdate common;
73
74
  CREATE_OFFSCREEN_BITMAP_ORDER create_offscreen_bitmap;
75
  SWITCH_SURFACE_ORDER switch_surface;
76
  CREATE_NINE_GRID_BITMAP_ORDER create_nine_grid_bitmap;
77
  FRAME_MARKER_ORDER frame_marker;
78
  STREAM_BITMAP_FIRST_ORDER stream_bitmap_first;
79
  STREAM_BITMAP_NEXT_ORDER stream_bitmap_next;
80
  DRAW_GDIPLUS_CACHE_FIRST_ORDER draw_gdiplus_cache_first;
81
  DRAW_GDIPLUS_CACHE_NEXT_ORDER draw_gdiplus_cache_next;
82
  DRAW_GDIPLUS_CACHE_END_ORDER draw_gdiplus_cache_end;
83
  DRAW_GDIPLUS_FIRST_ORDER draw_gdiplus_first;
84
  DRAW_GDIPLUS_NEXT_ORDER draw_gdiplus_next;
85
  DRAW_GDIPLUS_END_ORDER draw_gdiplus_end;
86
} rdp_altsec_update_internal;
87
88
typedef struct
89
{
90
  rdpPrimaryUpdate common;
91
92
  ORDER_INFO order_info;
93
  DSTBLT_ORDER dstblt;
94
  PATBLT_ORDER patblt;
95
  SCRBLT_ORDER scrblt;
96
  OPAQUE_RECT_ORDER opaque_rect;
97
  DRAW_NINE_GRID_ORDER draw_nine_grid;
98
  MULTI_DSTBLT_ORDER multi_dstblt;
99
  MULTI_PATBLT_ORDER multi_patblt;
100
  MULTI_SCRBLT_ORDER multi_scrblt;
101
  MULTI_OPAQUE_RECT_ORDER multi_opaque_rect;
102
  MULTI_DRAW_NINE_GRID_ORDER multi_draw_nine_grid;
103
  LINE_TO_ORDER line_to;
104
  POLYLINE_ORDER polyline;
105
  MEMBLT_ORDER memblt;
106
  MEM3BLT_ORDER mem3blt;
107
  SAVE_BITMAP_ORDER save_bitmap;
108
  GLYPH_INDEX_ORDER glyph_index;
109
  FAST_INDEX_ORDER fast_index;
110
  FAST_GLYPH_ORDER fast_glyph;
111
  POLYGON_SC_ORDER polygon_sc;
112
  POLYGON_CB_ORDER polygon_cb;
113
  ELLIPSE_SC_ORDER ellipse_sc;
114
  ELLIPSE_CB_ORDER ellipse_cb;
115
} rdp_primary_update_internal;
116
117
typedef struct
118
{
119
  rdpSecondaryUpdate common;
120
  BOOL glyph_v2;
121
} rdp_secondary_update_internal;
122
123
WINPR_ATTR_NODISCARD
124
static inline rdp_update_internal* update_cast(rdpUpdate* update)
125
852k
{
126
852k
  union
127
852k
  {
128
852k
    rdpUpdate* pub;
129
852k
    rdp_update_internal* internal;
130
852k
  } cnv;
131
132
852k
  WINPR_ASSERT(update);
133
852k
  cnv.pub = update;
134
852k
  return cnv.internal;
135
852k
}
Unexecuted instantiation: settings.c:update_cast
Unexecuted instantiation: capabilities.c:update_cast
Unexecuted instantiation: rdp.c:update_cast
Unexecuted instantiation: fastpath.c:update_cast
surface.c:update_cast
Line
Count
Source
125
19.8k
{
126
19.8k
  union
127
19.8k
  {
128
19.8k
    rdpUpdate* pub;
129
19.8k
    rdp_update_internal* internal;
130
19.8k
  } cnv;
131
132
19.8k
  WINPR_ASSERT(update);
133
19.8k
  cnv.pub = update;
134
19.8k
  return cnv.internal;
135
19.8k
}
Unexecuted instantiation: transport.c:update_cast
update.c:update_cast
Line
Count
Source
125
411k
{
126
411k
  union
127
411k
  {
128
411k
    rdpUpdate* pub;
129
411k
    rdp_update_internal* internal;
130
411k
  } cnv;
131
132
411k
  WINPR_ASSERT(update);
133
411k
  cnv.pub = update;
134
411k
  return cnv.internal;
135
411k
}
Unexecuted instantiation: message.c:update_cast
Unexecuted instantiation: channels.c:update_cast
Unexecuted instantiation: aad.c:update_cast
Unexecuted instantiation: timer.c:update_cast
Unexecuted instantiation: rdg.c:update_cast
Unexecuted instantiation: rpc_client.c:update_cast
Unexecuted instantiation: wst.c:update_cast
Unexecuted instantiation: utils.c:update_cast
Unexecuted instantiation: activation.c:update_cast
Unexecuted instantiation: mcs.c:update_cast
Unexecuted instantiation: nla.c:update_cast
Unexecuted instantiation: info.c:update_cast
Unexecuted instantiation: input.c:update_cast
Unexecuted instantiation: license.c:update_cast
Unexecuted instantiation: security.c:update_cast
orders.c:update_cast
Line
Count
Source
125
404k
{
126
404k
  union
127
404k
  {
128
404k
    rdpUpdate* pub;
129
404k
    rdp_update_internal* internal;
130
404k
  } cnv;
131
132
404k
  WINPR_ASSERT(update);
133
404k
  cnv.pub = update;
134
404k
  return cnv.internal;
135
404k
}
Unexecuted instantiation: freerdp.c:update_cast
Unexecuted instantiation: client.c:update_cast
Unexecuted instantiation: server.c:update_cast
Unexecuted instantiation: codecs.c:update_cast
Unexecuted instantiation: metrics.c:update_cast
Unexecuted instantiation: connection.c:update_cast
Unexecuted instantiation: redirection.c:update_cast
Unexecuted instantiation: autodetect.c:update_cast
Unexecuted instantiation: heartbeat.c:update_cast
Unexecuted instantiation: multitransport.c:update_cast
Unexecuted instantiation: timezone.c:update_cast
Unexecuted instantiation: tcp.c:update_cast
window.c:update_cast
Line
Count
Source
125
15.9k
{
126
15.9k
  union
127
15.9k
  {
128
15.9k
    rdpUpdate* pub;
129
15.9k
    rdp_update_internal* internal;
130
15.9k
  } cnv;
131
132
15.9k
  WINPR_ASSERT(update);
133
15.9k
  cnv.pub = update;
134
15.9k
  return cnv.internal;
135
15.9k
}
Unexecuted instantiation: peer.c:update_cast
Unexecuted instantiation: display.c:update_cast
Unexecuted instantiation: arm.c:update_cast
Unexecuted instantiation: gdi.c:update_cast
Unexecuted instantiation: TestFuzzCoreServer.c:update_cast
Unexecuted instantiation: TestFuzzCoreClient.c:update_cast
Unexecuted instantiation: gfx.c:update_cast
Unexecuted instantiation: video.c:update_cast
136
137
WINPR_ATTR_NODISCARD
138
static inline rdp_altsec_update_internal* altsec_update_cast(rdpAltSecUpdate* update)
139
238k
{
140
238k
  union
141
238k
  {
142
238k
    rdpAltSecUpdate* pub;
143
238k
    rdp_altsec_update_internal* internal;
144
238k
  } cnv;
145
146
238k
  WINPR_ASSERT(update);
147
238k
  cnv.pub = update;
148
238k
  return cnv.internal;
149
238k
}
Unexecuted instantiation: settings.c:altsec_update_cast
Unexecuted instantiation: capabilities.c:altsec_update_cast
Unexecuted instantiation: rdp.c:altsec_update_cast
Unexecuted instantiation: fastpath.c:altsec_update_cast
Unexecuted instantiation: surface.c:altsec_update_cast
Unexecuted instantiation: transport.c:altsec_update_cast
update.c:altsec_update_cast
Line
Count
Source
139
15.9k
{
140
15.9k
  union
141
15.9k
  {
142
15.9k
    rdpAltSecUpdate* pub;
143
15.9k
    rdp_altsec_update_internal* internal;
144
15.9k
  } cnv;
145
146
15.9k
  WINPR_ASSERT(update);
147
15.9k
  cnv.pub = update;
148
15.9k
  return cnv.internal;
149
15.9k
}
Unexecuted instantiation: message.c:altsec_update_cast
Unexecuted instantiation: channels.c:altsec_update_cast
Unexecuted instantiation: aad.c:altsec_update_cast
Unexecuted instantiation: timer.c:altsec_update_cast
Unexecuted instantiation: rdg.c:altsec_update_cast
Unexecuted instantiation: rpc_client.c:altsec_update_cast
Unexecuted instantiation: wst.c:altsec_update_cast
Unexecuted instantiation: utils.c:altsec_update_cast
Unexecuted instantiation: activation.c:altsec_update_cast
Unexecuted instantiation: mcs.c:altsec_update_cast
Unexecuted instantiation: nla.c:altsec_update_cast
Unexecuted instantiation: info.c:altsec_update_cast
Unexecuted instantiation: input.c:altsec_update_cast
Unexecuted instantiation: license.c:altsec_update_cast
Unexecuted instantiation: security.c:altsec_update_cast
orders.c:altsec_update_cast
Line
Count
Source
139
222k
{
140
222k
  union
141
222k
  {
142
222k
    rdpAltSecUpdate* pub;
143
222k
    rdp_altsec_update_internal* internal;
144
222k
  } cnv;
145
146
222k
  WINPR_ASSERT(update);
147
222k
  cnv.pub = update;
148
222k
  return cnv.internal;
149
222k
}
Unexecuted instantiation: freerdp.c:altsec_update_cast
Unexecuted instantiation: client.c:altsec_update_cast
Unexecuted instantiation: server.c:altsec_update_cast
Unexecuted instantiation: codecs.c:altsec_update_cast
Unexecuted instantiation: metrics.c:altsec_update_cast
Unexecuted instantiation: connection.c:altsec_update_cast
Unexecuted instantiation: redirection.c:altsec_update_cast
Unexecuted instantiation: autodetect.c:altsec_update_cast
Unexecuted instantiation: heartbeat.c:altsec_update_cast
Unexecuted instantiation: multitransport.c:altsec_update_cast
Unexecuted instantiation: timezone.c:altsec_update_cast
Unexecuted instantiation: tcp.c:altsec_update_cast
Unexecuted instantiation: window.c:altsec_update_cast
Unexecuted instantiation: peer.c:altsec_update_cast
Unexecuted instantiation: display.c:altsec_update_cast
Unexecuted instantiation: arm.c:altsec_update_cast
Unexecuted instantiation: gdi.c:altsec_update_cast
Unexecuted instantiation: TestFuzzCoreServer.c:altsec_update_cast
Unexecuted instantiation: TestFuzzCoreClient.c:altsec_update_cast
Unexecuted instantiation: gfx.c:altsec_update_cast
Unexecuted instantiation: video.c:altsec_update_cast
150
151
WINPR_ATTR_NODISCARD
152
static inline rdp_primary_update_internal* primary_update_cast(rdpPrimaryUpdate* update)
153
162k
{
154
162k
  union
155
162k
  {
156
162k
    rdpPrimaryUpdate* pub;
157
162k
    rdp_primary_update_internal* internal;
158
162k
  } cnv;
159
160
162k
  WINPR_ASSERT(update);
161
162k
  cnv.pub = update;
162
162k
  return cnv.internal;
163
162k
}
Unexecuted instantiation: settings.c:primary_update_cast
Unexecuted instantiation: capabilities.c:primary_update_cast
Unexecuted instantiation: rdp.c:primary_update_cast
Unexecuted instantiation: fastpath.c:primary_update_cast
Unexecuted instantiation: surface.c:primary_update_cast
Unexecuted instantiation: transport.c:primary_update_cast
update.c:primary_update_cast
Line
Count
Source
153
15.9k
{
154
15.9k
  union
155
15.9k
  {
156
15.9k
    rdpPrimaryUpdate* pub;
157
15.9k
    rdp_primary_update_internal* internal;
158
15.9k
  } cnv;
159
160
15.9k
  WINPR_ASSERT(update);
161
15.9k
  cnv.pub = update;
162
15.9k
  return cnv.internal;
163
15.9k
}
Unexecuted instantiation: message.c:primary_update_cast
Unexecuted instantiation: channels.c:primary_update_cast
Unexecuted instantiation: aad.c:primary_update_cast
Unexecuted instantiation: timer.c:primary_update_cast
Unexecuted instantiation: rdg.c:primary_update_cast
Unexecuted instantiation: rpc_client.c:primary_update_cast
Unexecuted instantiation: wst.c:primary_update_cast
Unexecuted instantiation: utils.c:primary_update_cast
Unexecuted instantiation: activation.c:primary_update_cast
Unexecuted instantiation: mcs.c:primary_update_cast
Unexecuted instantiation: nla.c:primary_update_cast
Unexecuted instantiation: info.c:primary_update_cast
Unexecuted instantiation: input.c:primary_update_cast
Unexecuted instantiation: license.c:primary_update_cast
Unexecuted instantiation: security.c:primary_update_cast
orders.c:primary_update_cast
Line
Count
Source
153
146k
{
154
146k
  union
155
146k
  {
156
146k
    rdpPrimaryUpdate* pub;
157
146k
    rdp_primary_update_internal* internal;
158
146k
  } cnv;
159
160
146k
  WINPR_ASSERT(update);
161
146k
  cnv.pub = update;
162
146k
  return cnv.internal;
163
146k
}
Unexecuted instantiation: freerdp.c:primary_update_cast
Unexecuted instantiation: client.c:primary_update_cast
Unexecuted instantiation: server.c:primary_update_cast
Unexecuted instantiation: codecs.c:primary_update_cast
Unexecuted instantiation: metrics.c:primary_update_cast
Unexecuted instantiation: connection.c:primary_update_cast
Unexecuted instantiation: redirection.c:primary_update_cast
Unexecuted instantiation: autodetect.c:primary_update_cast
Unexecuted instantiation: heartbeat.c:primary_update_cast
Unexecuted instantiation: multitransport.c:primary_update_cast
Unexecuted instantiation: timezone.c:primary_update_cast
Unexecuted instantiation: tcp.c:primary_update_cast
Unexecuted instantiation: window.c:primary_update_cast
Unexecuted instantiation: peer.c:primary_update_cast
Unexecuted instantiation: display.c:primary_update_cast
Unexecuted instantiation: arm.c:primary_update_cast
Unexecuted instantiation: gdi.c:primary_update_cast
Unexecuted instantiation: TestFuzzCoreServer.c:primary_update_cast
Unexecuted instantiation: TestFuzzCoreClient.c:primary_update_cast
Unexecuted instantiation: gfx.c:primary_update_cast
Unexecuted instantiation: video.c:primary_update_cast
164
165
WINPR_ATTR_NODISCARD
166
static inline rdp_secondary_update_internal* secondary_update_cast(rdpSecondaryUpdate* update)
167
1.02k
{
168
1.02k
  union
169
1.02k
  {
170
1.02k
    rdpSecondaryUpdate* pub;
171
1.02k
    rdp_secondary_update_internal* internal;
172
1.02k
  } cnv;
173
174
1.02k
  WINPR_ASSERT(update);
175
1.02k
  cnv.pub = update;
176
1.02k
  return cnv.internal;
177
1.02k
}
Unexecuted instantiation: settings.c:secondary_update_cast
capabilities.c:secondary_update_cast
Line
Count
Source
167
1.02k
{
168
1.02k
  union
169
1.02k
  {
170
1.02k
    rdpSecondaryUpdate* pub;
171
1.02k
    rdp_secondary_update_internal* internal;
172
1.02k
  } cnv;
173
174
1.02k
  WINPR_ASSERT(update);
175
1.02k
  cnv.pub = update;
176
1.02k
  return cnv.internal;
177
1.02k
}
Unexecuted instantiation: rdp.c:secondary_update_cast
Unexecuted instantiation: fastpath.c:secondary_update_cast
Unexecuted instantiation: surface.c:secondary_update_cast
Unexecuted instantiation: transport.c:secondary_update_cast
Unexecuted instantiation: update.c:secondary_update_cast
Unexecuted instantiation: message.c:secondary_update_cast
Unexecuted instantiation: channels.c:secondary_update_cast
Unexecuted instantiation: aad.c:secondary_update_cast
Unexecuted instantiation: timer.c:secondary_update_cast
Unexecuted instantiation: rdg.c:secondary_update_cast
Unexecuted instantiation: rpc_client.c:secondary_update_cast
Unexecuted instantiation: wst.c:secondary_update_cast
Unexecuted instantiation: utils.c:secondary_update_cast
Unexecuted instantiation: activation.c:secondary_update_cast
Unexecuted instantiation: mcs.c:secondary_update_cast
Unexecuted instantiation: nla.c:secondary_update_cast
Unexecuted instantiation: info.c:secondary_update_cast
Unexecuted instantiation: input.c:secondary_update_cast
Unexecuted instantiation: license.c:secondary_update_cast
Unexecuted instantiation: security.c:secondary_update_cast
Unexecuted instantiation: orders.c:secondary_update_cast
Unexecuted instantiation: freerdp.c:secondary_update_cast
Unexecuted instantiation: client.c:secondary_update_cast
Unexecuted instantiation: server.c:secondary_update_cast
Unexecuted instantiation: codecs.c:secondary_update_cast
Unexecuted instantiation: metrics.c:secondary_update_cast
Unexecuted instantiation: connection.c:secondary_update_cast
Unexecuted instantiation: redirection.c:secondary_update_cast
Unexecuted instantiation: autodetect.c:secondary_update_cast
Unexecuted instantiation: heartbeat.c:secondary_update_cast
Unexecuted instantiation: multitransport.c:secondary_update_cast
Unexecuted instantiation: timezone.c:secondary_update_cast
Unexecuted instantiation: tcp.c:secondary_update_cast
Unexecuted instantiation: window.c:secondary_update_cast
Unexecuted instantiation: peer.c:secondary_update_cast
Unexecuted instantiation: display.c:secondary_update_cast
Unexecuted instantiation: arm.c:secondary_update_cast
Unexecuted instantiation: gdi.c:secondary_update_cast
Unexecuted instantiation: TestFuzzCoreServer.c:secondary_update_cast
Unexecuted instantiation: TestFuzzCoreClient.c:secondary_update_cast
Unexecuted instantiation: gfx.c:secondary_update_cast
Unexecuted instantiation: video.c:secondary_update_cast
178
179
FREERDP_LOCAL void update_free(rdpUpdate* update);
180
181
WINPR_ATTR_MALLOC(update_free, 1)
182
WINPR_ATTR_NODISCARD
183
FREERDP_LOCAL rdpUpdate* update_new(rdpRdp* rdp);
184
185
FREERDP_LOCAL void update_reset_state(rdpUpdate* update);
186
187
WINPR_ATTR_NODISCARD
188
FREERDP_LOCAL BOOL update_post_connect(rdpUpdate* update);
189
190
FREERDP_LOCAL void update_post_disconnect(rdpUpdate* update);
191
192
WINPR_ATTR_NODISCARD
193
FREERDP_LOCAL BOOL update_recv_play_sound(rdpUpdate* update, wStream* s);
194
195
WINPR_ATTR_NODISCARD
196
FREERDP_LOCAL BOOL update_recv_pointer(rdpUpdate* update, wStream* s);
197
198
WINPR_ATTR_NODISCARD
199
FREERDP_LOCAL BOOL update_recv(rdpUpdate* update, wStream* s);
200
201
WINPR_ATTR_MALLOC(free_bitmap_update, 2)
202
WINPR_ATTR_NODISCARD
203
FREERDP_LOCAL BITMAP_UPDATE* update_read_bitmap_update(rdpUpdate* update, wStream* s);
204
205
WINPR_ATTR_MALLOC(free_palette_update, 2)
206
WINPR_ATTR_NODISCARD
207
FREERDP_LOCAL PALETTE_UPDATE* update_read_palette(rdpUpdate* update, wStream* s);
208
209
WINPR_ATTR_MALLOC(free_pointer_system_update, 2)
210
WINPR_ATTR_NODISCARD
211
FREERDP_LOCAL POINTER_SYSTEM_UPDATE* update_read_pointer_system(rdpUpdate* update, wStream* s);
212
213
WINPR_ATTR_MALLOC(free_pointer_position_update, 2)
214
WINPR_ATTR_NODISCARD
215
FREERDP_LOCAL POINTER_POSITION_UPDATE* update_read_pointer_position(rdpUpdate* update, wStream* s);
216
217
WINPR_ATTR_MALLOC(free_pointer_color_update, 2)
218
WINPR_ATTR_NODISCARD
219
FREERDP_LOCAL POINTER_COLOR_UPDATE* update_read_pointer_color(rdpUpdate* update, wStream* s,
220
                                                              BYTE xorBpp);
221
222
WINPR_ATTR_MALLOC(free_pointer_large_update, 2)
223
WINPR_ATTR_NODISCARD
224
FREERDP_LOCAL POINTER_LARGE_UPDATE* update_read_pointer_large(rdpUpdate* update, wStream* s);
225
226
WINPR_ATTR_MALLOC(free_pointer_new_update, 2)
227
WINPR_ATTR_NODISCARD
228
FREERDP_LOCAL POINTER_NEW_UPDATE* update_read_pointer_new(rdpUpdate* update, wStream* s);
229
230
WINPR_ATTR_MALLOC(free_pointer_cached_update, 2)
231
WINPR_ATTR_NODISCARD
232
FREERDP_LOCAL POINTER_CACHED_UPDATE* update_read_pointer_cached(rdpUpdate* update, wStream* s);
233
234
WINPR_ATTR_NODISCARD
235
FREERDP_LOCAL BOOL update_read_refresh_rect(rdpUpdate* update, wStream* s);
236
237
WINPR_ATTR_NODISCARD
238
FREERDP_LOCAL BOOL update_read_suppress_output(rdpUpdate* update, wStream* s);
239
240
FREERDP_LOCAL void update_register_server_callbacks(rdpUpdate* update);
241
FREERDP_LOCAL void update_register_client_callbacks(rdpUpdate* update);
242
243
WINPR_ATTR_NODISCARD
244
FREERDP_LOCAL int update_process_messages(rdpUpdate* update);
245
246
WINPR_ATTR_NODISCARD
247
FREERDP_LOCAL BOOL update_begin_paint(rdpUpdate* update);
248
249
WINPR_ATTR_NODISCARD
250
FREERDP_LOCAL BOOL update_end_paint(rdpUpdate* update);
251
252
#endif /* FREERDP_LIB_CORE_UPDATE_H */