diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index e7937265dd3a1ec5d7ecc6f43e627133d9f05fe0..8235111797e5c971b14bec649a05c2434394d063 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -824,6 +824,76 @@ virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, return ret; } +virDomainPtr +vboxDomainLookupByName(virConnectPtr conn, const char *name) +{ + VBOX_OBJECT_CHECK(conn, virDomainPtr, NULL); + vboxArray machines = VBOX_ARRAY_INITIALIZER; + vboxIIDUnion iid; + char *machineNameUtf8 = NULL; + PRUnichar *machineNameUtf16 = NULL; + unsigned char uuid[VIR_UUID_BUFLEN]; + size_t i; + bool matched = false; + nsresult rc; + + VBOX_IID_INITIALIZE(&iid); + rc = gVBoxAPI.UArray.vboxArrayGet(&machines, data->vboxObj, ARRAY_GET_MACHINES); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Could not get list of machines, rc=%08x"), (unsigned)rc); + return NULL; + } + + for (i = 0; i < machines.count; ++i) { + IMachine *machine = machines.items[i]; + PRBool isAccessible = PR_FALSE; + + if (!machine) + continue; + + gVBoxAPI.UIMachine.GetAccessible(machine, &isAccessible); + if (!isAccessible) + continue; + + gVBoxAPI.UIMachine.GetName(machine, &machineNameUtf16); + VBOX_UTF16_TO_UTF8(machineNameUtf16, &machineNameUtf8); + + if (STREQ(name, machineNameUtf8)) { + + PRUint32 state; + + matched = true; + + gVBoxAPI.UIMachine.GetId(machine, &iid); + vboxIIDToUUID(&iid, uuid); + vboxIIDUnalloc(&iid); + + gVBoxAPI.UIMachine.GetState(machine, &state); + + /* get a new domain pointer from virGetDomain, if it fails + * then no need to assign the id, else assign the id, cause + * it is -1 by default. rest is taken care by virGetDomain + * itself, so need not worry. + */ + + ret = virGetDomain(conn, machineNameUtf8, uuid); + if (ret && + gVBoxAPI.machineStateChecker.Online(state)) + ret->id = i + 1; + } + + VBOX_UTF8_FREE(machineNameUtf8); + VBOX_COM_UNALLOC_MEM(machineNameUtf16); + if (matched) + break; + } + + gVBoxAPI.UArray.vboxArrayRelease(&machines); + + return ret; +} + static void vboxSetBootDeviceOrder(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index ccf73437d654a4a6ada630e3acd8e04e794a86e2..fbe4d3918e02ce0f1524326845c53be3205ac434 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -933,77 +933,6 @@ vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16, return result; } -static virDomainPtr -vboxDomainLookupByName(virConnectPtr conn, const char *name) -{ - VBOX_OBJECT_CHECK(conn, virDomainPtr, NULL); - vboxArray machines = VBOX_ARRAY_INITIALIZER; - vboxIID iid = VBOX_IID_INITIALIZER; - char *machineNameUtf8 = NULL; - PRUnichar *machineNameUtf16 = NULL; - unsigned char uuid[VIR_UUID_BUFLEN]; - size_t i; - int matched = 0; - nsresult rc; - - rc = vboxArrayGet(&machines, data->vboxObj, data->vboxObj->vtbl->GetMachines); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Could not get list of machines, rc=%08x"), (unsigned)rc); - return NULL; - } - - for (i = 0; i < machines.count; ++i) { - IMachine *machine = machines.items[i]; - PRBool isAccessible = PR_FALSE; - - if (!machine) - continue; - - machine->vtbl->GetAccessible(machine, &isAccessible); - if (isAccessible) { - - machine->vtbl->GetName(machine, &machineNameUtf16); - VBOX_UTF16_TO_UTF8(machineNameUtf16, &machineNameUtf8); - - if (STREQ(name, machineNameUtf8)) { - - PRUint32 state; - - matched = 1; - - machine->vtbl->GetId(machine, &iid.value); - vboxIIDToUUID(&iid, uuid); - vboxIIDUnalloc(&iid); - - machine->vtbl->GetState(machine, &state); - - /* get a new domain pointer from virGetDomain, if it fails - * then no need to assign the id, else assign the id, cause - * it is -1 by default. rest is taken care by virGetDomain - * itself, so need not worry. - */ - - ret = virGetDomain(conn, machineNameUtf8, uuid); - if (ret && - (state >= MachineState_FirstOnline) && - (state <= MachineState_LastOnline)) - ret->id = i + 1; - } - - VBOX_UTF8_FREE(machineNameUtf8); - VBOX_COM_UNALLOC_MEM(machineNameUtf16); - if (matched == 1) - break; - } - } - - vboxArrayRelease(&machines); - - return ret; -} - - static int vboxDomainIsActive(virDomainPtr dom) { VBOX_OBJECT_CHECK(dom->conn, int, -1); diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 1c11caafc03ea5070ed22fcefacbf9df11e96929..41b2d90912296a96e6043877baddba94e3633959 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -403,6 +403,8 @@ int vboxConnectNumOfDomains(virConnectPtr conn); virDomainPtr vboxDomainLookupByID(virConnectPtr conn, int id); virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid); +virDomainPtr +vboxDomainLookupByName(virConnectPtr conn, const char *name); virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml); int vboxDomainUndefineFlags(virDomainPtr dom, unsigned int flags); int vboxDomainCreateWithFlags(virDomainPtr dom, unsigned int flags);