source: trunk/src/xmlpatterns/schema/qxsdinstancereader.cpp@ 769

Last change on this file since 769 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

  • Property svn:eol-style set to native
File size: 6.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtXmlPatterns module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qxsdinstancereader_p.h"
43
44QT_BEGIN_NAMESPACE
45
46using namespace QPatternist;
47
48XsdInstanceReader::XsdInstanceReader(const QAbstractXmlNodeModel *model, const XsdSchemaContext::Ptr &context)
49 : m_context(context)
50 , m_model(model->iterate(model->root(QXmlNodeModelIndex()), QXmlNodeModelIndex::AxisChild))
51{
52}
53
54bool XsdInstanceReader::atEnd() const
55{
56 return (m_model.current() == AbstractXmlPullProvider::EndOfInput);
57}
58
59void XsdInstanceReader::readNext()
60{
61 m_model.next();
62
63 if (m_model.current() == AbstractXmlPullProvider::StartElement) {
64 m_cachedAttributes = m_model.attributes();
65 m_cachedAttributeItems = m_model.attributeItems();
66 m_cachedSourceLocation = m_model.sourceLocation();
67 m_cachedItem = QXmlItem(m_model.index());
68 }
69}
70
71bool XsdInstanceReader::isStartElement() const
72{
73 return (m_model.current() == AbstractXmlPullProvider::StartElement);
74}
75
76bool XsdInstanceReader::isEndElement() const
77{
78 return (m_model.current() == AbstractXmlPullProvider::EndElement);
79}
80
81bool XsdInstanceReader::hasChildText() const
82{
83 const QXmlNodeModelIndex index = m_model.index();
84 QXmlNodeModelIndex::Iterator::Ptr it = index.model()->iterate(index, QXmlNodeModelIndex::AxisChild);
85
86 QXmlNodeModelIndex currentIndex = it->next();
87 while (!currentIndex.isNull()) {
88 if (currentIndex.kind() == QXmlNodeModelIndex::Text)
89 return true;
90
91 currentIndex = it->next();
92 }
93
94 return false;
95}
96
97bool XsdInstanceReader::hasChildElement() const
98{
99 const QXmlNodeModelIndex index = m_model.index();
100 QXmlNodeModelIndex::Iterator::Ptr it = index.model()->iterate(index, QXmlNodeModelIndex::AxisChild);
101
102 QXmlNodeModelIndex currentIndex = it->next();
103 while (!currentIndex.isNull()) {
104 if (currentIndex.kind() == QXmlNodeModelIndex::Element)
105 return true;
106
107 currentIndex = it->next();
108 }
109
110 return false;
111}
112
113QXmlName XsdInstanceReader::name() const
114{
115 return m_model.name();
116}
117
118QXmlName XsdInstanceReader::convertToQName(const QString &name) const
119{
120 const int pos = name.indexOf(QLatin1Char(':'));
121
122 QXmlName::PrefixCode prefixCode = 0;
123 QXmlName::NamespaceCode namespaceCode;
124 QXmlName::LocalNameCode localNameCode;
125 if (pos != -1) {
126 prefixCode = m_context->namePool()->allocatePrefix(name.left(pos));
127 namespaceCode = m_cachedItem.toNodeModelIndex().namespaceForPrefix(prefixCode);
128 localNameCode = m_context->namePool()->allocateLocalName(name.mid(pos + 1));
129 } else {
130 prefixCode = StandardPrefixes::empty;
131 namespaceCode = m_cachedItem.toNodeModelIndex().namespaceForPrefix(prefixCode);
132 if (namespaceCode == -1)
133 namespaceCode = StandardNamespaces::empty;
134 localNameCode = m_context->namePool()->allocateLocalName(name);
135 }
136
137 return QXmlName(namespaceCode, localNameCode, prefixCode);
138}
139
140bool XsdInstanceReader::hasAttribute(const QXmlName &name) const
141{
142 return m_cachedAttributes.contains(name);
143}
144
145QString XsdInstanceReader::attribute(const QXmlName &name) const
146{
147 Q_ASSERT(m_cachedAttributes.contains(name));
148
149 return m_cachedAttributes.value(name);
150}
151
152QSet<QXmlName> XsdInstanceReader::attributeNames() const
153{
154 return m_cachedAttributes.keys().toSet();
155}
156
157QString XsdInstanceReader::text() const
158{
159 const QXmlNodeModelIndex index = m_model.index();
160 QXmlNodeModelIndex::Iterator::Ptr it = index.model()->iterate(index, QXmlNodeModelIndex::AxisChild);
161
162 QString result;
163