Back to index

lightning-sunbird  0.9+nobinonly
nsSchemaLoader.h
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 Mozilla.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications.
00019  * Portions created by the Initial Developer are Copyright (C) 2001
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *   Vidur Apparao <vidur@netscape.com> (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 #ifndef __nsSchemaLoader_h__
00040 #define __nsSchemaLoader_h__
00041 
00042 #include "nsIWebServiceErrorHandler.h"
00043 #include "nsISchemaLoader.h"
00044 #include "nsSchemaPrivate.h"
00045 #include "nsDOMUtils.h"
00046 
00047 // DOM includes
00048 #include "nsIDOMElement.h"
00049 #include "nsIDOMNodeList.h"
00050 #include "nsIDOMNode.h"
00051 
00052 // XPCOM Includes
00053 #include "nsCOMPtr.h"
00054 #include "nsVoidArray.h"
00055 #include "nsString.h"
00056 #include "nsIAtom.h"
00057 #include "nsInterfaceHashtable.h"
00058 
00059 // Loading includes
00060 #include "nsIURI.h"
00061 
00062 class nsSchemaAtoms 
00063 {
00064 public:
00065   static nsresult AddRefAtoms();
00066 
00067 #define SCHEMA_ATOM(_name, _value) static nsIAtom* _name;
00068 #include "nsSchemaAtomList.h"
00069 #undef SCHEMA_ATOM
00070 };
00071 
00072 class nsBuiltinSchemaCollection : public nsISchemaCollection
00073 {
00074 public:
00075   nsBuiltinSchemaCollection();
00076   nsresult Init();
00077 
00078   NS_DECL_ISUPPORTS
00079   NS_DECL_NSISCHEMACOLLECTION
00080 
00081 protected:
00082   nsresult GetBuiltinType(const nsAString& aName,
00083                           const nsAString& aNamespace,
00084                           nsISchemaType** aType);
00085   nsresult GetSOAPType(const nsAString& aName,
00086                        const nsAString& aNamespace,
00087                        nsISchemaType** aType);
00088 
00089 protected:
00090   nsInterfaceHashtable<nsStringHashKey, nsISchemaType> mBuiltinTypesHash;
00091   nsInterfaceHashtable<nsStringHashKey, nsISchemaType> mSOAPTypeHash;
00092 };
00093 
00094 class nsSchemaLoader : public nsISchemaLoader,
00095                        public nsISchemaCollection
00096 {
00097 public:
00098   nsSchemaLoader();
00099   nsresult Init();
00100 
00101   NS_DECL_ISUPPORTS
00102   NS_DECL_NSISCHEMALOADER
00103   NS_DECL_NSISCHEMACOLLECTION
00104 
00105 protected:
00106   nsresult ProcessElement(nsIWebServiceErrorHandler* aErrorHandler,
00107                           nsSchema* aSchema, 
00108                           nsIDOMElement* aElement,
00109                           nsISchemaElement** aSchemaElement);
00110   nsresult ProcessComplexType(nsIWebServiceErrorHandler* aErrorHandler,
00111                               nsSchema* aSchema, 
00112                               nsIDOMElement* aElement,
00113                               nsISchemaComplexType** aComplexType);
00114   nsresult ProcessComplexTypeBody(nsIWebServiceErrorHandler* aErrorHandler,
00115                                   nsSchema* aSchema, 
00116                                   nsIDOMElement* aElement,
00117                                   nsSchemaComplexType* aComplexType,
00118                                   nsSchemaModelGroup* aSequence,
00119                                   PRUint16* aContentModel);
00120   nsresult ProcessSimpleContent(nsIWebServiceErrorHandler* aErrorHandler,
00121                                 nsSchema* aSchema, 
00122                                 nsIDOMElement* aElement,
00123                                 nsSchemaComplexType* aComplexType,
00124                                 PRUint16* aDerivation,
00125                                 nsISchemaType** aBaseType);
00126   nsresult ProcessSimpleContentRestriction(nsIWebServiceErrorHandler* aErrorHandler,
00127                                            nsSchema* aSchema, 
00128                                            nsIDOMElement* aElement,
00129                                            nsSchemaComplexType* aComplexType, 
00130                                            nsISchemaType* aBaseType,
00131                                            nsISchemaSimpleType** aSimpleBaseType);
00132   nsresult ProcessSimpleContentExtension(nsIWebServiceErrorHandler* aErrorHandler,
00133                                          nsSchema* aSchema, 
00134                                          nsIDOMElement* aElement,
00135                                          nsSchemaComplexType* aComplexType,
00136                                          nsISchemaType* aBaseType,
00137                                          nsISchemaSimpleType** aSimpleBaseType);
00138   nsresult ProcessComplexContent(nsIWebServiceErrorHandler* aErrorHandler,
00139                                  nsSchema* aSchema, 
00140                                  nsIDOMElement* aElement,
00141                                  nsSchemaComplexType* aComplexType,
00142                                  PRUint16* aContentModel,
00143                                  PRUint16* aDerivation,
00144                                  nsISchemaType** aBaseType);
00145   nsresult ProcessSimpleType(nsIWebServiceErrorHandler* aErrorHandler,
00146                              nsSchema* aSchema, 
00147                              nsIDOMElement* aElement,
00148                              nsISchemaSimpleType** aSimpleType);
00149   nsresult ProcessSimpleTypeRestriction(nsIWebServiceErrorHandler* aErrorHandler,
00150                                         nsSchema* aSchema, 
00151                                         nsIDOMElement* aElement,
00152                                         const nsAString& aName,
00153                                         nsISchemaSimpleType** aSimpleType);
00154   nsresult ProcessSimpleTypeList(nsIWebServiceErrorHandler* aErrorHandler,
00155                                  nsSchema* aSchema, 
00156                                  nsIDOMElement* aElement,
00157                                  const nsAString& aName,
00158                                  nsISchemaSimpleType** aSimpleType);
00159   nsresult ProcessSimpleTypeUnion(nsIWebServiceErrorHandler* aErrorHandler,
00160                                   nsSchema* aSchema, 
00161                                   nsIDOMElement* aElement,
00162                                   const nsAString& aName,
00163                                   nsISchemaSimpleType** aSimpleType);
00164   nsresult ProcessAttribute(nsIWebServiceErrorHandler* aErrorHandler,
00165                             nsSchema* aSchema, 
00166                             nsIDOMElement* aElement,
00167                             nsISchemaAttribute** aAttribute);
00168   nsresult ProcessAttributeGroup(nsIWebServiceErrorHandler* aErrorHandler,
00169                                  nsSchema* aSchema, 
00170                                  nsIDOMElement* aElement,
00171                                  nsISchemaAttributeGroup** aAttributeGroup);
00172   nsresult ProcessAttributeComponent(nsIWebServiceErrorHandler* aErrorHandler,
00173                                      nsSchema* aSchema, 
00174                                      nsIDOMElement* aElement,
00175                                      nsIAtom* aTagName,
00176                                      nsISchemaAttributeComponent** aAttribute);
00177   nsresult ProcessModelGroup(nsIWebServiceErrorHandler* aErrorHandler,
00178                              nsSchema* aSchema, 
00179                              nsIDOMElement* aElement,
00180                              nsIAtom* aTagName,
00181                              nsSchemaModelGroup* aParentSequence,
00182                              nsISchemaModelGroup** aModelGroup);
00183   nsresult ProcessParticle(nsIWebServiceErrorHandler* aErrorHandler,
00184                            nsSchema* aSchema, 
00185                            nsIDOMElement* aElement,
00186                            nsIAtom* aTagName,
00187                            nsISchemaParticle** aModelGroup);
00188   nsresult ProcessFacet(nsIWebServiceErrorHandler* aErrorHandler,
00189                         nsSchema* aSchema, 
00190                         nsIDOMElement* aElement,
00191                         nsIAtom* aTagName,
00192                         nsISchemaFacet** aFacet);
00193 
00194   nsresult GetNewOrUsedType(nsSchema* aSchema,
00195                             nsIDOMElement* aContext,
00196                             const nsAString& aTypeName,
00197                             nsISchemaType** aType);
00198 
00199   void GetUse(nsIDOMElement* aElement, 
00200               PRUint16* aUse);
00201   void GetProcess(nsIDOMElement* aElement, 
00202                   PRUint16* aProcess);
00203   void GetMinAndMax(nsIDOMElement* aElement,
00204                     PRUint32* aMinOccurs,
00205                     PRUint32* aMaxOccurs);
00206 
00207   nsresult GetResolvedURI(const nsAString& aSchemaURI,
00208                           const char* aMethod, nsIURI** aURI);
00209 
00210   nsresult ParseArrayType(nsSchema* aSchema,
00211                           nsIDOMElement* aAttrElement,
00212                           const nsAString& aStr,
00213                           nsISchemaType** aType,
00214                           PRUint32* aDimension);
00215   nsresult ParseDimensions(nsSchema* aSchema,
00216                            nsIDOMElement* aAttrElement,
00217                            const nsAString& aStr,
00218                            nsISchemaType* aBaseType,
00219                            nsISchemaType** aArrayType,
00220                            PRUint32* aDimension);
00221   void ConstructArrayName(nsISchemaType* aType,
00222                           nsAString& aName);
00223 
00224   nsresult ParseNameAndNS(const nsAString& aName, nsIDOMElement* aElement,
00225                           nsAString& aTypeName, nsAString& aTypeNS);
00226 
00227   nsresult GetDocumentFromURI(const nsAString& aUri,
00228                               nsIDOMDocument** aDocument);
00229 
00230 protected:
00231   nsInterfaceHashtable<nsStringHashKey, nsISchema> mSchemas;
00232   nsCOMPtr<nsISchemaCollection> mBuiltinCollection;
00233 };
00234 
00235 #endif // __nsSchemaLoader_h__