vbox_tmpl.c 78.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/** @file vbox_tmpl.c
 * Template File to support multiple versions of VirtualBox
 * at runtime :).
 *
 * IMPORTANT:
 * Please dont include this file in the src/Makefile.am, it
 * is automatically include by other files.
 */

/*
11
 * Copyright (C) 2010-2014 Red Hat, Inc.
12 13 14 15 16
 * Copyright (C) 2008-2009 Sun Microsystems, Inc.
 *
 * This file is part of a free software library; you can redistribute
 * it and/or modify it under the terms of the GNU Lesser General
 * Public License version 2.1 as published by the Free Software
17
 * Foundation and shipped in the "COPYING.LESSER" file with this library.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
 * The library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY of any kind.
 *
 * Sun LGPL Disclaimer: For the avoidance of doubt, except that if
 * any license choice other than GPL or LGPL is available it will
 * apply instead, Sun elects to use only the Lesser General Public
 * License version 2.1 (LGPLv2) at this time for any software where
 * a choice of LGPL license versions is made available with the
 * language indicating that LGPLv2 or any later version may be used,
 * or where a choice of which version of the LGPL is applied is
 * otherwise unspecified.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 USA or visit http://www.sun.com if you need
 * additional information or have any questions.
 */

#include <config.h>

37
#include <unistd.h>
38 39 40
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
41 42 43 44

#include "internal.h"
#include "datatypes.h"
#include "domain_conf.h"
45
#include "domain_event.h"
46
#include "viralloc.h"
47
#include "virlog.h"
48
#include "virstring.h"
49
#include "virutil.h"
50 51

/* This one changes from version to version. */
52
#if VBOX_API_VERSION == 4000000
53
# include "vbox_CAPI_v4_0.h"
54
#elif VBOX_API_VERSION == 4001000
55
# include "vbox_CAPI_v4_1.h"
56
#elif VBOX_API_VERSION == 4002000
57
# include "vbox_CAPI_v4_2.h"
58 59 60
#elif VBOX_API_VERSION == 4002020
# include "vbox_CAPI_v4_2_20.h"
#elif VBOX_API_VERSION == 4003000
R
Ryota Ozaki 已提交
61
# include "vbox_CAPI_v4_3.h"
62 63
#elif VBOX_API_VERSION == 4003004
# include "vbox_CAPI_v4_3_4.h"
M
Martin Pietsch 已提交
64 65
#elif VBOX_API_VERSION == 5000000
# include "vbox_CAPI_v5_0.h"
66 67
#elif VBOX_API_VERSION == 5001000
# include "vbox_CAPI_v5_1.h"
68 69
#else
# error "Unsupport VBOX_API_VERSION"
70 71
#endif

72
/* Include this *last* or we'll get the wrong vbox_CAPI_*.h. */
73
#include "vbox_glue.h"
T
Taowei 已提交
74 75 76 77 78 79 80

#if VBOX_API_VERSION < 4003000
typedef IUSBController IUSBCommon;
#else /* VBOX_API_VERSION >= 4003000 */
typedef IUSBDeviceFilters IUSBCommon;
#endif /* VBOX_API_VERSION >= 4003000 */

T
Taowei 已提交
81

T
Taowei 已提交
82
#include "vbox_uniformed_api.h"
83

84
#define VIR_FROM_THIS                   VIR_FROM_VBOX
85 86 87

VIR_LOG_INIT("vbox.vbox_tmpl");

T
Taowei 已提交
88 89 90
#define vboxUnsupported() \
    VIR_WARN("No %s in current vbox version %d.", __FUNCTION__, VBOX_API_VERSION);

J
John Ferlan 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#define VBOX_UTF16_FREE(arg)                                            \
    do {                                                                \
        if (arg) {                                                      \
            data->pFuncs->pfnUtf16Free(arg);                            \
            (arg) = NULL;                                               \
        }                                                               \
    } while (0)

#define VBOX_UTF8_FREE(arg)                                             \
    do {                                                                \
        if (arg) {                                                      \
            data->pFuncs->pfnUtf8Free(arg);                             \
            (arg) = NULL;                                               \
        }                                                               \
    } while (0)

107 108 109
#define VBOX_UTF16_TO_UTF8(arg1, arg2)  data->pFuncs->pfnUtf16ToUtf8(arg1, arg2)
#define VBOX_UTF8_TO_UTF16(arg1, arg2)  data->pFuncs->pfnUtf8ToUtf16(arg1, arg2)

110 111 112 113 114 115 116
#define VBOX_RELEASE(arg)                                                     \
    do {                                                                      \
        if (arg) {                                                            \
            (arg)->vtbl->nsisupports.Release((nsISupports *)(arg));           \
            (arg) = NULL;                                                     \
        }                                                                     \
    } while (0)
117

118
#define VBOX_MEDIUM_RELEASE(arg) VBOX_RELEASE(arg)
119

120 121 122 123
#define DEBUGPRUnichar(msg, strUtf16) \
if (strUtf16) {\
    char *strUtf8 = NULL;\
\
124
    data->pFuncs->pfnUtf16ToUtf8(strUtf16, &strUtf8);\
125
    if (strUtf8) {\
126
        VIR_DEBUG("%s: %s", msg, strUtf8);\
127
        data->pFuncs->pfnUtf8Free(strUtf8);\
128 129 130 131 132
    }\
}

#define DEBUGUUID(msg, iid) \
{\
T
Taowei 已提交
133
    VIR_DEBUG("%s: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", msg,\
134 135 136 137 138 139 140 141 142 143 144 145 146
          (unsigned)(iid)->m0,\
          (unsigned)(iid)->m1,\
          (unsigned)(iid)->m2,\
          (unsigned)(iid)->m3[0],\
          (unsigned)(iid)->m3[1],\
          (unsigned)(iid)->m3[2],\
          (unsigned)(iid)->m3[3],\
          (unsigned)(iid)->m3[4],\
          (unsigned)(iid)->m3[5],\
          (unsigned)(iid)->m3[6],\
          (unsigned)(iid)->m3[7]);\
}\

147
#define VBOX_SESSION_OPEN(/* unused */ iid_value, /* in */ machine) \
148 149
    machine->vtbl->LockMachine(machine, data->vboxSession, LockType_Write)

150
#define VBOX_SESSION_CLOSE() \
151 152
    data->vboxSession->vtbl->UnlockMachine(data->vboxSession)

153
#define VBOX_IID_INITIALIZER { NULL, true }
154 155

static void
156
_vboxIIDUnalloc(vboxDriverPtr data, vboxIID *iid)
157
{
158
    if (iid->value != NULL && iid->owner)
159 160 161 162
        data->pFuncs->pfnUtf16Free(iid->value);

    iid->value = NULL;
    iid->owner = true;
163 164
}

T
Taowei 已提交
165
static void
166 167
_vboxIIDToUUID(vboxDriverPtr data, vboxIID *iid,
               unsigned char *uuid)
168 169 170 171 172
{
    char *utf8 = NULL;

    data->pFuncs->pfnUtf16ToUtf8(iid->value, &utf8);

173
    ignore_value(virUUIDParse(utf8, uuid));
174 175

    data->pFuncs->pfnUtf8Free(utf8);
176 177
}

T
Taowei 已提交
178
static void
179 180
_vboxIIDFromUUID(vboxDriverPtr data, vboxIID *iid,
                 const unsigned char *uuid)
181 182
{
    char utf8[VIR_UUID_STRING_BUFLEN];
183

184
    _vboxIIDUnalloc(data, iid);
185

186
    virUUIDFormat(uuid, utf8);
187

188 189
    data->pFuncs->pfnUtf8ToUtf16(utf8, &iid->value);
}
190

191
static bool
192 193
_vboxIIDIsEqual(vboxDriverPtr data, vboxIID *iid1,
                vboxIID *iid2)
194 195 196
{
    unsigned char uuid1[VIR_UUID_BUFLEN];
    unsigned char uuid2[VIR_UUID_BUFLEN];
197 198

    /* Note: we can't directly compare the utf8 strings here
E
Eric Blake 已提交
199
     * cause the two UUID's may have separators as space or '-'
200 201
     * or mixture of both and we don't want to fail here by
     * using direct string comparison. Here virUUIDParse() takes
202
     * care of these cases. */
203 204
    _vboxIIDToUUID(data, iid1, uuid1);
    _vboxIIDToUUID(data, iid2, uuid2);
205

206 207
    return memcmp(uuid1, uuid2, VIR_UUID_BUFLEN) == 0;
}
208

209
static void
210 211
_vboxIIDFromArrayItem(vboxDriverPtr data, vboxIID *iid,
                      vboxArray *array, int idx)
212
{
213
    _vboxIIDUnalloc(data, iid);
214

215 216
    iid->value = array->items[idx];
    iid->owner = false;
217 218
}

219 220 221 222
#define vboxIIDUnalloc(iid) _vboxIIDUnalloc(data, iid)
#define vboxIIDToUUID(iid, uuid) _vboxIIDToUUID(data, iid, uuid)
#define vboxIIDFromUUID(iid, uuid) _vboxIIDFromUUID(data, iid, uuid)
#define vboxIIDIsEqual(iid1, iid2) _vboxIIDIsEqual(data, iid1, iid2)
223
#define vboxIIDFromArrayItem(iid, array, idx) \
224
    _vboxIIDFromArrayItem(data, iid, array, idx)
225
#define DEBUGIID(msg, strUtf16) DEBUGPRUnichar(msg, strUtf16)
226 227 228 229

/**
 * Converts Utf-16 string to int
 */
230
static int PRUnicharToInt(PCVBOXXPCOM pFuncs, PRUnichar *strUtf16)
231
{
232 233 234 235 236 237
    char *strUtf8 = NULL;
    int ret = 0;

    if (!strUtf16)
        return -1;

238
    pFuncs->pfnUtf16ToUtf8(strUtf16, &strUtf8);
239 240 241
    if (!strUtf8)
        return -1;

242 243 244
    if (virStrToLong_i(strUtf8, NULL, 10, &ret) < 0)
        ret = -1;

245
    pFuncs->pfnUtf8Free(strUtf8);
246 247 248 249 250 251 252

    return ret;
}

/**
 * Converts int to Utf-16 string
 */
253
static PRUnichar *PRUnicharFromInt(PCVBOXXPCOM pFuncs, int n) {
254 255 256 257 258
    PRUnichar *strUtf16 = NULL;
    char s[24];

    snprintf(s, sizeof(s), "%d", n);

259
    pFuncs->pfnUtf8ToUtf16(s, &strUtf16);
260 261 262 263

    return strUtf16;
}

T
Taowei 已提交
264
static virDomainState _vboxConvertState(PRUint32 state)
265
{
266 267 268 269 270 271 272 273 274 275
    switch (state) {
        case MachineState_Running:
            return VIR_DOMAIN_RUNNING;
        case MachineState_Stuck:
            return VIR_DOMAIN_BLOCKED;
        case MachineState_Paused:
            return VIR_DOMAIN_PAUSED;
        case MachineState_Stopping:
            return VIR_DOMAIN_SHUTDOWN;
        case MachineState_PoweredOff:
R
Ryota Ozaki 已提交
276
        case MachineState_Saved:
277 278 279 280 281 282 283 284 285
            return VIR_DOMAIN_SHUTOFF;
        case MachineState_Aborted:
            return VIR_DOMAIN_CRASHED;
        case MachineState_Null:
        default:
            return VIR_DOMAIN_NOSTATE;
    }
}

J
Jiri Denemark 已提交
286
static int
287
_vboxDomainSnapshotRestore(virDomainPtr dom,
J
Jiri Denemark 已提交
288 289 290
                          IMachine *machine,
                          ISnapshot *snapshot)
{
291
    vboxDriverPtr data = dom->conn->privateData;
292
#if VBOX_API_VERSION < 5000000
J
Jiri Denemark 已提交
293
    IConsole *console = NULL;
294
#endif /*VBOX_API_VERSION < 5000000*/
J
Jiri Denemark 已提交
295 296 297 298
    IProgress *progress = NULL;
    PRUint32 state;
    nsresult rc;
    PRInt32 result;
299
    vboxIID domiid = VBOX_IID_INITIALIZER;
T
Taowei Luo 已提交
300 301 302 303
    int ret = -1;

    if (!data->vboxObj)
        return ret;
J
Jiri Denemark 已提交
304

305 306
    rc = machine->vtbl->GetId(machine, &domiid.value);
    if (NS_FAILED(rc)) {
307 308
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("could not get domain UUID"));
J
Jiri Denemark 已提交
309 310 311 312 313
        goto cleanup;
    }

    rc = machine->vtbl->GetState(machine, &state);
    if (NS_FAILED(rc)) {
314 315
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("could not get domain state"));
J
Jiri Denemark 已提交
316 317 318 319 320
        goto cleanup;
    }

    if (state >= MachineState_FirstOnline
        && state <= MachineState_LastOnline) {
321 322
        virReportError(VIR_ERR_OPERATION_INVALID,
                       _("domain %s is already running"), dom->name);
J
Jiri Denemark 已提交
323 324 325
        goto cleanup;
    }

326
    rc = VBOX_SESSION_OPEN(domiid.value, machine);
327
#if VBOX_API_VERSION < 5000000
J
Jiri Denemark 已提交
328 329
    if (NS_SUCCEEDED(rc))
        rc = data->vboxSession->vtbl->GetConsole(data->vboxSession, &console);
330
#endif /*VBOX_API_VERSION < 5000000*/
J
Jiri Denemark 已提交
331
    if (NS_FAILED(rc)) {
332 333 334
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("could not open VirtualBox session with domain %s"),
                       dom->name);
J
Jiri Denemark 已提交
335 336 337
        goto cleanup;
    }

338
#if VBOX_API_VERSION < 5000000
J
Jiri Denemark 已提交
339
    rc = console->vtbl->RestoreSnapshot(console, snapshot, &progress);
340
#elif VBOX_API_VERSION >= 5000000  /*VBOX_API_VERSION < 5000000*/
M
Martin Pietsch 已提交
341
    rc = machine->vtbl->RestoreSnapshot(machine, snapshot, &progress);
342
#endif /*VBOX_API_VERSION >= 5000000*/
M
Martin Pietsch 已提交
343

J
Jiri Denemark 已提交
344 345
    if (NS_FAILED(rc) || !progress) {
        if (rc == VBOX_E_INVALID_VM_STATE) {
346 347
            virReportError(VIR_ERR_OPERATION_INVALID, "%s",
                           _("cannot restore domain snapshot for running domain"));
J
Jiri Denemark 已提交
348
        } else {
349 350 351
            virReportError(VIR_ERR_INTERNAL_ERROR,
                           _("could not restore snapshot for domain %s"),
                           dom->name);
J
Jiri Denemark 已提交
352 353 354 355 356 357 358
        }
        goto cleanup;
    }

    progress->vtbl->WaitForCompletion(progress, -1);
    progress->vtbl->GetResultCode(progress, &result);
    if (NS_FAILED(result)) {
359 360
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("could not restore snapshot for domain %s"), dom->name);
J
Jiri Denemark 已提交
361 362 363 364 365
        goto cleanup;
    }

    ret = 0;

366
 cleanup:
J
Jiri Denemark 已提交
367
    VBOX_RELEASE(progress);
368
#if VBOX_API_VERSION < 5000000
J
Jiri Denemark 已提交
369
    VBOX_RELEASE(console);
370
#endif /*VBOX_API_VERSION < 5000000*/
371
    VBOX_SESSION_CLOSE();
372
    vboxIIDUnalloc(&domiid);
J
Jiri Denemark 已提交
373 374 375
    return ret;
}

376
static nsresult
377
_unregisterMachine(vboxDriverPtr data, vboxIID *iid, IMachine **machine)
T
Taowei 已提交
378 379
{
    nsresult rc;
380
    vboxArray media = VBOX_ARRAY_INITIALIZER;
381
    rc = data->vboxObj->vtbl->FindMachine(data->vboxObj, iid->value, machine);
382 383 384 385 386
    if (NS_FAILED(rc)) {
        virReportError(VIR_ERR_NO_DOMAIN, "%s",
                       _("no domain with matching uuid"));
        return rc;
    }
T
Taowei 已提交
387

388 389 390 391 392 393 394 395 396
    /* We're not interested in the array returned by the Unregister method,
     * but in the side effect of unregistering the virtual machine. In order
     * to call the Unregister method correctly we need to use the vboxArray
     * wrapper here. */
    rc = vboxArrayGetWithUintArg(&media, *machine, (*machine)->vtbl->Unregister,
                                 CleanupMode_DetachAllReturnNone);
    vboxArrayUnalloc(&media);
    return rc;
}
T
Taowei 已提交
397

398 399 400 401
static void
_deleteConfig(IMachine *machine)
{
    IProgress *progress = NULL;
T
Taowei 已提交
402

403 404 405 406 407 408 409 410 411 412
    /* The IMachine Delete method takes an array of IMedium items to be
     * deleted along with the virtual machine. We just want to pass an
     * empty array. But instead of adding a full vboxArraySetWithReturn to
     * the glue layer (in order to handle the required signature of the
     * Delete method) we use a local solution here. */
#ifdef WIN32
    SAFEARRAY *safeArray = NULL;
    typedef HRESULT __stdcall (*IMachine_Delete)(IMachine *self,
                                                 SAFEARRAY **media,
                                                 IProgress **progress);
T
Taowei 已提交
413

414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
# if VBOX_API_VERSION < 4003000
    ((IMachine_Delete)machine->vtbl->Delete)(machine, &safeArray, &progress);
# else
    ((IMachine_Delete)machine->vtbl->DeleteConfig)(machine, &safeArray, &progress);
# endif
#else
    /* XPCOM doesn't like NULL as an array, even when the array size is 0.
     * Instead pass it a dummy array to avoid passing NULL. */
    IMedium *array[] = { NULL };
# if VBOX_API_VERSION < 4003000
    machine->vtbl->Delete(machine, 0, array, &progress);
# else
    machine->vtbl->DeleteConfig(machine, 0, array, &progress);
# endif
#endif
    if (progress != NULL) {
        progress->vtbl->WaitForCompletion(progress, -1);
        VBOX_RELEASE(progress);
    }
T
Taowei 已提交
433 434
}

435
static int _pfnInitialize(vboxDriverPtr driver)
T
Taowei 已提交
436
{
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
    if (!(driver->pFuncs = g_pfnGetFunctions(VBOX_XPCOMC_VERSION)))
        return -1;
#if VBOX_API_VERSION == 4002020 || VBOX_API_VERSION >= 4004004
    nsresult rc;

    rc = driver->pFuncs->pfnClientInitialize(IVIRTUALBOXCLIENT_IID_STR,
                                             &driver->vboxClient);

    if (NS_FAILED(rc)) {
        return -1;
    } else {
        driver->vboxClient->vtbl->GetVirtualBox(driver->vboxClient, &driver->vboxObj);
        driver->vboxClient->vtbl->GetSession(driver->vboxClient, &driver->vboxSession);
    }
#else
    driver->pFuncs->pfnComInitialize(IVIRTUALBOX_IID_STR, &driver->vboxObj,
                                     ISESSION_IID_STR, &driver->vboxSession);
#endif

    return 0;
}

static void _pfnUninitialize(vboxDriverPtr data)
{
    if (data->pFuncs) {
#if VBOX_API_VERSION == 4002020 || VBOX_API_VERSION >= 4003004
        VBOX_RELEASE(data->vboxObj);
        VBOX_RELEASE(data->vboxSession);
        VBOX_RELEASE(data->vboxClient);

        data->pFuncs->pfnClientUninitialize();
#else
T
Taowei 已提交
469
        data->pFuncs->pfnComUninitialize();
470 471
#endif
    }
472
}
473

T
Taowei 已提交
474
static void _pfnComUnallocMem(PCVBOXXPCOM pFuncs, void *pv)
475
{
T
Taowei 已提交
476 477
    pFuncs->pfnComUnallocMem(pv);
}
478

T
Taowei 已提交
479 480 481 482
static void _pfnUtf16Free(PCVBOXXPCOM pFuncs, PRUnichar *pwszString)
{
    pFuncs->pfnUtf16Free(pwszString);
}
E
Eric Blake 已提交
483

T
Taowei 已提交
484 485 486 487
static void _pfnUtf8Free(PCVBOXXPCOM pFuncs, char *pszString)
{
    pFuncs->pfnUtf8Free(pszString);
}
488

T
Taowei 已提交
489 490 491 492
static int _pfnUtf16ToUtf8(PCVBOXXPCOM pFuncs, const PRUnichar *pwszString, char **ppszString)
{
    return pFuncs->pfnUtf16ToUtf8(pwszString, ppszString);
}
493

T
Taowei 已提交
494 495 496 497
static int _pfnUtf8ToUtf16(PCVBOXXPCOM pFuncs, const char *pszString, PRUnichar **ppwszString)
{
    return pFuncs->pfnUtf8ToUtf16(pszString, ppwszString);
}
498

499
static void _vboxIIDInitialize(vboxIID *iid)
T
Taowei 已提交
500
{
501 502
    memset(iid, 0, sizeof(vboxIID));
    iid->owner = true;
T
Taowei 已提交
503
}
504

505
static void _DEBUGIID(vboxDriverPtr data, const char *msg, vboxIID *iid)
T
Taowei 已提交
506
{
507
    DEBUGPRUnichar(msg, iid->value);
T
Taowei 已提交
508
}
509

510
static void
511
_vboxIIDToUtf8(vboxDriverPtr data ATTRIBUTE_UNUSED,
512
               vboxIID *iid ATTRIBUTE_UNUSED,
513 514
               char **utf8 ATTRIBUTE_UNUSED)
{
515
    data->pFuncs->pfnUtf16ToUtf8(iid->value, utf8);
516 517
}

518
static nsresult
519
_vboxArrayGetWithIIDArg(vboxArray *array, void *self, void *getter, vboxIID *iid)
520
{
521
    return vboxArrayGetWithPtrArg(array, self, getter, iid->value);
522 523
}

T
Taowei 已提交
524 525 526 527
static void* _handleGetMachines(IVirtualBox *vboxObj)
{
    return vboxObj->vtbl->GetMachines;
}
528

529 530 531 532 533
static void* _handleGetHardDisks(IVirtualBox *vboxObj)
{
    return vboxObj->vtbl->GetHardDisks;
}

T
Taowei 已提交
534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
static void* _handleUSBGetDeviceFilters(IUSBCommon *USBCommon)
{
    return USBCommon->vtbl->GetDeviceFilters;
}

static void* _handleMachineGetMediumAttachments(IMachine *machine)
{
    return machine->vtbl->GetMediumAttachments;
}

static void* _handleMachineGetSharedFolders(IMachine *machine)
{
    return machine->vtbl->GetSharedFolders;
}

549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
static void* _handleSnapshotGetChildren(ISnapshot *snapshot)
{
    return snapshot->vtbl->GetChildren;
}

static void* _handleMediumGetChildren(IMedium *medium ATTRIBUTE_UNUSED)
{
    return medium->vtbl->GetChildren;
}

static void* _handleMediumGetSnapshotIds(IMedium *medium)
{
    return medium->vtbl->GetSnapshotIds;
}

T
Taowei Luo 已提交
564 565 566 567 568
static void* _handleMediumGetMachineIds(IMedium *medium)
{
    return medium->vtbl->GetMachineIds;
}

T
Taowei 已提交
569 570 571 572 573
static void* _handleHostGetNetworkInterfaces(IHost *host)
{
    return host->vtbl->GetNetworkInterfaces;
}

T
Taowei 已提交
574 575 576 577
static nsresult _nsisupportsRelease(nsISupports *nsi)
{
    return nsi->vtbl->Release(nsi);
}
578

579 580 581 582 583
static nsresult _nsisupportsAddRef(nsISupports *nsi)
{
    return nsi->vtbl->AddRef(nsi);
}

T
Taowei 已提交
584 585 586 587 588
static nsresult
_virtualboxGetVersion(IVirtualBox *vboxObj, PRUnichar **versionUtf16)
{
    return vboxObj->vtbl->GetVersion(vboxObj, versionUtf16);
}
589

T
Taowei 已提交
590
static nsresult
591
_virtualboxGetMachine(IVirtualBox *vboxObj, vboxIID *iid, IMachine **machine)
T
Taowei 已提交
592
{
593
    return vboxObj->vtbl->FindMachine(vboxObj, iid->value, machine);
594
}
T
Taowei 已提交
595

596 597 598 599 600 601
static nsresult
_virtualboxOpenMachine(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine)
{
    return vboxObj->vtbl->OpenMachine(vboxObj, settingsFile, machine);
}

T
Taowei 已提交
602 603 604 605 606
static nsresult
_virtualboxGetSystemProperties(IVirtualBox *vboxObj, ISystemProperties **systemProperties)
{
    return vboxObj->vtbl->GetSystemProperties(vboxObj, systemProperties);
}
607

T
Taowei 已提交
608 609 610 611 612 613
static nsresult
_virtualboxGetHost(IVirtualBox *vboxObj, IHost **host)
{
    return vboxObj->vtbl->GetHost(vboxObj, host);
}

T
Taowei 已提交
614
static nsresult
615
_virtualboxCreateMachine(vboxDriverPtr data, virDomainDefPtr def, IMachine **machine, char *uuidstr ATTRIBUTE_UNUSED)
616 617
{
    vboxIID iid = VBOX_IID_INITIALIZER;
T
Taowei 已提交
618
    PRUnichar *machineNameUtf16 = NULL;
619
    nsresult rc = -1;
620

T
Taowei 已提交
621 622 623
    VBOX_UTF8_TO_UTF16(def->name, &machineNameUtf16);
    vboxIIDFromUUID(&iid, def->uuid);
    {
624
#if VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000
625
        PRBool override = PR_FALSE;
T
Taowei 已提交
626 627 628 629 630 631 632 633
        rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj,
                                                NULL,
                                                machineNameUtf16,
                                                NULL,
                                                iid.value,
                                                override,
                                                machine);
#else /* VBOX_API_VERSION >= 4002000 */
634
        char *createFlags = NULL;
T
Taowei 已提交
635 636
        PRUnichar *createFlagsUtf16 = NULL;

637 638 639
        if (virAsprintf(&createFlags,
                        "UUID=%s,forceOverwrite=0", uuidstr) < 0)
            goto cleanup;
T
Taowei 已提交
640 641 642 643 644 645 646 647 648
        VBOX_UTF8_TO_UTF16(createFlags, &createFlagsUtf16);
        rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj,
                                                NULL,
                                                machineNameUtf16,
                                                0,
                                                nsnull,
                                                nsnull,
                                                createFlagsUtf16,
                                                machine);
649 650
 cleanup:
        VIR_FREE(createFlags);
T
Taowei 已提交
651
#endif /* VBOX_API_VERSION >= 4002000 */
652
    }
T
Taowei 已提交
653 654 655 656
    VBOX_UTF16_FREE(machineNameUtf16);
    vboxIIDUnalloc(&iid);
    return rc;
}
657

658
static nsresult
659
_virtualboxCreateHardDisk(IVirtualBox *vboxObj, PRUnichar *format,
660
                          PRUnichar *location, IMedium **medium)
661
{
662 663 664
    /* In vbox 2.2 and 3.0, this function will create a IHardDisk object.
     * In vbox 3.1 and later, this function will create a IMedium object.
     */
M
Martin Pietsch 已提交
665
#if VBOX_API_VERSION < 5000000
666
    return vboxObj->vtbl->CreateHardDisk(vboxObj, format, location, medium);
M
Martin Pietsch 已提交
667
#elif VBOX_API_VERSION >= 5000000 /*VBOX_API_VERSION >= 5000000*/
668
    return vboxObj->vtbl->CreateMedium(vboxObj, format, location, AccessMode_ReadWrite, DeviceType_HardDisk, medium);
M
Martin Pietsch 已提交
669
#endif /*VBOX_API_VERSION >= 5000000*/
670 671
}

T
Taowei 已提交
672 673 674 675 676
static nsresult
_virtualboxRegisterMachine(IVirtualBox *vboxObj, IMachine *machine)
{
    return vboxObj->vtbl->RegisterMachine(vboxObj, machine);
}
677

T
Taowei 已提交
678
static nsresult
679 680 681
_virtualboxFindHardDisk(IVirtualBox *vboxObj, PRUnichar *location,
                        PRUint32 deviceType ATTRIBUTE_UNUSED,
                        PRUint32 accessMode ATTRIBUTE_UNUSED,
682
                        IMedium **medium)
T
Taowei 已提交
683
{
684
#if VBOX_API_VERSION < 4002000
T
Taowei 已提交
685
    return vboxObj->vtbl->FindMedium(vboxObj, location,
686
                                     deviceType, medium);
687
#else /* VBOX_API_VERSION >= 4002000 */
T
Taowei 已提交
688
    return vboxObj->vtbl->OpenMedium(vboxObj, location,
689
                                     deviceType, accessMode, PR_FALSE, medium);
690
#endif /* VBOX_API_VERSION >= 4002000 */
T
Taowei 已提交
691
}
692

T
Taowei 已提交
693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712
static nsresult
_virtualboxOpenMedium(IVirtualBox *vboxObj ATTRIBUTE_UNUSED,
                      PRUnichar *location ATTRIBUTE_UNUSED,
                      PRUint32 deviceType ATTRIBUTE_UNUSED,
                      PRUint32 accessMode ATTRIBUTE_UNUSED,
                      IMedium **medium ATTRIBUTE_UNUSED)
{
#if VBOX_API_VERSION == 4000000
    return vboxObj->vtbl->OpenMedium(vboxObj,
                                     location,
                                     deviceType, accessMode,
                                     medium);
#elif VBOX_API_VERSION >= 4001000
    return vboxObj->vtbl->OpenMedium(vboxObj,
                                     location,
                                     deviceType, accessMode,
                                     false,
                                     medium);
#endif
}
713

714
static nsresult
715
_virtualboxGetHardDiskByIID(IVirtualBox *vboxObj, vboxIID *iid, IMedium **medium)
716
{
717
#if VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000
718
    return vboxObj->vtbl->FindMedium(vboxObj, iid->value, DeviceType_HardDisk,
719
                                     medium);
720
#else /* VBOX_API_VERSION >= 4002000 */
721
    return vboxObj->vtbl->OpenMedium(vboxObj, iid->value, DeviceType_HardDisk,
722
                                     AccessMode_ReadWrite, PR_FALSE, medium);
723 724 725
#endif /* VBOX_API_VERSION >= 4002000 */
}

T
Taowei 已提交
726 727 728 729 730 731 732 733 734 735 736 737
static nsresult
_virtualboxFindDHCPServerByNetworkName(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server)
{
    return vboxObj->vtbl->FindDHCPServerByNetworkName(vboxObj, name, server);
}

static nsresult
_virtualboxCreateDHCPServer(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server)
{
    return vboxObj->vtbl->CreateDHCPServer(vboxObj, name, server);
}

T
Taowei 已提交
738 739 740 741 742 743
static nsresult
_virtualboxRemoveDHCPServer(IVirtualBox *vboxObj, IDHCPServer *server)
{
    return vboxObj->vtbl->RemoveDHCPServer(vboxObj, server);
}

T
Taowei 已提交
744 745 746 747 748 749 750 751
static nsresult
_machineAddStorageController(IMachine *machine, PRUnichar *name,
                             PRUint32 connectionType,
                             IStorageController **controller)
{
    return machine->vtbl->AddStorageController(machine, name, connectionType,
                                               controller);
}
752

T
Taowei 已提交
753 754 755 756 757 758 759 760
static nsresult
_machineGetStorageControllerByName(IMachine *machine, PRUnichar *name,
                                   IStorageController **storageController)
{
    return machine->vtbl->GetStorageControllerByName(machine, name,
                                                     storageController);
}

T
Taowei 已提交
761 762 763 764 765 766 767 768 769 770 771
static nsresult
_machineAttachDevice(IMachine *machine ATTRIBUTE_UNUSED,
                     PRUnichar *name ATTRIBUTE_UNUSED,
                     PRInt32 controllerPort ATTRIBUTE_UNUSED,
                     PRInt32 device ATTRIBUTE_UNUSED,
                     PRUint32 type ATTRIBUTE_UNUSED,
                     IMedium * medium ATTRIBUTE_UNUSED)
{
    return machine->vtbl->AttachDevice(machine, name, controllerPort,
                                       device, type, medium);
}
772

T
Taowei 已提交
773 774 775 776 777 778 779 780
static nsresult
_machineCreateSharedFolder(IMachine *machine, PRUnichar *name,
                           PRUnichar *hostPath, PRBool writable,
                           PRBool automount ATTRIBUTE_UNUSED)
{
    return machine->vtbl->CreateSharedFolder(machine, name, hostPath,
                                             writable, automount);
}
781

T
Taowei 已提交
782 783 784 785 786 787
static nsresult
_machineRemoveSharedFolder(IMachine *machine, PRUnichar *name)
{
    return machine->vtbl->RemoveSharedFolder(machine, name);
}

T
Taowei 已提交
788
static nsresult
789
_machineLaunchVMProcess(vboxDriverPtr data,
T
Taowei 已提交
790
                        IMachine *machine ATTRIBUTE_UNUSED,
791
                        vboxIID *iid ATTRIBUTE_UNUSED,
T
Taowei 已提交
792 793 794 795 796 797
                        PRUnichar *sessionType, PRUnichar *env,
                        IProgress **progress)
{
    return machine->vtbl->LaunchVMProcess(machine, data->vboxSession,
                                          sessionType, env, progress);
}
798

799 800 801 802 803 804 805 806 807
static nsresult
_machineUnregister(IMachine *machine ATTRIBUTE_UNUSED,
                   PRUint32 cleanupMode ATTRIBUTE_UNUSED,
                   PRUint32 *aMediaSize ATTRIBUTE_UNUSED,
                   IMedium ***aMedia ATTRIBUTE_UNUSED)
{
    return machine->vtbl->Unregister(machine, cleanupMode, aMediaSize, aMedia);
}

808
static nsresult
809
_machineFindSnapshot(IMachine *machine, vboxIID *iid, ISnapshot **snapshot)
810
{
811
    return machine->vtbl->FindSnapshot(machine, iid->value, snapshot);
812 813
}

T
Taowei Luo 已提交
814 815 816 817 818 819 820
static nsresult
_machineDetachDevice(IMachine *machine, PRUnichar *name,
                     PRInt32 controllerPort, PRInt32 device)
{
    return machine->vtbl->DetachDevice(machine, name, controllerPort, device);
}

T
Taowei 已提交
821 822 823 824 825
static nsresult
_machineGetAccessible(IMachine *machine, PRBool *isAccessible)
{
    return machine->vtbl->GetAccessible(machine, isAccessible);
}
826

T
Taowei 已提交
827 828 829 830 831
static nsresult
_machineGetState(IMachine *machine, PRUint32 *state)
{
    return machine->vtbl->GetState(machine, state);
}
832

T
Taowei 已提交
833 834 835 836 837
static nsresult
_machineGetName(IMachine *machine, PRUnichar **name)
{
    return machine->vtbl->GetName(machine, name);
}
838

T
Taowei 已提交
839
static nsresult
840
_machineGetId(IMachine *machine, vboxIID *iid)
T
Taowei 已提交
841
{
842
    return machine->vtbl->GetId(machine, &iid->value);
T
Taowei 已提交
843
}
844

T
Taowei 已提交
845 846 847 848 849
static nsresult
_machineGetBIOSSettings(IMachine *machine, IBIOSSettings **bios)
{
    return machine->vtbl->GetBIOSSettings(machine, bios);
}
850

T
Taowei 已提交
851 852 853 854 855
static nsresult
_machineGetAudioAdapter(IMachine *machine, IAudioAdapter **audioadapter)
{
    return machine->vtbl->GetAudioAdapter(machine, audioadapter);
}
856

T
Taowei 已提交
857 858 859 860 861
static nsresult
_machineGetNetworkAdapter(IMachine *machine, PRUint32 slot, INetworkAdapter **adapter)
{
    return machine->vtbl->GetNetworkAdapter(machine, slot, adapter);
}
862

T
Taowei 已提交
863 864 865 866 867
static nsresult
_machineGetChipsetType(IMachine *machine ATTRIBUTE_UNUSED, PRUint32 *chipsetType ATTRIBUTE_UNUSED)
{
    return machine->vtbl->GetChipsetType(machine, chipsetType);
}
868

T
Taowei 已提交
869 870 871 872
static nsresult
_machineGetSerialPort(IMachine *machine, PRUint32 slot, ISerialPort **port)
{
    return machine->vtbl->GetSerialPort(machine, slot, port);
873 874
}

T
Taowei 已提交
875 876 877 878 879
static nsresult
_machineGetParallelPort(IMachine *machine, PRUint32 slot, IParallelPort **port)
{
    return machine->vtbl->GetParallelPort(machine, slot, port);
}
880

T
Taowei 已提交
881
static nsresult
882
_machineGetVRDEServer(IMachine *machine, IVRDEServer **VRDEServer)
883
{
884
    return machine->vtbl->GetVRDEServer(machine, VRDEServer);
885 886
}

T
Taowei 已提交
887 888 889 890 891 892 893 894 895
static nsresult
_machineGetUSBCommon(IMachine *machine, IUSBCommon **USBCommon)
{
#if VBOX_API_VERSION < 4003000
    return machine->vtbl->GetUSBController(machine, USBCommon);
#else
    return machine->vtbl->GetUSBDeviceFilters(machine, USBCommon);
#endif
}
896

897 898 899 900 901 902 903 904 905 906 907 908
static nsresult
_machineGetCurrentSnapshot(IMachine *machine, ISnapshot **currentSnapshot)
{
    return machine->vtbl->GetCurrentSnapshot(machine, currentSnapshot);
}

static nsresult
_machineGetSettingsFilePath(IMachine *machine, PRUnichar **settingsFilePath)
{
    return machine->vtbl->GetSettingsFilePath(machine, settingsFilePath);
}

T
Taowei 已提交
909 910 911 912 913 914
static nsresult
_machineGetCPUCount(IMachine *machine, PRUint32 *CPUCount)
{
    return machine->vtbl->GetCPUCount(machine, CPUCount);
}

T
Taowei 已提交
915 916
static nsresult
_machineSetCPUCount(IMachine *machine, PRUint32 CPUCount)
917
{
T
Taowei 已提交
918
    return machine->vtbl->SetCPUCount(machine, CPUCount);
919 920
}

T
Taowei 已提交
921 922 923 924 925 926
static nsresult
_machineGetMemorySize(IMachine *machine, PRUint32 *memorySize)
{
    return machine->vtbl->GetMemorySize(machine, memorySize);
}

T
Taowei 已提交
927 928 929 930 931
static nsresult
_machineSetMemorySize(IMachine *machine, PRUint32 memorySize)
{
    return machine->vtbl->SetMemorySize(machine, memorySize);
}
932

T
Taowei 已提交
933 934 935 936 937 938
static nsresult
_machineGetCPUProperty(IMachine *machine, PRUint32 property ATTRIBUTE_UNUSED, PRBool *value)
{
    return machine->vtbl->GetCPUProperty(machine, property, value);
}

T
Taowei 已提交
939 940
static nsresult
_machineSetCPUProperty(IMachine *machine, PRUint32 property ATTRIBUTE_UNUSED, PRBool value)
941
{
T
Taowei 已提交
942
    return machine->vtbl->SetCPUProperty(machine, property, value);
943 944
}

T
Taowei 已提交
945 946 947 948 949 950
static nsresult
_machineGetBootOrder(IMachine *machine, PRUint32 position, PRUint32 *device)
{
    return machine->vtbl->GetBootOrder(machine, position, device);
}

T
Taowei 已提交
951 952 953 954 955
static nsresult
_machineSetBootOrder(IMachine *machine, PRUint32 position, PRUint32 device)
{
    return machine->vtbl->SetBootOrder(machine, position, device);
}
956

T
Taowei 已提交
957 958 959 960 961 962
static nsresult
_machineGetVRAMSize(IMachine *machine, PRUint32 *VRAMSize)
{
    return machine->vtbl->GetVRAMSize(machine, VRAMSize);
}

T
Taowei 已提交
963 964
static nsresult
_machineSetVRAMSize(IMachine *machine, PRUint32 VRAMSize)
965
{
T
Taowei 已提交
966 967
    return machine->vtbl->SetVRAMSize(machine, VRAMSize);
}
968

T
Taowei 已提交
969 970 971 972 973 974
static nsresult
_machineGetMonitorCount(IMachine *machine, PRUint32 *monitorCount)
{
    return machine->vtbl->GetMonitorCount(machine, monitorCount);
}

T
Taowei 已提交
975 976 977 978
static nsresult
_machineSetMonitorCount(IMachine *machine, PRUint32 monitorCount)
{
    return machine->vtbl->SetMonitorCount(machine, monitorCount);
979 980
}

T
Taowei 已提交
981 982 983 984 985 986
static nsresult
_machineGetAccelerate3DEnabled(IMachine *machine, PRBool *accelerate3DEnabled)
{
    return machine->vtbl->GetAccelerate3DEnabled(machine, accelerate3DEnabled);
}

T
Taowei 已提交
987 988
static nsresult
_machineSetAccelerate3DEnabled(IMachine *machine, PRBool accelerate3DEnabled)
T
Taowei 已提交
989
{
T
Taowei 已提交
990
    return machine->vtbl->SetAccelerate3DEnabled(machine, accelerate3DEnabled);
T
Taowei 已提交
991 992
}

T
Taowei 已提交
993
static nsresult
994 995
_machineGetAccelerate2DVideoEnabled(IMachine *machine,
                                    PRBool *accelerate2DVideoEnabled)
T
Taowei 已提交
996 997 998 999
{
    return machine->vtbl->GetAccelerate2DVideoEnabled(machine, accelerate2DVideoEnabled);
}

T
Taowei 已提交
1000
static nsresult
1001 1002
_machineSetAccelerate2DVideoEnabled(IMachine *machine,
                                    PRBool accelerate2DVideoEnabled)
T
Taowei 已提交
1003
{
T
Taowei 已提交
1004
    return machine->vtbl->SetAccelerate2DVideoEnabled(machine, accelerate2DVideoEnabled);
T
Taowei 已提交
1005 1006
}

T
Taowei 已提交
1007 1008 1009 1010 1011 1012
static nsresult
_machineGetExtraData(IMachine *machine, PRUnichar *key, PRUnichar **value)
{
    return machine->vtbl->GetExtraData(machine, key, value);
}

T
Taowei 已提交
1013 1014
static nsresult
_machineSetExtraData(IMachine *machine, PRUnichar *key, PRUnichar *value)
T
Taowei 已提交
1015
{
T
Taowei 已提交
1016 1017 1018
    return machine->vtbl->SetExtraData(machine, key, value);
}

1019 1020 1021 1022 1023 1024
static nsresult
_machineGetSnapshotCount(IMachine *machine, PRUint32 *snapshotCount)
{
    return machine->vtbl->GetSnapshotCount(machine, snapshotCount);
}

T
Taowei 已提交
1025 1026 1027 1028
static nsresult
_machineSaveSettings(IMachine *machine)
{
    return machine->vtbl->SaveSettings(machine);
T
Taowei 已提交
1029 1030
}

T
Taowei 已提交
1031
static nsresult
1032
_sessionOpen(vboxDriverPtr data, vboxIID *iid ATTRIBUTE_UNUSED, IMachine *machine)
T
Taowei 已提交
1033 1034 1035
{
    return machine->vtbl->LockMachine(machine, data->vboxSession, LockType_Write);
}
T
Taowei 已提交
1036

T
Taowei 已提交
1037
static nsresult
1038
_sessionOpenExisting(vboxDriverPtr data, vboxIID *iid ATTRIBUTE_UNUSED, IMachine *machine)
T
Taowei 已提交
1039 1040 1041
{
    return machine->vtbl->LockMachine(machine, data->vboxSession, LockType_Shared);
}
T
Taowei 已提交
1042

T
Taowei 已提交
1043 1044 1045 1046 1047
static nsresult
_sessionClose(ISession *session)
{
    return session->vtbl->UnlockMachine(session);
}
T
Taowei 已提交
1048

T
Taowei 已提交
1049 1050 1051 1052 1053
static nsresult
_sessionGetConsole(ISession *session, IConsole **console)
{
    return session->vtbl->GetConsole(session, console);
}
T
Taowei 已提交
1054

T
Taowei 已提交
1055 1056 1057 1058 1059 1060 1061 1062 1063
static nsresult
_sessionGetMachine(ISession *session, IMachine **machine)
{
    return session->vtbl->GetMachine(session, machine);
}

static nsresult
_consoleSaveState(IConsole *console, IProgress **progress)
{
M
Martin Pietsch 已提交
1064
#if VBOX_API_VERSION < 5000000
T
Taowei 已提交
1065
    return console->vtbl->SaveState(console, progress);
M
Martin Pietsch 已提交
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
#else /*VBOX_API_VERSION < 5000000*/
    IMachine *machine;
    nsresult rc;

    rc = console->vtbl->GetMachine(console, &machine);

    if (NS_SUCCEEDED(rc))
        rc = machine->vtbl->SaveState(machine, progress);
    else
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unable to get machine from console. (error %d)"), rc);

    return rc;

#endif /*VBOX_API_VERSION >= 5000000*/
T
Taowei 已提交
1081 1082
}

T
Taowei 已提交
1083 1084 1085 1086 1087 1088
static nsresult
_consolePause(IConsole *console)
{
    return console->vtbl->Pause(console);
}

T
Taowei 已提交
1089 1090 1091 1092 1093 1094
static nsresult
_consoleResume(IConsole *console)
{
    return console->vtbl->Resume(console);
}

T
Taowei 已提交
1095 1096 1097 1098 1099 1100
static nsresult
_consolePowerButton(IConsole *console)
{
    return console->vtbl->PowerButton(console);
}

T
Taowei 已提交
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
static nsresult
_consolePowerDown(IConsole *console)
{
    nsresult rc;
    IProgress *progress = NULL;
    rc = console->vtbl->PowerDown(console, &progress);
    if (progress) {
        rc = progress->vtbl->WaitForCompletion(progress, -1);
        VBOX_RELEASE(progress);
    }
1111

T
Taowei 已提交
1112 1113 1114
    return rc;
}

T
Taowei 已提交
1115 1116 1117 1118 1119 1120
static nsresult
_consoleReset(IConsole *console)
{
    return console->vtbl->Reset(console);
}

1121 1122 1123 1124
static nsresult
_consoleTakeSnapshot(IConsole *console, PRUnichar *name,
                     PRUnichar *description, IProgress **progress)
{
M
Martin Pietsch 已提交
1125
#if VBOX_API_VERSION < 5000000
1126
    return console->vtbl->TakeSnapshot(console, name, description, progress);
M
Martin Pietsch 已提交
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
#else
    IMachine *machine;
    nsresult rc;
    PRUnichar *id = NULL;
    bool bpause = true; /*NO live snapshot*/

    rc = console->vtbl->GetMachine(console, &machine);

    if (NS_SUCCEEDED(rc))
        rc = machine->vtbl->TakeSnapshot(machine, name, description, bpause, &id, progress);
    else
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unable to get machine from console. (error %d)"), rc);

    VBOX_RELEASE(machine);
    return rc;
#endif /* VBOX_API_VERSION >= 5000000 */
1144 1145
}

T
Taowei 已提交
1146
static nsresult
1147
_consoleDeleteSnapshot(IConsole *console, vboxIID *iid, IProgress **progress)
T
Taowei 已提交
1148
{
1149
#if VBOX_API_VERSION < 5000000 /* VBOX_API_VERSION < 5000000 */
1150
    return console->vtbl->DeleteSnapshot(console, iid->value, progress);
M
Martin Pietsch 已提交
1151 1152 1153 1154 1155 1156 1157
#else /* VBOX_API_VERSION >= 5000000 */
    IMachine *machine;
    nsresult rc;

    rc = console->vtbl->GetMachine(console, &machine);

    if (NS_SUCCEEDED(rc))
1158
        rc = machine->vtbl->DeleteSnapshot(machine, iid->value, progress);
M
Martin Pietsch 已提交
1159 1160 1161 1162 1163 1164 1165 1166
    else
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unable to get machine from console. (error %d)"), rc);

    VBOX_RELEASE(machine);

    return rc;
#endif /* VBOX_API_VERSION >= 5000000 */
T
Taowei 已提交
1167 1168
}

T
Taowei 已提交
1169 1170 1171 1172 1173 1174
static nsresult
_consoleGetDisplay(IConsole *console, IDisplay **display)
{
    return console->vtbl->GetDisplay(console, display);
}

1175 1176 1177 1178 1179 1180
static nsresult
_consoleGetKeyboard(IConsole *console, IKeyboard **keyboard)
{
    return console->vtbl->GetKeyboard(console, keyboard);
}

T
Taowei 已提交
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192
static nsresult
_progressWaitForCompletion(IProgress *progress, PRInt32 timeout)
{
    return progress->vtbl->WaitForCompletion(progress, timeout);
}

static nsresult
_progressGetResultCode(IProgress *progress, resultCodeUnion *resultCode)
{
    return progress->vtbl->GetResultCode(progress, &resultCode->resultCode);
}

T
Taowei 已提交
1193 1194 1195 1196 1197 1198
static nsresult
_progressGetCompleted(IProgress *progress, PRBool *completed)
{
    return progress->vtbl->GetCompleted(progress, completed);
}

T
Taowei 已提交
1199 1200 1201 1202
static nsresult
_systemPropertiesGetMaxGuestCPUCount(ISystemProperties *systemProperties, PRUint32 *maxCPUCount)
{
    return systemProperties->vtbl->GetMaxGuestCPUCount(systemProperties, maxCPUCount);
T
Taowei 已提交
1203 1204 1205
}

static nsresult
T
Taowei 已提交
1206
_systemPropertiesGetMaxBootPosition(ISystemProperties *systemProperties, PRUint32 *maxBootPosition)
T
Taowei 已提交
1207
{
T
Taowei 已提交
1208
    return systemProperties->vtbl->GetMaxBootPosition(systemProperties, maxBootPosition);
T
Taowei 已提交
1209 1210
}

T
Taowei 已提交
1211 1212 1213
static nsresult
_systemPropertiesGetMaxNetworkAdapters(ISystemProperties *systemProperties, PRUint32 chipset ATTRIBUTE_UNUSED,
                                       PRUint32 *maxNetworkAdapters)
T
Taowei 已提交
1214
{
T
Taowei 已提交
1215 1216 1217 1218 1219 1220 1221
#if VBOX_API_VERSION < 4001000
        return systemProperties->vtbl->GetNetworkAdapterCount(systemProperties,
                                                              maxNetworkAdapters);
#else  /* VBOX_API_VERSION >= 4000000 */
        return systemProperties->vtbl->GetMaxNetworkAdapters(systemProperties, chipset,
                                                             maxNetworkAdapters);
#endif /* VBOX_API_VERSION >= 4000000 */
T
Taowei 已提交
1222 1223
}

T
Taowei 已提交
1224 1225
static nsresult
_systemPropertiesGetSerialPortCount(ISystemProperties *systemProperties, PRUint32 *SerialPortCount)
T
Taowei 已提交
1226
{
T
Taowei 已提交
1227
    return systemProperties->vtbl->GetSerialPortCount(systemProperties, SerialPortCount);
T
Taowei 已提交
1228 1229 1230
}

static nsresult
T
Taowei 已提交
1231
_systemPropertiesGetParallelPortCount(ISystemProperties *systemProperties, PRUint32 *ParallelPortCount)
T
Taowei 已提交
1232
{
T
Taowei 已提交
1233 1234
    return systemProperties->vtbl->GetParallelPortCount(systemProperties, ParallelPortCount);
}
T
Taowei 已提交
1235

T
Taowei 已提交
1236 1237 1238 1239 1240
static nsresult
_systemPropertiesGetMaxPortCountForStorageBus(ISystemProperties *systemProperties, PRUint32 bus,
                                              PRUint32 *maxPortCount)
{
    return systemProperties->vtbl->GetMaxPortCountForStorageBus(systemProperties, bus, maxPortCount);
T
Taowei 已提交
1241 1242
}

T
Taowei 已提交
1243 1244 1245
static nsresult
_systemPropertiesGetMaxDevicesPerPortForStorageBus(ISystemProperties *systemProperties,
                                                   PRUint32 bus, PRUint32 *maxDevicesPerPort)
T
Taowei 已提交
1246
{
T
Taowei 已提交
1247 1248 1249
    return systemProperties->vtbl->GetMaxDevicesPerPortForStorageBus(systemProperties,
                                                                     bus, maxDevicesPerPort);
}
T
Taowei 已提交
1250

T
Taowei 已提交
1251 1252 1253 1254 1255 1256
static nsresult
_systemPropertiesGetMaxGuestRAM(ISystemProperties *systemProperties, PRUint32 *maxGuestRAM)
{
    return systemProperties->vtbl->GetMaxGuestRAM(systemProperties, maxGuestRAM);
}

T
Taowei 已提交
1257 1258 1259 1260 1261 1262
static nsresult
_biosSettingsGetACPIEnabled(IBIOSSettings *bios, PRBool *ACPIEnabled)
{
    return bios->vtbl->GetACPIEnabled(bios, ACPIEnabled);
}

T
Taowei 已提交
1263 1264 1265 1266
static nsresult
_biosSettingsSetACPIEnabled(IBIOSSettings *bios, PRBool ACPIEnabled)
{
    return bios->vtbl->SetACPIEnabled(bios, ACPIEnabled);
T
Taowei 已提交
1267 1268
}

T
Taowei 已提交
1269 1270 1271 1272 1273 1274
static nsresult
_biosSettingsGetIOAPICEnabled(IBIOSSettings *bios, PRBool *IOAPICEnabled)
{
    return bios->vtbl->GetIOAPICEnabled(bios, IOAPICEnabled);
}

T
Taowei 已提交
1275 1276 1277 1278 1279
static nsresult
_biosSettingsSetIOAPICEnabled(IBIOSSettings *bios, PRBool IOAPICEnabled)
{
    return bios->vtbl->SetIOAPICEnabled(bios, IOAPICEnabled);
}
T
Taowei 已提交
1280

T
Taowei 已提交
1281 1282 1283 1284 1285 1286
static nsresult
_audioAdapterGetEnabled(IAudioAdapter *audioAdapter, PRBool *enabled)
{
    return audioAdapter->vtbl->GetEnabled(audioAdapter, enabled);
}

T
Taowei 已提交
1287 1288
static nsresult
_audioAdapterSetEnabled(IAudioAdapter *audioAdapter, PRBool enabled)
T
Taowei 已提交
1289
{
T
Taowei 已提交
1290
    return audioAdapter->vtbl->SetEnabled(audioAdapter, enabled);
T
Taowei 已提交
1291 1292
}

T
Taowei 已提交
1293 1294 1295 1296 1297 1298
static nsresult
_audioAdapterGetAudioController(IAudioAdapter *audioAdapter, PRUint32 *audioController)
{
    return audioAdapter->vtbl->GetAudioController(audioAdapter, audioController);
}

T
Taowei 已提交
1299 1300
static nsresult
_audioAdapterSetAudioController(IAudioAdapter *audioAdapter, PRUint32 audioController)
T
Taowei 已提交
1301
{
T
Taowei 已提交
1302
    return audioAdapter->vtbl->SetAudioController(audioAdapter, audioController);
T
Taowei 已提交
1303 1304
}

T
Taowei 已提交
1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
static nsresult
_networkAdapterGetAttachmentType(INetworkAdapter *adapter, PRUint32 *attachmentType)
{
    return adapter->vtbl->GetAttachmentType(adapter, attachmentType);
}

static nsresult
_networkAdapterGetEnabled(INetworkAdapter *adapter, PRBool *enabled)
{
    return adapter->vtbl->GetEnabled(adapter, enabled);
}

T
Taowei 已提交
1317 1318
static nsresult
_networkAdapterSetEnabled(INetworkAdapter *adapter, PRBool enabled)
T
Taowei 已提交
1319
{
T
Taowei 已提交
1320
    return adapter->vtbl->SetEnabled(adapter, enabled);
T
Taowei 已提交
1321 1322
}

T
Taowei 已提交
1323 1324 1325 1326 1327 1328
static nsresult
_networkAdapterGetAdapterType(INetworkAdapter *adapter, PRUint32 *adapterType)
{
    return adapter->vtbl->GetAdapterType(adapter, adapterType);
}

T
Taowei 已提交
1329 1330
static nsresult
_networkAdapterSetAdapterType(INetworkAdapter *adapter, PRUint32 adapterType)
T
Taowei 已提交
1331
{
T
Taowei 已提交
1332
    return adapter->vtbl->SetAdapterType(adapter, adapterType);
T
Taowei 已提交
1333 1334
}

T
Taowei 已提交
1335 1336 1337 1338 1339 1340
static nsresult
_networkAdapterGetInternalNetwork(INetworkAdapter *adapter, PRUnichar **internalNetwork)
{
    return adapter->vtbl->GetInternalNetwork(adapter, internalNetwork);
}

T
Taowei 已提交
1341 1342
static nsresult
_networkAdapterSetInternalNetwork(INetworkAdapter *adapter, PRUnichar *internalNetwork)
T
Taowei 已提交
1343
{
T
Taowei 已提交
1344
    return adapter->vtbl->SetInternalNetwork(adapter, internalNetwork);
T
Taowei 已提交
1345 1346
}

T
Taowei 已提交
1347 1348 1349 1350 1351 1352
static nsresult
_networkAdapterGetMACAddress(INetworkAdapter *adapter, PRUnichar **MACAddress)
{
    return adapter->vtbl->GetMACAddress(adapter, MACAddress);
}

T
Taowei 已提交
1353 1354
static nsresult
_networkAdapterSetMACAddress(INetworkAdapter *adapter, PRUnichar *MACAddress)
T
Taowei 已提交
1355
{
T
Taowei 已提交
1356
    return adapter->vtbl->SetMACAddress(adapter, MACAddress);
T
Taowei 已提交
1357 1358
}

T
Taowei 已提交
1359
#if VBOX_API_VERSION < 4001000
T
Taowei 已提交
1360

T
Taowei 已提交
1361 1362 1363 1364 1365 1366
static nsresult
_networkAdapterGetBridgedInterface(INetworkAdapter *adapter, PRUnichar **hostInterface)
{
    return adapter->vtbl->GetHostInterface(adapter, hostInterface);
}

T
Taowei 已提交
1367 1368
static nsresult
_networkAdapterSetBridgedInterface(INetworkAdapter *adapter, PRUnichar *hostInterface)
T
Taowei 已提交
1369
{
T
Taowei 已提交
1370
    return adapter->vtbl->SetHostInterface(adapter, hostInterface);
T
Taowei 已提交
1371 1372
}

T
Taowei 已提交
1373 1374 1375 1376 1377 1378
static nsresult
_networkAdapterGetHostOnlyInterface(INetworkAdapter *adapter, PRUnichar **hostOnlyInterface)
{
    return adapter->vtbl->GetHostInterface(adapter, hostOnlyInterface);
}

T
Taowei 已提交
1379 1380
static nsresult
_networkAdapterSetHostOnlyInterface(INetworkAdapter *adapter, PRUnichar *hostOnlyInterface)
T
Taowei 已提交
1381
{
T
Taowei 已提交
1382
    return adapter->vtbl->SetHostInterface(adapter, hostOnlyInterface);
T
Taowei 已提交
1383 1384
}

T
Taowei 已提交
1385 1386
static nsresult
_networkAdapterAttachToBridgedInterface(INetworkAdapter *adapter)
T
Taowei 已提交
1387
{
T
Taowei 已提交
1388
    return adapter->vtbl->AttachToBridgedInterface(adapter);
T
Taowei 已提交
1389 1390
}

T
Taowei 已提交
1391 1392
static nsresult
_networkAdapterAttachToInternalNetwork(INetworkAdapter *adapter)
T
Taowei 已提交
1393
{
T
Taowei 已提交
1394
    return adapter->vtbl->AttachToInternalNetwork(adapter);
T
Taowei 已提交
1395 1396
}

T
Taowei 已提交
1397 1398 1399 1400 1401
static nsresult
_networkAdapterAttachToHostOnlyInterface(INetworkAdapter *adapter)
{
    return adapter->vtbl->AttachToHostOnlyInterface(adapter);
}
T
Taowei 已提交
1402

T
Taowei 已提交
1403 1404
static nsresult
_networkAdapterAttachToNAT(INetworkAdapter *adapter)
T
Taowei 已提交
1405
{
T
Taowei 已提交
1406
    return adapter->vtbl->AttachToNAT(adapter);
T
Taowei 已提交
1407 1408
}

T
Taowei 已提交
1409 1410
#else /* VBOX_API_VERSION >= 4001000 */

T
Taowei 已提交
1411 1412 1413 1414 1415 1416
static nsresult
_networkAdapterGetBridgedInterface(INetworkAdapter *adapter, PRUnichar **bridgedInterface)
{
    return adapter->vtbl->GetBridgedInterface(adapter, bridgedInterface);
}

T
Taowei 已提交
1417 1418
static nsresult
_networkAdapterSetBridgedInterface(INetworkAdapter *adapter, PRUnichar *bridgedInterface)
T
Taowei 已提交
1419
{
T
Taowei 已提交
1420
    return adapter->vtbl->SetBridgedInterface(adapter, bridgedInterface);
T
Taowei 已提交
1421 1422
}

T
Taowei 已提交
1423 1424 1425 1426 1427 1428
static nsresult
_networkAdapterGetHostOnlyInterface(INetworkAdapter *adapter, PRUnichar **hostOnlyInterface)
{
    return adapter->vtbl->GetHostOnlyInterface(adapter, hostOnlyInterface);
}

T
Taowei 已提交
1429
static nsresult
T
Taowei 已提交
1430
_networkAdapterSetHostOnlyInterface(INetworkAdapter *adapter, PRUnichar *hostOnlyInterface)
T
Taowei 已提交
1431
{
T
Taowei 已提交
1432
    return adapter->vtbl->SetHostOnlyInterface(adapter, hostOnlyInterface);
T
Taowei 已提交
1433 1434
}

T
Taowei 已提交
1435 1436 1437 1438 1439
static nsresult
_networkAdapterAttachToBridgedInterface(INetworkAdapter *adapter)
{
    return adapter->vtbl->SetAttachmentType(adapter, NetworkAttachmentType_Bridged);
}
T
Taowei 已提交
1440 1441

static nsresult
T
Taowei 已提交
1442
_networkAdapterAttachToInternalNetwork(INetworkAdapter *adapter)
T
Taowei 已提交
1443
{
T
Taowei 已提交
1444
    return adapter->vtbl->SetAttachmentType(adapter, NetworkAttachmentType_Internal);
T
Taowei 已提交
1445 1446
}

T
Taowei 已提交
1447 1448 1449 1450 1451
static nsresult
_networkAdapterAttachToHostOnlyInterface(INetworkAdapter *adapter)
{
    return adapter->vtbl->SetAttachmentType(adapter, NetworkAttachmentType_HostOnly);
}
T
Taowei 已提交
1452 1453

static nsresult
T
Taowei 已提交
1454
_networkAdapterAttachToNAT(INetworkAdapter *adapter)
T
Taowei 已提交
1455
{
T
Taowei 已提交
1456
    return adapter->vtbl->SetAttachmentType(adapter, NetworkAttachmentType_NAT);
T
Taowei 已提交
1457 1458
}

T
Taowei 已提交
1459
#endif /* VBOX_API_VERSION >= 4001000 */
T
Taowei 已提交
1460

T
Taowei 已提交
1461 1462 1463 1464 1465 1466
static nsresult
_serialPortGetEnabled(ISerialPort *port, PRBool *enabled)
{
    return port->vtbl->GetEnabled(port, enabled);
}

T
Taowei 已提交
1467
static nsresult
T
Taowei 已提交
1468
_serialPortSetEnabled(ISerialPort *port, PRBool enabled)
T
Taowei 已提交
1469
{
T
Taowei 已提交
1470
    return port->vtbl->SetEnabled(port, enabled);
T
Taowei 已提交
1471 1472
}

T
Taowei 已提交
1473 1474 1475 1476 1477 1478
static nsresult
_serialPortGetPath(ISerialPort *port, PRUnichar **path)
{
    return port->vtbl->GetPath(port, path);
}

T
Taowei 已提交
1479
static nsresult
T
Taowei 已提交
1480
_serialPortSetPath(ISerialPort *port, PRUnichar *path)
T
Taowei 已提交
1481
{
T
Taowei 已提交
1482
    return port->vtbl->SetPath(port, path);
T
Taowei 已提交
1483 1484
}

T
Taowei 已提交
1485 1486 1487 1488 1489 1490
static nsresult
_serialPortGetIRQ(ISerialPort *port, PRUint32 *IRQ)
{
    return port->vtbl->GetIRQ(port, IRQ);
}

T
Taowei 已提交
1491
static nsresult
T
Taowei 已提交
1492
_serialPortSetIRQ(ISerialPort *port, PRUint32 IRQ)
T
Taowei 已提交
1493
{
T
Taowei 已提交
1494
    return port->vtbl->SetIRQ(port, IRQ);
T
Taowei 已提交
1495 1496
}

T
Taowei 已提交
1497 1498 1499 1500 1501 1502
static nsresult
_serialPortGetIOBase(ISerialPort *port, PRUint32 *IOBase)
{
    return port->vtbl->GetIOBase(port, IOBase);
}

T
Taowei 已提交
1503
static nsresult
T
Taowei 已提交
1504
_serialPortSetIOBase(ISerialPort *port, PRUint32 IOBase)
T
Taowei 已提交
1505
{
T
Taowei 已提交
1506
    return port->vtbl->SetIOBase(port, IOBase);
T
Taowei 已提交
1507 1508
}

T
Taowei 已提交
1509 1510 1511 1512 1513 1514
static nsresult
_serialPortGetHostMode(ISerialPort *port, PRUint32 *hostMode)
{
    return port->vtbl->GetHostMode(port, hostMode);
}

T
Taowei 已提交
1515
static nsresult
T
Taowei 已提交
1516
_serialPortSetHostMode(ISerialPort *port, PRUint32 hostMode)
T
Taowei 已提交
1517
{
T
Taowei 已提交
1518
    return port->vtbl->SetHostMode(port, hostMode);
T
Taowei 已提交
1519 1520
}

T
Taowei 已提交
1521 1522 1523 1524 1525 1526
static nsresult
_parallelPortGetEnabled(IParallelPort *port, PRBool *enabled)
{
    return port->vtbl->GetEnabled(port, enabled);
}

T
Taowei 已提交
1527
static nsresult
T
Taowei 已提交
1528
_parallelPortSetEnabled(IParallelPort *port, PRBool enabled)
T
Taowei 已提交
1529
{
T
Taowei 已提交
1530
    return port->vtbl->SetEnabled(port, enabled);
T
Taowei 已提交
1531 1532
}

T
Taowei 已提交
1533 1534 1535 1536 1537 1538
static nsresult
_parallelPortGetPath(IParallelPort *port, PRUnichar **path)
{
    return port->vtbl->GetPath(port, path);
}

T
Taowei 已提交
1539
static nsresult
T
Taowei 已提交
1540
_parallelPortSetPath(IParallelPort *port, PRUnichar *path)
T
Taowei 已提交
1541
{
T
Taowei 已提交
1542
    return port->vtbl->SetPath(port, path);
T
Taowei 已提交
1543 1544
}

T
Taowei 已提交
1545 1546 1547 1548 1549 1550
static nsresult
_parallelPortGetIRQ(IParallelPort *port, PRUint32 *IRQ)
{
    return port->vtbl->GetIRQ(port, IRQ);
}

T
Taowei 已提交
1551
static nsresult
T
Taowei 已提交
1552
_parallelPortSetIRQ(IParallelPort *port, PRUint32 IRQ)
T
Taowei 已提交
1553
{
T
Taowei 已提交
1554
    return port->vtbl->SetIRQ(port, IRQ);
T
Taowei 已提交
1555 1556
}

T
Taowei 已提交
1557 1558 1559 1560 1561 1562
static nsresult
_parallelPortGetIOBase(IParallelPort *port, PRUint32 *IOBase)
{
    return port->vtbl->GetIOBase(port, IOBase);
}

T
Taowei 已提交
1563
static nsresult
T
Taowei 已提交
1564
_parallelPortSetIOBase(IParallelPort *port, PRUint32 IOBase)
T
Taowei 已提交
1565
{
T
Taowei 已提交
1566
    return port->vtbl->SetIOBase(port, IOBase);
T
Taowei 已提交
1567 1568
}

T
Taowei 已提交
1569
static nsresult
1570
_vrdeServerGetEnabled(IVRDEServer *VRDEServer, PRBool *enabled)
T
Taowei 已提交
1571
{
1572
    return VRDEServer->vtbl->GetEnabled(VRDEServer, enabled);
T
Taowei 已提交
1573 1574
}

T
Taowei 已提交
1575
static nsresult
1576
_vrdeServerSetEnabled(IVRDEServer *VRDEServer, PRBool enabled)
T
Taowei 已提交
1577
{
1578
    return VRDEServer->vtbl->SetEnabled(VRDEServer, enabled);
T
Taowei 已提交
1579
}
T
Taowei 已提交
1580

T
Taowei 已提交
1581
static nsresult
1582 1583
_vrdeServerGetPorts(vboxDriverPtr data ATTRIBUTE_UNUSED,
                    IVRDEServer *VRDEServer, virDomainGraphicsDefPtr graphics)
T
Taowei 已提交
1584 1585 1586 1587
{
    nsresult rc;
    PRUnichar *VRDEPortsKey = NULL;
    PRUnichar *VRDEPortsValue = NULL;
1588

T
Taowei 已提交
1589
    VBOX_UTF8_TO_UTF16("TCP/Ports", &VRDEPortsKey);
1590
    rc = VRDEServer->vtbl->GetVRDEProperty(VRDEServer, VRDEPortsKey, &VRDEPortsValue);
T
Taowei 已提交
1591 1592 1593
    VBOX_UTF16_FREE(VRDEPortsKey);
    if (VRDEPortsValue) {
        /* even if vbox supports mutilpe ports, single port for now here */
1594
        graphics->data.rdp.port = PRUnicharToInt(data->pFuncs, VRDEPortsValue);
T
Taowei 已提交
1595 1596 1597 1598
        VBOX_UTF16_FREE(VRDEPortsValue);
    } else {
        graphics->data.rdp.autoport = true;
    }
1599

T
Taowei 已提交
1600 1601 1602
    return rc;
}

T
Taowei 已提交
1603
static nsresult
1604 1605
_vrdeServerSetPorts(vboxDriverPtr data ATTRIBUTE_UNUSED,
                    IVRDEServer *VRDEServer, virDomainGraphicsDefPtr graphics)
T
Taowei 已提交
1606
{
T
Taowei 已提交
1607 1608 1609
    nsresult rc = 0;
    PRUnichar *VRDEPortsKey = NULL;
    PRUnichar *VRDEPortsValue = NULL;
1610

T
Taowei 已提交
1611
    VBOX_UTF8_TO_UTF16("TCP/Ports", &VRDEPortsKey);
1612
    VRDEPortsValue = PRUnicharFromInt(data->pFuncs, graphics->data.rdp.port);
1613
    rc = VRDEServer->vtbl->SetVRDEProperty(VRDEServer, VRDEPortsKey,
T
Taowei 已提交
1614 1615 1616
                                           VRDEPortsValue);
    VBOX_UTF16_FREE(VRDEPortsKey);
    VBOX_UTF16_FREE(VRDEPortsValue);
1617

T
Taowei 已提交
1618
    return rc;
T
Taowei 已提交
1619 1620
}

T
Taowei 已提交
1621
static nsresult
1622
_vrdeServerGetReuseSingleConnection(IVRDEServer *VRDEServer, PRBool *enabled)
T
Taowei 已提交
1623
{
1624
    return VRDEServer->vtbl->GetReuseSingleConnection(VRDEServer, enabled);
T
Taowei 已提交
1625 1626
}

T
Taowei 已提交
1627
static nsresult
1628
_vrdeServerSetReuseSingleConnection(IVRDEServer *VRDEServer, PRBool enabled)
T
Taowei 已提交
1629
{
1630
    return VRDEServer->vtbl->SetReuseSingleConnection(VRDEServer, enabled);
T
Taowei 已提交
1631 1632
}

T
Taowei 已提交
1633
static nsresult
1634
_vrdeServerGetAllowMultiConnection(IVRDEServer *VRDEServer, PRBool *enabled)
T
Taowei 已提交
1635
{
1636
    return VRDEServer->vtbl->GetAllowMultiConnection(VRDEServer, enabled);
T
Taowei 已提交
1637 1638
}

T
Taowei 已提交
1639
static nsresult
1640
_vrdeServerSetAllowMultiConnection(IVRDEServer *VRDEServer, PRBool enabled)
T
Taowei 已提交
1641
{
1642
    return VRDEServer->vtbl->SetAllowMultiConnection(VRDEServer, enabled);
T
Taowei 已提交
1643 1644
}

T
Taowei 已提交
1645
static nsresult
1646 1647
_vrdeServerGetNetAddress(vboxDriverPtr data ATTRIBUTE_UNUSED,
                         IVRDEServer *VRDEServer, PRUnichar **netAddress)
T
Taowei 已提交
1648 1649 1650
{
    PRUnichar *VRDENetAddressKey = NULL;
    nsresult rc;
1651

T
Taowei 已提交
1652
    VBOX_UTF8_TO_UTF16("TCP/Address", &VRDENetAddressKey);
1653
    rc = VRDEServer->vtbl->GetVRDEProperty(VRDEServer, VRDENetAddressKey, netAddress);
T
Taowei 已提交
1654
    VBOX_UTF16_FREE(VRDENetAddressKey);
1655

T
Taowei 已提交
1656 1657 1658
    return rc;
}

T
Taowei 已提交
1659
static nsresult
1660 1661
_vrdeServerSetNetAddress(vboxDriverPtr data ATTRIBUTE_UNUSED,
                         IVRDEServer *VRDEServer, PRUnichar *netAddress)
T
Taowei 已提交
1662 1663 1664
{
    PRUnichar *netAddressKey = NULL;
    nsresult rc;
1665

T
Taowei 已提交
1666
    VBOX_UTF8_TO_UTF16("TCP/Address", &netAddressKey);
1667
    rc = VRDEServer->vtbl->SetVRDEProperty(VRDEServer, netAddressKey,
T
Taowei 已提交
1668 1669
                                           netAddress);
    VBOX_UTF16_FREE(netAddressKey);
1670

T
Taowei 已提交
1671 1672
    return rc;
}
T
Taowei 已提交
1673 1674

static nsresult
T
Taowei 已提交
1675
_usbCommonEnable(IUSBCommon *USBCommon ATTRIBUTE_UNUSED)
T
Taowei 已提交
1676
{
T
Taowei 已提交
1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687
    nsresult rc = 0;
#if VBOX_API_VERSION < 4003000
    USBCommon->vtbl->SetEnabled(USBCommon, 1);
# if VBOX_API_VERSION < 4002000
    rc = USBCommon->vtbl->SetEnabledEhci(USBCommon, 1);
# else /* VBOX_API_VERSION >= 4002000 */
    rc = USBCommon->vtbl->SetEnabledEHCI(USBCommon, 1);
# endif /* VBOX_API_VERSION >= 4002000 */
#endif /* VBOX_API_VERSION >= 4003000 */
    /* We don't need to set usb enabled for vbox 4.3 and later */
    return rc;
T
Taowei 已提交
1688 1689
}

T
Taowei 已提交
1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700
static nsresult
_usbCommonGetEnabled(IUSBCommon *USBCommon ATTRIBUTE_UNUSED, PRBool *enabled)
{
#if VBOX_API_VERSION < 4003000
    return USBCommon->vtbl->GetEnabled(USBCommon, enabled);
#else /* VBOX_API_VERSION >= 4003000 */
    *enabled = true;
    return 0;
#endif /* VBOX_API_VERSION >= 4003000 */
}

T
Taowei 已提交
1701
static nsresult
T
Taowei 已提交
1702 1703
_usbCommonCreateDeviceFilter(IUSBCommon *USBCommon, PRUnichar *name,
                             IUSBDeviceFilter **filter)
T
Taowei 已提交
1704
{
T
Taowei 已提交
1705
    return USBCommon->vtbl->CreateDeviceFilter(USBCommon, name, filter);
T
Taowei 已提交
1706 1707
}

T
Taowei 已提交
1708
static nsresult
T
Taowei 已提交
1709 1710
_usbCommonInsertDeviceFilter(IUSBCommon *USBCommon, PRUint32 position,
                             IUSBDeviceFilter *filter)
T
Taowei 已提交
1711
{
T
Taowei 已提交
1712
    return USBCommon->vtbl->InsertDeviceFilter(USBCommon, position, filter);
T
Taowei 已提交
1713 1714
}

T
Taowei 已提交
1715 1716 1717 1718 1719 1720
static nsresult
_usbDeviceFilterGetProductId(IUSBDeviceFilter *USBDeviceFilter, PRUnichar **productId)
{
    return USBDeviceFilter->vtbl->GetProductId(USBDeviceFilter, productId);
}

T
Taowei 已提交
1721
static nsresult
T
Taowei 已提交
1722
_usbDeviceFilterSetProductId(IUSBDeviceFilter *USBDeviceFilter, PRUnichar *productId)
T
Taowei 已提交
1723
{
T
Taowei 已提交
1724
    return USBDeviceFilter->vtbl->SetProductId(USBDeviceFilter, productId);
T
Taowei 已提交
1725 1726
}

T
Taowei 已提交
1727 1728 1729 1730 1731 1732
static nsresult
_usbDeviceFilterGetActive(IUSBDeviceFilter *USBDeviceFilter, PRBool *active)
{
    return USBDeviceFilter->vtbl->GetActive(USBDeviceFilter, active);
}

T
Taowei 已提交
1733
static nsresult
T
Taowei 已提交
1734
_usbDeviceFilterSetActive(IUSBDeviceFilter *USBDeviceFilter, PRBool active)
T
Taowei 已提交
1735
{
T
Taowei 已提交
1736
    return USBDeviceFilter->vtbl->SetActive(USBDeviceFilter, active);
T
Taowei 已提交
1737 1738
}

T
Taowei 已提交
1739 1740 1741 1742 1743 1744
static nsresult
_usbDeviceFilterGetVendorId(IUSBDeviceFilter *USBDeviceFilter, PRUnichar **vendorId)
{
    return USBDeviceFilter->vtbl->GetVendorId(USBDeviceFilter, vendorId);
}

T
Taowei 已提交
1745
static nsresult
T
Taowei 已提交
1746
_usbDeviceFilterSetVendorId(IUSBDeviceFilter *USBDeviceFilter, PRUnichar *vendorId)
T
Taowei 已提交
1747
{
T
Taowei 已提交
1748 1749 1750
    return USBDeviceFilter->vtbl->SetVendorId(USBDeviceFilter, vendorId);
}

1751
static nsresult _mediumGetId(IMedium *medium, vboxIID *iid)
T
Taowei 已提交
1752
{
1753
    return medium->vtbl->GetId(medium, &iid->value);
T
Taowei 已提交
1754 1755
}

T
Taowei 已提交
1756 1757 1758 1759 1760
static nsresult _mediumGetLocation(IMedium *medium, PRUnichar **location)
{
    return medium->vtbl->GetLocation(medium, location);
}

1761 1762 1763 1764 1765
static nsresult _mediumGetState(IMedium *medium, PRUint32 *state)
{
    return medium->vtbl->GetState(medium, state);
}

1766 1767 1768 1769 1770
static nsresult _mediumGetName(IMedium *medium, PRUnichar **name)
{
    return medium->vtbl->GetName(medium, name);
}

T
Taowei Luo 已提交
1771 1772 1773 1774
static nsresult _mediumGetSize(IMedium *medium, PRUint64 *uSize)
{
    nsresult rc;
    PRInt64 Size;
1775

T
Taowei Luo 已提交
1776 1777
    rc = medium->vtbl->GetSize(medium, &Size);
    *uSize = Size;
1778

T
Taowei Luo 已提交
1779 1780 1781
    return rc;
}

T
Taowei 已提交
1782 1783 1784 1785
static nsresult _mediumGetReadOnly(IMedium *medium ATTRIBUTE_UNUSED,
                                   PRBool *readOnly ATTRIBUTE_UNUSED)
{
    return medium->vtbl->GetReadOnly(medium, readOnly);
1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
}

static nsresult _mediumGetParent(IMedium *medium,
                                 IMedium **parent)
{
    return medium->vtbl->GetParent(medium, parent);
}

static nsresult _mediumGetChildren(IMedium *medium,
                                   PRUint32 *childrenSize,
                                   IMedium ***children)
{
    return medium->vtbl->GetChildren(medium, childrenSize, children);
}

static nsresult _mediumGetFormat(IMedium *medium,
                                 PRUnichar **format)
{
    return medium->vtbl->GetFormat(medium, format);
}

static nsresult _mediumDeleteStorage(IMedium *medium,
                                     IProgress **progress)
{
    return medium->vtbl->DeleteStorage(medium, progress);
}

T
Taowei 已提交
1813 1814 1815 1816
static nsresult _mediumRelease(IMedium *medium)
{
    return medium->vtbl->nsisupports.Release((nsISupports *)medium);
}
1817 1818 1819 1820
static nsresult _mediumClose(IMedium *medium)
{
    return medium->vtbl->Close(medium);
}
T
Taowei 已提交
1821 1822 1823 1824 1825

static nsresult _mediumSetType(IMedium *medium ATTRIBUTE_UNUSED,
                               PRUint32 type ATTRIBUTE_UNUSED)
{
    return medium->vtbl->SetType(medium, type);
T
Taowei 已提交
1826 1827
}

1828 1829 1830 1831 1832 1833 1834
static nsresult
_mediumCreateDiffStorage(IMedium *medium ATTRIBUTE_UNUSED,
                         IMedium *target ATTRIBUTE_UNUSED,
                         PRUint32 variantSize ATTRIBUTE_UNUSED,
                         PRUint32 *variant ATTRIBUTE_UNUSED,
                         IProgress **progress ATTRIBUTE_UNUSED)
{
1835
#if VBOX_API_VERSION < 4003000
1836 1837 1838 1839 1840 1841 1842 1843 1844 1845
    if (variantSize == 0)
        return 0;
    if (variantSize > 1)
        VIR_WARN("Only one variant is avaible in current version");
    return medium->vtbl->CreateDiffStorage(medium, target, variant[0], progress);
#else /* VBOX_API_VERSION >= 4003000 */
    return medium->vtbl->CreateDiffStorage(medium, target, variantSize, variant, progress);
#endif /* VBOX_API_VERSION >= 4003000 */
}

1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868
static nsresult
_mediumCreateBaseStorage(IMedium *medium, PRUint64 logicalSize,
                           PRUint32 variant, IProgress **progress)
{
#if VBOX_API_VERSION < 4003000
    return medium->vtbl->CreateBaseStorage(medium, logicalSize, variant, progress);
#else
    return medium->vtbl->CreateBaseStorage(medium, logicalSize, 1, &variant, progress);
#endif
}

static nsresult
_mediumGetLogicalSize(IMedium *medium, PRUint64 *uLogicalSize)
{
    nsresult rc;
    PRInt64 logicalSize;

    rc = medium->vtbl->GetLogicalSize(medium, &logicalSize);
    *uLogicalSize = logicalSize;

    return rc;
}

T
Taowei 已提交
1869
static nsresult
1870
_mediumAttachmentGetMedium(IMediumAttachment *mediumAttachment,
1871
                           IMedium **medium)
T
Taowei 已提交
1872
{
1873
    return mediumAttachment->vtbl->GetMedium(mediumAttachment, medium);
T
Taowei 已提交
1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925
}

static nsresult
_mediumAttachmentGetController(IMediumAttachment *mediumAttachment,
                               PRUnichar **controller)
{
    return mediumAttachment->vtbl->GetController(mediumAttachment, controller);
}

static nsresult
_mediumAttachmentGetType(IMediumAttachment *mediumAttachment ATTRIBUTE_UNUSED,
                         PRUint32 *type ATTRIBUTE_UNUSED)
{
    return mediumAttachment->vtbl->GetType(mediumAttachment, type);
}

static nsresult
_mediumAttachmentGetPort(IMediumAttachment *mediumAttachment, PRInt32 *port)
{
    return mediumAttachment->vtbl->GetPort(mediumAttachment, port);
}

static nsresult
_mediumAttachmentGetDevice(IMediumAttachment *mediumAttachment, PRInt32 *device)
{
    return mediumAttachment->vtbl->GetDevice(mediumAttachment, device);
}

static nsresult
_storageControllerGetBus(IStorageController *storageController, PRUint32 *bus)
{
    return storageController->vtbl->GetBus(storageController, bus);
}

static nsresult
_sharedFolderGetHostPath(ISharedFolder *sharedFolder, PRUnichar **hostPath)
{
    return sharedFolder->vtbl->GetHostPath(sharedFolder, hostPath);
}

static nsresult
_sharedFolderGetName(ISharedFolder *sharedFolder, PRUnichar **name)
{
    return sharedFolder->vtbl->GetName(sharedFolder, name);
}

static nsresult
_sharedFolderGetWritable(ISharedFolder *sharedFolder, PRBool *writable)
{
    return sharedFolder->vtbl->GetWritable(sharedFolder, writable);
}

1926 1927 1928 1929 1930 1931 1932
static nsresult
_snapshotGetName(ISnapshot *snapshot, PRUnichar **name)
{
    return snapshot->vtbl->GetName(snapshot, name);
}

static nsresult
1933
_snapshotGetId(ISnapshot *snapshot, vboxIID *iid)
1934
{
1935
    return snapshot->vtbl->GetId(snapshot, &iid->value);
1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967
}

static nsresult
_snapshotGetMachine(ISnapshot *snapshot, IMachine **machine)
{
    return snapshot->vtbl->GetMachine(snapshot, machine);
}

static nsresult
_snapshotGetDescription(ISnapshot *snapshot, PRUnichar **description)
{
    return snapshot->vtbl->GetDescription(snapshot, description);
}

static nsresult
_snapshotGetTimeStamp(ISnapshot *snapshot, PRInt64 *timeStamp)
{
    return snapshot->vtbl->GetTimeStamp(snapshot, timeStamp);
}

static nsresult
_snapshotGetParent(ISnapshot *snapshot, ISnapshot **parent)
{
    return snapshot->vtbl->GetParent(snapshot, parent);
}

static nsresult
_snapshotGetOnline(ISnapshot *snapshot, PRBool *online)
{
    return snapshot->vtbl->GetOnline(snapshot, online);
}

T
Taowei 已提交
1968 1969 1970 1971 1972 1973 1974 1975 1976
static nsresult
_displayGetScreenResolution(IDisplay *display ATTRIBUTE_UNUSED,
                            PRUint32 screenId ATTRIBUTE_UNUSED,
                            PRUint32 *width ATTRIBUTE_UNUSED,
                            PRUint32 *height ATTRIBUTE_UNUSED,
                            PRUint32 *bitsPerPixel ATTRIBUTE_UNUSED,
                            PRInt32 *xOrigin ATTRIBUTE_UNUSED,
                            PRInt32 *yOrigin ATTRIBUTE_UNUSED)
{
1977
#if VBOX_API_VERSION < 4003000
T
Taowei 已提交
1978 1979
    return display->vtbl->GetScreenResolution(display, screenId, width,
                                              height, bitsPerPixel);
M
Martin Pietsch 已提交
1980
#elif VBOX_API_VERSION < 5000000 /* VBOX_API_VERSION >= 4003000 */
T
Taowei 已提交
1981 1982 1983
    return display->vtbl->GetScreenResolution(display, screenId, width,
                                              height, bitsPerPixel,
                                              xOrigin, yOrigin);
M
Martin Pietsch 已提交
1984 1985 1986 1987 1988 1989 1990
#else /*VBOX_API_VERSION >= 5000000 */
    PRUint32 gms;

    return display->vtbl->GetScreenResolution(display, screenId, width,
                                              height, bitsPerPixel,
                                              xOrigin, yOrigin, &gms);
#endif /* VBOX_API_VERSION >= 5000000 */
T
Taowei 已提交
1991 1992 1993
}

static nsresult
1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
_displayTakeScreenShotPNGToArray(IDisplay *display, PRUint32 screenId,
                                 PRUint32 width, PRUint32 height,
                                 PRUint32 *screenDataSize,
                                 PRUint8** screenData)
{
#if VBOX_API_VERSION >= 5000000
    return display->vtbl->TakeScreenShotToArray(display, screenId, width,
                                                height, BitmapFormat_PNG,
                                                screenDataSize, screenData);
#else /* VBOX_API_VERSION < 5000000 */
T
Taowei 已提交
2004 2005 2006
    return display->vtbl->TakeScreenShotPNGToArray(display, screenId, width,
                                                   height, screenDataSize,
                                                   screenData);
2007
#endif /* VBOX_API_VERSION >= 5000000 */
T
Taowei 已提交
2008 2009
}

T
Taowei 已提交
2010
static nsresult
2011
_hostFindHostNetworkInterfaceById(IHost *host, vboxIID *iid,
T
Taowei 已提交
2012 2013
                                  IHostNetworkInterface **networkInterface)
{
2014
    return host->vtbl->FindHostNetworkInterfaceById(host, iid->value,
T
Taowei 已提交
2015 2016 2017
                                                    networkInterface);
}

T
Taowei 已提交
2018 2019 2020 2021 2022 2023 2024 2025
static nsresult
_hostFindHostNetworkInterfaceByName(IHost *host, PRUnichar *name,
                                    IHostNetworkInterface **networkInterface)
{
    return host->vtbl->FindHostNetworkInterfaceByName(host, name,
                                                      networkInterface);
}

T
Taowei 已提交
2026
static nsresult
2027
_hostCreateHostOnlyNetworkInterface(vboxDriverPtr data ATTRIBUTE_UNUSED,
T
Taowei 已提交
2028 2029 2030 2031 2032
                                    IHost *host, char *name ATTRIBUTE_UNUSED,
                                    IHostNetworkInterface **networkInterface)
{
    nsresult rc = -1;
    IProgress *progress = NULL;
2033

T
Taowei 已提交
2034 2035 2036 2037 2038 2039 2040
    host->vtbl->CreateHostOnlyNetworkInterface(host, networkInterface,
                                               &progress);

    if (progress) {
        rc = progress->vtbl->WaitForCompletion(progress, -1);
        VBOX_RELEASE(progress);
    }
2041

T
Taowei 已提交
2042 2043 2044
    return rc;
}

T
Taowei 已提交
2045 2046
static nsresult
_hostRemoveHostOnlyNetworkInterface(IHost *host ATTRIBUTE_UNUSED,
2047
                                    vboxIID *iid ATTRIBUTE_UNUSED,
T
Taowei 已提交
2048 2049
                                    IProgress **progress ATTRIBUTE_UNUSED)
{
2050
    return host->vtbl->RemoveHostOnlyNetworkInterface(host, iid->value, progress);
T
Taowei 已提交
2051 2052
}

T
Taowei 已提交
2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
static nsresult
_hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType)
{
    return hni->vtbl->GetInterfaceType(hni, interfaceType);
}

static nsresult
_hnInterfaceGetStatus(IHostNetworkInterface *hni, PRUint32 *status)
{
    return hni->vtbl->GetStatus(hni, status);
}

T
Taowei 已提交
2065 2066 2067 2068 2069 2070
static nsresult
_hnInterfaceGetName(IHostNetworkInterface *hni, PRUnichar **name)
{
    return hni->vtbl->GetName(hni, name);
}

T
Taowei 已提交
2071
static nsresult
2072
_hnInterfaceGetId(IHostNetworkInterface *hni, vboxIID *iid)
T
Taowei 已提交
2073
{
2074
    return hni->vtbl->GetId(hni, &iid->value);
T
Taowei 已提交
2075 2076
}

T
Taowei 已提交
2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094
static nsresult
_hnInterfaceGetHardwareAddress(IHostNetworkInterface *hni, PRUnichar **hardwareAddress)
{
    return hni->vtbl->GetHardwareAddress(hni, hardwareAddress);
}

static nsresult
_hnInterfaceGetIPAddress(IHostNetworkInterface *hni, PRUnichar **IPAddress)
{
    return hni->vtbl->GetIPAddress(hni, IPAddress);
}

static nsresult
_hnInterfaceGetNetworkMask(IHostNetworkInterface *hni, PRUnichar **networkMask)
{
    return hni->vtbl->GetNetworkMask(hni, networkMask);
}

T
Taowei 已提交
2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125
static nsresult
_hnInterfaceEnableStaticIPConfig(IHostNetworkInterface *hni, PRUnichar *IPAddress,
                                 PRUnichar *networkMask)
{
#if VBOX_API_VERSION < 4002000
    return hni->vtbl->EnableStaticIpConfig(hni, IPAddress, networkMask);
#else
    return hni->vtbl->EnableStaticIPConfig(hni, IPAddress, networkMask);
#endif
}

static nsresult
_hnInterfaceEnableDynamicIPConfig(IHostNetworkInterface *hni)
{
#if VBOX_API_VERSION < 4002000
    return hni->vtbl->EnableDynamicIpConfig(hni);
#else
    return hni->vtbl->EnableDynamicIPConfig(hni);
#endif
}

static nsresult
_hnInterfaceDHCPRediscover(IHostNetworkInterface *hni)
{
#if VBOX_API_VERSION < 4002000
    return hni->vtbl->DhcpRediscover(hni);
#else
    return hni->vtbl->DHCPRediscover(hni);
#endif
}

T
Taowei 已提交
2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149
static nsresult
_dhcpServerGetIPAddress(IDHCPServer *dhcpServer, PRUnichar **IPAddress)
{
    return dhcpServer->vtbl->GetIPAddress(dhcpServer, IPAddress);
}

static nsresult
_dhcpServerGetNetworkMask(IDHCPServer *dhcpServer, PRUnichar **networkMask)
{
    return dhcpServer->vtbl->GetNetworkMask(dhcpServer, networkMask);
}

static nsresult
_dhcpServerGetLowerIP(IDHCPServer *dhcpServer, PRUnichar **lowerIP)
{
    return dhcpServer->vtbl->GetLowerIP(dhcpServer, lowerIP);
}

static nsresult
_dhcpServerGetUpperIP(IDHCPServer *dhcpServer, PRUnichar **upperIP)
{
    return dhcpServer->vtbl->GetUpperIP(dhcpServer, upperIP);
}

T
Taowei 已提交
2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173
static nsresult
_dhcpServerSetEnabled(IDHCPServer *dhcpServer, PRBool enabled)
{
    return dhcpServer->vtbl->SetEnabled(dhcpServer, enabled);
}

static nsresult
_dhcpServerSetConfiguration(IDHCPServer *dhcpServer, PRUnichar *IPAddress,
                            PRUnichar *networkMask, PRUnichar *FromIPAddress,
                            PRUnichar *ToIPAddress)
{
    return dhcpServer->vtbl->SetConfiguration(dhcpServer, IPAddress,
                                              networkMask, FromIPAddress,
                                              ToIPAddress);
}

static nsresult
_dhcpServerStart(IDHCPServer *dhcpServer, PRUnichar *networkName,
                 PRUnichar *trunkName, PRUnichar *trunkType)
{
    return dhcpServer->vtbl->Start(dhcpServer, networkName,
                                   trunkName, trunkType);
}

T
Taowei 已提交
2174 2175 2176 2177 2178 2179
static nsresult
_dhcpServerStop(IDHCPServer *dhcpServer)
{
    return dhcpServer->vtbl->Stop(dhcpServer);
}

2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193
static nsresult
_keyboardPutScancode(IKeyboard *keyboard, PRInt32 scancode)
{
    return keyboard->vtbl->PutScancode(keyboard, scancode);
}

static nsresult
_keyboardPutScancodes(IKeyboard *keyboard, PRUint32 scancodesSize,
                      PRInt32 *scanCodes, PRUint32 *codesStored)
{
    return keyboard->vtbl->PutScancodes(keyboard, scancodesSize, scanCodes,
                                        codesStored);
}

T
Taowei 已提交
2194 2195 2196 2197 2198 2199
static bool _machineStateOnline(PRUint32 state)
{
    return ((state >= MachineState_FirstOnline) &&
            (state <= MachineState_LastOnline));
}

2200 2201
static bool _machineStateInactive(PRUint32 state)
{
2202 2203
    return ((state < MachineState_FirstOnline) ||
            (state > MachineState_LastOnline));
2204 2205
}

T
Taowei 已提交
2206 2207 2208 2209 2210 2211 2212
static bool _machineStateNotStart(PRUint32 state)
{
    return ((state == MachineState_PoweredOff) ||
            (state == MachineState_Saved) ||
            (state == MachineState_Aborted));
}

T
Taowei 已提交
2213 2214 2215 2216 2217
static bool _machineStateRunning(PRUint32 state)
{
    return state == MachineState_Running;
}

T
Taowei 已提交
2218 2219 2220 2221 2222
static bool _machineStatePaused(PRUint32 state)
{
    return state == MachineState_Paused;
}

T
Taowei 已提交
2223 2224 2225 2226 2227
static bool _machineStatePoweredOff(PRUint32 state)
{
    return state == MachineState_PoweredOff;
}

T
Taowei 已提交
2228 2229 2230 2231 2232 2233 2234 2235 2236 2237
static vboxUniformedPFN _UPFN = {
    .Initialize = _pfnInitialize,
    .Uninitialize = _pfnUninitialize,
    .ComUnallocMem = _pfnComUnallocMem,
    .Utf16Free = _pfnUtf16Free,
    .Utf8Free = _pfnUtf8Free,
    .Utf16ToUtf8 = _pfnUtf16ToUtf8,
    .Utf8ToUtf16 = _pfnUtf8ToUtf16,
};

T
Taowei 已提交
2238 2239 2240 2241 2242 2243 2244
static vboxUniformedIID _UIID = {
    .vboxIIDInitialize = _vboxIIDInitialize,
    .vboxIIDUnalloc = _vboxIIDUnalloc,
    .vboxIIDToUUID = _vboxIIDToUUID,
    .vboxIIDFromUUID = _vboxIIDFromUUID,
    .vboxIIDIsEqual = _vboxIIDIsEqual,
    .vboxIIDFromArrayItem = _vboxIIDFromArrayItem,
2245
    .vboxIIDToUtf8 = _vboxIIDToUtf8,
T
Taowei 已提交
2246 2247 2248
    .DEBUGIID = _DEBUGIID,
};

T
Taowei 已提交
2249 2250
static vboxUniformedArray _UArray = {
    .vboxArrayGet = vboxArrayGet,
2251
    .vboxArrayGetWithIIDArg = _vboxArrayGetWithIIDArg,
T
Taowei 已提交
2252
    .vboxArrayRelease = vboxArrayRelease,
T
Taowei Luo 已提交
2253
    .vboxArrayUnalloc = vboxArrayUnalloc,
T
Taowei 已提交
2254
    .handleGetMachines = _handleGetMachines,
2255
    .handleGetHardDisks = _handleGetHardDisks,
T
Taowei 已提交
2256 2257 2258
    .handleUSBGetDeviceFilters = _handleUSBGetDeviceFilters,
    .handleMachineGetMediumAttachments = _handleMachineGetMediumAttachments,
    .handleMachineGetSharedFolders = _handleMachineGetSharedFolders,
2259 2260 2261
    .handleSnapshotGetChildren = _handleSnapshotGetChildren,
    .handleMediumGetChildren = _handleMediumGetChildren,
    .handleMediumGetSnapshotIds = _handleMediumGetSnapshotIds,
T
Taowei Luo 已提交
2262
    .handleMediumGetMachineIds = _handleMediumGetMachineIds,
T
Taowei 已提交
2263
    .handleHostGetNetworkInterfaces = _handleHostGetNetworkInterfaces,
T
Taowei 已提交
2264 2265
};

T
Taowei 已提交
2266 2267
static vboxUniformednsISupports _nsUISupports = {
    .Release = _nsisupportsRelease,
2268
    .AddRef = _nsisupportsAddRef,
T
Taowei 已提交
2269 2270
};

T
Taowei 已提交
2271 2272
static vboxUniformedIVirtualBox _UIVirtualBox = {
    .GetVersion = _virtualboxGetVersion,
T
Taowei 已提交
2273
    .GetMachine = _virtualboxGetMachine,
2274
    .OpenMachine = _virtualboxOpenMachine,
T
Taowei 已提交
2275
    .GetSystemProperties = _virtualboxGetSystemProperties,
T
Taowei 已提交
2276
    .GetHost = _virtualboxGetHost,
T
Taowei 已提交
2277
    .CreateMachine = _virtualboxCreateMachine,
2278
    .CreateHardDisk = _virtualboxCreateHardDisk,
T
Taowei 已提交
2279
    .RegisterMachine = _virtualboxRegisterMachine,
2280
    .FindHardDisk = _virtualboxFindHardDisk,
T
Taowei 已提交
2281
    .OpenMedium = _virtualboxOpenMedium,
2282
    .GetHardDiskByIID = _virtualboxGetHardDiskByIID,
T
Taowei 已提交
2283 2284
    .FindDHCPServerByNetworkName = _virtualboxFindDHCPServerByNetworkName,
    .CreateDHCPServer = _virtualboxCreateDHCPServer,
T
Taowei 已提交
2285
    .RemoveDHCPServer = _virtualboxRemoveDHCPServer,
T
Taowei 已提交
2286 2287
};

T
Taowei 已提交
2288
static vboxUniformedIMachine _UIMachine = {
T
Taowei 已提交
2289
    .AddStorageController = _machineAddStorageController,
T
Taowei 已提交
2290
    .GetStorageControllerByName = _machineGetStorageControllerByName,
T
Taowei 已提交
2291 2292
    .AttachDevice = _machineAttachDevice,
    .CreateSharedFolder = _machineCreateSharedFolder,
T
Taowei 已提交
2293
    .RemoveSharedFolder = _machineRemoveSharedFolder,
T
Taowei 已提交
2294
    .LaunchVMProcess = _machineLaunchVMProcess,
2295
    .Unregister = _machineUnregister,
2296
    .FindSnapshot = _machineFindSnapshot,
T
Taowei Luo 已提交
2297
    .DetachDevice = _machineDetachDevice,
T
Taowei 已提交
2298 2299
    .GetAccessible = _machineGetAccessible,
    .GetState = _machineGetState,
T
Taowei 已提交
2300 2301
    .GetName = _machineGetName,
    .GetId = _machineGetId,
T
Taowei 已提交
2302 2303 2304 2305 2306 2307
    .GetBIOSSettings = _machineGetBIOSSettings,
    .GetAudioAdapter = _machineGetAudioAdapter,
    .GetNetworkAdapter = _machineGetNetworkAdapter,
    .GetChipsetType = _machineGetChipsetType,
    .GetSerialPort = _machineGetSerialPort,
    .GetParallelPort = _machineGetParallelPort,
2308
    .GetVRDEServer = _machineGetVRDEServer,
T
Taowei 已提交
2309
    .GetUSBCommon = _machineGetUSBCommon,
2310 2311
    .GetCurrentSnapshot = _machineGetCurrentSnapshot,
    .GetSettingsFilePath = _machineGetSettingsFilePath,
T
Taowei 已提交
2312
    .GetCPUCount = _machineGetCPUCount,
T
Taowei 已提交
2313
    .SetCPUCount = _machineSetCPUCount,
T
Taowei 已提交
2314
    .GetMemorySize = _machineGetMemorySize,
T
Taowei 已提交
2315
    .SetMemorySize = _machineSetMemorySize,
T
Taowei 已提交
2316
    .GetCPUProperty = _machineGetCPUProperty,
T
Taowei 已提交
2317
    .SetCPUProperty = _machineSetCPUProperty,
T
Taowei 已提交
2318
    .GetBootOrder = _machineGetBootOrder,
T
Taowei 已提交
2319
    .SetBootOrder = _machineSetBootOrder,
T
Taowei 已提交
2320
    .GetVRAMSize = _machineGetVRAMSize,
T
Taowei 已提交
2321
    .SetVRAMSize = _machineSetVRAMSize,
T
Taowei 已提交
2322
    .GetMonitorCount = _machineGetMonitorCount,
T
Taowei 已提交
2323
    .SetMonitorCount = _machineSetMonitorCount,
T
Taowei 已提交
2324
    .GetAccelerate3DEnabled = _machineGetAccelerate3DEnabled,
T
Taowei 已提交
2325
    .SetAccelerate3DEnabled = _machineSetAccelerate3DEnabled,
T
Taowei 已提交
2326
    .GetAccelerate2DVideoEnabled = _machineGetAccelerate2DVideoEnabled,
T
Taowei 已提交
2327
    .SetAccelerate2DVideoEnabled = _machineSetAccelerate2DVideoEnabled,
T
Taowei 已提交
2328
    .GetExtraData = _machineGetExtraData,
T
Taowei 已提交
2329
    .SetExtraData = _machineSetExtraData,
2330
    .GetSnapshotCount = _machineGetSnapshotCount,
T
Taowei 已提交
2331
    .SaveSettings = _machineSaveSettings,
T
Taowei 已提交
2332 2333
};

T
Taowei 已提交
2334
static vboxUniformedISession _UISession = {
T
Taowei 已提交
2335
    .Open = _sessionOpen,
T
Taowei 已提交
2336 2337
    .OpenExisting = _sessionOpenExisting,
    .GetConsole = _sessionGetConsole,
T
Taowei 已提交
2338
    .GetMachine = _sessionGetMachine,
T
Taowei 已提交
2339 2340 2341 2342 2343
    .Close = _sessionClose,
};

static vboxUniformedIConsole _UIConsole = {
    .SaveState = _consoleSaveState,
T
Taowei 已提交
2344
    .Pause = _consolePause,
T
Taowei 已提交
2345
    .Resume = _consoleResume,
T
Taowei 已提交
2346
    .PowerButton = _consolePowerButton,
T
Taowei 已提交
2347
    .PowerDown = _consolePowerDown,
T
Taowei 已提交
2348
    .Reset = _consoleReset,
2349
    .TakeSnapshot = _consoleTakeSnapshot,
T
Taowei 已提交
2350
    .DeleteSnapshot = _consoleDeleteSnapshot,
T
Taowei 已提交
2351
    .GetDisplay = _consoleGetDisplay,
2352
    .GetKeyboard = _consoleGetKeyboard,
T
Taowei 已提交
2353 2354 2355 2356 2357
};

static vboxUniformedIProgress _UIProgress = {
    .WaitForCompletion = _progressWaitForCompletion,
    .GetResultCode = _progressGetResultCode,
T
Taowei 已提交
2358
    .GetCompleted = _progressGetCompleted,
T
Taowei 已提交
2359 2360
};

T
Taowei 已提交
2361 2362
static vboxUniformedISystemProperties _UISystemProperties = {
    .GetMaxGuestCPUCount = _systemPropertiesGetMaxGuestCPUCount,
T
Taowei 已提交
2363 2364 2365 2366 2367 2368
    .GetMaxBootPosition = _systemPropertiesGetMaxBootPosition,
    .GetMaxNetworkAdapters = _systemPropertiesGetMaxNetworkAdapters,
    .GetSerialPortCount = _systemPropertiesGetSerialPortCount,
    .GetParallelPortCount = _systemPropertiesGetParallelPortCount,
    .GetMaxPortCountForStorageBus = _systemPropertiesGetMaxPortCountForStorageBus,
    .GetMaxDevicesPerPortForStorageBus = _systemPropertiesGetMaxDevicesPerPortForStorageBus,
T
Taowei 已提交
2369
    .GetMaxGuestRAM = _systemPropertiesGetMaxGuestRAM,
T
Taowei 已提交
2370 2371 2372
};

static vboxUniformedIBIOSSettings _UIBIOSSettings = {
T
Taowei 已提交
2373
    .GetACPIEnabled = _biosSettingsGetACPIEnabled,
T
Taowei 已提交
2374
    .SetACPIEnabled = _biosSettingsSetACPIEnabled,
T
Taowei 已提交
2375
    .GetIOAPICEnabled = _biosSettingsGetIOAPICEnabled,
T
Taowei 已提交
2376 2377 2378 2379
    .SetIOAPICEnabled = _biosSettingsSetIOAPICEnabled,
};

static vboxUniformedIAudioAdapter _UIAudioAdapter = {
T
Taowei 已提交
2380
    .GetEnabled = _audioAdapterGetEnabled,
T
Taowei 已提交
2381
    .SetEnabled = _audioAdapterSetEnabled,
T
Taowei 已提交
2382
    .GetAudioController = _audioAdapterGetAudioController,
T
Taowei 已提交
2383 2384 2385 2386
    .SetAudioController = _audioAdapterSetAudioController,
};

static vboxUniformedINetworkAdapter _UINetworkAdapter = {
T
Taowei 已提交
2387 2388
    .GetAttachmentType = _networkAdapterGetAttachmentType,
    .GetEnabled = _networkAdapterGetEnabled,
T
Taowei 已提交
2389
    .SetEnabled = _networkAdapterSetEnabled,
T
Taowei 已提交
2390
    .GetAdapterType = _networkAdapterGetAdapterType,
T
Taowei 已提交
2391
    .SetAdapterType = _networkAdapterSetAdapterType,
T
Taowei 已提交
2392
    .GetBridgedInterface = _networkAdapterGetBridgedInterface,
T
Taowei 已提交
2393
    .SetBridgedInterface = _networkAdapterSetBridgedInterface,
T
Taowei 已提交
2394
    .GetInternalNetwork = _networkAdapterGetInternalNetwork,
T
Taowei 已提交
2395
    .SetInternalNetwork = _networkAdapterSetInternalNetwork,
T
Taowei 已提交
2396
    .GetHostOnlyInterface = _networkAdapterGetHostOnlyInterface,
T
Taowei 已提交
2397
    .SetHostOnlyInterface = _networkAdapterSetHostOnlyInterface,
T
Taowei 已提交
2398
    .GetMACAddress = _networkAdapterGetMACAddress,
T
Taowei 已提交
2399 2400 2401 2402 2403 2404 2405 2406
    .SetMACAddress = _networkAdapterSetMACAddress,
    .AttachToBridgedInterface = _networkAdapterAttachToBridgedInterface,
    .AttachToInternalNetwork = _networkAdapterAttachToInternalNetwork,
    .AttachToHostOnlyInterface = _networkAdapterAttachToHostOnlyInterface,
    .AttachToNAT = _networkAdapterAttachToNAT,
};

static vboxUniformedISerialPort _UISerialPort = {
T
Taowei 已提交
2407
    .GetEnabled = _serialPortGetEnabled,
T
Taowei 已提交
2408
    .SetEnabled = _serialPortSetEnabled,
T
Taowei 已提交
2409
    .GetPath = _serialPortGetPath,
T
Taowei 已提交
2410
    .SetPath = _serialPortSetPath,
T
Taowei 已提交
2411
    .GetIRQ = _serialPortGetIRQ,
T
Taowei 已提交
2412
    .SetIRQ = _serialPortSetIRQ,
T
Taowei 已提交
2413
    .GetIOBase = _serialPortGetIOBase,
T
Taowei 已提交
2414
    .SetIOBase = _serialPortSetIOBase,
T
Taowei 已提交
2415
    .GetHostMode = _serialPortGetHostMode,
T
Taowei 已提交
2416 2417 2418 2419
    .SetHostMode = _serialPortSetHostMode,
};

static vboxUniformedIParallelPort _UIParallelPort = {
T
Taowei 已提交
2420
    .GetEnabled = _parallelPortGetEnabled,
T
Taowei 已提交
2421
    .SetEnabled = _parallelPortSetEnabled,
T
Taowei 已提交
2422
    .GetPath = _parallelPortGetPath,
T
Taowei 已提交
2423
    .SetPath = _parallelPortSetPath,
T
Taowei 已提交
2424
    .GetIRQ = _parallelPortGetIRQ,
T
Taowei 已提交
2425
    .SetIRQ = _parallelPortSetIRQ,
T
Taowei 已提交
2426
    .GetIOBase = _parallelPortGetIOBase,
T
Taowei 已提交
2427 2428 2429
    .SetIOBase = _parallelPortSetIOBase,
};

2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440
static vboxUniformedIVRDEServer _UIVRDEServer = {
    .GetEnabled = _vrdeServerGetEnabled,
    .SetEnabled = _vrdeServerSetEnabled,
    .GetPorts = _vrdeServerGetPorts,
    .SetPorts = _vrdeServerSetPorts,
    .GetReuseSingleConnection = _vrdeServerGetReuseSingleConnection,
    .SetReuseSingleConnection = _vrdeServerSetReuseSingleConnection,
    .GetAllowMultiConnection = _vrdeServerGetAllowMultiConnection,
    .SetAllowMultiConnection = _vrdeServerSetAllowMultiConnection,
    .GetNetAddress = _vrdeServerGetNetAddress,
    .SetNetAddress = _vrdeServerSetNetAddress,
T
Taowei 已提交
2441 2442 2443 2444
};

static vboxUniformedIUSBCommon _UIUSBCommon = {
    .Enable = _usbCommonEnable,
T
Taowei 已提交
2445
    .GetEnabled = _usbCommonGetEnabled,
T
Taowei 已提交
2446 2447 2448 2449 2450
    .CreateDeviceFilter = _usbCommonCreateDeviceFilter,
    .InsertDeviceFilter = _usbCommonInsertDeviceFilter,
};

static vboxUniformedIUSBDeviceFilter _UIUSBDeviceFilter = {
T
Taowei 已提交
2451
    .GetProductId = _usbDeviceFilterGetProductId,
T
Taowei 已提交
2452
    .SetProductId = _usbDeviceFilterSetProductId,
T
Taowei 已提交
2453
    .GetActive = _usbDeviceFilterGetActive,
T
Taowei 已提交
2454
    .SetActive = _usbDeviceFilterSetActive,
T
Taowei 已提交
2455
    .GetVendorId = _usbDeviceFilterGetVendorId,
T
Taowei 已提交
2456 2457 2458 2459 2460
    .SetVendorId = _usbDeviceFilterSetVendorId,
};

static vboxUniformedIMedium _UIMedium = {
    .GetId = _mediumGetId,
T
Taowei 已提交
2461
    .GetLocation = _mediumGetLocation,
2462
    .GetState = _mediumGetState,
2463
    .GetName = _mediumGetName,
T
Taowei Luo 已提交
2464
    .GetSize = _mediumGetSize,
T
Taowei 已提交
2465
    .GetReadOnly = _mediumGetReadOnly,
2466 2467 2468 2469
    .GetParent = _mediumGetParent,
    .GetChildren = _mediumGetChildren,
    .GetFormat = _mediumGetFormat,
    .DeleteStorage = _mediumDeleteStorage,
T
Taowei 已提交
2470
    .Release = _mediumRelease,
2471
    .Close = _mediumClose,
T
Taowei 已提交
2472
    .SetType = _mediumSetType,
2473
    .CreateDiffStorage = _mediumCreateDiffStorage,
2474 2475
    .CreateBaseStorage = _mediumCreateBaseStorage,
    .GetLogicalSize = _mediumGetLogicalSize,
T
Taowei 已提交
2476 2477
};

T
Taowei 已提交
2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495
static vboxUniformedIMediumAttachment _UIMediumAttachment = {
    .GetMedium = _mediumAttachmentGetMedium,
    .GetController = _mediumAttachmentGetController,
    .GetType = _mediumAttachmentGetType,
    .GetPort = _mediumAttachmentGetPort,
    .GetDevice = _mediumAttachmentGetDevice,
};

static vboxUniformedIStorageController _UIStorageController = {
    .GetBus = _storageControllerGetBus,
};

static vboxUniformedISharedFolder _UISharedFolder = {
    .GetHostPath = _sharedFolderGetHostPath,
    .GetName = _sharedFolderGetName,
    .GetWritable = _sharedFolderGetWritable,
};

2496 2497 2498 2499 2500 2501 2502 2503 2504 2505
static vboxUniformedISnapshot _UISnapshot = {
    .GetName = _snapshotGetName,
    .GetId = _snapshotGetId,
    .GetMachine = _snapshotGetMachine,
    .GetDescription = _snapshotGetDescription,
    .GetTimeStamp = _snapshotGetTimeStamp,
    .GetParent = _snapshotGetParent,
    .GetOnline = _snapshotGetOnline,
};

T
Taowei 已提交
2506 2507 2508 2509 2510
static vboxUniformedIDisplay _UIDisplay = {
    .GetScreenResolution = _displayGetScreenResolution,
    .TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray,
};

T
Taowei 已提交
2511 2512
static vboxUniformedIHost _UIHost = {
    .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById,
T
Taowei 已提交
2513
    .FindHostNetworkInterfaceByName = _hostFindHostNetworkInterfaceByName,
T
Taowei 已提交
2514
    .CreateHostOnlyNetworkInterface = _hostCreateHostOnlyNetworkInterface,
T
Taowei 已提交
2515
    .RemoveHostOnlyNetworkInterface = _hostRemoveHostOnlyNetworkInterface,
T
Taowei 已提交
2516 2517
};

T
Taowei 已提交
2518 2519 2520
static vboxUniformedIHNInterface _UIHNInterface = {
    .GetInterfaceType = _hnInterfaceGetInterfaceType,
    .GetStatus = _hnInterfaceGetStatus,
T
Taowei 已提交
2521
    .GetName = _hnInterfaceGetName,
T
Taowei 已提交
2522
    .GetId = _hnInterfaceGetId,
T
Taowei 已提交
2523 2524 2525
    .GetHardwareAddress = _hnInterfaceGetHardwareAddress,
    .GetIPAddress = _hnInterfaceGetIPAddress,
    .GetNetworkMask = _hnInterfaceGetNetworkMask,
T
Taowei 已提交
2526 2527 2528 2529 2530 2531
    .EnableStaticIPConfig = _hnInterfaceEnableStaticIPConfig,
    .EnableDynamicIPConfig = _hnInterfaceEnableDynamicIPConfig,
    .DHCPRediscover = _hnInterfaceDHCPRediscover,
};

static vboxUniformedIDHCPServer _UIDHCPServer = {
T
Taowei 已提交
2532 2533 2534 2535
    .GetIPAddress = _dhcpServerGetIPAddress,
    .GetNetworkMask = _dhcpServerGetNetworkMask,
    .GetLowerIP = _dhcpServerGetLowerIP,
    .GetUpperIP = _dhcpServerGetUpperIP,
T
Taowei 已提交
2536 2537 2538
    .SetEnabled = _dhcpServerSetEnabled,
    .SetConfiguration = _dhcpServerSetConfiguration,
    .Start = _dhcpServerStart,
T
Taowei 已提交
2539
    .Stop = _dhcpServerStop,
T
Taowei 已提交
2540 2541
};

2542 2543 2544 2545 2546
static vboxUniformedIKeyboard _UIKeyboard = {
    .PutScancode = _keyboardPutScancode,
    .PutScancodes = _keyboardPutScancodes,
};

T
Taowei 已提交
2547 2548
static uniformedMachineStateChecker _machineStateChecker = {
    .Online = _machineStateOnline,
2549
    .Inactive = _machineStateInactive,
T
Taowei 已提交
2550
    .NotStart = _machineStateNotStart,
T
Taowei 已提交
2551
    .Running = _machineStateRunning,
T
Taowei 已提交
2552
    .Paused = _machineStatePaused,
T
Taowei 已提交
2553
    .PoweredOff = _machineStatePoweredOff,
T
Taowei 已提交
2554 2555
};

T
Taowei 已提交
2556 2557 2558 2559
void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
{
    pVBoxAPI->APIVersion = VBOX_API_VERSION;
    pVBoxAPI->XPCOMCVersion = VBOX_XPCOMC_VERSION;
T
Taowei 已提交
2560 2561
    pVBoxAPI->unregisterMachine = _unregisterMachine;
    pVBoxAPI->deleteConfig = _deleteConfig;
T
Taowei 已提交
2562
    pVBoxAPI->vboxConvertState = _vboxConvertState;
2563
    pVBoxAPI->snapshotRestore = _vboxDomainSnapshotRestore;
T
Taowei 已提交
2564
    pVBoxAPI->UPFN = _UPFN;
T
Taowei 已提交
2565
    pVBoxAPI->UIID = _UIID;
T
Taowei 已提交
2566
    pVBoxAPI->UArray = _UArray;
T
Taowei 已提交
2567
    pVBoxAPI->nsUISupports = _nsUISupports;
T
Taowei 已提交
2568
    pVBoxAPI->UIVirtualBox = _UIVirtualBox;
T
Taowei 已提交
2569
    pVBoxAPI->UIMachine = _UIMachine;
T
Taowei 已提交
2570 2571 2572
    pVBoxAPI->UISession = _UISession;
    pVBoxAPI->UIConsole = _UIConsole;
    pVBoxAPI->UIProgress = _UIProgress;
T
Taowei 已提交
2573
    pVBoxAPI->UISystemProperties = _UISystemProperties;
T
Taowei 已提交
2574 2575 2576 2577 2578
    pVBoxAPI->UIBIOSSettings = _UIBIOSSettings;
    pVBoxAPI->UIAudioAdapter = _UIAudioAdapter;
    pVBoxAPI->UINetworkAdapter = _UINetworkAdapter;
    pVBoxAPI->UISerialPort = _UISerialPort;
    pVBoxAPI->UIParallelPort = _UIParallelPort;
2579
    pVBoxAPI->UIVRDEServer = _UIVRDEServer;
T
Taowei 已提交
2580 2581 2582
    pVBoxAPI->UIUSBCommon = _UIUSBCommon;
    pVBoxAPI->UIUSBDeviceFilter = _UIUSBDeviceFilter;
    pVBoxAPI->UIMedium = _UIMedium;
T
Taowei 已提交
2583 2584 2585
    pVBoxAPI->UIMediumAttachment = _UIMediumAttachment;
    pVBoxAPI->UIStorageController = _UIStorageController;
    pVBoxAPI->UISharedFolder = _UISharedFolder;
2586
    pVBoxAPI->UISnapshot = _UISnapshot;
T
Taowei 已提交
2587
    pVBoxAPI->UIDisplay = _UIDisplay;
T
Taowei 已提交
2588
    pVBoxAPI->UIHost = _UIHost;
T
Taowei 已提交
2589
    pVBoxAPI->UIHNInterface = _UIHNInterface;
T
Taowei 已提交
2590
    pVBoxAPI->UIDHCPServer = _UIDHCPServer;
2591
    pVBoxAPI->UIKeyboard = _UIKeyboard;
T
Taowei 已提交
2592
    pVBoxAPI->machineStateChecker = _machineStateChecker;
T
Taowei 已提交
2593

T
Taowei 已提交
2594 2595 2596 2597 2598 2599
#if VBOX_API_VERSION >= 4001000
    pVBoxAPI->chipsetType = 1;
#else /* VBOX_API_VERSION < 4001000 */
    pVBoxAPI->chipsetType = 0;
#endif /* VBOX_API_VERSION < 4001000 */

2600 2601 2602 2603 2604
#if VBOX_API_VERSION >= 4002000
    pVBoxAPI->vboxSnapshotRedefine = 1;
#else /* VBOX_API_VERSION < 4002000 */
    pVBoxAPI->vboxSnapshotRedefine = 0;
#endif /* VBOX_API_VERSION < 4002000 */
T
Taowei 已提交
2605
}