add libvncserver
[presencevnc] / libvnc / client_examples / backchannel.c
1 /* A simple example of an RFB client */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <time.h>
6 #include <errno.h>
7 #include <rfb/rfbclient.h>
8
9 static void HandleRect(rfbClient* client, int x, int y, int w, int h) {
10 }
11
12 /*
13  * The client part of the back channel extension example.
14  *
15  */
16
17 #define rfbBackChannel 155
18
19 typedef struct backChannelMsg {
20         uint8_t type;
21         uint8_t pad1;
22         uint16_t pad2;
23         uint32_t size;
24 } backChannelMsg;
25
26 static void sendMessage(rfbClient* client, char* text)
27 {
28         backChannelMsg msg;
29         uint32_t length = strlen(text)+1;
30
31         msg.type = rfbBackChannel;
32         msg.size = rfbClientSwap32IfLE(length);
33         if(!WriteToRFBServer(client, (char*)&msg, sizeof(msg)) ||
34                         !WriteToRFBServer(client, text, length)) {
35                 rfbClientLog("enableBackChannel: write error (%d: %s)", errno, strerror(errno));
36         }
37 }
38
39 static rfbBool handleBackChannelMessage(rfbClient* client,
40         rfbServerToClientMsg* message)
41 {
42         backChannelMsg msg;
43         char* text;
44
45         if(message->type != rfbBackChannel)
46                 return FALSE;
47
48         rfbClientSetClientData(client, sendMessage, sendMessage);
49
50         if(!ReadFromRFBServer(client, ((char*)&msg)+1, sizeof(msg)-1))
51                 return TRUE;
52         msg.size = rfbClientSwap32IfLE(msg.size);
53         text = malloc(msg.size);
54         if(!ReadFromRFBServer(client, text, msg.size)) {
55                 free(text);
56                 return TRUE;
57         }
58
59         rfbClientLog("got back channel message: %s\n", text);
60         free(text);
61
62         return TRUE;
63 }
64
65 static int backChannelEncodings[] = { rfbBackChannel, 0 };
66
67 static rfbClientProtocolExtension backChannel = {
68         backChannelEncodings,           /* encodings */
69         NULL,                           /* handleEncoding */
70         handleBackChannelMessage,       /* handleMessage */
71         NULL                            /* next extension */
72 };
73
74 int
75 main(int argc, char **argv)
76 {
77         rfbClient* client = rfbGetClient(8,3,4);
78
79         client->GotFrameBufferUpdate = HandleRect;
80         rfbClientRegisterExtension(&backChannel);
81
82         if (!rfbInitClient(client,&argc,argv))
83                 return 1;
84
85         while (1) {
86                 /* After each idle second, send a message */
87                 if(WaitForMessage(client,1000000)>0)
88                         HandleRFBServerMessage(client);
89                 else if(rfbClientGetClientData(client, sendMessage))
90                         sendMessage(client, "Dear Server,\n"
91                                         "thank you for understanding "
92                                         "back channel messages!");
93         }
94
95         rfbClientCleanup(client);
96
97         return 0;
98 }
99