diff --git a/mozilla/xpcom/build/nsXPComInit.cpp b/mozilla/xpcom/build/nsXPComInit.cpp index 4d39e68c0cc..88d0bebe474 100644 --- a/mozilla/xpcom/build/nsXPComInit.cpp +++ b/mozilla/xpcom/build/nsXPComInit.cpp @@ -60,6 +60,7 @@ #include "nsSupportsArray.h" #include "nsArray.h" +#include "nsINIParserImpl.h" #include "nsSupportsPrimitives.h" #include "nsConsoleService.h" #include "nsExceptionService.h" @@ -139,6 +140,7 @@ extern void _FreeAutoLockStatics(); static NS_DEFINE_CID(kComponentManagerCID, NS_COMPONENTMANAGER_CID); static NS_DEFINE_CID(kMemoryCID, NS_MEMORY_CID); static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID); +static NS_DEFINE_CID(kINIParserFactoryCID, NS_INIPARSERFACTORY_CID); NS_GENERIC_FACTORY_CONSTRUCTOR(nsProcess) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsEventQueueServiceImpl, Init) @@ -593,6 +595,13 @@ nsresult NS_COM NS_InitXPCOM3(nsIServiceManager* *result, if (registrar) { for (int i = 0; i < components_length; i++) RegisterGenericFactory(registrar, &components[i]); + + nsCOMPtr iniParserFactory(new nsINIParserFactory()); + if (iniParserFactory) + registrar->RegisterFactory(kINIParserFactoryCID, + "nsINIParserFactory", + NS_INIPARSERFACTORY_CONTRACTID, + iniParserFactory); } rv = nsComponentManagerImpl::gComponentManager->ReadPersistentRegistry(); #ifdef DEBUG diff --git a/mozilla/xpcom/ds/Makefile.in b/mozilla/xpcom/ds/Makefile.in index 638cfd09a3d..f14ee2f8061 100644 --- a/mozilla/xpcom/ds/Makefile.in +++ b/mozilla/xpcom/ds/Makefile.in @@ -64,6 +64,7 @@ CPPSRCS = \ nsFixedSizeAllocator.cpp \ nsHashSets.cpp \ nsHashtable.cpp \ + nsINIParserImpl.cpp \ nsObserverList.cpp \ nsObserverService.cpp \ nsProperties.cpp \ @@ -127,6 +128,7 @@ XPIDLSRCS = \ nsIAtomService.idl \ nsICollection.idl \ nsIEnumerator.idl \ + nsIINIParser.idl \ nsIPersistentProperties2.idl \ nsIProperty.idl \ nsIPropertyBag.idl \ diff --git a/mozilla/xpcom/ds/nsIINIParser.idl b/mozilla/xpcom/ds/nsIINIParser.idl new file mode 100644 index 00000000000..fd3e38920a5 --- /dev/null +++ b/mozilla/xpcom/ds/nsIINIParser.idl @@ -0,0 +1,69 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla XPCOM. + * + * The Initial Developer of the Original Code is + * Benjamin Smedberg + * + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Mozilla Foundation . All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsISupports.idl" + +interface nsIUTF8StringEnumerator; +interface nsILocalFile; + +[scriptable, uuid(7eb955f6-3e78-4d39-b72f-c1bf12a94bce)] +interface nsIINIParser : nsISupports +{ + /** + * Enumerates the [section]s available in the INI file. + */ + nsIUTF8StringEnumerator getSections(); + + /** + * Enumerates the keys available within a section. + */ + nsIUTF8StringEnumerator getKeys(in AUTF8String aSection); + + /** + * Get the value of a string for a particular section and key. + */ + AUTF8String getString(in AUTF8String aSection, in AUTF8String aKey); +}; + +[scriptable, uuid(ccae7ea5-1218-4b51-aecb-c2d8ecd46af9)] +interface nsIINIParserFactory : nsISupports +{ + /** + * Create an iniparser instance from a local file. + */ + nsIINIParser createINIParser(in nsILocalFile aINIFile); +}; diff --git a/mozilla/xpcom/ds/nsINIParserImpl.cpp b/mozilla/xpcom/ds/nsINIParserImpl.cpp new file mode 100644 index 00000000000..04c3ba180a6 --- /dev/null +++ b/mozilla/xpcom/ds/nsINIParserImpl.cpp @@ -0,0 +1,166 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla XPCOM. + * + * The Initial Developer of the Original Code is + * Benjamin Smedberg + * + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Mozilla Foundation . All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsINIParserImpl.h" + +#include "nsILocalFile.h" + +#include "nsINIParser.h" +#include "nsStringEnumerator.h" +#include "nsVoidArray.h" + +class nsINIParserImpl : + public nsIINIParser +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIINIPARSER + + nsresult Init(nsILocalFile* aINIFile) { + return mParser.Init(aINIFile); + } + +private: + nsINIParser mParser; +}; + +NS_IMPL_ISUPPORTS2(nsINIParserFactory, + nsIINIParserFactory, + nsIFactory) + +NS_IMETHODIMP +nsINIParserFactory::CreateINIParser(nsILocalFile* aINIFile, + nsIINIParser* *aResult) +{ + *aResult = nsnull; + + nsCOMPtr p(new nsINIParserImpl()); + if (!p) + return NS_ERROR_OUT_OF_MEMORY; + + nsresult rv = p->Init(aINIFile); + + if (NS_SUCCEEDED(rv)) + NS_ADDREF(*aResult = p); + + return rv; +} + +NS_IMETHODIMP +nsINIParserFactory::CreateInstance(nsISupports* aOuter, + REFNSIID aIID, + void **aResult) +{ + NS_ENSURE_NO_AGGREGATION(aOuter); + + // We are our own singleton. + return QueryInterface(aIID, aResult); +} + +NS_IMETHODIMP +nsINIParserFactory::LockFactory(PRBool aLock) +{ + return NS_OK; +} + +NS_IMPL_ISUPPORTS1(nsINIParserImpl, + nsIINIParser) + +static PRBool +SectionCB(const char* aSection, void *aClosure) +{ + nsCStringArray *strings = NS_STATIC_CAST(nsCStringArray*, aClosure); + + strings->AppendCString(nsDependentCString(aSection)); + return PR_TRUE; +} + +NS_IMETHODIMP +nsINIParserImpl::GetSections(nsIUTF8StringEnumerator* *aResult) +{ + nsCStringArray *strings = new nsCStringArray; + if (!strings) + return NS_ERROR_OUT_OF_MEMORY; + + nsresult rv = mParser.GetSections(SectionCB, strings); + if (NS_SUCCEEDED(rv)) + rv = NS_NewUTF8StringEnumerator(aResult, strings); + + if (NS_FAILED(rv)) + delete strings; + + return rv; +} + +static PRBool +KeyCB(const char* aKey, const char *aValue, void *aClosure) +{ + nsCStringArray *strings = NS_STATIC_CAST(nsCStringArray*, aClosure); + + strings->AppendCString(nsDependentCString(aKey)); + return PR_TRUE; +} + +NS_IMETHODIMP +nsINIParserImpl::GetKeys(const nsACString& aSection, + nsIUTF8StringEnumerator* *aResult) +{ + nsCStringArray *strings = new nsCStringArray; + if (!strings) + return NS_ERROR_OUT_OF_MEMORY; + + nsresult rv = mParser.GetStrings(PromiseFlatCString(aSection).get(), + KeyCB, strings); + if (NS_SUCCEEDED(rv)) + rv = NS_NewUTF8StringEnumerator(aResult, strings); + + if (NS_FAILED(rv)) + delete strings; + + return rv; + +} + +NS_IMETHODIMP +nsINIParserImpl::GetString(const nsACString& aSection, + const nsACString& aKey, + nsACString& aResult) +{ + return mParser.GetString(PromiseFlatCString(aSection).get(), + PromiseFlatCString(aKey).get(), + aResult); +} diff --git a/mozilla/xpcom/ds/nsINIParserImpl.h b/mozilla/xpcom/ds/nsINIParserImpl.h new file mode 100644 index 00000000000..ef16c3b5994 --- /dev/null +++ b/mozilla/xpcom/ds/nsINIParserImpl.h @@ -0,0 +1,61 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla XPCOM. + * + * The Initial Developer of the Original Code is + * Benjamin Smedberg + * + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Mozilla Foundation . All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsINIParserImpl_h__ +#define nsINIParserImpl_h__ + +#include "nsIINIParser.h" +#include "nsIFactory.h" + +#define NS_INIPARSERFACTORY_CID \ +{ 0xdfac10a9, 0xdd24, 0x43cf, \ + { 0xa0, 0x95, 0x6f, 0xfa, 0x2e, 0x4b, 0x6a, 0x6c } } + +#define NS_INIPARSERFACTORY_CONTRACTID \ + "@mozilla.org/xpcom/ini-parser-factory;1" + +class nsINIParserFactory : + public nsIINIParserFactory, + public nsIFactory +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIINIPARSERFACTORY + NS_DECL_NSIFACTORY +}; + +#endif // nsINIParserImpl_h__