mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 05:15:45 +00:00
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:
parent
39a4e26773
commit
d65385c037
@ -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, ¶mInfo,
|
||||
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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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, ¶mInfo,
|
||||
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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user