VirtualBox

source: vbox/trunk/src/VBox/Main/VirtualBoxImplExtra.cpp@ 14772

Last change on this file since 14772 was 14772, checked in by vboxsync, 16 years ago

Added vim modelines to aid following coding guidelines, like no tabs,
similar to what is already in the xidl file.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Revision Author Id
File size: 6.4 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation extra definitions
4 *
5 * This file pulls in generated entities that may be rather big but rarely
6 * changed. Separating them from VirtualBoxImpl.cpp should speed up
7 * compilation a bit.
8 */
9
10/*
11 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
12 *
13 * This file is part of VirtualBox Open Source Edition (OSE), as
14 * available from http://www.virtualbox.org. This file is free software;
15 * you can redistribute it and/or modify it under the terms of the GNU
16 * General Public License (GPL) as published by the Free Software
17 * Foundation, in version 2 as it comes in the "COPYING" file of the
18 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
19 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
22 * Clara, CA 95054 USA or visit http://www.sun.com if you need
23 * additional information or have any questions.
24 */
25
26#include "VirtualBoxImpl.h"
27
28#include "VirtualBoxXMLUtil.h"
29
30/* embedded XML Schema documents for validating XML settings files */
31#include "xml_VirtualBox_settings_xsd.h"
32#include "xml_VirtualBox_settings_common_xsd.h"
33
34/* embedded settings converter template for updating settings files */
35#include "xml_SettingsConverter_xsl.h"
36
37/* embedded VirtualBox element definition that contains a proper 'version'
38 * attribute constraint */
39static const unsigned char g_ab_xml_VirtualBox_settings_root_xsd[] =
40"<xsd:schema"
41" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
42" xmlns=\"http://www.innotek.de/VirtualBox-settings\""
43" xmlns:vb=\"http://www.innotek.de/VirtualBox-settings\""
44" targetNamespace=\"http://www.innotek.de/VirtualBox-settings\""
45" elementFormDefault=\"qualified\""
46">"
47"<xsd:element name=\"VirtualBox\">"
48" <xsd:complexType>"
49" <xsd:complexContent>"
50" <xsd:extension base=\"TVirtualBox\">"
51" <xsd:attribute name=\"version\" type=\"xsd:token\" fixed=\"" VBOX_XML_VERSION_FULL "\" use=\"required\"/>"
52" </xsd:extension>"
53" </xsd:complexContent>"
54" </xsd:complexType>"
55"</xsd:element>"
56"</xsd:schema>";
57
58static const unsigned g_cb_xml_VirtualBox_settings_root_xsd =
59 sizeof (g_ab_xml_VirtualBox_settings_root_xsd);
60
61/**
62 * Resolves external entities while parting and validating XML settings files.
63 *
64 * @param aURI URI of the external entity.
65 * @param aID ID of the external entity (may be NULL).
66 *
67 * @return Input stream created using @c new or NULL to indicate
68 * a wrong URI/ID pair.
69 */
70settings::Input *
71VirtualBox::SettingsTreeHelper::resolveEntity (const char *aURI, const char *aID)
72{
73 if (strcmp (aURI, VBOX_XML_SCHEMA_COMMON) == 0)
74 {
75 return new settings::
76 MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_common_xsd,
77 g_cb_xml_VirtualBox_settings_common_xsd, aURI);
78 }
79
80 if (strcmp (aURI, VBOX_XML_SCHEMA_ROOT) == 0)
81 {
82 return new settings::
83 MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_root_xsd,
84 g_cb_xml_VirtualBox_settings_root_xsd, aURI);
85 }
86
87 if (strcmp (aURI, VBOX_XML_SCHEMA) == 0)
88 {
89 return new settings::
90 MemoryBuf ((const char *) g_ab_xml_VirtualBox_settings_xsd,
91 g_cb_xml_VirtualBox_settings_xsd, aURI);
92 }
93
94 if (strcmp (aURI, VBOX_XML_SETTINGS_CONVERTER) == 0)
95 {
96 return new settings::
97 MemoryBuf ((const char *) g_ab_xml_SettingsConverter_xsl,
98 g_cb_xml_SettingsConverter_xsl, aURI);
99 }
100
101 AssertMsgFailed (("Unexpected entity: '%s' - knows: '%s' and '%s'\n", aURI,
102 VBOX_XML_SCHEMA_COMMON, VBOX_XML_SCHEMA));
103 return NULL;
104}
105
106/**
107 * Returns @true if the given tree needs to be converted using the XSLT
108 * template identified by #templateUri(), or @false if no conversion is
109 * required.
110 *
111 * The implementation normally checks for the "version" value of the
112 * root key to determine if the conversion is necessary. When the
113 * @a aOldVersion argument is not NULL, the implementation must return a
114 * non-NULL non-empty string representing the old version (before
115 * conversion) in it this string is used by XmlTreeBackend::oldVersion()
116 * and must be non-NULL to indicate that the conversion has been
117 * performed on the tree. The returned string must be allocated using
118 * RTStrDup() or such.
119 *
120 * This method is called again after the successful transformation to
121 * let the implementation retry the version check and request another
122 * transformation if necessary. This may be used to perform multi-step
123 * conversion like this: 1.1 => 1.2, 1.2 => 1.3 (instead of 1.1 => 1.3)
124 * which saves from the need to update all previous conversion
125 * templates to make each of them convert directly to the recent
126 * version.
127 *
128 * @note Multi-step transformations are performed in a loop that exits
129 * only when this method returns @false. It's up to the
130 * implementation to detect cycling (repeated requests to convert
131 * from the same version) wrong version order, etc. and throw an
132 * EConversionCycle exception to break the loop without returning
133 * @false (which means the transformation succeeded).
134 *
135 * @param aRoot Root settings key.
136 * @param aOldVersionString Where to store old version string
137 * pointer. May be NULL. Allocated memory is
138 * freed by the caller using RTStrFree().
139 */
140bool VirtualBox::SettingsTreeHelper::
141needsConversion (const settings::Key &aRoot, char **aOldVersion) const
142{
143 if (strcmp (aRoot.name(), "VirtualBox") == 0)
144 {
145 const char *version = aRoot.stringValue ("version");
146 const char *dash = strchr (version, '-');
147 if (dash != NULL && strcmp (dash + 1, VBOX_XML_PLATFORM) == 0)
148 {
149 if (strcmp (version, VBOX_XML_VERSION_FULL) != 0)
150 {
151 /* version mismatch */
152 if (aOldVersion != NULL)
153 *aOldVersion = RTStrDup (version);
154
155 return true;
156 }
157 }
158 }
159
160 /* either the tree is invalid, or it's the other platform, or it's the same
161 * version */
162 return false;
163}
164
165/**
166 * Returns the URI of the XSLT template to perform the conversion.
167 * This template will be applied to the tree if #needsConversion()
168 * returns @c true for this tree.
169 */
170const char *VirtualBox::SettingsTreeHelper::templateUri() const
171{
172 return VBOX_XML_SETTINGS_CONVERTER;
173}
174/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette