vbox_tmpl.c 78.5 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_IID_INITIALIZER { NULL, true }
148 149

static void
150
_vboxIIDUnalloc(vboxDriverPtr data, vboxIID *iid)
151
{
152
    if (iid->value != NULL && iid->owner)
153 154 155 156
        data->pFuncs->pfnUtf16Free(iid->value);

    iid->value = NULL;
    iid->owner = true;
157 158
}

T
Taowei 已提交
159
static void
160 161
_vboxIIDToUUID(vboxDriverPtr data, vboxIID *iid,
               unsigned char *uuid)
162 163 164 165 166
{
    char *utf8 = NULL;

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

167
    ignore_value(virUUIDParse(utf8, uuid));
168 169

    data->pFuncs->pfnUtf8Free(utf8);
170 171
}

T
Taowei 已提交
172
static void
173 174
_vboxIIDFromUUID(vboxDriverPtr data, vboxIID *iid,
                 const unsigned char *uuid)
175 176
{
    char utf8[VIR_UUID_STRING_BUFLEN];
177

178
    _vboxIIDUnalloc(data, iid);
179

180
    virUUIDFormat(uuid, utf8);
181

182 183
    data->pFuncs->pfnUtf8ToUtf16(utf8, &iid->value);
}
184

185
static bool
186 187
_vboxIIDIsEqual(vboxDriverPtr data, vboxIID *iid1,
                vboxIID *iid2)
188 189 190
{
    unsigned char uuid1[VIR_UUID_BUFLEN];
    unsigned char uuid2[VIR_UUID_BUFLEN];
191 192

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

200 201
    return memcmp(uuid1, uuid2, VIR_UUID_BUFLEN) == 0;
}
202

203
static void
204 205
_vboxIIDFromArrayItem(vboxDriverPtr data, vboxIID *iid,
                      vboxArray *array, int idx)
206
{
207
    _vboxIIDUnalloc(data, iid);
208

209 210
    iid->value = array->items[idx];
    iid->owner = false;
211 212
}

213 214 215 216
#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)
217
#define vboxIIDFromArrayItem(iid, array, idx) \
218
    _vboxIIDFromArrayItem(data, iid, array, idx)
219
#define DEBUGIID(msg, strUtf16) DEBUGPRUnichar(msg, strUtf16)
220 221 222 223

/**
 * Converts Utf-16 string to int
 */
224
static int PRUnicharToInt(PCVBOXXPCOM pFuncs, PRUnichar *strUtf16)
225
{
226 227 228 229 230 231
    char *strUtf8 = NULL;
    int ret = 0;

    if (!strUtf16)
        return -1;

232
    pFuncs->pfnUtf16ToUtf8(strUtf16, &strUtf8);
233 234 235
    if (!strUtf8)
        return -1;

236 237 238
    if (virStrToLong_i(strUtf8, NULL, 10, &ret) < 0)
        ret = -1;

239
    pFuncs->pfnUtf8Free(strUtf8);
240 241 242 243 244 245 246

    return ret;
}

/**
 * Converts int to Utf-16 string
 */
247
static PRUnichar *PRUnicharFromInt(PCVBOXXPCOM pFuncs, int n) {
248 249 250 251 252
    PRUnichar *strUtf16 = NULL;
    char s[24];

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

253
    pFuncs->pfnUtf8ToUtf16(s, &strUtf16);
254 255 256 257

    return strUtf16;
}

T
Taowei 已提交
258
static virDomainState _vboxConvertState(PRUint32 state)
259
{
260 261 262 263 264 265 266 267 268 269
    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 已提交
270
        case MachineState_Saved:
271 272 273 274 275 276 277 278 279
            return VIR_DOMAIN_SHUTOFF;
        case MachineState_Aborted:
            return VIR_DOMAIN_CRASHED;
        case MachineState_Null:
        default:
            return VIR_DOMAIN_NOSTATE;
    }
}

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

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

299 300
    rc = machine->vtbl->GetId(machine, &domiid.value);
    if (NS_FAILED(rc)) {
301 302
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("could not get domain UUID"));
J
Jiri Denemark 已提交
303 304 305 306 307
        goto cleanup;
    }

    rc = machine->vtbl->GetState(machine, &state);
    if (NS_FAILED(rc)) {
308 309
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("could not get domain state"));
J
Jiri Denemark 已提交
310 311 312 313 314
        goto cleanup;
    }

    if (state >= MachineState_FirstOnline
        && state <= MachineState_LastOnline) {
315 316
        virReportError(VIR_ERR_OPERATION_INVALID,
                       _("domain %s is already running"), dom->name);
J
Jiri Denemark 已提交
317 318 319
        goto cleanup;
    }

320
    rc = machine->vtbl->LockMachine(machine, data->vboxSession, LockType_Write);
321
#if VBOX_API_VERSION < 5000000
J
Jiri Denemark 已提交
322 323
    if (NS_SUCCEEDED(rc))
        rc = data->vboxSession->vtbl->GetConsole(data->vboxSession, &console);
324
#endif /*VBOX_API_VERSION < 5000000*/
J
Jiri Denemark 已提交
325
    if (NS_FAILED(rc)) {
326 327 328
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("could not open VirtualBox session with domain %s"),
                       dom->name);
J
Jiri Denemark 已提交
329 330 331
        goto cleanup;
    }

332
#if VBOX_API_VERSION < 5000000
J
Jiri Denemark 已提交
333
    rc = console->vtbl->RestoreSnapshot(console, snapshot, &progress);
334
#elif VBOX_API_VERSION >= 5000000  /*VBOX_API_VERSION < 5000000*/
M
Martin Pietsch 已提交
335
    rc = machine->vtbl->RestoreSnapshot(machine, snapshot, &progress);
336
#endif /*VBOX_API_VERSION >= 5000000*/
M
Martin Pietsch 已提交
337

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

    progress->vtbl->WaitForCompletion(progress, -1);
    progress->vtbl->GetResultCode(progress, &result);
    if (NS_FAILED(result)) {
353 354
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("could not restore snapshot for domain %s"), dom->name);
J
Jiri Denemark 已提交
355 356 357 358 359
        goto cleanup;
    }

    ret = 0;

360
 cleanup:
J
Jiri Denemark 已提交
361
    VBOX_RELEASE(progress);
362
#if VBOX_API_VERSION < 5000000
J
Jiri Denemark 已提交
363
    VBOX_RELEASE(console);
364
#endif /*VBOX_API_VERSION < 5000000*/
365
    data->vboxSession->vtbl->UnlockMachine(data->vboxSession);
366
    vboxIIDUnalloc(&domiid);
J
Jiri Denemark 已提交
367 368 369
    return ret;
}

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

382 383 384 385 386 387 388 389 390
    /* 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 已提交
391

392 393 394 395
static void
_deleteConfig(IMachine *machine)
{
    IProgress *progress = NULL;
T
Taowei 已提交
396

397 398 399 400 401 402 403 404 405 406
    /* 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 已提交
407

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
# 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 已提交
427 428
}

429
static int _pfnInitialize(vboxDriverPtr driver)
T
Taowei 已提交
430
{
431 432 433 434 435 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
    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 已提交
463
        data->pFuncs->pfnComUninitialize();
464 465
#endif
    }
466
}
467

T
Taowei 已提交
468
static void _pfnComUnallocMem(PCVBOXXPCOM pFuncs, void *pv)
469
{
T
Taowei 已提交
470 471
    pFuncs->pfnComUnallocMem(pv);
}
472

T
Taowei 已提交
473 474 475 476
static void _pfnUtf16Free(PCVBOXXPCOM pFuncs, PRUnichar *pwszString)
{
    pFuncs->pfnUtf16Free(pwszString);
}
E
Eric Blake 已提交
477

T
Taowei 已提交
478 479 480 481
static void _pfnUtf8Free(PCVBOXXPCOM pFuncs, char *pszString)
{
    pFuncs->pfnUtf8Free(pszString);
}
482

T
Taowei 已提交
483 484 485 486
static int _pfnUtf16ToUtf8(PCVBOXXPCOM pFuncs, const PRUnichar *pwszString, char **ppszString)
{
    return pFuncs->pfnUtf16ToUtf8(pwszString, ppszString);
}
487

T
Taowei 已提交
488 489 490 491
static int _pfnUtf8ToUtf16(PCVBOXXPCOM pFuncs, const char *pszString, PRUnichar **ppwszString)
{
    return pFuncs->pfnUtf8ToUtf16(pszString, ppwszString);
}
492

493
static void _vboxIIDInitialize(vboxIID *iid)
T
Taowei 已提交
494
{
495 496
    memset(iid, 0, sizeof(vboxIID));
    iid->owner = true;
T
Taowei 已提交
497
}
498

499
static void _DEBUGIID(vboxDriverPtr data, const char *msg, vboxIID *iid)
T
Taowei 已提交
500
{
501
    DEBUGPRUnichar(msg, iid->value);
T
Taowei 已提交
502
}
503

504
static void
505
_vboxIIDToUtf8(vboxDriverPtr data ATTRIBUTE_UNUSED,
506
               vboxIID *iid ATTRIBUTE_UNUSED,
507 508
               char **utf8 ATTRIBUTE_UNUSED)
{
509
    data->pFuncs->pfnUtf16ToUtf8(iid->value, utf8);
510 511
}

512
static nsresult
513
_vboxArrayGetWithIIDArg(vboxArray *array, void *self, void *getter, vboxIID *iid)
514
{
515
    return vboxArrayGetWithPtrArg(array, self, getter, iid->value);
516 517
}

T
Taowei 已提交
518 519 520 521
static void* _handleGetMachines(IVirtualBox *vboxObj)
{
    return vboxObj->vtbl->GetMachines;
}
522

523 524 525 526 527
static void* _handleGetHardDisks(IVirtualBox *vboxObj)
{
    return vboxObj->vtbl->GetHardDisks;
}

T
Taowei 已提交
528 529 530 531 532 533 534 535 536 537 538 539 540 541 542
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;
}

543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
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 已提交
558 559 560 561 562
static void* _handleMediumGetMachineIds(IMedium *medium)
{
    return medium->vtbl->GetMachineIds;
}

T
Taowei 已提交
563 564 565 566 567
static void* _handleHostGetNetworkInterfaces(IHost *host)
{
    return host->vtbl->GetNetworkInterfaces;
}

T
Taowei 已提交
568 569 570 571
static nsresult _nsisupportsRelease(nsISupports *nsi)
{
    return nsi->vtbl->Release(nsi);
}
572

573 574 575 576 577
static nsresult _nsisupportsAddRef(nsISupports *nsi)
{
    return nsi->vtbl->AddRef(nsi);
}

T
Taowei 已提交
578 579 580 581 582
static nsresult
_virtualboxGetVersion(IVirtualBox *vboxObj, PRUnichar **versionUtf16)
{
    return vboxObj->vtbl->GetVersion(vboxObj, versionUtf16);
}
583

T
Taowei 已提交
584
static nsresult
585
_virtualboxGetMachine(IVirtualBox *vboxObj, vboxIID *iid, IMachine **machine)
T
Taowei 已提交
586
{
587
    return vboxObj->vtbl->FindMachine(vboxObj, iid->value, machine);
588
}
T
Taowei 已提交
589

590 591 592 593 594 595
static nsresult
_virtualboxOpenMachine(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine)
{
    return vboxObj->vtbl->OpenMachine(vboxObj, settingsFile, machine);
}

T
Taowei 已提交
596 597 598 599 600
static nsresult
_virtualboxGetSystemProperties(IVirtualBox *vboxObj, ISystemProperties **systemProperties)
{
    return vboxObj->vtbl->GetSystemProperties(vboxObj, systemProperties);
}
601

T
Taowei 已提交
602 603 604 605 606 607
static nsresult
_virtualboxGetHost(IVirtualBox *vboxObj, IHost **host)
{
    return vboxObj->vtbl->GetHost(vboxObj, host);
}

T
Taowei 已提交
608
static nsresult
609
_virtualboxCreateMachine(vboxDriverPtr data, virDomainDefPtr def, IMachine **machine, char *uuidstr ATTRIBUTE_UNUSED)
610 611
{
    vboxIID iid = VBOX_IID_INITIALIZER;
T
Taowei 已提交
612
    PRUnichar *machineNameUtf16 = NULL;
613
    nsresult rc = -1;
614

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

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

652
static nsresult
653
_virtualboxCreateHardDisk(IVirtualBox *vboxObj, PRUnichar *format,
654
                          PRUnichar *location, IMedium **medium)
655
{
656 657 658
    /* 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 已提交
659
#if VBOX_API_VERSION < 5000000
660
    return vboxObj->vtbl->CreateHardDisk(vboxObj, format, location, medium);
M
Martin Pietsch 已提交
661
#elif VBOX_API_VERSION >= 5000000 /*VBOX_API_VERSION >= 5000000*/
662
    return vboxObj->vtbl->CreateMedium(vboxObj, format, location, AccessMode_ReadWrite, DeviceType_HardDisk, medium);
M
Martin Pietsch 已提交
663
#endif /*VBOX_API_VERSION >= 5000000*/
664 665
}

T
Taowei 已提交
666 667 668 669 670
static nsresult
_virtualboxRegisterMachine(IVirtualBox *vboxObj, IMachine *machine)
{
    return vboxObj->vtbl->RegisterMachine(vboxObj, machine);
}
671

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

T
Taowei 已提交
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
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
}
707

708
static nsresult
709
_virtualboxGetHardDiskByIID(IVirtualBox *vboxObj, vboxIID *iid, IMedium **medium)
710
{
711
#if VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000
712
    return vboxObj->vtbl->FindMedium(vboxObj, iid->value, DeviceType_HardDisk,
713
                                     medium);
714
#else /* VBOX_API_VERSION >= 4002000 */
715
    return vboxObj->vtbl->OpenMedium(vboxObj, iid->value, DeviceType_HardDisk,
716
                                     AccessMode_ReadWrite, PR_FALSE, medium);
717 718 719
#endif /* VBOX_API_VERSION >= 4002000 */
}

T
Taowei 已提交
720 721 722 723 724 725 726 727 728 729 730 731
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 已提交
732 733 734 735 736 737
static nsresult
_virtualboxRemoveDHCPServer(IVirtualBox *vboxObj, IDHCPServer *server)
{
    return vboxObj->vtbl->RemoveDHCPServer(vboxObj, server);
}

T
Taowei 已提交
738 739 740 741 742 743 744 745
static nsresult
_machineAddStorageController(IMachine *machine, PRUnichar *name,
                             PRUint32 connectionType,
                             IStorageController **controller)
{
    return machine->vtbl->AddStorageController(machine, name, connectionType,
                                               controller);
}
746

T
Taowei 已提交
747 748 749 750 751 752 753 754
static nsresult
_machineGetStorageControllerByName(IMachine *machine, PRUnichar *name,
                                   IStorageController **storageController)
{
    return machine->vtbl->GetStorageControllerByName(machine, name,
                                                     storageController);
}

T
Taowei 已提交
755 756 757 758 759 760 761 762 763 764 765
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);
}
766

T
Taowei 已提交
767 768 769 770 771 772 773 774
static nsresult
_machineCreateSharedFolder(IMachine *machine, PRUnichar *name,
                           PRUnichar *hostPath, PRBool writable,
                           PRBool automount ATTRIBUTE_UNUSED)
{
    return machine->vtbl->CreateSharedFolder(machine, name, hostPath,
                                             writable, automount);
}
775

T
Taowei 已提交
776 777 778 779 780 781
static nsresult
_machineRemoveSharedFolder(IMachine *machine, PRUnichar *name)
{
    return machine->vtbl->RemoveSharedFolder(machine, name);
}

T
Taowei 已提交
782
static nsresult
783
_machineLaunchVMProcess(vboxDriverPtr data,
T
Taowei 已提交
784
                        IMachine *machine ATTRIBUTE_UNUSED,
785
                        vboxIID *iid ATTRIBUTE_UNUSED,
T
Taowei 已提交
786 787 788 789 790 791
                        PRUnichar *sessionType, PRUnichar *env,
                        IProgress **progress)
{
    return machine->vtbl->LaunchVMProcess(machine, data->vboxSession,
                                          sessionType, env, progress);
}
792

793 794 795 796 797 798 799 800 801
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);
}

802
static nsresult
803
_machineFindSnapshot(IMachine *machine, vboxIID *iid, ISnapshot **snapshot)
804
{
805
    return machine->vtbl->FindSnapshot(machine, iid->value, snapshot);
806 807
}

T
Taowei Luo 已提交
808 809 810 811 812 813 814
static nsresult
_machineDetachDevice(IMachine *machine, PRUnichar *name,
                     PRInt32 controllerPort, PRInt32 device)
{
    return machine->vtbl->DetachDevice(machine, name, controllerPort, device);
}

T
Taowei 已提交
815 816 817 818 819
static nsresult
_machineGetAccessible(IMachine *machine, PRBool *isAccessible)
{
    return machine->vtbl->GetAccessible(machine, isAccessible);
}
820

T
Taowei 已提交
821 822 823 824 825
static nsresult
_machineGetState(IMachine *machine, PRUint32 *state)
{
    return machine->vtbl->GetState(machine, state);
}
826

T
Taowei 已提交
827 828 829 830 831
static nsresult
_machineGetName(IMachine *machine, PRUnichar **name)
{
    return machine->vtbl->GetName(machine, name);
}
832

T
Taowei 已提交
833
static nsresult
834
_machineGetId(IMachine *machine, vboxIID *iid)
T
Taowei 已提交
835
{
836
    return machine->vtbl->GetId(machine, &iid->value);
T
Taowei 已提交
837
}
838

T
Taowei 已提交
839 840 841 842 843
static nsresult
_machineGetBIOSSettings(IMachine *machine, IBIOSSettings **bios)
{
    return machine->vtbl->GetBIOSSettings(machine, bios);
}
844

T
Taowei 已提交
845 846 847 848 849
static nsresult
_machineGetAudioAdapter(IMachine *machine, IAudioAdapter **audioadapter)
{
    return machine->vtbl->GetAudioAdapter(machine, audioadapter);
}
850

T
Taowei 已提交
851 852 853 854 855
static nsresult
_machineGetNetworkAdapter(IMachine *machine, PRUint32 slot, INetworkAdapter **adapter)
{
    return machine->vtbl->GetNetworkAdapter(machine, slot, adapter);
}
856

T
Taowei 已提交
857 858 859 860 861
static nsresult
_machineGetChipsetType(IMachine *machine ATTRIBUTE_UNUSED, PRUint32 *chipsetType ATTRIBUTE_UNUSED)
{
    return machine->vtbl->GetChipsetType(machine, chipsetType);
}
862

T
Taowei 已提交
863 864 865 866
static nsresult
_machineGetSerialPort(IMachine *machine, PRUint32 slot, ISerialPort **port)
{
    return machine->vtbl->GetSerialPort(machine, slot, port);
867 868
}

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

T
Taowei 已提交
875
static nsresult
876
_machineGetVRDEServer(IMachine *machine, IVRDEServer **VRDEServer)
877
{
878
    return machine->vtbl->GetVRDEServer(machine, VRDEServer);
879 880
}

T
Taowei 已提交
881 882 883 884 885 886 887 888 889
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
}
890

891 892 893 894 895 896 897 898 899 900 901 902
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 已提交
903 904 905 906 907 908
static nsresult
_machineGetCPUCount(IMachine *machine, PRUint32 *CPUCount)
{
    return machine->vtbl->GetCPUCount(machine, CPUCount);
}

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

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

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

T
Taowei 已提交
927 928 929 930 931 932
static nsresult
_machineGetCPUProperty(IMachine *machine, PRUint32 property ATTRIBUTE_UNUSED, PRBool *value)
{
    return machine->vtbl->GetCPUProperty(machine, property, value);
}

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

T
Taowei 已提交
939 940 941 942 943 944
static nsresult
_machineGetBootOrder(IMachine *machine, PRUint32 position, PRUint32 *device)
{
    return machine->vtbl->GetBootOrder(machine, position, device);
}

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

T
Taowei 已提交
951 952 953 954 955 956
static nsresult
_machineGetVRAMSize(IMachine *machine, PRUint32 *VRAMSize)
{
    return machine->vtbl->GetVRAMSize(machine, VRAMSize);
}

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

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

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

T
Taowei 已提交
975 976 977 978 979 980
static nsresult
_machineGetAccelerate3DEnabled(IMachine *machine, PRBool *accelerate3DEnabled)
{
    return machine->vtbl->GetAccelerate3DEnabled(machine, accelerate3DEnabled);
}

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

T
Taowei 已提交
987
static nsresult
988 989
_machineGetAccelerate2DVideoEnabled(IMachine *machine,
                                    PRBool *accelerate2DVideoEnabled)
T
Taowei 已提交
990 991 992 993
{
    return machine->vtbl->GetAccelerate2DVideoEnabled(machine, accelerate2DVideoEnabled);
}

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

T
Taowei 已提交
1001 1002 1003 1004 1005 1006
static nsresult
_machineGetExtraData(IMachine *machine, PRUnichar *key, PRUnichar **value)
{
    return machine->vtbl->GetExtraData(machine, key, value);
}

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

1013 1014 1015 1016 1017 1018
static nsresult
_machineGetSnapshotCount(IMachine *machine, PRUint32 *snapshotCount)
{
    return machine->vtbl->GetSnapshotCount(machine, snapshotCount);
}

T
Taowei 已提交
1019 1020 1021 1022
static nsresult
_machineSaveSettings(IMachine *machine)
{
    return machine->vtbl->SaveSettings(machine);
T
Taowei 已提交
1023 1024
}

T
Taowei 已提交
1025
static nsresult
1026
_sessionOpen(vboxDriverPtr data, vboxIID *iid ATTRIBUTE_UNUSED, IMachine *machine)
T
Taowei 已提交
1027 1028 1029
{
    return machine->vtbl->LockMachine(machine, data->vboxSession, LockType_Write);
}
T
Taowei 已提交
1030

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

T
Taowei 已提交
1037 1038 1039 1040 1041
static nsresult
_sessionClose(ISession *session)
{
    return session->vtbl->UnlockMachine(session);
}
T
Taowei 已提交
1042

T
Taowei 已提交
1043 1044 1045 1046 1047
static nsresult
_sessionGetConsole(ISession *session, IConsole **console)
{
    return session->vtbl->GetConsole(session, console);
}
T
Taowei 已提交
1048

T
Taowei 已提交
1049 1050 1051 1052 1053 1054 1055 1056 1057
static nsresult
_sessionGetMachine(ISession *session, IMachine **machine)
{
    return session->vtbl->GetMachine(session, machine);
}

static nsresult
_consoleSaveState(IConsole *console, IProgress **progress)
{
M
Martin Pietsch 已提交
1058
#if VBOX_API_VERSION < 5000000
T
Taowei 已提交
1059
    return console->vtbl->SaveState(console, progress);
M
Martin Pietsch 已提交
1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
#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 已提交
1075 1076
}

T
Taowei 已提交
1077 1078 1079 1080 1081 1082
static nsresult
_consolePause(IConsole *console)
{
    return console->vtbl->Pause(console);
}

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

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

T
Taowei 已提交
1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
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);
    }
1105

T
Taowei 已提交
1106 1107 1108
    return rc;
}

T
Taowei 已提交
1109 1110 1111 1112 1113 1114
static nsresult
_consoleReset(IConsole *console)
{
    return console->vtbl->Reset(console);
}

1115 1116 1117 1118
static nsresult
_consoleTakeSnapshot(IConsole *console, PRUnichar *name,
                     PRUnichar *description, IProgress **progress)
{
M
Martin Pietsch 已提交
1119
#if VBOX_API_VERSION < 5000000
1120
    return console->vtbl->TakeSnapshot(console, name, description, progress);
M
Martin Pietsch 已提交
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
#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 */
1138 1139
}

T
Taowei 已提交
1140
static nsresult
1141
_consoleDeleteSnapshot(IConsole *console, vboxIID *iid, IProgress **progress)
T
Taowei 已提交
1142
{
1143
#if VBOX_API_VERSION < 5000000 /* VBOX_API_VERSION < 5000000 */
1144
    return console->vtbl->DeleteSnapshot(console, iid->value, progress);
M
Martin Pietsch 已提交
1145 1146 1147 1148 1149 1150 1151
#else /* VBOX_API_VERSION >= 5000000 */
    IMachine *machine;
    nsresult rc;

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

    if (NS_SUCCEEDED(rc))
1152
        rc = machine->vtbl->DeleteSnapshot(machine, iid->value, progress);
M
Martin Pietsch 已提交
1153 1154 1155 1156 1157 1158 1159 1160
    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 已提交
1161 1162
}

T
Taowei 已提交
1163 1164 1165 1166 1167 1168
static nsresult
_consoleGetDisplay(IConsole *console, IDisplay **display)
{
    return console->vtbl->GetDisplay(console, display);
}

1169 1170 1171 1172 1173 1174
static nsresult
_consoleGetKeyboard(IConsole *console, IKeyboard **keyboard)
{
    return console->vtbl->GetKeyboard(console, keyboard);
}

T
Taowei 已提交
1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
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 已提交
1187 1188 1189 1190 1191 1192
static nsresult
_progressGetCompleted(IProgress *progress, PRBool *completed)
{
    return progress->vtbl->GetCompleted(progress, completed);
}

T
Taowei 已提交
1193 1194 1195 1196
static nsresult
_systemPropertiesGetMaxGuestCPUCount(ISystemProperties *systemProperties, PRUint32 *maxCPUCount)
{
    return systemProperties->vtbl->GetMaxGuestCPUCount(systemProperties, maxCPUCount);
T
Taowei 已提交
1197 1198 1199
}

static nsresult
T
Taowei 已提交
1200
_systemPropertiesGetMaxBootPosition(ISystemProperties *systemProperties, PRUint32 *maxBootPosition)
T
Taowei 已提交
1201
{
T
Taowei 已提交
1202
    return systemProperties->vtbl->GetMaxBootPosition(systemProperties, maxBootPosition);
T
Taowei 已提交
1203 1204
}

T
Taowei 已提交
1205 1206 1207
static nsresult
_systemPropertiesGetMaxNetworkAdapters(ISystemProperties *systemProperties, PRUint32 chipset ATTRIBUTE_UNUSED,
                                       PRUint32 *maxNetworkAdapters)
T
Taowei 已提交
1208
{
T
Taowei 已提交
1209 1210 1211 1212 1213 1214 1215
#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 已提交
1216 1217
}

T
Taowei 已提交
1218 1219
static nsresult
_systemPropertiesGetSerialPortCount(ISystemProperties *systemProperties, PRUint32 *SerialPortCount)
T
Taowei 已提交
1220
{
T
Taowei 已提交
1221
    return systemProperties->vtbl->GetSerialPortCount(systemProperties, SerialPortCount);
T
Taowei 已提交
1222 1223 1224
}

static nsresult
T
Taowei 已提交
1225
_systemPropertiesGetParallelPortCount(ISystemProperties *systemProperties, PRUint32 *ParallelPortCount)
T
Taowei 已提交
1226
{
T
Taowei 已提交
1227 1228
    return systemProperties->vtbl->GetParallelPortCount(systemProperties, ParallelPortCount);
}
T
Taowei 已提交
1229

T
Taowei 已提交
1230 1231 1232 1233 1234
static nsresult
_systemPropertiesGetMaxPortCountForStorageBus(ISystemProperties *systemProperties, PRUint32 bus,
                                              PRUint32 *maxPortCount)
{
    return systemProperties->vtbl->GetMaxPortCountForStorageBus(systemProperties, bus, maxPortCount);
T
Taowei 已提交
1235 1236
}

T
Taowei 已提交
1237 1238 1239
static nsresult
_systemPropertiesGetMaxDevicesPerPortForStorageBus(ISystemProperties *systemProperties,
                                                   PRUint32 bus, PRUint32 *maxDevicesPerPort)
T
Taowei 已提交
1240
{
T
Taowei 已提交
1241 1242 1243
    return systemProperties->vtbl->GetMaxDevicesPerPortForStorageBus(systemProperties,
                                                                     bus, maxDevicesPerPort);
}
T
Taowei 已提交
1244

T
Taowei 已提交
1245 1246 1247 1248 1249 1250
static nsresult
_systemPropertiesGetMaxGuestRAM(ISystemProperties *systemProperties, PRUint32 *maxGuestRAM)
{
    return systemProperties->vtbl->GetMaxGuestRAM(systemProperties, maxGuestRAM);
}

T
Taowei 已提交
1251 1252 1253 1254 1255 1256
static nsresult
_biosSettingsGetACPIEnabled(IBIOSSettings *bios, PRBool *ACPIEnabled)
{
    return bios->vtbl->GetACPIEnabled(bios, ACPIEnabled);
}

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

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

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

T
Taowei 已提交
1275 1276 1277 1278 1279 1280
static nsresult
_audioAdapterGetEnabled(IAudioAdapter *audioAdapter, PRBool *enabled)
{
    return audioAdapter->vtbl->GetEnabled(audioAdapter, enabled);
}

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

T
Taowei 已提交
1287 1288 1289 1290 1291 1292
static nsresult
_audioAdapterGetAudioController(IAudioAdapter *audioAdapter, PRUint32 *audioController)
{
    return audioAdapter->vtbl->GetAudioController(audioAdapter, audioController);
}

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

T
Taowei 已提交
1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310
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 已提交
1311 1312
static nsresult
_networkAdapterSetEnabled(INetworkAdapter *adapter, PRBool enabled)
T
Taowei 已提交
1313
{
T
Taowei 已提交
1314
    return adapter->vtbl->SetEnabled(adapter, enabled);
T
Taowei 已提交
1315 1316
}

T
Taowei 已提交
1317 1318 1319 1320 1321 1322
static nsresult
_networkAdapterGetAdapterType(INetworkAdapter *adapter, PRUint32 *adapterType)
{
    return adapter->vtbl->GetAdapterType(adapter, adapterType);
}

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

T
Taowei 已提交
1329 1330 1331 1332 1333 1334
static nsresult
_networkAdapterGetInternalNetwork(INetworkAdapter *adapter, PRUnichar **internalNetwork)
{
    return adapter->vtbl->GetInternalNetwork(adapter, internalNetwork);
}

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

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

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

T
Taowei 已提交
1353
#if VBOX_API_VERSION < 4001000
T
Taowei 已提交
1354

T
Taowei 已提交
1355 1356 1357 1358 1359 1360
static nsresult
_networkAdapterGetBridgedInterface(INetworkAdapter *adapter, PRUnichar **hostInterface)
{
    return adapter->vtbl->GetHostInterface(adapter, hostInterface);
}

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

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

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

T
Taowei 已提交
1379 1380
static nsresult
_networkAdapterAttachToBridgedInterface(INetworkAdapter *adapter)
T
Taowei 已提交
1381
{
T
Taowei 已提交
1382
    return adapter->vtbl->AttachToBridgedInterface(adapter);
T
Taowei 已提交
1383 1384
}

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

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

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

T
Taowei 已提交
1403 1404
#else /* VBOX_API_VERSION >= 4001000 */

T
Taowei 已提交
1405 1406 1407 1408 1409 1410
static nsresult
_networkAdapterGetBridgedInterface(INetworkAdapter *adapter, PRUnichar **bridgedInterface)
{
    return adapter->vtbl->GetBridgedInterface(adapter, bridgedInterface);
}

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

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

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

T
Taowei 已提交
1429 1430 1431 1432 1433
static nsresult
_networkAdapterAttachToBridgedInterface(INetworkAdapter *adapter)
{
    return adapter->vtbl->SetAttachmentType(adapter, NetworkAttachmentType_Bridged);
}
T
Taowei 已提交
1434 1435

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

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

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

T
Taowei 已提交
1453
#endif /* VBOX_API_VERSION >= 4001000 */
T
Taowei 已提交
1454

T
Taowei 已提交
1455 1456 1457 1458 1459 1460
static nsresult
_serialPortGetEnabled(ISerialPort *port, PRBool *enabled)
{
    return port->vtbl->GetEnabled(port, enabled);
}

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

T
Taowei 已提交
1467 1468 1469 1470 1471 1472
static nsresult
_serialPortGetPath(ISerialPort *port, PRUnichar **path)
{
    return port->vtbl->GetPath(port, path);
}

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

T
Taowei 已提交
1479 1480 1481 1482 1483 1484
static nsresult
_serialPortGetIRQ(ISerialPort *port, PRUint32 *IRQ)
{
    return port->vtbl->GetIRQ(port, IRQ);
}

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

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

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

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

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

T
Taowei 已提交
1515 1516 1517 1518 1519 1520
static nsresult
_parallelPortGetEnabled(IParallelPort *port, PRBool *enabled)
{
    return port->vtbl->GetEnabled(port, enabled);
}

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

T
Taowei 已提交
1527 1528 1529 1530 1531 1532
static nsresult
_parallelPortGetPath(IParallelPort *port, PRUnichar **path)
{
    return port->vtbl->GetPath(port, path);
}

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

T
Taowei 已提交
1539 1540 1541 1542 1543 1544
static nsresult
_parallelPortGetIRQ(IParallelPort *port, PRUint32 *IRQ)
{
    return port->vtbl->GetIRQ(port, IRQ);
}

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

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

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

T
Taowei 已提交
1563
static nsresult
1564
_vrdeServerGetEnabled(IVRDEServer *VRDEServer, PRBool *enabled)
T
Taowei 已提交
1565
{
1566
    return VRDEServer->vtbl->GetEnabled(VRDEServer, enabled);
T
Taowei 已提交
1567 1568
}

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

T
Taowei 已提交
1575
static nsresult
1576 1577
_vrdeServerGetPorts(vboxDriverPtr data ATTRIBUTE_UNUSED,
                    IVRDEServer *VRDEServer, virDomainGraphicsDefPtr graphics)
T
Taowei 已提交
1578 1579 1580 1581
{
    nsresult rc;
    PRUnichar *VRDEPortsKey = NULL;
    PRUnichar *VRDEPortsValue = NULL;
1582

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

T
Taowei 已提交
1594 1595 1596
    return rc;
}

T
Taowei 已提交
1597
static nsresult
1598 1599
_vrdeServerSetPorts(vboxDriverPtr data ATTRIBUTE_UNUSED,
                    IVRDEServer *VRDEServer, virDomainGraphicsDefPtr graphics)
T
Taowei 已提交
1600
{
T
Taowei 已提交
1601 1602 1603
    nsresult rc = 0;
    PRUnichar *VRDEPortsKey = NULL;
    PRUnichar *VRDEPortsValue = NULL;
1604

T
Taowei 已提交
1605
    VBOX_UTF8_TO_UTF16("TCP/Ports", &VRDEPortsKey);
1606
    VRDEPortsValue = PRUnicharFromInt(data->pFuncs, graphics->data.rdp.port);
1607
    rc = VRDEServer->vtbl->SetVRDEProperty(VRDEServer, VRDEPortsKey,
T
Taowei 已提交
1608 1609 1610
                                           VRDEPortsValue);
    VBOX_UTF16_FREE(VRDEPortsKey);
    VBOX_UTF16_FREE(VRDEPortsValue);
1611

T
Taowei 已提交
1612
    return rc;
T
Taowei 已提交
1613 1614
}

T
Taowei 已提交
1615
static nsresult
1616
_vrdeServerGetReuseSingleConnection(IVRDEServer *VRDEServer, PRBool *enabled)
T
Taowei 已提交
1617
{
1618
    return VRDEServer->vtbl->GetReuseSingleConnection(VRDEServer, enabled);
T
Taowei 已提交
1619 1620
}

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

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

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

T
Taowei 已提交
1639
static nsresult
1640 1641
_vrdeServerGetNetAddress(vboxDriverPtr data ATTRIBUTE_UNUSED,
                         IVRDEServer *VRDEServer, PRUnichar **netAddress)
T
Taowei 已提交
1642 1643 1644
{
    PRUnichar *VRDENetAddressKey = NULL;
    nsresult rc;
1645

T
Taowei 已提交
1646
    VBOX_UTF8_TO_UTF16("TCP/Address", &VRDENetAddressKey);
1647
    rc = VRDEServer->vtbl->GetVRDEProperty(VRDEServer, VRDENetAddressKey, netAddress);
T
Taowei 已提交
1648
    VBOX_UTF16_FREE(VRDENetAddressKey);
1649

T
Taowei 已提交
1650 1651 1652
    return rc;
}

T
Taowei 已提交
1653
static nsresult
1654 1655
_vrdeServerSetNetAddress(vboxDriverPtr data ATTRIBUTE_UNUSED,
                         IVRDEServer *VRDEServer, PRUnichar *netAddress)
T
Taowei 已提交
1656 1657 1658
{
    PRUnichar *netAddressKey = NULL;
    nsresult rc;
1659

T
Taowei 已提交
1660
    VBOX_UTF8_TO_UTF16("TCP/Address", &netAddressKey);
1661
    rc = VRDEServer->vtbl->SetVRDEProperty(VRDEServer, netAddressKey,
T
Taowei 已提交
1662 1663
                                           netAddress);
    VBOX_UTF16_FREE(netAddressKey);
1664

T
Taowei 已提交
1665 1666
    return rc;
}
T
Taowei 已提交
1667 1668

static nsresult
T
Taowei 已提交
1669
_usbCommonEnable(IUSBCommon *USBCommon ATTRIBUTE_UNUSED)
T
Taowei 已提交
1670
{
T
Taowei 已提交
1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681
    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 已提交
1682 1683
}

T
Taowei 已提交
1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694
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 已提交
1695
static nsresult
T
Taowei 已提交
1696 1697
_usbCommonCreateDeviceFilter(IUSBCommon *USBCommon, PRUnichar *name,
                             IUSBDeviceFilter **filter)
T
Taowei 已提交
1698
{
T
Taowei 已提交
1699
    return USBCommon->vtbl->CreateDeviceFilter(USBCommon, name, filter);
T
Taowei 已提交
1700 1701
}

T
Taowei 已提交
1702
static nsresult
T
Taowei 已提交
1703 1704
_usbCommonInsertDeviceFilter(IUSBCommon *USBCommon, PRUint32 position,
                             IUSBDeviceFilter *filter)
T
Taowei 已提交
1705
{
T
Taowei 已提交
1706
    return USBCommon->vtbl->InsertDeviceFilter(USBCommon, position, filter);
T
Taowei 已提交
1707 1708
}

T
Taowei 已提交
1709 1710 1711 1712 1713 1714
static nsresult
_usbDeviceFilterGetProductId(IUSBDeviceFilter *USBDeviceFilter, PRUnichar **productId)
{
    return USBDeviceFilter->vtbl->GetProductId(USBDeviceFilter, productId);
}

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

T
Taowei 已提交
1721 1722 1723 1724 1725 1726
static nsresult
_usbDeviceFilterGetActive(IUSBDeviceFilter *USBDeviceFilter, PRBool *active)
{
    return USBDeviceFilter->vtbl->GetActive(USBDeviceFilter, active);
}

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

T
Taowei 已提交
1733 1734 1735 1736 1737 1738
static nsresult
_usbDeviceFilterGetVendorId(IUSBDeviceFilter *USBDeviceFilter, PRUnichar **vendorId)
{
    return USBDeviceFilter->vtbl->GetVendorId(USBDeviceFilter, vendorId);
}

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

1745
static nsresult _mediumGetId(IMedium *medium, vboxIID *iid)
T
Taowei 已提交
1746
{
1747
    return medium->vtbl->GetId(medium, &iid->value);
T
Taowei 已提交
1748 1749
}

T
Taowei 已提交
1750 1751 1752 1753 1754
static nsresult _mediumGetLocation(IMedium *medium, PRUnichar **location)
{
    return medium->vtbl->GetLocation(medium, location);
}

1755 1756 1757 1758 1759
static nsresult _mediumGetState(IMedium *medium, PRUint32 *state)
{
    return medium->vtbl->GetState(medium, state);
}

1760 1761 1762 1763 1764
static nsresult _mediumGetName(IMedium *medium, PRUnichar **name)
{
    return medium->vtbl->GetName(medium, name);
}

T
Taowei Luo 已提交
1765 1766 1767 1768
static nsresult _mediumGetSize(IMedium *medium, PRUint64 *uSize)
{
    nsresult rc;
    PRInt64 Size;
1769

T
Taowei Luo 已提交
1770 1771
    rc = medium->vtbl->GetSize(medium, &Size);
    *uSize = Size;
1772

T
Taowei Luo 已提交
1773 1774 1775
    return rc;
}

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

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 已提交
1807 1808 1809 1810
static nsresult _mediumRelease(IMedium *medium)
{
    return medium->vtbl->nsisupports.Release((nsISupports *)medium);
}
1811 1812 1813 1814
static nsresult _mediumClose(IMedium *medium)
{
    return medium->vtbl->Close(medium);
}
T
Taowei 已提交
1815 1816 1817 1818 1819

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

1822 1823 1824 1825 1826 1827 1828
static nsresult
_mediumCreateDiffStorage(IMedium *medium ATTRIBUTE_UNUSED,
                         IMedium *target ATTRIBUTE_UNUSED,
                         PRUint32 variantSize ATTRIBUTE_UNUSED,
                         PRUint32 *variant ATTRIBUTE_UNUSED,
                         IProgress **progress ATTRIBUTE_UNUSED)
{
1829
#if VBOX_API_VERSION < 4003000
1830 1831 1832
    if (variantSize == 0)
        return 0;
    if (variantSize > 1)
1833
        VIR_WARN("Only one variant is available in current version");
1834 1835 1836 1837 1838 1839
    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 */
}

1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862
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 已提交
1863
static nsresult
1864
_mediumAttachmentGetMedium(IMediumAttachment *mediumAttachment,
1865
                           IMedium **medium)
T
Taowei 已提交
1866
{
1867
    return mediumAttachment->vtbl->GetMedium(mediumAttachment, medium);
T
Taowei 已提交
1868 1869 1870 1871 1872 1873 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
}

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);
}

1920 1921 1922 1923 1924 1925 1926
static nsresult
_snapshotGetName(ISnapshot *snapshot, PRUnichar **name)
{
    return snapshot->vtbl->GetName(snapshot, name);
}

static nsresult
1927
_snapshotGetId(ISnapshot *snapshot, vboxIID *iid)
1928
{
1929
    return snapshot->vtbl->GetId(snapshot, &iid->value);
1930 1931 1932 1933 1934 1935 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
}

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 已提交
1962 1963 1964 1965 1966 1967 1968 1969 1970
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)
{
1971
#if VBOX_API_VERSION < 4003000
T
Taowei 已提交
1972 1973
    return display->vtbl->GetScreenResolution(display, screenId, width,
                                              height, bitsPerPixel);
M
Martin Pietsch 已提交
1974
#elif VBOX_API_VERSION < 5000000 /* VBOX_API_VERSION >= 4003000 */
T
Taowei 已提交
1975 1976 1977
    return display->vtbl->GetScreenResolution(display, screenId, width,
                                              height, bitsPerPixel,
                                              xOrigin, yOrigin);
M
Martin Pietsch 已提交
1978 1979 1980 1981 1982 1983 1984
#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 已提交
1985 1986 1987
}

static nsresult
1988 1989 1990 1991 1992 1993 1994 1995 1996 1997
_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 已提交
1998 1999 2000
    return display->vtbl->TakeScreenShotPNGToArray(display, screenId, width,
                                                   height, screenDataSize,
                                                   screenData);
2001
#endif /* VBOX_API_VERSION >= 5000000 */
T
Taowei 已提交
2002 2003
}

T
Taowei 已提交
2004
static nsresult
2005
_hostFindHostNetworkInterfaceById(IHost *host, vboxIID *iid,
T
Taowei 已提交
2006 2007
                                  IHostNetworkInterface **networkInterface)
{
2008
    return host->vtbl->FindHostNetworkInterfaceById(host, iid->value,
T
Taowei 已提交
2009 2010 2011
                                                    networkInterface);
}

T
Taowei 已提交
2012 2013 2014 2015 2016 2017 2018 2019
static nsresult
_hostFindHostNetworkInterfaceByName(IHost *host, PRUnichar *name,
                                    IHostNetworkInterface **networkInterface)
{
    return host->vtbl->FindHostNetworkInterfaceByName(host, name,
                                                      networkInterface);
}

T
Taowei 已提交
2020
static nsresult
2021
_hostCreateHostOnlyNetworkInterface(vboxDriverPtr data ATTRIBUTE_UNUSED,
T
Taowei 已提交
2022 2023 2024 2025 2026
                                    IHost *host, char *name ATTRIBUTE_UNUSED,
                                    IHostNetworkInterface **networkInterface)
{
    nsresult rc = -1;
    IProgress *progress = NULL;
2027

T
Taowei 已提交
2028 2029 2030 2031 2032 2033 2034
    host->vtbl->CreateHostOnlyNetworkInterface(host, networkInterface,
                                               &progress);

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

T
Taowei 已提交
2036 2037 2038
    return rc;
}

T
Taowei 已提交
2039 2040
static nsresult
_hostRemoveHostOnlyNetworkInterface(IHost *host ATTRIBUTE_UNUSED,
2041
                                    vboxIID *iid ATTRIBUTE_UNUSED,
T
Taowei 已提交
2042 2043
                                    IProgress **progress ATTRIBUTE_UNUSED)
{
2044
    return host->vtbl->RemoveHostOnlyNetworkInterface(host, iid->value, progress);
T
Taowei 已提交
2045 2046
}

T
Taowei 已提交
2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058
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 已提交
2059 2060 2061 2062 2063 2064
static nsresult
_hnInterfaceGetName(IHostNetworkInterface *hni, PRUnichar **name)
{
    return hni->vtbl->GetName(hni, name);
}

T
Taowei 已提交
2065
static nsresult
2066
_hnInterfaceGetId(IHostNetworkInterface *hni, vboxIID *iid)
T
Taowei 已提交
2067
{
2068
    return hni->vtbl->GetId(hni, &iid->value);
T
Taowei 已提交
2069 2070
}

T
Taowei 已提交
2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088
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 已提交
2089 2090 2091 2092 2093 2094 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
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 已提交
2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143
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 已提交
2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167
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 已提交
2168 2169 2170 2171 2172 2173
static nsresult
_dhcpServerStop(IDHCPServer *dhcpServer)
{
    return dhcpServer->vtbl->Stop(dhcpServer);
}

2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187
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 已提交
2188 2189 2190 2191 2192 2193
static bool _machineStateOnline(PRUint32 state)
{
    return ((state >= MachineState_FirstOnline) &&
            (state <= MachineState_LastOnline));
}

2194 2195
static bool _machineStateInactive(PRUint32 state)
{
2196 2197
    return ((state < MachineState_FirstOnline) ||
            (state > MachineState_LastOnline));
2198 2199
}

T
Taowei 已提交
2200 2201 2202 2203 2204 2205 2206
static bool _machineStateNotStart(PRUint32 state)
{
    return ((state == MachineState_PoweredOff) ||
            (state == MachineState_Saved) ||
            (state == MachineState_Aborted));
}

T
Taowei 已提交
2207 2208 2209 2210 2211
static bool _machineStateRunning(PRUint32 state)
{
    return state == MachineState_Running;
}

T
Taowei 已提交
2212 2213 2214 2215 2216
static bool _machineStatePaused(PRUint32 state)
{
    return state == MachineState_Paused;
}

T
Taowei 已提交
2217 2218 2219 2220 2221
static bool _machineStatePoweredOff(PRUint32 state)
{
    return state == MachineState_PoweredOff;
}

T
Taowei 已提交
2222 2223 2224 2225 2226 2227 2228 2229 2230 2231
static vboxUniformedPFN _UPFN = {
    .Initialize = _pfnInitialize,
    .Uninitialize = _pfnUninitialize,
    .ComUnallocMem = _pfnComUnallocMem,
    .Utf16Free = _pfnUtf16Free,
    .Utf8Free = _pfnUtf8Free,
    .Utf16ToUtf8 = _pfnUtf16ToUtf8,
    .Utf8ToUtf16 = _pfnUtf8ToUtf16,
};

T
Taowei 已提交
2232 2233 2234 2235 2236 2237 2238
static vboxUniformedIID _UIID = {
    .vboxIIDInitialize = _vboxIIDInitialize,
    .vboxIIDUnalloc = _vboxIIDUnalloc,
    .vboxIIDToUUID = _vboxIIDToUUID,
    .vboxIIDFromUUID = _vboxIIDFromUUID,
    .vboxIIDIsEqual = _vboxIIDIsEqual,
    .vboxIIDFromArrayItem = _vboxIIDFromArrayItem,
2239
    .vboxIIDToUtf8 = _vboxIIDToUtf8,
T
Taowei 已提交
2240 2241 2242
    .DEBUGIID = _DEBUGIID,
};

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

T
Taowei 已提交
2260 2261
static vboxUniformednsISupports _nsUISupports = {
    .Release = _nsisupportsRelease,
2262
    .AddRef = _nsisupportsAddRef,
T
Taowei 已提交
2263 2264
};

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

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

T
Taowei 已提交
2328
static vboxUniformedISession _UISession = {
T
Taowei 已提交
2329
    .Open = _sessionOpen,
T
Taowei 已提交
2330 2331
    .OpenExisting = _sessionOpenExisting,
    .GetConsole = _sessionGetConsole,
T
Taowei 已提交
2332
    .GetMachine = _sessionGetMachine,
T
Taowei 已提交
2333 2334 2335 2336 2337
    .Close = _sessionClose,
};

static vboxUniformedIConsole _UIConsole = {
    .SaveState = _consoleSaveState,
T
Taowei 已提交
2338
    .Pause = _consolePause,
T
Taowei 已提交
2339
    .Resume = _consoleResume,
T
Taowei 已提交
2340
    .PowerButton = _consolePowerButton,
T
Taowei 已提交
2341
    .PowerDown = _consolePowerDown,
T
Taowei 已提交
2342
    .Reset = _consoleReset,
2343
    .TakeSnapshot = _consoleTakeSnapshot,
T
Taowei 已提交
2344
    .DeleteSnapshot = _consoleDeleteSnapshot,
T
Taowei 已提交
2345
    .GetDisplay = _consoleGetDisplay,
2346
    .GetKeyboard = _consoleGetKeyboard,
T
Taowei 已提交
2347 2348 2349 2350 2351
};

static vboxUniformedIProgress _UIProgress = {
    .WaitForCompletion = _progressWaitForCompletion,
    .GetResultCode = _progressGetResultCode,
T
Taowei 已提交
2352
    .GetCompleted = _progressGetCompleted,
T
Taowei 已提交
2353 2354
};

T
Taowei 已提交
2355 2356
static vboxUniformedISystemProperties _UISystemProperties = {
    .GetMaxGuestCPUCount = _systemPropertiesGetMaxGuestCPUCount,
T
Taowei 已提交
2357 2358 2359 2360 2361 2362
    .GetMaxBootPosition = _systemPropertiesGetMaxBootPosition,
    .GetMaxNetworkAdapters = _systemPropertiesGetMaxNetworkAdapters,
    .GetSerialPortCount = _systemPropertiesGetSerialPortCount,
    .GetParallelPortCount = _systemPropertiesGetParallelPortCount,
    .GetMaxPortCountForStorageBus = _systemPropertiesGetMaxPortCountForStorageBus,
    .GetMaxDevicesPerPortForStorageBus = _systemPropertiesGetMaxDevicesPerPortForStorageBus,
T
Taowei 已提交
2363
    .GetMaxGuestRAM = _systemPropertiesGetMaxGuestRAM,
T
Taowei 已提交
2364 2365 2366
};

static vboxUniformedIBIOSSettings _UIBIOSSettings = {
T
Taowei 已提交
2367
    .GetACPIEnabled = _biosSettingsGetACPIEnabled,
T
Taowei 已提交
2368
    .SetACPIEnabled = _biosSettingsSetACPIEnabled,
T
Taowei 已提交
2369
    .GetIOAPICEnabled = _biosSettingsGetIOAPICEnabled,
T
Taowei 已提交
2370 2371 2372 2373
    .SetIOAPICEnabled = _biosSettingsSetIOAPICEnabled,
};

static vboxUniformedIAudioAdapter _UIAudioAdapter = {
T
Taowei 已提交
2374
    .GetEnabled = _audioAdapterGetEnabled,
T
Taowei 已提交
2375
    .SetEnabled = _audioAdapterSetEnabled,
T
Taowei 已提交
2376
    .GetAudioController = _audioAdapterGetAudioController,
T
Taowei 已提交
2377 2378 2379 2380
    .SetAudioController = _audioAdapterSetAudioController,
};

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

static vboxUniformedISerialPort _UISerialPort = {
T
Taowei 已提交
2401
    .GetEnabled = _serialPortGetEnabled,
T
Taowei 已提交
2402
    .SetEnabled = _serialPortSetEnabled,
T
Taowei 已提交
2403
    .GetPath = _serialPortGetPath,
T
Taowei 已提交
2404
    .SetPath = _serialPortSetPath,
T
Taowei 已提交
2405
    .GetIRQ = _serialPortGetIRQ,
T
Taowei 已提交
2406
    .SetIRQ = _serialPortSetIRQ,
T
Taowei 已提交
2407
    .GetIOBase = _serialPortGetIOBase,
T
Taowei 已提交
2408
    .SetIOBase = _serialPortSetIOBase,
T
Taowei 已提交
2409
    .GetHostMode = _serialPortGetHostMode,
T
Taowei 已提交
2410 2411 2412 2413
    .SetHostMode = _serialPortSetHostMode,
};

static vboxUniformedIParallelPort _UIParallelPort = {
T
Taowei 已提交
2414
    .GetEnabled = _parallelPortGetEnabled,
T
Taowei 已提交
2415
    .SetEnabled = _parallelPortSetEnabled,
T
Taowei 已提交
2416
    .GetPath = _parallelPortGetPath,
T
Taowei 已提交
2417
    .SetPath = _parallelPortSetPath,
T
Taowei 已提交
2418
    .GetIRQ = _parallelPortGetIRQ,
T
Taowei 已提交
2419
    .SetIRQ = _parallelPortSetIRQ,
T
Taowei 已提交
2420
    .GetIOBase = _parallelPortGetIOBase,
T
Taowei 已提交
2421 2422 2423
    .SetIOBase = _parallelPortSetIOBase,
};

2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434
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 已提交
2435 2436 2437 2438
};

static vboxUniformedIUSBCommon _UIUSBCommon = {
    .Enable = _usbCommonEnable,
T
Taowei 已提交
2439
    .GetEnabled = _usbCommonGetEnabled,
T
Taowei 已提交
2440 2441 2442 2443 2444
    .CreateDeviceFilter = _usbCommonCreateDeviceFilter,
    .InsertDeviceFilter = _usbCommonInsertDeviceFilter,
};

static vboxUniformedIUSBDeviceFilter _UIUSBDeviceFilter = {
T
Taowei 已提交
2445
    .GetProductId = _usbDeviceFilterGetProductId,
T
Taowei 已提交
2446
    .SetProductId = _usbDeviceFilterSetProductId,
T
Taowei 已提交
2447
    .GetActive = _usbDeviceFilterGetActive,
T
Taowei 已提交
2448
    .SetActive = _usbDeviceFilterSetActive,
T
Taowei 已提交
2449
    .GetVendorId = _usbDeviceFilterGetVendorId,
T
Taowei 已提交
2450 2451 2452 2453 2454
    .SetVendorId = _usbDeviceFilterSetVendorId,
};

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

T
Taowei 已提交
2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489
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,
};

2490 2491 2492 2493 2494 2495 2496 2497 2498 2499
static vboxUniformedISnapshot _UISnapshot = {
    .GetName = _snapshotGetName,
    .GetId = _snapshotGetId,
    .GetMachine = _snapshotGetMachine,
    .GetDescription = _snapshotGetDescription,
    .GetTimeStamp = _snapshotGetTimeStamp,
    .GetParent = _snapshotGetParent,
    .GetOnline = _snapshotGetOnline,
};

T
Taowei 已提交
2500 2501 2502 2503 2504
static vboxUniformedIDisplay _UIDisplay = {
    .GetScreenResolution = _displayGetScreenResolution,
    .TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray,
};

T
Taowei 已提交
2505 2506
static vboxUniformedIHost _UIHost = {
    .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById,
T
Taowei 已提交
2507
    .FindHostNetworkInterfaceByName = _hostFindHostNetworkInterfaceByName,
T
Taowei 已提交
2508
    .CreateHostOnlyNetworkInterface = _hostCreateHostOnlyNetworkInterface,
T
Taowei 已提交
2509
    .RemoveHostOnlyNetworkInterface = _hostRemoveHostOnlyNetworkInterface,
T
Taowei 已提交
2510 2511
};

T
Taowei 已提交
2512 2513 2514
static vboxUniformedIHNInterface _UIHNInterface = {
    .GetInterfaceType = _hnInterfaceGetInterfaceType,
    .GetStatus = _hnInterfaceGetStatus,
T
Taowei 已提交
2515
    .GetName = _hnInterfaceGetName,
T
Taowei 已提交
2516
    .GetId = _hnInterfaceGetId,
T
Taowei 已提交
2517 2518 2519
    .GetHardwareAddress = _hnInterfaceGetHardwareAddress,
    .GetIPAddress = _hnInterfaceGetIPAddress,
    .GetNetworkMask = _hnInterfaceGetNetworkMask,
T
Taowei 已提交
2520 2521 2522 2523 2524 2525
    .EnableStaticIPConfig = _hnInterfaceEnableStaticIPConfig,
    .EnableDynamicIPConfig = _hnInterfaceEnableDynamicIPConfig,
    .DHCPRediscover = _hnInterfaceDHCPRediscover,
};

static vboxUniformedIDHCPServer _UIDHCPServer = {
T
Taowei 已提交
2526 2527 2528 2529
    .GetIPAddress = _dhcpServerGetIPAddress,
    .GetNetworkMask = _dhcpServerGetNetworkMask,
    .GetLowerIP = _dhcpServerGetLowerIP,
    .GetUpperIP = _dhcpServerGetUpperIP,
T
Taowei 已提交
2530 2531 2532
    .SetEnabled = _dhcpServerSetEnabled,
    .SetConfiguration = _dhcpServerSetConfiguration,
    .Start = _dhcpServerStart,
T
Taowei 已提交
2533
    .Stop = _dhcpServerStop,
T
Taowei 已提交
2534 2535
};

2536 2537 2538 2539 2540
static vboxUniformedIKeyboard _UIKeyboard = {
    .PutScancode = _keyboardPutScancode,
    .PutScancodes = _keyboardPutScancodes,
};

T
Taowei 已提交
2541 2542
static uniformedMachineStateChecker _machineStateChecker = {
    .Online = _machineStateOnline,
2543
    .Inactive = _machineStateInactive,
T
Taowei 已提交
2544
    .NotStart = _machineStateNotStart,
T
Taowei 已提交
2545
    .Running = _machineStateRunning,
T
Taowei 已提交
2546
    .Paused = _machineStatePaused,
T
Taowei 已提交
2547
    .PoweredOff = _machineStatePoweredOff,
T
Taowei 已提交
2548 2549
};

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

T
Taowei 已提交
2588 2589 2590 2591 2592 2593
#if VBOX_API_VERSION >= 4001000
    pVBoxAPI->chipsetType = 1;
#else /* VBOX_API_VERSION < 4001000 */
    pVBoxAPI->chipsetType = 0;
#endif /* VBOX_API_VERSION < 4001000 */

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