int EXPORT_CC libxrdp_send_palette(struct xrdp_session *session, int *palette) { int i = 0; int color = 0; struct stream *s = (struct stream *)NULL; if (session->client_info->bpp > 8) { return 0; } DEBUG(("libxrdp_send_palette sending palette")); /* clear orders */ libxrdp_orders_force_send(session); make_stream(s); init_stream(s, 8192); xrdp_rdp_init_data((struct xrdp_rdp *)session->rdp, s); out_uint16_le(s, RDP_UPDATE_PALETTE); out_uint16_le(s, 0); out_uint16_le(s, 256); /* # of colors */ out_uint16_le(s, 0); for (i = 0; i < 256; i++) { color = palette[i]; out_uint8(s, color >> 16); out_uint8(s, color >> 8); out_uint8(s, color); } s_mark_end(s); xrdp_rdp_send_data((struct xrdp_rdp *)session->rdp, s, RDP_DATA_PDU_UPDATE); free_stream(s); /* send the orders palette too */ libxrdp_orders_init(session); libxrdp_orders_send_palette(session, palette, 0); libxrdp_orders_send(session); return 0; }
int EXPORT_CC libxrdp_send_palette(struct xrdp_session *session, int *palette) { int i = 0; int color = 0; struct stream *s = (struct stream *)NULL; if (session->client_info->bpp > 8) { return 0; } DEBUG(("libxrdp_send_palette sending palette")); /* clear orders */ libxrdp_orders_force_send(session); make_stream(s); init_stream(s, 8192); if (session->client_info->use_fast_path & 1) /* fastpath output supported */ { LLOGLN(10, ("libxrdp_send_palette: fastpath")); if (xrdp_rdp_init_fastpath((struct xrdp_rdp *)session->rdp, s) != 0) { free_stream(s); return 1; } } else { LLOGLN(10, ("libxrdp_send_palette: slowpath")); xrdp_rdp_init_data((struct xrdp_rdp *)session->rdp, s); } /* TS_UPDATE_PALETTE_DATA */ out_uint16_le(s, RDP_UPDATE_PALETTE); out_uint16_le(s, 0); out_uint16_le(s, 256); /* # of colors */ out_uint16_le(s, 0); for (i = 0; i < 256; i++) { color = palette[i]; out_uint8(s, color >> 16); out_uint8(s, color >> 8); out_uint8(s, color); } s_mark_end(s); if (session->client_info->use_fast_path & 1) /* fastpath output supported */ { if (xrdp_rdp_send_fastpath((struct xrdp_rdp *)session->rdp, s, FASTPATH_UPDATETYPE_PALETTE) != 0) { free_stream(s); return 1; } } else { xrdp_rdp_send_data((struct xrdp_rdp *)session->rdp, s, RDP_DATA_PDU_UPDATE); } free_stream(s); /* send the orders palette too */ libxrdp_orders_init(session); libxrdp_orders_send_palette(session, palette, 0); libxrdp_orders_send(session); return 0; }