|
|
@ -64,7 +64,6 @@ xrdp_orders_delete(struct xrdp_orders *self)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
xrdp_jpeg_deinit(self->jpeg_han);
|
|
|
|
xrdp_jpeg_deinit(self->jpeg_han);
|
|
|
|
free_stream(self->out_s);
|
|
|
|
free_stream(self->out_s);
|
|
|
|
g_free(self->orders_state.text_data);
|
|
|
|
g_free(self->orders_state.text_data);
|
|
|
@ -81,7 +80,6 @@ xrdp_orders_reset(struct xrdp_orders *self)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_free(self->orders_state.text_data);
|
|
|
|
g_free(self->orders_state.text_data);
|
|
|
|
g_memset(&(self->orders_state), 0, sizeof(self->orders_state));
|
|
|
|
g_memset(&(self->orders_state), 0, sizeof(self->orders_state));
|
|
|
|
self->order_count_ptr = 0;
|
|
|
|
self->order_count_ptr = 0;
|
|
|
@ -98,24 +96,33 @@ int APP_CC
|
|
|
|
xrdp_orders_init(struct xrdp_orders *self)
|
|
|
|
xrdp_orders_init(struct xrdp_orders *self)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
self->order_level++;
|
|
|
|
self->order_level++;
|
|
|
|
|
|
|
|
|
|
|
|
if (self->order_level == 1)
|
|
|
|
if (self->order_level == 1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
self->order_count = 0;
|
|
|
|
self->order_count = 0;
|
|
|
|
|
|
|
|
if (self->rdp_layer->client_info.use_fast_path & 1)
|
|
|
|
/* is this big enough */
|
|
|
|
{
|
|
|
|
|
|
|
|
LLOGLN(10, ("xrdp_orders_init: fastpath"));
|
|
|
|
|
|
|
|
if (xrdp_rdp_init_fastpath(self->rdp_layer, self->out_s) != 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
self->order_count_ptr = self->out_s->p;
|
|
|
|
|
|
|
|
out_uint8s(self->out_s, 2); /* number of orders, set later */
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
LLOGLN(10, ("xrdp_orders_init: slowpath"));
|
|
|
|
if (xrdp_rdp_init_data(self->rdp_layer, self->out_s) != 0)
|
|
|
|
if (xrdp_rdp_init_data(self->rdp_layer, self->out_s) != 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
out_uint16_le(self->out_s, RDP_UPDATE_ORDERS);
|
|
|
|
out_uint16_le(self->out_s, RDP_UPDATE_ORDERS);
|
|
|
|
out_uint8s(self->out_s, 2); /* pad */
|
|
|
|
out_uint8s(self->out_s, 2); /* pad */
|
|
|
|
self->order_count_ptr = self->out_s->p;
|
|
|
|
self->order_count_ptr = self->out_s->p;
|
|
|
|
out_uint8s(self->out_s, 2); /* number of orders, set later */
|
|
|
|
out_uint8s(self->out_s, 2); /* number of orders, set later */
|
|
|
|
out_uint8s(self->out_s, 2); /* pad */
|
|
|
|
out_uint8s(self->out_s, 2); /* pad */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -127,11 +134,9 @@ xrdp_orders_send(struct xrdp_orders *self)
|
|
|
|
int rv;
|
|
|
|
int rv;
|
|
|
|
|
|
|
|
|
|
|
|
rv = 0;
|
|
|
|
rv = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (self->order_level > 0)
|
|
|
|
if (self->order_level > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
self->order_level--;
|
|
|
|
self->order_level--;
|
|
|
|
|
|
|
|
|
|
|
|
if ((self->order_level == 0) && (self->order_count > 0))
|
|
|
|
if ((self->order_level == 0) && (self->order_count > 0))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
s_mark_end(self->out_s);
|
|
|
|
s_mark_end(self->out_s);
|
|
|
@ -139,7 +144,16 @@ xrdp_orders_send(struct xrdp_orders *self)
|
|
|
|
self->order_count_ptr[0] = self->order_count;
|
|
|
|
self->order_count_ptr[0] = self->order_count;
|
|
|
|
self->order_count_ptr[1] = self->order_count >> 8;
|
|
|
|
self->order_count_ptr[1] = self->order_count >> 8;
|
|
|
|
self->order_count = 0;
|
|
|
|
self->order_count = 0;
|
|
|
|
|
|
|
|
if (self->rdp_layer->client_info.use_fast_path & 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (xrdp_rdp_send_fastpath(self->rdp_layer,
|
|
|
|
|
|
|
|
self->out_s, 0) != 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
rv = 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
if (xrdp_rdp_send_data(self->rdp_layer, self->out_s,
|
|
|
|
if (xrdp_rdp_send_data(self->rdp_layer, self->out_s,
|
|
|
|
RDP_DATA_PDU_UPDATE) != 0)
|
|
|
|
RDP_DATA_PDU_UPDATE) != 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -147,7 +161,7 @@ xrdp_orders_send(struct xrdp_orders *self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return rv;
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -160,21 +174,29 @@ xrdp_orders_force_send(struct xrdp_orders *self)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((self->order_level > 0) && (self->order_count > 0))
|
|
|
|
if ((self->order_level > 0) && (self->order_count > 0))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
s_mark_end(self->out_s);
|
|
|
|
s_mark_end(self->out_s);
|
|
|
|
DEBUG(("xrdp_orders_force_send sending %d orders", self->order_count));
|
|
|
|
DEBUG(("xrdp_orders_force_send sending %d orders", self->order_count));
|
|
|
|
self->order_count_ptr[0] = self->order_count;
|
|
|
|
self->order_count_ptr[0] = self->order_count;
|
|
|
|
self->order_count_ptr[1] = self->order_count >> 8;
|
|
|
|
self->order_count_ptr[1] = self->order_count >> 8;
|
|
|
|
|
|
|
|
if (self->rdp_layer->client_info.use_fast_path & 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (xrdp_rdp_send_fastpath(self->rdp_layer,
|
|
|
|
|
|
|
|
self->out_s, 0) != 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
if (xrdp_rdp_send_data(self->rdp_layer, self->out_s,
|
|
|
|
if (xrdp_rdp_send_data(self->rdp_layer, self->out_s,
|
|
|
|
RDP_DATA_PDU_UPDATE) != 0)
|
|
|
|
RDP_DATA_PDU_UPDATE) != 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
self->order_count = 0;
|
|
|
|
self->order_count = 0;
|
|
|
|
self->order_level = 0;
|
|
|
|
self->order_level = 0;
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|