source: trunk/src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp@ 846

Last change on this file since 846 was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 4.9 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 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 "qcommonsequencetypes_p.h"
43#include "qpatternistlocale_p.h"
44#include "qnodebuilder_p.h"
45#include "qqnamevalue_p.h"
46
47#include "qprocessinginstructionconstructor_p.h"
48
49QT_BEGIN_NAMESPACE
50
51using namespace QPatternist;
52
53ProcessingInstructionConstructor::
54ProcessingInstructionConstructor(const Expression::Ptr &op1,
55 const Expression::Ptr &op2) : PairContainer(op1, op2)
56{
57}
58
59QString ProcessingInstructionConstructor::leftTrimmed(const QString &input)
60{
61 const int len = input.length();
62
63 for(int i = 0; i < len; ++i)
64 {
65 if(!input.at(i).isSpace())
66 return input.mid(i);
67 }
68
69 return QString(); /* input consists only of whitespace. All was trimmed. */
70}
71
72QString ProcessingInstructionConstructor::data(const DynamicContext::Ptr &context) const
73{
74 const Item name(m_operand1->evaluateSingleton(context));
75 const Item dataArg(m_operand2->evaluateSingleton(context));
76
77 if(dataArg)
78 {
79 /* Perform trimming before validation, to increase speed. */
80 const QString value(leftTrimmed(dataArg.stringValue()));
81
82 if(value.contains(QLatin1String("?>")))
83 {
84 context->error(QtXmlPatterns::tr("The data of a processing instruction cannot contain the string %1").arg(formatData("?>")),
85 ReportContext::XQDY0026, this);
86 return QString();
87 }
88 else
89 return value;
90 }
91 else
92 return QString();
93}
94
95QXmlName ProcessingInstructionConstructor::evaluateTardata(const DynamicContext::Ptr &context) const
96{
97 const Item name(m_operand1->evaluateSingleton(context));
98 return context->namePool()->allocateQName(QString(), name.stringValue());
99}
100
101Item ProcessingInstructionConstructor::evaluateSingleton(const DynamicContext::Ptr &context) const
102{
103 const NodeBuilder::Ptr nodeBuilder(context->nodeBuilder(QUrl()));
104
105 nodeBuilder->processingInstruction(evaluateTardata(context), data(context));
106
107 const QAbstractXmlNodeModel::Ptr nm(nodeBuilder->builtDocument());
108 context->addNodeModel(nm);
109
110 return nm->root(QXmlNodeModelIndex());
111}
112
113void ProcessingInstructionConstructor::evaluateToSequenceReceiver(const DynamicContext::Ptr &context) const
114{
115 QAbstractXmlReceiver *const receiver = context->outputReceiver();
116
117 receiver->processingInstruction(evaluateTardata(context), data(context));
118}
119
120SequenceType::Ptr ProcessingInstructionConstructor::staticType() const
121{
122 return CommonSequenceTypes::ExactlyOneProcessingInstruction;
123}
124
125SequenceType::List ProcessingInstructionConstructor::expectedOperandTypes() const
126{
127 SequenceType::List result;
128 result.append(CommonSequenceTypes::ExactlyOneString);
129 result.append(CommonSequenceTypes::ZeroOrOneString);
130 return result;
131}
132
133Expression::Properties ProcessingInstructionConstructor::properties() const
134{
135 return DisableElimination | IsNodeConstructor;
136}
137
138ExpressionVisitorResult::Ptr
139ProcessingInstructionConstructor::accept(const ExpressionVisitor::Ptr &visitor) const
140{
141 return visitor->visit(this);
142}
143
144QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.