Added version support to SOAP so that calls may be invoked with level 1.1 or

level 1.2 support (needed to build tests).  Also added support for https.
Misc fixes.

Not part of default build.
This commit is contained in:
rayw%netscape.com 2001-12-06 22:30:33 +00:00
Родитель 5c40228231
Коммит c69fc96d56
37 изменённых файлов: 704 добавлений и 265 удалений

Просмотреть файл

@ -192,12 +192,18 @@ interface nsISOAPEncoding : nsISupports {
{0xa8, 0xbc, 0xe6, 0x77, 0x7b, 0xf7, 0x0a, 0x30} }
#define NS_SOAPENCODING_CONTRACTID \
"@mozilla.org/xmlextras/soap/encoding;1"
#define NS_DEFAULTSOAPENCODER_CID \
#define NS_SOAPENCODING_CONTRACTID_PREFIX \
NS_SOAPENCODING_CONTRACTID "?uri="
#define NS_DEFAULTSOAPENCODER_1_1_CID \
{ /* 06fb035c-1dd2-11b2-bc30-f6d8e314d6b9 */ \
0x06fb035c, 0x1dd2, 0x11b2, \
{0xbc, 0x30, 0xf6, 0xd8, 0xe3, 0x14, 0xd6, 0xb9} }
#define NS_SOAPENCODING_CONTRACTID_PREFIX \
NS_SOAPENCODING_CONTRACTID "?uri="
#define NS_DEFAULTSOAPENCODER_CONTRACTID \
#define NS_DEFAULTSOAPENCODER_1_1_CONTRACTID \
NS_SOAPENCODING_CONTRACTID_PREFIX "http://schemas.xmlsoap.org/soap/encoding/"
#define NS_DEFAULTSOAPENCODER_1_2_CID \
{ /* e0ee4044-1dd1-11b2-9d7e-8899d4d89648 */ \
0xe0ee4044, 0x1dd1, 0x11b2, \
{0x9d, 0x7e, 0x88, 0x99, 0xd4, 0xd8, 0x96, 0x48} }
#define NS_DEFAULTSOAPENCODER_1_2_CONTRACTID \
NS_SOAPENCODING_CONTRACTID_PREFIX "http://www.w3.org/2001/09/soap-encoding"
%}

Просмотреть файл

@ -42,6 +42,11 @@ interface nsIVariant;
[scriptable, uuid(3970815e-1dd2-11b2-a475-db4dac6826f1)]
interface nsISOAPMessage : nsISupports {
const unsigned short VERSION_1_1 = 0;
const unsigned short VERSION_1_2 = 1;
const unsigned short VERSION_UNKNOWN = 32767;
/**
* The document which captures the message, if any. A simple
* sending application passes parameters to the method
@ -68,6 +73,15 @@ interface nsISOAPMessage : nsISupports {
*/
readonly attribute nsIDOMElement envelope;
/**
* A convenience attribute to obtain the SOAP version number, if
* it is known, from the envelope.
*
* If the message attribute is null or is not a document containing
* a root soap envelope element, then this will be VERSION_UNKNOWN.
*/
readonly attribute unsigned short version;
/**
* A convenience attribute to obtain the DOM element representing the
* SOAP header from the envelope. DOM methods may be used to
@ -139,6 +153,7 @@ interface nsISOAPMessage : nsISupports {
* encoded, which may null if there are no parameters.
*/
void encode(
in unsigned short aVersion,
in AString aMethodName, in AString aTargetObjectURI,
in PRUint32 aHeaderBlockCount,
[array, size_is(aHeaderBlockCount)] in nsISOAPHeaderBlock aHeaderBlocks,

Просмотреть файл

@ -37,6 +37,7 @@
#include "nsISOAPEncoding.h"
#include "nsISOAPEncoder.h"
#include "nsISOAPDecoder.h"
#include "nsISOAPMessage.h"
#include "prprf.h"
#include "prdtoa.h"
#include "nsReadableUtils.h"
@ -104,13 +105,15 @@ class ns##name##Encoder : \
{\
public:\
ns##name##Encoder();\
ns##name##Encoder(unsigned short aVersion);\
virtual ~ns##name##Encoder();\
unsigned short mVersion;\
NS_DECL_ISUPPORTS\
NS_DECL_NSISOAPENCODER\
NS_DECL_NSISOAPDECODER\
};\
NS_IMPL_ISUPPORTS2(ns##name##Encoder,nsISOAPEncoder,nsISOAPDecoder) \
ns##name##Encoder::ns##name##Encoder() {NS_INIT_ISUPPORTS();}\
ns##name##Encoder::ns##name##Encoder(unsigned short aVersion) {NS_INIT_ISUPPORTS();mVersion=aVersion;}\
ns##name##Encoder::~ns##name##Encoder() {}
// All encoders must be first declared and then registered.
@ -133,29 +136,58 @@ DECLARE_ENCODER(UnsignedByte)
#define REGISTER_ENCODER(name) \
{\
ns##name##Encoder *handler = new ns##name##Encoder();\
ns##name##Encoder *handler = new ns##name##Encoder(version);\
nsAutoString encodingKey;\
SOAPEncodingKey(nsSOAPUtils::kXSURI, k##name##SchemaType, encodingKey);\
SetEncoder(encodingKey, handler); \
SetDecoder(encodingKey, handler); \
SOAPEncodingKey(nsSOAPUtils::kXSDURI, k##name##SchemaType, encodingKey);\
SOAPEncodingKey(*nsSOAPUtils::kXSURI[version], k##name##SchemaType, encodingKey);\
SetEncoder(encodingKey, handler); \
SetDecoder(encodingKey, handler); \
}
nsDefaultSOAPEncoder::nsDefaultSOAPEncoder(): nsSOAPEncoding(nsSOAPUtils::kSOAPEncodingURI, nsnull, nsnull)
nsDefaultSOAPEncoder_1_1::nsDefaultSOAPEncoder_1_1(): nsSOAPEncoding(*nsSOAPUtils::kSOAPEncURI[nsISOAPMessage::VERSION_1_1], nsnull, nsnull)
{
unsigned short version = nsISOAPMessage::VERSION_1_1;
{
nsDefaultEncoder *handler = new nsDefaultEncoder();
nsDefaultEncoder *handler = new nsDefaultEncoder(version);
SetDefaultEncoder(handler);
SetDefaultDecoder(handler);
}
REGISTER_ENCODER(AnyType)
REGISTER_ENCODER(AnySimpleType)
{
nsArrayEncoder *handler = new nsArrayEncoder();
nsArrayEncoder *handler = new nsArrayEncoder(version);
nsAutoString encodingKey;
SOAPEncodingKey(nsSOAPUtils::kSOAPEncodingURI, kArraySOAPType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kSOAPEncURI[version], kArraySOAPType, encodingKey);
SetEncoder(encodingKey, handler);
SetDecoder(encodingKey, handler);
}
REGISTER_ENCODER(String)
REGISTER_ENCODER(Boolean)
REGISTER_ENCODER(Double)
REGISTER_ENCODER(Float)
REGISTER_ENCODER(Long)
REGISTER_ENCODER(Int)
REGISTER_ENCODER(Short)
REGISTER_ENCODER(Byte)
REGISTER_ENCODER(UnsignedLong)
REGISTER_ENCODER(UnsignedInt)
REGISTER_ENCODER(UnsignedShort)
REGISTER_ENCODER(UnsignedByte)
}
nsDefaultSOAPEncoder_1_2::nsDefaultSOAPEncoder_1_2(): nsSOAPEncoding(*nsSOAPUtils::kSOAPEncURI[nsISOAPMessage::VERSION_1_2], nsnull, nsnull)
{
unsigned short version = nsISOAPMessage::VERSION_1_2;
{
nsDefaultEncoder *handler = new nsDefaultEncoder(version);
SetDefaultEncoder(handler);
SetDefaultDecoder(handler);
}
REGISTER_ENCODER(AnyType)
REGISTER_ENCODER(AnySimpleType)
{
nsArrayEncoder *handler = new nsArrayEncoder(version);
nsAutoString encodingKey;
SOAPEncodingKey(*nsSOAPUtils::kSOAPEncURI[version], kArraySOAPType, encodingKey);
SetEncoder(encodingKey, handler);
SetDecoder(encodingKey, handler);
}
@ -249,10 +281,10 @@ NS_IMETHODIMP nsDefaultEncoder::Encode(nsISOAPEncoding* aEncoding,
}
nsAutoString encodingKey;
if (typevalue == nsISchemaType::SCHEMA_TYPE_COMPLEX) {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnyTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnyTypeSchemaType, encodingKey);
}
else {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnySimpleTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnySimpleTypeSchemaType, encodingKey);
}
nsresult rc = aEncoding->GetEncoder(encodingKey, getter_AddRefs(encoder));
if (NS_FAILED(rc)) return rc;
@ -289,7 +321,7 @@ NS_IMETHODIMP nsAnyTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
}
}
PRUint16 typevalue;
nativeSchemaURI.Assign(nsSOAPUtils::kXSDURI);
nativeSchemaURI.Assign(*nsSOAPUtils::kXSURI[mVersion]);
aSource->GetDataType(&typevalue);
switch(typevalue) {
case nsIDataType::VTYPE_INT8:
@ -339,7 +371,7 @@ NS_IMETHODIMP nsAnyTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
case nsIDataType::VTYPE_ARRAY:
if (mustBeSimple) return NS_ERROR_ILLEGAL_VALUE;
nativeSchemaType.Assign(kArraySOAPType);
nativeSchemaURI.Assign(nsSOAPUtils::kSOAPEncodingURI);
nativeSchemaURI.Assign(*nsSOAPUtils::kSOAPEncURI[mVersion]);
break;
#if 0
{
@ -389,11 +421,11 @@ NS_IMETHODIMP nsAnyTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
&& !aSchemaType
&& !aName.IsEmpty()) {
nsAutoString type;
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, nativeSchemaURI, type);
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, nativeSchemaURI, mVersion, type);
if (NS_FAILED(rc)) return rc;
type.Append(nsSOAPUtils::kQualifiedSeparator);
type.Append(nativeSchemaType);
rc = (*aReturnValue)->SetAttributeNS(nsSOAPUtils::kXSIURI, nsSOAPUtils::kXSITypeAttribute, type);
rc = (*aReturnValue)->SetAttributeNS(*nsSOAPUtils::kXSIURI[mVersion], nsSOAPUtils::kXSITypeAttribute, type);
}
return rc;
}
@ -420,7 +452,7 @@ NS_IMETHODIMP nsAnySimpleTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kAnySimpleTypeSchemaType,
aDestination,
aReturnValue);
@ -451,7 +483,7 @@ NS_IMETHODIMP nsArrayEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) { // Now create the element to hold the array
rc = EncodeSimpleValue(kEmpty,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kArraySOAPType,
aDestination,
aReturnValue);
@ -474,11 +506,11 @@ NS_IMETHODIMP nsArrayEncoder::Encode(nsISOAPEncoding* aEncoding,
#define DO_SIMPLE_ARRAY(XPType, SOAPType, Format, Source) \
{\
nsAutoString value;\
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, nsSOAPUtils::kXSURI, value);\
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, *nsSOAPUtils::kXSURI[mVersion], mVersion, value);\
if (NS_FAILED(rc)) return rc;\
value.Append(nsSOAPUtils::kQualifiedSeparator);\
value.Append(k##SOAPType##SchemaType);\
rc = (*aReturnValue)->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, kSOAPArrayTypeAttribute, value);\
rc = (*aReturnValue)->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[mVersion], kSOAPArrayTypeAttribute, value);\
if (NS_FAILED(rc)) return rc;\
XPType* values = NS_STATIC_CAST(XPType*, array);\
nsCOMPtr<nsIDOMElement> dummy;\
@ -489,7 +521,7 @@ NS_IMETHODIMP nsArrayEncoder::Encode(nsISOAPEncoding* aEncoding,
value.Assign(NS_ConvertUTF8toUCS2(nsDependentCString(ptr)).get());\
PR_smprintf_free(ptr);\
rc = EncodeSimpleValue(value,\
nsSOAPUtils::kSOAPEncodingURI,\
*nsSOAPUtils::kSOAPEncURI[mVersion],\
k##SOAPType##SchemaType,\
*aReturnValue,\
getter_AddRefs(dummy));\
@ -557,7 +589,7 @@ NS_IMETHODIMP nsStringEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kStringSchemaType,
aDestination,
aReturnValue);
@ -586,7 +618,7 @@ NS_IMETHODIMP nsBooleanEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) {
return EncodeSimpleValue(b ? nsSOAPUtils::kTrue : nsSOAPUtils::kFalse,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kBooleanSchemaType,
aDestination,
aReturnValue);
@ -620,7 +652,7 @@ NS_IMETHODIMP nsDoubleEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kDoubleSchemaType,
aDestination,
aReturnValue);
@ -654,7 +686,7 @@ NS_IMETHODIMP nsFloatEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kFloatSchemaType,
aDestination,
aReturnValue);
@ -688,7 +720,7 @@ NS_IMETHODIMP nsLongEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kLongSchemaType,
aDestination,
aReturnValue);
@ -722,7 +754,7 @@ NS_IMETHODIMP nsIntEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kIntSchemaType,
aDestination,
aReturnValue);
@ -756,7 +788,7 @@ NS_IMETHODIMP nsShortEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kShortSchemaType,
aDestination,
aReturnValue);
@ -790,7 +822,7 @@ NS_IMETHODIMP nsByteEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kByteSchemaType,
aDestination,
aReturnValue);
@ -824,7 +856,7 @@ NS_IMETHODIMP nsUnsignedLongEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kLongSchemaType,
aDestination,
aReturnValue);
@ -858,7 +890,7 @@ NS_IMETHODIMP nsUnsignedIntEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kIntSchemaType,
aDestination,
aReturnValue);
@ -892,7 +924,7 @@ NS_IMETHODIMP nsUnsignedShortEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kShortSchemaType,
aDestination,
aReturnValue);
@ -926,7 +958,7 @@ NS_IMETHODIMP nsUnsignedByteEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kByteSchemaType,
aDestination,
aReturnValue);
@ -951,7 +983,7 @@ NS_IMETHODIMP nsDefaultEncoder::Decode(nsISOAPEncoding* aEncoding,
nsresult rc = aEncoding->GetSchemaCollection(getter_AddRefs(collection));
if (NS_FAILED(rc)) return rc;
nsAutoString explicittype;
rc = aSource->GetAttributeNS(nsSOAPUtils::kXSIURI, nsSOAPUtils::kXSITypeAttribute, explicittype);
rc = aSource->GetAttributeNS(*nsSOAPUtils::kXSIURI[mVersion], nsSOAPUtils::kXSITypeAttribute, explicittype);
if (NS_FAILED(rc)) return rc;
nsAutoString ns;
nsAutoString name;
@ -975,12 +1007,12 @@ NS_IMETHODIMP nsDefaultEncoder::Decode(nsISOAPEncoding* aEncoding,
rc = element->GetType(getter_AddRefs(type));
if (NS_FAILED(rc)) return rc;
}
else if (ns.Equals(nsSOAPUtils::kSOAPEncodingURI)) { // Last-ditch hack to get undeclared types from SOAP namespace
else if (ns.Equals(*nsSOAPUtils::kSOAPEncURI[mVersion])) { // Last-ditch hack to get undeclared types from SOAP namespace
if (name.Equals(kArraySOAPType)) { // This should not be needed if schema has these declarations
rc = collection->GetType(ns, name, getter_AddRefs(type));
}
else {
rc = collection->GetType(nsSOAPUtils::kXSDURI, name, getter_AddRefs(type));
rc = collection->GetType(*nsSOAPUtils::kXSURI[mVersion], name, getter_AddRefs(type));
}
if (NS_FAILED(rc)) return rc;
}
@ -1023,10 +1055,10 @@ NS_IMETHODIMP nsDefaultEncoder::Decode(nsISOAPEncoding* aEncoding,
}
nsAutoString encodingKey;
if (typevalue == nsISchemaType::SCHEMA_TYPE_COMPLEX) {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnyTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnyTypeSchemaType, encodingKey);
}
else {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnySimpleTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnySimpleTypeSchemaType, encodingKey);
}
nsresult rc = aEncoding->GetDecoder(encodingKey, getter_AddRefs(decoder));
if (NS_FAILED(rc)) return rc;
@ -1109,7 +1141,7 @@ NS_IMETHODIMP nsArrayEncoder::Decode(nsISOAPEncoding* aEncoding,
nsAutoString name;
nsCOMPtr<nsISchemaType>subtype;
nsAutoString value;
nsresult rc = aSource->GetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, kSOAPArrayTypeAttribute, value);
nsresult rc = aSource->GetAttributeNS(*nsSOAPUtils::kSOAPEncURI[mVersion], kSOAPArrayTypeAttribute, value);
if (!value.IsEmpty()) { // Need to truncate []
nsCOMPtr<nsISchemaCollection> collection;
rc = aEncoding->GetSchemaCollection(getter_AddRefs(collection));
@ -1125,8 +1157,7 @@ NS_IMETHODIMP nsArrayEncoder::Decode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
}
}
if (ns.Equals(nsSOAPUtils::kXSURI)
|| ns.Equals(nsSOAPUtils::kXSDURI)) {
if (ns.Equals(*nsSOAPUtils::kXSURI[mVersion])) {
if (name.Equals(kStringSchemaType)) {
}
else if (name.Equals(kBooleanSchemaType)) {
@ -1153,7 +1184,7 @@ NS_IMETHODIMP nsArrayEncoder::Decode(nsISOAPEncoding* aEncoding,
}
else return NS_ERROR_ILLEGAL_VALUE;
}
else if (ns.Equals(nsSOAPUtils::kSOAPEncodingURI))
else if (ns.Equals(*nsSOAPUtils::kSOAPEncURI[mVersion]))
{
if (name.Equals(kArraySOAPType)) {
return NS_ERROR_ILLEGAL_VALUE; // Fix nested arrays later

Просмотреть файл

@ -25,10 +25,16 @@
#include "nsSOAPEncoding.h"
class nsDefaultSOAPEncoder : public nsSOAPEncoding
class nsDefaultSOAPEncoder_1_1 : public nsSOAPEncoding
{
public:
nsDefaultSOAPEncoder();
nsDefaultSOAPEncoder_1_1();
};
class nsDefaultSOAPEncoder_1_2 : public nsSOAPEncoding
{
public:
nsDefaultSOAPEncoder_1_2();
};
#endif

Просмотреть файл

@ -41,7 +41,7 @@ nsHTTPSOAPTransport::~nsHTTPSOAPTransport()
{
}
NS_IMPL_ISUPPORTS1(nsHTTPSOAPTransport, nsISOAPTransport)
NS_IMPL_ISUPPORTS1_CI(nsHTTPSOAPTransport, nsISOAPTransport)
#ifdef DEBUG
#define DEBUG_DUMP_DOCUMENT(message,doc) \
@ -285,3 +285,13 @@ NS_IMETHODIMP nsHTTPSOAPTransport::RemoveListener(nsISOAPTransportListener *aLis
return NS_ERROR_NOT_IMPLEMENTED;
}
nsHTTPSSOAPTransport::nsHTTPSSOAPTransport()
{
NS_INIT_ISUPPORTS();
}
nsHTTPSSOAPTransport::~nsHTTPSSOAPTransport()
{
}
NS_IMPL_ISUPPORTS1_CI(nsHTTPSSOAPTransport, nsISupports)

Просмотреть файл

@ -45,6 +45,15 @@ public:
NS_DECL_NSISOAPTRANSPORT
};
class nsHTTPSSOAPTransport: public nsHTTPSOAPTransport
{
public:
nsHTTPSSOAPTransport();
virtual ~nsHTTPSSOAPTransport();
NS_DECL_ISUPPORTS
};
class nsHTTPSOAPTransportCompletion : public nsIDOMEventListener, public nsISOAPCallCompletion
{
public:
@ -77,4 +86,10 @@ protected:
0x9032e336, 0x1dd2, 0x11b2, \
{0x99, 0xbe, 0xa4, 0x43, 0x76, 0xd4, 0xd5, 0xb1} }
#define NS_HTTPSOAPTRANSPORTCOMPLETION_CONTRACTID "@mozilla.org/xmlextras/soap/transport/completion;1?protocol=http"
#define NS_HTTPSSOAPTRANSPORT_CID \
{ /* aad00c5a-1dd1-11b2-9ee1-c9f6b898a7b8 */ \
0xaad00c5a, 0x1dd1, 0x11b2, \
{0x9e, 0xe1, 0xc9, 0xf6, 0xb8, 0x98, 0xa7, 0xb8} }
#define NS_HTTPSSOAPTRANSPORT_CONTRACTID NS_SOAPTRANSPORT_CONTRACTID_PREFIX "https"
#endif

Просмотреть файл

@ -169,8 +169,20 @@ nsSOAPEncoding::nsSOAPEncoding(): mEncoders(new nsSupportsHashtable),
/* member initializers and constructor code */
mStyleURI.Assign(nsSOAPUtils::kSOAPEncodingURI);
mDefaultEncoding = do_GetService(NS_DEFAULTSOAPENCODER_CONTRACTID);
mStyleURI.Assign(*nsSOAPUtils::kSOAPEncURI[nsISOAPMessage::VERSION_1_1]);
mDefaultEncoding = do_GetService(NS_DEFAULTSOAPENCODER_1_1_CONTRACTID);
mRegistry = new nsSOAPEncodingRegistry(this);
}
nsSOAPEncoding::nsSOAPEncoding(unsigned short aVersion): mEncoders(new nsSupportsHashtable),
mDecoders(new nsSupportsHashtable)
{
NS_INIT_ISUPPORTS();
/* member initializers and constructor code */
mStyleURI.Assign(*nsSOAPUtils::kSOAPEncURI[aVersion]);
mDefaultEncoding = do_GetService(aVersion ? NS_DEFAULTSOAPENCODER_1_2_CONTRACTID : NS_DEFAULTSOAPENCODER_1_1_CONTRACTID);
mRegistry = new nsSOAPEncodingRegistry(this);
}

Просмотреть файл

@ -61,6 +61,7 @@ public:
NS_DECL_NSISECURITYCHECKEDCOMPONENT
nsSOAPEncoding();
nsSOAPEncoding(unsigned short aVersion);
nsSOAPEncoding(const nsAString& aStyleURI, nsSOAPEncodingRegistry * aRegistry, nsISOAPEncoding* aDefaultEncoding);
virtual ~nsSOAPEncoding();
/* additional members */

Просмотреть файл

@ -23,6 +23,7 @@
#include "nsSOAPFault.h"
#include "nsSOAPUtils.h"
#include "nsIDOMNodeList.h"
#include "nsISOAPMessage.h"
nsSOAPFault::nsSOAPFault(nsIDOMElement* aElement)
{
@ -39,6 +40,28 @@ NS_IMPL_ISUPPORTS2_CI(nsSOAPFault, nsISOAPFault, nsISecurityCheckedComponent)
/* attribute nsIDOMElement element; */
NS_IMETHODIMP nsSOAPFault::SetElement(nsIDOMElement *aElement)
{
if (aElement) {
nsAutoString namespaceURI;
nsAutoString name;
nsresult rc = aElement->GetNamespaceURI(namespaceURI);
if (NS_FAILED(rc)) return rc;
rc = aElement->GetLocalName(name);
if (NS_FAILED(rc)) return rc;
if (name.Equals(nsSOAPUtils::kFaultTagName)) {
if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])) {
mVersion = nsISOAPMessage::VERSION_1_2;
}
else if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])) {
mVersion = nsISOAPMessage::VERSION_1_1;
}
else {
return NS_ERROR_ILLEGAL_VALUE;
}
}
else {
return NS_ERROR_ILLEGAL_VALUE;
}
}
mFaultElement = aElement;
return NS_OK;
}
@ -54,10 +77,11 @@ NS_IMETHODIMP nsSOAPFault::GetElement(nsIDOMElement * *aElement)
NS_IMETHODIMP nsSOAPFault::GetFaultCode(nsAString & aFaultCode)
{
NS_ENSURE_ARG_POINTER(&aFaultCode);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
aFaultCode.Truncate();
nsCOMPtr<nsIDOMElement> faultcode;
nsSOAPUtils::GetSpecificChildElement(mFaultElement,
nsSOAPUtils::kSOAPEnvURI,
*nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultCodeTagName,
getter_AddRefs(faultcode));
if (faultcode) {
@ -70,10 +94,11 @@ NS_IMETHODIMP nsSOAPFault::GetFaultCode(nsAString & aFaultCode)
NS_IMETHODIMP nsSOAPFault::GetFaultString(nsAString & aFaultString)
{
NS_ENSURE_ARG_POINTER(&aFaultString);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
aFaultString.Truncate();
nsCOMPtr<nsIDOMElement> element;
nsSOAPUtils::GetSpecificChildElement(mFaultElement, nsSOAPUtils::kSOAPEnvURI,
nsSOAPUtils::GetSpecificChildElement(mFaultElement, *nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultStringTagName, getter_AddRefs(element));
if (element) {
nsSOAPUtils::GetElementTextContent(element, aFaultString);
@ -85,10 +110,11 @@ NS_IMETHODIMP nsSOAPFault::GetFaultString(nsAString & aFaultString)
NS_IMETHODIMP nsSOAPFault::GetFaultActor(nsAString & aFaultActor)
{
NS_ENSURE_ARG_POINTER(&aFaultActor);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
aFaultActor.Truncate();
nsCOMPtr<nsIDOMElement> element;
nsSOAPUtils::GetSpecificChildElement(mFaultElement, nsSOAPUtils::kSOAPEnvURI,
nsSOAPUtils::GetSpecificChildElement(mFaultElement, *nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultActorTagName, getter_AddRefs(element));
if (element) {
nsSOAPUtils::GetElementTextContent(element, aFaultActor);
@ -100,9 +126,10 @@ NS_IMETHODIMP nsSOAPFault::GetFaultActor(nsAString & aFaultActor)
NS_IMETHODIMP nsSOAPFault::GetDetail(nsIDOMElement * *aDetail)
{
NS_ENSURE_ARG_POINTER(aDetail);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
nsCOMPtr<nsIDOMElement> element;
nsSOAPUtils::GetSpecificChildElement(mFaultElement, nsSOAPUtils::kSOAPEnvURI,
nsSOAPUtils::GetSpecificChildElement(mFaultElement, *nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultDetailTagName, aDetail);
return NS_OK;
}

Просмотреть файл

@ -46,5 +46,6 @@ public:
protected:
nsCOMPtr<nsIDOMElement> mFaultElement;
unsigned short mVersion;
};
#endif

Просмотреть файл

@ -26,13 +26,14 @@
#include "nsSOAPUtils.h"
#include "nsIServiceManager.h"
#include "nsISOAPAttachments.h"
#include "nsISOAPMessage.h"
nsSOAPHeaderBlock::nsSOAPHeaderBlock()
nsSOAPHeaderBlock::nsSOAPHeaderBlock():mVersion(nsISOAPMessage::VERSION_UNKNOWN)
{
NS_INIT_ISUPPORTS();
}
nsSOAPHeaderBlock::nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments): nsSOAPBlock(aAttachments)
nsSOAPHeaderBlock::nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments, unsigned short aVersion): nsSOAPBlock(aAttachments), mVersion(aVersion)
{
}
@ -54,7 +55,8 @@ NS_IMETHODIMP nsSOAPHeaderBlock::GetActorURI(nsAString & aActorURI)
{
NS_ENSURE_ARG_POINTER(&aActorURI);
if (mElement) {
return mElement->GetAttributeNS(nsSOAPUtils::kSOAPEnvURI,nsSOAPUtils::kActorAttribute,aActorURI);
if (mVersion == nsISOAPMessage::VERSION_UNKNOWN) return NS_ERROR_NOT_AVAILABLE;
return mElement->GetAttributeNS(*nsSOAPUtils::kSOAPEnvURI[mVersion],nsSOAPUtils::kActorAttribute,aActorURI);
}
else {
aActorURI.Assign(mActorURI);
@ -74,12 +76,13 @@ NS_IMETHODIMP nsSOAPHeaderBlock::GetMustUnderstand(PRBool * aMustUnderstand)
{
NS_ENSURE_ARG_POINTER(&aMustUnderstand);
if (mElement) {
if (mVersion == nsISOAPMessage::VERSION_UNKNOWN) return NS_ERROR_NOT_AVAILABLE;
nsAutoString m;
nsresult rc = mElement->GetAttributeNS(nsSOAPUtils::kSOAPEnvURI,nsSOAPUtils::kMustUnderstandAttribute,m);
nsresult rc = mElement->GetAttributeNS(*nsSOAPUtils::kSOAPEnvURI[mVersion],nsSOAPUtils::kMustUnderstandAttribute,m);
if (NS_FAILED(rc)) return rc;
if (m.Length() == 0) *aMustUnderstand = PR_FALSE;
else if (m.Equals(nsSOAPUtils::kTrueA) || m.Equals(nsSOAPUtils::kTrueA)) *aMustUnderstand = PR_TRUE;
else if (m.Equals(nsSOAPUtils::kFalseA) || m.Equals(nsSOAPUtils::kFalseA)) *aMustUnderstand = PR_FALSE;
else if (m.Equals(nsSOAPUtils::kTrue) || m.Equals(nsSOAPUtils::kTrueA)) *aMustUnderstand = PR_TRUE;
else if (m.Equals(nsSOAPUtils::kFalse) || m.Equals(nsSOAPUtils::kFalseA)) *aMustUnderstand = PR_FALSE;
else return NS_ERROR_ILLEGAL_VALUE;
return NS_OK;
}

Просмотреть файл

@ -40,7 +40,7 @@ class nsSOAPHeaderBlock : public nsSOAPBlock,
{
public:
nsSOAPHeaderBlock();
nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments);
nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments, unsigned short aVersion);
virtual ~nsSOAPHeaderBlock();
NS_DECL_ISUPPORTS
@ -56,6 +56,7 @@ public:
protected:
nsString mActorURI;
PRBool mMustUnderstand;
PRBool mVersion;
};
#endif

Просмотреть файл

@ -75,32 +75,95 @@ NS_IMETHODIMP nsSOAPMessage::GetEnvelope(nsIDOMElement * *aEnvelope)
nsCOMPtr<nsIDOMElement> root;
mMessage->GetDocumentElement(getter_AddRefs(root));
if (root) {
nsAutoString name, namespaceURI;
root->GetLocalName(name);
root->GetNamespaceURI(namespaceURI);
nsAutoString namespaceURI;
nsAutoString name;
nsresult rc = root->GetNamespaceURI(namespaceURI);
if (NS_FAILED(rc)) return rc;
rc = root->GetLocalName(name);
if (NS_FAILED(rc)) return rc;
if (name.Equals(nsSOAPUtils::kEnvelopeTagName)
&& namespaceURI.Equals(nsSOAPUtils::kSOAPEnvURI))
&& (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])
|| namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])))
{
*aEnvelope = root;
NS_ADDREF(*aEnvelope);
return NS_OK;
}
}
}
*aEnvelope = nsnull;
return NS_OK;
}
/* readonly attribute unsigned short version; */
NS_IMETHODIMP nsSOAPMessage::GetVersion(PRUint16 *aVersion)
{
if (mMessage) {
nsCOMPtr<nsIDOMElement> root;
mMessage->GetDocumentElement(getter_AddRefs(root));
if (root) {
nsAutoString namespaceURI;
nsAutoString name;
nsresult rc = root->GetNamespaceURI(namespaceURI);
if (NS_FAILED(rc)) return rc;
rc = root->GetLocalName(name);
if (NS_FAILED(rc)) return rc;
if (name.Equals(nsSOAPUtils::kEnvelopeTagName)) {
if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])) {
*aVersion = nsISOAPMessage::VERSION_1_2;
return NS_OK;
}
else if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])) {
*aVersion = nsISOAPMessage::VERSION_1_1;
return NS_OK;
}
}
}
}
*aVersion = nsISOAPMessage::VERSION_UNKNOWN;
return NS_OK;
}
/* Internal method for getting envelope and version */
unsigned short nsSOAPMessage::GetEnvelopeWithVersion(nsIDOMElement * *aEnvelope)
{
NS_ENSURE_ARG_POINTER(aEnvelope);
if (mMessage) {
nsCOMPtr<nsIDOMElement> root;
mMessage->GetDocumentElement(getter_AddRefs(root));
if (root) {
nsAutoString namespaceURI;
nsAutoString name;
root->GetNamespaceURI(namespaceURI);
root->GetLocalName(name);
if (name.Equals(nsSOAPUtils::kEnvelopeTagName)) {
if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])) {
*aEnvelope = root;
NS_ADDREF(*aEnvelope);
return nsISOAPMessage::VERSION_1_2;
}
else if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])) {
*aEnvelope = root;
NS_ADDREF(*aEnvelope);
return nsISOAPMessage::VERSION_1_1;
}
}
}
}
*aEnvelope = nsnull;
return nsISOAPMessage::VERSION_UNKNOWN;
}
/* readonly attribute nsIDOMElement header; */
NS_IMETHODIMP nsSOAPMessage::GetHeader(nsIDOMElement * *aHeader)
{
NS_ENSURE_ARG_POINTER(aHeader);
nsCOMPtr<nsIDOMElement> env;
GetEnvelope(getter_AddRefs(env));
unsigned short version = GetEnvelopeWithVersion(getter_AddRefs(env));
if (env) {
nsSOAPUtils::GetSpecificChildElement(env,
nsSOAPUtils::kSOAPEnvURI, nsSOAPUtils::kHeaderTagName,
*nsSOAPUtils::kSOAPEnvURI[version], nsSOAPUtils::kHeaderTagName,
aHeader);
}
else {
@ -114,10 +177,10 @@ NS_IMETHODIMP nsSOAPMessage::GetBody(nsIDOMElement * *aBody)
{
NS_ENSURE_ARG_POINTER(aBody);
nsCOMPtr<nsIDOMElement> env;
GetEnvelope(getter_AddRefs(env));
unsigned short version = GetEnvelopeWithVersion(getter_AddRefs(env));
if (env) {
nsSOAPUtils::GetSpecificChildElement(env,
nsSOAPUtils::kSOAPEnvURI, nsSOAPUtils::kBodyTagName,
*nsSOAPUtils::kSOAPEnvURI[version], nsSOAPUtils::kBodyTagName,
aBody);
}
else {
@ -175,11 +238,17 @@ NS_IMETHODIMP nsSOAPMessage::GetTargetObjectURI(nsAString & aTargetObjectURI)
return NS_OK;
}
NS_NAMED_LITERAL_STRING(kEmptySOAPDocStr, "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema-datatypes\"><SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>");
NS_NAMED_LITERAL_STRING(realEmptySOAPDocStr1, "<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:enc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/1999/XMLSchema\"><env:Header/><env:Body/></env:Envelope>");
NS_NAMED_LITERAL_STRING(realEmptySOAPDocStr2, "<env:Envelope xmlns:env=\"http://www.w3.org/2001/09/soap-envelope\" xmlns:enc=\"http://www.w3.org/2001/09/soap-encoding\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><env:Header/><env:Body/></env:Envelope>");
const nsAString* kEmptySOAPDocStr[] = {&realEmptySOAPDocStr1, &realEmptySOAPDocStr2};
/* void encode (in AString aMethodName, in AString aTargetObjectURI, in PRUint32 aHeaderBlockCount, [array, size_is (aHeaderBlockCount)] in nsISOAPHeaderBlock aHeaderBlocks, in PRUint32 aParameterCount, [array, size_is (aParameterCount)] in nsISOAPParameter aParameters); */
NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAString & aTargetObjectURI, PRUint32 aHeaderBlockCount, nsISOAPHeaderBlock **aHeaderBlocks, PRUint32 aParameterCount, nsISOAPParameter **aParameters)
NS_IMETHODIMP nsSOAPMessage::Encode(unsigned short aVersion, const nsAString & aMethodName, const nsAString & aTargetObjectURI, PRUint32 aHeaderBlockCount, nsISOAPHeaderBlock **aHeaderBlocks, PRUint32 aParameterCount, nsISOAPParameter **aParameters)
{
if (aVersion != nsISOAPMessage::VERSION_1_1
&& aVersion != nsISOAPMessage::VERSION_1_2)
return NS_ERROR_ILLEGAL_VALUE;
// Construct the message skeleton
@ -189,7 +258,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (NS_FAILED(rv)) return rv;
nsAutoString docstr;
rv = parser->ParseFromString(kEmptySOAPDocStr.get(), "text/xml",
rv = parser->ParseFromString(nsString(*kEmptySOAPDocStr[aVersion]).get(), "text/xml",
getter_AddRefs(mMessage));
if (NS_FAILED(rv)) return rv;
@ -202,7 +271,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (envelope) {
nsAutoString enc;
mEncoding->GetStyleURI(enc);
envelope->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, nsSOAPUtils::kEncodingStyleAttribute, enc);
envelope->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[aVersion], nsSOAPUtils::kEncodingStyleAttribute, enc);
}
}
@ -268,7 +337,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (mEncoding != encoding) {
nsAutoString enc;
encoding->GetStyleURI(enc);
element->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, nsSOAPUtils::kEncodingStyleAttribute, enc);
element->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[aVersion], nsSOAPUtils::kEncodingStyleAttribute, enc);
}
}
}
@ -288,7 +357,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (NS_FAILED(rv)) return rv;
body = call;
nsAutoString prefix;
rv = nsSOAPUtils::MakeNamespacePrefixFixed(body, aTargetObjectURI, prefix);
rv = nsSOAPUtils::MakeNamespacePrefixFixed(body, aTargetObjectURI, aVersion, prefix);
if (NS_FAILED(rv)) return rv;
if (!prefix.IsEmpty()) {
rv = body->SetPrefix(prefix);
@ -340,7 +409,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (mEncoding != encoding) {
nsAutoString enc;
encoding->GetStyleURI(enc);
element->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, nsSOAPUtils::kEncodingStyleAttribute, enc);
element->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[aVersion], nsSOAPUtils::kEncodingStyleAttribute, enc);
}
}
}
@ -430,9 +499,14 @@ NS_IMETHODIMP nsSOAPMessage::GetEncoding(nsISOAPEncoding* * aEncoding)
{
NS_ENSURE_ARG_POINTER(aEncoding);
if (!mEncoding) {
mEncoding = new nsSOAPEncoding();
if (!mEncoding)
return NS_ERROR_OUT_OF_MEMORY;
unsigned short version;
nsresult rc = GetVersion(&version);
if (NS_FAILED(rc)) return rc;
if (version != nsISOAPMessage::VERSION_UNKNOWN) {
mEncoding = new nsSOAPEncoding(version);
if (!mEncoding)
return NS_ERROR_OUT_OF_MEMORY;
}
}
*aEncoding = mEncoding;
NS_IF_ADDREF(*aEncoding);

Просмотреть файл

@ -50,6 +50,7 @@ public:
protected:
unsigned short GetEnvelopeWithVersion(nsIDOMElement * *aEnvelope);
nsCOMPtr<nsIDOMDocument> mMessage;
nsCOMPtr<nsISOAPEncoding> mEncoding;
nsString mActionURI;

Просмотреть файл

@ -51,16 +51,23 @@ NS_IMETHODIMP nsSOAPResponse::GetFault(nsISOAPFault * *aFault)
nsCOMPtr<nsIDOMElement> body;
*aFault = nsnull;
GetBody(getter_AddRefs(body));
nsresult rc = GetBody(getter_AddRefs(body));
if (NS_FAILED(rc)) return rc;
if (body) {
nsSOAPUtils::GetSpecificChildElement(body,
nsSOAPUtils::kSOAPEnvURI, nsSOAPUtils::kFaultTagName,
getter_AddRefs(body));
if (body) {
*aFault = new nsSOAPFault(body);
if (!*aFault)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*aFault);
unsigned short version;
rc = GetVersion(&version);
if (NS_FAILED(rc)) return rc;
if (rc != nsSOAPMessage::VERSION_UNKNOWN) {
nsCOMPtr<nsIDOMElement> fault;
nsSOAPUtils::GetSpecificChildElement(body,
*nsSOAPUtils::kSOAPEnvURI[version], nsSOAPUtils::kFaultTagName,
getter_AddRefs(fault));
if (fault) {
*aFault = new nsSOAPFault(fault);
if (!*aFault)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*aFault);
}
}
}
else {

Просмотреть файл

@ -22,29 +22,31 @@
#include "nsSOAPUtils.h"
#include "nsIDOMText.h"
#include "nsISOAPMessage.h"
#include "nsIDOMNamedNodeMap.h"
#include "nsCOMPtr.h"
NS_NAMED_LITERAL_STRING(realSOAPEnvURI,"http://schemas.xmlsoap.org/soap/envelope/");
const nsAString& nsSOAPUtils::kSOAPEnvURI = realSOAPEnvURI;
NS_NAMED_LITERAL_STRING(realSOAPEnvURI1,"http://schemas.xmlsoap.org/soap/envelope/");
NS_NAMED_LITERAL_STRING(realSOAPEnvURI2,"http://www.w3.org/2001/09/soap-envelope");
const nsAString* nsSOAPUtils::kSOAPEnvURI[] = {&realSOAPEnvURI1, &realSOAPEnvURI2};
NS_NAMED_LITERAL_STRING(realSOAPEncodingURI,"http://schemas.xmlsoap.org/soap/encoding/");
const nsAString& nsSOAPUtils::kSOAPEncodingURI = realSOAPEncodingURI;
NS_NAMED_LITERAL_STRING(realSOAPEncURI1,"http://schemas.xmlsoap.org/soap/encoding/");
NS_NAMED_LITERAL_STRING(realSOAPEncURI2,"http://www.w3.org/2001/09/soap-encoding");
const nsAString* nsSOAPUtils::kSOAPEncURI[] = {&realSOAPEncURI1, &realSOAPEncURI2};
NS_NAMED_LITERAL_STRING(realSOAPEnvPrefix,"SOAP-ENV");
NS_NAMED_LITERAL_STRING(realXSIURI1,"http://www.w3.org/1999/XMLSchema-instance");
NS_NAMED_LITERAL_STRING(realXSIURI2,"http://www.w3.org/2001/XMLSchema-instance");
const nsAString* nsSOAPUtils::kXSIURI[] = {&realXSIURI1, &realXSIURI2};
NS_NAMED_LITERAL_STRING(realXSURI1,"http://www.w3.org/1999/XMLSchema");
NS_NAMED_LITERAL_STRING(realXSURI2,"http://www.w3.org/2001/XMLSchema");
const nsAString* nsSOAPUtils::kXSURI[] = {&realXSURI1, &realXSURI2};
NS_NAMED_LITERAL_STRING(realSOAPEnvPrefix,"env");
const nsAString& nsSOAPUtils::kSOAPEnvPrefix = realSOAPEnvPrefix;
NS_NAMED_LITERAL_STRING(realSOAPEncodingPrefix,"SOAP-ENC");
const nsAString& nsSOAPUtils::kSOAPEncodingPrefix = realSOAPEncodingPrefix;
NS_NAMED_LITERAL_STRING(realXSURI,"http://www.w3.org/2001/XMLSchema");
const nsAString& nsSOAPUtils::kXSURI = realXSURI;
NS_NAMED_LITERAL_STRING(realXSIURI,"http://www.w3.org/2001/XMLSchema-instance");
const nsAString& nsSOAPUtils::kXSIURI = realXSIURI;
NS_NAMED_LITERAL_STRING(realXSDURI,"http://www.w3.org/2001/XMLSchema-datatypes");
const nsAString& nsSOAPUtils::kXSDURI = realXSDURI;
NS_NAMED_LITERAL_STRING(realSOAPEncPrefix,"enc");
const nsAString& nsSOAPUtils::kSOAPEncPrefix = realSOAPEncPrefix;
NS_NAMED_LITERAL_STRING(realXSIPrefix,"xsi");
const nsAString& nsSOAPUtils::kXSIPrefix = realXSIPrefix;
@ -55,9 +57,6 @@ const nsAString& nsSOAPUtils::kXSITypeAttribute = realXSITypeAttribute;
NS_NAMED_LITERAL_STRING(realXSPrefix,"xs");
const nsAString& nsSOAPUtils::kXSPrefix = realXSPrefix;
NS_NAMED_LITERAL_STRING(realXSDPrefix,"xsd");
const nsAString& nsSOAPUtils::kXSDPrefix = realXSDPrefix;
NS_NAMED_LITERAL_STRING(realEncodingStyleAttribute,"encodingStyle");
const nsAString& nsSOAPUtils::kEncodingStyleAttribute = realEncodingStyleAttribute;
@ -155,7 +154,7 @@ nsSOAPUtils::GetSpecificSiblingElement(
sibling->GetLocalName(name);
sibling->GetNamespaceURI(namespaceURI);
if (name.Equals(aType)
&& namespaceURI.Equals(nsSOAPUtils::kSOAPEnvURI))
&& namespaceURI.Equals(aNamespace))
{
*aElement = sibling;
NS_ADDREF(*aElement);
@ -454,20 +453,25 @@ nsSOAPUtils::MakeNamespacePrefix(nsIDOMElement* aScope,
*i2 = 'n';
return NS_OK;
}
/**
* This code optimizes the cases of known prefixes, which
* it is assumed are not overridden. The specified version
* number is also assumed to be correct.
*/
nsresult
nsSOAPUtils::MakeNamespacePrefixFixed(nsIDOMElement* aScope,
const nsAString & aURI,
PRUint16 aVersion,
nsAString & aPrefix)
{
if (aURI.Equals(kSOAPEncodingURI))
aPrefix = kSOAPEncodingPrefix;
else if (aURI.Equals(kSOAPEnvURI))
if (aURI.Equals(*kSOAPEncURI[aVersion]))
aPrefix = kSOAPEncPrefix;
else if (aURI.Equals(*kSOAPEnvURI[aVersion]))
aPrefix = kSOAPEnvPrefix;
else if (aURI.Equals(kXSIURI))
else if (aURI.Equals(*kXSIURI[aVersion]))
aPrefix = kXSIPrefix;
else if (aURI.Equals(kXSDURI))
aPrefix = kXSDPrefix;
else if (aURI.Equals(*kXSURI[aVersion]))
aPrefix = kXSPrefix;
else
return MakeNamespacePrefix(aScope, aURI, aPrefix);

Просмотреть файл

@ -51,6 +51,7 @@ public:
nsAString & aPrefix);
static nsresult MakeNamespacePrefixFixed(nsIDOMElement* aElement,
const nsAString & aURI,
PRUint16 aVersion,
nsAString & aPrefix);
static nsresult GetNamespaceURI(nsIDOMElement* aElement,
const nsAString & aQName,
@ -62,17 +63,17 @@ public:
static PRBool StartsWith(nsAString& aSuper,
nsAString& aSub);
static const nsAString& kSOAPEnvURI;
static const nsAString& kSOAPEncodingURI;
static const nsAString* kSOAPEnvURI[];
static const nsAString* kSOAPEncURI[];
static const nsAString* kXSIURI[];
static const nsAString* kXSURI[];
static const nsAString& kSOAPEnvPrefix;
static const nsAString& kSOAPEncodingPrefix;
static const nsAString& kXSURI;
static const nsAString& kXSIURI;
static const nsAString& kXSDURI;
static const nsAString& kXSPrefix;
static const nsAString& kSOAPEncPrefix;
static const nsAString& kXSIPrefix;
static const nsAString& kXSITypeAttribute;
static const nsAString& kXSDPrefix;
static const nsAString& kXSPrefix;
static const nsAString& kEncodingStyleAttribute;
static const nsAString& kActorAttribute;
static const nsAString& kMustUnderstandAttribute;

Просмотреть файл

@ -22,10 +22,7 @@ function oncompletion(resp, call, status) {
alert("Fault:\nFault code: " + f.faultCode + "\nFault string: " + f.faultString + "\nFault actor: " + f.faultActor + "\nDetail: " + detailStr);
}
else {
function Count() {
}
var count = new Count();
var ret = resp.getParameters(false, count);
var ret = resp.getParameters(false, {});
var val = ret[0].value;
var retStr = "Success:\nName: " + ret.name + "\nValue: " + val;
// In this case, we happen to know that the result value is an array
@ -75,7 +72,7 @@ function makeCall(syncCall, faultCall) {
// the last parameter is an object that will be serialized into
// a struct parameter. It does not have a parameter wrapper because
// we don't need it to be named
s.encode("GetLastTradePrice", "uri:some-namespace", 0, null, 3, new Array(p1, p2, p3, p4, new SOAPParameter(new Dog("Fido", "Lab", "Black"))));
s.encode(1, "GetLastTradePrice", "uri:some-namespace", 0, null, 3, new Array(p1, p2, p3, p4, new SOAPParameter(new Dog("Fido", "Lab", "Black"))));
if (syncCall) {
var r = s.invoke();

Просмотреть файл

@ -84,8 +84,10 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsSOAPResponse)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSOAPEncoding)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSOAPHeaderBlock)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSOAPParameter)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDefaultSOAPEncoder)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDefaultSOAPEncoder_1_1)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDefaultSOAPEncoder_1_2)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTTPSOAPTransport)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTTPSSOAPTransport)
NS_DECL_CLASSINFO(nsSOAPCall)
NS_DECL_CLASSINFO(nsSOAPResponse)
NS_DECL_CLASSINFO(nsSOAPEncoding)
@ -94,6 +96,7 @@ NS_DECL_CLASSINFO(nsSOAPHeaderBlock)
NS_DECL_CLASSINFO(nsSOAPParameter)
NS_DECL_CLASSINFO(nsHTTPSOAPTransport)
NS_DECL_CLASSINFO(nsHTTPSOAPTransportCompletion)
NS_DECL_CLASSINFO(nsHTTPSSOAPTransport)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSchemaLoader)
NS_DECL_CLASSINFO(nsSchemaLoader)
@ -315,18 +318,30 @@ static nsModuleComponentInfo components[] = {
NS_CI_INTERFACE_GETTER_NAME(nsSOAPParameter),
nsnull, &NS_CLASSINFO_NAME(nsSOAPParameter),
nsIClassInfo::DOM_OBJECT },
{ "Default SOAP Encoder", NS_DEFAULTSOAPENCODER_CID,
NS_DEFAULTSOAPENCODER_CONTRACTID,
nsDefaultSOAPEncoderConstructor },
{ "Default SOAP 1.1 Encoder", NS_DEFAULTSOAPENCODER_1_1_CID,
NS_DEFAULTSOAPENCODER_1_1_CONTRACTID,
nsDefaultSOAPEncoder_1_1Constructor },
{ "Default SOAP 1.2 Encoder", NS_DEFAULTSOAPENCODER_1_2_CID,
NS_DEFAULTSOAPENCODER_1_2_CONTRACTID,
nsDefaultSOAPEncoder_1_2Constructor },
{ "HTTP SOAP Transport", NS_HTTPSOAPTRANSPORT_CID,
NS_HTTPSOAPTRANSPORT_CONTRACTID,
nsHTTPSOAPTransportConstructor },
nsHTTPSOAPTransportConstructor, nsnull, nsnull, nsnull,
NS_CI_INTERFACE_GETTER_NAME(nsHTTPSOAPTransport),
nsnull, &NS_CLASSINFO_NAME(nsHTTPSOAPTransport),
nsIClassInfo::DOM_OBJECT },
{ "HTTP SOAP Transport Completion", NS_HTTPSOAPTRANSPORTCOMPLETION_CID,
NS_HTTPSOAPTRANSPORTCOMPLETION_CONTRACTID,
nsnull, nsnull, nsnull, nsnull,
NS_CI_INTERFACE_GETTER_NAME(nsHTTPSOAPTransportCompletion),
nsnull, &NS_CLASSINFO_NAME(nsHTTPSOAPTransportCompletion),
nsIClassInfo::DOM_OBJECT },
{ "HTTPS SOAP Transport", NS_HTTPSSOAPTRANSPORT_CID,
NS_HTTPSSOAPTRANSPORT_CONTRACTID,
nsHTTPSSOAPTransportConstructor, nsnull, nsnull, nsnull,
NS_CI_INTERFACE_GETTER_NAME(nsHTTPSSOAPTransport),
nsnull, &NS_CLASSINFO_NAME(nsHTTPSSOAPTransport),
nsIClassInfo::DOM_OBJECT },
{ "SchemaLoader", NS_SCHEMALOADER_CID, NS_SCHEMALOADER_CONTRACTID,
nsSchemaLoaderConstructor, nsnull, nsnull, nsnull,
NS_CI_INTERFACE_GETTER_NAME(nsSchemaLoader), nsnull,

Просмотреть файл

@ -192,12 +192,18 @@ interface nsISOAPEncoding : nsISupports {
{0xa8, 0xbc, 0xe6, 0x77, 0x7b, 0xf7, 0x0a, 0x30} }
#define NS_SOAPENCODING_CONTRACTID \
"@mozilla.org/xmlextras/soap/encoding;1"
#define NS_DEFAULTSOAPENCODER_CID \
#define NS_SOAPENCODING_CONTRACTID_PREFIX \
NS_SOAPENCODING_CONTRACTID "?uri="
#define NS_DEFAULTSOAPENCODER_1_1_CID \
{ /* 06fb035c-1dd2-11b2-bc30-f6d8e314d6b9 */ \
0x06fb035c, 0x1dd2, 0x11b2, \
{0xbc, 0x30, 0xf6, 0xd8, 0xe3, 0x14, 0xd6, 0xb9} }
#define NS_SOAPENCODING_CONTRACTID_PREFIX \
NS_SOAPENCODING_CONTRACTID "?uri="
#define NS_DEFAULTSOAPENCODER_CONTRACTID \
#define NS_DEFAULTSOAPENCODER_1_1_CONTRACTID \
NS_SOAPENCODING_CONTRACTID_PREFIX "http://schemas.xmlsoap.org/soap/encoding/"
#define NS_DEFAULTSOAPENCODER_1_2_CID \
{ /* e0ee4044-1dd1-11b2-9d7e-8899d4d89648 */ \
0xe0ee4044, 0x1dd1, 0x11b2, \
{0x9d, 0x7e, 0x88, 0x99, 0xd4, 0xd8, 0x96, 0x48} }
#define NS_DEFAULTSOAPENCODER_1_2_CONTRACTID \
NS_SOAPENCODING_CONTRACTID_PREFIX "http://www.w3.org/2001/09/soap-encoding"
%}

Просмотреть файл

@ -42,6 +42,11 @@ interface nsIVariant;
[scriptable, uuid(3970815e-1dd2-11b2-a475-db4dac6826f1)]
interface nsISOAPMessage : nsISupports {
const unsigned short VERSION_1_1 = 0;
const unsigned short VERSION_1_2 = 1;
const unsigned short VERSION_UNKNOWN = 32767;
/**
* The document which captures the message, if any. A simple
* sending application passes parameters to the method
@ -68,6 +73,15 @@ interface nsISOAPMessage : nsISupports {
*/
readonly attribute nsIDOMElement envelope;
/**
* A convenience attribute to obtain the SOAP version number, if
* it is known, from the envelope.
*
* If the message attribute is null or is not a document containing
* a root soap envelope element, then this will be VERSION_UNKNOWN.
*/
readonly attribute unsigned short version;
/**
* A convenience attribute to obtain the DOM element representing the
* SOAP header from the envelope. DOM methods may be used to
@ -139,6 +153,7 @@ interface nsISOAPMessage : nsISupports {
* encoded, which may null if there are no parameters.
*/
void encode(
in unsigned short aVersion,
in AString aMethodName, in AString aTargetObjectURI,
in PRUint32 aHeaderBlockCount,
[array, size_is(aHeaderBlockCount)] in nsISOAPHeaderBlock aHeaderBlocks,

Просмотреть файл

@ -37,6 +37,7 @@
#include "nsISOAPEncoding.h"
#include "nsISOAPEncoder.h"
#include "nsISOAPDecoder.h"
#include "nsISOAPMessage.h"
#include "prprf.h"
#include "prdtoa.h"
#include "nsReadableUtils.h"
@ -104,13 +105,15 @@ class ns##name##Encoder : \
{\
public:\
ns##name##Encoder();\
ns##name##Encoder(unsigned short aVersion);\
virtual ~ns##name##Encoder();\
unsigned short mVersion;\
NS_DECL_ISUPPORTS\
NS_DECL_NSISOAPENCODER\
NS_DECL_NSISOAPDECODER\
};\
NS_IMPL_ISUPPORTS2(ns##name##Encoder,nsISOAPEncoder,nsISOAPDecoder) \
ns##name##Encoder::ns##name##Encoder() {NS_INIT_ISUPPORTS();}\
ns##name##Encoder::ns##name##Encoder(unsigned short aVersion) {NS_INIT_ISUPPORTS();mVersion=aVersion;}\
ns##name##Encoder::~ns##name##Encoder() {}
// All encoders must be first declared and then registered.
@ -133,29 +136,58 @@ DECLARE_ENCODER(UnsignedByte)
#define REGISTER_ENCODER(name) \
{\
ns##name##Encoder *handler = new ns##name##Encoder();\
ns##name##Encoder *handler = new ns##name##Encoder(version);\
nsAutoString encodingKey;\
SOAPEncodingKey(nsSOAPUtils::kXSURI, k##name##SchemaType, encodingKey);\
SetEncoder(encodingKey, handler); \
SetDecoder(encodingKey, handler); \
SOAPEncodingKey(nsSOAPUtils::kXSDURI, k##name##SchemaType, encodingKey);\
SOAPEncodingKey(*nsSOAPUtils::kXSURI[version], k##name##SchemaType, encodingKey);\
SetEncoder(encodingKey, handler); \
SetDecoder(encodingKey, handler); \
}
nsDefaultSOAPEncoder::nsDefaultSOAPEncoder(): nsSOAPEncoding(nsSOAPUtils::kSOAPEncodingURI, nsnull, nsnull)
nsDefaultSOAPEncoder_1_1::nsDefaultSOAPEncoder_1_1(): nsSOAPEncoding(*nsSOAPUtils::kSOAPEncURI[nsISOAPMessage::VERSION_1_1], nsnull, nsnull)
{
unsigned short version = nsISOAPMessage::VERSION_1_1;
{
nsDefaultEncoder *handler = new nsDefaultEncoder();
nsDefaultEncoder *handler = new nsDefaultEncoder(version);
SetDefaultEncoder(handler);
SetDefaultDecoder(handler);
}
REGISTER_ENCODER(AnyType)
REGISTER_ENCODER(AnySimpleType)
{
nsArrayEncoder *handler = new nsArrayEncoder();
nsArrayEncoder *handler = new nsArrayEncoder(version);
nsAutoString encodingKey;
SOAPEncodingKey(nsSOAPUtils::kSOAPEncodingURI, kArraySOAPType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kSOAPEncURI[version], kArraySOAPType, encodingKey);
SetEncoder(encodingKey, handler);
SetDecoder(encodingKey, handler);
}
REGISTER_ENCODER(String)
REGISTER_ENCODER(Boolean)
REGISTER_ENCODER(Double)
REGISTER_ENCODER(Float)
REGISTER_ENCODER(Long)
REGISTER_ENCODER(Int)
REGISTER_ENCODER(Short)
REGISTER_ENCODER(Byte)
REGISTER_ENCODER(UnsignedLong)
REGISTER_ENCODER(UnsignedInt)
REGISTER_ENCODER(UnsignedShort)
REGISTER_ENCODER(UnsignedByte)
}
nsDefaultSOAPEncoder_1_2::nsDefaultSOAPEncoder_1_2(): nsSOAPEncoding(*nsSOAPUtils::kSOAPEncURI[nsISOAPMessage::VERSION_1_2], nsnull, nsnull)
{
unsigned short version = nsISOAPMessage::VERSION_1_2;
{
nsDefaultEncoder *handler = new nsDefaultEncoder(version);
SetDefaultEncoder(handler);
SetDefaultDecoder(handler);
}
REGISTER_ENCODER(AnyType)
REGISTER_ENCODER(AnySimpleType)
{
nsArrayEncoder *handler = new nsArrayEncoder(version);
nsAutoString encodingKey;
SOAPEncodingKey(*nsSOAPUtils::kSOAPEncURI[version], kArraySOAPType, encodingKey);
SetEncoder(encodingKey, handler);
SetDecoder(encodingKey, handler);
}
@ -249,10 +281,10 @@ NS_IMETHODIMP nsDefaultEncoder::Encode(nsISOAPEncoding* aEncoding,
}
nsAutoString encodingKey;
if (typevalue == nsISchemaType::SCHEMA_TYPE_COMPLEX) {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnyTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnyTypeSchemaType, encodingKey);
}
else {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnySimpleTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnySimpleTypeSchemaType, encodingKey);
}
nsresult rc = aEncoding->GetEncoder(encodingKey, getter_AddRefs(encoder));
if (NS_FAILED(rc)) return rc;
@ -289,7 +321,7 @@ NS_IMETHODIMP nsAnyTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
}
}
PRUint16 typevalue;
nativeSchemaURI.Assign(nsSOAPUtils::kXSDURI);
nativeSchemaURI.Assign(*nsSOAPUtils::kXSURI[mVersion]);
aSource->GetDataType(&typevalue);
switch(typevalue) {
case nsIDataType::VTYPE_INT8:
@ -339,7 +371,7 @@ NS_IMETHODIMP nsAnyTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
case nsIDataType::VTYPE_ARRAY:
if (mustBeSimple) return NS_ERROR_ILLEGAL_VALUE;
nativeSchemaType.Assign(kArraySOAPType);
nativeSchemaURI.Assign(nsSOAPUtils::kSOAPEncodingURI);
nativeSchemaURI.Assign(*nsSOAPUtils::kSOAPEncURI[mVersion]);
break;
#if 0
{
@ -389,11 +421,11 @@ NS_IMETHODIMP nsAnyTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
&& !aSchemaType
&& !aName.IsEmpty()) {
nsAutoString type;
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, nativeSchemaURI, type);
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, nativeSchemaURI, mVersion, type);
if (NS_FAILED(rc)) return rc;
type.Append(nsSOAPUtils::kQualifiedSeparator);
type.Append(nativeSchemaType);
rc = (*aReturnValue)->SetAttributeNS(nsSOAPUtils::kXSIURI, nsSOAPUtils::kXSITypeAttribute, type);
rc = (*aReturnValue)->SetAttributeNS(*nsSOAPUtils::kXSIURI[mVersion], nsSOAPUtils::kXSITypeAttribute, type);
}
return rc;
}
@ -420,7 +452,7 @@ NS_IMETHODIMP nsAnySimpleTypeEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kAnySimpleTypeSchemaType,
aDestination,
aReturnValue);
@ -451,7 +483,7 @@ NS_IMETHODIMP nsArrayEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) { // Now create the element to hold the array
rc = EncodeSimpleValue(kEmpty,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kArraySOAPType,
aDestination,
aReturnValue);
@ -474,11 +506,11 @@ NS_IMETHODIMP nsArrayEncoder::Encode(nsISOAPEncoding* aEncoding,
#define DO_SIMPLE_ARRAY(XPType, SOAPType, Format, Source) \
{\
nsAutoString value;\
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, nsSOAPUtils::kXSURI, value);\
rc = nsSOAPUtils::MakeNamespacePrefixFixed(*aReturnValue, *nsSOAPUtils::kXSURI[mVersion], mVersion, value);\
if (NS_FAILED(rc)) return rc;\
value.Append(nsSOAPUtils::kQualifiedSeparator);\
value.Append(k##SOAPType##SchemaType);\
rc = (*aReturnValue)->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, kSOAPArrayTypeAttribute, value);\
rc = (*aReturnValue)->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[mVersion], kSOAPArrayTypeAttribute, value);\
if (NS_FAILED(rc)) return rc;\
XPType* values = NS_STATIC_CAST(XPType*, array);\
nsCOMPtr<nsIDOMElement> dummy;\
@ -489,7 +521,7 @@ NS_IMETHODIMP nsArrayEncoder::Encode(nsISOAPEncoding* aEncoding,
value.Assign(NS_ConvertUTF8toUCS2(nsDependentCString(ptr)).get());\
PR_smprintf_free(ptr);\
rc = EncodeSimpleValue(value,\
nsSOAPUtils::kSOAPEncodingURI,\
*nsSOAPUtils::kSOAPEncURI[mVersion],\
k##SOAPType##SchemaType,\
*aReturnValue,\
getter_AddRefs(dummy));\
@ -557,7 +589,7 @@ NS_IMETHODIMP nsStringEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kStringSchemaType,
aDestination,
aReturnValue);
@ -586,7 +618,7 @@ NS_IMETHODIMP nsBooleanEncoder::Encode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
if (aName.IsEmpty()) {
return EncodeSimpleValue(b ? nsSOAPUtils::kTrue : nsSOAPUtils::kFalse,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kBooleanSchemaType,
aDestination,
aReturnValue);
@ -620,7 +652,7 @@ NS_IMETHODIMP nsDoubleEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kDoubleSchemaType,
aDestination,
aReturnValue);
@ -654,7 +686,7 @@ NS_IMETHODIMP nsFloatEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kFloatSchemaType,
aDestination,
aReturnValue);
@ -688,7 +720,7 @@ NS_IMETHODIMP nsLongEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kLongSchemaType,
aDestination,
aReturnValue);
@ -722,7 +754,7 @@ NS_IMETHODIMP nsIntEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kIntSchemaType,
aDestination,
aReturnValue);
@ -756,7 +788,7 @@ NS_IMETHODIMP nsShortEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kShortSchemaType,
aDestination,
aReturnValue);
@ -790,7 +822,7 @@ NS_IMETHODIMP nsByteEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kByteSchemaType,
aDestination,
aReturnValue);
@ -824,7 +856,7 @@ NS_IMETHODIMP nsUnsignedLongEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kLongSchemaType,
aDestination,
aReturnValue);
@ -858,7 +890,7 @@ NS_IMETHODIMP nsUnsignedIntEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kIntSchemaType,
aDestination,
aReturnValue);
@ -892,7 +924,7 @@ NS_IMETHODIMP nsUnsignedShortEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kShortSchemaType,
aDestination,
aReturnValue);
@ -926,7 +958,7 @@ NS_IMETHODIMP nsUnsignedByteEncoder::Encode(nsISOAPEncoding* aEncoding,
PR_smprintf_free(ptr);
if (aName.IsEmpty()) {
return EncodeSimpleValue(value,
nsSOAPUtils::kSOAPEncodingURI,
*nsSOAPUtils::kSOAPEncURI[mVersion],
kByteSchemaType,
aDestination,
aReturnValue);
@ -951,7 +983,7 @@ NS_IMETHODIMP nsDefaultEncoder::Decode(nsISOAPEncoding* aEncoding,
nsresult rc = aEncoding->GetSchemaCollection(getter_AddRefs(collection));
if (NS_FAILED(rc)) return rc;
nsAutoString explicittype;
rc = aSource->GetAttributeNS(nsSOAPUtils::kXSIURI, nsSOAPUtils::kXSITypeAttribute, explicittype);
rc = aSource->GetAttributeNS(*nsSOAPUtils::kXSIURI[mVersion], nsSOAPUtils::kXSITypeAttribute, explicittype);
if (NS_FAILED(rc)) return rc;
nsAutoString ns;
nsAutoString name;
@ -975,12 +1007,12 @@ NS_IMETHODIMP nsDefaultEncoder::Decode(nsISOAPEncoding* aEncoding,
rc = element->GetType(getter_AddRefs(type));
if (NS_FAILED(rc)) return rc;
}
else if (ns.Equals(nsSOAPUtils::kSOAPEncodingURI)) { // Last-ditch hack to get undeclared types from SOAP namespace
else if (ns.Equals(*nsSOAPUtils::kSOAPEncURI[mVersion])) { // Last-ditch hack to get undeclared types from SOAP namespace
if (name.Equals(kArraySOAPType)) { // This should not be needed if schema has these declarations
rc = collection->GetType(ns, name, getter_AddRefs(type));
}
else {
rc = collection->GetType(nsSOAPUtils::kXSDURI, name, getter_AddRefs(type));
rc = collection->GetType(*nsSOAPUtils::kXSURI[mVersion], name, getter_AddRefs(type));
}
if (NS_FAILED(rc)) return rc;
}
@ -1023,10 +1055,10 @@ NS_IMETHODIMP nsDefaultEncoder::Decode(nsISOAPEncoding* aEncoding,
}
nsAutoString encodingKey;
if (typevalue == nsISchemaType::SCHEMA_TYPE_COMPLEX) {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnyTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnyTypeSchemaType, encodingKey);
}
else {
SOAPEncodingKey(nsSOAPUtils::kXSDURI, kAnySimpleTypeSchemaType, encodingKey);
SOAPEncodingKey(*nsSOAPUtils::kXSURI[mVersion], kAnySimpleTypeSchemaType, encodingKey);
}
nsresult rc = aEncoding->GetDecoder(encodingKey, getter_AddRefs(decoder));
if (NS_FAILED(rc)) return rc;
@ -1109,7 +1141,7 @@ NS_IMETHODIMP nsArrayEncoder::Decode(nsISOAPEncoding* aEncoding,
nsAutoString name;
nsCOMPtr<nsISchemaType>subtype;
nsAutoString value;
nsresult rc = aSource->GetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, kSOAPArrayTypeAttribute, value);
nsresult rc = aSource->GetAttributeNS(*nsSOAPUtils::kSOAPEncURI[mVersion], kSOAPArrayTypeAttribute, value);
if (!value.IsEmpty()) { // Need to truncate []
nsCOMPtr<nsISchemaCollection> collection;
rc = aEncoding->GetSchemaCollection(getter_AddRefs(collection));
@ -1125,8 +1157,7 @@ NS_IMETHODIMP nsArrayEncoder::Decode(nsISOAPEncoding* aEncoding,
if (NS_FAILED(rc)) return rc;
}
}
if (ns.Equals(nsSOAPUtils::kXSURI)
|| ns.Equals(nsSOAPUtils::kXSDURI)) {
if (ns.Equals(*nsSOAPUtils::kXSURI[mVersion])) {
if (name.Equals(kStringSchemaType)) {
}
else if (name.Equals(kBooleanSchemaType)) {
@ -1153,7 +1184,7 @@ NS_IMETHODIMP nsArrayEncoder::Decode(nsISOAPEncoding* aEncoding,
}
else return NS_ERROR_ILLEGAL_VALUE;
}
else if (ns.Equals(nsSOAPUtils::kSOAPEncodingURI))
else if (ns.Equals(*nsSOAPUtils::kSOAPEncURI[mVersion]))
{
if (name.Equals(kArraySOAPType)) {
return NS_ERROR_ILLEGAL_VALUE; // Fix nested arrays later

Просмотреть файл

@ -25,10 +25,16 @@
#include "nsSOAPEncoding.h"
class nsDefaultSOAPEncoder : public nsSOAPEncoding
class nsDefaultSOAPEncoder_1_1 : public nsSOAPEncoding
{
public:
nsDefaultSOAPEncoder();
nsDefaultSOAPEncoder_1_1();
};
class nsDefaultSOAPEncoder_1_2 : public nsSOAPEncoding
{
public:
nsDefaultSOAPEncoder_1_2();
};
#endif

Просмотреть файл

@ -41,7 +41,7 @@ nsHTTPSOAPTransport::~nsHTTPSOAPTransport()
{
}
NS_IMPL_ISUPPORTS1(nsHTTPSOAPTransport, nsISOAPTransport)
NS_IMPL_ISUPPORTS1_CI(nsHTTPSOAPTransport, nsISOAPTransport)
#ifdef DEBUG
#define DEBUG_DUMP_DOCUMENT(message,doc) \
@ -285,3 +285,13 @@ NS_IMETHODIMP nsHTTPSOAPTransport::RemoveListener(nsISOAPTransportListener *aLis
return NS_ERROR_NOT_IMPLEMENTED;
}
nsHTTPSSOAPTransport::nsHTTPSSOAPTransport()
{
NS_INIT_ISUPPORTS();
}
nsHTTPSSOAPTransport::~nsHTTPSSOAPTransport()
{
}
NS_IMPL_ISUPPORTS1_CI(nsHTTPSSOAPTransport, nsISupports)

Просмотреть файл

@ -45,6 +45,15 @@ public:
NS_DECL_NSISOAPTRANSPORT
};
class nsHTTPSSOAPTransport: public nsHTTPSOAPTransport
{
public:
nsHTTPSSOAPTransport();
virtual ~nsHTTPSSOAPTransport();
NS_DECL_ISUPPORTS
};
class nsHTTPSOAPTransportCompletion : public nsIDOMEventListener, public nsISOAPCallCompletion
{
public:
@ -77,4 +86,10 @@ protected:
0x9032e336, 0x1dd2, 0x11b2, \
{0x99, 0xbe, 0xa4, 0x43, 0x76, 0xd4, 0xd5, 0xb1} }
#define NS_HTTPSOAPTRANSPORTCOMPLETION_CONTRACTID "@mozilla.org/xmlextras/soap/transport/completion;1?protocol=http"
#define NS_HTTPSSOAPTRANSPORT_CID \
{ /* aad00c5a-1dd1-11b2-9ee1-c9f6b898a7b8 */ \
0xaad00c5a, 0x1dd1, 0x11b2, \
{0x9e, 0xe1, 0xc9, 0xf6, 0xb8, 0x98, 0xa7, 0xb8} }
#define NS_HTTPSSOAPTRANSPORT_CONTRACTID NS_SOAPTRANSPORT_CONTRACTID_PREFIX "https"
#endif

Просмотреть файл

@ -169,8 +169,20 @@ nsSOAPEncoding::nsSOAPEncoding(): mEncoders(new nsSupportsHashtable),
/* member initializers and constructor code */
mStyleURI.Assign(nsSOAPUtils::kSOAPEncodingURI);
mDefaultEncoding = do_GetService(NS_DEFAULTSOAPENCODER_CONTRACTID);
mStyleURI.Assign(*nsSOAPUtils::kSOAPEncURI[nsISOAPMessage::VERSION_1_1]);
mDefaultEncoding = do_GetService(NS_DEFAULTSOAPENCODER_1_1_CONTRACTID);
mRegistry = new nsSOAPEncodingRegistry(this);
}
nsSOAPEncoding::nsSOAPEncoding(unsigned short aVersion): mEncoders(new nsSupportsHashtable),
mDecoders(new nsSupportsHashtable)
{
NS_INIT_ISUPPORTS();
/* member initializers and constructor code */
mStyleURI.Assign(*nsSOAPUtils::kSOAPEncURI[aVersion]);
mDefaultEncoding = do_GetService(aVersion ? NS_DEFAULTSOAPENCODER_1_2_CONTRACTID : NS_DEFAULTSOAPENCODER_1_1_CONTRACTID);
mRegistry = new nsSOAPEncodingRegistry(this);
}

Просмотреть файл

@ -61,6 +61,7 @@ public:
NS_DECL_NSISECURITYCHECKEDCOMPONENT
nsSOAPEncoding();
nsSOAPEncoding(unsigned short aVersion);
nsSOAPEncoding(const nsAString& aStyleURI, nsSOAPEncodingRegistry * aRegistry, nsISOAPEncoding* aDefaultEncoding);
virtual ~nsSOAPEncoding();
/* additional members */

Просмотреть файл

@ -23,6 +23,7 @@
#include "nsSOAPFault.h"
#include "nsSOAPUtils.h"
#include "nsIDOMNodeList.h"
#include "nsISOAPMessage.h"
nsSOAPFault::nsSOAPFault(nsIDOMElement* aElement)
{
@ -39,6 +40,28 @@ NS_IMPL_ISUPPORTS2_CI(nsSOAPFault, nsISOAPFault, nsISecurityCheckedComponent)
/* attribute nsIDOMElement element; */
NS_IMETHODIMP nsSOAPFault::SetElement(nsIDOMElement *aElement)
{
if (aElement) {
nsAutoString namespaceURI;
nsAutoString name;
nsresult rc = aElement->GetNamespaceURI(namespaceURI);
if (NS_FAILED(rc)) return rc;
rc = aElement->GetLocalName(name);
if (NS_FAILED(rc)) return rc;
if (name.Equals(nsSOAPUtils::kFaultTagName)) {
if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])) {
mVersion = nsISOAPMessage::VERSION_1_2;
}
else if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])) {
mVersion = nsISOAPMessage::VERSION_1_1;
}
else {
return NS_ERROR_ILLEGAL_VALUE;
}
}
else {
return NS_ERROR_ILLEGAL_VALUE;
}
}
mFaultElement = aElement;
return NS_OK;
}
@ -54,10 +77,11 @@ NS_IMETHODIMP nsSOAPFault::GetElement(nsIDOMElement * *aElement)
NS_IMETHODIMP nsSOAPFault::GetFaultCode(nsAString & aFaultCode)
{
NS_ENSURE_ARG_POINTER(&aFaultCode);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
aFaultCode.Truncate();
nsCOMPtr<nsIDOMElement> faultcode;
nsSOAPUtils::GetSpecificChildElement(mFaultElement,
nsSOAPUtils::kSOAPEnvURI,
*nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultCodeTagName,
getter_AddRefs(faultcode));
if (faultcode) {
@ -70,10 +94,11 @@ NS_IMETHODIMP nsSOAPFault::GetFaultCode(nsAString & aFaultCode)
NS_IMETHODIMP nsSOAPFault::GetFaultString(nsAString & aFaultString)
{
NS_ENSURE_ARG_POINTER(&aFaultString);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
aFaultString.Truncate();
nsCOMPtr<nsIDOMElement> element;
nsSOAPUtils::GetSpecificChildElement(mFaultElement, nsSOAPUtils::kSOAPEnvURI,
nsSOAPUtils::GetSpecificChildElement(mFaultElement, *nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultStringTagName, getter_AddRefs(element));
if (element) {
nsSOAPUtils::GetElementTextContent(element, aFaultString);
@ -85,10 +110,11 @@ NS_IMETHODIMP nsSOAPFault::GetFaultString(nsAString & aFaultString)
NS_IMETHODIMP nsSOAPFault::GetFaultActor(nsAString & aFaultActor)
{
NS_ENSURE_ARG_POINTER(&aFaultActor);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
aFaultActor.Truncate();
nsCOMPtr<nsIDOMElement> element;
nsSOAPUtils::GetSpecificChildElement(mFaultElement, nsSOAPUtils::kSOAPEnvURI,
nsSOAPUtils::GetSpecificChildElement(mFaultElement, *nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultActorTagName, getter_AddRefs(element));
if (element) {
nsSOAPUtils::GetElementTextContent(element, aFaultActor);
@ -100,9 +126,10 @@ NS_IMETHODIMP nsSOAPFault::GetFaultActor(nsAString & aFaultActor)
NS_IMETHODIMP nsSOAPFault::GetDetail(nsIDOMElement * *aDetail)
{
NS_ENSURE_ARG_POINTER(aDetail);
if (!mFaultElement) return NS_ERROR_ILLEGAL_VALUE;
nsCOMPtr<nsIDOMElement> element;
nsSOAPUtils::GetSpecificChildElement(mFaultElement, nsSOAPUtils::kSOAPEnvURI,
nsSOAPUtils::GetSpecificChildElement(mFaultElement, *nsSOAPUtils::kSOAPEnvURI[mVersion],
nsSOAPUtils::kFaultDetailTagName, aDetail);
return NS_OK;
}

Просмотреть файл

@ -46,5 +46,6 @@ public:
protected:
nsCOMPtr<nsIDOMElement> mFaultElement;
unsigned short mVersion;
};
#endif

Просмотреть файл

@ -26,13 +26,14 @@
#include "nsSOAPUtils.h"
#include "nsIServiceManager.h"
#include "nsISOAPAttachments.h"
#include "nsISOAPMessage.h"
nsSOAPHeaderBlock::nsSOAPHeaderBlock()
nsSOAPHeaderBlock::nsSOAPHeaderBlock():mVersion(nsISOAPMessage::VERSION_UNKNOWN)
{
NS_INIT_ISUPPORTS();
}
nsSOAPHeaderBlock::nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments): nsSOAPBlock(aAttachments)
nsSOAPHeaderBlock::nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments, unsigned short aVersion): nsSOAPBlock(aAttachments), mVersion(aVersion)
{
}
@ -54,7 +55,8 @@ NS_IMETHODIMP nsSOAPHeaderBlock::GetActorURI(nsAString & aActorURI)
{
NS_ENSURE_ARG_POINTER(&aActorURI);
if (mElement) {
return mElement->GetAttributeNS(nsSOAPUtils::kSOAPEnvURI,nsSOAPUtils::kActorAttribute,aActorURI);
if (mVersion == nsISOAPMessage::VERSION_UNKNOWN) return NS_ERROR_NOT_AVAILABLE;
return mElement->GetAttributeNS(*nsSOAPUtils::kSOAPEnvURI[mVersion],nsSOAPUtils::kActorAttribute,aActorURI);
}
else {
aActorURI.Assign(mActorURI);
@ -74,12 +76,13 @@ NS_IMETHODIMP nsSOAPHeaderBlock::GetMustUnderstand(PRBool * aMustUnderstand)
{
NS_ENSURE_ARG_POINTER(&aMustUnderstand);
if (mElement) {
if (mVersion == nsISOAPMessage::VERSION_UNKNOWN) return NS_ERROR_NOT_AVAILABLE;
nsAutoString m;
nsresult rc = mElement->GetAttributeNS(nsSOAPUtils::kSOAPEnvURI,nsSOAPUtils::kMustUnderstandAttribute,m);
nsresult rc = mElement->GetAttributeNS(*nsSOAPUtils::kSOAPEnvURI[mVersion],nsSOAPUtils::kMustUnderstandAttribute,m);
if (NS_FAILED(rc)) return rc;
if (m.Length() == 0) *aMustUnderstand = PR_FALSE;
else if (m.Equals(nsSOAPUtils::kTrueA) || m.Equals(nsSOAPUtils::kTrueA)) *aMustUnderstand = PR_TRUE;
else if (m.Equals(nsSOAPUtils::kFalseA) || m.Equals(nsSOAPUtils::kFalseA)) *aMustUnderstand = PR_FALSE;
else if (m.Equals(nsSOAPUtils::kTrue) || m.Equals(nsSOAPUtils::kTrueA)) *aMustUnderstand = PR_TRUE;
else if (m.Equals(nsSOAPUtils::kFalse) || m.Equals(nsSOAPUtils::kFalseA)) *aMustUnderstand = PR_FALSE;
else return NS_ERROR_ILLEGAL_VALUE;
return NS_OK;
}

Просмотреть файл

@ -40,7 +40,7 @@ class nsSOAPHeaderBlock : public nsSOAPBlock,
{
public:
nsSOAPHeaderBlock();
nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments);
nsSOAPHeaderBlock(nsISOAPAttachments* aAttachments, unsigned short aVersion);
virtual ~nsSOAPHeaderBlock();
NS_DECL_ISUPPORTS
@ -56,6 +56,7 @@ public:
protected:
nsString mActorURI;
PRBool mMustUnderstand;
PRBool mVersion;
};
#endif

Просмотреть файл

@ -75,32 +75,95 @@ NS_IMETHODIMP nsSOAPMessage::GetEnvelope(nsIDOMElement * *aEnvelope)
nsCOMPtr<nsIDOMElement> root;
mMessage->GetDocumentElement(getter_AddRefs(root));
if (root) {
nsAutoString name, namespaceURI;
root->GetLocalName(name);
root->GetNamespaceURI(namespaceURI);
nsAutoString namespaceURI;
nsAutoString name;
nsresult rc = root->GetNamespaceURI(namespaceURI);
if (NS_FAILED(rc)) return rc;
rc = root->GetLocalName(name);
if (NS_FAILED(rc)) return rc;
if (name.Equals(nsSOAPUtils::kEnvelopeTagName)
&& namespaceURI.Equals(nsSOAPUtils::kSOAPEnvURI))
&& (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])
|| namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])))
{
*aEnvelope = root;
NS_ADDREF(*aEnvelope);
return NS_OK;
}
}
}
*aEnvelope = nsnull;
return NS_OK;
}
/* readonly attribute unsigned short version; */
NS_IMETHODIMP nsSOAPMessage::GetVersion(PRUint16 *aVersion)
{
if (mMessage) {
nsCOMPtr<nsIDOMElement> root;
mMessage->GetDocumentElement(getter_AddRefs(root));
if (root) {
nsAutoString namespaceURI;
nsAutoString name;
nsresult rc = root->GetNamespaceURI(namespaceURI);
if (NS_FAILED(rc)) return rc;
rc = root->GetLocalName(name);
if (NS_FAILED(rc)) return rc;
if (name.Equals(nsSOAPUtils::kEnvelopeTagName)) {
if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])) {
*aVersion = nsISOAPMessage::VERSION_1_2;
return NS_OK;
}
else if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])) {
*aVersion = nsISOAPMessage::VERSION_1_1;
return NS_OK;
}
}
}
}
*aVersion = nsISOAPMessage::VERSION_UNKNOWN;
return NS_OK;
}
/* Internal method for getting envelope and version */
unsigned short nsSOAPMessage::GetEnvelopeWithVersion(nsIDOMElement * *aEnvelope)
{
NS_ENSURE_ARG_POINTER(aEnvelope);
if (mMessage) {
nsCOMPtr<nsIDOMElement> root;
mMessage->GetDocumentElement(getter_AddRefs(root));
if (root) {
nsAutoString namespaceURI;
nsAutoString name;
root->GetNamespaceURI(namespaceURI);
root->GetLocalName(name);
if (name.Equals(nsSOAPUtils::kEnvelopeTagName)) {
if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_2])) {
*aEnvelope = root;
NS_ADDREF(*aEnvelope);
return nsISOAPMessage::VERSION_1_2;
}
else if (namespaceURI.Equals(*nsSOAPUtils::kSOAPEnvURI[nsISOAPMessage::VERSION_1_1])) {
*aEnvelope = root;
NS_ADDREF(*aEnvelope);
return nsISOAPMessage::VERSION_1_1;
}
}
}
}
*aEnvelope = nsnull;
return nsISOAPMessage::VERSION_UNKNOWN;
}
/* readonly attribute nsIDOMElement header; */
NS_IMETHODIMP nsSOAPMessage::GetHeader(nsIDOMElement * *aHeader)
{
NS_ENSURE_ARG_POINTER(aHeader);
nsCOMPtr<nsIDOMElement> env;
GetEnvelope(getter_AddRefs(env));
unsigned short version = GetEnvelopeWithVersion(getter_AddRefs(env));
if (env) {
nsSOAPUtils::GetSpecificChildElement(env,
nsSOAPUtils::kSOAPEnvURI, nsSOAPUtils::kHeaderTagName,
*nsSOAPUtils::kSOAPEnvURI[version], nsSOAPUtils::kHeaderTagName,
aHeader);
}
else {
@ -114,10 +177,10 @@ NS_IMETHODIMP nsSOAPMessage::GetBody(nsIDOMElement * *aBody)
{
NS_ENSURE_ARG_POINTER(aBody);
nsCOMPtr<nsIDOMElement> env;
GetEnvelope(getter_AddRefs(env));
unsigned short version = GetEnvelopeWithVersion(getter_AddRefs(env));
if (env) {
nsSOAPUtils::GetSpecificChildElement(env,
nsSOAPUtils::kSOAPEnvURI, nsSOAPUtils::kBodyTagName,
*nsSOAPUtils::kSOAPEnvURI[version], nsSOAPUtils::kBodyTagName,
aBody);
}
else {
@ -175,11 +238,17 @@ NS_IMETHODIMP nsSOAPMessage::GetTargetObjectURI(nsAString & aTargetObjectURI)
return NS_OK;
}
NS_NAMED_LITERAL_STRING(kEmptySOAPDocStr, "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema-datatypes\"><SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>");
NS_NAMED_LITERAL_STRING(realEmptySOAPDocStr1, "<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:enc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/1999/XMLSchema\"><env:Header/><env:Body/></env:Envelope>");
NS_NAMED_LITERAL_STRING(realEmptySOAPDocStr2, "<env:Envelope xmlns:env=\"http://www.w3.org/2001/09/soap-envelope\" xmlns:enc=\"http://www.w3.org/2001/09/soap-encoding\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><env:Header/><env:Body/></env:Envelope>");
const nsAString* kEmptySOAPDocStr[] = {&realEmptySOAPDocStr1, &realEmptySOAPDocStr2};
/* void encode (in AString aMethodName, in AString aTargetObjectURI, in PRUint32 aHeaderBlockCount, [array, size_is (aHeaderBlockCount)] in nsISOAPHeaderBlock aHeaderBlocks, in PRUint32 aParameterCount, [array, size_is (aParameterCount)] in nsISOAPParameter aParameters); */
NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAString & aTargetObjectURI, PRUint32 aHeaderBlockCount, nsISOAPHeaderBlock **aHeaderBlocks, PRUint32 aParameterCount, nsISOAPParameter **aParameters)
NS_IMETHODIMP nsSOAPMessage::Encode(unsigned short aVersion, const nsAString & aMethodName, const nsAString & aTargetObjectURI, PRUint32 aHeaderBlockCount, nsISOAPHeaderBlock **aHeaderBlocks, PRUint32 aParameterCount, nsISOAPParameter **aParameters)
{
if (aVersion != nsISOAPMessage::VERSION_1_1
&& aVersion != nsISOAPMessage::VERSION_1_2)
return NS_ERROR_ILLEGAL_VALUE;
// Construct the message skeleton
@ -189,7 +258,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (NS_FAILED(rv)) return rv;
nsAutoString docstr;
rv = parser->ParseFromString(kEmptySOAPDocStr.get(), "text/xml",
rv = parser->ParseFromString(nsString(*kEmptySOAPDocStr[aVersion]).get(), "text/xml",
getter_AddRefs(mMessage));
if (NS_FAILED(rv)) return rv;
@ -202,7 +271,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (envelope) {
nsAutoString enc;
mEncoding->GetStyleURI(enc);
envelope->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, nsSOAPUtils::kEncodingStyleAttribute, enc);
envelope->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[aVersion], nsSOAPUtils::kEncodingStyleAttribute, enc);
}
}
@ -268,7 +337,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (mEncoding != encoding) {
nsAutoString enc;
encoding->GetStyleURI(enc);
element->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, nsSOAPUtils::kEncodingStyleAttribute, enc);
element->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[aVersion], nsSOAPUtils::kEncodingStyleAttribute, enc);
}
}
}
@ -288,7 +357,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (NS_FAILED(rv)) return rv;
body = call;
nsAutoString prefix;
rv = nsSOAPUtils::MakeNamespacePrefixFixed(body, aTargetObjectURI, prefix);
rv = nsSOAPUtils::MakeNamespacePrefixFixed(body, aTargetObjectURI, aVersion, prefix);
if (NS_FAILED(rv)) return rv;
if (!prefix.IsEmpty()) {
rv = body->SetPrefix(prefix);
@ -340,7 +409,7 @@ NS_IMETHODIMP nsSOAPMessage::Encode(const nsAString & aMethodName, const nsAStri
if (mEncoding != encoding) {
nsAutoString enc;
encoding->GetStyleURI(enc);
element->SetAttributeNS(nsSOAPUtils::kSOAPEncodingURI, nsSOAPUtils::kEncodingStyleAttribute, enc);
element->SetAttributeNS(*nsSOAPUtils::kSOAPEncURI[aVersion], nsSOAPUtils::kEncodingStyleAttribute, enc);
}
}
}
@ -430,9 +499,14 @@ NS_IMETHODIMP nsSOAPMessage::GetEncoding(nsISOAPEncoding* * aEncoding)
{
NS_ENSURE_ARG_POINTER(aEncoding);
if (!mEncoding) {
mEncoding = new nsSOAPEncoding();
if (!mEncoding)
return NS_ERROR_OUT_OF_MEMORY;
unsigned short version;
nsresult rc = GetVersion(&version);
if (NS_FAILED(rc)) return rc;
if (version != nsISOAPMessage::VERSION_UNKNOWN) {
mEncoding = new nsSOAPEncoding(version);
if (!mEncoding)
return NS_ERROR_OUT_OF_MEMORY;
}
}
*aEncoding = mEncoding;
NS_IF_ADDREF(*aEncoding);

Просмотреть файл

@ -50,6 +50,7 @@ public:
protected:
unsigned short GetEnvelopeWithVersion(nsIDOMElement * *aEnvelope);
nsCOMPtr<nsIDOMDocument> mMessage;
nsCOMPtr<nsISOAPEncoding> mEncoding;
nsString mActionURI;

Просмотреть файл

@ -51,16 +51,23 @@ NS_IMETHODIMP nsSOAPResponse::GetFault(nsISOAPFault * *aFault)
nsCOMPtr<nsIDOMElement> body;
*aFault = nsnull;
GetBody(getter_AddRefs(body));
nsresult rc = GetBody(getter_AddRefs(body));
if (NS_FAILED(rc)) return rc;
if (body) {
nsSOAPUtils::GetSpecificChildElement(body,
nsSOAPUtils::kSOAPEnvURI, nsSOAPUtils::kFaultTagName,
getter_AddRefs(body));
if (body) {
*aFault = new nsSOAPFault(body);
if (!*aFault)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*aFault);
unsigned short version;
rc = GetVersion(&version);
if (NS_FAILED(rc)) return rc;
if (rc != nsSOAPMessage::VERSION_UNKNOWN) {
nsCOMPtr<nsIDOMElement> fault;
nsSOAPUtils::GetSpecificChildElement(body,
*nsSOAPUtils::kSOAPEnvURI[version], nsSOAPUtils::kFaultTagName,
getter_AddRefs(fault));
if (fault) {
*aFault = new nsSOAPFault(fault);
if (!*aFault)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*aFault);
}
}
}
else {

Просмотреть файл

@ -22,29 +22,31 @@
#include "nsSOAPUtils.h"
#include "nsIDOMText.h"
#include "nsISOAPMessage.h"
#include "nsIDOMNamedNodeMap.h"
#include "nsCOMPtr.h"
NS_NAMED_LITERAL_STRING(realSOAPEnvURI,"http://schemas.xmlsoap.org/soap/envelope/");
const nsAString& nsSOAPUtils::kSOAPEnvURI = realSOAPEnvURI;
NS_NAMED_LITERAL_STRING(realSOAPEnvURI1,"http://schemas.xmlsoap.org/soap/envelope/");
NS_NAMED_LITERAL_STRING(realSOAPEnvURI2,"http://www.w3.org/2001/09/soap-envelope");
const nsAString* nsSOAPUtils::kSOAPEnvURI[] = {&realSOAPEnvURI1, &realSOAPEnvURI2};
NS_NAMED_LITERAL_STRING(realSOAPEncodingURI,"http://schemas.xmlsoap.org/soap/encoding/");
const nsAString& nsSOAPUtils::kSOAPEncodingURI = realSOAPEncodingURI;
NS_NAMED_LITERAL_STRING(realSOAPEncURI1,"http://schemas.xmlsoap.org/soap/encoding/");
NS_NAMED_LITERAL_STRING(realSOAPEncURI2,"http://www.w3.org/2001/09/soap-encoding");
const nsAString* nsSOAPUtils::kSOAPEncURI[] = {&realSOAPEncURI1, &realSOAPEncURI2};
NS_NAMED_LITERAL_STRING(realSOAPEnvPrefix,"SOAP-ENV");
NS_NAMED_LITERAL_STRING(realXSIURI1,"http://www.w3.org/1999/XMLSchema-instance");
NS_NAMED_LITERAL_STRING(realXSIURI2,"http://www.w3.org/2001/XMLSchema-instance");
const nsAString* nsSOAPUtils::kXSIURI[] = {&realXSIURI1, &realXSIURI2};
NS_NAMED_LITERAL_STRING(realXSURI1,"http://www.w3.org/1999/XMLSchema");
NS_NAMED_LITERAL_STRING(realXSURI2,"http://www.w3.org/2001/XMLSchema");
const nsAString* nsSOAPUtils::kXSURI[] = {&realXSURI1, &realXSURI2};
NS_NAMED_LITERAL_STRING(realSOAPEnvPrefix,"env");
const nsAString& nsSOAPUtils::kSOAPEnvPrefix = realSOAPEnvPrefix;
NS_NAMED_LITERAL_STRING(realSOAPEncodingPrefix,"SOAP-ENC");
const nsAString& nsSOAPUtils::kSOAPEncodingPrefix = realSOAPEncodingPrefix;
NS_NAMED_LITERAL_STRING(realXSURI,"http://www.w3.org/2001/XMLSchema");
const nsAString& nsSOAPUtils::kXSURI = realXSURI;
NS_NAMED_LITERAL_STRING(realXSIURI,"http://www.w3.org/2001/XMLSchema-instance");
const nsAString& nsSOAPUtils::kXSIURI = realXSIURI;
NS_NAMED_LITERAL_STRING(realXSDURI,"http://www.w3.org/2001/XMLSchema-datatypes");
const nsAString& nsSOAPUtils::kXSDURI = realXSDURI;
NS_NAMED_LITERAL_STRING(realSOAPEncPrefix,"enc");
const nsAString& nsSOAPUtils::kSOAPEncPrefix = realSOAPEncPrefix;
NS_NAMED_LITERAL_STRING(realXSIPrefix,"xsi");
const nsAString& nsSOAPUtils::kXSIPrefix = realXSIPrefix;
@ -55,9 +57,6 @@ const nsAString& nsSOAPUtils::kXSITypeAttribute = realXSITypeAttribute;
NS_NAMED_LITERAL_STRING(realXSPrefix,"xs");
const nsAString& nsSOAPUtils::kXSPrefix = realXSPrefix;
NS_NAMED_LITERAL_STRING(realXSDPrefix,"xsd");
const nsAString& nsSOAPUtils::kXSDPrefix = realXSDPrefix;
NS_NAMED_LITERAL_STRING(realEncodingStyleAttribute,"encodingStyle");
const nsAString& nsSOAPUtils::kEncodingStyleAttribute = realEncodingStyleAttribute;
@ -155,7 +154,7 @@ nsSOAPUtils::GetSpecificSiblingElement(
sibling->GetLocalName(name);
sibling->GetNamespaceURI(namespaceURI);
if (name.Equals(aType)
&& namespaceURI.Equals(nsSOAPUtils::kSOAPEnvURI))
&& namespaceURI.Equals(aNamespace))
{
*aElement = sibling;
NS_ADDREF(*aElement);
@ -454,20 +453,25 @@ nsSOAPUtils::MakeNamespacePrefix(nsIDOMElement* aScope,
*i2 = 'n';
return NS_OK;
}
/**
* This code optimizes the cases of known prefixes, which
* it is assumed are not overridden. The specified version
* number is also assumed to be correct.
*/
nsresult
nsSOAPUtils::MakeNamespacePrefixFixed(nsIDOMElement* aScope,
const nsAString & aURI,
PRUint16 aVersion,
nsAString & aPrefix)
{
if (aURI.Equals(kSOAPEncodingURI))
aPrefix = kSOAPEncodingPrefix;
else if (aURI.Equals(kSOAPEnvURI))
if (aURI.Equals(*kSOAPEncURI[aVersion]))
aPrefix = kSOAPEncPrefix;
else if (aURI.Equals(*kSOAPEnvURI[aVersion]))
aPrefix = kSOAPEnvPrefix;
else if (aURI.Equals(kXSIURI))
else if (aURI.Equals(*kXSIURI[aVersion]))
aPrefix = kXSIPrefix;
else if (aURI.Equals(kXSDURI))
aPrefix = kXSDPrefix;
else if (aURI.Equals(*kXSURI[aVersion]))
aPrefix = kXSPrefix;
else
return MakeNamespacePrefix(aScope, aURI, aPrefix);

Просмотреть файл

@ -51,6 +51,7 @@ public:
nsAString & aPrefix);
static nsresult MakeNamespacePrefixFixed(nsIDOMElement* aElement,
const nsAString & aURI,
PRUint16 aVersion,
nsAString & aPrefix);
static nsresult GetNamespaceURI(nsIDOMElement* aElement,
const nsAString & aQName,
@ -62,17 +63,17 @@ public:
static PRBool StartsWith(nsAString& aSuper,
nsAString& aSub);
static const nsAString& kSOAPEnvURI;
static const nsAString& kSOAPEncodingURI;
static const nsAString* kSOAPEnvURI[];
static const nsAString* kSOAPEncURI[];
static const nsAString* kXSIURI[];
static const nsAString* kXSURI[];
static const nsAString& kSOAPEnvPrefix;
static const nsAString& kSOAPEncodingPrefix;
static const nsAString& kXSURI;
static const nsAString& kXSIURI;
static const nsAString& kXSDURI;
static const nsAString& kXSPrefix;
static const nsAString& kSOAPEncPrefix;
static const nsAString& kXSIPrefix;
static const nsAString& kXSITypeAttribute;
static const nsAString& kXSDPrefix;
static const nsAString& kXSPrefix;
static const nsAString& kEncodingStyleAttribute;
static const nsAString& kActorAttribute;
static const nsAString& kMustUnderstandAttribute;

Просмотреть файл

@ -22,10 +22,7 @@ function oncompletion(resp, call, status) {
alert("Fault:\nFault code: " + f.faultCode + "\nFault string: " + f.faultString + "\nFault actor: " + f.faultActor + "\nDetail: " + detailStr);
}
else {
function Count() {
}
var count = new Count();
var ret = resp.getParameters(false, count);
var ret = resp.getParameters(false, {});
var val = ret[0].value;
var retStr = "Success:\nName: " + ret.name + "\nValue: " + val;
// In this case, we happen to know that the result value is an array
@ -75,7 +72,7 @@ function makeCall(syncCall, faultCall) {
// the last parameter is an object that will be serialized into
// a struct parameter. It does not have a parameter wrapper because
// we don't need it to be named
s.encode("GetLastTradePrice", "uri:some-namespace", 0, null, 3, new Array(p1, p2, p3, p4, new SOAPParameter(new Dog("Fido", "Lab", "Black"))));
s.encode(1, "GetLastTradePrice", "uri:some-namespace", 0, null, 3, new Array(p1, p2, p3, p4, new SOAPParameter(new Dog("Fido", "Lab", "Black"))));
if (syncCall) {
var r = s.invoke();