/** Contains medium enumeration task body. */ void run() { /* Get medium: */ UIMedium medium = property("medium").value<UIMedium>(); /* Enumerate it: */ medium.blockAndQueryState(); /* Put it back: */ setProperty("medium", QVariant::fromValue(medium)); }
/* Insert hard-disks to the passed uimedium map. * Get existing one from the previous map if any. */ foreach (CMedium medium, inputMediums) { /* If VBoxGlobal is cleaning up, abort immediately: */ if (vboxGlobal().isCleaningUp()) break; /* Prepare uimedium on the basis of current medium: */ QString strMediumID = medium.GetId(); UIMedium uimedium = m_mediums.contains(strMediumID) ? m_mediums[strMediumID] : UIMedium(medium, mediumType); /* Insert uimedium into map: */ outputMediums.insert(uimedium.id(), uimedium); }
bool UIWizardFirstRun::insertMedium() { /* Get 'vbox' global object: */ CVirtualBox vbox = vboxGlobal().virtualBox(); /* Determine machine 'OS type': */ const CGuestOSType &osType = vbox.GetGuestOSType(m_machine.GetOSTypeId()); /* Determine recommended controller's 'bus' & 'type': */ KStorageBus dvdCtrBus = osType.GetRecommendedDVDStorageBus(); KStorageControllerType dvdCtrType = osType.GetRecommendedDVDStorageController(); /* Declare null 'dvd' attachment: */ CMediumAttachment cda; /* Enumerate attachments vector: */ const CMediumAttachmentVector &attachments = m_machine.GetMediumAttachments(); for (int i = 0; i < attachments.size(); ++i) { /* Get current attachment: */ const CMediumAttachment &attachment = attachments[i]; /* Determine attachment's controller: */ const CStorageController &controller = m_machine.GetStorageControllerByName(attachment.GetController()); /* If controller's 'bus' & 'type' are recommended and attachment's 'type' is 'dvd': */ if (controller.GetBus() == dvdCtrBus && controller.GetControllerType() == dvdCtrType && attachment.GetType() == KDeviceType_DVD) { /* Remember attachment: */ cda = attachment; break; } } AssertMsg(!cda.isNull(), ("Storage Controller is NOT properly configured!\n")); /* Get chosen 'dvd' medium to mount: */ QString mediumId = field("id").toString(); UIMedium vmedium = vboxGlobal().medium(mediumId); CMedium medium = vmedium.medium(); // @todo r=dj can this be cached somewhere? /* Mount medium to the predefined port/device: */ m_machine.MountMedium(cda.GetController(), cda.GetPort(), cda.GetDevice(), medium, false /* force */); if (m_machine.isOk()) return true; else { msgCenter().cannotRemountMedium(m_machine, vmedium, true /* mount? */, false /* retry? */, this); return false; } }
void UIMediumEnumerator::createMedium(const UIMedium &medium) { /* Get medium ID: */ QString strMediumID = medium.id(); LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} created.\n", strMediumID.toAscii().constData())); /* Make sure medium doesn't exists already: */ AssertReturnVoid(!m_mediums.contains(strMediumID)); /* Insert medium: */ m_mediums[strMediumID] = medium; /* Notify listener: */ emit sigMediumCreated(strMediumID); }
void UIMediumEnumerator::updateMedium(const UIMedium &medium) { /* Get medium ID: */ QString strMediumID = medium.id(); LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} updated.\n", strMediumID.toAscii().constData())); /* Make sure medium still exists: */ AssertReturnVoid(m_mediums.contains(strMediumID)); /* Update medium: */ m_mediums[strMediumID] = medium; /* Notify listener: */ emit sigMediumUpdated(strMediumID); }
void UIMediumEnumerator::createMedium(const UIMedium &medium) { /* Get medium ID: */ const QString strMediumID = medium.id(); /* Do not create UIMedium(s) with incorrect ID: */ AssertReturnVoid(!strMediumID.isNull()); AssertReturnVoid(strMediumID != UIMedium::nullID()); /* Make sure medium doesn't exists already: */ AssertReturnVoid(!m_mediums.contains(strMediumID)); /* Insert medium: */ m_mediums[strMediumID] = medium; LogRel(("GUI: UIMediumEnumerator: Medium with key={%s} created\n", strMediumID.toUtf8().constData())); /* Notify listener: */ emit sigMediumCreated(strMediumID); }
bool UIWizardNewVM::createVM() { /* Get VBox object: */ CVirtualBox vbox = vboxGlobal().virtualBox(); /* OS type: */ CGuestOSType type = field("type").value<CGuestOSType>(); QString strTypeId = type.GetId(); /* Create virtual machine: */ if (m_machine.isNull()) { QVector<QString> groups; if (!m_strGroup.isEmpty()) groups << m_strGroup; m_machine = vbox.CreateMachine(field("machineFilePath").toString(), field("machineBaseName").toString(), groups, strTypeId, QString()); if (!vbox.isOk()) { msgCenter().cannotCreateMachine(vbox, this); return false; } /* The First RUN Wizard is to be shown: * 1. if we don't attach any virtual hard-drive * 2. or attach a new (empty) one. * Usually we are assigning extra-data values through UIExtraDataManager, * but in that special case VM was not registered yet, so UIExtraDataManager is unaware of it. */ if (field("virtualDiskId").toString().isNull() || !field("virtualDisk").value<CMedium>().isNull()) m_machine.SetExtraData(GUI_FirstRun, "yes"); } /* RAM size: */ m_machine.SetMemorySize(field("ram").toInt()); /* VRAM size - select maximum between recommended and minimum for fullscreen: */ m_machine.SetVRAMSize(qMax(type.GetRecommendedVRAM(), (ULONG)(VBoxGlobal::requiredVideoMemory(strTypeId) / _1M))); /* Selecting recommended chipset type: */ m_machine.SetChipsetType(type.GetRecommendedChipset()); /* Selecting recommended Audio Controller: */ m_machine.GetAudioAdapter().SetAudioController(type.GetRecommendedAudioController()); /* And the Audio Codec: */ m_machine.GetAudioAdapter().SetAudioCodec(type.GetRecommendedAudioCodec()); /* Enabling audio by default: */ m_machine.GetAudioAdapter().SetEnabled(true); /* Enable the OHCI and EHCI controller by default for new VMs. (new in 2.2): */ CUSBDeviceFilters usbDeviceFilters = m_machine.GetUSBDeviceFilters(); bool fOhciEnabled = false; if (!usbDeviceFilters.isNull() && type.GetRecommendedUSB3() && m_machine.GetUSBProxyAvailable()) { /* USB 3.0 is only available if the proper ExtPack is installed. */ CExtPackManager manager = vboxGlobal().virtualBox().GetExtensionPackManager(); if (manager.IsExtPackUsable(GUI_ExtPackName)) { m_machine.AddUSBController("XHCI", KUSBControllerType_XHCI); /* xHci includes OHCI */ fOhciEnabled = true; } } if ( !fOhciEnabled && !usbDeviceFilters.isNull() && type.GetRecommendedUSB() && m_machine.GetUSBProxyAvailable()) { m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); fOhciEnabled = true; /* USB 2.0 is only available if the proper ExtPack is installed. * Note. Configuring EHCI here and providing messages about * the missing extpack isn't exactly clean, but it is a * necessary evil to patch over legacy compatability issues * introduced by the new distribution model. */ CExtPackManager manager = vboxGlobal().virtualBox().GetExtensionPackManager(); if (manager.IsExtPackUsable(GUI_ExtPackName)) m_machine.AddUSBController("EHCI", KUSBControllerType_EHCI); } /* Create a floppy controller if recommended: */ QString strFloppyName = getNextControllerName(KStorageBus_Floppy); if (type.GetRecommendedFloppy()) { m_machine.AddStorageController(strFloppyName, KStorageBus_Floppy); CStorageController flpCtr = m_machine.GetStorageControllerByName(strFloppyName); flpCtr.SetControllerType(KStorageControllerType_I82078); } /* Create recommended DVD storage controller: */ KStorageBus strDVDBus = type.GetRecommendedDVDStorageBus(); QString strDVDName = getNextControllerName(strDVDBus); m_machine.AddStorageController(strDVDName, strDVDBus); /* Set recommended DVD storage controller type: */ CStorageController dvdCtr = m_machine.GetStorageControllerByName(strDVDName); KStorageControllerType dvdStorageControllerType = type.GetRecommendedDVDStorageController(); dvdCtr.SetControllerType(dvdStorageControllerType); /* Create recommended HD storage controller if it's not the same as the DVD controller: */ KStorageBus ctrHDBus = type.GetRecommendedHDStorageBus(); KStorageControllerType hdStorageControllerType = type.GetRecommendedHDStorageController(); CStorageController hdCtr; QString strHDName; if (ctrHDBus != strDVDBus || hdStorageControllerType != dvdStorageControllerType) { strHDName = getNextControllerName(ctrHDBus); m_machine.AddStorageController(strHDName, ctrHDBus); hdCtr = m_machine.GetStorageControllerByName(strHDName); hdCtr.SetControllerType(hdStorageControllerType); } else { /* The HD controller is the same as DVD: */ hdCtr = dvdCtr; strHDName = strDVDName; } /* Liomit the AHCI port count if it's used because windows has trouble with too many ports and other guest (OS X in particular) may take extra long to boot: */ if (hdStorageControllerType == KStorageControllerType_IntelAhci) hdCtr.SetPortCount(1 + (dvdStorageControllerType == KStorageControllerType_IntelAhci)); else if (dvdStorageControllerType == KStorageControllerType_IntelAhci) dvdCtr.SetPortCount(1); /* Turn on PAE, if recommended: */ m_machine.SetCPUProperty(KCPUPropertyType_PAE, type.GetRecommendedPAE()); /* Set the recommended triple fault behavior: */ m_machine.SetCPUProperty(KCPUPropertyType_TripleFaultReset, type.GetRecommendedTFReset()); /* Set recommended firmware type: */ KFirmwareType fwType = type.GetRecommendedFirmware(); m_machine.SetFirmwareType(fwType); /* Set recommended human interface device types: */ if (type.GetRecommendedUSBHID()) { m_machine.SetKeyboardHIDType(KKeyboardHIDType_USBKeyboard); m_machine.SetPointingHIDType(KPointingHIDType_USBMouse); if (!fOhciEnabled && !usbDeviceFilters.isNull()) m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); } if (type.GetRecommendedUSBTablet()) { m_machine.SetPointingHIDType(KPointingHIDType_USBTablet); if (!fOhciEnabled && !usbDeviceFilters.isNull()) m_machine.AddUSBController("OHCI", KUSBControllerType_OHCI); } /* Set HPET flag: */ m_machine.SetHPETEnabled(type.GetRecommendedHPET()); /* Set UTC flags: */ m_machine.SetRTCUseUTC(type.GetRecommendedRTCUseUTC()); /* Set graphic bits: */ if (type.GetRecommended2DVideoAcceleration()) m_machine.SetAccelerate2DVideoEnabled(type.GetRecommended2DVideoAcceleration()); if (type.GetRecommended3DAcceleration()) m_machine.SetAccelerate3DEnabled(type.GetRecommended3DAcceleration()); /* Register the VM prior to attaching hard disks: */ vbox.RegisterMachine(m_machine); if (!vbox.isOk()) { msgCenter().cannotRegisterMachine(vbox, m_machine.GetName(), this); return false; } /* Attach default devices: */ { bool success = false; QString strMachineId = m_machine.GetId(); CSession session = vboxGlobal().openSession(strMachineId); if (!session.isNull()) { CMachine machine = session.GetMachine(); QString strId = field("virtualDiskId").toString(); /* Boot virtual hard drive: */ if (!strId.isNull()) { UIMedium vmedium = vboxGlobal().medium(strId); CMedium medium = vmedium.medium(); // @todo r=dj can this be cached somewhere? machine.AttachDevice(strHDName, 0, 0, KDeviceType_HardDisk, medium); if (!machine.isOk()) msgCenter().cannotAttachDevice(machine, UIMediumType_HardDisk, field("virtualDiskLocation").toString(), StorageSlot(ctrHDBus, 0, 0), this); } /* Attach empty optical drive: */ machine.AttachDevice(strDVDName, 1, 0, KDeviceType_DVD, CMedium()); if (!machine.isOk()) msgCenter().cannotAttachDevice(machine, UIMediumType_DVD, QString(), StorageSlot(strDVDBus, 1, 0), this); /* Attach an empty floppy drive if recommended */ if (type.GetRecommendedFloppy()) { machine.AttachDevice(strFloppyName, 0, 0, KDeviceType_Floppy, CMedium()); if (!machine.isOk()) msgCenter().cannotAttachDevice(machine, UIMediumType_Floppy, QString(), StorageSlot(KStorageBus_Floppy, 0, 0), this); } if (machine.isOk()) { machine.SaveSettings(); if (machine.isOk()) success = true; else msgCenter().cannotSaveMachineSettings(machine, this); } session.UnlockMachine(); } if (!success) { /* Unregister on failure */ QVector<CMedium> aMedia = m_machine.Unregister(KCleanupMode_UnregisterOnly); // @todo replace with DetachAllReturnHardDisksOnly once a progress dialog is in place below if (vbox.isOk()) { CProgress progress = m_machine.DeleteConfig(aMedia); progress.WaitForCompletion(-1); // @todo do this nicely with a progress dialog, this can delete lots of files } return false; } } /* Ensure we don't try to delete a newly created virtual hard drive on success: */ if (!field("virtualDisk").value<CMedium>().isNull()) field("virtualDisk").value<CMedium>().detach(); return true; }
void UIMediumEnumerator::sltHandleMediumEnumerationTaskComplete(UITask *pTask) { /* Make sure that is one of our tasks: */ if (pTask->type() != UITask::Type_MediumEnumeration) return; AssertReturnVoid(m_tasks.contains(pTask)); /* Get enumerated UIMedium: */ const UIMedium uimedium = pTask->property("medium").value<UIMedium>(); const QString strUIMediumKey = uimedium.key(); LogRel2(("GUI: UIMediumEnumerator: Medium with key={%s} enumerated\n", strUIMediumKey.toUtf8().constData())); /* Remove task from internal set: */ m_tasks.remove(pTask); /* Make sure such UIMedium still exists: */ AssertReturnVoid(m_mediums.contains(strUIMediumKey)); /* Check if UIMedium ID was changed: */ const QString strUIMediumID = uimedium.id(); /* UIMedium ID was changed to nullID: */ if (strUIMediumID == UIMedium::nullID()) { /* Delete this medium: */ m_mediums.remove(strUIMediumKey); LogRel2(("GUI: UIMediumEnumerator: Medium with key={%s} closed and deleted (after enumeration)\n", strUIMediumKey.toUtf8().constData())); /* And notify listener about delete: */ emit sigMediumDeleted(strUIMediumKey); } /* UIMedium ID was changed to something proper: */ else if (strUIMediumID != strUIMediumKey) { /* We have to reinject enumerated medium: */ m_mediums.remove(strUIMediumKey); m_mediums[strUIMediumID] = uimedium; m_mediums[strUIMediumID].setKey(strUIMediumID); LogRel2(("GUI: UIMediumEnumerator: Medium with key={%s} has it changed to {%s}\n", strUIMediumKey.toUtf8().constData(), strUIMediumID.toUtf8().constData())); /* And notify listener about delete/create: */ emit sigMediumDeleted(strUIMediumKey); emit sigMediumCreated(strUIMediumID); } /* UIMedium ID was not changed: */ else { /* Just update enumerated medium: */ m_mediums[strUIMediumID] = uimedium; LogRel2(("GUI: UIMediumEnumerator: Medium with key={%s} updated\n", strUIMediumID.toUtf8().constData())); /* And notify listener about update: */ emit sigMediumEnumerated(strUIMediumID); } /* If there are no more tasks we know about: */ if (m_tasks.isEmpty()) { /* Notify listener: */ LogRel(("GUI: UIMediumEnumerator: Medium-enumeration finished!\n")); m_fMediumEnumerationInProgress = false; emit sigMediumEnumerationFinished(); } }