Closed Bug 241975 Opened 20 years ago Closed 20 years ago

nsSOAPPropertyBag cleanup

Categories

(Core Graveyard :: Web Services, defect)

defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: keeda, Assigned: keeda)

Details

Attachments

(2 files, 2 obsolete files)

.
Attached patch Cleanup (obsolete) — Splinter Review
- Use nsCOMArray
- Use nsInterfaceHashtable
- Kill redundant member variable
- Make a method non-virtual
Comment on attachment 147242 [details] [diff] [review]
Cleanup

peterv, you've been doing similar stuff in schema recently... would you please
look at this?
Attachment #147242 - Flags: review?(peterv)
Comment on attachment 147242 [details] [diff] [review]
Cleanup

> nsSOAPPropertyBagMutator::nsSOAPPropertyBagMutator()
> {
>-  mBag = mSOAPBag = new nsSOAPPropertyBag();
>+  mSOAPBag = new nsSOAPPropertyBag();
> }
...
> NS_IMETHODIMP nsSOAPPropertyBagMutator::GetPropertyBag(nsIPropertyBag ** aPropertyBag) {
>   NS_ENSURE_ARG_POINTER(aPropertyBag);
>-  *aPropertyBag = mBag;
>+  *aPropertyBag = mSOAPBag;
>   NS_IF_ADDREF(*aPropertyBag);
>   return NS_OK;
> }

The idl interface says that propertyBag "will never be null"
<http://lxr.mozilla.org/seamonkey/source/extensions/webservices/public/nsISOAPP
ropertyBagMutator.idl#54>. Would you consider adding an nsresult
nsSOAPPropertyBagMutator::Init method, moving the mSOAPBag construction into it
and changing
http://lxr.mozilla.org/seamonkey/source/extensions/webservices/build/src/nsWebS
ervicesModule.cpp#80
< NS_GENERIC_FACTORY_CONSTRUCTOR(nsSOAPPropertyBagMutator)
> NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsSOAPPropertyBagMutator, Init)
?

Then you can fix GetPropertyBag to NS_ADDREF per contract.
Attached patch What timeless said ... (obsolete) — Splinter Review
Attachment #147242 - Attachment is obsolete: true
Attachment #147242 - Flags: review?(peterv)
Attachment #147292 - Flags: review?(peterv)
Comment on attachment 147292 [details] [diff] [review]
What timeless said ...

>Index: soap/src/nsSOAPPropertyBag.cpp
>===================================================================

>+nsSOAPPropertyBag::nsSOAPPropertyBag()
> {
>-  /* property initializers and constructor code */
>+  mProperties.Init();

Since this can fail you should probably create nsSOAPPropertyBag::Init and make
that return NS_ERROR_FAILURE if Init returns PR_FALSE. And change
NS_GENERIC_FACTORY_CONSTRUCTOR to _INIT and make nsSOAPPropertyBagMutator::Init
call nsSOAPPropertyBag::Init.


>+nsresult
>     nsSOAPPropertyBag::SetProperty(const nsAString & aName,
>                                    nsIVariant * aValue)
> {
>   NS_ENSURE_ARG_POINTER(&aName);

Bah, remove that.


>+PLDHashOperator PR_CALLBACK PropertyBagEnumFunc(const nsAString& aKey, nsIVariant *aData, void *aClosure)
> {

>+  nsCOMArray<nsIProperty>* properties =
>+      NS_STATIC_CAST(nsCOMArray<nsIProperty>*, aClosure);
>+  properties->AppendObject(new nsSOAPProperty(aKey, aData));

Maybe we should check for failure here and return PL_DHASH_STOP in that case?

>+nsSOAPPropertyBagEnumerator::nsSOAPPropertyBagEnumerator(nsSOAPPropertyBag * aPropertyBag) : mCurrent(0)
> {
>-  aPropertyBag->mProperties->Enumerate(&PropertyBagEnumFunc, mProperties);
>+  aPropertyBag->mProperties.EnumerateRead(PropertyBagEnumFunc, &mProperties);

Which means this call would move to nsSOAPPropertyBagEnumerator::Init and you'd
need to compare the count it returns to aPropertyBag->mProperties.Count().

> NS_IMETHODIMP nsSOAPPropertyBagEnumerator::GetNext(nsISupports ** aItem)
> {

>-    *aItem = mProperties->ElementAt(mCurrent++);
>+    NS_ADDREF(*aItem = mProperties[mCurrent++]);

Technically this needs to QI to nsISupports, though we know it's alright cause
mProperties contains  nsSOAPProperty's. Maybe mProperties can just be
nsCOMArray<nsISupports> after all?

>@@ -191,8 +172,7 @@
>     nsSOAPPropertyBagEnumerator::HasMoreElements(PRBool * aResult)
> {
>   NS_ENSURE_ARG_POINTER(aResult);
>-  PRUint32 count;
>-  mProperties->Count(&count);
>+  PRUint32 count = mProperties.Count();
>   *aResult = mCurrent < count;

I'd just do

  *aResult = mCurrent < mProperties.Count();
- Sprinkled Init() in places where hashtables need to be inited.
- Handle erros from Init(), and during enumeration.
- Use nsCOMArray<nsISupports> to avoid casts.
- Fix stupid string param checks.
- Cleanup some more whitespace/formatting etc. where
  I am touching code anyway.

Only nsSOAPPropertyBagMutator has an xpcom factory constructor, so,
the other two dont need any changes in nsWebServicesModule.cpp
Attachment #147292 - Attachment is obsolete: true
Attachment #147382 - Flags: review?(peterv)
Comment on attachment 147382 [details] [diff] [review]
This should fix those issues

>Index: soap/src/nsSOAPPropertyBag.cpp
>===================================================================

> /* readonly attribute nsISimpleEnumerator enumerator; */
> NS_IMETHODIMP
>-    nsSOAPPropertyBag::GetEnumerator(nsISimpleEnumerator * *aEnumerator)
>+nsSOAPPropertyBag::GetEnumerator(nsISimpleEnumerator * *aEnumerator)
> {
>   NS_ENSURE_ARG_POINTER(aEnumerator);

>+
>+  nsSOAPPropertyBagEnumerator* enumerator = new nsSOAPPropertyBagEnumerator();
>+  NS_ENSURE_TRUE(enumerator, NS_ERROR_OUT_OF_MEMORY);
>+
>+  if (!enumerator->Init(this)) {
>+    delete enumerator;

I'd just make enumerator a nsRefPtr<nsSOAPPropertyBagEnumerator>. Either way,
r=peterv.
Attachment #147382 - Flags: review?(peterv) → review+
Comment on attachment 147382 [details] [diff] [review]
This should fix those issues

sr=jst
Attachment #147382 - Flags: superreview+
Attachment #147292 - Flags: review?(peterv)
Checked in with peterv's refptr suggestion.
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: