Back to index

lightning-sunbird  0.9+nobinonly
txNameTest.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is TransforMiiX XSLT processor code.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * The MITRE Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1999
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *   Keith Visco <kvisco@ziplink.net> (Original Author)
00024  *
00025  * Alternatively, the contents of this file may be used under the terms of
00026  * either the GNU General Public License Version 2 or later (the "GPL"), or
00027  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028  * in which case the provisions of the GPL or the LGPL are applicable instead
00029  * of those above. If you wish to allow use of your version of this file only
00030  * under the terms of either the GPL or the LGPL, and not to allow others to
00031  * use your version of this file under the terms of the MPL, indicate your
00032  * decision by deleting the provisions above and replace them with the notice
00033  * and other provisions required by the GPL or the LGPL. If you do not delete
00034  * the provisions above, a recipient may use your version of this file under
00035  * the terms of any one of the MPL, the GPL or the LGPL.
00036  *
00037  * ***** END LICENSE BLOCK ***** */
00038 
00039 #include "Expr.h"
00040 #include "nsIAtom.h"
00041 #include "txAtoms.h"
00042 #include "txXPathTreeWalker.h"
00043 #include "txIXPathContext.h"
00044 
00045 txNameTest::txNameTest(nsIAtom* aPrefix, nsIAtom* aLocalName, PRInt32 aNSID,
00046                        PRUint16 aNodeType)
00047     :mPrefix(aPrefix), mLocalName(aLocalName), mNamespace(aNSID),
00048      mNodeType(aNodeType)
00049 {
00050     if (aPrefix == txXMLAtoms::_empty)
00051         mPrefix = 0;
00052     NS_ASSERTION(aLocalName, "txNameTest without a local name?");
00053     NS_ASSERTION(aNodeType == txXPathNodeType::DOCUMENT_NODE ||
00054                  aNodeType == txXPathNodeType::ELEMENT_NODE ||
00055                  aNodeType == txXPathNodeType::ATTRIBUTE_NODE,
00056                  "Go fix txNameTest::matches");
00057 }
00058 
00059 txNameTest::~txNameTest()
00060 {
00061 }
00062 
00063 PRBool txNameTest::matches(const txXPathNode& aNode, txIMatchContext* aContext)
00064 {
00065     if ((mNodeType == txXPathNodeType::ELEMENT_NODE &&
00066          !txXPathNodeUtils::isElement(aNode)) ||
00067         (mNodeType == txXPathNodeType::ATTRIBUTE_NODE &&
00068          !txXPathNodeUtils::isAttribute(aNode)) ||
00069         (mNodeType == txXPathNodeType::DOCUMENT_NODE &&
00070          !txXPathNodeUtils::isRoot(aNode))) {
00071         return PR_FALSE;
00072     }
00073 
00074     // Totally wild?
00075     if (mLocalName == txXPathAtoms::_asterix && !mPrefix)
00076         return MB_TRUE;
00077 
00078     // Compare namespaces
00079     if (txXPathNodeUtils::getNamespaceID(aNode) != mNamespace)
00080         return MB_FALSE;
00081 
00082     // Name wild?
00083     if (mLocalName == txXPathAtoms::_asterix)
00084         return MB_TRUE;
00085 
00086     // Compare local-names
00087     return txXPathNodeUtils::localNameEquals(aNode, mLocalName);
00088 }
00089 
00090 /*
00091  * Returns the default priority of this txNodeTest
00092  */
00093 double txNameTest::getDefaultPriority()
00094 {
00095     if (mLocalName == txXPathAtoms::_asterix) {
00096         if (!mPrefix)
00097             return -0.5;
00098         return -0.25;
00099     }
00100     return 0;
00101 }
00102 
00103 #ifdef TX_TO_STRING
00104 void
00105 txNameTest::toString(nsAString& aDest)
00106 {
00107     if (mPrefix) {
00108         nsAutoString prefix;
00109         mPrefix->ToString(prefix);
00110         aDest.Append(prefix);
00111         aDest.Append(PRUnichar(':'));
00112     }
00113     nsAutoString localName;
00114     mLocalName->ToString(localName);
00115     aDest.Append(localName);
00116 }
00117 #endif