From da806f7878f1396afe77f445bcae5cc7a347a43e Mon Sep 17 00:00:00 2001 From: "warren%netscape.com" Date: Sat, 22 Jul 2000 05:38:43 +0000 Subject: [PATCH] Added nsIErrorService to map from nsresult codes to string bundles and keys for error messages. git-svn-id: svn://10.0.0.236/trunk@74636 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/base/nsErrorService.cpp | 142 +++++++++++++++++++++++++ mozilla/xpcom/base/nsErrorService.h | 60 +++++++++++ mozilla/xpcom/base/nsIErrorService.idl | 85 +++++++++++++++ 3 files changed, 287 insertions(+) create mode 100644 mozilla/xpcom/base/nsErrorService.cpp create mode 100644 mozilla/xpcom/base/nsErrorService.h create mode 100644 mozilla/xpcom/base/nsIErrorService.idl diff --git a/mozilla/xpcom/base/nsErrorService.cpp b/mozilla/xpcom/base/nsErrorService.cpp new file mode 100644 index 00000000000..6c5b9b7ab26 --- /dev/null +++ b/mozilla/xpcom/base/nsErrorService.cpp @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape 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/NPL/ + * + * 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.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#include "nsErrorService.h" +#include "nsCRT.h" + +static void* +CloneCString(nsHashKey *aKey, void *aData, void* closure) +{ + return nsCRT::strdup((const char*)aData); +} + +static PRBool +DeleteCString(nsHashKey *aKey, void *aData, void* closure) +{ + nsCRT::free((char*)aData); + return PR_TRUE; +} + +nsInt2StrHashtable::nsInt2StrHashtable() + : mHashtable(CloneCString, nsnull, DeleteCString, nsnull, 16) +{ +} + +nsInt2StrHashtable::~nsInt2StrHashtable() +{ +} + +nsresult +nsInt2StrHashtable::Put(PRUint32 key, const char* aData) +{ + char* value = nsCRT::strdup(aData); + if (value == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + nsVoidKey k((void*)key); + char* oldValue = (char*)mHashtable.Put(&k, value); + if (oldValue) + nsCRT::free(oldValue); + return NS_OK; +} + +char* +nsInt2StrHashtable::Get(PRUint32 key) +{ + nsVoidKey k((void*)key); + const char* value = (const char*)mHashtable.Get(&k); + if (value == nsnull) + return nsnull; + return nsCRT::strdup(value); +} + +nsresult +nsInt2StrHashtable::Remove(PRUint32 key) +{ + nsVoidKey k((void*)key); + char* oldValue = (char*)mHashtable.Remove(&k); + if (oldValue) + nsCRT::free(oldValue); + return NS_OK; +} + +//////////////////////////////////////////////////////////////////////////////// + +NS_IMPL_ISUPPORTS1(nsErrorService, nsIErrorService) + +NS_METHOD +nsErrorService::Create(nsISupports* outer, const nsIID& aIID, void* *aInstancePtr) +{ + NS_ENSURE_NO_AGGREGATION(outer); + nsErrorService* serv = new nsErrorService(); + if (serv == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(serv); + nsresult rv = serv->QueryInterface(aIID, aInstancePtr); + NS_RELEASE(serv); + return rv; +} + +NS_IMETHODIMP +nsErrorService::RegisterErrorStringBundle(PRInt16 errorModule, const char *stringBundleURL) +{ + return mErrorStringBundleURLMap.Put(errorModule, stringBundleURL); +} + +NS_IMETHODIMP +nsErrorService::UnregisterErrorStringBundle(PRInt16 errorModule) +{ + return mErrorStringBundleURLMap.Remove(errorModule); +} + +NS_IMETHODIMP +nsErrorService::GetErrorStringBundle(PRInt16 errorModule, char **result) +{ + char* value = mErrorStringBundleURLMap.Get(errorModule); + if (value == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + *result = value; + return NS_OK; +} + +NS_IMETHODIMP +nsErrorService::RegisterErrorStringBundleKey(nsresult error, const char *stringBundleKey) +{ + return mErrorStringBundleKeyMap.Put(NS_ERROR_GET_CODE(error), stringBundleKey); +} + +NS_IMETHODIMP +nsErrorService::UnregisterErrorStringBundleKey(nsresult error) +{ + return mErrorStringBundleKeyMap.Remove(NS_ERROR_GET_CODE(error)); +} + +NS_IMETHODIMP +nsErrorService::GetErrorStringBundleKey(nsresult error, char **result) +{ + char* value = mErrorStringBundleKeyMap.Get(NS_ERROR_GET_CODE(error)); + if (value == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + *result = value; + return NS_OK; +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/xpcom/base/nsErrorService.h b/mozilla/xpcom/base/nsErrorService.h new file mode 100644 index 00000000000..6424f115cb4 --- /dev/null +++ b/mozilla/xpcom/base/nsErrorService.h @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape 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/NPL/ + * + * 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.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#ifndef nsErrorService_h__ +#define nsErrorService_h__ + +#include "nsIErrorService.h" +#include "nsHashtable.h" + +class nsInt2StrHashtable +{ +public: + nsInt2StrHashtable(); + virtual ~nsInt2StrHashtable(); + + nsresult Put(PRUint32 key, const char* aData); + char* Get(PRUint32 key); + nsresult Remove(PRUint32 key); + +protected: + nsObjectHashtable mHashtable; +}; + +class nsErrorService : public nsIErrorService +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIERRORSERVICE + + nsErrorService() { NS_INIT_ISUPPORTS(); } + virtual ~nsErrorService() {} + + static NS_METHOD + Create(nsISupports* outer, const nsIID& aIID, void* *aInstancePtr); + +protected: + nsInt2StrHashtable mErrorStringBundleURLMap; + nsInt2StrHashtable mErrorStringBundleKeyMap; +}; + +#endif // nsErrorService_h__ diff --git a/mozilla/xpcom/base/nsIErrorService.idl b/mozilla/xpcom/base/nsIErrorService.idl new file mode 100644 index 00000000000..28fa031a6ff --- /dev/null +++ b/mozilla/xpcom/base/nsIErrorService.idl @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape 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/NPL/ + * + * 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.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#include "nsISupports.idl" + +/** + * nsIErrorService: This is an interim service that allows nsresult codes to be mapped to + * string bundles that can be used to look up error messages. String bundle keys can also + * be mapped. + * + * This service will eventually get replaced by extending xpidl to allow errors to be defined. + * (http://bugzilla.mozilla.org/show_bug.cgi?id=13423). + */ +[scriptable, uuid(e72f94b2-5f85-11d4-9877-00c04fa0cf4a)] +interface nsIErrorService : nsISupports +{ + /** + * Registers a string bundle URL for an error module. Error modules are obtained from + * nsresult code with NS_ERROR_GET_MODULE. + */ + void registerErrorStringBundle(in short errorModule, in string stringBundleURL); + + /** + * Registers a string bundle URL for an error module. + */ + void unregisterErrorStringBundle(in short errorModule); + + /** + * Retrieves a string bundle URL for an error module. + */ + string getErrorStringBundle(in short errorModule); + + /** + * Registers a key in a string bundle for an nsresult error code. Only the code portion + * of the nsresult is used (obtained with NS_ERROR_GET_CODE) in this registration. The + * string bundle key is used to look up internationalized messages in the string bundle. + */ + void registerErrorStringBundleKey(in nsresult error, in string stringBundleKey); + + /** + * Unregisters a key in a string bundle for an nsresult error code. + */ + void unregisterErrorStringBundleKey(in nsresult error); + + /** + * Retrieves a key in a string bundle for an nsresult error code. If no key is registered + * for the specified nsresult's code (obtained with NS_ERROR_GET_CODE), then the stringified + * version of the nsresult code is returned. + */ + string getErrorStringBundleKey(in nsresult error); +}; + +%{C++ + +// The global nsIErrorService: +#define NS_ERRORSERVICE_NAME "Error Service" +#define NS_ERRORSERVICE_PROGID "component://netscape/xpcom/error-service" +#define NS_ERRORSERVICE_CID \ +{ /* 744afd5e-5f8c-11d4-9877-00c04fa0cf4a */ \ + 0x744afd5e, \ + 0x5f8c, \ + 0x11d4, \ + {0x98, 0x77, 0x00, 0xc0, 0x4f, 0xa0, 0xcf, 0x4a} \ +} + +%}