int UIDnDHandler::retrieveDataInternal( Qt::DropAction dropAction, const QString &strMIMEType, QVector<uint8_t> &vecData) { LogFlowFunc(("Retrieving data as '%s', dropAction=%d\n", qPrintable(strMIMEType), dropAction)); int rc = VINF_SUCCESS; /* Indicate to the guest that we have dropped the data on the host. * The guest then will initiate the actual "drop" operation into our proxy on the guest. */ Assert(!m_dndSource.isNull()); CProgress progress = m_dndSource.Drop(strMIMEType, UIDnDHandler::toVBoxDnDAction(dropAction)); LogFlowFunc(("Source: isOk=%RTbool\n", m_dndSource.isOk())); if (m_dndSource.isOk()) { /* Send a mouse event with released mouse buttons into the guest that triggers * the "drop" event in our proxy window on the guest. */ AssertPtr(m_pSession); m_pSession->mouse().PutMouseEvent(0, 0, 0, 0, 0); msgCenter().showModalProgressDialog(progress, tr("Retrieving data ..."), ":/progress_dnd_gh_90px.png", m_pParent); LogFlowFunc(("Progress: fCanceled=%RTbool, fCompleted=%RTbool, isOk=%RTbool, hrc=%Rhrc\n", progress.GetCanceled(), progress.GetCompleted(), progress.isOk(), progress.GetResultCode())); if (!progress.GetCanceled()) { rc = ( progress.isOk() && progress.GetResultCode() == 0) ? VINF_SUCCESS : VERR_GENERAL_FAILURE; /** @todo Fudge; do a GetResultCode() to rc translation. */ if (RT_SUCCESS(rc)) { /* After we successfully retrieved data from the source we query it from Main. */ vecData = m_dndSource.ReceiveData(); /** @todo QVector.size() is "int" only!? */ if (vecData.isEmpty()) rc = VERR_NO_DATA; } else msgCenter().cannotDropDataToHost(progress, m_pParent); } else /* Don't pop up a message. */ rc = VERR_CANCELLED; } else { msgCenter().cannotDropDataToHost(m_dndSource, m_pParent); rc = VERR_GENERAL_FAILURE; /** @todo Fudge; do a GetResultCode() to rc translation. */ } setMode(DNDMODE_UNKNOWN); LogFlowFuncLeaveRC(rc); return rc; }
bool UIWizardExportApp::exportVMs(CAppliance &appliance) { /* Write the appliance: */ const QString strVersion = field("OVF09Selected").toBool() ? "ovf-0.9" : "ovf-1.0"; CProgress progress = appliance.Write(strVersion, field("manifestSelected").toBool() /* fManifest */, uri()); bool fResult = appliance.isOk(); if (fResult) { /* Show some progress, so the user know whats going on: */ msgCenter().showModalProgressDialog(progress, QApplication::translate("UIWizardExportApp", "Exporting Appliance ..."), ":/progress_export_90px.png", this, true); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotExportAppliance(progress, &appliance, this); return false; } else return true; } if (!fResult) msgCenter().cannotExportAppliance(&appliance, this); return false; }
bool UIWizardCloneVD::copyVirtualDisk() { /* Gather attributes: */ CMedium sourceVirtualDisk = field("sourceVirtualDisk").value<CMedium>(); CMediumFormat mediumFormat = field("mediumFormat").value<CMediumFormat>(); qulonglong uVariant = field("mediumVariant").toULongLong(); QString strMediumPath = field("mediumPath").toString(); qulonglong uSize = field("mediumSize").toULongLong(); /* Check attributes: */ AssertReturn(!strMediumPath.isNull(), false); AssertReturn(uSize > 0, false); /* Get VBox object: */ CVirtualBox vbox = vboxGlobal().virtualBox(); /* Create new virtual hard-disk: */ CMedium virtualDisk = vbox.CreateHardDisk(mediumFormat.GetName(), strMediumPath); if (!vbox.isOk()) { msgCenter().cannotCreateHardDiskStorage(vbox, strMediumPath, this); return false; } /* Compose medium-variant: */ QVector<KMediumVariant> variants(sizeof(qulonglong)*8); for (int i = 0; i < variants.size(); ++i) { qulonglong temp = uVariant; temp &= 1<<i; variants[i] = (KMediumVariant)temp; } /* Copy existing virtual-disk to the new virtual-disk: */ CProgress progress = sourceVirtualDisk.CloneTo(virtualDisk, variants, CMedium()); if (!sourceVirtualDisk.isOk()) { msgCenter().cannotCreateHardDiskStorage(sourceVirtualDisk, strMediumPath, this); return false; } /* Show creation progress: */ msgCenter().showModalProgressDialog(progress, windowTitle(), ":/progress_media_create_90px.png", this); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotCreateHardDiskStorage(progress, strMediumPath, this); return false; } /* Remember created virtual-disk: */ m_virtualDisk = virtualDisk; /* Just close the created medium, it is not necessary yet: */ m_virtualDisk.Close(); return true; }
bool UIWizardNewVD::createVirtualDisk() { /* Gather attributes: */ CMediumFormat mediumFormat = field("mediumFormat").value<CMediumFormat>(); qulonglong uVariant = field("mediumVariant").toULongLong(); QString strMediumPath = field("mediumPath").toString(); qulonglong uSize = field("mediumSize").toULongLong(); /* Check attributes: */ AssertReturn(!strMediumPath.isNull(), false); AssertReturn(uSize > 0, false); /* Get VBox object: */ CVirtualBox vbox = vboxGlobal().virtualBox(); /* Create new virtual hard-disk: */ CMedium virtualDisk = vbox.CreateMedium(mediumFormat.GetName(), strMediumPath, KAccessMode_ReadWrite, KDeviceType_HardDisk); if (!vbox.isOk()) { msgCenter().cannotCreateHardDiskStorage(vbox, strMediumPath, this); return false; } /* Compose medium-variant: */ QVector<KMediumVariant> variants(sizeof(qulonglong)*8); for (int i = 0; i < variants.size(); ++i) { qulonglong temp = uVariant; temp &= UINT64_C(1)<<i; variants[i] = (KMediumVariant)temp; } /* Create base storage for the new virtual-disk: */ CProgress progress = virtualDisk.CreateBaseStorage(uSize, variants); if (!virtualDisk.isOk()) { msgCenter().cannotCreateHardDiskStorage(virtualDisk, strMediumPath, this); return false; } /* Show creation progress: */ msgCenter().showModalProgressDialog(progress, windowTitle(), ":/progress_media_create_90px.png", this); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotCreateHardDiskStorage(progress, strMediumPath, this); return false; } /* Remember created virtual-disk: */ m_virtualDisk = virtualDisk; /* Inform VBoxGlobal about it: */ vboxGlobal().createMedium(UIMedium(m_virtualDisk, UIMediumType_HardDisk, KMediumState_Created)); return true; }
bool UIWizardNewVD::createVirtualDisk() { /* Gather attributes: */ CMediumFormat mediumFormat = field("mediumFormat").value<CMediumFormat>(); qulonglong uVariant = field("mediumVariant").toULongLong(); QString strMediumPath = field("mediumPath").toString(); qulonglong uSize = field("mediumSize").toULongLong(); /* Check attributes: */ AssertReturn(!strMediumPath.isNull(), false); AssertReturn(uSize > 0, false); /* Get vbox object: */ CVirtualBox vbox = vboxGlobal().virtualBox(); /* Create new virtual disk: */ CMedium virtualDisk = vbox.CreateHardDisk(mediumFormat.GetName(), strMediumPath); CProgress progress; if (!vbox.isOk()) { msgCenter().cannotCreateHardDiskStorage(this, vbox, strMediumPath, virtualDisk, progress); return false; } /* Create base storage for the new hard disk: */ progress = virtualDisk.CreateBaseStorage(uSize, uVariant); if (!virtualDisk.isOk()) { msgCenter().cannotCreateHardDiskStorage(this, vbox, strMediumPath, virtualDisk, progress); return false; } /* Show creation progress: */ msgCenter().showModalProgressDialog(progress, windowTitle(), ":/progress_media_create_90px.png", this, true); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotCreateHardDiskStorage(this, vbox, strMediumPath, virtualDisk, progress); return false; } /* Remember created virtual-disk: */ m_virtualDisk = virtualDisk; /* Inform everybody there is a new medium: */ vboxGlobal().addMedium(UIMedium(m_virtualDisk, UIMediumType_HardDisk, KMediumState_Created)); return true; }
Qt::DropAction UIDnDHandler::dragHGDrop(CGuest &guest, ulong screenId, int x, int y, Qt::DropAction proposedAction, Qt::DropActions possibleActions, const QMimeData *pMimeData, QWidget *pParent /* = 0 */) { /* The format the guest requests. */ QString format; /* Ask the guest for dropping data. */ KDragAndDropAction result = guest.DragHGDrop(screenId, x, y, toVBoxDnDAction(proposedAction), toVBoxDnDActions(possibleActions), pMimeData->formats().toVector(), format); /* Has the guest accepted the drop event? */ if (result != KDragAndDropAction_Ignore) { /* Get the actually data */ const QByteArray &d = pMimeData->data(format); if ( !d.isEmpty() && !format.isEmpty()) { /* We need the data in the vector format. */ QVector<uint8_t> dv(d.size()); memcpy(dv.data(), d.constData(), d.size()); CProgress progress = guest.DragHGPutData(screenId, format, dv); if (guest.isOk()) { msgCenter().showModalProgressDialog(progress, tr("Dropping data ..."), ":/progress_dnd_hg_90px.png", pParent); if (!progress.GetCanceled() && (!progress.isOk() || progress.GetResultCode() != 0)) { msgCenter().cannotDropData(progress, pParent); result = KDragAndDropAction_Ignore; } } else { msgCenter().cannotDropData(guest, pParent); result = KDragAndDropAction_Ignore; } } } return toQtDnDAction(result); }
bool UIWizardExportApp::exportVMs(CAppliance &appliance) { /* Write the appliance: */ CProgress progress = appliance.Write(field("format").toString(), field("manifestSelected").toBool() /* fManifest */, uri()); bool fResult = appliance.isOk(); if (fResult) { /* Show some progress, so the user know whats going on: */ msgCenter().showModalProgressDialog(progress, QApplication::translate("UIWizardExportApp", "Exporting Appliance ..."), ":/progress_export_90px.png", this); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotExportAppliance(progress, appliance.GetPath(), this); return false; } else return true; } if (!fResult) msgCenter().cannotExportAppliance(appliance, this); return false; }
Qt::DropAction UIDnDHandler::dragDrop(ulong screenID, int x, int y, Qt::DropAction proposedAction, Qt::DropActions possibleActions, const QMimeData *pMimeData) { LogFlowFunc(("enmOpMode=%RU32, screenID=%RU32, x=%d, y=%d, action=%ld\n", m_enmOpMode, screenID, x, y, toVBoxDnDAction(proposedAction))); if (m_enmOpMode != DNDMODE_HOSTTOGUEST) return Qt::IgnoreAction; /* The format the guest requests. */ QString strFormat; /* Ask the guest for dropping data. */ KDnDAction enmResult = m_dndTarget.Drop(screenID, x, y, toVBoxDnDAction(proposedAction), toVBoxDnDActions(possibleActions), pMimeData->formats().toVector(), strFormat); /* Has the guest accepted the drop event? */ if ( m_dndTarget.isOk() && enmResult != KDnDAction_Ignore) { LogFlowFunc(("strFormat=%s ...\n", strFormat.toUtf8().constData())); QByteArray arrBytes; /* * Does the host support the format requested by the guest? * Lookup the format in the MIME data object. */ AssertPtr(pMimeData); if (pMimeData->formats().indexOf(strFormat) >= 0) { arrBytes = pMimeData->data(strFormat); Assert(!arrBytes.isEmpty()); } /* * The host does not support the format requested by the guest. * This can happen if the host wants to send plan text, for example, but * the guest requested something else, e.g. an URI list. * * In that case dictate the guest to use a fixed format from the host, * so instead returning the requested URI list, return the original * data format from the host. The guest has to try to deal with that then. **/ else { LogRel3(("DnD: Guest requested a different format '%s'\n", strFormat.toUtf8().constData())); LogRel3(("DnD: The host offered:\n")); #if 0 for (QStringList::iterator itFmt = pMimeData->formats().begin(); itFmt != pMimeData->formats().end(); itFmt++) { QString strTemp = *itFmt; LogRel3(("DnD: \t%s\n", strTemp.toUtf8().constData())); } #endif if (pMimeData->hasText()) { LogRel3(("DnD: Converting data to text ...\n")); arrBytes = pMimeData->text().toUtf8(); strFormat = "text/plain;charset=utf-8"; } else { LogRel(("DnD: Error: Could not convert host format to guest format\n")); enmResult = KDnDAction_Ignore; } } if (arrBytes.size()) /* Anything to send? */ { /* Convert data to a vector. */ QVector<uint8_t> vecData(arrBytes.size()); /** @todo Can this throw or anything? */ AssertReleaseMsg(vecData.size() == arrBytes.size(), ("Drag and drop format buffer size does not match")); memcpy(vecData.data(), arrBytes.constData(), arrBytes.size()); /* Send data to the guest. */ LogRel3(("DnD: Host is sending %d bytes of data as '%s'\n", vecData.size(), strFormat.toUtf8().constData())); CProgress progress = m_dndTarget.SendData(screenID, strFormat, vecData); if (m_dndTarget.isOk()) { msgCenter().showModalProgressDialog(progress, tr("Dropping data ..."), ":/progress_dnd_hg_90px.png", m_pParent); LogFlowFunc(("Transfer fCompleted=%RTbool, fCanceled=%RTbool, hr=%Rhrc\n", progress.GetCompleted(), progress.GetCanceled(), progress.GetResultCode())); BOOL fCanceled = progress.GetCanceled(); if ( !fCanceled && ( !progress.isOk() || progress.GetResultCode() != 0)) { msgCenter().cannotDropDataToGuest(progress, m_pParent); enmResult = KDnDAction_Ignore; } } else { msgCenter().cannotDropDataToGuest(m_dndTarget, m_pParent); enmResult = KDnDAction_Ignore; } } else /* Error. */ enmResult = KDnDAction_Ignore; } /* * Since the mouse button has been release this in any case marks * the end of the current transfer direction. So reset the current * mode as well here. */ setOpMode(DNDMODE_UNKNOWN); return toQtDnDAction(enmResult); }
bool UIWizardCloneVM::cloneVM() { /* Get clone name: */ QString strName = field("cloneName").toString(); /* Should we reinit mac status? */ bool fReinitMACs = field("reinitMACs").toBool(); /* Should we create linked clone? */ bool fLinked = field("linkedClone").toBool(); /* Get clone mode: */ KCloneMode cloneMode = (mode() == UIWizardMode_Basic && page(Page3)) || (mode() == UIWizardMode_Expert && page(PageExpert)) ? field("cloneMode").value<KCloneMode>() : KCloneMode_MachineState; /* Get VBox object: */ CVirtualBox vbox = vboxGlobal().virtualBox(); /* Prepare machine for cloning: */ CMachine srcMachine = m_machine; /* If the user like to create a linked clone from the current machine, we * have to take a little bit more action. First we create an snapshot, so * that new differencing images on the source VM are created. Based on that * we could use the new snapshot machine for cloning. */ if (fLinked && m_snapshot.isNull()) { /* Open session: */ CSession session = vboxGlobal().openSession(m_machine.GetId()); if (session.isNull()) return false; /* Prepare console: */ CConsole console = session.GetConsole(); /* Take the snapshot: */ QString strSnapshotName = tr("Linked Base for %1 and %2").arg(m_machine.GetName()).arg(strName); CProgress progress = console.TakeSnapshot(strSnapshotName, ""); if (console.isOk()) { /* Show the "Taking Snapshot" progress dialog: */ msgCenter().showModalProgressDialog(progress, m_machine.GetName(), ":/progress_snapshot_create_90px.png", this, true); if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotTakeSnapshot(progress); return false; } } else { msgCenter().cannotTakeSnapshot(console); return false; } /* Unlock machine finally: */ session.UnlockMachine(); /* Get the new snapshot and the snapshot machine. */ const CSnapshot &newSnapshot = m_machine.FindSnapshot(strSnapshotName); if (newSnapshot.isNull()) { msgCenter().cannotFindSnapshotByName(this, m_machine, strSnapshotName); return false; } srcMachine = newSnapshot.GetMachine(); } /* Create a new machine object. */ const QString &strSettingsFile = vbox.ComposeMachineFilename(strName, QString::null /**< @todo group support */, QString::null, QString::null); CMachine cloneMachine = vbox.CreateMachine(strSettingsFile, strName, QVector<QString>(), QString::null, QString::null); if (!vbox.isOk()) { msgCenter().cannotCreateMachine(vbox, this); return false; } /* Add the keep all MACs option to the import settings when requested. */ QVector<KCloneOptions> options; if (!fReinitMACs) options.append(KCloneOptions_KeepAllMACs); /* Linked clones requested? */ if (fLinked) options.append(KCloneOptions_Link); /* Start cloning. */ CProgress progress = srcMachine.CloneTo(cloneMachine, cloneMode, options); if (!srcMachine.isOk()) { msgCenter().cannotCreateClone(srcMachine, this); return false; } /* Wait until done. */ msgCenter().showModalProgressDialog(progress, windowTitle(), ":/progress_clone_90px.png", this, true); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotCreateClone(srcMachine, progress, this); return false; } /* Finally register the clone machine. */ vbox.RegisterMachine(cloneMachine); if (!vbox.isOk()) { msgCenter().cannotRegisterMachine(vbox, cloneMachine, this); return false; } return true; }
/** * Attempt the actual installation. * * This code is shared by UIGlobalSettingsExtension::sltInstallPackage and UISelectorWindow::sltOpenUrls. * * @param strFilePath The path to the tarball. * @param strDigest The digest of the file (SHA-256). Empty string if no * digest was performed. * @param pParent The parent widget. * @param pstrExtPackName Where to return the extension pack name. Optional. */ /*static*/ void UIGlobalSettingsExtension::doInstallation(QString const &strFilePath, QString const &strDigest, QWidget *pParent, QString *pstrExtPackName) { /* * Open the extpack tarball via IExtPackManager. */ CExtPackManager manager = vboxGlobal().virtualBox().GetExtensionPackManager(); CExtPackFile extPackFile; if (strDigest.isEmpty()) extPackFile = manager.OpenExtPackFile(strFilePath); else { QString strFileAndHash = QString("%1::SHA-256=%2").arg(strFilePath).arg(strDigest); extPackFile = manager.OpenExtPackFile(strFileAndHash); } if (!manager.isOk()) { msgCenter().cannotOpenExtPack(strFilePath, manager, pParent); return; } if (!extPackFile.GetUsable()) { msgCenter().badExtPackFile(strFilePath, extPackFile, pParent); return; } QString strPackName = extPackFile.GetName(); QString strPackDescription = extPackFile.GetDescription(); QString strPackVersion = QString("%1r%2%3").arg(extPackFile.GetVersion()).arg(extPackFile.GetRevision()).arg(extPackFile.GetEdition()); /* * Check if there is a version of the extension pack already * installed on the system and let the user decide what to do about * it. */ CExtPack extPackCur = manager.Find(strPackName); bool fReplaceIt = extPackCur.isOk(); if (fReplaceIt) { QString strPackVersionCur = QString("%1r%2%3").arg(extPackCur.GetVersion()).arg(extPackCur.GetRevision()).arg(extPackCur.GetEdition()); if (!msgCenter().confirmReplacePackage(strPackName, strPackVersion, strPackVersionCur, strPackDescription, pParent)) return; } /* * If it's a new package just ask for general confirmation. */ else { if (!msgCenter().confirmInstallingPackage(strPackName, strPackVersion, strPackDescription, pParent)) return; } /* * Display the license dialog if required by the extension pack. */ if (extPackFile.GetShowLicense()) { QString strLicense = extPackFile.GetLicense(); VBoxLicenseViewer licenseViewer(pParent); if (licenseViewer.showLicenseFromString(strLicense) != QDialog::Accepted) return; } /* * Install the selected package. * * Set the package name return value before doing this as the caller should * do a refresh even on failure. */ QString displayInfo; #ifdef RT_OS_WINDOWS if (pParent) displayInfo.sprintf("hwnd=%#llx", (uint64_t)(uintptr_t)pParent->winId()); #endif CProgress progress = extPackFile.Install(fReplaceIt, displayInfo); if (extPackFile.isOk()) { if (progress.isNull()) msgCenter().notifyAboutExtPackInstalled(strPackName, pParent); else { msgCenter().showModalProgressDialog(progress, tr("Extensions")); if (!progress.GetCanceled()) { if (progress.isOk() && progress.GetResultCode() == 0) msgCenter().notifyAboutExtPackInstalled(strPackName, pParent); else msgCenter().cannotInstallExtPack(strFilePath, extPackFile, progress, pParent); } } } else msgCenter().cannotInstallExtPack(strFilePath, extPackFile, progress, pParent); if (pstrExtPackName) *pstrExtPackName = strPackName; }
bool UIWizardExportApp::exportAppliance() { /* Get export appliance widget: */ UIApplianceExportEditorWidget *pExportApplianceWidget = field("applianceWidget").value<ExportAppliancePointer>(); /* Fetch all settings from the appliance editor. */ pExportApplianceWidget->prepareExport(); /* Get the appliance. */ CAppliance *pAppliance = pExportApplianceWidget->appliance(); /* We need to know every filename which will be created, so that we can * ask the user for confirmation of overwriting. For that we iterating * over all virtual systems & fetch all descriptions of the type * HardDiskImage. Also add the manifest file to the check. In the ova * case only the target file itself get checked. */ QFileInfo fi(field("path").toString()); QVector<QString> files; files << fi.fileName(); if (fi.suffix().toLower() == "ovf") { if (field("manifestSelected").toBool()) files << fi.baseName() + ".mf"; CVirtualSystemDescriptionVector vsds = pAppliance->GetVirtualSystemDescriptions(); for (int i = 0; i < vsds.size(); ++ i) { QVector<KVirtualSystemDescriptionType> types; QVector<QString> refs, origValues, configValues, extraConfigValues; vsds[i].GetDescriptionByType(KVirtualSystemDescriptionType_HardDiskImage, types, refs, origValues, configValues, extraConfigValues); foreach (const QString &s, origValues) files << QString("%2").arg(s); } } CVFSExplorer explorer = pAppliance->CreateVFSExplorer(uri(false /* fWithFile */)); CProgress progress = explorer.Update(); bool fResult = explorer.isOk(); if (fResult) { /* Show some progress, so the user know whats going on: */ msgCenter().showModalProgressDialog(progress, QApplication::translate("UIWizardExportApp", "Checking files ..."), ":/refresh_32px.png", this); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotCheckFiles(progress, this); return false; } } QVector<QString> exists = explorer.Exists(files); /* Check if the file exists already, if yes get confirmation for overwriting from the user. */ if (!msgCenter().confirmOverridingFiles(exists, this)) return false; /* Ok all is confirmed so delete all the files which exists: */ if (!exists.isEmpty()) { CProgress progress1 = explorer.Remove(exists); fResult = explorer.isOk(); if (fResult) { /* Show some progress, so the user know whats going on: */ msgCenter().showModalProgressDialog(progress1, QApplication::translate("UIWizardExportApp", "Removing files ..."), ":/vm_delete_32px.png", this); if (progress1.GetCanceled()) return false; if (!progress1.isOk() || progress1.GetResultCode() != 0) { msgCenter().cannotRemoveFiles(progress1, this); return false; } } } /* Export the VMs, on success we are finished: */ if (exportVMs(*pAppliance)) { #if 0 /* Save attributes to GUI extra data: */ StorageType storageType = field("storageType").value<StorageType>(); vboxGlobal().virtualBox().SetExtraData(GUI_Export_StorageType, QString::number(storageType)); vboxGlobal().virtualBox().SetExtraData(GUI_Export_Username, m_pLeUsername->text()); vboxGlobal().virtualBox().SetExtraData(GUI_Export_Hostname, m_pLeHostname->text()); vboxGlobal().virtualBox().SetExtraData(GUI_Export_Bucket, m_pLeBucket->text()); #endif return true; } return false; }
bool UIWizardExportApp::exportVMs(CAppliance &appliance) { /* Get the map of the password IDs: */ EncryptedMediumMap encryptedMediums; foreach (const QString &strPasswordId, appliance.GetPasswordIds()) foreach (const QString &strMediumId, appliance.GetMediumIdsForPasswordId(strPasswordId)) encryptedMediums.insert(strPasswordId, strMediumId); /* Ask for the disk encryption passwords if necessary: */ if (!encryptedMediums.isEmpty()) { /* Create corresponding dialog: */ QPointer<UIAddDiskEncryptionPasswordDialog> pDlg = new UIAddDiskEncryptionPasswordDialog(this, window()->windowTitle(), encryptedMediums); /* Execute the dialog: */ if (pDlg->exec() == QDialog::Accepted) { /* Acquire the passwords provided: */ const EncryptionPasswordMap encryptionPasswords = pDlg->encryptionPasswords(); /* Delete the dialog: */ delete pDlg; /* Make sure the passwords were really provided: */ AssertReturn(!encryptionPasswords.isEmpty(), false); /* Provide appliance with passwords if possible: */ appliance.AddPasswords(encryptionPasswords.keys().toVector(), encryptionPasswords.values().toVector()); if (!appliance.isOk()) { /* Warn the user about failure: */ msgCenter().cannotAddDiskEncryptionPassword(appliance); return false; } } else { /* Any modal dialog can be destroyed in own event-loop * as a part of application termination procedure.. * We have to check if the dialog still valid. */ if (pDlg) { /* Delete the dialog: */ delete pDlg; } return false; } } /* Write the appliance: */ QVector<KExportOptions> options; if (field("manifestSelected").toBool()) options.append(KExportOptions_CreateManifest); CProgress progress = appliance.Write(field("format").toString(), options, uri()); bool fResult = appliance.isOk(); if (fResult) { /* Show some progress, so the user know whats going on: */ msgCenter().showModalProgressDialog(progress, QApplication::translate("UIWizardExportApp", "Exporting Appliance ..."), ":/progress_export_90px.png", this); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotExportAppliance(progress, appliance.GetPath(), this); return false; } else return true; } if (!fResult) msgCenter().cannotExportAppliance(appliance, this); return false; }
bool UICloneVMWizard::createClone(const QString &strName, KCloneMode mode, bool fReinitMACs, bool fLinked /* = false */) { CVirtualBox vbox = vboxGlobal().virtualBox(); const QString &strSettingsFile = vbox.ComposeMachineFilename(strName, QString::null); CMachine srcMachine = m_machine; /* If the user like to create a linked clone from the current machine, we * have to take a little bit more action. First we create an snapshot, so * that new differencing images on the source VM are created. Based on that * we could use the new snapshot machine for cloning. */ if ( fLinked && m_snapshot.isNull()) { const QString &strId = m_machine.GetId(); CSession session = vboxGlobal().openSession(strId); if (session.isNull()) return false; CConsole console = session.GetConsole(); /* Take the snapshot */ QString strSnapshotName = tr("Linked Base for %1 and %2").arg(m_machine.GetName()).arg(strName); CProgress progress = console.TakeSnapshot(strSnapshotName, ""); if (console.isOk()) { /* Show the "Taking Snapshot" progress dialog */ msgCenter().showModalProgressDialog(progress, m_machine.GetName(), ":/progress_snapshot_create_90px.png", this, true); if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotTakeSnapshot(progress); return false; } } else { msgCenter().cannotTakeSnapshot(console); return false; } /* Unlock machine finally: */ session.UnlockMachine(); /* Get the new snapshot and the snapshot machine. */ const CSnapshot &newSnapshot = m_machine.FindSnapshot(strSnapshotName); if (newSnapshot.isNull()) { msgCenter().cannotFindSnapshotByName(this, m_machine, strSnapshotName); return false; } srcMachine = newSnapshot.GetMachine(); } /* Create a new machine object. */ CMachine cloneMachine = vbox.CreateMachine(strSettingsFile, strName, QString::null, QString::null, false); if (!vbox.isOk()) { msgCenter().cannotCreateMachine(vbox, this); return false; } /* Add the keep all MACs option to the import settings when requested. */ QVector<KCloneOptions> options; if (!fReinitMACs) options.append(KCloneOptions_KeepAllMACs); /* Linked clones requested? */ if (fLinked) options.append(KCloneOptions_Link); /* Start cloning. */ CProgress progress = srcMachine.CloneTo(cloneMachine, mode, options); if (!srcMachine.isOk()) { msgCenter().cannotCreateClone(srcMachine, this); return false; } /* Wait until done. */ msgCenter().showModalProgressDialog(progress, windowTitle(), ":/progress_clone_90px.png", this, true); if (progress.GetCanceled()) return false; if (!progress.isOk() || progress.GetResultCode() != 0) { msgCenter().cannotCreateClone(srcMachine, progress, this); return false; } /* Finally register the clone machine. */ vbox.RegisterMachine(cloneMachine); if (!vbox.isOk()) { msgCenter().cannotRegisterMachine(vbox, cloneMachine, this); return false; } return true; }