Back to index

lightning-sunbird  0.9+nobinonly
Attr.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
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  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either the GNU General Public License Version 2 or later (the "GPL"), or
00026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 // Tom Kneeland (3/29/99)
00039 //
00040 //  Implementation of the Document Object Model Level 1 Core
00041 //    Implementation of the Attr class
00042 //
00043 
00044 #include "dom.h"
00045 #include "txAtoms.h"
00046 #include "XMLUtils.h"
00047 
00048 //
00049 //Construct an Attribute object using the specified name and document owner
00050 //
00051 Attr::Attr(const nsAString& name, Document* owner):
00052       NodeDefinition(Node::ATTRIBUTE_NODE, name, EmptyString(), owner)
00053 {
00054   int idx = nodeName.FindChar(':');
00055   if (idx == kNotFound) {
00056     mLocalName = do_GetAtom(nodeName);
00057     if (mLocalName == txXMLAtoms::xmlns)
00058       mNamespaceID = kNameSpaceID_XMLNS;
00059     else
00060       mNamespaceID = kNameSpaceID_None;
00061   }
00062   else {
00063     mLocalName = do_GetAtom(Substring(nodeName, idx + 1,
00064                                       nodeName.Length() - (idx + 1)));
00065     // namespace handling has to be handled late, the attribute must
00066     // be added to the tree to resolve the prefix, unless it's
00067     // xmlns or xml, try to do that here
00068     nsCOMPtr<nsIAtom> prefixAtom = do_GetAtom(Substring(nodeName, 0, idx));
00069     if (prefixAtom == txXMLAtoms::xmlns)
00070       mNamespaceID = kNameSpaceID_XMLNS;
00071     else if (prefixAtom == txXMLAtoms::xml)
00072       mNamespaceID = kNameSpaceID_XML;
00073     else
00074       mNamespaceID = kNameSpaceID_Unknown;
00075   }
00076 }
00077 
00078 Attr::Attr(const nsAString& aNamespaceURI,
00079            const nsAString& aName,
00080            Document* aOwner) :
00081     NodeDefinition(Node::ATTRIBUTE_NODE, aName, EmptyString(), aOwner)
00082 {
00083  if (aNamespaceURI.IsEmpty())
00084     mNamespaceID = kNameSpaceID_None;
00085   else
00086     mNamespaceID = txStandaloneNamespaceManager::getNamespaceID(aNamespaceURI);
00087 
00088   mLocalName = do_GetAtom(XMLUtils::getLocalPart(nodeName));
00089 }
00090 
00091 //
00092 //Release the mLocalName
00093 //
00094 Attr::~Attr()
00095 {
00096 }
00097 
00098 void Attr::setNodeValue(const nsAString& aValue)
00099 {
00100   nodeValue = aValue;
00101 }
00102 
00103 nsresult Attr::getNodeValue(nsAString& aValue)
00104 {
00105   aValue = nodeValue;
00106   return NS_OK;
00107 }
00108 
00109 //
00110 //Not implemented anymore, return null as an error.
00111 //
00112 Node* Attr::appendChild(Node* newChild)
00113 {
00114   NS_ASSERTION(0, "not implemented");
00115   return nsnull;
00116 }
00117 
00118 //
00119 //Return the attributes local (unprefixed) name atom.
00120 //
00121 MBool Attr::getLocalName(nsIAtom** aLocalName)
00122 {
00123   if (!aLocalName)
00124     return MB_FALSE;
00125   *aLocalName = mLocalName;
00126   NS_ADDREF(*aLocalName);
00127   return MB_TRUE;
00128 }
00129 
00130 //
00131 //Return the namespace the attribute belongs to. If the attribute doesn't
00132 //have a prefix it doesn't belong to any namespace per the namespace spec,
00133 //and is handled in the constructor.
00134 //
00135 PRInt32 Attr::getNamespaceID()
00136 {
00137   if (mNamespaceID >= 0)
00138     return mNamespaceID;
00139 
00140   mNamespaceID = kNameSpaceID_None;
00141   PRInt32 idx = nodeName.FindChar(':');
00142   if (idx != kNotFound) {
00143     nsCOMPtr<nsIAtom> prefixAtom = do_GetAtom(Substring(nodeName, 0, idx));
00144     mNamespaceID = lookupNamespaceID(prefixAtom);
00145   }
00146   return mNamespaceID;
00147 }
00148 
00149 //
00150 //Return the attributes owning element
00151 //
00152 Node* Attr::getXPathParent()
00153 {
00154   return ownerElement;
00155 }