| /* |
| * Copyright 1999-2004 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| // Class header file... |
| #include "XalanQNameByValue.hpp" |
| |
| |
| |
| #include <xalanc/PlatformSupport/PrefixResolver.hpp> |
| #include <xalanc/PlatformSupport/XalanMessageLoader.hpp> |
| |
| #include <xalanc/XPath/XalanQName.hpp> |
| |
| #include <xalanc/DOMSupport/DOMServices.hpp> |
| #include <xalanc/DOMSupport/DOMSupport.hpp> |
| |
| |
| |
| #include "ElementPrefixResolverProxy.hpp" |
| |
| |
| |
| XALAN_CPP_NAMESPACE_BEGIN |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue() : |
| XalanQName(), |
| m_namespace(), |
| m_localpart() |
| { |
| } |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue(const XalanQNameByValue& theSource) : |
| XalanQName(), |
| m_namespace(theSource.m_namespace), |
| m_localpart(theSource.m_localpart) |
| { |
| } |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue(const XalanQName& theSource) : |
| XalanQName(), |
| m_namespace(theSource.getNamespace()), |
| m_localpart(theSource.getLocalPart()) |
| { |
| } |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue( |
| const XalanDOMString& theNamespace, |
| const XalanDOMString& theLocalPart) : |
| XalanQName(), |
| m_namespace(theNamespace), |
| m_localpart(theLocalPart) |
| { |
| } |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue( |
| const XalanDOMString& qname, |
| const NamespacesStackType& namespaces, |
| const LocatorType* locator, |
| bool fUseDefault) : |
| m_namespace(), |
| m_localpart() |
| { |
| initialize( |
| c_wstr(qname), |
| length(qname), |
| namespaces, |
| locator, |
| fUseDefault); |
| } |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue( |
| const XalanDOMChar* qname, |
| const NamespacesStackType& namespaces, |
| const LocatorType* locator, |
| bool fUseDefault) : |
| m_namespace(), |
| m_localpart() |
| { |
| assert(qname != 0); |
| |
| initialize( |
| qname, |
| length(qname), |
| namespaces, |
| locator, |
| fUseDefault); |
| } |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue( |
| const XalanDOMString& qname, |
| const XalanElement* namespaceContext, |
| const XPathEnvSupport& envSupport, |
| const DOMSupport& domSupport, |
| const LocatorType* locator) : |
| m_namespace(), |
| m_localpart() |
| { |
| ElementPrefixResolverProxy theProxy(namespaceContext, envSupport, domSupport); |
| |
| resolvePrefix( |
| c_wstr(qname), |
| length(qname), |
| &theProxy, |
| locator); |
| } |
| |
| |
| |
| XalanQNameByValue::XalanQNameByValue( |
| const XalanDOMString& qname, |
| const PrefixResolver* theResolver, |
| const LocatorType* locator) : |
| m_namespace(), |
| m_localpart() |
| { |
| resolvePrefix( |
| c_wstr(qname), |
| length(qname), |
| theResolver, |
| locator); |
| } |
| |
| |
| |
| XalanQNameByValue::~XalanQNameByValue() |
| { |
| } |
| |
| |
| |
| const XalanDOMString& |
| XalanQNameByValue::getLocalPart() const |
| { |
| return m_localpart; |
| } |
| |
| |
| |
| const XalanDOMString& |
| XalanQNameByValue::getNamespace() const |
| { |
| return m_namespace; |
| } |
| |
| |
| |
| void |
| XalanQNameByValue::set( |
| const XalanDOMString& qname, |
| const NamespacesStackType& namespaces, |
| const LocatorType* locator, |
| bool fUseDefault) |
| { |
| initialize( |
| c_wstr(qname), |
| length(qname), |
| namespaces, |
| locator, |
| fUseDefault); |
| } |
| |
| |
| |
| void |
| XalanQNameByValue::set( |
| const XalanDOMChar* qname, |
| const NamespacesStackType& namespaces, |
| const LocatorType* locator, |
| bool fUseDefault) |
| { |
| assert(qname != 0); |
| |
| initialize( |
| qname, |
| length(qname), |
| namespaces, |
| locator, |
| fUseDefault); |
| } |
| |
| |
| |
| void |
| XalanQNameByValue::set( |
| const XalanDOMString& qname, |
| const PrefixResolver* theResolver, |
| const LocatorType* locator) |
| { |
| resolvePrefix( |
| c_wstr(qname), |
| length(qname), |
| theResolver, |
| locator); |
| } |
| |
| |
| |
| void |
| XalanQNameByValue::set( |
| const XalanDOMChar* qname, |
| const PrefixResolver* theResolver, |
| const LocatorType* locator) |
| { |
| assert(qname != 0); |
| |
| resolvePrefix( |
| qname, |
| length(qname), |
| theResolver, |
| locator); |
| } |
| |
| |
| |
| void |
| throwException( |
| const XalanDOMString& theMessage, |
| const XalanQNameByValue::LocatorType* theLocator) |
| { |
| if (theLocator == 0) |
| { |
| throw XalanQName::InvalidQNameException(theMessage.c_str(), theMessage.length()); |
| } |
| else |
| { |
| throw XalanQName::InvalidQNameException(*theLocator,theMessage.c_str(), theMessage.length()); |
| } |
| } |
| |
| |
| |
| |
| void |
| XalanQNameByValue::initialize( |
| const XalanDOMChar* qname, |
| XalanDOMString::size_type len, |
| const NamespacesStackType& namespaces, |
| const LocatorType* locator, |
| bool fUseDefault) |
| { |
| const XalanDOMString::size_type indexOfNSSep = indexOf(qname, XalanUnicode::charColon); |
| |
| if (indexOfNSSep == 0) |
| { |
| throwException(XalanMessageLoader::getMessage(XalanMessages::PrefixOfLengthZeroDetected), locator); |
| } |
| else if(indexOfNSSep < len) |
| { |
| // Reserve some space for the local part right now, and |
| // use it as a temporary for the prefix. |
| m_localpart.reserve(len); |
| |
| m_localpart.assign(qname, indexOfNSSep); |
| |
| if(m_localpart == DOMServices::s_XMLString) |
| { |
| m_namespace = DOMServices::s_XMLNamespaceURI; |
| } |
| else if(m_localpart == DOMServices::s_XMLNamespace) |
| { |
| // The xmlns prefix is not normally bound to a namespace URI, but we're really trying |
| // to form a QName, so we'll do what the DOM does... |
| m_namespace = DOMServices::s_XMLNamespacePrefixURI; |
| } |
| else |
| { |
| const XalanDOMString* const theNamespace = |
| getNamespaceForPrefix(namespaces, m_localpart); |
| |
| if(theNamespace == 0 || 0 == length(*theNamespace)) |
| { |
| throwException( |
| XalanMessageLoader::getMessage(XalanMessages::PrefixMustResolveToNamespace_1Param, m_localpart), |
| locator); |
| } |
| else |
| { |
| m_namespace = *theNamespace; |
| } |
| } |
| |
| m_localpart.assign(qname + indexOfNSSep + 1, len - (indexOfNSSep + 1)); |
| } |
| else |
| { |
| if (fUseDefault == false) |
| { |
| m_namespace.clear(); |
| } |
| else |
| { |
| const XalanDOMString* const theNamespace = |
| getNamespaceForPrefix(namespaces, s_emptyString); |
| |
| if(theNamespace != 0 && 0 != length(*theNamespace)) |
| { |
| m_namespace = *theNamespace; |
| } |
| } |
| |
| m_localpart = qname; |
| } |
| |
| validate(qname, len, locator); |
| } |
| |
| |
| |
| void |
| XalanQNameByValue::resolvePrefix( |
| const XalanDOMChar* qname, |
| XalanDOMString::size_type theLength, |
| const PrefixResolver* theResolver, |
| const LocatorType* locator) |
| { |
| const XalanDOMString::size_type indexOfNSSep = indexOf(qname, XalanUnicode::charColon); |
| |
| if (indexOfNSSep == 0) |
| { |
| throwException(XalanMessageLoader::getMessage(XalanMessages::PrefixOfLengthZeroDetected), locator); |
| } |
| else if(indexOfNSSep >= theLength) |
| { |
| m_localpart.assign(qname, theLength); |
| |
| m_namespace.clear(); |
| } |
| else |
| { |
| // Reserve some space for the local part right now, and |
| // use it as a temporary for the prefix. |
| m_localpart.reserve(theLength); |
| |
| m_localpart.assign(qname, indexOfNSSep); |
| |
| if(m_localpart == DOMServices::s_XMLString) |
| { |
| m_namespace = DOMServices::s_XMLNamespaceURI; |
| } |
| else if(m_localpart == DOMServices::s_XMLNamespace) |
| { |
| // The xmlns prefix is not normally bound to a namespace URI, but we're really trying |
| // to form a QName, so we'll do what the DOM does... |
| m_namespace = DOMServices::s_XMLNamespacePrefixURI; |
| } |
| else if (theResolver == 0) |
| { |
| throwException( |
| XalanMessageLoader::getMessage( |
| XalanMessages::PrefixMustResolveToNamespace_1Param, |
| m_localpart), |
| locator); |
| } |
| else |
| { |
| const XalanDOMString* const theNamespace = |
| theResolver->getNamespaceForPrefix(m_localpart); |
| |
| if (theNamespace != 0) |
| { |
| m_namespace = *theNamespace; |
| } |
| } |
| |
| if(0 == length(m_namespace)) |
| { |
| throwException( |
| XalanMessageLoader::getMessage( |
| XalanMessages::PrefixMustResolveToNamespace_1Param, |
| m_localpart) |
| ,locator); |
| } |
| |
| m_localpart.assign(qname + indexOfNSSep + 1, theLength - (indexOfNSSep + 1)); |
| } |
| |
| validate(qname, theLength, locator); |
| } |
| |
| |
| |
| void |
| XalanQNameByValue::validate( |
| const XalanDOMChar* qname, |
| XalanDOMString::size_type theLength, |
| const LocatorType* locator) |
| { |
| if (isValid() == false) |
| { |
| if (locator != 0) |
| { |
| throw InvalidQNameException(*locator, qname, theLength); |
| } |
| else |
| { |
| throw InvalidQNameException(qname, theLength); |
| } |
| } |
| } |
| |
| |
| |
| XALAN_CPP_NAMESPACE_END |