+ std::stringstream s;
+
+ s <<
+ "<SCSITarget id=\"" <<
+ static_cast<int>(config.scsiId & CONFIG_TARGET_ID_BITS) << "\">\n" <<
+
+ " <enabled>" <<
+ (config.scsiId & CONFIG_TARGET_ENABLED ? "true" : "false") <<
+ "</enabled>\n" <<
+
+ " <unitAttention>" <<
+ (config.flags & CONFIG_ENABLE_UNIT_ATTENTION ? "true" : "false") <<
+ "</unitAttention>\n" <<
+
+ " <parity>" <<
+ (config.flags & CONFIG_ENABLE_PARITY ? "true" : "false") <<
+ "</parity>\n" <<
+
+ "\n" <<
+ " <!-- ********************************************************\n" <<
+ " Space separated list. Available options:\n" <<
+ " apple\t\tReturns Apple-specific mode pages\n" <<
+ " ********************************************************* -->\n" <<
+ " <quirks>" <<
+ (config.quirks & CONFIG_QUIRKS_APPLE ? "apple" : "") <<
+ "</quirks>\n" <<
+
+ "\n\n" <<
+ " <!-- ********************************************************\n" <<
+ " 0x0 Fixed hard drive.\n" <<
+ " 0x1 Removable drive.\n" <<
+ " 0x2 Optical drive (ie. CD drive).\n" <<
+ " 0x3 1.44MB Floppy Drive.\n" <<
+ " ********************************************************* -->\n" <<
+ " <deviceType>0x" <<
+ std::hex << static_cast<int>(config.deviceType) <<
+ "</deviceType>\n" <<
+
+ "\n\n" <<
+ " <!-- ********************************************************\n" <<
+ " Device type modifier is usually 0x00. Only change this if your\n" <<
+ " OS requires some special value.\n" <<
+ "\n" <<
+ " 0x4C Data General Micropolis disk\n" <<
+ " ********************************************************* -->\n" <<
+ " <deviceTypeModifier>0x" <<
+ std::hex << static_cast<int>(config.deviceTypeModifier) <<
+ "</deviceTypeModifier>\n" <<
+
+ "\n\n" <<
+ " <!-- ********************************************************\n" <<
+ " SD card offset, as a sector number (always 512 bytes).\n" <<
+ " ********************************************************* -->\n" <<
+ " <sdSectorStart>" << std::dec << config.sdSectorStart << "</sdSectorStart>\n" <<
+ "\n\n" <<
+ " <!-- ********************************************************\n" <<
+ " Drive geometry settings.\n" <<
+ " ********************************************************* -->\n" <<
+ "\n"
+ " <scsiSectors>" << std::dec << config.scsiSectors << "</scsiSectors>\n" <<
+ " <bytesPerSector>" << std::dec << config.bytesPerSector << "</bytesPerSector>\n" <<
+ " <sectorsPerTrack>" << std::dec << config.sectorsPerTrack<< "</sectorsPerTrack>\n" <<
+ " <headsPerCylinder>" << std::dec << config.headsPerCylinder << "</headsPerCylinder>\n" <<
+ "\n\n" <<
+ " <!-- ********************************************************\n" <<
+ " Drive identification information. The SCSI2SD doesn't\n" <<
+ " care what these are set to. Use these strings to trick a OS\n" <<
+ " thinking a specific hard drive model is attached.\n" <<
+ " ********************************************************* -->\n" <<
+ "\n"
+ " <!-- 8 character vendor string -->\n" <<
+ " <!-- For Apple HD SC Setup/Drive Setup, use ' SEAGATE' -->\n" <<
+ " <vendor>" << std::string(config.vendor, 8) << "</vendor>\n" <<
+ "\n" <<
+ " <!-- 16 character produce identifier -->\n" <<
+ " <!-- For Apple HD SC Setup/Drive Setup, use ' ST225N' -->\n" <<
+ " <prodId>" << std::string(config.prodId, 16) << "</prodId>\n" <<
+ "\n" <<
+ " <!-- 4 character product revision number -->\n" <<
+ " <!-- For Apple HD SC Setup/Drive Setup, use '1.0 ' -->\n" <<
+ " <revision>" << std::string(config.revision, 4) << "</revision>\n" <<
+ "\n" <<
+ " <!-- 16 character serial number -->\n" <<
+ " <serial>" << std::string(config.serial, 16) << "</serial>\n" <<
+ "</SCSITarget>\n";
+
+ return s.str();
+}
+
+static uint64_t parseInt(wxXmlNode* node, uint64_t limit)
+{
+ std::string str(node->GetNodeContent().mb_str());
+ if (str.empty())
+ {
+ throw std::runtime_error("Empty " + node->GetName());
+ }