Changeset 23288 in vbox for trunk/src/VBox/Main
- Timestamp:
- Sep 24, 2009 3:22:25 PM (15 years ago)
- Location:
- trunk/src/VBox/Main
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/idl/VirtualBox.xidl
r23280 r23288 403 403 </const> 404 404 <const name="v1_3" value="5"> 405 <desc>Legacy settings version, not currently supported.</desc> 405 <desc>Settings version "1.3", written by VirtualBox 2.0.12.</desc> 406 <!-- 407 Machine XML: Capitalization of Uart, Lpt elements and many attributes changed. 408 --> 406 409 </const> 407 410 <const name="v1_4" value="6"> 408 <desc>Legacy settings version, not currently supported.</desc> 411 <desc>Intermediate settings version, understood by VirtualBox 2.1.x.</desc> 412 <!-- 413 VirtualBox.xml: big DiskRegistry -> MediaRegistry revamp, various HardDisk types merged 414 (was VirtualDiskImage, VMDKImage, VHDImage, ISCSIHardDisk, CustomHardDisk, DiffHardDisk) 415 --> 409 416 </const> 410 417 <const name="v1_5" value="7"> 411 <desc> Legacy settings version, not currently supported.</desc>418 <desc>Intermediate settings version, understood by VirtualBox 2.1.x.</desc> 412 419 <!-- 2008-09-04: 2.0.0 released 413 420 2008-11-20: settings version 1.5 introduced 414 421 2008-12-17: 2.1.0 released 415 (todo) 422 Machine changes: 423 guest OS identifiers changed; 424 Machine/Hardware/Display/MonitorCount renamed to monitorCount; 425 Machine/Hardware/Display/Accelerate3D renamed to accelerate3D; 426 Machine/Hardware/CPU/CPUCount/@count changed to CPU/@count 416 427 --> 417 428 </const> -
trunk/src/VBox/Main/xml/Settings.cpp
r23249 r23288 174 174 if (ulMajor == 1) 175 175 { 176 if (ulMinor == 6) 176 if (ulMinor == 3) 177 m->sv = SettingsVersion_v1_3; 178 else if (ulMinor == 4) 179 m->sv = SettingsVersion_v1_4; 180 else if (ulMinor == 5) 181 m->sv = SettingsVersion_v1_5; 182 else if (ulMinor == 6) 177 183 m->sv = SettingsVersion_v1_6; 178 184 else if (ulMinor == 7) … … 385 391 ) 386 392 { 387 pelmLevel4Child->getAttributeValue("vendorId", flt.strVendorId); 388 pelmLevel4Child->getAttributeValue("productId", flt.strProductId); 393 if (!pelmLevel4Child->getAttributeValue("vendorId", flt.strVendorId)) 394 pelmLevel4Child->getAttributeValue("vendorid", flt.strVendorId); // used before 1.3 395 if (!pelmLevel4Child->getAttributeValue("productId", flt.strProductId)) 396 pelmLevel4Child->getAttributeValue("productid", flt.strProductId) // used before 1.3 389 397 pelmLevel4Child->getAttributeValue("revision", flt.strRevision); 390 398 pelmLevel4Child->getAttributeValue("manufacturer", flt.strManufacturer); 391 399 pelmLevel4Child->getAttributeValue("product", flt.strProduct); 392 pelmLevel4Child->getAttributeValue("serialNumber", flt.strSerialNumber); 400 if (!pelmLevel4Child->getAttributeValue("serialNumber", flt.strSerialNumber)) 401 pelmLevel4Child->getAttributeValue("serialnumber", flt.strSerialNumber); // used before 1.3 393 402 pelmLevel4Child->getAttributeValue("port", flt.strPort); 394 403 … … 597 606 /** 598 607 * Reads a media registry entry from the main VirtualBox.xml file. 608 * 609 * Whereas the current media registry code is fairly straightforward, it was quite a mess 610 * with settings format before 1.4 (VirtualBox 2.0 used settings format 1.3). The elements 611 * in the media registry were much more inconsistent, and different elements were used 612 * depending on the type of device and image. 613 * 599 614 * @param t 600 615 * @param elmMedium … … 602 617 */ 603 618 void MainConfigFile::readMedium(MediaType t, 604 const xml::ElementNode &elmMedium, // MediaRegistry/HardDisks or a single HardDisk node if recursing 605 MediaList &llMedia) 619 const xml::ElementNode &elmMedium, // HardDisk node if root; if recursing, 620 // child HardDisk node or DiffHardDisk node for pre-1.4 621 MediaList &llMedia) // list to append medium to (root disk or child list) 606 622 { 607 623 // <HardDisk uuid="{5471ecdb-1ddb-4012-a801-6d98e226868b}" location="/mnt/innotek-unix/vdis/Windows XP.vdi" format="VDI" type="Normal"> 608 624 settings::Medium med; 609 625 Utf8Str strUUID; 610 if ( (elmMedium.getAttributeValue("uuid", strUUID)) 611 && (elmMedium.getAttributeValue("location", med.strLocation)) 612 ) 613 { 614 parseUUID(med.uuid, strUUID); 615 elmMedium.getAttributeValue("Description", med.strDescription); // optional 616 617 if (t == HardDisk) 618 { 626 if (!(elmMedium.getAttributeValue("uuid", strUUID))) 627 throw ConfigFileError(this, &elmMedium, N_("Required %s/@uuid attribute is missing"), elmMedium.getName()); 628 629 parseUUID(med.uuid, strUUID); 630 631 bool fNeedsLocation = true; 632 633 if (t == HardDisk) 634 { 635 if (m->sv < SettingsVersion_v1_4) 636 { 637 // here the system is: 638 // <HardDisk uuid="{....}" type="normal"> 639 // <VirtualDiskImage filePath="/path/to/xxx.vdi"/> 640 // </HardDisk> 641 642 fNeedsLocation = false; 643 bool fNeedsFilePath = true; 644 const xml::ElementNode *pelmImage; 645 if ((pelmImage = elmMedium.findChildElement("VirtualDiskImage"))) 646 med.strFormat = "VDI"; 647 else if ((pelmImage = elmMedium.findChildElement("VMDKImage"))) 648 med.strFormat = "VMDK"; 649 else if ((pelmImage = elmMedium.findChildElement("VHDImage"))) 650 med.strFormat = "VHD"; 651 else if ((pelmImage = elmMedium.findChildElement("ISCSIHardDisk"))) 652 { 653 med.strFormat = "iSCSI"; 654 655 fNeedsFilePath = false; 656 // location is special here: current settings specify an "iscsi://user@server:port/target/lun" 657 // string for the location and also have several disk properties for these, whereas this used 658 // to be hidden in several sub-elements before 1.4, so compose a location string and set up 659 // the properties: 660 med.strLocation = "iscsi://"; 661 Utf8Str strUser, strServer, strPort, strTarget, strLun; 662 if (pelmImage->getAttributeValue("userName", strUser)) 663 { 664 med.strLocation.append(strUser); 665 med.strLocation.append("@"); 666 } 667 Utf8Str strServerAndPort; 668 if (pelmImage->getAttributeValue("server", strServer)) 669 { 670 strServerAndPort = strServer; 671 } 672 if (pelmImage->getAttributeValue("port", strPort)) 673 { 674 if (strServerAndPort.length()) 675 strServerAndPort.append(":"); 676 strServerAndPort.append(strPort); 677 } 678 med.strLocation.append(strServerAndPort); 679 if (pelmImage->getAttributeValue("target", strTarget)) 680 { 681 med.strLocation.append("/"); 682 med.strLocation.append(strTarget); 683 } 684 if (pelmImage->getAttributeValue("lun", strLun)) 685 { 686 med.strLocation.append("/"); 687 med.strLocation.append(strLun); 688 } 689 690 if (strServer.length() && strPort.length()) 691 med.properties["TargetAddress"] = strServerAndPort; 692 if (strTarget.length()) 693 med.properties["TargetName"] = strTarget; 694 if (strUser.length()) 695 med.properties["InitiatorUsername"] = strUser; 696 Utf8Str strPassword; 697 if (pelmImage->getAttributeValue("password", strPassword)) 698 med.properties["InitiatorSecret"] = strPassword; 699 if (strLun.length()) 700 med.properties["LUN"] = strLun; 701 } 702 else if ((pelmImage = elmMedium.findChildElement("CustomHardDisk"))) 703 { 704 fNeedsFilePath = false; 705 fNeedsLocation = true; 706 // also requires @format attribute, which will be queried below 707 } 708 else 709 throw ConfigFileError(this, &elmMedium, N_("Required %s/VirtualDiskImage element is missing"), elmMedium.getName()); 710 711 if (fNeedsFilePath) 712 if (!(pelmImage->getAttributeValue("filePath", med.strLocation))) 713 throw ConfigFileError(this, &elmMedium, N_("Required %s/@filePath attribute is missing"), elmMedium.getName()); 714 } 715 716 if (med.strFormat.isEmpty()) // not set with 1.4 format above, or 1.4 Custom format? 619 717 if (!(elmMedium.getAttributeValue("format", med.strFormat))) 620 throw ConfigFileError(this, &elmMedium, N_("Required HardDisk/@format attribute is missing")); 621 622 if (!(elmMedium.getAttributeValue("autoReset", med.fAutoReset))) 623 med.fAutoReset = false; 624 625 Utf8Str strType; 626 if ((elmMedium.getAttributeValue("type", strType))) 627 { 628 if (strType == "Normal") 629 med.hdType = MediumType_Normal; 630 else if (strType == "Immutable") 631 med.hdType = MediumType_Immutable; 632 else if (strType == "Writethrough") 633 med.hdType = MediumType_Writethrough; 634 else 635 throw ConfigFileError(this, &elmMedium, N_("HardDisk/@type attribute must be one of Normal, Immutable or Writethrough")); 636 } 637 } 638 639 // recurse to handle children 640 xml::NodesLoop nl2(elmMedium); 641 const xml::ElementNode *pelmHDChild; 642 while ((pelmHDChild = nl2.forAllNodes())) 643 { 644 if ( t == HardDisk 645 && (pelmHDChild->nameEquals("HardDisk")) 718 throw ConfigFileError(this, &elmMedium, N_("Required %s/@format attribute is missing"), elmMedium.getName()); 719 720 if (!(elmMedium.getAttributeValue("autoReset", med.fAutoReset))) 721 med.fAutoReset = false; 722 723 Utf8Str strType; 724 if ((elmMedium.getAttributeValue("type", strType))) 725 { 726 // pre-1.4 used lower case, so make this case-insensitive 727 strType.toUpper(); 728 if (strType == "NORMAL") 729 med.hdType = MediumType_Normal; 730 else if (strType == "IMMUTABLE") 731 med.hdType = MediumType_Immutable; 732 else if (strType == "WRITETHROUGH") 733 med.hdType = MediumType_Writethrough; 734 else 735 throw ConfigFileError(this, &elmMedium, N_("HardDisk/@type attribute must be one of Normal, Immutable or Writethrough")); 736 } 737 } 738 else if (m->sv < SettingsVersion_v1_4) 739 { 740 // DVD and floppy images before 1.4 had "src" attribute instead of "location" 741 if (!(elmMedium.getAttributeValue("src", med.strLocation))) 742 throw ConfigFileError(this, &elmMedium, N_("Required %s/@src attribute is missing"), elmMedium.getName()); 743 744 fNeedsLocation = false; 745 } 746 747 if (fNeedsLocation) 748 // current files and 1.4 CustomHardDisk elements must have a location attribute 749 if (!(elmMedium.getAttributeValue("location", med.strLocation))) 750 throw ConfigFileError(this, &elmMedium, N_("Required %s/@location attribute is missing"), elmMedium.getName()); 751 752 elmMedium.getAttributeValue("Description", med.strDescription); // optional 753 754 // recurse to handle children 755 xml::NodesLoop nl2(elmMedium); 756 const xml::ElementNode *pelmHDChild; 757 while ((pelmHDChild = nl2.forAllNodes())) 758 { 759 if ( t == HardDisk 760 && ( pelmHDChild->nameEquals("HardDisk") 761 || ( (m->sv < SettingsVersion_v1_4) 762 && (pelmHDChild->nameEquals("DiffHardDisk")) 763 ) 764 ) 765 ) 766 // recurse with this element and push the child onto our current children list 767 readMedium(t, 768 *pelmHDChild, 769 med.llChildren); 770 else if (pelmHDChild->nameEquals("Property")) 771 { 772 Utf8Str strPropName, strPropValue; 773 if ( (pelmHDChild->getAttributeValue("name", strPropName)) 774 && (pelmHDChild->getAttributeValue("value", strPropValue)) 646 775 ) 647 // recurse with this element and push the child onto our current children list 648 readMedium(t, 649 *pelmHDChild, 650 med.llChildren); 651 else if (pelmHDChild->nameEquals("Property")) 652 { 653 Utf8Str strPropName, strPropValue; 654 if ( (pelmHDChild->getAttributeValue("name", strPropName)) 655 && (pelmHDChild->getAttributeValue("value", strPropValue)) 656 ) 657 med.properties[strPropName] = strPropValue; 658 else 659 throw ConfigFileError(this, pelmHDChild, N_("Required HardDisk/Property/@name or @value attribute is missing")); 660 } 661 } 662 663 llMedia.push_back(med); 664 } 665 else 666 throw ConfigFileError(this, &elmMedium, N_("Required %s/@uuid or @location attribute is missing"), elmMedium.getName()); 667 } 668 669 /** 670 * Reads in the entire <MediaRegistry> chunk. 776 med.properties[strPropName] = strPropValue; 777 else 778 throw ConfigFileError(this, pelmHDChild, N_("Required HardDisk/Property/@name or @value attribute is missing")); 779 } 780 } 781 782 llMedia.push_back(med); 783 } 784 785 /** 786 * Reads in the entire <MediaRegistry> chunk. For pre-1.4 files, this gets called 787 * with the <DiskRegistry> chunk instead. 671 788 * @param elmMediaRegistry 672 789 */ … … 687 804 continue; 688 805 689 xml::NodesLoop nl 1(*pelmChild1);806 xml::NodesLoop nl2(*pelmChild1); 690 807 const xml::ElementNode *pelmMedium; 691 while ((pelmMedium = nl 1.forAllNodes()))808 while ((pelmMedium = nl2.forAllNodes())) 692 809 { 693 810 if ( t == HardDisk … … 773 890 { 774 891 pelmGlobalChild->getAttributeValue("defaultMachineFolder", systemProperties.strDefaultMachineFolder); 775 pelmGlobalChild->getAttributeValue("defaultHardDiskFolder", systemProperties.strDefaultHardDiskFolder); 892 if (!pelmGlobalChild->getAttributeValue("defaultHardDiskFolder", systemProperties.strDefaultHardDiskFolder)) 893 // pre-1.4 used @defaultVDIFolder instead 894 pelmGlobalChild->getAttributeValue("defaultVDIFolder", systemProperties.strDefaultHardDiskFolder); 776 895 pelmGlobalChild->getAttributeValue("defaultHardDiskFormat", systemProperties.strDefaultHardDiskFormat); 777 896 pelmGlobalChild->getAttributeValue("remoteDisplayAuthLibrary", systemProperties.strRemoteDisplayAuthLibrary); … … 783 902 else if (pelmGlobalChild->nameEquals("MachineRegistry")) 784 903 readMachineRegistry(*pelmGlobalChild); 785 else if (pelmGlobalChild->nameEquals("MediaRegistry")) 904 else if ( (pelmGlobalChild->nameEquals("MediaRegistry")) 905 || ( (m->sv < SettingsVersion_v1_4) 906 && (pelmGlobalChild->nameEquals("DiskRegistry")) 907 ) 908 ) 786 909 readMediaRegistry(*pelmGlobalChild); 787 910 else if (pelmGlobalChild->nameEquals("NetserviceRegistry")) … … 1235 1358 if (pelmHwChild->nameEquals("CPU")) 1236 1359 { 1237 pelmHwChild->getAttributeValue("count", hw.cCPUs); 1360 if (!pelmHwChild->getAttributeValue("count", hw.cCPUs)) 1361 { 1362 // pre-1.5 variant; not sure if this actually exists in the wild anywhere 1363 const xml::ElementNode *pelmCPUChild; 1364 if ((pelmCPUChild = pelmHwChild->findChildElement("CPUCount"))) 1365 pelmCPUChild->getAttributeValue("count", hw.cCPUs); 1366 } 1238 1367 1239 1368 const xml::ElementNode *pelmCPUChild; … … 1318 1447 { 1319 1448 pelmHwChild->getAttributeValue("VRAMSize", hw.ulVRAMSizeMB); 1320 pelmHwChild->getAttributeValue("monitorCount", hw.cMonitors); 1321 pelmHwChild->getAttributeValue("accelerate3D", hw.fAccelerate3D); 1449 if (!pelmHwChild->getAttributeValue("monitorCount", hw.cMonitors)) 1450 pelmHwChild->getAttributeValue("MonitorCount", hw.cMonitors); // pre-v1.5 variant 1451 if (!pelmHwChild->getAttributeValue("accelerate3D", hw.fAccelerate3D)) 1452 pelmHwChild->getAttributeValue("Accelerate3D", hw.fAccelerate3D); // pre-v1.5 variant 1322 1453 pelmHwChild->getAttributeValue("accelerate2DVideo", hw.fAccelerate2DVideo); 1323 1454 } … … 1331 1462 if (pelmHwChild->getAttributeValue("authType", strAuthType)) 1332 1463 { 1333 if (strAuthType == "Null") 1464 // settings before 1.3 used lower case so make sure this is case-insensitive 1465 strAuthType.toUpper(); 1466 if (strAuthType == "NULL") 1334 1467 hw.vrdpSettings.authType = VRDPAuthType_Null; 1335 else if (strAuthType == "G uest")1468 else if (strAuthType == "GUEST") 1336 1469 hw.vrdpSettings.authType = VRDPAuthType_Guest; 1337 else if (strAuthType == "E xternal")1470 else if (strAuthType == "EXTERNAL") 1338 1471 hw.vrdpSettings.authType = VRDPAuthType_External; 1339 1472 else … … 1364 1497 if (pelmBIOSChild->getAttributeValue("mode", strBootMenuMode)) 1365 1498 { 1366 if (strBootMenuMode == "Disabled") 1499 // settings before 1.3 used lower case so make sure this is case-insensitive 1500 strBootMenuMode.toUpper(); 1501 if (strBootMenuMode == "DISABLED") 1367 1502 hw.biosSettings.biosBootMenuMode = BIOSBootMenuMode_Disabled; 1368 else if (strBootMenuMode == "M enuOnly")1503 else if (strBootMenuMode == "MENUONLY") 1369 1504 hw.biosSettings.biosBootMenuMode = BIOSBootMenuMode_MenuOnly; 1370 else if (strBootMenuMode == "M essageAndMenu")1505 else if (strBootMenuMode == "MESSAGEANDMENU") 1371 1506 hw.biosSettings.biosBootMenuMode = BIOSBootMenuMode_MessageAndMenu; 1372 1507 else … … 1433 1568 else if (pelmHwChild->nameEquals("Network")) 1434 1569 readNetworkAdapters(*pelmHwChild, hw.llNetworkAdapters); 1435 else if (pelmHwChild->nameEquals("UART")) 1570 else if ( (pelmHwChild->nameEquals("UART")) 1571 || (pelmHwChild->nameEquals("Uart")) // used before 1.3 1572 ) 1436 1573 readSerialPorts(*pelmHwChild, hw.llSerialPorts); 1437 else if (pelmHwChild->nameEquals("LPT")) 1574 else if ( (pelmHwChild->nameEquals("LPT")) 1575 || (pelmHwChild->nameEquals("Lpt")) // used before 1.3 1576 ) 1438 1577 readParallelPorts(*pelmHwChild, hw.llParallelPorts); 1439 1578 else if (pelmHwChild->nameEquals("AudioAdapter")) … … 1453 1592 if (pelmHwChild->getAttributeValue("driver", strTemp)) 1454 1593 { 1455 if (strTemp == "Null") 1594 // settings before 1.3 used lower case so make sure this is case-insensitive 1595 strTemp.toUpper(); 1596 if (strTemp == "NULL") 1456 1597 hw.audioAdapter.driverType = AudioDriverType_Null; 1457 else if (strTemp == "W inMM")1598 else if (strTemp == "WINMM") 1458 1599 hw.audioAdapter.driverType = AudioDriverType_WinMM; 1459 else if ( strTemp == "DirectSound")1600 else if ( (strTemp == "DIRECTSOUND") || (strTemp == "DSOUND") ) 1460 1601 hw.audioAdapter.driverType = AudioDriverType_DirectSound; 1461 else if (strTemp == "S olAudio")1602 else if (strTemp == "SOLAUDIO") 1462 1603 hw.audioAdapter.driverType = AudioDriverType_SolAudio; 1463 1604 else if (strTemp == "ALSA") 1464 1605 hw.audioAdapter.driverType = AudioDriverType_ALSA; 1465 else if (strTemp == "P ulse")1606 else if (strTemp == "PULSE") 1466 1607 hw.audioAdapter.driverType = AudioDriverType_Pulse; 1467 1608 else if (strTemp == "OSS") 1468 1609 hw.audioAdapter.driverType = AudioDriverType_OSS; 1469 else if (strTemp == "C oreAudio")1610 else if (strTemp == "COREAUDIO") 1470 1611 hw.audioAdapter.driverType = AudioDriverType_CoreAudio; 1471 1612 else if (strTemp == "MMPM") … … 1507 1648 else if (pelmHwChild->nameEquals("Guest")) 1508 1649 { 1509 pelmHwChild->getAttributeValue("memoryBalloonSize", hw.ulMemoryBalloonSize); 1510 pelmHwChild->getAttributeValue("statisticsUpdateInterval", hw.ulStatisticsUpdateInterval); 1650 if (!pelmHwChild->getAttributeValue("memoryBalloonSize", hw.ulMemoryBalloonSize)) 1651 pelmHwChild->getAttributeValue("MemoryBalloonSize", hw.ulMemoryBalloonSize); // used before 1.3 1652 if (!pelmHwChild->getAttributeValue("statisticsUpdateInterval", hw.ulStatisticsUpdateInterval)) 1653 pelmHwChild->getAttributeValue("StatisticsUpdateInterval", hw.ulStatisticsUpdateInterval); 1511 1654 } 1512 1655 else if (pelmHwChild->nameEquals("GuestProperties")) … … 1878 2021 } 1879 2022 2023 void MachineConfigFile::convertOldOSType_pre1_5(Utf8Str &str) 2024 { 2025 if (str == "unknown") str = "Other"; 2026 else if (str == "dos") str = "DOS"; 2027 else if (str == "win31") str = "Windows31"; 2028 else if (str == "win95") str = "Windows95"; 2029 else if (str == "win98") str = "Windows98"; 2030 else if (str == "winme") str = "WindowsMe"; 2031 else if (str == "winnt4") str = "WindowsNT4"; 2032 else if (str == "win2k") str = "Windows2000"; 2033 else if (str == "winxp") str = "WindowsXP"; 2034 else if (str == "win2k3") str = "Windows2003"; 2035 else if (str == "winvista") str = "WindowsVista"; 2036 else if (str == "win2k8") str = "Windows2008"; 2037 else if (str == "os2warp3") str = "OS2Warp3"; 2038 else if (str == "os2warp4") str = "OS2Warp4"; 2039 else if (str == "os2warp45") str = "OS2Warp45"; 2040 else if (str == "ecs") str = "OS2eCS"; 2041 else if (str == "linux22") str = "Linux22"; 2042 else if (str == "linux24") str = "Linux24"; 2043 else if (str == "linux26") str = "Linux26"; 2044 else if (str == "archlinux") str = "ArchLinux"; 2045 else if (str == "debian") str = "Debian"; 2046 else if (str == "opensuse") str = "OpenSUSE"; 2047 else if (str == "fedoracore") str = "Fedora"; 2048 else if (str == "gentoo") str = "Gentoo"; 2049 else if (str == "mandriva") str = "Mandriva"; 2050 else if (str == "redhat") str = "RedHat"; 2051 else if (str == "ubuntu") str = "Ubuntu"; 2052 else if (str == "xandros") str = "Xandros"; 2053 else if (str == "freebsd") str = "FreeBSD"; 2054 else if (str == "openbsd") str = "OpenBSD"; 2055 else if (str == "netbsd") str = "NetBSD"; 2056 else if (str == "netware") str = "Netware"; 2057 else if (str == "solaris") str = "Solaris"; 2058 else if (str == "opensolaris") str = "OpenSolaris"; 2059 else if (str == "l4") str = "L4"; 2060 } 2061 1880 2062 /** 1881 2063 * Called from the constructor to actually read in the <Machine> element … … 1897 2079 Utf8Str str; 1898 2080 elmMachine.getAttributeValue("Description", strDescription); 2081 1899 2082 elmMachine.getAttributeValue("OSType", strOsType); 2083 if (m->sv < SettingsVersion_v1_5) 2084 convertOldOSType_pre1_5(strOsType); 2085 1900 2086 elmMachine.getAttributeValue("stateFile", strStateFile); 1901 2087 if (elmMachine.getAttributeValue("currentSnapshot", str))
Note:
See TracChangeset
for help on using the changeset viewer.