xref: /aoo41x/main/configmgr/source/xcdparser.cxx (revision 3a7cf181)
1*3a7cf181SAndrew Rist /**************************************************************
2*3a7cf181SAndrew Rist  *
3*3a7cf181SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*3a7cf181SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*3a7cf181SAndrew Rist  * distributed with this work for additional information
6*3a7cf181SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*3a7cf181SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*3a7cf181SAndrew Rist  * "License"); you may not use this file except in compliance
9*3a7cf181SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*3a7cf181SAndrew Rist  *
11*3a7cf181SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*3a7cf181SAndrew Rist  *
13*3a7cf181SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*3a7cf181SAndrew Rist  * software distributed under the License is distributed on an
15*3a7cf181SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3a7cf181SAndrew Rist  * KIND, either express or implied.  See the License for the
17*3a7cf181SAndrew Rist  * specific language governing permissions and limitations
18*3a7cf181SAndrew Rist  * under the License.
19*3a7cf181SAndrew Rist  *
20*3a7cf181SAndrew Rist  *************************************************************/
21*3a7cf181SAndrew Rist 
22*3a7cf181SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "precompiled_configmgr.hxx"
25cdf0e10cSrcweir #include "sal/config.h"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <climits>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "com/sun/star/uno/Reference.hxx"
30cdf0e10cSrcweir #include "com/sun/star/uno/RuntimeException.hpp"
31cdf0e10cSrcweir #include "com/sun/star/uno/XInterface.hpp"
32cdf0e10cSrcweir #include "osl/diagnose.hxx"
33cdf0e10cSrcweir #include "rtl/string.h"
34cdf0e10cSrcweir #include "rtl/ustring.h"
35cdf0e10cSrcweir #include "rtl/ustring.hxx"
36cdf0e10cSrcweir #include "xmlreader/span.hxx"
37cdf0e10cSrcweir #include "xmlreader/xmlreader.hxx"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include "parsemanager.hxx"
40cdf0e10cSrcweir #include "xcdparser.hxx"
41cdf0e10cSrcweir #include "xcsparser.hxx"
42cdf0e10cSrcweir #include "xcuparser.hxx"
43cdf0e10cSrcweir #include "xmldata.hxx"
44cdf0e10cSrcweir 
45cdf0e10cSrcweir namespace configmgr {
46cdf0e10cSrcweir 
47cdf0e10cSrcweir namespace {
48cdf0e10cSrcweir 
49cdf0e10cSrcweir namespace css = com::sun::star;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir }
52cdf0e10cSrcweir 
XcdParser(int layer,Dependencies const & dependencies,Data & data)53cdf0e10cSrcweir XcdParser::XcdParser(int layer, Dependencies const & dependencies, Data & data):
54cdf0e10cSrcweir     layer_(layer), dependencies_(dependencies), data_(data), state_(STATE_START)
55cdf0e10cSrcweir {}
56cdf0e10cSrcweir 
~XcdParser()57cdf0e10cSrcweir XcdParser::~XcdParser() {}
58cdf0e10cSrcweir 
getTextMode()59cdf0e10cSrcweir xmlreader::XmlReader::Text XcdParser::getTextMode() {
60cdf0e10cSrcweir     return nestedParser_.is()
61cdf0e10cSrcweir         ? nestedParser_->getTextMode() : xmlreader::XmlReader::TEXT_NONE;
62cdf0e10cSrcweir }
63cdf0e10cSrcweir 
startElement(xmlreader::XmlReader & reader,int nsId,xmlreader::Span const & name)64cdf0e10cSrcweir bool XcdParser::startElement(
65cdf0e10cSrcweir     xmlreader::XmlReader & reader, int nsId, xmlreader::Span const & name)
66cdf0e10cSrcweir {
67cdf0e10cSrcweir     if (nestedParser_.is()) {
68cdf0e10cSrcweir         OSL_ASSERT(nesting_ != LONG_MAX);
69cdf0e10cSrcweir         ++nesting_;
70cdf0e10cSrcweir         return nestedParser_->startElement(reader, nsId, name);
71cdf0e10cSrcweir     }
72cdf0e10cSrcweir     switch (state_) {
73cdf0e10cSrcweir     case STATE_START:
74cdf0e10cSrcweir         if (nsId == ParseManager::NAMESPACE_OOR &&
75cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("data")))
76cdf0e10cSrcweir         {
77cdf0e10cSrcweir             state_ = STATE_DEPENDENCIES;
78cdf0e10cSrcweir             return true;
79cdf0e10cSrcweir         }
80cdf0e10cSrcweir         break;
81cdf0e10cSrcweir     case STATE_DEPENDENCIES:
82cdf0e10cSrcweir         if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
83cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("dependency")))
84cdf0e10cSrcweir         {
85cdf0e10cSrcweir             if (dependency_.getLength() == 0) {
86cdf0e10cSrcweir                 xmlreader::Span attrFile;
87cdf0e10cSrcweir                 for (;;) {
88cdf0e10cSrcweir                     int attrNsId;
89cdf0e10cSrcweir                     xmlreader::Span attrLn;
90cdf0e10cSrcweir                     if (!reader.nextAttribute(&attrNsId, &attrLn)) {
91cdf0e10cSrcweir                         break;
92cdf0e10cSrcweir                     }
93cdf0e10cSrcweir                     if (attrNsId == xmlreader::XmlReader::NAMESPACE_NONE &&
94cdf0e10cSrcweir                             //TODO: _OOR
95cdf0e10cSrcweir                         attrLn.equals(RTL_CONSTASCII_STRINGPARAM("file")))
96cdf0e10cSrcweir                     {
97cdf0e10cSrcweir                         attrFile = reader.getAttributeValue(false);
98cdf0e10cSrcweir                     }
99cdf0e10cSrcweir                 }
100cdf0e10cSrcweir                 if (!attrFile.is()) {
101cdf0e10cSrcweir                     throw css::uno::RuntimeException(
102cdf0e10cSrcweir                         (rtl::OUString(
103cdf0e10cSrcweir                             RTL_CONSTASCII_USTRINGPARAM(
104cdf0e10cSrcweir                                 "no dependency file attribute in ")) +
105cdf0e10cSrcweir                          reader.getUrl()),
106cdf0e10cSrcweir                         css::uno::Reference< css::uno::XInterface >());
107cdf0e10cSrcweir                 }
108cdf0e10cSrcweir                 dependency_ = attrFile.convertFromUtf8();
109cdf0e10cSrcweir                 if (dependency_.getLength() == 0) {
110cdf0e10cSrcweir                     throw css::uno::RuntimeException(
111cdf0e10cSrcweir                         (rtl::OUString(
112cdf0e10cSrcweir                             RTL_CONSTASCII_USTRINGPARAM(
113cdf0e10cSrcweir                                 "bad dependency file attribute in ")) +
114cdf0e10cSrcweir                          reader.getUrl()),
115cdf0e10cSrcweir                         css::uno::Reference< css::uno::XInterface >());
116cdf0e10cSrcweir                 }
117cdf0e10cSrcweir             }
118cdf0e10cSrcweir             if (dependencies_.find(dependency_) == dependencies_.end()) {
119cdf0e10cSrcweir                 return false;
120cdf0e10cSrcweir             }
121cdf0e10cSrcweir             state_ = STATE_DEPENDENCY;
122cdf0e10cSrcweir             dependency_ = rtl::OUString();
123cdf0e10cSrcweir             return true;
124cdf0e10cSrcweir         }
125cdf0e10cSrcweir         state_ = STATE_COMPONENTS;
126cdf0e10cSrcweir         // fall through
127cdf0e10cSrcweir     case STATE_COMPONENTS:
128cdf0e10cSrcweir         if (nsId == ParseManager::NAMESPACE_OOR &&
129cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("component-schema")))
130cdf0e10cSrcweir         {
131cdf0e10cSrcweir             nestedParser_ = new XcsParser(layer_, data_);
132cdf0e10cSrcweir             nesting_ = 1;
133cdf0e10cSrcweir             return nestedParser_->startElement(reader, nsId, name);
134cdf0e10cSrcweir         }
135cdf0e10cSrcweir         if (nsId == ParseManager::NAMESPACE_OOR &&
136cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("component-data")))
137cdf0e10cSrcweir         {
138cdf0e10cSrcweir             nestedParser_ = new XcuParser(layer_ + 1, data_, 0, 0, 0);
139cdf0e10cSrcweir             nesting_ = 1;
140cdf0e10cSrcweir             return nestedParser_->startElement(reader, nsId, name);
141cdf0e10cSrcweir         }
142cdf0e10cSrcweir         break;
143cdf0e10cSrcweir     default: // STATE_DEPENDENCY
144cdf0e10cSrcweir         OSL_ASSERT(false); // this cannot happen
145cdf0e10cSrcweir         break;
146cdf0e10cSrcweir     }
147cdf0e10cSrcweir     throw css::uno::RuntimeException(
148cdf0e10cSrcweir         (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bad member <")) +
149cdf0e10cSrcweir          name.convertFromUtf8() +
150cdf0e10cSrcweir          rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("> in ")) + reader.getUrl()),
151cdf0e10cSrcweir         css::uno::Reference< css::uno::XInterface >());
152cdf0e10cSrcweir }
153cdf0e10cSrcweir 
endElement(xmlreader::XmlReader const & reader)154cdf0e10cSrcweir void XcdParser::endElement(xmlreader::XmlReader const & reader) {
155cdf0e10cSrcweir     if (nestedParser_.is()) {
156cdf0e10cSrcweir         nestedParser_->endElement(reader);
157cdf0e10cSrcweir         if (--nesting_ == 0) {
158cdf0e10cSrcweir             nestedParser_.clear();
159cdf0e10cSrcweir         }
160cdf0e10cSrcweir     } else {
161cdf0e10cSrcweir         switch (state_) {
162cdf0e10cSrcweir         case STATE_DEPENDENCY:
163cdf0e10cSrcweir             state_ = STATE_DEPENDENCIES;
164cdf0e10cSrcweir             break;
165cdf0e10cSrcweir         case STATE_DEPENDENCIES:
166cdf0e10cSrcweir         case STATE_COMPONENTS:
167cdf0e10cSrcweir             break;
168cdf0e10cSrcweir         default:
169cdf0e10cSrcweir             OSL_ASSERT(false); // this cannot happen
170cdf0e10cSrcweir             break;
171cdf0e10cSrcweir         }
172cdf0e10cSrcweir     }
173cdf0e10cSrcweir }
174cdf0e10cSrcweir 
characters(xmlreader::Span const & text)175cdf0e10cSrcweir void XcdParser::characters(xmlreader::Span const & text) {
176cdf0e10cSrcweir     if (nestedParser_.is()) {
177cdf0e10cSrcweir         nestedParser_->characters(text);
178cdf0e10cSrcweir     }
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir }
182