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