diff options
| author | Jay Sorg <jay.sorg@gmail.com> | 2014-03-07 12:45:33 -0800 | 
|---|---|---|
| committer | Jay Sorg <jay.sorg@gmail.com> | 2014-03-07 12:45:33 -0800 | 
| commit | ff8821c308be44e20a340a02d84de3359fcdc700 (patch) | |
| tree | eef30e12152cad8463eec919002672f59fc0e7e5 /libxrdp/xrdp_orders.c | |
| parent | cf39a90d8052856518c87bff5e9f66e4855ab004 (diff) | |
| download | xrdp-proprietary-ff8821c308be44e20a340a02d84de3359fcdc700.tar.gz xrdp-proprietary-ff8821c308be44e20a340a02d84de3359fcdc700.zip | |
libxrdp: fastpath output, orders working
Diffstat (limited to 'libxrdp/xrdp_orders.c')
| -rw-r--r-- | libxrdp/xrdp_orders.c | 124 | 
1 files changed, 73 insertions, 51 deletions
| diff --git a/libxrdp/xrdp_orders.c b/libxrdp/xrdp_orders.c index 317e1135..819c3d06 100644 --- a/libxrdp/xrdp_orders.c +++ b/libxrdp/xrdp_orders.c @@ -64,7 +64,6 @@ xrdp_orders_delete(struct xrdp_orders *self)      {          return;      } -      xrdp_jpeg_deinit(self->jpeg_han);      free_stream(self->out_s);      g_free(self->orders_state.text_data); @@ -81,7 +80,6 @@ xrdp_orders_reset(struct xrdp_orders *self)      {          return 1;      } -      g_free(self->orders_state.text_data);      g_memset(&(self->orders_state), 0, sizeof(self->orders_state));      self->order_count_ptr = 0; @@ -98,24 +96,33 @@ int APP_CC  xrdp_orders_init(struct xrdp_orders *self)  {      self->order_level++; -      if (self->order_level == 1)      {          self->order_count = 0; - -        /* is this big enough */ -        if (xrdp_rdp_init_data(self->rdp_layer, self->out_s) != 0) +        if (self->rdp_layer->client_info.use_fast_path & 1)          { -            return 1; +            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) +            { +                return 1; +            } +            out_uint16_le(self->out_s, RDP_UPDATE_ORDERS); +            out_uint8s(self->out_s, 2); /* pad */ +            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); /* pad */          } - -        out_uint16_le(self->out_s, RDP_UPDATE_ORDERS); -        out_uint8s(self->out_s, 2); /* pad */ -        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); /* pad */      } -      return 0;  } @@ -127,11 +134,9 @@ xrdp_orders_send(struct xrdp_orders *self)      int rv;      rv = 0; -      if (self->order_level > 0)      {          self->order_level--; -          if ((self->order_level == 0) && (self->order_count > 0))          {              s_mark_end(self->out_s); @@ -139,15 +144,24 @@ xrdp_orders_send(struct xrdp_orders *self)              self->order_count_ptr[0] = self->order_count;              self->order_count_ptr[1] = self->order_count >> 8;              self->order_count = 0; - -            if (xrdp_rdp_send_data(self->rdp_layer, self->out_s, -                                   RDP_DATA_PDU_UPDATE) != 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              { -                rv = 1; +                if (xrdp_rdp_send_data(self->rdp_layer, self->out_s, +                                       RDP_DATA_PDU_UPDATE) != 0) +                { +                    rv = 1; +                }              }          }      } -      return rv;  } @@ -160,21 +174,29 @@ xrdp_orders_force_send(struct xrdp_orders *self)      {          return 1;      } -      if ((self->order_level > 0) && (self->order_count > 0))      {          s_mark_end(self->out_s);          DEBUG(("xrdp_orders_force_send sending %d orders", self->order_count));          self->order_count_ptr[0] = self->order_count;          self->order_count_ptr[1] = self->order_count >> 8; - -        if (xrdp_rdp_send_data(self->rdp_layer, self->out_s, -                               RDP_DATA_PDU_UPDATE) != 0) +        if (self->rdp_layer->client_info.use_fast_path & 1)          { -            return 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, +                                   RDP_DATA_PDU_UPDATE) != 0) +            { +                return 1; +            }          }      } -      self->order_count = 0;      self->order_level = 0;      return 0; @@ -1632,7 +1654,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,      int present;      char* present_ptr;      char* order_flags_ptr; -     +      if (xrdp_orders_check(self, 80) != 0)      {          return 1; @@ -1653,9 +1675,9 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,              order_flags |= RDP_ORDER_BOUNDS;              if (xrdp_orders_last_bounds(self, rect))              { -                 +                  order_flags |= RDP_ORDER_LASTBOUNDS; -                 +              }          }      } @@ -1699,21 +1721,21 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,      {          xrdp_orders_out_bounds(self, rect);      } -     +      if (srcidx != self->orders_state.com_blt_srcidx)      {          present |= 0x000001;          out_uint16_le(self->out_s, srcidx);          self->orders_state.com_blt_srcidx = srcidx;      } -     +      if (srcformat != self->orders_state.com_blt_srcformat)      {          present |= 0x000002;          out_uint32_le(self->out_s, srcformat);          self->orders_state.com_blt_srcformat = srcformat;      } -     +      if (srcwidth != self->orders_state.com_blt_srcwidth)      {          present |= 0x000004; @@ -1727,14 +1749,14 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_srcwidth = srcwidth;      } -     +      if (srcrepeat != self->orders_state.com_blt_srcrepeat)      {          present |= 0x000008;          out_uint8(self->out_s, srcrepeat);          self->orders_state.com_blt_srcrepeat = srcrepeat;      } -     +      if (srctransform != 0)      {          if (srctransform[0] != self->orders_state.com_blt_srctransform[0]) @@ -1768,21 +1790,21 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,              self->orders_state.com_blt_srctransform[0] = 0;          }      } -     +      if (mskflags != self->orders_state.com_blt_mskflags)      {          present |= 0x000040;          out_uint8(self->out_s, mskflags);          self->orders_state.com_blt_mskflags = mskflags;      } -     +      if (mskidx != self->orders_state.com_blt_mskidx)      {          present |= 0x000080;          out_uint16_le(self->out_s, mskidx);          self->orders_state.com_blt_mskidx = mskidx;      } -     +      if (mskformat != self->orders_state.com_blt_mskformat)      {          present |= 0x000100; @@ -1803,21 +1825,21 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_mskwidth = mskwidth;      } -     +      if (mskrepeat != self->orders_state.com_blt_mskrepeat)      {          present |= 0x000400;          out_uint8(self->out_s, mskrepeat);          self->orders_state.com_blt_mskrepeat = mskrepeat;      } -     +      if (op != self->orders_state.com_blt_op)      {          present |= 0x000800;          out_uint8(self->out_s, op);          self->orders_state.com_blt_op = op;      } -     +      if (srcx != self->orders_state.com_blt_srcx)      {          present |= 0x001000; @@ -1831,7 +1853,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_srcx = srcx;      } -     +      if (srcy != self->orders_state.com_blt_srcy)      {          present |= 0x002000; @@ -1845,7 +1867,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_srcy = srcy;      } -     +      if (mskx != self->orders_state.com_blt_mskx)      {          present |= 0x004000; @@ -1859,7 +1881,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_mskx = mskx;      } -     +      if (msky != self->orders_state.com_blt_msky)      {          present |= 0x008000; @@ -1873,7 +1895,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_msky = msky;      } -     +      if (dstx != self->orders_state.com_blt_dstx)      {          present |= 0x010000; @@ -1887,7 +1909,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_dstx = dstx;      } -     +      if (dsty != self->orders_state.com_blt_dsty)      {          present |= 0x020000; @@ -1901,7 +1923,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_dsty = dsty;      } -     +      if (width != self->orders_state.com_blt_width)      {          present |= 0x040000; @@ -1915,7 +1937,7 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          }          self->orders_state.com_blt_width = width;      } -     +      if (height != self->orders_state.com_blt_height)      {          present |= 0x080000; @@ -1936,11 +1958,11 @@ xrdp_orders_composite_blt(struct xrdp_orders* self, int srcidx, int srcformat,          out_uint32_le(self->out_s, dstformat);          self->orders_state.com_blt_dstformat = dstformat;      } -     +      xrdp_order_pack_small_or_tiny(self, order_flags_ptr, order_flags, -                                   +                                    present_ptr, present, 3); -     +      return 0;  } | 
