~ubuntu-branches/ubuntu/raring/virtualbox-ose/raring

« back to all changes in this revision

Viewing changes to include/VBox/RemoteDesktop/VRDE.h

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2011-01-30 23:27:25 UTC
  • mfrom: (0.3.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20110130232725-2ouajjd2ggdet0zd
Tags: 4.0.2-dfsg-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add Apport hook.
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Drop *-source packages.
* Drop ubuntu-01-fix-build-gcc45.patch, fixed upstream.
* Drop ubuntu-02-as-needed.patch, added to the Debian package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/** @file
 
2
 * VBox Remote Desktop Extension (VRDE) - Public APIs.
 
3
 */
 
4
 
 
5
/*
 
6
 * Copyright (C) 2006-2010 Oracle Corporation
 
7
 *
 
8
 * This file is part of VirtualBox Open Source Edition (OSE), as
 
9
 * available from http://www.virtualbox.org. This file is free software;
 
10
 * you can redistribute it and/or modify it under the terms of the GNU
 
11
 * General Public License (GPL) as published by the Free Software
 
12
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 
13
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 
14
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 
15
 *
 
16
 * The contents of this file may alternatively be used under the terms
 
17
 * of the Common Development and Distribution License Version 1.0
 
18
 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
 
19
 * VirtualBox OSE distribution, in which case the provisions of the
 
20
 * CDDL are applicable instead of those of the GPL.
 
21
 *
 
22
 * You may elect to license modified versions of this file under the
 
23
 * terms and conditions of either the GPL or the CDDL or both.
 
24
 */
 
25
 
 
26
#ifndef ___VBox_RemoteDesktop_VRDE_h
 
27
#define ___VBox_RemoteDesktop_VRDE_h
 
28
 
 
29
#include <iprt/cdefs.h>
 
30
#include <iprt/types.h>
 
31
 
 
32
/** @defgroup grp_vrdp VRDE
 
33
 * VirtualBox Remote Desktop Extension (VRDE) interface that lets to use
 
34
 * a Remote Desktop server like RDP.
 
35
 * @{
 
36
 */
 
37
 
 
38
RT_C_DECLS_BEGIN
 
39
 
 
40
/* Forward declaration of the VRDE server instance handle. */
 
41
#ifdef __cplusplus
 
42
class VRDEServer;
 
43
typedef class VRDEServerType *HVRDESERVER;
 
44
#else
 
45
struct VRDEServer;
 
46
typedef struct VRDEServerType *HVRDESERVER;
 
47
#endif /* __cplusplus */
 
48
 
 
49
/* Callback based VRDE server interface declarations. */
 
50
 
 
51
/** The color mouse pointer information. */
 
52
typedef struct _VRDECOLORPOINTER
 
53
{
 
54
    uint16_t u16HotX;
 
55
    uint16_t u16HotY;
 
56
    uint16_t u16Width;
 
57
    uint16_t u16Height;
 
58
    uint16_t u16MaskLen;
 
59
    uint16_t u16DataLen;
 
60
    /* The 1BPP mask and the 24BPP bitmap follow. */
 
61
} VRDECOLORPOINTER;
 
62
 
 
63
/** Audio format information packed in a 32 bit value. */
 
64
typedef uint32_t VRDEAUDIOFORMAT;
 
65
 
 
66
/** Constructs 32 bit value for given frequency, number of channel and bits per sample. */
 
67
#define VRDE_AUDIO_FMT_MAKE(freq, c, bps, s) ((((s) & 0x1) << 28) + (((bps) & 0xFF) << 20) + (((c) & 0xF) << 16) + ((freq) & 0xFFFF))
 
68
 
 
69
/** Decode frequency. */
 
70
#define VRDE_AUDIO_FMT_SAMPLE_FREQ(a) ((a) & 0xFFFF)
 
71
/** Decode number of channels. */
 
72
#define VRDE_AUDIO_FMT_CHANNELS(a) (((a) >> 16) & 0xF)
 
73
/** Decode number signess. */
 
74
#define VRDE_AUDIO_FMT_SIGNED(a) (((a) >> 28) & 0x1)
 
75
/** Decode number of bits per sample. */
 
76
#define VRDE_AUDIO_FMT_BITS_PER_SAMPLE(a) (((a) >> 20) & 0xFF)
 
77
/** Decode number of bytes per sample. */
 
78
#define VRDE_AUDIO_FMT_BYTES_PER_SAMPLE(a) ((VRDE_AUDIO_FMT_BITS_PER_SAMPLE(a) + 7) / 8)
 
79
 
 
80
 
 
81
/*
 
82
 * Audio input.
 
83
 */
 
84
 
 
85
/* Audio input notifications. */
 
86
#define VRDE_AUDIOIN_BEGIN     1
 
87
#define VRDE_AUDIOIN_DATA      2
 
88
#define VRDE_AUDIOIN_END       3
 
89
 
 
90
typedef struct VRDEAUDIOINBEGIN
 
91
{
 
92
    VRDEAUDIOFORMAT fmt; /* Actual format of data, which will be sent in VRDE_AUDIOIN_DATA events. */
 
93
} VRDEAUDIOINBEGIN;
 
94
 
 
95
 
 
96
/*
 
97
 * Remote USB protocol.
 
98
 */
 
99
 
 
100
/* The initial version 1. */
 
101
#define VRDE_USB_VERSION_1 (1)
 
102
/* Version 2: look for VRDE_USB_VERSION_2 comments in the code. */
 
103
#define VRDE_USB_VERSION_2 (2)
 
104
/* Version 3: look for VRDE_USB_VERSION_3 comments in the code. */
 
105
#define VRDE_USB_VERSION_3 (3)
 
106
 
 
107
/* The default VRDE server version of Remote USB Protocol. */
 
108
#define VRDE_USB_VERSION VRDE_USB_VERSION_3
 
109
 
 
110
 
 
111
/** USB backend operations. */
 
112
#define VRDE_USB_REQ_OPEN              (0)
 
113
#define VRDE_USB_REQ_CLOSE             (1)
 
114
#define VRDE_USB_REQ_RESET             (2)
 
115
#define VRDE_USB_REQ_SET_CONFIG        (3)
 
116
#define VRDE_USB_REQ_CLAIM_INTERFACE   (4)
 
117
#define VRDE_USB_REQ_RELEASE_INTERFACE (5)
 
118
#define VRDE_USB_REQ_INTERFACE_SETTING (6)
 
119
#define VRDE_USB_REQ_QUEUE_URB         (7)
 
120
#define VRDE_USB_REQ_REAP_URB          (8)
 
121
#define VRDE_USB_REQ_CLEAR_HALTED_EP   (9)
 
122
#define VRDE_USB_REQ_CANCEL_URB        (10)
 
123
 
 
124
/** USB service operations. */
 
125
#define VRDE_USB_REQ_DEVICE_LIST       (11)
 
126
#define VRDE_USB_REQ_NEGOTIATE         (12)
 
127
 
 
128
/** An operation completion status is a byte. */
 
129
typedef uint8_t VRDEUSBSTATUS;
 
130
 
 
131
/** USB device identifier is an 32 bit value. */
 
132
typedef uint32_t VRDEUSBDEVID;
 
133
 
 
134
/** Status codes. */
 
135
#define VRDE_USB_STATUS_SUCCESS        ((VRDEUSBSTATUS)0)
 
136
#define VRDE_USB_STATUS_ACCESS_DENIED  ((VRDEUSBSTATUS)1)
 
137
#define VRDE_USB_STATUS_DEVICE_REMOVED ((VRDEUSBSTATUS)2)
 
138
 
 
139
/*
 
140
 * Data structures to use with VRDEUSBRequest.
 
141
 * The *RET* structures always represent the layout of VRDE data.
 
142
 * The *PARM* structures normally the same as VRDE layout.
 
143
 * However the VRDE_USB_REQ_QUEUE_URB_PARM has a pointer to
 
144
 * URB data in place where actual data will be in VRDE layout.
 
145
 *
 
146
 * Since replies (*RET*) are asynchronous, the 'success'
 
147
 * replies are not required for operations which return
 
148
 * only the status code (VRDEUSBREQRETHDR only):
 
149
 *  VRDE_USB_REQ_OPEN
 
150
 *  VRDE_USB_REQ_RESET
 
151
 *  VRDE_USB_REQ_SET_CONFIG
 
152
 *  VRDE_USB_REQ_CLAIM_INTERFACE
 
153
 *  VRDE_USB_REQ_RELEASE_INTERFACE
 
154
 *  VRDE_USB_REQ_INTERFACE_SETTING
 
155
 *  VRDE_USB_REQ_CLEAR_HALTED_EP
 
156
 *
 
157
 */
 
158
 
 
159
/* VRDE layout has no alignments. */
 
160
#pragma pack(1)
 
161
/* Common header for all VRDE USB packets. After the reply hdr follows *PARM* or *RET* data. */
 
162
typedef struct _VRDEUSBPKTHDR
 
163
{
 
164
    /* Total length of the reply NOT including the 'length' field. */
 
165
    uint32_t length;
 
166
    /* The operation code for which the reply was sent by the client. */
 
167
    uint8_t code;
 
168
} VRDEUSBPKTHDR;
 
169
 
 
170
/* Common header for all return structures. */
 
171
typedef struct _VRDEUSBREQRETHDR
 
172
{
 
173
    /* Device status. */
 
174
    VRDEUSBSTATUS status;
 
175
    /* Device id. */
 
176
    VRDEUSBDEVID id;
 
177
} VRDEUSBREQRETHDR;
 
178
 
 
179
 
 
180
/* VRDE_USB_REQ_OPEN
 
181
 */
 
182
typedef struct _VRDE_USB_REQ_OPEN_PARM
 
183
{
 
184
    uint8_t code;
 
185
    VRDEUSBDEVID id;
 
186
} VRDE_USB_REQ_OPEN_PARM;
 
187
 
 
188
typedef struct _VRDE_USB_REQ_OPEN_RET
 
189
{
 
190
    VRDEUSBREQRETHDR hdr;
 
191
} VRDE_USB_REQ_OPEN_RET;
 
192
 
 
193
 
 
194
/* VRDE_USB_REQ_CLOSE
 
195
 */
 
196
typedef struct _VRDE_USB_REQ_CLOSE_PARM
 
197
{
 
198
    uint8_t code;
 
199
    VRDEUSBDEVID id;
 
200
} VRDE_USB_REQ_CLOSE_PARM;
 
201
 
 
202
/* The close request has no returned data. */
 
203
 
 
204
 
 
205
/* VRDE_USB_REQ_RESET
 
206
 */
 
207
typedef struct _VRDE_USB_REQ_RESET_PARM
 
208
{
 
209
    uint8_t code;
 
210
    VRDEUSBDEVID id;
 
211
} VRDE_USB_REQ_RESET_PARM;
 
212
 
 
213
typedef struct _VRDE_USB_REQ_RESET_RET
 
214
{
 
215
    VRDEUSBREQRETHDR hdr;
 
216
} VRDE_USB_REQ_RESET_RET;
 
217
 
 
218
 
 
219
/* VRDE_USB_REQ_SET_CONFIG
 
220
 */
 
221
typedef struct _VRDE_USB_REQ_SET_CONFIG_PARM
 
222
{
 
223
    uint8_t code;
 
224
    VRDEUSBDEVID id;
 
225
    uint8_t configuration;
 
226
} VRDE_USB_REQ_SET_CONFIG_PARM;
 
227
 
 
228
typedef struct _VRDE_USB_REQ_SET_CONFIG_RET
 
229
{
 
230
    VRDEUSBREQRETHDR hdr;
 
231
} VRDE_USB_REQ_SET_CONFIG_RET;
 
232
 
 
233
 
 
234
/* VRDE_USB_REQ_CLAIM_INTERFACE
 
235
 */
 
236
typedef struct _VRDE_USB_REQ_CLAIM_INTERFACE_PARM
 
237
{
 
238
    uint8_t code;
 
239
    VRDEUSBDEVID id;
 
240
    uint8_t iface;
 
241
} VRDE_USB_REQ_CLAIM_INTERFACE_PARM;
 
242
 
 
243
typedef struct _VRDE_USB_REQ_CLAIM_INTERFACE_RET
 
244
{
 
245
    VRDEUSBREQRETHDR hdr;
 
246
} VRDE_USB_REQ_CLAIM_INTERFACE_RET;
 
247
 
 
248
 
 
249
/* VRDE_USB_REQ_RELEASE_INTERFACE
 
250
 */
 
251
typedef struct _VRDE_USB_REQ_RELEASE_INTERFACE_PARM
 
252
{
 
253
    uint8_t code;
 
254
    VRDEUSBDEVID id;
 
255
    uint8_t iface;
 
256
} VRDE_USB_REQ_RELEASE_INTERFACE_PARM;
 
257
 
 
258
typedef struct _VRDE_USB_REQ_RELEASE_INTERFACE_RET
 
259
{
 
260
    VRDEUSBREQRETHDR hdr;
 
261
} VRDE_USB_REQ_RELEASE_INTERFACE_RET;
 
262
 
 
263
 
 
264
/* VRDE_USB_REQ_INTERFACE_SETTING
 
265
 */
 
266
typedef struct _VRDE_USB_REQ_INTERFACE_SETTING_PARM
 
267
{
 
268
    uint8_t code;
 
269
    VRDEUSBDEVID id;
 
270
    uint8_t iface;
 
271
    uint8_t setting;
 
272
} VRDE_USB_REQ_INTERFACE_SETTING_PARM;
 
273
 
 
274
typedef struct _VRDE_USB_REQ_INTERFACE_SETTING_RET
 
275
{
 
276
    VRDEUSBREQRETHDR hdr;
 
277
} VRDE_USB_REQ_INTERFACE_SETTING_RET;
 
278
 
 
279
 
 
280
/* VRDE_USB_REQ_QUEUE_URB
 
281
 */
 
282
 
 
283
#define VRDE_USB_TRANSFER_TYPE_CTRL (0)
 
284
#define VRDE_USB_TRANSFER_TYPE_ISOC (1)
 
285
#define VRDE_USB_TRANSFER_TYPE_BULK (2)
 
286
#define VRDE_USB_TRANSFER_TYPE_INTR (3)
 
287
#define VRDE_USB_TRANSFER_TYPE_MSG  (4)
 
288
 
 
289
#define VRDE_USB_DIRECTION_SETUP (0)
 
290
#define VRDE_USB_DIRECTION_IN    (1)
 
291
#define VRDE_USB_DIRECTION_OUT   (2)
 
292
 
 
293
typedef struct _VRDE_USB_REQ_QUEUE_URB_PARM
 
294
{
 
295
    uint8_t code;
 
296
    VRDEUSBDEVID id;
 
297
    uint32_t handle;    /* Distinguishes that particular URB. Later used in CancelURB and returned by ReapURB */
 
298
    uint8_t type;
 
299
    uint8_t ep;
 
300
    uint8_t direction;
 
301
    uint32_t urblen;    /* Length of the URB. */
 
302
    uint32_t datalen;   /* Length of the data. */
 
303
    void *data;         /* In RDP layout the data follow. */
 
304
} VRDE_USB_REQ_QUEUE_URB_PARM;
 
305
 
 
306
/* The queue URB has no explicit return. The reap URB reply will be
 
307
 * eventually the indirect result.
 
308
 */
 
309
 
 
310
 
 
311
/* VRDE_USB_REQ_REAP_URB
 
312
 * Notificationg from server to client that server expects an URB
 
313
 * from any device.
 
314
 * Only sent if negotiated URB return method is polling.
 
315
 * Normally, the client will send URBs back as soon as they are ready.
 
316
 */
 
317
typedef struct _VRDE_USB_REQ_REAP_URB_PARM
 
318
{
 
319
    uint8_t code;
 
320
} VRDE_USB_REQ_REAP_URB_PARM;
 
321
 
 
322
 
 
323
#define VRDE_USB_XFER_OK    (0)
 
324
#define VRDE_USB_XFER_STALL (1)
 
325
#define VRDE_USB_XFER_DNR   (2)
 
326
#define VRDE_USB_XFER_CRC   (3)
 
327
/* VRDE_USB_VERSION_2: New error codes. */
 
328
#define VRDE_USB_XFER_BS    (4)
 
329
#define VRDE_USB_XFER_DTM   (5)
 
330
#define VRDE_USB_XFER_PCF   (6)
 
331
#define VRDE_USB_XFER_UPID  (7)
 
332
#define VRDE_USB_XFER_DO    (8)
 
333
#define VRDE_USB_XFER_DU    (9)
 
334
#define VRDE_USB_XFER_BO    (10)
 
335
#define VRDE_USB_XFER_BU    (11)
 
336
#define VRDE_USB_XFER_ERR   (12) /* VBox protocol error. */
 
337
 
 
338
#define VRDE_USB_REAP_FLAG_CONTINUED (0x0)
 
339
#define VRDE_USB_REAP_FLAG_LAST      (0x1)
 
340
/* VRDE_USB_VERSION_3: Fragmented URBs. */
 
341
#define VRDE_USB_REAP_FLAG_FRAGMENT  (0x2)
 
342
 
 
343
#define VRDE_USB_REAP_VALID_FLAGS    (VRDE_USB_REAP_FLAG_LAST)
 
344
/* VRDE_USB_VERSION_3: Fragmented URBs. */
 
345
#define VRDE_USB_REAP_VALID_FLAGS_3  (VRDE_USB_REAP_FLAG_LAST | VRDE_USB_REAP_FLAG_FRAGMENT)
 
346
 
 
347
typedef struct _VRDEUSBREQREAPURBBODY
 
348
{
 
349
    VRDEUSBDEVID     id;        /* From which device the URB arrives. */
 
350
    uint8_t          flags;     /* VRDE_USB_REAP_FLAG_* */
 
351
    uint8_t          error;     /* VRDE_USB_XFER_* */
 
352
    uint32_t         handle;    /* Handle of returned URB. Not 0. */
 
353
    uint32_t         len;       /* Length of data actually transferred. */
 
354
    /* 'len' bytes of data follow if direction of this URB was VRDE_USB_DIRECTION_IN. */
 
355
} VRDEUSBREQREAPURBBODY;
 
356
 
 
357
typedef struct _VRDE_USB_REQ_REAP_URB_RET
 
358
{
 
359
    /* The REAP URB has no header, only completed URBs are returned. */
 
360
    VRDEUSBREQREAPURBBODY body;
 
361
    /* Another body may follow, depending on flags. */
 
362
} VRDE_USB_REQ_REAP_URB_RET;
 
363
 
 
364
 
 
365
/* VRDE_USB_REQ_CLEAR_HALTED_EP
 
366
 */
 
367
typedef struct _VRDE_USB_REQ_CLEAR_HALTED_EP_PARM
 
368
{
 
369
    uint8_t code;
 
370
    VRDEUSBDEVID id;
 
371
    uint8_t ep;
 
372
} VRDE_USB_REQ_CLEAR_HALTED_EP_PARM;
 
373
 
 
374
typedef struct _VRDE_USB_REQ_CLEAR_HALTED_EP_RET
 
375
{
 
376
    VRDEUSBREQRETHDR hdr;
 
377
} VRDE_USB_REQ_CLEAR_HALTED_EP_RET;
 
378
 
 
379
 
 
380
/* VRDE_USB_REQ_CANCEL_URB
 
381
 */
 
382
typedef struct _VRDE_USB_REQ_CANCEL_URB_PARM
 
383
{
 
384
    uint8_t code;
 
385
    VRDEUSBDEVID id;
 
386
    uint32_t handle;
 
387
} VRDE_USB_REQ_CANCEL_URB_PARM;
 
388
 
 
389
/* The cancel URB request has no return. */
 
390
 
 
391
 
 
392
/* VRDE_USB_REQ_DEVICE_LIST
 
393
 *
 
394
 * Server polls USB devices on client by sending this request
 
395
 * periodically. Client sends back a list of all devices
 
396
 * connected to it. Each device is assigned with an identifier,
 
397
 * that is used to distinguish the particular device.
 
398
 */
 
399
typedef struct _VRDE_USB_REQ_DEVICE_LIST_PARM
 
400
{
 
401
    uint8_t code;
 
402
} VRDE_USB_REQ_DEVICE_LIST_PARM;
 
403
 
 
404
/* Data is a list of the following variable length structures. */
 
405
typedef struct _VRDEUSBDEVICEDESC
 
406
{
 
407
    /* Offset of the next structure. 0 if last. */
 
408
    uint16_t oNext;
 
409
 
 
410
    /* Identifier of the device assigned by client. */
 
411
    VRDEUSBDEVID id;
 
412
 
 
413
    /** USB version number. */
 
414
    uint16_t        bcdUSB;
 
415
    /** Device class. */
 
416
    uint8_t         bDeviceClass;
 
417
    /** Device subclass. */
 
418
    uint8_t         bDeviceSubClass;
 
419
    /** Device protocol */
 
420
    uint8_t         bDeviceProtocol;
 
421
    /** Vendor ID. */
 
422
    uint16_t        idVendor;
 
423
    /** Product ID. */
 
424
    uint16_t        idProduct;
 
425
    /** Revision, integer part. */
 
426
    uint16_t        bcdRev;
 
427
    /** Manufacturer string. */
 
428
    uint16_t        oManufacturer;
 
429
    /** Product string. */
 
430
    uint16_t        oProduct;
 
431
    /** Serial number string. */
 
432
    uint16_t        oSerialNumber;
 
433
    /** Physical USB port the device is connected to. */
 
434
    uint16_t        idPort;
 
435
 
 
436
} VRDEUSBDEVICEDESC;
 
437
 
 
438
typedef struct _VRDE_USB_REQ_DEVICE_LIST_RET
 
439
{
 
440
    VRDEUSBDEVICEDESC body;
 
441
    /* Other devices may follow.
 
442
     * The list ends with (uint16_t)0,
 
443
     * which means that an empty list consists of 2 zero bytes.
 
444
     */
 
445
} VRDE_USB_REQ_DEVICE_LIST_RET;
 
446
 
 
447
typedef struct _VRDEUSBREQNEGOTIATEPARM
 
448
{
 
449
    uint8_t code;
 
450
 
 
451
    /* Remote USB Protocol version. */
 
452
    /* VRDE_USB_VERSION_3: the 32 bit field is splitted to 16 bit version and 16 bit flags.
 
453
     * Version 1 and 2 servers therefore have 'flags' == 0.
 
454
     * Version 3+ servers can send some capabilities in this field, this way it is possible to add
 
455
     *  a new capability without increasing the protocol version.
 
456
     */
 
457
    uint16_t version;
 
458
    uint16_t flags;
 
459
 
 
460
} VRDEUSBREQNEGOTIATEPARM;
 
461
 
 
462
#define VRDE_USB_CAPS_FLAG_ASYNC    (0x0)
 
463
#define VRDE_USB_CAPS_FLAG_POLL     (0x1)
 
464
/* VRDE_USB_VERSION_2: New flag. */
 
465
#define VRDE_USB_CAPS2_FLAG_VERSION (0x2) /* The client is negotiating the protocol version. */
 
466
 
 
467
 
 
468
#define VRDE_USB_CAPS_VALID_FLAGS   (VRDE_USB_CAPS_FLAG_POLL)
 
469
/* VRDE_USB_VERSION_2: A set of valid flags. */
 
470
#define VRDE_USB_CAPS2_VALID_FLAGS  (VRDE_USB_CAPS_FLAG_POLL | VRDE_USB_CAPS2_FLAG_VERSION)
 
471
 
 
472
typedef struct _VRDEUSBREQNEGOTIATERET
 
473
{
 
474
    uint8_t flags;
 
475
} VRDEUSBREQNEGOTIATERET;
 
476
 
 
477
typedef struct _VRDEUSBREQNEGOTIATERET_2
 
478
{
 
479
    uint8_t flags;
 
480
    uint32_t u32Version; /* This field presents only if the VRDE_USB_CAPS2_FLAG_VERSION flag is set. */
 
481
} VRDEUSBREQNEGOTIATERET_2;
 
482
#pragma pack()
 
483
 
 
484
#define VRDE_CLIPBOARD_FORMAT_NULL         (0x0)
 
485
#define VRDE_CLIPBOARD_FORMAT_UNICODE_TEXT (0x1)
 
486
#define VRDE_CLIPBOARD_FORMAT_BITMAP       (0x2)
 
487
#define VRDE_CLIPBOARD_FORMAT_HTML         (0x4)
 
488
 
 
489
#define VRDE_CLIPBOARD_FUNCTION_FORMAT_ANNOUNCE (0)
 
490
#define VRDE_CLIPBOARD_FUNCTION_DATA_READ       (1)
 
491
#define VRDE_CLIPBOARD_FUNCTION_DATA_WRITE      (2)
 
492
 
 
493
 
 
494
/** Indexes of information values. */
 
495
 
 
496
/** Whether a client is connected at the moment.
 
497
 * uint32_t
 
498
 */
 
499
#define VRDE_QI_ACTIVE                 (0)
 
500
 
 
501
/** How many times a client connected up to current moment.
 
502
 * uint32_t
 
503
 */
 
504
#define VRDE_QI_NUMBER_OF_CLIENTS      (1)
 
505
 
 
506
/** When last connection was established.
 
507
 * int64_t time in milliseconds since 1970-01-01 00:00:00 UTC
 
508
 */
 
509
#define VRDE_QI_BEGIN_TIME             (2)
 
510
 
 
511
/** When last connection was terminated or current time if connection still active.
 
512
 * int64_t time in milliseconds since 1970-01-01 00:00:00 UTC
 
513
 */
 
514
#define VRDE_QI_END_TIME               (3)
 
515
 
 
516
/** How many bytes were sent in last (current) connection.
 
517
 * uint64_t
 
518
 */
 
519
#define VRDE_QI_BYTES_SENT             (4)
 
520
 
 
521
/** How many bytes were sent in all connections.
 
522
 * uint64_t
 
523
 */
 
524
#define VRDE_QI_BYTES_SENT_TOTAL       (5)
 
525
 
 
526
/** How many bytes were received in last (current) connection.
 
527
 * uint64_t
 
528
 */
 
529
#define VRDE_QI_BYTES_RECEIVED         (6)
 
530
 
 
531
/** How many bytes were received in all connections.
 
532
 * uint64_t
 
533
 */
 
534
#define VRDE_QI_BYTES_RECEIVED_TOTAL   (7)
 
535
 
 
536
/** Login user name supplied by the client.
 
537
 * UTF8 nul terminated string.
 
538
 */
 
539
#define VRDE_QI_USER                   (8)
 
540
 
 
541
/** Login domain supplied by the client.
 
542
 * UTF8 nul terminated string.
 
543
 */
 
544
#define VRDE_QI_DOMAIN                 (9)
 
545
 
 
546
/** The client name supplied by the client.
 
547
 * UTF8 nul terminated string.
 
548
 */
 
549
#define VRDE_QI_CLIENT_NAME            (10)
 
550
 
 
551
/** IP address of the client.
 
552
 * UTF8 nul terminated string.
 
553
 */
 
554
#define VRDE_QI_CLIENT_IP              (11)
 
555
 
 
556
/** The client software version number.
 
557
 * uint32_t.
 
558
 */
 
559
#define VRDE_QI_CLIENT_VERSION         (12)
 
560
 
 
561
/** Public key exchange method used when connection was established.
 
562
 *  Values: 0 - RDP4 public key exchange scheme.
 
563
 *          1 - X509 sertificates were sent to client.
 
564
 * uint32_t.
 
565
 */
 
566
#define VRDE_QI_ENCRYPTION_STYLE       (13)
 
567
 
 
568
/** TCP port where the server listens.
 
569
 *  Values: 0 - VRDE server failed to start.
 
570
 *          -1 - .
 
571
 * int32_t.
 
572
 */
 
573
#define VRDE_QI_PORT                   (14)
 
574
 
 
575
 
 
576
/** Hints what has been intercepted by the application. */
 
577
#define VRDE_CLIENT_INTERCEPT_AUDIO     (0x1)
 
578
#define VRDE_CLIENT_INTERCEPT_USB       (0x2)
 
579
#define VRDE_CLIENT_INTERCEPT_CLIPBOARD (0x4)
 
580
#define VRDE_CLIENT_INTERCEPT_AUDIO_INPUT (0x8)
 
581
 
 
582
 
 
583
/** The version of the VRDE server interface. */
 
584
#define VRDE_INTERFACE_VERSION_1 (1)
 
585
#define VRDE_INTERFACE_VERSION_2 (2)
 
586
#define VRDE_INTERFACE_VERSION_3 (3)
 
587
 
 
588
/** The header that does not change when the interface changes. */
 
589
typedef struct _VRDEINTERFACEHDR
 
590
{
 
591
    /** The version of the interface. */
 
592
    uint64_t u64Version;
 
593
 
 
594
    /** The size of the structure. */
 
595
    uint64_t u64Size;
 
596
 
 
597
} VRDEINTERFACEHDR;
 
598
 
 
599
/** The VRDE server entry points. Interface version 1. */
 
600
typedef struct _VRDEENTRYPOINTS_1
 
601
{
 
602
    /** The header. */
 
603
    VRDEINTERFACEHDR header;
 
604
 
 
605
    /** Destroy the server instance.
 
606
     *
 
607
     * @param hServer The server instance handle.
 
608
     *
 
609
     * @return IPRT status code.
 
610
     */
 
611
    DECLR3CALLBACKMEMBER(void, VRDEDestroy,(HVRDESERVER hServer));
 
612
 
 
613
    /** The server should start to accept clients connections.
 
614
     *
 
615
     * @param hServer The server instance handle.
 
616
     * @param fEnable Whether to enable or disable client connections.
 
617
     *                When is false, all existing clients are disconnected.
 
618
     *
 
619
     * @return IPRT status code.
 
620
     */
 
621
    DECLR3CALLBACKMEMBER(int, VRDEEnableConnections,(HVRDESERVER hServer,
 
622
                                                   bool fEnable));
 
623
 
 
624
    /** The server should disconnect the client.
 
625
     *
 
626
     * @param hServer     The server instance handle.
 
627
     * @param u32ClientId The client identifier.
 
628
     * @param fReconnect  Whether to send a "REDIRECT to the same server" packet to the
 
629
     *                    client before disconnecting.
 
630
     *
 
631
     * @return IPRT status code.
 
632
     */
 
633
    DECLR3CALLBACKMEMBER(void, VRDEDisconnect,(HVRDESERVER hServer,
 
634
                                             uint32_t u32ClientId,
 
635
                                             bool fReconnect));
 
636
 
 
637
    /**
 
638
     * Inform the server that the display was resized.
 
639
     * The server will query information about display
 
640
     * from the application via callbacks.
 
641
     *
 
642
     * @param hServer Handle of VRDE server instance.
 
643
     */
 
644
    DECLR3CALLBACKMEMBER(void, VRDEResize,(HVRDESERVER hServer));
 
645
 
 
646
    /**
 
647
     * Send a update.
 
648
     *
 
649
     * @param hServer   Handle of VRDE server instance.
 
650
     * @param uScreenId The screen index.
 
651
     * @param pvUpdate  Pointer to VBoxGuest.h::VRDEORDERHDR structure with extra data.
 
652
     * @param cbUpdate  Size of the update data.
 
653
     */
 
654
    DECLR3CALLBACKMEMBER(void, VRDEUpdate,(HVRDESERVER hServer,
 
655
                                         unsigned uScreenId,
 
656
                                         void *pvUpdate,
 
657
                                         uint32_t cbUpdate));
 
658
 
 
659
    /**
 
660
     * Set the mouse pointer shape.
 
661
     *
 
662
     * @param hServer  Handle of VRDE server instance.
 
663
     * @param pPointer The pointer shape information.
 
664
     */
 
665
    DECLR3CALLBACKMEMBER(void, VRDEColorPointer,(HVRDESERVER hServer,
 
666
                                               const VRDECOLORPOINTER *pPointer));
 
667
 
 
668
    /**
 
669
     * Hide the mouse pointer.
 
670
     *
 
671
     * @param hServer Handle of VRDE server instance.
 
672
     */
 
673
    DECLR3CALLBACKMEMBER(void, VRDEHidePointer,(HVRDESERVER hServer));
 
674
 
 
675
    /**
 
676
     * Queues the samples to be sent to clients.
 
677
     *
 
678
     * @param hServer    Handle of VRDE server instance.
 
679
     * @param pvSamples  Address of samples to be sent.
 
680
     * @param cSamples   Number of samples.
 
681
     * @param format     Encoded audio format for these samples.
 
682
     *
 
683
     * @note Initialized to NULL when the application audio callbacks are NULL.
 
684
     */
 
685
    DECLR3CALLBACKMEMBER(void, VRDEAudioSamples,(HVRDESERVER hServer,
 
686
                                               const void *pvSamples,
 
687
                                               uint32_t cSamples,
 
688
                                               VRDEAUDIOFORMAT format));
 
689
 
 
690
    /**
 
691
     * Sets the sound volume on clients.
 
692
     *
 
693
     * @param hServer    Handle of VRDE server instance.
 
694
     * @param left       0..0xFFFF volume level for left channel.
 
695
     * @param right      0..0xFFFF volume level for right channel.
 
696
     *
 
697
     * @note Initialized to NULL when the application audio callbacks are NULL.
 
698
     */
 
699
    DECLR3CALLBACKMEMBER(void, VRDEAudioVolume,(HVRDESERVER hServer,
 
700
                                              uint16_t u16Left,
 
701
                                              uint16_t u16Right));
 
702
 
 
703
    /**
 
704
     * Sends a USB request.
 
705
     *
 
706
     * @param hServer      Handle of VRDE server instance.
 
707
     * @param u32ClientId  An identifier that allows the server to find the corresponding client.
 
708
     *                     The identifier is always passed by the server as a parameter
 
709
     *                     of the FNVRDEUSBCALLBACK. Note that the value is the same as
 
710
     *                     in the VRDESERVERCALLBACK functions.
 
711
     * @param pvParm       Function specific parameters buffer.
 
712
     * @param cbParm       Size of the buffer.
 
713
     *
 
714
     * @note Initialized to NULL when the application USB callbacks are NULL.
 
715
     */
 
716
    DECLR3CALLBACKMEMBER(void, VRDEUSBRequest,(HVRDESERVER hServer,
 
717
                                             uint32_t u32ClientId,
 
718
                                             void *pvParm,
 
719
                                             uint32_t cbParm));
 
720
 
 
721
    /**
 
722
     * Called by the application when (VRDE_CLIPBOARD_FUNCTION_*):
 
723
     *   - (0) guest announces available clipboard formats;
 
724
     *   - (1) guest requests clipboard data;
 
725
     *   - (2) guest responds to the client's request for clipboard data.
 
726
     *
 
727
     * @param hServer     The VRDE server handle.
 
728
     * @param u32Function The cause of the call.
 
729
     * @param u32Format   Bitmask of announced formats or the format of data.
 
730
     * @param pvData      Points to: (1) buffer to be filled with clients data;
 
731
     *                               (2) data from the host.
 
732
     * @param cbData      Size of 'pvData' buffer in bytes.
 
733
     * @param pcbActualRead Size of the copied data in bytes.
 
734
     *
 
735
     * @note Initialized to NULL when the application clipboard callbacks are NULL.
 
736
     */
 
737
    DECLR3CALLBACKMEMBER(void, VRDEClipboard,(HVRDESERVER hServer,
 
738
                                            uint32_t u32Function,
 
739
                                            uint32_t u32Format,
 
740
                                            void *pvData,
 
741
                                            uint32_t cbData,
 
742
                                            uint32_t *pcbActualRead));
 
743
 
 
744
    /**
 
745
     * Query various information from the VRDE server.
 
746
     *
 
747
     * @param hServer   The VRDE server handle.
 
748
     * @param index     VRDE_QI_* identifier of information to be returned.
 
749
     * @param pvBuffer  Address of memory buffer to which the information must be written.
 
750
     * @param cbBuffer  Size of the memory buffer in bytes.
 
751
     * @param pcbOut    Size in bytes of returned information value.
 
752
     *
 
753
     * @remark The caller must check the *pcbOut. 0 there means no information was returned.
 
754
     *         A value greater than cbBuffer means that information is too big to fit in the
 
755
     *         buffer, in that case no information was placed to the buffer.
 
756
     */
 
757
    DECLR3CALLBACKMEMBER(void, VRDEQueryInfo,(HVRDESERVER hServer,
 
758
                                            uint32_t index,
 
759
                                            void *pvBuffer,
 
760
                                            uint32_t cbBuffer,
 
761
                                            uint32_t *pcbOut));
 
762
} VRDEENTRYPOINTS_1;
 
763
 
 
764
/** The VRDE server entry points. Interface version 2.
 
765
 *  A new entry point VRDERedirect has been added relative to version 1.
 
766
 */
 
767
typedef struct _VRDEENTRYPOINTS_2
 
768
{
 
769
    /** The header. */
 
770
    VRDEINTERFACEHDR header;
 
771
 
 
772
    /** Destroy the server instance.
 
773
     *
 
774
     * @param hServer The server instance handle.
 
775
     *
 
776
     * @return IPRT status code.
 
777
     */
 
778
    DECLR3CALLBACKMEMBER(void, VRDEDestroy,(HVRDESERVER hServer));
 
779
 
 
780
    /** The server should start to accept clients connections.
 
781
     *
 
782
     * @param hServer The server instance handle.
 
783
     * @param fEnable Whether to enable or disable client connections.
 
784
     *                When is false, all existing clients are disconnected.
 
785
     *
 
786
     * @return IPRT status code.
 
787
     */
 
788
    DECLR3CALLBACKMEMBER(int, VRDEEnableConnections,(HVRDESERVER hServer,
 
789
                                                   bool fEnable));
 
790
 
 
791
    /** The server should disconnect the client.
 
792
     *
 
793
     * @param hServer     The server instance handle.
 
794
     * @param u32ClientId The client identifier.
 
795
     * @param fReconnect  Whether to send a "REDIRECT to the same server" packet to the
 
796
     *                    client before disconnecting.
 
797
     *
 
798
     * @return IPRT status code.
 
799
     */
 
800
    DECLR3CALLBACKMEMBER(void, VRDEDisconnect,(HVRDESERVER hServer,
 
801
                                             uint32_t u32ClientId,
 
802
                                             bool fReconnect));
 
803
 
 
804
    /**
 
805
     * Inform the server that the display was resized.
 
806
     * The server will query information about display
 
807
     * from the application via callbacks.
 
808
     *
 
809
     * @param hServer Handle of VRDE server instance.
 
810
     */
 
811
    DECLR3CALLBACKMEMBER(void, VRDEResize,(HVRDESERVER hServer));
 
812
 
 
813
    /**
 
814
     * Send a update.
 
815
     *
 
816
     * @param hServer   Handle of VRDE server instance.
 
817
     * @param uScreenId The screen index.
 
818
     * @param pvUpdate  Pointer to VBoxGuest.h::VRDEORDERHDR structure with extra data.
 
819
     * @param cbUpdate  Size of the update data.
 
820
     */
 
821
    DECLR3CALLBACKMEMBER(void, VRDEUpdate,(HVRDESERVER hServer,
 
822
                                         unsigned uScreenId,
 
823
                                         void *pvUpdate,
 
824
                                         uint32_t cbUpdate));
 
825
 
 
826
    /**
 
827
     * Set the mouse pointer shape.
 
828
     *
 
829
     * @param hServer  Handle of VRDE server instance.
 
830
     * @param pPointer The pointer shape information.
 
831
     */
 
832
    DECLR3CALLBACKMEMBER(void, VRDEColorPointer,(HVRDESERVER hServer,
 
833
                                               const VRDECOLORPOINTER *pPointer));
 
834
 
 
835
    /**
 
836
     * Hide the mouse pointer.
 
837
     *
 
838
     * @param hServer Handle of VRDE server instance.
 
839
     */
 
840
    DECLR3CALLBACKMEMBER(void, VRDEHidePointer,(HVRDESERVER hServer));
 
841
 
 
842
    /**
 
843
     * Queues the samples to be sent to clients.
 
844
     *
 
845
     * @param hServer    Handle of VRDE server instance.
 
846
     * @param pvSamples  Address of samples to be sent.
 
847
     * @param cSamples   Number of samples.
 
848
     * @param format     Encoded audio format for these samples.
 
849
     *
 
850
     * @note Initialized to NULL when the application audio callbacks are NULL.
 
851
     */
 
852
    DECLR3CALLBACKMEMBER(void, VRDEAudioSamples,(HVRDESERVER hServer,
 
853
                                               const void *pvSamples,
 
854
                                               uint32_t cSamples,
 
855
                                               VRDEAUDIOFORMAT format));
 
856
 
 
857
    /**
 
858
     * Sets the sound volume on clients.
 
859
     *
 
860
     * @param hServer    Handle of VRDE server instance.
 
861
     * @param left       0..0xFFFF volume level for left channel.
 
862
     * @param right      0..0xFFFF volume level for right channel.
 
863
     *
 
864
     * @note Initialized to NULL when the application audio callbacks are NULL.
 
865
     */
 
866
    DECLR3CALLBACKMEMBER(void, VRDEAudioVolume,(HVRDESERVER hServer,
 
867
                                              uint16_t u16Left,
 
868
                                              uint16_t u16Right));
 
869
 
 
870
    /**
 
871
     * Sends a USB request.
 
872
     *
 
873
     * @param hServer      Handle of VRDE server instance.
 
874
     * @param u32ClientId  An identifier that allows the server to find the corresponding client.
 
875
     *                     The identifier is always passed by the server as a parameter
 
876
     *                     of the FNVRDEUSBCALLBACK. Note that the value is the same as
 
877
     *                     in the VRDESERVERCALLBACK functions.
 
878
     * @param pvParm       Function specific parameters buffer.
 
879
     * @param cbParm       Size of the buffer.
 
880
     *
 
881
     * @note Initialized to NULL when the application USB callbacks are NULL.
 
882
     */
 
883
    DECLR3CALLBACKMEMBER(void, VRDEUSBRequest,(HVRDESERVER hServer,
 
884
                                             uint32_t u32ClientId,
 
885
                                             void *pvParm,
 
886
                                             uint32_t cbParm));
 
887
 
 
888
    /**
 
889
     * Called by the application when (VRDE_CLIPBOARD_FUNCTION_*):
 
890
     *   - (0) guest announces available clipboard formats;
 
891
     *   - (1) guest requests clipboard data;
 
892
     *   - (2) guest responds to the client's request for clipboard data.
 
893
     *
 
894
     * @param hServer     The VRDE server handle.
 
895
     * @param u32Function The cause of the call.
 
896
     * @param u32Format   Bitmask of announced formats or the format of data.
 
897
     * @param pvData      Points to: (1) buffer to be filled with clients data;
 
898
     *                               (2) data from the host.
 
899
     * @param cbData      Size of 'pvData' buffer in bytes.
 
900
     * @param pcbActualRead Size of the copied data in bytes.
 
901
     *
 
902
     * @note Initialized to NULL when the application clipboard callbacks are NULL.
 
903
     */
 
904
    DECLR3CALLBACKMEMBER(void, VRDEClipboard,(HVRDESERVER hServer,
 
905
                                            uint32_t u32Function,
 
906
                                            uint32_t u32Format,
 
907
                                            void *pvData,
 
908
                                            uint32_t cbData,
 
909
                                            uint32_t *pcbActualRead));
 
910
 
 
911
    /**
 
912
     * Query various information from the VRDE server.
 
913
     *
 
914
     * @param hServer   The VRDE server handle.
 
915
     * @param index     VRDE_QI_* identifier of information to be returned.
 
916
     * @param pvBuffer  Address of memory buffer to which the information must be written.
 
917
     * @param cbBuffer  Size of the memory buffer in bytes.
 
918
     * @param pcbOut    Size in bytes of returned information value.
 
919
     *
 
920
     * @remark The caller must check the *pcbOut. 0 there means no information was returned.
 
921
     *         A value greater than cbBuffer means that information is too big to fit in the
 
922
     *         buffer, in that case no information was placed to the buffer.
 
923
     */
 
924
    DECLR3CALLBACKMEMBER(void, VRDEQueryInfo,(HVRDESERVER hServer,
 
925
                                            uint32_t index,
 
926
                                            void *pvBuffer,
 
927
                                            uint32_t cbBuffer,
 
928
                                            uint32_t *pcbOut));
 
929
 
 
930
    /**
 
931
     * The server should redirect the client to the specified server.
 
932
     *
 
933
     * @param hServer       The server instance handle.
 
934
     * @param u32ClientId   The client identifier.
 
935
     * @param pszServer     The server to redirect the client to.
 
936
     * @param pszUser       The username to use for the redirection.
 
937
     *                      Can be NULL.
 
938
     * @param pszDomain     The domain. Can be NULL.
 
939
     * @param pszPassword   The password. Can be NULL.
 
940
     * @param u32SessionId  The ID of the session to redirect to.
 
941
     * @param pszCookie     The routing token used by a load balancer to
 
942
     *                      route the redirection. Can be NULL.
 
943
     */
 
944
    DECLR3CALLBACKMEMBER(void, VRDERedirect,(HVRDESERVER hServer,
 
945
                                             uint32_t u32ClientId,
 
946
                                             const char *pszServer,
 
947
                                             const char *pszUser,
 
948
                                             const char *pszDomain,
 
949
                                             const char *pszPassword,
 
950
                                             uint32_t u32SessionId,
 
951
                                             const char *pszCookie));
 
952
} VRDEENTRYPOINTS_2;
 
953
 
 
954
/** The VRDE server entry points. Interface version 3.
 
955
 *  A new entry point VRDE has been added relative to version 2.
 
956
 */
 
957
typedef struct _VRDEENTRYPOINTS_3
 
958
{
 
959
    /* The header. */
 
960
    VRDEINTERFACEHDR header;
 
961
 
 
962
    /*
 
963
     * Same as version 2.
 
964
     */
 
965
 
 
966
    DECLR3CALLBACKMEMBER(void, VRDEDestroy,(HVRDESERVER hServer));
 
967
 
 
968
    DECLR3CALLBACKMEMBER(int, VRDEEnableConnections,(HVRDESERVER hServer,
 
969
                                                   bool fEnable));
 
970
 
 
971
    DECLR3CALLBACKMEMBER(void, VRDEDisconnect,(HVRDESERVER hServer,
 
972
                                             uint32_t u32ClientId,
 
973
                                             bool fReconnect));
 
974
 
 
975
    DECLR3CALLBACKMEMBER(void, VRDEResize,(HVRDESERVER hServer));
 
976
 
 
977
    DECLR3CALLBACKMEMBER(void, VRDEUpdate,(HVRDESERVER hServer,
 
978
                                         unsigned uScreenId,
 
979
                                         void *pvUpdate,
 
980
                                         uint32_t cbUpdate));
 
981
 
 
982
    DECLR3CALLBACKMEMBER(void, VRDEColorPointer,(HVRDESERVER hServer,
 
983
                                               const VRDECOLORPOINTER *pPointer));
 
984
 
 
985
    DECLR3CALLBACKMEMBER(void, VRDEHidePointer,(HVRDESERVER hServer));
 
986
 
 
987
    DECLR3CALLBACKMEMBER(void, VRDEAudioSamples,(HVRDESERVER hServer,
 
988
                                               const void *pvSamples,
 
989
                                               uint32_t cSamples,
 
990
                                               VRDEAUDIOFORMAT format));
 
991
 
 
992
    DECLR3CALLBACKMEMBER(void, VRDEAudioVolume,(HVRDESERVER hServer,
 
993
                                              uint16_t u16Left,
 
994
                                              uint16_t u16Right));
 
995
 
 
996
    DECLR3CALLBACKMEMBER(void, VRDEUSBRequest,(HVRDESERVER hServer,
 
997
                                             uint32_t u32ClientId,
 
998
                                             void *pvParm,
 
999
                                             uint32_t cbParm));
 
1000
 
 
1001
    DECLR3CALLBACKMEMBER(void, VRDEClipboard,(HVRDESERVER hServer,
 
1002
                                            uint32_t u32Function,
 
1003
                                            uint32_t u32Format,
 
1004
                                            void *pvData,
 
1005
                                            uint32_t cbData,
 
1006
                                            uint32_t *pcbActualRead));
 
1007
 
 
1008
    DECLR3CALLBACKMEMBER(void, VRDEQueryInfo,(HVRDESERVER hServer,
 
1009
                                            uint32_t index,
 
1010
                                            void *pvBuffer,
 
1011
                                            uint32_t cbBuffer,
 
1012
                                            uint32_t *pcbOut));
 
1013
 
 
1014
    DECLR3CALLBACKMEMBER(void, VRDERedirect,(HVRDESERVER hServer,
 
1015
                                             uint32_t u32ClientId,
 
1016
                                             const char *pszServer,
 
1017
                                             const char *pszUser,
 
1018
                                             const char *pszDomain,
 
1019
                                             const char *pszPassword,
 
1020
                                             uint32_t u32SessionId,
 
1021
                                             const char *pszCookie));
 
1022
 
 
1023
    /*
 
1024
     * New for version 3.
 
1025
     */
 
1026
 
 
1027
    /**
 
1028
     * Audio input open request.
 
1029
     *
 
1030
     * @param hServer      Handle of VRDE server instance.
 
1031
     * @param pvCtx        To be used in VRDECallbackAudioIn.
 
1032
     * @param u32ClientId  An identifier that allows the server to find the corresponding client.
 
1033
     * @param audioFormat  Preferred format of audio data.
 
1034
     * @param u32SamplesPerBlock Preferred number of samples in one block of audio input data.
 
1035
     *
 
1036
     * @note Initialized to NULL when the VRDECallbackAudioIn callback is NULL.
 
1037
     */
 
1038
    DECLR3CALLBACKMEMBER(void, VRDEAudioInOpen,(HVRDESERVER hServer,
 
1039
                                                void *pvCtx,
 
1040
                                                uint32_t u32ClientId,
 
1041
                                                VRDEAUDIOFORMAT audioFormat,
 
1042
                                                uint32_t u32SamplesPerBlock));
 
1043
 
 
1044
    /**
 
1045
     * Audio input close request.
 
1046
     *
 
1047
     * @param hServer      Handle of VRDE server instance.
 
1048
     * @param u32ClientId  An identifier that allows the server to find the corresponding client.
 
1049
     *
 
1050
     * @note Initialized to NULL when the VRDECallbackAudioIn callback is NULL.
 
1051
     */
 
1052
    DECLR3CALLBACKMEMBER(void, VRDEAudioInClose,(HVRDESERVER hServer,
 
1053
                                                 uint32_t u32ClientId));
 
1054
} VRDEENTRYPOINTS_3;
 
1055
 
 
1056
 
 
1057
#define VRDE_QP_NETWORK_PORT      (1)
 
1058
#define VRDE_QP_NETWORK_ADDRESS   (2)
 
1059
#define VRDE_QP_NUMBER_MONITORS   (3)
 
1060
#define VRDE_QP_NETWORK_PORT_RANGE (4)
 
1061
#ifdef VBOX_WITH_VRDP_VIDEO_CHANNEL
 
1062
#define VRDE_QP_VIDEO_CHANNEL         (5)
 
1063
#define VRDE_QP_VIDEO_CHANNEL_QUALITY (6)
 
1064
#define VRDE_QP_VIDEO_CHANNEL_SUNFLSH (7)
 
1065
#endif /* VBOX_WITH_VRDP_VIDEO_CHANNEL */
 
1066
#define VRDE_QP_FEATURE           (8)
 
1067
 
 
1068
#define VRDE_SP_BASE 0x1000
 
1069
#define VRDE_SP_NETWORK_BIND_PORT (VRDE_SP_BASE + 1)
 
1070
 
 
1071
#pragma pack(1)
 
1072
/* VRDE_QP_FEATURE data. */
 
1073
typedef struct _VRDEFEATURE
 
1074
{
 
1075
    uint32_t u32ClientId;
 
1076
    char     achInfo[1]; /* UTF8 property input name and output value. */
 
1077
} VRDEFEATURE;
 
1078
 
 
1079
/* A framebuffer description. */
 
1080
typedef struct _VRDEFRAMEBUFFERINFO
 
1081
{
 
1082
    const uint8_t *pu8Bits;
 
1083
    int            xOrigin;
 
1084
    int            yOrigin;
 
1085
    unsigned       cWidth;
 
1086
    unsigned       cHeight;
 
1087
    unsigned       cBitsPerPixel;
 
1088
    unsigned       cbLine;
 
1089
} VRDEFRAMEBUFFERINFO;
 
1090
 
 
1091
#define VRDE_INPUT_SCANCODE 0
 
1092
#define VRDE_INPUT_POINT    1
 
1093
#define VRDE_INPUT_CAD      2
 
1094
#define VRDE_INPUT_RESET    3
 
1095
#define VRDE_INPUT_SYNCH    4
 
1096
 
 
1097
typedef struct _VRDEINPUTSCANCODE
 
1098
{
 
1099
    unsigned uScancode;
 
1100
} VRDEINPUTSCANCODE;
 
1101
 
 
1102
#define VRDE_INPUT_POINT_BUTTON1    0x01
 
1103
#define VRDE_INPUT_POINT_BUTTON2    0x02
 
1104
#define VRDE_INPUT_POINT_BUTTON3    0x04
 
1105
#define VRDE_INPUT_POINT_WHEEL_UP   0x08
 
1106
#define VRDE_INPUT_POINT_WHEEL_DOWN 0x10
 
1107
 
 
1108
typedef struct _VRDEINPUTPOINT
 
1109
{
 
1110
    int x;
 
1111
    int y;
 
1112
    unsigned uButtons;
 
1113
} VRDEINPUTPOINT;
 
1114
 
 
1115
#define VRDE_INPUT_SYNCH_SCROLL   0x01
 
1116
#define VRDE_INPUT_SYNCH_NUMLOCK  0x02
 
1117
#define VRDE_INPUT_SYNCH_CAPITAL  0x04
 
1118
 
 
1119
typedef struct _VRDEINPUTSYNCH
 
1120
{
 
1121
    unsigned uLockStatus;
 
1122
} VRDEINPUTSYNCH;
 
1123
#pragma pack()
 
1124
 
 
1125
/** The VRDE server callbacks. Interface version 1. */
 
1126
typedef struct _VRDECALLBACKS_1
 
1127
{
 
1128
    /** The header. */
 
1129
    VRDEINTERFACEHDR header;
 
1130
 
 
1131
    /**
 
1132
     * Query or set various information, on how the VRDE server operates, from or to the application.
 
1133
     *
 
1134
     *
 
1135
     * @param pvCallback  The callback specific pointer.
 
1136
     * @param index       VRDE_[Q|S]P_* identifier of information to be returned or set.
 
1137
     * @param pvBuffer    Address of memory buffer to which the information must be written or read.
 
1138
     * @param cbBuffer    Size of the memory buffer in bytes.
 
1139
     * @param pcbOut      Size in bytes of returned information value.
 
1140
     *
 
1141
     * @return IPRT status code. VINF_BUFFER_OVERFLOW if the buffer is too small for the value.
 
1142
     */
 
1143
    DECLR3CALLBACKMEMBER(int, VRDECallbackProperty,(void *pvCallback,
 
1144
                                                    uint32_t index,
 
1145
                                                    void *pvBuffer,
 
1146
                                                    uint32_t cbBuffer,
 
1147
                                                    uint32_t *pcbOut));
 
1148
 
 
1149
    /* A client is logging in, the application must decide whether
 
1150
     * to let to connect the client. The server will drop the connection,
 
1151
     * when an error code is returned by the callback.
 
1152
     *
 
1153
     * @param pvCallback   The callback specific pointer.
 
1154
     * @param u32ClientId  An unique client identifier generated by the server.
 
1155
     * @param pszUser      The username.
 
1156
     * @param pszPassword  The password.
 
1157
     * @param pszDomain    The domain.
 
1158
     *
 
1159
     * @return IPRT status code.
 
1160
     */
 
1161
    DECLR3CALLBACKMEMBER(int, VRDECallbackClientLogon,(void *pvCallback,
 
1162
                                                     uint32_t u32ClientId,
 
1163
                                                     const char *pszUser,
 
1164
                                                     const char *pszPassword,
 
1165
                                                     const char *pszDomain));
 
1166
 
 
1167
    /* The client has been successfully connected.
 
1168
     *
 
1169
     * @param pvCallback      The callback specific pointer.
 
1170
     * @param u32ClientId     An unique client identifier generated by the server.
 
1171
     */
 
1172
    DECLR3CALLBACKMEMBER(void, VRDECallbackClientConnect,(void *pvCallback,
 
1173
                                                        uint32_t u32ClientId));
 
1174
 
 
1175
    /* The client has been disconnected.
 
1176
     *
 
1177
     * @param pvCallback      The callback specific pointer.
 
1178
     * @param u32ClientId     An unique client identifier generated by the server.
 
1179
     * @param fu32Intercepted What was intercepted by the client (VRDE_CLIENT_INTERCEPT_*).
 
1180
     */
 
1181
    DECLR3CALLBACKMEMBER(void, VRDECallbackClientDisconnect,(void *pvCallback,
 
1182
                                                           uint32_t u32ClientId,
 
1183
                                                           uint32_t fu32Intercepted));
 
1184
    /* The client supports one of RDP channels.
 
1185
     *
 
1186
     * @param pvCallback      The callback specific pointer.
 
1187
     * @param u32ClientId     An unique client identifier generated by the server.
 
1188
     * @param fu32Intercept   What the client wants to intercept. One of VRDE_CLIENT_INTERCEPT_* flags.
 
1189
     * @param ppvIntercept    The value to be passed to the channel specific callback.
 
1190
     *
 
1191
     * @return IPRT status code.
 
1192
     */
 
1193
    DECLR3CALLBACKMEMBER(int, VRDECallbackIntercept,(void *pvCallback,
 
1194
                                                   uint32_t u32ClientId,
 
1195
                                                   uint32_t fu32Intercept,
 
1196
                                                   void **ppvIntercept));
 
1197
 
 
1198
    /**
 
1199
     * Called by the server when a reply is received from a client.
 
1200
     *
 
1201
     * @param pvCallback   The callback specific pointer.
 
1202
     * @param ppvIntercept The value returned by VRDECallbackIntercept for the VRDE_CLIENT_INTERCEPT_USB.
 
1203
     * @param u32ClientId  Identifies the client that sent the reply.
 
1204
     * @param u8Code       The operation code VRDE_USB_REQ_*.
 
1205
     * @param pvRet        Points to data received from the client.
 
1206
     * @param cbRet        Size of the data in bytes.
 
1207
     *
 
1208
     * @return IPRT status code.
 
1209
     */
 
1210
    DECLR3CALLBACKMEMBER(int, VRDECallbackUSB,(void *pvCallback,
 
1211
                                             void *pvIntercept,
 
1212
                                             uint32_t u32ClientId,
 
1213
                                             uint8_t u8Code,
 
1214
                                             const void *pvRet,
 
1215
                                             uint32_t cbRet));
 
1216
 
 
1217
    /**
 
1218
     * Called by the server when (VRDE_CLIPBOARD_FUNCTION_*):
 
1219
     *   - (0) client announces available clipboard formats;
 
1220
     *   - (1) client requests clipboard data.
 
1221
     *
 
1222
     * @param pvCallback   The callback specific pointer.
 
1223
     * @param ppvIntercept The value returned by VRDECallbackIntercept for the VRDE_CLIENT_INTERCEPT_CLIPBOARD.
 
1224
     * @param u32ClientId Identifies the RDP client that sent the reply.
 
1225
     * @param u32Function The cause of the callback.
 
1226
     * @param u32Format   Bitmask of reported formats or the format of received data.
 
1227
     * @param pvData      Reserved.
 
1228
     * @param cbData      Reserved.
 
1229
     *
 
1230
     * @return IPRT status code.
 
1231
     */
 
1232
    DECLR3CALLBACKMEMBER(int, VRDECallbackClipboard,(void *pvCallback,
 
1233
                                                   void *pvIntercept,
 
1234
                                                   uint32_t u32ClientId,
 
1235
                                                   uint32_t u32Function,
 
1236
                                                   uint32_t u32Format,
 
1237
                                                   const void *pvData,
 
1238
                                                   uint32_t cbData));
 
1239
 
 
1240
    /* The framebuffer information is queried.
 
1241
     *
 
1242
     * @param pvCallback      The callback specific pointer.
 
1243
     * @param uScreenId       The framebuffer index.
 
1244
     * @param pInfo           The information structure to ber filled.
 
1245
     *
 
1246
     * @return Whether the framebuffer is available.
 
1247
     */
 
1248
    DECLR3CALLBACKMEMBER(bool, VRDECallbackFramebufferQuery,(void *pvCallback,
 
1249
                                                           unsigned uScreenId,
 
1250
                                                           VRDEFRAMEBUFFERINFO *pInfo));
 
1251
 
 
1252
    /* The framebuffer is locked.
 
1253
     *
 
1254
     * @param pvCallback      The callback specific pointer.
 
1255
     * @param uScreenId       The framebuffer index.
 
1256
     */
 
1257
    DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferLock,(void *pvCallback,
 
1258
                                                          unsigned uScreenId));
 
1259
 
 
1260
    /* The framebuffer is unlocked.
 
1261
     *
 
1262
     * @param pvCallback      The callback specific pointer.
 
1263
     * @param uScreenId       The framebuffer index.
 
1264
     */
 
1265
    DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferUnlock,(void *pvCallback,
 
1266
                                                            unsigned uScreenId));
 
1267
 
 
1268
    /* Input from the client.
 
1269
     *
 
1270
     * @param pvCallback      The callback specific pointer.
 
1271
     * @param pvInput         The input information.
 
1272
     * @param cbInput         The size of the input information.
 
1273
     */
 
1274
    DECLR3CALLBACKMEMBER(void, VRDECallbackInput,(void *pvCallback,
 
1275
                                                int type,
 
1276
                                                const void *pvInput,
 
1277
                                                unsigned cbInput));
 
1278
 
 
1279
    /* Video mode hint from the client.
 
1280
     *
 
1281
     * @param pvCallback      The callback specific pointer.
 
1282
     * @param cWidth          Requested width.
 
1283
     * @param cHeight         Requested height.
 
1284
     * @param cBitsPerPixel   Requested color depth.
 
1285
     * @param uScreenId       The framebuffer index.
 
1286
     */
 
1287
    DECLR3CALLBACKMEMBER(void, VRDECallbackVideoModeHint,(void *pvCallback,
 
1288
                                                        unsigned cWidth,
 
1289
                                                        unsigned cHeight,
 
1290
                                                        unsigned cBitsPerPixel,
 
1291
                                                        unsigned uScreenId));
 
1292
 
 
1293
} VRDECALLBACKS_1;
 
1294
 
 
1295
/* Callbacks are the same for the version 1 and version 2 interfaces. */
 
1296
typedef VRDECALLBACKS_1 VRDECALLBACKS_2;
 
1297
 
 
1298
/** The VRDE server callbacks. Interface version 3. */
 
1299
typedef struct _VRDECALLBACKS_3
 
1300
{
 
1301
    /* The header. */
 
1302
    VRDEINTERFACEHDR header;
 
1303
 
 
1304
    /*
 
1305
     * Same as in version 2.
 
1306
     */
 
1307
    DECLR3CALLBACKMEMBER(int, VRDECallbackProperty,(void *pvCallback,
 
1308
                                                    uint32_t index,
 
1309
                                                    void *pvBuffer,
 
1310
                                                    uint32_t cbBuffer,
 
1311
                                                    uint32_t *pcbOut));
 
1312
 
 
1313
    DECLR3CALLBACKMEMBER(int, VRDECallbackClientLogon,(void *pvCallback,
 
1314
                                                     uint32_t u32ClientId,
 
1315
                                                     const char *pszUser,
 
1316
                                                     const char *pszPassword,
 
1317
                                                     const char *pszDomain));
 
1318
 
 
1319
    DECLR3CALLBACKMEMBER(void, VRDECallbackClientConnect,(void *pvCallback,
 
1320
                                                        uint32_t u32ClientId));
 
1321
 
 
1322
    DECLR3CALLBACKMEMBER(void, VRDECallbackClientDisconnect,(void *pvCallback,
 
1323
                                                           uint32_t u32ClientId,
 
1324
                                                           uint32_t fu32Intercepted));
 
1325
    DECLR3CALLBACKMEMBER(int, VRDECallbackIntercept,(void *pvCallback,
 
1326
                                                   uint32_t u32ClientId,
 
1327
                                                   uint32_t fu32Intercept,
 
1328
                                                   void **ppvIntercept));
 
1329
 
 
1330
    DECLR3CALLBACKMEMBER(int, VRDECallbackUSB,(void *pvCallback,
 
1331
                                             void *pvIntercept,
 
1332
                                             uint32_t u32ClientId,
 
1333
                                             uint8_t u8Code,
 
1334
                                             const void *pvRet,
 
1335
                                             uint32_t cbRet));
 
1336
 
 
1337
    DECLR3CALLBACKMEMBER(int, VRDECallbackClipboard,(void *pvCallback,
 
1338
                                                   void *pvIntercept,
 
1339
                                                   uint32_t u32ClientId,
 
1340
                                                   uint32_t u32Function,
 
1341
                                                   uint32_t u32Format,
 
1342
                                                   const void *pvData,
 
1343
                                                   uint32_t cbData));
 
1344
 
 
1345
    DECLR3CALLBACKMEMBER(bool, VRDECallbackFramebufferQuery,(void *pvCallback,
 
1346
                                                           unsigned uScreenId,
 
1347
                                                           VRDEFRAMEBUFFERINFO *pInfo));
 
1348
 
 
1349
    DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferLock,(void *pvCallback,
 
1350
                                                          unsigned uScreenId));
 
1351
 
 
1352
    DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferUnlock,(void *pvCallback,
 
1353
                                                            unsigned uScreenId));
 
1354
 
 
1355
    DECLR3CALLBACKMEMBER(void, VRDECallbackInput,(void *pvCallback,
 
1356
                                                int type,
 
1357
                                                const void *pvInput,
 
1358
                                                unsigned cbInput));
 
1359
 
 
1360
    DECLR3CALLBACKMEMBER(void, VRDECallbackVideoModeHint,(void *pvCallback,
 
1361
                                                        unsigned cWidth,
 
1362
                                                        unsigned cHeight,
 
1363
                                                        unsigned cBitsPerPixel,
 
1364
                                                        unsigned uScreenId));
 
1365
 
 
1366
    /*
 
1367
     * New for version 3.
 
1368
     */
 
1369
 
 
1370
    /**
 
1371
     * Called by the server when something happens with audio input.
 
1372
     *
 
1373
     * @param pvCallback   The callback specific pointer.
 
1374
     * @param pvCtx        The value passed in VRDEAudioInOpen.
 
1375
     * @param u32ClientId  Identifies the client that sent the reply.
 
1376
     * @param u32Event     The event code VRDE_AUDIOIN_*.
 
1377
     * @param pvData       Points to data received from the client.
 
1378
     * @param cbData       Size of the data in bytes.
 
1379
     */
 
1380
    DECLR3CALLBACKMEMBER(void, VRDECallbackAudioIn,(void *pvCallback,
 
1381
                                                    void *pvCtx,
 
1382
                                                    uint32_t u32ClientId,
 
1383
                                                    uint32_t u32Event,
 
1384
                                                    const void *pvData,
 
1385
                                                    uint32_t cbData));
 
1386
} VRDECALLBACKS_3;
 
1387
 
 
1388
/**
 
1389
 * Create a new VRDE server instance. The instance is fully functional but refuses
 
1390
 * client connections until the entry point VRDEEnableConnections is called by the application.
 
1391
 *
 
1392
 * The caller prepares the VRDECALLBACKS_* structure. The header.u64Version field of the
 
1393
 * structure must be initialized with the version of the interface to use.
 
1394
 * The server will return pointer to VRDEENTRYPOINTS_* table in *ppEntryPoints
 
1395
 * to match the requested interface.
 
1396
 * That is if pCallbacks->header.u64Version == VRDE_INTERFACE_VERSION_1, then the server
 
1397
 * expects pCallbacks to point to VRDECALLBACKS_1 and will return a pointer to VRDEENTRYPOINTS_1.
 
1398
 *
 
1399
 * @param pCallback     Pointer to the application callbacks which let the server to fetch
 
1400
 *                      the configuration data and to access the desktop.
 
1401
 * @param pvCallback    The callback specific pointer to be passed back to the application.
 
1402
 * @param ppEntryPoints Where to store the pointer to the VRDE entry points structure.
 
1403
 * @param phServer      Pointer to the created server instance handle.
 
1404
 *
 
1405
 * @return IPRT status code.
 
1406
 */
 
1407
DECLEXPORT(int) VRDECreateServer (const VRDEINTERFACEHDR *pCallbacks,
 
1408
                                    void *pvCallback,
 
1409
                                    VRDEINTERFACEHDR **ppEntryPoints,
 
1410
                                    HVRDESERVER *phServer);
 
1411
 
 
1412
typedef DECLCALLBACK(int) FNVRDECREATESERVER (const VRDEINTERFACEHDR *pCallbacks,
 
1413
                                              void *pvCallback,
 
1414
                                              VRDEINTERFACEHDR **ppEntryPoints,
 
1415
                                              HVRDESERVER *phServer);
 
1416
typedef FNVRDECREATESERVER *PFNVRDECREATESERVER;
 
1417
 
 
1418
/**
 
1419
 * List of names of the VRDE properties, which are recognized by the VRDE.
 
1420
 *
 
1421
 * @returns pointer to array of pointers to name strings (UTF8).
 
1422
 */
 
1423
DECLEXPORT(const char * const *) VRDESupportedProperties (void);
 
1424
 
 
1425
typedef DECLCALLBACK(const char * const *) FNVRDESUPPORTEDPROPERTIES (void);
 
1426
typedef FNVRDESUPPORTEDPROPERTIES *PFNVRDESUPPORTEDPROPERTIES;
 
1427
 
 
1428
RT_C_DECLS_END
 
1429
 
 
1430
/** @} */
 
1431
 
 
1432
#endif