blob: 79cd0337154fab2b21a141f5e1613a951ad7d955 [file] [log] [blame]
/*
* Copyright (c) 2001, Adam Dunkels.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This file is part of the uIP TCP/IP stack.
*
* $Id: vnc-server.h,v 1.4 2004/09/12 20:24:55 adamdunkels Exp $
*
*/
#ifndef __VNC_SERVER_H__
#define __VNC_SERVER_H__
/*struct vnc_server_updatearea {
u8_t active;
u8_t x, y;
u8_t w, h;
};*/
struct vnc_server_update {
struct vnc_server_update *next;
#define VNC_SERVER_UPDATE_NONE 0
#define VNC_SERVER_UPDATE_PARTS 1
#define VNC_SERVER_UPDATE_FULL 2
u8_t type;
u8_t x, y;
u8_t w, h;
};
struct vnc_server_state {
u16_t counter;
u8_t type;
u8_t state;
u16_t height, width;
u8_t update_requested;
/* Variables used when sending screen updates. */
u8_t x, y, x1, y1, x2, y2;
u8_t w, h;
u16_t readlen;
u8_t sendmsg;
u8_t button;
struct vnc_server_update *updates_current;
struct vnc_server_update *updates_pending;
struct vnc_server_update *updates_free;
#define VNC_SERVER_MAX_UPDATES 8
struct vnc_server_update updates_pool[VNC_SERVER_MAX_UPDATES];
};
struct vnc_server_update *
vnc_server_update_alloc(struct vnc_server_state *vs);
void vnc_server_update_free(struct vnc_server_state *vs,
struct vnc_server_update *a);
void vnc_server_update_remove(struct vnc_server_state *vs,
struct vnc_server_update *a);
void vnc_server_update_add(struct vnc_server_state *vs,
struct vnc_server_update *a);
struct vnc_server_update *
vnc_server_update_dequeue(struct vnc_server_state *vs);
void vnc_server_init(void);
void vnc_server_appcall(struct vnc_server_state *state);
extern struct vnc_server_state *vs;
enum {
VNC_DEALLOCATED,
VNC_VERSION,
VNC_VERSION2,
VNC_AUTH,
VNC_AUTH2,
VNC_INIT,
VNC_INIT2,
VNC_RUNNING
};
/* Sendmsg */
enum {
SEND_NONE,
SEND_BLANK,
SENT_BLANK,
SEND_SCREEN,
SEND_UPDATE
};
/* Definitions of the RFB (Remote Frame Buffer) protocol
structures and constants. */
#include "uipopt.h"
void vnc_server_send_data(struct vnc_server_state *vs);
u8_t vnc_server_draw_rect(u8_t *ptr, u16_t x, u16_t y, u16_t w, u16_t h, u8_t c);
/* Generic rectangle - x, y coordinates, width and height. */
struct rfb_rect {
u16_t x;
u16_t y;
u16_t w;
u16_t h;
};
/* Pixel format definition. */
struct rfb_pixel_format {
u8_t bps; /* Bits per pixel: 8, 16 or 32. */
u8_t depth; /* Color depth: 8-32 */
u8_t endian; /* 1 - big endian (motorola), 0 - little endian
(x86) */
u8_t truecolor; /* 1 - true color is used, 0 - true color is not used. */
/* The following fields are only used if true color is used. */
u16_t red_max, green_max, blue_max;
u8_t red_shift, green_shift, blue_shift;
u8_t pad1;
u16_t pad2;
};
/* RFB authentication constants. */
#define RFB_AUTH_FAILED 0
#define RFB_AUTH_NONE 1
#define RFB_AUTH_VNC 2
#define RFB_VNC_AUTH_OK 0
#define RFB_VNC_AUTH_FAILED 1
#define RFB_VNC_AUTH_TOOMANY 2
/* RFB message types. */
/* From server to client: */
#define RFB_FB_UPDATE 0
#define RFB_SET_COLORMAP_ENTRIES 1
#define RFB_BELL 2
#define RFB_SERVER_CUT_TEXT 3
/* From client to server. */
#define RFB_SET_PIXEL_FORMAT 0
#define RFB_FIX_COLORMAP_ENTRIES 1
#define RFB_SET_ENCODINGS 2
#define RFB_FB_UPDATE_REQ 3
#define RFB_KEY_EVENT 4
#define RFB_POINTER_EVENT 5
#define RFB_CLIENT_CUT_TEXT 6
/* Encoding types. */
#define RFB_ENC_RAW 0
#define RFB_ENC_COPYRECT 1
#define RFB_ENC_RRE 2
#define RFB_ENC_CORRE 3
#define RFB_ENC_HEXTILE 4
/* Message definitions. */
/* Server to client messages. */
struct rfb_server_init {
u16_t width;
u16_t height;
struct rfb_pixel_format format;
u8_t namelength[4];
/* Followed by name. */
};
struct rfb_fb_update {
u8_t type;
u8_t pad;
u16_t rects; /* Number of rectanges (struct rfb_fb_update_rect_hdr +
data) that follows. */
};
struct rfb_fb_update_rect_hdr {
struct rfb_rect rect;
u8_t encoding[4];
};
struct rfb_copy_rect {
u16_t srcx;
u16_t srcy;
};
struct rfb_rre_hdr {
u16_t subrects[2]; /* Number of subrectangles (struct
rfb_rre_subrect) to follow. */
u8_t bgpixel;
};
struct rfb_rre_subrect {
u8_t pixel;
struct rfb_rect rect;
};
struct rfb_corre_rect {
u8_t x;
u8_t y;
u8_t w;
u8_t h;
};
/* Client to server messages. */
struct rfb_set_pixel_format {
u8_t type;
u8_t pad;
u16_t pad2;
struct rfb_pixel_format format;
};
struct rfb_fix_colormap_entries {
u8_t type;
u8_t pad;
u16_t firstcolor;
u16_t colors;
};
struct rfb_set_encoding {
u8_t type;
u8_t pad;
u16_t encodings;
};
struct rfb_fb_update_request {
u8_t type;
u8_t incremental;
u16_t x;
u16_t y;
u16_t w;
u16_t h;
};
struct rfb_key_event {
u8_t type;
u8_t down;
u16_t pad;
u8_t key[4];
};
#define RFB_BUTTON_MASK1 1
#define RFB_BUTTON_MASK2 2
#define RFB_BUTTON_MASK3 4
struct rfb_pointer_event {
u8_t type;
u8_t buttonmask;
u16_t x;
u16_t y;
};
struct rfb_client_cut_text {
u8_t type;
u8_t pad[3];
u8_t len[4];
};
#endif /* __VNC_SERVER_H__ */