VirtualBoxImplExtra.cpp revision 5ff3fa0492332325f57e80636321619e2224027e
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/** @file
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VirtualBox COM class implementation extra definitions
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This file pulls in generated entities that may be rather big but rarely
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * changed. Separating them from VirtualBoxImpl.cpp should speed up
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * compilation a bit.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync *
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync * available from http://www.virtualbox.org. This file is free software;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * General Public License (GPL) as published by the Free Software
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * additional information or have any questions.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/settings.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "VirtualBoxImpl.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "VirtualBoxImplExtra.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "VirtualBoxXMLUtil.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* embedded XML Schema documents for validating XML settings files */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "xml_VirtualBox_settings_xsd.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "xml_VirtualBox_settings_common_xsd.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* embedded settings converter template for updating settings files */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "xml_SettingsConverter_xsl.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* embedded VirtualBox element definition that contains a proper 'version'
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * attribute constraint */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic const unsigned char g_ab_xml_VirtualBox_settings_root_xsd[] =
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync"<xsd:schema"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" xmlns=\"http://www.innotek.de/VirtualBox-settings\""
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" xmlns:vb=\"http://www.innotek.de/VirtualBox-settings\""
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" targetNamespace=\"http://www.innotek.de/VirtualBox-settings\""
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" elementFormDefault=\"qualified\""
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync">"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync"<xsd:element name=\"VirtualBox\">"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" <xsd:complexType>"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" <xsd:complexContent>"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" <xsd:extension base=\"TVirtualBox\">"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync" <xsd:attribute name=\"version\" type=\"xsd:token\" fixed=\"" VBOX_XML_VERSION_FULL "\" use=\"required\"/>"
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync" </xsd:extension>"
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync" </xsd:complexContent>"
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync" </xsd:complexType>"
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync"</xsd:element>"
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync"</xsd:schema>";
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncstatic const unsigned g_cb_xml_VirtualBox_settings_root_xsd =
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync sizeof (g_ab_xml_VirtualBox_settings_root_xsd);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync/**
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * Resolves external entities while parting and validating XML settings files.
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync *
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * @param aURI URI of the external entity.
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * @param aID ID of the external entity (may be NULL).
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync *
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * @return Input stream created using @c new or NULL to indicate
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * a wrong URI/ID pair.
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync */
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncxml::Input *
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncSettingsTreeHelper::resolveEntity (const char *aURI, const char *aID)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync{
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (strcmp (aURI, VBOX_XML_SCHEMA_COMMON) == 0)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync return new xml::
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_common_xsd,
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_cb_xml_VirtualBox_settings_common_xsd, aURI);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (strcmp (aURI, VBOX_XML_SCHEMA_ROOT) == 0)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync return new xml::
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_root_xsd,
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_cb_xml_VirtualBox_settings_root_xsd, aURI);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (strcmp (aURI, VBOX_XML_SCHEMA) == 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return new xml::
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_xsd,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync g_cb_xml_VirtualBox_settings_xsd, aURI);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (strcmp (aURI, VBOX_XML_SETTINGS_CONVERTER) == 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return new xml::
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync MemoryBuf ((const char *) g_ab_xml_SettingsConverter_xsl,
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync g_cb_xml_SettingsConverter_xsl, aURI);
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync AssertMsgFailed (("Unexpected entity: '%s' - knows: '%s' and '%s'\n", aURI,
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync VBOX_XML_SCHEMA_COMMON, VBOX_XML_SCHEMA));
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return NULL;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync}
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync/**
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * Returns @true if the given tree needs to be converted using the XSLT
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * template identified by #templateUri(), or @false if no conversion is
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * required.
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync *
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * The implementation normally checks for the "version" value of the
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * root key to determine if the conversion is necessary. When the
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * @a aOldVersion argument is not NULL, the implementation must return a
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * non-NULL non-empty string representing the old version (before
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * conversion) in it this string is used by XmlTreeBackend::oldVersion()
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * and must be non-NULL to indicate that the conversion has been
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * performed on the tree. The returned string must be allocated using
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * RTStrDup() or such.
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync *
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * This method is called again after the successful transformation to
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * let the implementation retry the version check and request another
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * transformation if necessary. This may be used to perform multi-step
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * conversion like this: 1.1 => 1.2, 1.2 => 1.3 (instead of 1.1 => 1.3)
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * which saves from the need to update all previous conversion
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * templates to make each of them convert directly to the recent
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * version.
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync *
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * @note Multi-step transformations are performed in a loop that exits
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * only when this method returns @false. It's up to the
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * implementation to detect cycling (repeated requests to convert
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * from the same version) wrong version order, etc. and throw an
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * EConversionCycle exception to break the loop without returning
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * @false (which means the transformation succeeded).
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync *
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * @param aRoot Root settings key.
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * @param aOldVersionString Where to store old version string
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * pointer. May be NULL. Allocated memory is
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync * freed by the caller using RTStrFree().
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync */
a804628e06a5bd14e9af77943922ffd9649c221cvboxsyncbool SettingsTreeHelper::
a804628e06a5bd14e9af77943922ffd9649c221cvboxsyncneedsConversion (const settings::Key &aRoot, char **aOldVersion) const
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync{
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync if (strcmp (aRoot.name(), "VirtualBox") == 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *version = aRoot.stringValue ("version");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *dash = strchr (version, '-');
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dash != NULL && strcmp (dash + 1, VBOX_XML_PLATFORM) == 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (strcmp (version, VBOX_XML_VERSION_FULL) != 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* version mismatch */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (aOldVersion != NULL)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *aOldVersion = RTStrDup (version);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return true;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* either the tree is invalid, or it's the other platform, or it's the same
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * version */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return false;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Returns the URI of the XSLT template to perform the conversion.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This template will be applied to the tree if #needsConversion()
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync * returns @c true for this tree.
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncconst char* SettingsTreeHelper::templateUri() const
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VBOX_XML_SETTINGS_CONVERTER;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#if defined VBOX_MAIN_SETTINGS_ADDONS
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync// Settings API additions
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync////////////////////////////////////////////////////////////////////////////////
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncnamespace settings
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctemplate<> stdx::char_auto_ptr
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncToString <com::Bstr> (const com::Bstr &aValue, unsigned int aExtra)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync stdx::char_auto_ptr result;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (aValue.raw() == NULL)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw ENoValue();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* The only way to cause RTUtf16ToUtf8Ex return a number of bytes needed
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * w/o allocating the result buffer itself is to provide that both cch
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * and *ppsz are not NULL. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char dummy [1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char *dummy2 = dummy;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size_t strLen = 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int vrc = RTUtf16ToUtf8Ex (aValue.raw(), RTSTR_MAX,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync &dummy2, strLen, &strLen);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (RT_SUCCESS (vrc))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* the string only contains '\0' :) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result.reset (new char [1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result.get() [0] = '\0';
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return result;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (vrc == VERR_BUFFER_OVERFLOW)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result.reset (new char [strLen + 1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char *buf = result.get();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync vrc = RTUtf16ToUtf8Ex (aValue.raw(), RTSTR_MAX, &buf, strLen + 1, NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (RT_FAILURE (vrc))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw xml::LogicError (RT_SRC_POS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return result;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctemplate<> com::Guid FromString <com::Guid> (const char *aValue)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (aValue == NULL)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw ENoValue();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* For settings, the format is always {XXX...XXX} */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char buf [RTUUID_STR_LENGTH];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (aValue == NULL || *aValue != '{' ||
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync strlen (aValue) != RTUUID_STR_LENGTH + 1 ||
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync aValue [RTUUID_STR_LENGTH] != '}')
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw ENoConversion(com::Utf8StrFmt("'%s' is not Guid", aValue));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* strip { and } */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync memcpy (buf, aValue + 1, RTUUID_STR_LENGTH - 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync buf [RTUUID_STR_LENGTH - 1] = '\0';
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* we don't use Guid (const char *) because we want to throw
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * ENoConversion on format error */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTUUID uuid;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int vrc = RTUuidFromStr (&uuid, buf);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (RT_FAILURE (vrc))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw ENoConversion(com::Utf8StrFmt("'%s' is not Guid (%Rrc)", aValue, vrc));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return com::Guid (uuid);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync}
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctemplate<> stdx::char_auto_ptr
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncToString <com::Guid> (const com::Guid &aValue, unsigned int aExtra)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* For settings, the format is always {XXX...XXX} */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync stdx::char_auto_ptr result (new char [RTUUID_STR_LENGTH + 2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int vrc = RTUuidToStr (aValue.raw(), result.get() + 1, RTUUID_STR_LENGTH);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (RT_FAILURE (vrc))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw xml::LogicError (RT_SRC_POS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result.get() [0] = '{';
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result.get() [RTUUID_STR_LENGTH] = '}';
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync result.get() [RTUUID_STR_LENGTH + 1] = '\0';
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return result;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif // VBOX_MAIN_SETTINGS_ADDONS
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} /* namespace settings */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync