b=266085, nsIWritablePropertyBag interface and hashtable component implementation; r=darin,sr=shaver

This commit is contained in:
vladimir%pobox.com 2004-11-24 23:21:14 +00:00
parent a65d6fbe1c
commit 86363e20d8
7 changed files with 286 additions and 2 deletions

View File

@ -91,6 +91,7 @@
#include "nsNativeCharsetUtils.h"
#include "nsComponentManagerObsolete.h"
#include "nsInterfaceRequestorAgg.h"
#include "nsHashPropertyBag.h"
void XXXNeverCalled()
{
@ -195,4 +196,5 @@ void XXXNeverCalled()
nsServiceManager::GetGlobalServiceManager(nsnull);
}
NS_NewInterfaceRequestorAggregation(nsnull, nsnull, nsnull);
NS_NewHashPropertyBag(nsnull);
}

View File

@ -170,5 +170,12 @@
{ 0xA9, 0x43, 0xB0, 0x23, 0x34, 0xA6, 0xD0, 0x83 } }
#define NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID "@mozilla.org/supports-interface-pointer;1"
/**
* nsHashPropertyBag impl of nsIWritablePropertyBag
*/
#define NS_HASH_PROPERTY_BAG_CID \
{ 0x678c50b8, 0x6bcb, 0x4ad0, \
{ 0xb9, 0xb8, 0xc8, 0x11, 0x75, 0x95, 0x51, 0x99 } }
#define NS_HASH_PROPERTY_BAG_CONTRACTID "@mozilla.org/hash-property-bag;1"
#endif

View File

@ -103,6 +103,8 @@
#include "nsTraceRefcnt.h"
#include "nsTimelineService.h"
#include "nsHashPropertyBag.h"
#include "nsVariant.h"
#ifdef GC_LEAK_DETECTOR
@ -192,6 +194,8 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsRecyclingAllocatorImpl)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimelineService)
#endif
NS_GENERIC_FACTORY_CONSTRUCTOR(nsHashPropertyBag)
static NS_METHOD
nsXPTIInterfaceInfoManagerGetSingleton(nsISupports* outer,
const nsIID& aIID,
@ -378,6 +382,9 @@ static const nsModuleComponentInfo components[] = {
COMPONENT(INTERFACEINFOMANAGER_SERVICE, nsXPTIInterfaceInfoManagerGetSingleton),
COMPONENT(RECYCLINGALLOCATOR, nsRecyclingAllocatorImplConstructor),
#define NS_HASH_PROPERTY_BAG_CLASSNAME "Hashtable Property Bag"
COMPONENT(HASH_PROPERTY_BAG, nsHashPropertyBagConstructor),
};
#undef COMPONENT

View File

@ -88,6 +88,7 @@ CPPSRCS = \
nsCOMArray.cpp \
nsArray.cpp \
nsArrayEnumerator.cpp \
nsHashPropertyBag.cpp \
$(NULL)
EXPORTS = \
@ -130,6 +131,7 @@ EXPORTS = \
nsCOMArray.h \
nsStringEnumerator.h \
nsAutoBuffer.h \
nsHashPropertyBag.h \
$(NULL)
XPIDLSRCS = \

181
xpcom/ds/nsHashPropertyBag.cpp Executable file
View File

@ -0,0 +1,181 @@
/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** 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 Oracle Corporation code.
*
* The Initial Developer of the Original Code is
* Oracle Corporation
* Portions created by the Initial Developer are Copyright (C) 2004
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
*
* 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 "nsHashPropertyBag.h"
#include "nsArray.h"
#include "nsArrayEnumerator.h"
nsresult
NS_NewHashPropertyBag(nsIWritablePropertyBag* *_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
nsHashPropertyBag *hpb = new nsHashPropertyBag();
if (!hpb)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*_retval = hpb);
return NS_OK;
}
/*
* nsHashPropertyBag impl
*/
NS_IMPL_ISUPPORTS2(nsHashPropertyBag, nsIWritablePropertyBag, nsIPropertyBag)
NS_IMETHODIMP
nsHashPropertyBag::GetProperty(const nsAString& name, nsIVariant* *_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
if (!mPropertyHash.IsInitialized())
return NS_ERROR_FAILURE;
PRBool isFound = mPropertyHash.Get(name, _retval);
if (!isFound)
return NS_ERROR_FAILURE;
return NS_OK;
}
NS_IMETHODIMP
nsHashPropertyBag::SetProperty(const nsAString& name, nsIVariant *value)
{
NS_ENSURE_ARG_POINTER(value);
if (!mPropertyHash.IsInitialized()) {
// we can only assume that Init will fail only due to OOM.
if (!mPropertyHash.Init())
return NS_ERROR_OUT_OF_MEMORY;
}
PRBool success = mPropertyHash.Put(name, value);
if (!success)
return NS_ERROR_FAILURE;
return NS_OK;
}
NS_IMETHODIMP
nsHashPropertyBag::DeleteProperty(const nsAString& name)
{
if (!mPropertyHash.IsInitialized())
return NS_ERROR_FAILURE;
// is it too much to ask for ns*Hashtable to return
// a boolean indicating whether RemoveEntry succeeded
// or not?!?!
PRBool isFound = mPropertyHash.Get(name, nsnull);
if (!isFound)
return NS_ERROR_FAILURE;
// then from the hash
mPropertyHash.Remove(name);
return NS_OK;
}
//
// nsSimpleProperty class and impl; used for GetEnumerator
//
class nsSimpleProperty : public nsIProperty {
public:
nsSimpleProperty(const nsAString& aName, nsIVariant* aValue)
: mName(aName), mValue(aValue)
{
}
NS_DECL_ISUPPORTS
NS_DECL_NSIPROPERTY
protected:
nsString mName;
nsCOMPtr<nsIVariant> mValue;
};
NS_IMPL_ISUPPORTS1(nsSimpleProperty, nsIProperty)
NS_IMETHODIMP
nsSimpleProperty::GetName(nsAString& aName)
{
aName.Assign(mName);
return NS_OK;
}
NS_IMETHODIMP
nsSimpleProperty::GetValue(nsIVariant* *aValue)
{
NS_ENSURE_ARG_POINTER(aValue);
NS_IF_ADDREF(*aValue = mValue);
return NS_OK;
}
// end nsSimpleProperty
PR_STATIC_CALLBACK(PLDHashOperator)
PropertyHashToArrayFunc (const nsAString &aKey,
nsIVariant* aData,
void *userArg)
{
nsIMutableArray *propertyArray =
NS_STATIC_CAST(nsIMutableArray *, userArg);
nsSimpleProperty *sprop = new nsSimpleProperty(aKey, aData);
propertyArray->AppendElement(sprop, PR_FALSE);
return PL_DHASH_NEXT;
}
NS_IMETHODIMP
nsHashPropertyBag::GetEnumerator(nsISimpleEnumerator* *_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
nsresult rv;
nsCOMPtr<nsIMutableArray> propertyArray;
rv = NS_NewArray (getter_AddRefs(propertyArray));
if (NS_FAILED(rv))
return rv;
mPropertyHash.EnumerateRead(PropertyHashToArrayFunc, propertyArray.get());
return NS_NewArrayEnumerator(_retval, propertyArray);
}

70
xpcom/ds/nsHashPropertyBag.h Executable file
View File

@ -0,0 +1,70 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** 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 Oracle Corporation code.
*
* The Initial Developer of the Original Code is
* Oracle Corporation
* Portions created by the Initial Developer are Copyright (C) 2004
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
*
* 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 nsHashPropertyBag_h___
#define nsHashPropertyBag_h___
#include "nsCOMPtr.h"
#include "nsCOMArray.h"
#include "nsVoidArray.h"
#include "nsIPropertyBag.h"
#include "nsInterfaceHashtable.h"
class nsHashPropertyBag : public nsIWritablePropertyBag
{
public:
nsHashPropertyBag() { }
NS_DECL_ISUPPORTS
NS_DECL_NSIPROPERTYBAG
NS_DECL_NSIWRITABLEPROPERTYBAG
protected:
// a hash table of string -> nsIVariant
nsInterfaceHashtable<nsStringHashKey, nsIVariant> mPropertyHash;
};
// Note: NS_NewHashPropertyBag returns a HPB that
// uses a non-thread-safe internal hash
extern "C" NS_COM nsresult
NS_NewHashPropertyBag(nsIWritablePropertyBag* *_retval);
#endif /* nsHashPropertyBag_h___ */

View File

@ -67,11 +67,26 @@ interface nsIPropertyBag : nsISupports
/**
* Get a property value for the given name.
* @return NS_ERROR_FAILURE if a property with that name doesn't
* @throws NS_ERROR_FAILURE if a property with that name doesn't
* exist.
*/
nsIVariant getProperty(in AString name);
};
// We can add nsIWritableProperty and nsIWritablePropertyBag when we need them.
[scriptable, uuid(96fc4671-eeb4-4823-9421-e50fb70ad353)]
interface nsIWritablePropertyBag : nsIPropertyBag
{
/**
* Set a property with the given name to the given value. If
* a property already exists with the given name, it is
* overwritten.
*/
void setProperty(in AString name, in nsIVariant value);
/**
* Delete a property with the given name.
* @throws NS_ERROR_FAILURE if a property with that name doesn't
* exist.
*/
void deleteProperty(in AString name);
};