diff --git a/protocols/rdp/Makefile.am b/protocols/rdp/Makefile.am index 71583cc2..a9d9fa4b 100644 --- a/protocols/rdp/Makefile.am +++ b/protocols/rdp/Makefile.am @@ -41,7 +41,7 @@ AM_CFLAGS = -Werror -Wall -pedantic -Iinclude lib_LTLIBRARIES = libguac-client-rdp.la -libguac_client_rdp_la_SOURCES = src/client.c src/rdp_handlers.c src/rdp_keymap.c src/rdp_bitmap.c +libguac_client_rdp_la_SOURCES = src/client.c rc/rdp_keymap.c src/rdp_bitmap.c libguac_client_rdp_la_LDFLAGS = -version-info 0:0:0 diff --git a/protocols/rdp/include/rdp_handlers.h b/protocols/rdp/include/rdp_handlers.h deleted file mode 100644 index 67cb27ef..00000000 --- a/protocols/rdp/include/rdp_handlers.h +++ /dev/null @@ -1,82 +0,0 @@ - -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is libguac-client-rdp. - * - * The Initial Developer of the Original Code is - * Michael Jumper. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef _GUAC_RDP_RDP_HANDLERS_H -#define _GUAC_RDP_RDP_HANDLERS_H - -#include -#include - -int guac_rdp_ui_select(freerdp* inst, int rdp_socket); - -void guac_rdp_ui_resize_window(freerdp* inst); - -void guac_rdp_ui_move_pointer(freerdp* inst, int x, int y); - -void guac_rdp_ui_set_clip(freerdp* inst, int x, int y, int cx, int cy); -void guac_rdp_ui_reset_clip(freerdp* inst); - -void guac_rdp_ui_rect(freerdp* inst, int x, int y, int cx, int cy, uint32 colour); - -rdpBitmap* guac_rdp_ui_create_bitmap(freerdp* inst, int width, int height, uint8* data); -void guac_rdp_ui_paint_bitmap(freerdp* inst, int x, int y, int cx, int cy, int width, int height, uint8* data); -void guac_rdp_ui_destroy_bitmap(freerdp* inst, rdpBitmap* bmp); - -void guac_rdp_ui_destblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy); -void guac_rdp_ui_patblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy, rdpBrush* brush, uint32 bgcolor, uint32 fgcolor); -void guac_rdp_ui_screenblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy, int srcx, int srcy); -void guac_rdp_ui_memblt(freerdp* inst, uint8 opcode, int x, int y, int width, int height, rdpBitmap* src, int srcx, int srcy); -void guac_rdp_ui_triblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy, rdpBitmap* src, int srcx, int srcy, rdpBrush* brush, uint32 bgcolor, uint32 fgcolor); - -void guac_rdp_ui_start_draw_glyphs(freerdp* inst, uint32 bgcolor, uint32 fgcolor); -void guac_rdp_ui_draw_glyph(freerdp* inst, int x, int y, int cx, int cy, rdpGlyph* glyph); -void guac_rdp_ui_end_draw_glyphs(freerdp* inst, int x, int y, int cx, int cy); -rdpGlyph* guac_rdp_ui_create_glyph(freerdp* inst, int width, int height, uint8* data); -void guac_rdp_ui_destroy_glyph(freerdp* inst, rdpGlyph* glyph); - -void guac_rdp_ui_set_pointer(freerdp* inst, rdpPointer pointer); -void guac_rdp_ui_destroy_pointer(freerdp* inst, rdpPointer pointer); -rdpPointer guac_rdp_ui_create_pointer(freerdp* inst, unsigned int x, unsigned int y, int width, int height, uint8* andmask, uint8* xormask, int bpp); -void guac_rdp_ui_set_null_pointer(freerdp* inst); -void guac_rdp_ui_set_default_pointer(freerdp* inst); - -rdpBitmap* guac_rdp_ui_create_surface(freerdp* inst, int width, int height, rdpBitmap* old); -void guac_rdp_ui_set_surface(freerdp* inst, rdpBitmap* surface); -void guac_rdp_ui_destroy_surface(freerdp* inst, rdpBitmap* surface); - -#endif - diff --git a/protocols/rdp/src/rdp_handlers.c b/protocols/rdp/src/rdp_handlers.c deleted file mode 100644 index 2a118e7f..00000000 --- a/protocols/rdp/src/rdp_handlers.c +++ /dev/null @@ -1,518 +0,0 @@ - -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is libguac-client-rdp. - * - * The Initial Developer of the Original Code is - * Michael Jumper. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include -#include - -#include - -#include -#include -#include - -#include -#include - -#include "client.h" -#include "rdp_handlers.h" - - -static CLRCONV _guac_rdp_clrconv = { - .alpha = 1, - .invert = 0, - .rgb555 = 0, - .palette = NULL -}; - - -void guac_rdp_convert_color(int depth, int color, guac_rdp_color* comp) { - - switch (depth) { - - case 24: - comp->red = (color >> 16) & 0xFF; - comp->green = (color >> 8) & 0xFF; - comp->blue = (color ) & 0xFF; - break; - - case 16: - comp->red = ((color >> 8) & 0xF8) | ((color >> 13) & 0x07); - comp->green = ((color >> 3) & 0xFC) | ((color >> 9) & 0x03); - comp->blue = ((color << 3) & 0xF8) | ((color >> 2) & 0x07); - break; - - default: /* The Magenta of Failure */ - comp->red = 0xFF; - comp->green = 0x00; - comp->blue = 0xFF; - } - -} - -void guac_rdp_ui_error(freerdp* inst, const char* text) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_socket* socket = client->socket; - - guac_protocol_send_error(socket, text); - guac_socket_flush(socket); - -} - -void guac_rdp_ui_warning(freerdp* inst, const char* text) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_warning: %s\n", text); -} - -void guac_rdp_ui_unimpl(freerdp* inst, const char* text) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_unimpl: %s\n", text); -} - -void guac_rdp_ui_begin_update(freerdp* inst) { - /* UNUSED */ -} - -void guac_rdp_ui_end_update(freerdp* inst) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_socket* socket = client->socket; - guac_socket_flush(socket); -} - -void guac_rdp_ui_paint_bitmap(freerdp* inst, int x, int y, int cx, int cy, int width, int height, uint8* data) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - const guac_layer* current_surface = guac_client_data->current_surface; - guac_socket* socket = client->socket; - - int dx, dy; - int stride; - int bpp = (inst->settings->server_depth + 7) / 8; - unsigned char* image_buffer; - unsigned char* image_buffer_row; - - int data_stride = width * bpp; - unsigned char* data_row = data; - - cairo_surface_t* surface; - - /* Init Cairo buffer */ - stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, cx); - image_buffer = malloc(height*stride); - image_buffer_row = image_buffer; - - /* Copy image data from image data to buffer */ - for (dy = 0; dy> 8) & 0xF8) | ((v >> 13) & 0x07); - green = ((v >> 3) & 0xFC) | ((v >> 9) & 0x03); - blue = ((v << 3) & 0xF8) | ((v >> 2) & 0x07); - break; - - default: /* The Magenta of Failure */ - red = 0xFF; - green = 0x00; - blue = 0xFF; - } - - /* Output RGB */ - *(image_buffer_current++) = (red << 16) | (green << 8) | blue; - - } - } - - surface = cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, cx, cy, stride); - guac_protocol_send_png(socket, GUAC_COMP_OVER, current_surface, x, y, surface); - guac_socket_flush(socket); - - /* Free surface */ - cairo_surface_destroy(surface); - free(image_buffer); - -} - -void guac_rdp_ui_destroy_bitmap(freerdp* inst, rdpBitmap* bmp) { - - /* Free buffer */ - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_free_buffer(client, (guac_layer*) bmp); - -} - -void guac_rdp_ui_rect(freerdp* inst, int x, int y, int cx, int cy, uint32 color) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - const guac_layer* current_surface = guac_client_data->current_surface; - guac_socket* socket = client->socket; - - unsigned char red, green, blue; - - switch (inst->settings->server_depth) { - case 24: - red = (color >> 16) & 0xFF; - green = (color >> 8) & 0xFF; - blue = (color ) & 0xFF; - break; - - case 16: - red = ((color >> 8) & 0xF8) | ((color >> 13) & 0x07); - green = ((color >> 3) & 0xFC) | ((color >> 9) & 0x03); - blue = ((color << 3) & 0xF8) | ((color >> 2) & 0x07); - break; - - default: /* The Magenta of Failure */ - red = 0xFF; - green = 0x00; - blue = 0xFF; - } - - /* Send rectangle */ - guac_protocol_send_rect(socket, GUAC_COMP_OVER, current_surface, - x, y, cx, cy, - red, green, blue, 0xFF); - -} - -void guac_rdp_ui_start_draw_glyphs(freerdp* inst, uint32 bgcolor, uint32 fgcolor) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - - guac_rdp_convert_color( - inst->settings->server_depth, - bgcolor, - &(guac_client_data->background)); - - guac_rdp_convert_color( - inst->settings->server_depth, - fgcolor, - &(guac_client_data->foreground)); - -} - -void guac_rdp_ui_draw_glyph(freerdp* inst, int x, int y, int width, int height, rdpGlyph* glyph) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - const guac_layer* current_surface = guac_client_data->current_surface; - guac_socket* socket = client->socket; - - /* NOTE: Originally: Stencil=SRC, FG=ATOP, BG=RATOP */ - /* Temporarily removed BG drawing... */ - - /* Foreground */ - guac_protocol_send_rect(socket, GUAC_COMP_ATOP, (guac_layer*) glyph, - 0, 0, width, height, - guac_client_data->foreground.red, - guac_client_data->foreground.green, - guac_client_data->foreground.blue, - 255); - - /* Background */ - /*guac_protocol_send_rect(socket, GUAC_COMP_OVER, current_surface, - x, y, width, height, - guac_client_data->background.red, - guac_client_data->background.green, - guac_client_data->background.blue, - 255);*/ - - /* Draw */ - guac_protocol_send_copy(socket, - (guac_layer*) glyph, 0, 0, width, height, - GUAC_COMP_OVER, current_surface, x, y); - -} - -void guac_rdp_ui_end_draw_glyphs(freerdp* inst, int x, int y, int cx, int cy) { - /* UNUSED */ -} - -void guac_rdp_ui_destblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_destblt: STUB\n"); -} - -void guac_rdp_ui_patblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy, rdpBrush* brush, uint32 bgcolor, uint32 fgcolor) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_patblt: STUB\n"); -} - -void guac_rdp_ui_screenblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy, int srcx, int srcy) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - const guac_layer* current_surface = guac_client_data->current_surface; - guac_socket* socket = client->socket; - - guac_protocol_send_copy(socket, - GUAC_DEFAULT_LAYER, srcx, srcy, cx, cy, - GUAC_COMP_OVER, current_surface, x, y); - -} - -void guac_rdp_ui_memblt(freerdp* inst, uint8 opcode, int x, int y, int width, int height, rdpBitmap* src, int srcx, int srcy) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - const guac_layer* current_surface = guac_client_data->current_surface; - guac_socket* socket = client->socket; - - if (opcode != 204) - guac_client_log_info(client, - "guac_rdp_ui_memblt: opcode=%i, index=%i\n", opcode, - ((guac_layer*) src)->index); - - guac_protocol_send_copy(socket, - (guac_layer*) src, srcx, srcy, width, height, - GUAC_COMP_OVER, current_surface, x, y); - -} - -void guac_rdp_ui_triblt(freerdp* inst, uint8 opcode, int x, int y, int cx, int cy, rdpBitmap* src, int srcx, int srcy, rdpBrush* brush, uint32 bgcolor, uint32 fgcolor) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_triblt: STUB\n"); -} - -rdpGlyph* guac_rdp_ui_create_glyph(freerdp* inst, int width, int height, uint8* data) { - - /* Allocate buffer */ - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_socket* socket = client->socket; - guac_layer* glyph = guac_client_alloc_buffer(client); - - int x, y, i; - int stride; - unsigned char* image_buffer; - unsigned char* image_buffer_row; - - cairo_surface_t* surface; - - /* Init Cairo buffer */ - stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); - image_buffer = malloc(height*stride); - image_buffer_row = image_buffer; - - /* Copy image data from image data to buffer */ - for (y = 0; ycontext)->client; - guac_client_free_buffer(client, (guac_layer*) glyph); - -} - -int guac_rdp_ui_select(freerdp* inst, int rdp_socket) { - return 1; -} - -void guac_rdp_ui_set_clip(freerdp* inst, int x, int y, int cx, int cy) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - const guac_layer* current_surface = guac_client_data->current_surface; - guac_socket* socket = client->socket; - - guac_protocol_send_clip(socket, current_surface, x, y, cx, cy); - -} - -void guac_rdp_ui_reset_clip(freerdp* inst) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - const guac_layer* current_surface = guac_client_data->current_surface; - guac_socket* socket = client->socket; - - guac_protocol_send_clip(socket, current_surface, 0, 0, inst->settings->width, inst->settings->height); - -} - -void guac_rdp_ui_resize_window(freerdp* inst) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_resize_window: %ix%i\n", inst->settings->width, inst->settings->height); -} - -void guac_rdp_ui_set_cursor(freerdp* inst, rdpPointer* cursor) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_set_cursor: STUB\n"); -} - -void guac_rdp_ui_destroy_cursor(freerdp* inst, rdpPointer* cursor) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_destroy_cursor: STUB\n"); -} - -rdpPointer* guac_rdp_ui_create_cursor(freerdp* inst, unsigned int x, unsigned int y, int width, int height, uint8* andmask, uint8* xormask, int bpp) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_create_cursor: STUB\n"); - return (rdpPointer*) guac_client_alloc_buffer(client); - -} - -void guac_rdp_ui_set_null_cursor(freerdp* inst) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_set_null_cursor: STUB\n"); -} - -void guac_rdp_ui_set_default_cursor(freerdp* inst) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_set_default_cursor: STUB\n"); -} - -void guac_rdp_ui_move_pointer(freerdp* inst, int x, int y) { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_log_info(client, "guac_rdp_ui_move_pointer: STUB\n"); -} - -rdpBitmap* guac_rdp_ui_create_surface(freerdp* inst, int width, int height, rdpBitmap* old) { - - /* If old provided, just return that one ... */ - if (old != NULL) - return old; - - /* Otherwise allocate and return new buffer */ - else { - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - return (rdpBitmap*) guac_client_alloc_buffer(client); - } - -} - -void guac_rdp_ui_set_surface(freerdp* inst, rdpBitmap* surface) { - - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; - guac_socket* socket = client->socket; - - guac_client_log_info(client, "guac_rdp_ui_set_surface: %p (index=%i)\n", surface, surface != NULL ? ((guac_layer*) surface)->index : 0); - - /* Init desktop */ - if (surface == NULL) { - - guac_protocol_send_name(socket, inst->settings->server); - guac_protocol_send_size(socket, inst->settings->width, inst->settings->height); - guac_socket_flush(socket); - - guac_client_data->current_surface = GUAC_DEFAULT_LAYER; - } - else { - guac_client_data->current_surface = (guac_layer*) surface; - } - -} - -void guac_rdp_ui_destroy_surface(freerdp* inst, rdpBitmap* surface) { - - /* Free buffer */ - guac_client* client = ((rdp_freerdp_context*) inst->context)->client; - guac_client_free_buffer(client, (guac_layer*) surface); - -} -