src/xmlpatterns/expr/qqnameconstructor_p.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtXmlPatterns module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    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 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 //
       
    43 //  W A R N I N G
       
    44 //  -------------
       
    45 //
       
    46 // This file is not part of the Qt API.  It exists purely as an
       
    47 // implementation detail.  This header file may change from version to
       
    48 // version without notice, or even be removed.
       
    49 //
       
    50 // We mean it.
       
    51 
       
    52 #ifndef Patternist_QNameConstructor_H
       
    53 #define Patternist_QNameConstructor_H
       
    54 
       
    55 #include "qsinglecontainer_p.h"
       
    56 #include "qbuiltintypes_p.h"
       
    57 #include "qpatternistlocale_p.h"
       
    58 #include "qxpathhelper_p.h"
       
    59 
       
    60 QT_BEGIN_HEADER
       
    61 
       
    62 QT_BEGIN_NAMESPACE
       
    63 
       
    64 namespace QPatternist
       
    65 {
       
    66     /**
       
    67      * @short Creates an @c xs:QName value from a lexical QName using
       
    68      * statically known namespace bindings.
       
    69      *
       
    70      * @see QQNameValue
       
    71      * @see QXmlUtils
       
    72      * @author Frans Englich <frans.englich@nokia.com>
       
    73      * @ingroup Patternist_expressions
       
    74      */
       
    75     class QNameConstructor : public SingleContainer
       
    76     {
       
    77     public:
       
    78 
       
    79         QNameConstructor(const Expression::Ptr &source,
       
    80                          const NamespaceResolver::Ptr &nsResolver);
       
    81 
       
    82         virtual Item evaluateSingleton(const DynamicContext::Ptr &) const;
       
    83 
       
    84         virtual SequenceType::List expectedOperandTypes() const;
       
    85 
       
    86         virtual SequenceType::Ptr staticType() const;
       
    87 
       
    88         virtual ExpressionVisitorResult::Ptr accept(const ExpressionVisitor::Ptr &visitor) const;
       
    89 
       
    90         /**
       
    91          * Expands @p lexicalQName, which is a lexical representation of a QName such as "x:body", into
       
    92          * a QName using @p nsResolver to supply the namespace bindings.
       
    93          *
       
    94          * If @p lexicalQName is lexically invalid @p InvalidQName is raised via @p context, or if
       
    95          * no namespace binding does not exists for a prefix(if any) in @p lexicalQName, @p NoBinding
       
    96          * is raised via @p context.
       
    97          *
       
    98          * If @p asForAttribute is @c true, the name is considered to be for an
       
    99          * attribute in some way, and @p lexicalQName will not pick up the
       
   100          * default namespace if it doesn't have a prefix.
       
   101          *
       
   102          * @p nsResolver is parameterized meaning the function can be instantiated with either
       
   103          * DynamicContext or StaticContext.
       
   104          *
       
   105          * @see QQNameValue
       
   106          * @see QXmlUtils
       
   107          */
       
   108         template<typename TReportContext,
       
   109                  const ReportContext::ErrorCode InvalidQName,
       
   110                  const ReportContext::ErrorCode NoBinding>
       
   111         static
       
   112         QXmlName expandQName(const QString &lexicalQName,
       
   113                              const TReportContext &context,
       
   114                              const NamespaceResolver::Ptr &nsResolver,
       
   115                              const SourceLocationReflection *const r,
       
   116                              const bool asForAttribute = false);
       
   117 
       
   118         /**
       
   119          * Resolves the namespace prefix @p prefix to its namespace if it exists, or
       
   120          * raised ReportContext::XPST0081 otherwise.
       
   121          *
       
   122          * @returns the namespace URI corresponding to @p prefix
       
   123          */
       
   124         static QXmlName::NamespaceCode namespaceForPrefix(const QXmlName::PrefixCode prefix,
       
   125                                                           const StaticContext::Ptr &context,
       
   126                                                           const SourceLocationReflection *const r);
       
   127 
       
   128         virtual const SourceLocationReflection *actualReflection() const;
       
   129 
       
   130     private:
       
   131         const NamespaceResolver::Ptr m_nsResolver;
       
   132     };
       
   133 
       
   134     template<typename TReportContext,
       
   135              const ReportContext::ErrorCode InvalidQName,
       
   136              const ReportContext::ErrorCode NoBinding>
       
   137     QXmlName QNameConstructor::expandQName(const QString &lexicalQName,
       
   138                                            const TReportContext &context,
       
   139                                            const NamespaceResolver::Ptr &nsResolver,
       
   140                                            const SourceLocationReflection *const r,
       
   141                                            const bool asForAttribute)
       
   142     {
       
   143         Q_ASSERT(nsResolver);
       
   144         Q_ASSERT(context);
       
   145 
       
   146         if(XPathHelper::isQName(lexicalQName))
       
   147         {
       
   148             QString prefix;
       
   149             QString local;
       
   150             XPathHelper::splitQName(lexicalQName, prefix, local);
       
   151             const QXmlName::NamespaceCode nsCode = asForAttribute && prefix.isEmpty() ? QXmlName::NamespaceCode(StandardNamespaces::empty)
       
   152                                                                                    : (nsResolver->lookupNamespaceURI(context->namePool()->allocatePrefix(prefix)));
       
   153 
       
   154             if(nsCode == NamespaceResolver::NoBinding)
       
   155             {
       
   156                 context->error(QtXmlPatterns::tr("No namespace binding exists for "
       
   157                                   "the prefix %1 in %2").arg(formatKeyword(prefix),
       
   158                                                              formatKeyword(lexicalQName)),
       
   159                                NoBinding,
       
   160                                r);
       
   161                 return QXmlName(); /* Silence compiler warning. */
       
   162             }
       
   163             else
       
   164                 return context->namePool()->allocateQName(context->namePool()->stringForNamespace(nsCode), local, prefix);
       
   165         }
       
   166         else
       
   167         {
       
   168             context->error(QtXmlPatterns::tr("%1 is an invalid %2")
       
   169                               .arg(formatData(lexicalQName))
       
   170                               .arg(formatType(context->namePool(), BuiltinTypes::xsQName)),
       
   171                            InvalidQName,
       
   172                            r);
       
   173             return QXmlName(); /* Silence compiler warning. */
       
   174         }
       
   175     }
       
   176 }
       
   177 
       
   178 QT_END_NAMESPACE
       
   179 
       
   180 QT_END_HEADER
       
   181 
       
   182 #endif