VirtualBoxImplExtra.cpp revision 5ff3fa0492332325f57e80636321619e2224027e
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VirtualBox COM class implementation extra definitions
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.
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * 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/* embedded XML Schema documents for validating XML settings files */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* embedded settings converter template for updating settings files */
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=\"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"<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>";
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncstatic const unsigned g_cb_xml_VirtualBox_settings_root_xsd =
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * Resolves external entities while parting and validating XML settings files.
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * @param aURI URI of the external entity.
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * @param aID ID of the external entity (may be NULL).
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * @return Input stream created using @c new or NULL to indicate
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync * a wrong URI/ID pair.
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncSettingsTreeHelper::resolveEntity (const char *aURI, const char *aID)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync return new xml::
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_common_xsd,
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync return new xml::
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_root_xsd,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return new xml::
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_xsd,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (strcmp (aURI, VBOX_XML_SETTINGS_CONVERTER) == 0)
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return new xml::
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync MemoryBuf ((const char *) g_ab_xml_SettingsConverter_xsl,
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync AssertMsgFailed (("Unexpected entity: '%s' - knows: '%s' and '%s'\n", aURI,
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 * 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 * 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 * @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 * @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().
a804628e06a5bd14e9af77943922ffd9649c221cvboxsyncneedsConversion (const settings::Key &aRoot, char **aOldVersion) const
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *version = aRoot.stringValue ("version");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dash != NULL && strcmp (dash + 1, VBOX_XML_PLATFORM) == 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* version mismatch */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return true;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* either the tree is invalid, or it's the other platform, or it's the same
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * version */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return false;
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.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync// Settings API additions
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync////////////////////////////////////////////////////////////////////////////////
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncToString <com::Bstr> (const com::Bstr &aValue, unsigned int aExtra)
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 int vrc = RTUtf16ToUtf8Ex (aValue.raw(), RTSTR_MAX,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* the string only contains '\0' :) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync vrc = RTUtf16ToUtf8Ex (aValue.raw(), RTSTR_MAX, &buf, strLen + 1, NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctemplate<> com::Guid FromString <com::Guid> (const char *aValue)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* For settings, the format is always {XXX...XXX} */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw ENoConversion(com::Utf8StrFmt("'%s' is not Guid", aValue));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* strip { and } */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* we don't use Guid (const char *) because we want to throw
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * ENoConversion on format error */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync throw ENoConversion(com::Utf8StrFmt("'%s' is not Guid (%Rrc)", aValue, vrc));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncToString <com::Guid> (const com::Guid &aValue, unsigned int aExtra)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* For settings, the format is always {XXX...XXX} */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync stdx::char_auto_ptr result (new char [RTUUID_STR_LENGTH + 2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int vrc = RTUuidToStr (aValue.raw(), result.get() + 1, RTUUID_STR_LENGTH);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif // VBOX_MAIN_SETTINGS_ADDONS
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} /* namespace settings */