mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-29 07:42:04 +00:00
b=266085, nsIWritablePropertyBag interface and hashtable component implementation; r=darin,sr=shaver
This commit is contained in:
parent
a65d6fbe1c
commit
86363e20d8
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
181
xpcom/ds/nsHashPropertyBag.cpp
Executable 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
70
xpcom/ds/nsHashPropertyBag.h
Executable 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___ */
|
@ -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);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user