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;
|
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, ¶mInfo,
|
mListenerMethodIndex, ¶mInfo,
|
||||||
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);
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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, ¶mInfo,
|
mListenerMethodIndex, ¶mInfo,
|
||||||
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);
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user