Patch provided by jst@netscape.com - Give XPTCVariants that are expected to receive a T_DOMSTRING value an nsAString object to hold the string value. b=193387, r=harishd@netscape.com, sr=heikki@netscape.com

This commit is contained in:
harishd%netscape.com 2003-03-25 02:37:05 +00:00
parent 39a4e26773
commit d65385c037
6 changed files with 116 additions and 26 deletions

View File

@ -240,10 +240,16 @@ WSPCallContext::CallCompletionListener()
dp->val.p = nsnull; dp->val.p = nsnull;
} }
PRUint32 headerCount, bodyCount; PRUint32 headerCount = 0, bodyCount = 0;
nsISOAPHeaderBlock** headerBlocks; nsISOAPHeaderBlock** headerBlocks;
nsISOAPParameter** bodyBlocks; nsISOAPParameter** bodyBlocks;
#define STRING_ARRAY_BUF_SIZE 2
nsAutoString string_array_buf[STRING_ARRAY_BUF_SIZE];
nsAutoString *string_array = &string_array_buf[0];
PRUint32 string_array_index = 0;
// If we have an exception, report it now // If we have an exception, report it now
if (mException) { if (mException) {
dispatchParams[0].val.p = NS_STATIC_CAST(nsIException*, mException); dispatchParams[0].val.p = NS_STATIC_CAST(nsIException*, mException);
@ -363,6 +369,30 @@ WSPCallContext::CallCompletionListener()
"WSDL/IInfo param count mismatch"); "WSDL/IInfo param count mismatch");
const nsXPTParamInfo& paramInfo = methodInfo->GetParam(paramIndex); const nsXPTParamInfo& paramInfo = methodInfo->GetParam(paramIndex);
if (XPT_TDP_TAG(paramInfo.type.prefix) == TD_DOMSTRING) {
// If there's no more room in the string buffer on the stack
// for this parameter, allocate an array on the heap.
if (string_array == &string_array_buf[0] &&
string_array_index >= STRING_ARRAY_BUF_SIZE) {
string_array = new nsAutoString[partCount - i];
if (!string_array) {
rv = NS_ERROR_OUT_OF_MEMORY;
goto call_completion_end;
}
// Reset string_array_index now that we switched arrays.
string_array_index = 0;
}
// Give the variant value a nsAString object to hold the data
// in.
vars->val.p =
NS_STATIC_CAST(nsAString *, &string_array[string_array_index++]);
}
rv = WSPProxy::VariantToInParameter(listenerInterfaceInfo, rv = WSPProxy::VariantToInParameter(listenerInterfaceInfo,
mListenerMethodIndex, &paramInfo, mListenerMethodIndex, &paramInfo,
value, vars); value, vars);
@ -395,6 +425,10 @@ call_completion_end:
if(dispatchParams != paramBuffer) { if(dispatchParams != paramBuffer) {
delete [] dispatchParams; delete [] dispatchParams;
} }
if (string_array != &string_array_buf[0]) {
delete [] string_array;
}
nsCOMPtr<nsIWebServiceCallContext> kungFuDeathGrip(this); nsCOMPtr<nsIWebServiceCallContext> kungFuDeathGrip(this);
mProxy->CallCompleted(this); mProxy->CallCompleted(this);
NS_RELEASE(mProxy); NS_RELEASE(mProxy);

View File

@ -39,6 +39,8 @@
* ***** END LICENSE BLOCK ***** */ * ***** END LICENSE BLOCK ***** */
#include "wspprivate.h" #include "wspprivate.h"
#include "nsIXPConnect.h"
#include "jsapi.h"
WSPPropertyBagWrapper::WSPPropertyBagWrapper() WSPPropertyBagWrapper::WSPPropertyBagWrapper()
@ -105,20 +107,20 @@ WSPPropertyBagWrapper::CallMethod(PRUint16 methodIndex,
const nsXPTMethodInfo* info, const nsXPTMethodInfo* info,
nsXPTCMiniVariant* params) nsXPTCMiniVariant* params)
{ {
nsresult rv = NS_OK;
nsAutoString propName;
nsCOMPtr<nsIVariant> val;
if (methodIndex < 3) { if (methodIndex < 3) {
NS_ERROR("WSPPropertyBagWrapper: bad method index"); NS_ERROR("WSPPropertyBagWrapper: bad method index");
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsresult rv = NS_OK;
nsAutoString propName;
rv = WSPFactory::C2XML(nsDependentCString(info->GetName()), propName); rv = WSPFactory::C2XML(nsDependentCString(info->GetName()), propName);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return rv; return rv;
} }
nsCOMPtr<nsIVariant> val;
rv = mPropertyBag->GetProperty(propName, getter_AddRefs(val)); rv = mPropertyBag->GetProperty(propName, getter_AddRefs(val));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return rv; return rv;

View File

@ -837,16 +837,25 @@ WSPProxy::VariantToInParameter(nsIInterfaceInfo* aInterfaceInfo,
return VariantToArrayValue(arrayType.TagPart(), aXPTCVariant, return VariantToArrayValue(arrayType.TagPart(), aXPTCVariant,
iinfo, aVariant); iinfo, aVariant);
} }
else { // else
if (type.IsInterfacePointer()) { if (type.IsInterfacePointer()) {
rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo, rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo,
getter_AddRefs(iinfo)); getter_AddRefs(iinfo));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return rv; return rv;
}
} }
return VariantToValue(type_tag, &aXPTCVariant->val, iinfo, aVariant);
} }
if (type_tag == nsXPTType::T_DOMSTRING) {
// T_DOMSTRING values are expected to be stored in an nsAString
// object pointed to by the nsXPTCVariant...
return VariantToValue(type_tag, aXPTCVariant->val.p, iinfo, aVariant);
}
// else
// ... but other types are expected to be stored directly in the
// variant itself.
return VariantToValue(type_tag, &aXPTCVariant->val, iinfo, aVariant);
} }
nsresult nsresult

View File

@ -240,10 +240,16 @@ WSPCallContext::CallCompletionListener()
dp->val.p = nsnull; dp->val.p = nsnull;
} }
PRUint32 headerCount, bodyCount; PRUint32 headerCount = 0, bodyCount = 0;
nsISOAPHeaderBlock** headerBlocks; nsISOAPHeaderBlock** headerBlocks;
nsISOAPParameter** bodyBlocks; nsISOAPParameter** bodyBlocks;
#define STRING_ARRAY_BUF_SIZE 2
nsAutoString string_array_buf[STRING_ARRAY_BUF_SIZE];
nsAutoString *string_array = &string_array_buf[0];
PRUint32 string_array_index = 0;
// If we have an exception, report it now // If we have an exception, report it now
if (mException) { if (mException) {
dispatchParams[0].val.p = NS_STATIC_CAST(nsIException*, mException); dispatchParams[0].val.p = NS_STATIC_CAST(nsIException*, mException);
@ -363,6 +369,30 @@ WSPCallContext::CallCompletionListener()
"WSDL/IInfo param count mismatch"); "WSDL/IInfo param count mismatch");
const nsXPTParamInfo& paramInfo = methodInfo->GetParam(paramIndex); const nsXPTParamInfo& paramInfo = methodInfo->GetParam(paramIndex);
if (XPT_TDP_TAG(paramInfo.type.prefix) == TD_DOMSTRING) {
// If there's no more room in the string buffer on the stack
// for this parameter, allocate an array on the heap.
if (string_array == &string_array_buf[0] &&
string_array_index >= STRING_ARRAY_BUF_SIZE) {
string_array = new nsAutoString[partCount - i];
if (!string_array) {
rv = NS_ERROR_OUT_OF_MEMORY;
goto call_completion_end;
}
// Reset string_array_index now that we switched arrays.
string_array_index = 0;
}
// Give the variant value a nsAString object to hold the data
// in.
vars->val.p =
NS_STATIC_CAST(nsAString *, &string_array[string_array_index++]);
}
rv = WSPProxy::VariantToInParameter(listenerInterfaceInfo, rv = WSPProxy::VariantToInParameter(listenerInterfaceInfo,
mListenerMethodIndex, &paramInfo, mListenerMethodIndex, &paramInfo,
value, vars); value, vars);
@ -395,6 +425,10 @@ call_completion_end:
if(dispatchParams != paramBuffer) { if(dispatchParams != paramBuffer) {
delete [] dispatchParams; delete [] dispatchParams;
} }
if (string_array != &string_array_buf[0]) {
delete [] string_array;
}
nsCOMPtr<nsIWebServiceCallContext> kungFuDeathGrip(this); nsCOMPtr<nsIWebServiceCallContext> kungFuDeathGrip(this);
mProxy->CallCompleted(this); mProxy->CallCompleted(this);
NS_RELEASE(mProxy); NS_RELEASE(mProxy);

View File

@ -39,6 +39,8 @@
* ***** END LICENSE BLOCK ***** */ * ***** END LICENSE BLOCK ***** */
#include "wspprivate.h" #include "wspprivate.h"
#include "nsIXPConnect.h"
#include "jsapi.h"
WSPPropertyBagWrapper::WSPPropertyBagWrapper() WSPPropertyBagWrapper::WSPPropertyBagWrapper()
@ -105,20 +107,20 @@ WSPPropertyBagWrapper::CallMethod(PRUint16 methodIndex,
const nsXPTMethodInfo* info, const nsXPTMethodInfo* info,
nsXPTCMiniVariant* params) nsXPTCMiniVariant* params)
{ {
nsresult rv = NS_OK;
nsAutoString propName;
nsCOMPtr<nsIVariant> val;
if (methodIndex < 3) { if (methodIndex < 3) {
NS_ERROR("WSPPropertyBagWrapper: bad method index"); NS_ERROR("WSPPropertyBagWrapper: bad method index");
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsresult rv = NS_OK;
nsAutoString propName;
rv = WSPFactory::C2XML(nsDependentCString(info->GetName()), propName); rv = WSPFactory::C2XML(nsDependentCString(info->GetName()), propName);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return rv; return rv;
} }
nsCOMPtr<nsIVariant> val;
rv = mPropertyBag->GetProperty(propName, getter_AddRefs(val)); rv = mPropertyBag->GetProperty(propName, getter_AddRefs(val));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return rv; return rv;

View File

@ -837,16 +837,25 @@ WSPProxy::VariantToInParameter(nsIInterfaceInfo* aInterfaceInfo,
return VariantToArrayValue(arrayType.TagPart(), aXPTCVariant, return VariantToArrayValue(arrayType.TagPart(), aXPTCVariant,
iinfo, aVariant); iinfo, aVariant);
} }
else { // else
if (type.IsInterfacePointer()) { if (type.IsInterfacePointer()) {
rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo, rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo,
getter_AddRefs(iinfo)); getter_AddRefs(iinfo));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return rv; return rv;
}
} }
return VariantToValue(type_tag, &aXPTCVariant->val, iinfo, aVariant);
} }
if (type_tag == nsXPTType::T_DOMSTRING) {
// T_DOMSTRING values are expected to be stored in an nsAString
// object pointed to by the nsXPTCVariant...
return VariantToValue(type_tag, aXPTCVariant->val.p, iinfo, aVariant);
}
// else
// ... but other types are expected to be stored directly in the
// variant itself.
return VariantToValue(type_tag, &aXPTCVariant->val, iinfo, aVariant);
} }
nsresult nsresult