UIMedium::UIMedium() : m_type(UIMediumType_Invalid) , m_medium(CMedium()) , m_state(KMediumState_NotCreated) { refresh(); }
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 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(QString(), field("name").toString(), groups, strTypeId, QString::null); if (!vbox.isOk()) { msgCenter().cannotCreateMachine(vbox, this); return false; } /* The FirstRun wizard is to be shown only when we don't attach any virtual hard drive or attach a new (empty) one. * Selecting an existing virtual hard drive will cancel the FirstRun wizard. */ 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()); /* 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.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 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 CD/DVD ROM Device */ 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; }