michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* michael@0: * A class for keeping track of prefix-to-namespace-id mappings michael@0: */ michael@0: michael@0: #include "nsXMLNameSpaceMap.h" michael@0: #include "nsContentUtils.h" michael@0: #include "nsGkAtoms.h" michael@0: #include "nsNameSpaceManager.h" michael@0: michael@0: template <> michael@0: class nsDefaultComparator { michael@0: public: michael@0: bool Equals(const nsNameSpaceEntry& aEntry, nsIAtom* const& aPrefix) const { michael@0: return aEntry.prefix == aPrefix; michael@0: } michael@0: }; michael@0: michael@0: template <> michael@0: class nsDefaultComparator { michael@0: public: michael@0: bool Equals(const nsNameSpaceEntry& aEntry, const int32_t& aNameSpace) const { michael@0: return aEntry.nameSpaceID == aNameSpace; michael@0: } michael@0: }; michael@0: michael@0: michael@0: /* static */ nsXMLNameSpaceMap* michael@0: nsXMLNameSpaceMap::Create(bool aForXML) michael@0: { michael@0: nsXMLNameSpaceMap *map = new nsXMLNameSpaceMap(); michael@0: NS_ENSURE_TRUE(map, nullptr); michael@0: michael@0: if (aForXML) { michael@0: nsresult rv1 = map->AddPrefix(nsGkAtoms::xmlns, michael@0: kNameSpaceID_XMLNS); michael@0: nsresult rv2 = map->AddPrefix(nsGkAtoms::xml, kNameSpaceID_XML); michael@0: michael@0: if (NS_FAILED(rv1) || NS_FAILED(rv2)) { michael@0: delete map; michael@0: map = nullptr; michael@0: } michael@0: } michael@0: michael@0: return map; michael@0: } michael@0: michael@0: nsXMLNameSpaceMap::nsXMLNameSpaceMap() michael@0: : mNameSpaces(4) michael@0: { michael@0: } michael@0: michael@0: nsresult michael@0: nsXMLNameSpaceMap::AddPrefix(nsIAtom *aPrefix, int32_t aNameSpaceID) michael@0: { michael@0: if (!mNameSpaces.Contains(aPrefix) && !mNameSpaces.AppendElement(aPrefix)) { michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: } michael@0: mNameSpaces[mNameSpaces.IndexOf(aPrefix)].nameSpaceID = aNameSpaceID; michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: nsXMLNameSpaceMap::AddPrefix(nsIAtom *aPrefix, nsString &aURI) michael@0: { michael@0: int32_t id; michael@0: nsresult rv = nsContentUtils::NameSpaceManager()->RegisterNameSpace(aURI, michael@0: id); michael@0: michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: return AddPrefix(aPrefix, id); michael@0: } michael@0: michael@0: int32_t michael@0: nsXMLNameSpaceMap::FindNameSpaceID(nsIAtom *aPrefix) const michael@0: { michael@0: uint32_t index = mNameSpaces.IndexOf(aPrefix); michael@0: if (index != mNameSpaces.NoIndex) { michael@0: return mNameSpaces[index].nameSpaceID; michael@0: } michael@0: michael@0: // The default mapping for no prefix is no namespace. If a non-null prefix michael@0: // was specified and we didn't find it, we return an error. michael@0: michael@0: return aPrefix ? kNameSpaceID_Unknown : kNameSpaceID_None; michael@0: } michael@0: michael@0: nsIAtom* michael@0: nsXMLNameSpaceMap::FindPrefix(int32_t aNameSpaceID) const michael@0: { michael@0: uint32_t index = mNameSpaces.IndexOf(aNameSpaceID); michael@0: if (index != mNameSpaces.NoIndex) { michael@0: return mNameSpaces[index].prefix; michael@0: } michael@0: michael@0: return nullptr; michael@0: } michael@0: michael@0: void michael@0: nsXMLNameSpaceMap::Clear() michael@0: { michael@0: mNameSpaces.Clear(); michael@0: }