xref: /aoo41x/main/configmgr/source/xcdparser.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir *
3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir *
5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir *
7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir *
9*cdf0e10cSrcweir * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir *
11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir *
15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir *
21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir *
26*cdf0e10cSrcweir ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include "precompiled_configmgr.hxx"
29*cdf0e10cSrcweir #include "sal/config.h"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <climits>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include "com/sun/star/uno/Reference.hxx"
34*cdf0e10cSrcweir #include "com/sun/star/uno/RuntimeException.hpp"
35*cdf0e10cSrcweir #include "com/sun/star/uno/XInterface.hpp"
36*cdf0e10cSrcweir #include "osl/diagnose.hxx"
37*cdf0e10cSrcweir #include "rtl/string.h"
38*cdf0e10cSrcweir #include "rtl/ustring.h"
39*cdf0e10cSrcweir #include "rtl/ustring.hxx"
40*cdf0e10cSrcweir #include "xmlreader/span.hxx"
41*cdf0e10cSrcweir #include "xmlreader/xmlreader.hxx"
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir #include "parsemanager.hxx"
44*cdf0e10cSrcweir #include "xcdparser.hxx"
45*cdf0e10cSrcweir #include "xcsparser.hxx"
46*cdf0e10cSrcweir #include "xcuparser.hxx"
47*cdf0e10cSrcweir #include "xmldata.hxx"
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir namespace configmgr {
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir namespace {
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir namespace css = com::sun::star;
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir }
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir XcdParser::XcdParser(int layer, Dependencies const & dependencies, Data & data):
58*cdf0e10cSrcweir     layer_(layer), dependencies_(dependencies), data_(data), state_(STATE_START)
59*cdf0e10cSrcweir {}
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir XcdParser::~XcdParser() {}
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir xmlreader::XmlReader::Text XcdParser::getTextMode() {
64*cdf0e10cSrcweir     return nestedParser_.is()
65*cdf0e10cSrcweir         ? nestedParser_->getTextMode() : xmlreader::XmlReader::TEXT_NONE;
66*cdf0e10cSrcweir }
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir bool XcdParser::startElement(
69*cdf0e10cSrcweir     xmlreader::XmlReader & reader, int nsId, xmlreader::Span const & name)
70*cdf0e10cSrcweir {
71*cdf0e10cSrcweir     if (nestedParser_.is()) {
72*cdf0e10cSrcweir         OSL_ASSERT(nesting_ != LONG_MAX);
73*cdf0e10cSrcweir         ++nesting_;
74*cdf0e10cSrcweir         return nestedParser_->startElement(reader, nsId, name);
75*cdf0e10cSrcweir     }
76*cdf0e10cSrcweir     switch (state_) {
77*cdf0e10cSrcweir     case STATE_START:
78*cdf0e10cSrcweir         if (nsId == ParseManager::NAMESPACE_OOR &&
79*cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("data")))
80*cdf0e10cSrcweir         {
81*cdf0e10cSrcweir             state_ = STATE_DEPENDENCIES;
82*cdf0e10cSrcweir             return true;
83*cdf0e10cSrcweir         }
84*cdf0e10cSrcweir         break;
85*cdf0e10cSrcweir     case STATE_DEPENDENCIES:
86*cdf0e10cSrcweir         if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
87*cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("dependency")))
88*cdf0e10cSrcweir         {
89*cdf0e10cSrcweir             if (dependency_.getLength() == 0) {
90*cdf0e10cSrcweir                 xmlreader::Span attrFile;
91*cdf0e10cSrcweir                 for (;;) {
92*cdf0e10cSrcweir                     int attrNsId;
93*cdf0e10cSrcweir                     xmlreader::Span attrLn;
94*cdf0e10cSrcweir                     if (!reader.nextAttribute(&attrNsId, &attrLn)) {
95*cdf0e10cSrcweir                         break;
96*cdf0e10cSrcweir                     }
97*cdf0e10cSrcweir                     if (attrNsId == xmlreader::XmlReader::NAMESPACE_NONE &&
98*cdf0e10cSrcweir                             //TODO: _OOR
99*cdf0e10cSrcweir                         attrLn.equals(RTL_CONSTASCII_STRINGPARAM("file")))
100*cdf0e10cSrcweir                     {
101*cdf0e10cSrcweir                         attrFile = reader.getAttributeValue(false);
102*cdf0e10cSrcweir                     }
103*cdf0e10cSrcweir                 }
104*cdf0e10cSrcweir                 if (!attrFile.is()) {
105*cdf0e10cSrcweir                     throw css::uno::RuntimeException(
106*cdf0e10cSrcweir                         (rtl::OUString(
107*cdf0e10cSrcweir                             RTL_CONSTASCII_USTRINGPARAM(
108*cdf0e10cSrcweir                                 "no dependency file attribute in ")) +
109*cdf0e10cSrcweir                          reader.getUrl()),
110*cdf0e10cSrcweir                         css::uno::Reference< css::uno::XInterface >());
111*cdf0e10cSrcweir                 }
112*cdf0e10cSrcweir                 dependency_ = attrFile.convertFromUtf8();
113*cdf0e10cSrcweir                 if (dependency_.getLength() == 0) {
114*cdf0e10cSrcweir                     throw css::uno::RuntimeException(
115*cdf0e10cSrcweir                         (rtl::OUString(
116*cdf0e10cSrcweir                             RTL_CONSTASCII_USTRINGPARAM(
117*cdf0e10cSrcweir                                 "bad dependency file attribute in ")) +
118*cdf0e10cSrcweir                          reader.getUrl()),
119*cdf0e10cSrcweir                         css::uno::Reference< css::uno::XInterface >());
120*cdf0e10cSrcweir                 }
121*cdf0e10cSrcweir             }
122*cdf0e10cSrcweir             if (dependencies_.find(dependency_) == dependencies_.end()) {
123*cdf0e10cSrcweir                 return false;
124*cdf0e10cSrcweir             }
125*cdf0e10cSrcweir             state_ = STATE_DEPENDENCY;
126*cdf0e10cSrcweir             dependency_ = rtl::OUString();
127*cdf0e10cSrcweir             return true;
128*cdf0e10cSrcweir         }
129*cdf0e10cSrcweir         state_ = STATE_COMPONENTS;
130*cdf0e10cSrcweir         // fall through
131*cdf0e10cSrcweir     case STATE_COMPONENTS:
132*cdf0e10cSrcweir         if (nsId == ParseManager::NAMESPACE_OOR &&
133*cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("component-schema")))
134*cdf0e10cSrcweir         {
135*cdf0e10cSrcweir             nestedParser_ = new XcsParser(layer_, data_);
136*cdf0e10cSrcweir             nesting_ = 1;
137*cdf0e10cSrcweir             return nestedParser_->startElement(reader, nsId, name);
138*cdf0e10cSrcweir         }
139*cdf0e10cSrcweir         if (nsId == ParseManager::NAMESPACE_OOR &&
140*cdf0e10cSrcweir             name.equals(RTL_CONSTASCII_STRINGPARAM("component-data")))
141*cdf0e10cSrcweir         {
142*cdf0e10cSrcweir             nestedParser_ = new XcuParser(layer_ + 1, data_, 0, 0, 0);
143*cdf0e10cSrcweir             nesting_ = 1;
144*cdf0e10cSrcweir             return nestedParser_->startElement(reader, nsId, name);
145*cdf0e10cSrcweir         }
146*cdf0e10cSrcweir         break;
147*cdf0e10cSrcweir     default: // STATE_DEPENDENCY
148*cdf0e10cSrcweir         OSL_ASSERT(false); // this cannot happen
149*cdf0e10cSrcweir         break;
150*cdf0e10cSrcweir     }
151*cdf0e10cSrcweir     throw css::uno::RuntimeException(
152*cdf0e10cSrcweir         (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bad member <")) +
153*cdf0e10cSrcweir          name.convertFromUtf8() +
154*cdf0e10cSrcweir          rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("> in ")) + reader.getUrl()),
155*cdf0e10cSrcweir         css::uno::Reference< css::uno::XInterface >());
156*cdf0e10cSrcweir }
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir void XcdParser::endElement(xmlreader::XmlReader const & reader) {
159*cdf0e10cSrcweir     if (nestedParser_.is()) {
160*cdf0e10cSrcweir         nestedParser_->endElement(reader);
161*cdf0e10cSrcweir         if (--nesting_ == 0) {
162*cdf0e10cSrcweir             nestedParser_.clear();
163*cdf0e10cSrcweir         }
164*cdf0e10cSrcweir     } else {
165*cdf0e10cSrcweir         switch (state_) {
166*cdf0e10cSrcweir         case STATE_DEPENDENCY:
167*cdf0e10cSrcweir             state_ = STATE_DEPENDENCIES;
168*cdf0e10cSrcweir             break;
169*cdf0e10cSrcweir         case STATE_DEPENDENCIES:
170*cdf0e10cSrcweir         case STATE_COMPONENTS:
171*cdf0e10cSrcweir             break;
172*cdf0e10cSrcweir         default:
173*cdf0e10cSrcweir             OSL_ASSERT(false); // this cannot happen
174*cdf0e10cSrcweir             break;
175*cdf0e10cSrcweir         }
176*cdf0e10cSrcweir     }
177*cdf0e10cSrcweir }
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir void XcdParser::characters(xmlreader::Span const & text) {
180*cdf0e10cSrcweir     if (nestedParser_.is()) {
181*cdf0e10cSrcweir         nestedParser_->characters(text);
182*cdf0e10cSrcweir     }
183*cdf0e10cSrcweir }
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir }
186