FreeRDP
libfreerdp/core/update.h
1 
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 #define UPDATE_TYPE_ORDERS 0x0000
38 #define UPDATE_TYPE_BITMAP 0x0001
39 #define UPDATE_TYPE_PALETTE 0x0002
40 #define UPDATE_TYPE_SYNCHRONIZE 0x0003
41 
42 #define BITMAP_COMPRESSION 0x0001
43 #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;
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;
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;
116 
117 typedef struct
118 {
119  rdpSecondaryUpdate common;
120  BOOL glyph_v2;
122 
123 static INLINE rdp_update_internal* update_cast(rdpUpdate* update)
124 {
125  union
126  {
127  rdpUpdate* pub;
128  rdp_update_internal* internal;
129  } cnv;
130 
131  WINPR_ASSERT(update);
132  cnv.pub = update;
133  return cnv.internal;
134 }
135 
136 static INLINE rdp_altsec_update_internal* altsec_update_cast(rdpAltSecUpdate* update)
137 {
138  union
139  {
140  rdpAltSecUpdate* pub;
141  rdp_altsec_update_internal* internal;
142  } cnv;
143 
144  WINPR_ASSERT(update);
145  cnv.pub = update;
146  return cnv.internal;
147 }
148 
149 static INLINE rdp_primary_update_internal* primary_update_cast(rdpPrimaryUpdate* update)
150 {
151  union
152  {
153  rdpPrimaryUpdate* pub;
154  rdp_primary_update_internal* internal;
155  } cnv;
156 
157  WINPR_ASSERT(update);
158  cnv.pub = update;
159  return cnv.internal;
160 }
161 
162 static INLINE rdp_secondary_update_internal* secondary_update_cast(rdpSecondaryUpdate* update)
163 {
164  union
165  {
166  rdpSecondaryUpdate* pub;
168  } cnv;
169 
170  WINPR_ASSERT(update);
171  cnv.pub = update;
172  return cnv.internal;
173 }
174 
175 FREERDP_LOCAL void update_free(rdpUpdate* update);
176 
177 WINPR_ATTR_MALLOC(update_free, 1)
178 FREERDP_LOCAL rdpUpdate* update_new(rdpRdp* rdp);
179 
180 FREERDP_LOCAL void update_reset_state(rdpUpdate* update);
181 FREERDP_LOCAL BOOL update_post_connect(rdpUpdate* update);
182 FREERDP_LOCAL void update_post_disconnect(rdpUpdate* update);
183 
184 FREERDP_LOCAL BOOL update_recv_play_sound(rdpUpdate* update, wStream* s);
185 FREERDP_LOCAL BOOL update_recv_pointer(rdpUpdate* update, wStream* s);
186 FREERDP_LOCAL BOOL update_recv(rdpUpdate* update, wStream* s);
187 
188 WINPR_ATTR_MALLOC(free_bitmap_update, 2)
189 FREERDP_LOCAL BITMAP_UPDATE* update_read_bitmap_update(rdpUpdate* update, wStream* s);
190 
191 WINPR_ATTR_MALLOC(free_palette_update, 2)
192 FREERDP_LOCAL PALETTE_UPDATE* update_read_palette(rdpUpdate* update, wStream* s);
193 
194 WINPR_ATTR_MALLOC(free_pointer_system_update, 2)
195 FREERDP_LOCAL POINTER_SYSTEM_UPDATE* update_read_pointer_system(rdpUpdate* update, wStream* s);
196 
197 WINPR_ATTR_MALLOC(free_pointer_position_update, 2)
198 FREERDP_LOCAL POINTER_POSITION_UPDATE* update_read_pointer_position(rdpUpdate* update, wStream* s);
199 
200 WINPR_ATTR_MALLOC(free_pointer_color_update, 2)
201 FREERDP_LOCAL POINTER_COLOR_UPDATE* update_read_pointer_color(rdpUpdate* update, wStream* s,
202  BYTE xorBpp);
203 
204 WINPR_ATTR_MALLOC(free_pointer_large_update, 2)
205 FREERDP_LOCAL POINTER_LARGE_UPDATE* update_read_pointer_large(rdpUpdate* update, wStream* s);
206 
207 WINPR_ATTR_MALLOC(free_pointer_new_update, 2)
208 FREERDP_LOCAL POINTER_NEW_UPDATE* update_read_pointer_new(rdpUpdate* update, wStream* s);
209 
210 WINPR_ATTR_MALLOC(free_pointer_cached_update, 2)
211 FREERDP_LOCAL POINTER_CACHED_UPDATE* update_read_pointer_cached(rdpUpdate* update, wStream* s);
212 
213 FREERDP_LOCAL BOOL update_read_refresh_rect(rdpUpdate* update, wStream* s);
214 FREERDP_LOCAL BOOL update_read_suppress_output(rdpUpdate* update, wStream* s);
215 FREERDP_LOCAL void update_register_server_callbacks(rdpUpdate* update);
216 FREERDP_LOCAL void update_register_client_callbacks(rdpUpdate* update);
217 FREERDP_LOCAL int update_process_messages(rdpUpdate* update);
218 
219 FREERDP_LOCAL BOOL update_begin_paint(rdpUpdate* update);
220 FREERDP_LOCAL BOOL update_end_paint(rdpUpdate* update);
221 
222 #endif /* FREERDP_LIB_CORE_UPDATE_H */