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;
}
PRUint32 headerCount, bodyCount;
PRUint32 headerCount = 0, bodyCount = 0;
nsISOAPHeaderBlock** headerBlocks;
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 (mException) {
dispatchParams[0].val.p = NS_STATIC_CAST(nsIException*, mException);
@ -363,6 +369,30 @@ WSPCallContext::CallCompletionListener()
"WSDL/IInfo param count mismatch");
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,
mListenerMethodIndex, &paramInfo,
value, vars);
@ -395,6 +425,10 @@ call_completion_end:
if(dispatchParams != paramBuffer) {
delete [] dispatchParams;
}
if (string_array != &string_array_buf[0]) {
delete [] string_array;
}
nsCOMPtr<nsIWebServiceCallContext> kungFuDeathGrip(this);
mProxy->CallCompleted(this);
NS_RELEASE(mProxy);

View File

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

View File

@ -837,16 +837,25 @@ WSPProxy::VariantToInParameter(nsIInterfaceInfo* aInterfaceInfo,
return VariantToArrayValue(arrayType.TagPart(), aXPTCVariant,
iinfo, aVariant);
}
else {
if (type.IsInterfacePointer()) {
rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo,
getter_AddRefs(iinfo));
if (NS_FAILED(rv)) {
return rv;
}
// else
if (type.IsInterfacePointer()) {
rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo,
getter_AddRefs(iinfo));
if (NS_FAILED(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

View File

@ -240,10 +240,16 @@ WSPCallContext::CallCompletionListener()
dp->val.p = nsnull;
}
PRUint32 headerCount, bodyCount;
PRUint32 headerCount = 0, bodyCount = 0;
nsISOAPHeaderBlock** headerBlocks;
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 (mException) {
dispatchParams[0].val.p = NS_STATIC_CAST(nsIException*, mException);
@ -363,6 +369,30 @@ WSPCallContext::CallCompletionListener()
"WSDL/IInfo param count mismatch");
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,
mListenerMethodIndex, &paramInfo,
value, vars);
@ -395,6 +425,10 @@ call_completion_end:
if(dispatchParams != paramBuffer) {
delete [] dispatchParams;
}
if (string_array != &string_array_buf[0]) {
delete [] string_array;
}
nsCOMPtr<nsIWebServiceCallContext> kungFuDeathGrip(this);
mProxy->CallCompleted(this);
NS_RELEASE(mProxy);

View File

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

View File

@ -837,16 +837,25 @@ WSPProxy::VariantToInParameter(nsIInterfaceInfo* aInterfaceInfo,
return VariantToArrayValue(arrayType.TagPart(), aXPTCVariant,
iinfo, aVariant);
}
else {
if (type.IsInterfacePointer()) {
rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo,
getter_AddRefs(iinfo));
if (NS_FAILED(rv)) {
return rv;
}
// else
if (type.IsInterfacePointer()) {
rv = aInterfaceInfo->GetInfoForParam(aMethodIndex, aParamInfo,
getter_AddRefs(iinfo));
if (NS_FAILED(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