Checking in changes that are the result of the review and super review of the WSDL code. The review was performed by harishd@netscape.com, jgaunt@netscape.com, and jst@netscape.com. Not part of the build yet.

This commit is contained in:
jst%netscape.com 2003-03-18 22:44:12 +00:00
parent c591e04a1a
commit 21ca0da5ff
14 changed files with 1148 additions and 1098 deletions

View File

@ -36,7 +36,8 @@ interface nsIWSDLPart;
interface nsIDOMElement;
[scriptable, uuid(0458dac1-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLPort : nsISupports {
interface nsIWSDLPort : nsISupports
{
readonly attribute AString name;
readonly attribute nsIDOMElement documentation;
@ -48,7 +49,8 @@ interface nsIWSDLPort : nsISupports {
};
[scriptable, uuid(0458dac2-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLOperation : nsISupports {
interface nsIWSDLOperation : nsISupports
{
readonly attribute AString name;
readonly attribute nsIDOMElement documentation;
@ -65,7 +67,8 @@ interface nsIWSDLOperation : nsISupports {
};
[scriptable, uuid(0458dac3-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLMessage : nsISupports {
interface nsIWSDLMessage : nsISupports
{
readonly attribute AString name;
readonly attribute nsIDOMElement documentation;
@ -77,7 +80,8 @@ interface nsIWSDLMessage : nsISupports {
};
[scriptable, uuid(0458dac4-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLPart : nsISupports {
interface nsIWSDLPart : nsISupports
{
readonly attribute AString name;
readonly attribute nsIWSDLBinding binding;
@ -94,7 +98,8 @@ interface nsIWSDLPart : nsISupports {
};
[scriptable, uuid(0458dac0-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLBinding : nsISupports {
interface nsIWSDLBinding : nsISupports
{
readonly attribute AString protocol;
readonly attribute nsIDOMElement documentation;
};

View File

@ -30,21 +30,21 @@
interface nsIWSDLPort;
interface nsIWSDLLoadListener;
// Does this need to be scriptable, and exposed to scripters? We think
// not...
[scriptable, uuid(0458dac5-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLLoader : nsISupports {
interface nsIWSDLLoader : nsISupports
{
nsIWSDLPort load(in AString wsdlURI, in AString portName);
void loadAsync(in AString wsdlURI, in AString portName,
in nsIWSDLLoadListener listener);
nsISupports createPortProxy(in nsIWSDLPort service,
in AString nameSpace,
in boolean sync);
};
[scriptable, uuid(0458dac6-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLLoadListener : nsISupports {
interface nsIWSDLLoadListener : nsISupports
{
void onLoad(in nsIWSDLPort port);
void onError(in nsresult status,
in AString statusMessage);
void onError(in nsresult status, in AString statusMessage);
};
%{ C++

View File

@ -28,11 +28,16 @@
#include "nsAString.h"
%}
[scriptable, uuid(0458dac7-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPPortBinding : nsIWSDLBinding {
[scriptable, uuid(bb76b72e-d143-4738-804a-53b311466dd9)]
interface nsIWSDLSOAPBinding : nsIWSDLBinding
{
const unsigned short STYLE_RPC = 1;
const unsigned short STYLE_DOCUMENT = 2;
};
[scriptable, uuid(0458dac7-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPPortBinding : nsIWSDLSOAPBinding
{
const unsigned short SOAP_VERSION_1_1 = 0;
const unsigned short SOAP_VERSION_1_2 = 1;
const unsigned short SOAP_VERSION_UNKNOWN = 32767;
@ -45,18 +50,21 @@ interface nsISOAPPortBinding : nsIWSDLBinding {
};
[scriptable, uuid(0458dac8-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPOperationBinding : nsIWSDLBinding {
interface nsISOAPOperationBinding : nsIWSDLSOAPBinding
{
readonly attribute unsigned short style;
readonly attribute AString soapAction;
};
[scriptable, uuid(c3c4614c-301a-44af-ad70-936f9fd1ba5c)]
interface nsISOAPMessageBinding : nsIWSDLBinding {
interface nsISOAPMessageBinding : nsIWSDLSOAPBinding
{
readonly attribute AString namespace;
};
[scriptable, uuid(0458dac9-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPPartBinding : nsIWSDLBinding {
interface nsISOAPPartBinding : nsIWSDLSOAPBinding
{
const unsigned short LOCATION_BODY = 1;
const unsigned short LOCATION_HEADER = 2;
const unsigned short LOCATION_FAULT = 3;

View File

@ -67,17 +67,25 @@ nsWSDLPort::GetOperationCount(PRUint32 *aOperationCount)
{
NS_ENSURE_ARG_POINTER(aOperationCount);
return mOperations.Count(aOperationCount);
*aOperationCount = mOperations.Count();
return NS_OK;
}
/* nsIWSDLOperation getOperation (in PRUint32 index); */
NS_IMETHODIMP
nsWSDLPort::GetOperation(PRUint32 index, nsIWSDLOperation **_retval)
nsWSDLPort::GetOperation(PRUint32 aIndex, nsIWSDLOperation **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
return mOperations.QueryElementAt(index, NS_GET_IID(nsIWSDLOperation),
(void**)_retval);
if (aIndex < (PRUint32)mOperations.Count()) {
*_retval = mOperations[aIndex];
NS_IF_ADDREF(*_retval);
} else {
*_retval = nsnull;
}
return NS_OK;
}
/* nsIWSDLOperation getOperationByName(in AString name); */
@ -85,22 +93,18 @@ NS_IMETHODIMP
nsWSDLPort::GetOperationByName(const nsAString& aName,
nsIWSDLOperation** aOperation)
{
nsresult rv;
*aOperation = nsnull;
nsAutoString name;
// XXX Do a linear search for now. If more efficiency is needed
// we can store the opeartions in a hash as well.
PRUint32 index, count;
mOperations.Count(&count);
PRUint32 i, count = mOperations.Count();
for (index = 0; index < count; index++) {
nsCOMPtr<nsIWSDLOperation> operation;
for (i = 0; i < count; i++) {
nsIWSDLOperation *operation = mOperations[i];
rv = mOperations.QueryElementAt(index, NS_GET_IID(nsIWSDLOperation),
getter_AddRefs(operation));
if (NS_SUCCEEDED(rv)) {
nsAutoString name;
if (operation) {
operation->GetName(name);
if (name.Equals(aName)) {
@ -125,7 +129,7 @@ nsWSDLPort::GetBinding(nsIWSDLBinding** aBinding)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLPort::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -133,15 +137,15 @@ nsWSDLPort::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLPort::AddOperation(nsIWSDLOperation* aOperation)
{
NS_ENSURE_ARG(aOperation);
return mOperations.AppendElement(aOperation);
return mOperations.AppendObject(aOperation) ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsresult
nsWSDLPort::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -155,8 +159,8 @@ nsWSDLPort::SetBinding(nsIWSDLBinding* aBinding)
//
////////////////////////////////////////////////////////////
nsSOAPPortBinding::nsSOAPPortBinding(const nsAString& aName)
: mName(aName), mStyle(STYLE_RPC),
mSoapVersion(nsISOAPPortBinding::SOAP_VERSION_UNKNOWN)
: mName(aName), mSoapVersion(nsISOAPPortBinding::SOAP_VERSION_UNKNOWN),
mStyle(STYLE_RPC)
{
}
@ -164,8 +168,7 @@ nsSOAPPortBinding::~nsSOAPPortBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPPortBinding,
nsIWSDLBinding,
NS_IMPL_ISUPPORTS3_CI(nsSOAPPortBinding, nsIWSDLBinding, nsIWSDLSOAPBinding,
nsISOAPPortBinding)
/* readonly attribute AString protocol; */
@ -236,7 +239,7 @@ nsSOAPPortBinding::GetSoapVersion(PRUint16 *aVersion)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -244,7 +247,7 @@ nsSOAPPortBinding::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetAddress(const nsAString& aAddress)
{
mAddress.Assign(aAddress);
@ -252,7 +255,7 @@ nsSOAPPortBinding::SetAddress(const nsAString& aAddress)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetStyle(PRUint16 aStyle)
{
mStyle = aStyle;
@ -260,7 +263,7 @@ nsSOAPPortBinding::SetStyle(PRUint16 aStyle)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetTransport(const nsAString& aTransport)
{
mTransport.Assign(aTransport);
@ -268,7 +271,7 @@ nsSOAPPortBinding::SetTransport(const nsAString& aTransport)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetSoapVersion(PRUint16 aVersion)
{
mSoapVersion = aVersion;
@ -342,7 +345,9 @@ nsWSDLOperation::GetFaultCount(PRUint32* aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
return mFaultMessages.Count(aCount);
*aCount = mFaultMessages.Count();
return NS_OK;
}
/* nsIWSDLMessage getFault(in PRUint32 index); */
@ -351,8 +356,14 @@ nsWSDLOperation::GetFault(PRUint32 aIndex, nsIWSDLMessage * *aFault)
{
NS_ENSURE_ARG_POINTER(aFault);
return mFaultMessages.QueryElementAt(aIndex, NS_GET_IID(nsIWSDLMessage),
(void**)aFault);
if (aIndex < (PRUint32)mFaultMessages.Count()) {
*aFault = mFaultMessages[aIndex];
NS_IF_ADDREF(*aFault);
} else {
*aFault = nsnull;
}
return NS_OK;
}
NS_IMETHODIMP
@ -405,7 +416,7 @@ nsWSDLOperation::GetParameterIndex(const nsAString& aName,
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -413,7 +424,7 @@ nsWSDLOperation::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetInput(nsIWSDLMessage* aInputMessage)
{
mInputMessage = aInputMessage;
@ -421,7 +432,7 @@ nsWSDLOperation::SetInput(nsIWSDLMessage* aInputMessage)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetOutput(nsIWSDLMessage* aOutputMessage)
{
mOutputMessage = aOutputMessage;
@ -429,15 +440,16 @@ nsWSDLOperation::SetOutput(nsIWSDLMessage* aOutputMessage)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::AddFault(nsIWSDLMessage* aFaultMessage)
{
NS_ENSURE_ARG(aFaultMessage);
return mFaultMessages.AppendElement(aFaultMessage);
return mFaultMessages.AppendObject(aFaultMessage) ?
NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -445,7 +457,7 @@ nsWSDLOperation::SetBinding(nsIWSDLBinding* aBinding)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::AddParameter(const nsAString& aParameter)
{
mParameters.AppendString(aParameter);
@ -459,7 +471,7 @@ nsWSDLOperation::AddParameter(const nsAString& aParameter)
//
////////////////////////////////////////////////////////////
nsSOAPOperationBinding::nsSOAPOperationBinding()
: mStyle(nsISOAPPortBinding::STYLE_RPC)
: mStyle(nsIWSDLSOAPBinding::STYLE_RPC)
{
}
@ -467,9 +479,8 @@ nsSOAPOperationBinding::~nsSOAPOperationBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPOperationBinding,
nsIWSDLBinding,
nsISOAPOperationBinding)
NS_IMPL_ISUPPORTS3_CI(nsSOAPOperationBinding, nsIWSDLBinding,
nsIWSDLSOAPBinding, nsISOAPOperationBinding)
/* readonly attribute AString protocol; */
NS_IMETHODIMP
@ -512,7 +523,7 @@ nsSOAPOperationBinding::GetSoapAction(nsAString & aSoapAction)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPOperationBinding::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -520,7 +531,7 @@ nsSOAPOperationBinding::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPOperationBinding::SetStyle(PRUint16 aStyle)
{
mStyle = aStyle;
@ -528,7 +539,7 @@ nsSOAPOperationBinding::SetStyle(PRUint16 aStyle)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPOperationBinding::SetSoapAction(const nsAString& aAction)
{
mSoapAction.Assign(aAction);
@ -590,40 +601,42 @@ nsWSDLMessage::GetPartCount(PRUint32 *aPartCount)
{
NS_ENSURE_ARG_POINTER(aPartCount);
return mParts.Count(aPartCount);
*aPartCount = mParts.Count();
return NS_OK;
}
/* nsIWSDLPart getPart (in PRUint32 index); */
NS_IMETHODIMP
nsWSDLMessage::GetPart(PRUint32 index, nsIWSDLPart **_retval)
nsWSDLMessage::GetPart(PRUint32 aIndex, nsIWSDLPart **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
return mParts.QueryElementAt(index, NS_GET_IID(nsIWSDLPart),
(void**)_retval);
if (aIndex < (PRUint32)mParts.Count()) {
*_retval = mParts[aIndex];
NS_IF_ADDREF(*_retval);
} else {
*_retval = nsnull;
}
return NS_OK;
}
/* nsIWSDLPart getPartByName(in AString name); */
NS_IMETHODIMP
nsWSDLMessage::GetPartByName(const nsAString& aName,
nsIWSDLPart** aPart)
nsWSDLMessage::GetPartByName(const nsAString& aName, nsIWSDLPart** aPart)
{
nsresult rv;
nsAutoString name;
*aPart = nsnull;
// XXX Do a linear search for now. If more efficiency is needed
// we can store the part in a hash as well.
PRUint32 index, count;
mParts.Count(&count);
PRUint32 i, count = mParts.Count();
for (index = 0; index < count; index++) {
nsCOMPtr<nsIWSDLPart> part;
for (i = 0; i < count; i++) {
nsIWSDLPart *part = mParts[i];
rv = mParts.QueryElementAt(index, NS_GET_IID(nsIWSDLPart),
getter_AddRefs(part));
if (NS_SUCCEEDED(rv)) {
nsAutoString name;
if (part) {
part->GetName(name);
if (name.Equals(aName)) {
@ -637,7 +650,7 @@ nsWSDLMessage::GetPartByName(const nsAString& aName,
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLMessage::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -645,15 +658,15 @@ nsWSDLMessage::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLMessage::AddPart(nsIWSDLPart* aPart)
{
NS_ENSURE_ARG(aPart);
return mParts.AppendElement(aPart);
return mParts.AppendObject(aPart) ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsresult
nsWSDLMessage::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -675,8 +688,7 @@ nsSOAPMessageBinding::~nsSOAPMessageBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPMessageBinding,
nsIWSDLBinding,
NS_IMPL_ISUPPORTS3_CI(nsSOAPMessageBinding, nsIWSDLBinding, nsIWSDLSOAPBinding,
nsISOAPMessageBinding)
/* readonly attribute AString protocol; */
@ -774,9 +786,8 @@ nsWSDLPart::GetBinding(nsIWSDLBinding** aBinding)
return NS_OK;
}
NS_IMETHODIMP
nsWSDLPart::SetTypeInfo(const nsAString& aType,
const nsAString& aElementName,
nsresult
nsWSDLPart::SetTypeInfo(const nsAString& aType, const nsAString& aElementName,
nsISchemaComponent* aSchemaComponent)
{
mType.Assign(aType);
@ -786,7 +797,7 @@ nsWSDLPart::SetTypeInfo(const nsAString& aType,
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLPart::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -802,8 +813,8 @@ nsWSDLPart::SetBinding(nsIWSDLBinding* aBinding)
nsSOAPPartBinding::nsSOAPPartBinding(PRUint16 aLocation, PRUint16 aUse,
const nsAString& aEncodingStyle,
const nsAString& aNamespace)
: mLocation(aLocation), mUse(aUse),
mEncodingStyle(aEncodingStyle), mNamespace(aNamespace)
: mLocation(aLocation), mUse(aUse), mEncodingStyle(aEncodingStyle),
mNamespace(aNamespace)
{
}
@ -811,8 +822,7 @@ nsSOAPPartBinding::~nsSOAPPartBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPPartBinding,
nsIWSDLBinding,
NS_IMPL_ISUPPORTS3_CI(nsSOAPPartBinding, nsIWSDLBinding, nsIWSDLSOAPBinding,
nsISOAPPartBinding)
/* readonly attribute AString protocol; */

View File

@ -82,54 +82,68 @@ nsIAtom* nsWSDLAtoms::sHeader_atom = nsnull;
nsIAtom* nsWSDLAtoms::sHeaderFault_atom = nsnull;
nsIAtom* nsWSDLAtoms::sAddress_atom = nsnull;
void
#define SET_AND_CHECK_ATOM(_atom, _val) \
PR_BEGIN_MACRO \
_atom = NS_NewAtom(_val); \
if (!_atom) \
return NS_ERROR_OUT_OF_MEMORY; \
PR_END_MACRO
nsresult
nsWSDLAtoms::CreateWSDLAtoms()
{
sDefinitions_atom = NS_NewAtom("definitions");
sImport_atom = NS_NewAtom("import");
sTypes_atom = NS_NewAtom("types");
sMessage_atom = NS_NewAtom("message");
sPortType_atom = NS_NewAtom("portType");
sBinding_atom = NS_NewAtom("binding");
sService_atom = NS_NewAtom("service");
sPort_atom = NS_NewAtom("port");
sOperation_atom = NS_NewAtom("operation");
sPart_atom = NS_NewAtom("part");
sDocumentation_atom = NS_NewAtom("documentation");
sInput_atom = NS_NewAtom("input");
sOutput_atom = NS_NewAtom("output");
sFault_atom = NS_NewAtom("fault");
NS_ASSERTION(!sDefinitions_atom, "nsWSDLAtoms already created!");
sBody_atom = NS_NewAtom("body");
sHeader_atom = NS_NewAtom("header");
sHeaderFault_atom = NS_NewAtom("headerFault");
sAddress_atom = NS_NewAtom("address");
SET_AND_CHECK_ATOM(sDefinitions_atom, "definitions");
SET_AND_CHECK_ATOM(sImport_atom, "import");
SET_AND_CHECK_ATOM(sTypes_atom, "types");
SET_AND_CHECK_ATOM(sMessage_atom, "message");
SET_AND_CHECK_ATOM(sPortType_atom, "portType");
SET_AND_CHECK_ATOM(sBinding_atom, "binding");
SET_AND_CHECK_ATOM(sService_atom, "service");
SET_AND_CHECK_ATOM(sPort_atom, "port");
SET_AND_CHECK_ATOM(sOperation_atom, "operation");
SET_AND_CHECK_ATOM(sPart_atom, "part");
SET_AND_CHECK_ATOM(sDocumentation_atom, "documentation");
SET_AND_CHECK_ATOM(sInput_atom, "input");
SET_AND_CHECK_ATOM(sOutput_atom, "output");
SET_AND_CHECK_ATOM(sFault_atom, "fault");
SET_AND_CHECK_ATOM(sBody_atom, "body");
SET_AND_CHECK_ATOM(sHeader_atom, "header");
SET_AND_CHECK_ATOM(sHeaderFault_atom, "headerFault");
SET_AND_CHECK_ATOM(sAddress_atom, "address");
SET_AND_CHECK_ATOM(sSchema_atom, "schema");
return NS_OK;
}
void
nsWSDLAtoms::DestroyWSDLAtoms()
{
if (sDefinitions_atom) {
NS_RELEASE(sDefinitions_atom);
NS_RELEASE(sImport_atom);
NS_RELEASE(sTypes_atom);
NS_RELEASE(sMessage_atom);
NS_RELEASE(sPortType_atom);
NS_RELEASE(sBinding_atom);
NS_RELEASE(sService_atom);
NS_RELEASE(sPort_atom);
NS_RELEASE(sOperation_atom);
NS_RELEASE(sPart_atom);
NS_RELEASE(sDocumentation_atom);
NS_RELEASE(sInput_atom);
NS_RELEASE(sOutput_atom);
NS_RELEASE(sFault_atom);
NS_IF_RELEASE(sDefinitions_atom);
NS_IF_RELEASE(sImport_atom);
NS_IF_RELEASE(sTypes_atom);
NS_IF_RELEASE(sMessage_atom);
NS_IF_RELEASE(sPortType_atom);
NS_IF_RELEASE(sBinding_atom);
NS_IF_RELEASE(sService_atom);
NS_IF_RELEASE(sPort_atom);
NS_IF_RELEASE(sOperation_atom);
NS_IF_RELEASE(sPart_atom);
NS_IF_RELEASE(sDocumentation_atom);
NS_IF_RELEASE(sInput_atom);
NS_IF_RELEASE(sOutput_atom);
NS_IF_RELEASE(sFault_atom);
NS_RELEASE(sBody_atom);
NS_RELEASE(sHeader_atom);
NS_RELEASE(sHeaderFault_atom);
NS_RELEASE(sAddress_atom);
}
NS_IF_RELEASE(sBody_atom);
NS_IF_RELEASE(sHeader_atom);
NS_IF_RELEASE(sHeaderFault_atom);
NS_IF_RELEASE(sAddress_atom);
NS_IF_RELEASE(sSchema_atom);
}
////////////////////////////////////////////////////////////
@ -157,33 +171,41 @@ nsWSDLLoader::Init()
prefBranch->GetBoolPref("xml.xmlextras.soap.wsdl", &enabled);
}
if (!enabled)
if (!enabled) {
return NS_ERROR_WSDL_NOT_ENABLED;
}
if (!nsWSDLAtoms::sDefinitions_atom) {
nsWSDLAtoms::CreateWSDLAtoms();
nsresult rv = nsWSDLAtoms::CreateWSDLAtoms();
if (NS_FAILED(rv)) {
return rv;
}
}
return NS_OK;
}
nsresult
nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI,
const char* aMethod,
nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI, const char* aMethod,
nsIURI** aURI)
{
nsresult rv;
nsCOMPtr<nsIXPCNativeCallContext> cc;
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
if(NS_SUCCEEDED(rv)) {
rv = xpc->GetCurrentNativeCallContext(getter_AddRefs(cc));
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));
if(xpc) {
xpc->GetCurrentNativeCallContext(getter_AddRefs(cc));
}
if (NS_SUCCEEDED(rv) && cc) {
if (cc) {
JSContext* cx;
rv = cc->GetJSContext(&cx);
if (NS_FAILED(rv)) return rv;
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsIScriptSecurityManager> secMan(do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIScriptSecurityManager> secMan =
do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsIURI> baseURI;
nsCOMPtr<nsIPrincipal> principal;
@ -196,11 +218,11 @@ nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI,
}
rv = NS_NewURI(aURI, aWSDLURI, nsnull, baseURI);
if (NS_FAILED(rv)) return rv;
if (NS_FAILED(rv))
return rv;
rv = secMan->CheckLoadURIFromScript(cx, *aURI);
if (NS_FAILED(rv))
{
if (NS_FAILED(rv)) {
// Security check failed. The above call set a JS exception. The
// following lines ensure that the exception is propagated.
cc->SetExceptionWasThrown(PR_TRUE);
@ -209,81 +231,66 @@ nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI,
}
else {
rv = NS_NewURI(aURI, aWSDLURI, nsnull);
if (NS_FAILED(rv)) return rv;
if (NS_FAILED(rv))
return rv;
}
return NS_OK;
}
/* nsIWSDLService load (in AString wsdlURI, in AString portName); */
NS_IMETHODIMP
nsWSDLLoader::Load(const nsAString& wsdlURI,
const nsAString& portName,
nsIWSDLPort **_retval)
// Internal helper called by Load() and Loadasync(). If aListener is
// non-null, it's an async load, if it's null, it's sync.
nsresult
nsWSDLLoader::doLoad(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLLoadListener *aListener, nsIWSDLPort **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
nsCOMPtr<nsIURI> resolvedURI;
nsresult rv = GetResolvedURI(wsdlURI, "load", getter_AddRefs(resolvedURI));
nsresult rv = GetResolvedURI(wsdlURI, aListener ? "loadAsync" : "load",
getter_AddRefs(resolvedURI));
if (NS_FAILED(rv)) {
return rv;
}
nsCAutoString spec;
resolvedURI->GetSpec(spec);
nsCOMPtr<nsIDOMEventListener> listener;
nsWSDLLoadRequest* request = new nsWSDLLoadRequest(PR_TRUE, nsnull,
nsWSDLLoadRequest* request = new nsWSDLLoadRequest(!aListener, nsnull,
portName);
if (!request) {
return NS_ERROR_OUT_OF_MEMORY;
}
listener = request;
rv = request->LoadDefinition(NS_ConvertASCIItoUCS2(spec.get()));
nsCAutoString spec;
resolvedURI->GetSpec(spec);
if (NS_SUCCEEDED(rv)) {
rv = request->LoadDefinition(NS_ConvertUTF8toUCS2(spec));
if (NS_SUCCEEDED(rv) && aListener) {
request->GetPort(_retval);
}
return rv;
}
/* nsIWSDLService load (in AString wsdlURI, in AString portName); */
NS_IMETHODIMP
nsWSDLLoader::Load(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLPort **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
*_retval = nsnull;
return doLoad(wsdlURI, portName, nsnull, _retval);
}
/* void loadAsync (in AString wsdlURI, in AString portName,
in nsIWSDLLoadListener listener); */
NS_IMETHODIMP
nsWSDLLoader::LoadAsync(const nsAString& wsdlURI,
const nsAString& portName,
nsWSDLLoader::LoadAsync(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLLoadListener *aListener)
{
NS_ENSURE_ARG(aListener);
nsCOMPtr<nsIURI> resolvedURI;
nsresult rv = GetResolvedURI(wsdlURI, "loadAsync", getter_AddRefs(resolvedURI));
if (NS_FAILED(rv)) {
return rv;
}
nsCAutoString spec;
resolvedURI->GetSpec(spec);
nsCOMPtr<nsIDOMEventListener> listener;
nsWSDLLoadRequest* request = new nsWSDLLoadRequest(PR_FALSE, aListener,
portName);
if (!request) {
return NS_ERROR_OUT_OF_MEMORY;
}
listener = request;
return request->LoadDefinition(NS_ConvertASCIItoUCS2(spec.get()));
}
/* nsISupports createPortProxy(in nsIWSDLPort service, in AString nameSpace); */
NS_IMETHODIMP
nsWSDLLoader::CreatePortProxy(nsIWSDLPort *port,
const nsAString& nameSpace,
PRBool sync,
nsISupports **_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
return doLoad(wsdlURI, portName, aListener, nsnull);
}
////////////////////////////////////////////////////////////
@ -305,12 +312,10 @@ nsWSDLLoadRequest::~nsWSDLLoadRequest()
}
}
NS_IMPL_ISUPPORTS1(nsWSDLLoadRequest,
nsIDOMEventListener)
NS_IMPL_ISUPPORTS1(nsWSDLLoadRequest, nsIDOMEventListener)
static inline PRBool
IsElementOfNamespace(nsIDOMElement* aElement,
const nsAString& aNamespace)
IsElementOfNamespace(nsIDOMElement* aElement, const nsAString& aNamespace)
{
nsAutoString namespaceURI;
aElement->GetNamespaceURI(namespaceURI);
@ -334,9 +339,8 @@ nsWSDLLoadRequest::LoadDefinition(const nsAString& aURI)
return rv;
}
rv = mRequest->OpenRequest("GET",
NS_ConvertUCS2toUTF8(aURI).get(),
!mIsSync, nsnull, nsnull);
rv = mRequest->OpenRequest("GET", NS_ConvertUCS2toUTF8(aURI).get(), !mIsSync,
nsnull, nsnull);
if (NS_FAILED(rv)) {
return rv;
}
@ -353,14 +357,12 @@ nsWSDLLoadRequest::LoadDefinition(const nsAString& aURI)
return NS_ERROR_UNEXPECTED;
}
rv = target->AddEventListener(NS_LITERAL_STRING("load"),
this, PR_FALSE);
rv = target->AddEventListener(NS_LITERAL_STRING("load"), this, PR_FALSE);
if (NS_FAILED(rv)) {
return rv;
}
rv = target->AddEventListener(NS_LITERAL_STRING("error"),
this, PR_FALSE);
rv = target->AddEventListener(NS_LITERAL_STRING("error"), this, PR_FALSE);
if (NS_FAILED(rv)) {
return rv;
}
@ -438,7 +440,6 @@ nsWSDLLoadRequest::ContineProcessingTillDone()
}
PopContext();
} while (GetCurrentContext() != nsnull);
return rv;
@ -457,14 +458,13 @@ nsWSDLLoadRequest::HandleEvent(nsIDOMEvent *event)
nsCOMPtr<nsIDOMDocument> document;
rv = mRequest->GetResponseXML(getter_AddRefs(document));
if (NS_SUCCEEDED(rv) && document) {
if (document) {
nsCOMPtr<nsIDOMElement> element;
document->GetDocumentElement(getter_AddRefs(element));
if (element) {
if (IsElementOfNamespace(element,
NS_LITERAL_STRING(NS_WSDL_NAMESPACE))) {
nsCOMPtr<nsIChannel> channel;
nsCOMPtr<nsIURI> uri;
nsCAutoString spec;
@ -478,7 +478,7 @@ nsWSDLLoadRequest::HandleEvent(nsIDOMEvent *event)
}
}
rv = PushContext(document, NS_ConvertASCIItoUCS2(spec.get()));
rv = PushContext(document, NS_ConvertUTF8toUCS2(spec));
if (NS_SUCCEEDED(rv)) {
rv = ContineProcessingTillDone();
@ -559,6 +559,9 @@ nsWSDLLoadRequest::ResumeProcessing()
// If we don't yet have a port, find the service element, create one
// and record the port's its binding name
if (mBindingName.IsEmpty()) {
// The service element tends to be at the end of WSDL files, so
// this would be more efficient if we iterated from last to first
// child...
while (NS_SUCCEEDED(iterator.GetNextChild(getter_AddRefs(childElement),
getter_AddRefs(tagName))) &&
childElement) {
@ -663,8 +666,8 @@ nsWSDLLoadRequest::PopContext()
{
PRUint32 count = mContextStack.Count();
if (count > 0) {
nsWSDLLoadingContext* context = NS_STATIC_CAST(nsWSDLLoadingContext*,
mContextStack.ElementAt(count-1));
nsWSDLLoadingContext* context =
NS_STATIC_CAST(nsWSDLLoadingContext*, mContextStack.ElementAt(count-1));
delete context;
mContextStack.RemoveElementAt(count-1);
}
@ -729,9 +732,9 @@ nsWSDLLoadRequest::GetMessage(const nsAString& aName,
const nsAString& aNamespace,
nsIWSDLMessage** aMessage)
{
nsAutoString keyStr;
keyStr.Assign(aName);
nsAutoString keyStr(aName);
keyStr.Append(aNamespace);
nsStringKey key(keyStr);
nsCOMPtr<nsISupports> sup = dont_AddRef(mMessages.Get(&key));
@ -751,9 +754,9 @@ nsWSDLLoadRequest::GetPortType(const nsAString& aName,
const nsAString& aNamespace,
nsIWSDLPort** aPort)
{
nsAutoString keyStr;
keyStr.Assign(aName);
nsAutoString keyStr(aName);
keyStr.Append(aNamespace);
nsStringKey key(keyStr);
nsCOMPtr<nsISupports> sup = dont_AddRef(mPortTypes.Get(&key));
@ -769,10 +772,8 @@ nsWSDLLoadRequest::GetPortType(const nsAString& aName,
}
static nsresult
ParseQualifiedName(nsIDOMElement* aContext,
const nsAString& aQualifiedName,
nsAString& aPrefix,
nsAString& aLocalName,
ParseQualifiedName(nsIDOMElement* aContext, const nsAString& aQualifiedName,
nsAString& aPrefix, nsAString& aLocalName,
nsAString& aNamespaceURI)
{
nsReadingIterator<PRUnichar> pos, begin, end;
@ -843,13 +844,17 @@ nsWSDLLoadRequest::ProcessImportElement(nsIDOMElement* aElement,
return NS_OK;
}
static const char* kSchemaNamespaces[] = {SCHEMA_1999_NAMESPACE,
SCHEMA_2001_NAMESPACE};
static PRUint32 kSchemaNamespacesLength = sizeof(kSchemaNamespaces) / sizeof(const char*);
nsresult
nsWSDLLoadRequest::ProcessTypesElement(nsIDOMElement* aElement)
{
static const char* kSchemaNamespaces[] =
{
SCHEMA_1999_NAMESPACE,
SCHEMA_2001_NAMESPACE
};
static const PRUint32 kSchemaNamespacesLength =
sizeof(kSchemaNamespaces) / sizeof(const char*);
nsresult rv = NS_OK;
nsChildElementIterator iterator(aElement,
@ -857,12 +862,10 @@ nsWSDLLoadRequest::ProcessTypesElement(nsIDOMElement* aElement)
nsCOMPtr<nsIDOMElement> childElement;
nsCOMPtr<nsIAtom> tagName;
nsCOMPtr<nsIAtom> schemaAtom(dont_AddRef(NS_NewAtom("schema")));
while (NS_SUCCEEDED(iterator.GetNextChild(getter_AddRefs(childElement),
getter_AddRefs(tagName))) &&
childElement) {
if (tagName == schemaAtom) {
if (tagName == nsWSDLAtoms::sSchema_atom) {
nsCOMPtr<nsISchema> schema;
rv = mSchemaLoader->ProcessSchemaElement(childElement,
getter_AddRefs(schema));
@ -907,11 +910,8 @@ nsWSDLLoadRequest::ProcessAbstractPartElement(nsIDOMElement* aElement,
if (!elementQName.IsEmpty()) {
nsAutoString elementPrefix, elementLocalName, elementNamespace;
rv = ParseQualifiedName(aElement,
elementQName,
elementPrefix,
elementLocalName,
elementNamespace);
rv = ParseQualifiedName(aElement, elementQName, elementPrefix,
elementLocalName, elementNamespace);
if (NS_FAILED(rv)) {
return rv;
}
@ -928,10 +928,7 @@ nsWSDLLoadRequest::ProcessAbstractPartElement(nsIDOMElement* aElement,
else if (!typeQName.IsEmpty()) {
nsAutoString typePrefix, typeLocalName, typeNamespace;
rv = ParseQualifiedName(aElement,
typeQName,
typePrefix,
typeLocalName,
rv = ParseQualifiedName(aElement, typeQName, typePrefix, typeLocalName,
typeNamespace);
if (NS_FAILED(rv)) {
return rv;
@ -947,8 +944,7 @@ nsWSDLLoadRequest::ProcessAbstractPartElement(nsIDOMElement* aElement,
schemaComponent = schemaType;
}
partInst->SetTypeInfo(typeQName, elementQName,
schemaComponent);
partInst->SetTypeInfo(typeQName, elementQName, schemaComponent);
aMessage->AddPart(part);
return NS_OK;
@ -1011,11 +1007,8 @@ nsWSDLLoadRequest::ProcessOperationComponent(nsIDOMElement* aElement,
nsAutoString messageQName, messagePrefix, messageLocalName, messageNamespace;
aElement->GetAttribute(NS_LITERAL_STRING("message"), messageQName);
rv = ParseQualifiedName(aElement,
messageQName,
messagePrefix,
messageLocalName,
messageNamespace);
rv = ParseQualifiedName(aElement, messageQName, messagePrefix,
messageLocalName, messageNamespace);
if (NS_FAILED(rv)) {
return rv;
}
@ -1103,24 +1096,21 @@ nsWSDLLoadRequest::ProcessAbstractOperation(nsIDOMElement* aElement,
operationInst->SetDocumentationElement(childElement);
}
else if (tagName == nsWSDLAtoms::sInput_atom) {
rv = ProcessOperationComponent(childElement,
getter_AddRefs(message));
rv = ProcessOperationComponent(childElement, getter_AddRefs(message));
if (NS_FAILED(rv)) {
return rv;
}
operationInst->SetInput(message);
}
else if (tagName == nsWSDLAtoms::sOutput_atom) {
rv = ProcessOperationComponent(childElement,
getter_AddRefs(message));
rv = ProcessOperationComponent(childElement, getter_AddRefs(message));
if (NS_FAILED(rv)) {
return rv;
}
operationInst->SetOutput(message);
}
else if (tagName == nsWSDLAtoms::sFault_atom) {
rv = ProcessOperationComponent(childElement,
getter_AddRefs(message));
rv = ProcessOperationComponent(childElement, getter_AddRefs(message));
if (NS_FAILED(rv)) {
return rv;
}
@ -1208,7 +1198,8 @@ nsWSDLLoadRequest::ProcessMessageBinding(nsIDOMElement* aElement,
}
nsCOMPtr<nsISOAPMessageBinding> messageBinding;
nsSOAPMessageBinding* messageBindingInst = new nsSOAPMessageBinding(namespaceStr);
nsSOAPMessageBinding* messageBindingInst =
new nsSOAPMessageBinding(namespaceStr);
if (!messageBindingInst) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -1218,10 +1209,9 @@ nsWSDLLoadRequest::ProcessMessageBinding(nsIDOMElement* aElement,
messageInst->SetBinding(messageBinding);
nsCOMPtr<nsISOAPPartBinding> binding;
nsSOAPPartBinding* bindingInst = new nsSOAPPartBinding(nsISOAPPartBinding::LOCATION_BODY,
use,
encodingStyle,
namespaceStr);
nsSOAPPartBinding* bindingInst =
new nsSOAPPartBinding(nsISOAPPartBinding::LOCATION_BODY, use,
encodingStyle, namespaceStr);
if (!bindingInst) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -1229,8 +1219,8 @@ nsWSDLLoadRequest::ProcessMessageBinding(nsIDOMElement* aElement,
nsCOMPtr<nsIWSDLPart> part;
nsWSDLPart* partInst;
// If there is no explicit parts attribute, this binding
// applies to all the parts.
// If there is no explicit parts attribute, this binding applies
// to all the parts.
if (partsStr.IsEmpty()) {
PRUint32 index, count;
@ -1335,7 +1325,8 @@ nsWSDLLoadRequest::ProcessOperationBinding(nsIDOMElement* aElement,
else {
nsCOMPtr<nsIWSDLBinding> portBinding;
aPort->GetBinding(getter_AddRefs(portBinding));
nsCOMPtr<nsISOAPPortBinding> soapPortBinding = do_QueryInterface(portBinding);
nsCOMPtr<nsISOAPPortBinding> soapPortBinding =
do_QueryInterface(portBinding);
if (soapPortBinding) {
PRUint16 styleVal;
soapPortBinding->GetStyle(&styleVal);
@ -1375,6 +1366,7 @@ nsWSDLLoadRequest::ProcessOperationBinding(nsIDOMElement* aElement,
operationInst->SetBinding(binding);
return NS_OK;
}
nsresult
@ -1397,10 +1389,7 @@ nsWSDLLoadRequest::ProcessBindingElement(nsIDOMElement* aElement)
nsCOMPtr<nsIWSDLPort> port;
nsAutoString typeQName, typePrefix, typeLocalName, typeNamespace;
aElement->GetAttribute(NS_LITERAL_STRING("type"), typeQName);
rv = ParseQualifiedName(aElement,
typeQName,
typePrefix,
typeLocalName,
rv = ParseQualifiedName(aElement, typeQName, typePrefix, typeLocalName,
typeNamespace);
if (NS_FAILED(rv)) {
return rv;
@ -1413,11 +1402,12 @@ nsWSDLLoadRequest::ProcessBindingElement(nsIDOMElement* aElement)
// the names will resolve to the targetNamespace, while
// they should technically resolve to the default namespace.
if (typePrefix.IsEmpty()) {
nsAutoString targetNamespace;
nsWSDLLoadingContext* context = GetCurrentContext();
if (!context) {
return NS_ERROR_UNEXPECTED;
}
nsAutoString targetNamespace;
context->GetTargetNamespace(targetNamespace);
rv = GetPortType(typeLocalName, targetNamespace, getter_AddRefs(port));
if (NS_FAILED(rv)) {
@ -1461,8 +1451,7 @@ nsWSDLLoadRequest::ProcessBindingElement(nsIDOMElement* aElement)
else if ((tagName == nsWSDLAtoms::sOperation_atom) &&
IsElementOfNamespace(childElement,
NS_LITERAL_STRING(NS_WSDL_NAMESPACE))) {
rv = ProcessOperationBinding(childElement,
port);
rv = ProcessOperationBinding(childElement, port);
if (NS_FAILED(rv)) {
return rv;
}
@ -1494,8 +1483,7 @@ nsWSDLLoadRequest::ProcessPortBinding(nsIDOMElement* aElement)
if ((tagName == nsWSDLAtoms::sAddress_atom) &&
IsElementOfNamespace(childElement,
NS_LITERAL_STRING(NS_WSDL_SOAP_NAMESPACE))) {
childElement->GetAttribute(NS_LITERAL_STRING("location"),
mAddress);
childElement->GetAttribute(NS_LITERAL_STRING("location"), mAddress);
}
}
@ -1522,11 +1510,8 @@ nsWSDLLoadRequest::ProcessServiceElement(nsIDOMElement* aElement)
nsAutoString bindingQName, bindingPrefix;
childElement->GetAttribute(NS_LITERAL_STRING("binding"), bindingQName);
rv = ParseQualifiedName(childElement,
bindingQName,
bindingPrefix,
mBindingName,
mBindingNamespace);
rv = ParseQualifiedName(childElement, bindingQName, bindingPrefix,
mBindingName, mBindingNamespace);
if (NS_FAILED(rv)) {
return rv; // binding of an unknown namespace
}

View File

@ -31,7 +31,6 @@
// XPCOM Includes
#include "nsCOMPtr.h"
#include "nsSupportsArray.h"
#include "nsString.h"
#include "nsIAtom.h"
#include "nsHashtable.h"
@ -50,9 +49,10 @@
#define NS_ERROR_WSDL_LOADPENDING NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_GENERAL, 1)
class nsWSDLAtoms {
class nsWSDLAtoms
{
public:
static void CreateWSDLAtoms();
static nsresult CreateWSDLAtoms();
static void DestroyWSDLAtoms();
static nsIAtom* sDefinitions_atom;
@ -74,9 +74,12 @@ public:
static nsIAtom* sHeader_atom;
static nsIAtom* sHeaderFault_atom;
static nsIAtom* sAddress_atom;
static nsIAtom* sSchema_atom;
};
class nsWSDLLoader : public nsIWSDLLoader {
class nsWSDLLoader : public nsIWSDLLoader
{
public:
nsWSDLLoader();
virtual ~nsWSDLLoader();
@ -85,45 +88,59 @@ public:
NS_DECL_NSIWSDLLOADER
nsresult Init();
protected:
nsresult doLoad(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLLoadListener *aListener, nsIWSDLPort **_retval);
nsresult GetResolvedURI(const nsAString& aSchemaURI,
const char* aMethod,
nsIURI** aURI);
protected:
nsWSDLPort* mPort;
};
class nsWSDLLoadingContext {
class nsWSDLLoadingContext
{
public:
nsWSDLLoadingContext(nsIDOMDocument* aDocument,
const nsAString& aLocation) :
mDocument(aDocument), mChildIndex(0), mDocumentLocation(aLocation) {
const nsAString& aLocation)
: mDocument(aDocument), mChildIndex(0), mDocumentLocation(aLocation)
{
}
~nsWSDLLoadingContext() {
~nsWSDLLoadingContext()
{
}
void GetRootElement(nsIDOMElement** aElement) {
void GetRootElement(nsIDOMElement** aElement)
{
mDocument->GetDocumentElement(aElement);
}
PRUint32 GetChildIndex() { return mChildIndex; }
void SetChildIndex(PRUint32 aChildIndex) { mChildIndex = aChildIndex; }
PRUint32 GetChildIndex()
{
return mChildIndex;
}
void SetChildIndex(PRUint32 aChildIndex)
{
mChildIndex = aChildIndex;
}
void GetTargetNamespace(nsAString& aNamespace) {
void GetTargetNamespace(nsAString& aNamespace)
{
nsCOMPtr<nsIDOMElement> element;
GetRootElement(getter_AddRefs(element));
if (element) {
element->GetAttribute(NS_LITERAL_STRING("targetNamespace"),
aNamespace);
element->GetAttribute(NS_LITERAL_STRING("targetNamespace"), aNamespace);
}
else {
aNamespace.Truncate();
}
}
void GetDocumentLocation(nsAString& aLocation) {
void GetDocumentLocation(nsAString& aLocation)
{
aLocation.Assign(mDocumentLocation);
}
@ -139,8 +156,7 @@ protected:
class nsWSDLLoadRequest : public nsIDOMEventListener
{
public:
nsWSDLLoadRequest(PRBool aIsSync,
nsIWSDLLoadListener* aListener,
nsWSDLLoadRequest(PRBool aIsSync, nsIWSDLLoadListener* aListener,
const nsAString& aPortName);
virtual ~nsWSDLLoadRequest();
@ -152,26 +168,21 @@ public:
nsresult ContineProcessingTillDone();
nsresult GetPort(nsIWSDLPort** aPort);
nsresult PushContext(nsIDOMDocument* aDocument,
const nsAString& aLocation);
nsresult PushContext(nsIDOMDocument* aDocument, const nsAString& aLocation);
nsWSDLLoadingContext* GetCurrentContext();
void PopContext();
nsresult GetSchemaElement(const nsAString& aName,
const nsAString& aNamespace,
nsISchemaElement** aSchemaComponent);
nsresult GetSchemaType(const nsAString& aName,
const nsAString& aNamespace,
nsresult GetSchemaType(const nsAString& aName, const nsAString& aNamespace,
nsISchemaType** aSchemaComponent);
nsresult GetMessage(const nsAString& aName,
const nsAString& aNamespace,
nsresult GetMessage(const nsAString& aName, const nsAString& aNamespace,
nsIWSDLMessage** aMessage);
nsresult GetPortType(const nsAString& aName,
const nsAString& aNamespace,
nsresult GetPortType(const nsAString& aName, const nsAString& aNamespace,
nsIWSDLPort** aPort);
nsresult ProcessImportElement(nsIDOMElement* aElement,
PRUint32 aIndex);
nsresult ProcessImportElement(nsIDOMElement* aElement, PRUint32 aIndex);
nsresult ProcessTypesElement(nsIDOMElement* aElement);
nsresult ProcessMessageElement(nsIDOMElement* aElement);
nsresult ProcessAbstractPartElement(nsIDOMElement* aElement,
@ -194,7 +205,7 @@ protected:
nsCOMPtr<nsIXMLHttpRequest> mRequest;
nsCOMPtr<nsISchemaLoader> mSchemaLoader;
PRBool mIsSync;
PRPackedBool mIsSync;
nsCOMPtr<nsIWSDLPort> mPort;
nsString mPortName;

View File

@ -35,8 +35,7 @@
// XPCOM Includes
#include "nsCOMPtr.h"
#include "nsVoidArray.h"
#include "nsSupportsArray.h"
#include "nsCOMArray.h"
#include "nsString.h"
#include "nsReadableUtils.h"
#include "nsWeakReference.h"
@ -51,7 +50,8 @@
#define NS_WSDL_NAMESPACE "http://schemas.xmlsoap.org/wsdl/"
#define NS_WSDL_SOAP_NAMESPACE "http://schemas.xmlsoap.org/wsdl/soap/"
class nsSOAPPortBinding : public nsISOAPPortBinding {
class nsSOAPPortBinding : public nsISOAPPortBinding
{
public:
nsSOAPPortBinding(const nsAString& aName);
virtual ~nsSOAPPortBinding();
@ -60,22 +60,23 @@ public:
NS_DECL_NSIWSDLBINDING
NS_DECL_NSISOAPPORTBINDING
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD SetAddress(const nsAString& aAddress);
NS_IMETHOD SetStyle(PRUint16 aStyle);
NS_IMETHOD SetTransport(const nsAString& aTransport);
NS_IMETHOD SetSoapVersion(PRUint16 aSoapVersion);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult SetAddress(const nsAString& aAddress);
nsresult SetStyle(PRUint16 aStyle);
nsresult SetTransport(const nsAString& aTransport);
nsresult SetSoapVersion(PRUint16 aSoapVersion);
protected:
nsString mName;
nsString mAddress;
PRUint16 mStyle;
nsString mTransport;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
PRUint16 mSoapVersion;
PRUint16 mStyle;
};
class nsWSDLPort : public nsIWSDLPort {
class nsWSDLPort : public nsIWSDLPort
{
public:
nsWSDLPort(const nsAString &aName);
virtual ~nsWSDLPort();
@ -83,18 +84,19 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLPORT
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD AddOperation(nsIWSDLOperation* aOperation);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult AddOperation(nsIWSDLOperation* aOperation);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
nsSupportsArray mOperations;
nsCOMArray<nsIWSDLOperation> mOperations;
nsCOMPtr<nsIWSDLBinding> mBinding;
};
class nsSOAPOperationBinding : public nsISOAPOperationBinding {
class nsSOAPOperationBinding : public nsISOAPOperationBinding
{
public:
nsSOAPOperationBinding();
virtual ~nsSOAPOperationBinding();
@ -103,17 +105,18 @@ public:
NS_DECL_NSIWSDLBINDING
NS_DECL_NSISOAPOPERATIONBINDING
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD SetStyle(PRUint16 aStyle);
NS_IMETHOD SetSoapAction(const nsAString& aAction);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult SetStyle(PRUint16 aStyle);
nsresult SetSoapAction(const nsAString& aAction);
protected:
PRUint16 mStyle;
nsString mSoapAction;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
PRUint16 mStyle;
};
class nsWSDLOperation : public nsIWSDLOperation {
class nsWSDLOperation : public nsIWSDLOperation
{
public:
nsWSDLOperation(const nsAString &aName);
virtual ~nsWSDLOperation();
@ -121,24 +124,25 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLOPERATION
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD SetInput(nsIWSDLMessage* aInputMessage);
NS_IMETHOD SetOutput(nsIWSDLMessage* aOutputMessage);
NS_IMETHOD AddFault(nsIWSDLMessage* aFaultMessage);
NS_IMETHOD AddParameter(const nsAString& aParameter);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult SetInput(nsIWSDLMessage* aInputMessage);
nsresult SetOutput(nsIWSDLMessage* aOutputMessage);
nsresult AddFault(nsIWSDLMessage* aFaultMessage);
nsresult AddParameter(const nsAString& aParameter);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
nsCOMPtr<nsIWSDLMessage> mInputMessage;
nsCOMPtr<nsIWSDLMessage> mOutputMessage;
nsSupportsArray mFaultMessages;
nsCOMArray<nsIWSDLMessage> mFaultMessages;
nsStringArray mParameters;
nsCOMPtr<nsIWSDLBinding> mBinding;
};
class nsSOAPMessageBinding : public nsISOAPMessageBinding {
class nsSOAPMessageBinding : public nsISOAPMessageBinding
{
public:
nsSOAPMessageBinding(const nsAString& aNamespace);
virtual ~nsSOAPMessageBinding();
@ -151,7 +155,8 @@ protected:
nsString mNamespace;
};
class nsWSDLMessage : public nsIWSDLMessage {
class nsWSDLMessage : public nsIWSDLMessage
{
public:
nsWSDLMessage(const nsAString& aName);
virtual ~nsWSDLMessage();
@ -159,18 +164,19 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLMESSAGE
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD AddPart(nsIWSDLPart* aPart);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult AddPart(nsIWSDLPart* aPart);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
nsSupportsArray mParts;
nsCOMArray<nsIWSDLPart> mParts;
nsCOMPtr<nsIWSDLBinding> mBinding;
};
class nsSOAPPartBinding : public nsISOAPPartBinding {
class nsSOAPPartBinding : public nsISOAPPartBinding
{
public:
nsSOAPPartBinding(PRUint16 aLocation, PRUint16 aUse,
const nsAString& aEncodingStyle,
@ -188,7 +194,8 @@ protected:
nsString mNamespace;
};
class nsWSDLPart : public nsIWSDLPart {
class nsWSDLPart : public nsIWSDLPart
{
public:
nsWSDLPart(const nsAString& aName);
virtual ~nsWSDLPart();
@ -196,10 +203,9 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLPART
NS_IMETHOD SetTypeInfo(const nsAString& aType,
const nsAString& aElementName,
nsresult SetTypeInfo(const nsAString& aType, const nsAString& aElementName,
nsISchemaComponent* aSchemaComponent);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;

View File

@ -36,7 +36,8 @@ interface nsIWSDLPart;
interface nsIDOMElement;
[scriptable, uuid(0458dac1-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLPort : nsISupports {
interface nsIWSDLPort : nsISupports
{
readonly attribute AString name;
readonly attribute nsIDOMElement documentation;
@ -48,7 +49,8 @@ interface nsIWSDLPort : nsISupports {
};
[scriptable, uuid(0458dac2-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLOperation : nsISupports {
interface nsIWSDLOperation : nsISupports
{
readonly attribute AString name;
readonly attribute nsIDOMElement documentation;
@ -65,7 +67,8 @@ interface nsIWSDLOperation : nsISupports {
};
[scriptable, uuid(0458dac3-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLMessage : nsISupports {
interface nsIWSDLMessage : nsISupports
{
readonly attribute AString name;
readonly attribute nsIDOMElement documentation;
@ -77,7 +80,8 @@ interface nsIWSDLMessage : nsISupports {
};
[scriptable, uuid(0458dac4-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLPart : nsISupports {
interface nsIWSDLPart : nsISupports
{
readonly attribute AString name;
readonly attribute nsIWSDLBinding binding;
@ -94,7 +98,8 @@ interface nsIWSDLPart : nsISupports {
};
[scriptable, uuid(0458dac0-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLBinding : nsISupports {
interface nsIWSDLBinding : nsISupports
{
readonly attribute AString protocol;
readonly attribute nsIDOMElement documentation;
};

View File

@ -30,21 +30,21 @@
interface nsIWSDLPort;
interface nsIWSDLLoadListener;
// Does this need to be scriptable, and exposed to scripters? We think
// not...
[scriptable, uuid(0458dac5-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLLoader : nsISupports {
interface nsIWSDLLoader : nsISupports
{
nsIWSDLPort load(in AString wsdlURI, in AString portName);
void loadAsync(in AString wsdlURI, in AString portName,
in nsIWSDLLoadListener listener);
nsISupports createPortProxy(in nsIWSDLPort service,
in AString nameSpace,
in boolean sync);
};
[scriptable, uuid(0458dac6-65de-11d5-9b42-00104bdf5339)]
interface nsIWSDLLoadListener : nsISupports {
interface nsIWSDLLoadListener : nsISupports
{
void onLoad(in nsIWSDLPort port);
void onError(in nsresult status,
in AString statusMessage);
void onError(in nsresult status, in AString statusMessage);
};
%{ C++

View File

@ -28,11 +28,16 @@
#include "nsAString.h"
%}
[scriptable, uuid(0458dac7-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPPortBinding : nsIWSDLBinding {
[scriptable, uuid(bb76b72e-d143-4738-804a-53b311466dd9)]
interface nsIWSDLSOAPBinding : nsIWSDLBinding
{
const unsigned short STYLE_RPC = 1;
const unsigned short STYLE_DOCUMENT = 2;
};
[scriptable, uuid(0458dac7-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPPortBinding : nsIWSDLSOAPBinding
{
const unsigned short SOAP_VERSION_1_1 = 0;
const unsigned short SOAP_VERSION_1_2 = 1;
const unsigned short SOAP_VERSION_UNKNOWN = 32767;
@ -45,18 +50,21 @@ interface nsISOAPPortBinding : nsIWSDLBinding {
};
[scriptable, uuid(0458dac8-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPOperationBinding : nsIWSDLBinding {
interface nsISOAPOperationBinding : nsIWSDLSOAPBinding
{
readonly attribute unsigned short style;
readonly attribute AString soapAction;
};
[scriptable, uuid(c3c4614c-301a-44af-ad70-936f9fd1ba5c)]
interface nsISOAPMessageBinding : nsIWSDLBinding {
interface nsISOAPMessageBinding : nsIWSDLSOAPBinding
{
readonly attribute AString namespace;
};
[scriptable, uuid(0458dac9-65de-11d5-9b42-00104bdf5339)]
interface nsISOAPPartBinding : nsIWSDLBinding {
interface nsISOAPPartBinding : nsIWSDLSOAPBinding
{
const unsigned short LOCATION_BODY = 1;
const unsigned short LOCATION_HEADER = 2;
const unsigned short LOCATION_FAULT = 3;

View File

@ -67,17 +67,25 @@ nsWSDLPort::GetOperationCount(PRUint32 *aOperationCount)
{
NS_ENSURE_ARG_POINTER(aOperationCount);
return mOperations.Count(aOperationCount);
*aOperationCount = mOperations.Count();
return NS_OK;
}
/* nsIWSDLOperation getOperation (in PRUint32 index); */
NS_IMETHODIMP
nsWSDLPort::GetOperation(PRUint32 index, nsIWSDLOperation **_retval)
nsWSDLPort::GetOperation(PRUint32 aIndex, nsIWSDLOperation **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
return mOperations.QueryElementAt(index, NS_GET_IID(nsIWSDLOperation),
(void**)_retval);
if (aIndex < (PRUint32)mOperations.Count()) {
*_retval = mOperations[aIndex];
NS_IF_ADDREF(*_retval);
} else {
*_retval = nsnull;
}
return NS_OK;
}
/* nsIWSDLOperation getOperationByName(in AString name); */
@ -85,22 +93,18 @@ NS_IMETHODIMP
nsWSDLPort::GetOperationByName(const nsAString& aName,
nsIWSDLOperation** aOperation)
{
nsresult rv;
*aOperation = nsnull;
nsAutoString name;
// XXX Do a linear search for now. If more efficiency is needed
// we can store the opeartions in a hash as well.
PRUint32 index, count;
mOperations.Count(&count);
PRUint32 i, count = mOperations.Count();
for (index = 0; index < count; index++) {
nsCOMPtr<nsIWSDLOperation> operation;
for (i = 0; i < count; i++) {
nsIWSDLOperation *operation = mOperations[i];
rv = mOperations.QueryElementAt(index, NS_GET_IID(nsIWSDLOperation),
getter_AddRefs(operation));
if (NS_SUCCEEDED(rv)) {
nsAutoString name;
if (operation) {
operation->GetName(name);
if (name.Equals(aName)) {
@ -125,7 +129,7 @@ nsWSDLPort::GetBinding(nsIWSDLBinding** aBinding)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLPort::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -133,15 +137,15 @@ nsWSDLPort::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLPort::AddOperation(nsIWSDLOperation* aOperation)
{
NS_ENSURE_ARG(aOperation);
return mOperations.AppendElement(aOperation);
return mOperations.AppendObject(aOperation) ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsresult
nsWSDLPort::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -155,8 +159,8 @@ nsWSDLPort::SetBinding(nsIWSDLBinding* aBinding)
//
////////////////////////////////////////////////////////////
nsSOAPPortBinding::nsSOAPPortBinding(const nsAString& aName)
: mName(aName), mStyle(STYLE_RPC),
mSoapVersion(nsISOAPPortBinding::SOAP_VERSION_UNKNOWN)
: mName(aName), mSoapVersion(nsISOAPPortBinding::SOAP_VERSION_UNKNOWN),
mStyle(STYLE_RPC)
{
}
@ -164,8 +168,7 @@ nsSOAPPortBinding::~nsSOAPPortBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPPortBinding,
nsIWSDLBinding,
NS_IMPL_ISUPPORTS3_CI(nsSOAPPortBinding, nsIWSDLBinding, nsIWSDLSOAPBinding,
nsISOAPPortBinding)
/* readonly attribute AString protocol; */
@ -236,7 +239,7 @@ nsSOAPPortBinding::GetSoapVersion(PRUint16 *aVersion)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -244,7 +247,7 @@ nsSOAPPortBinding::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetAddress(const nsAString& aAddress)
{
mAddress.Assign(aAddress);
@ -252,7 +255,7 @@ nsSOAPPortBinding::SetAddress(const nsAString& aAddress)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetStyle(PRUint16 aStyle)
{
mStyle = aStyle;
@ -260,7 +263,7 @@ nsSOAPPortBinding::SetStyle(PRUint16 aStyle)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetTransport(const nsAString& aTransport)
{
mTransport.Assign(aTransport);
@ -268,7 +271,7 @@ nsSOAPPortBinding::SetTransport(const nsAString& aTransport)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPPortBinding::SetSoapVersion(PRUint16 aVersion)
{
mSoapVersion = aVersion;
@ -342,7 +345,9 @@ nsWSDLOperation::GetFaultCount(PRUint32* aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
return mFaultMessages.Count(aCount);
*aCount = mFaultMessages.Count();
return NS_OK;
}
/* nsIWSDLMessage getFault(in PRUint32 index); */
@ -351,8 +356,14 @@ nsWSDLOperation::GetFault(PRUint32 aIndex, nsIWSDLMessage * *aFault)
{
NS_ENSURE_ARG_POINTER(aFault);
return mFaultMessages.QueryElementAt(aIndex, NS_GET_IID(nsIWSDLMessage),
(void**)aFault);
if (aIndex < (PRUint32)mFaultMessages.Count()) {
*aFault = mFaultMessages[aIndex];
NS_IF_ADDREF(*aFault);
} else {
*aFault = nsnull;
}
return NS_OK;
}
NS_IMETHODIMP
@ -405,7 +416,7 @@ nsWSDLOperation::GetParameterIndex(const nsAString& aName,
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -413,7 +424,7 @@ nsWSDLOperation::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetInput(nsIWSDLMessage* aInputMessage)
{
mInputMessage = aInputMessage;
@ -421,7 +432,7 @@ nsWSDLOperation::SetInput(nsIWSDLMessage* aInputMessage)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetOutput(nsIWSDLMessage* aOutputMessage)
{
mOutputMessage = aOutputMessage;
@ -429,15 +440,16 @@ nsWSDLOperation::SetOutput(nsIWSDLMessage* aOutputMessage)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::AddFault(nsIWSDLMessage* aFaultMessage)
{
NS_ENSURE_ARG(aFaultMessage);
return mFaultMessages.AppendElement(aFaultMessage);
return mFaultMessages.AppendObject(aFaultMessage) ?
NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -445,7 +457,7 @@ nsWSDLOperation::SetBinding(nsIWSDLBinding* aBinding)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLOperation::AddParameter(const nsAString& aParameter)
{
mParameters.AppendString(aParameter);
@ -459,7 +471,7 @@ nsWSDLOperation::AddParameter(const nsAString& aParameter)
//
////////////////////////////////////////////////////////////
nsSOAPOperationBinding::nsSOAPOperationBinding()
: mStyle(nsISOAPPortBinding::STYLE_RPC)
: mStyle(nsIWSDLSOAPBinding::STYLE_RPC)
{
}
@ -467,9 +479,8 @@ nsSOAPOperationBinding::~nsSOAPOperationBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPOperationBinding,
nsIWSDLBinding,
nsISOAPOperationBinding)
NS_IMPL_ISUPPORTS3_CI(nsSOAPOperationBinding, nsIWSDLBinding,
nsIWSDLSOAPBinding, nsISOAPOperationBinding)
/* readonly attribute AString protocol; */
NS_IMETHODIMP
@ -512,7 +523,7 @@ nsSOAPOperationBinding::GetSoapAction(nsAString & aSoapAction)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPOperationBinding::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -520,7 +531,7 @@ nsSOAPOperationBinding::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPOperationBinding::SetStyle(PRUint16 aStyle)
{
mStyle = aStyle;
@ -528,7 +539,7 @@ nsSOAPOperationBinding::SetStyle(PRUint16 aStyle)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsSOAPOperationBinding::SetSoapAction(const nsAString& aAction)
{
mSoapAction.Assign(aAction);
@ -590,40 +601,42 @@ nsWSDLMessage::GetPartCount(PRUint32 *aPartCount)
{
NS_ENSURE_ARG_POINTER(aPartCount);
return mParts.Count(aPartCount);
*aPartCount = mParts.Count();
return NS_OK;
}
/* nsIWSDLPart getPart (in PRUint32 index); */
NS_IMETHODIMP
nsWSDLMessage::GetPart(PRUint32 index, nsIWSDLPart **_retval)
nsWSDLMessage::GetPart(PRUint32 aIndex, nsIWSDLPart **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
return mParts.QueryElementAt(index, NS_GET_IID(nsIWSDLPart),
(void**)_retval);
if (aIndex < (PRUint32)mParts.Count()) {
*_retval = mParts[aIndex];
NS_IF_ADDREF(*_retval);
} else {
*_retval = nsnull;
}
return NS_OK;
}
/* nsIWSDLPart getPartByName(in AString name); */
NS_IMETHODIMP
nsWSDLMessage::GetPartByName(const nsAString& aName,
nsIWSDLPart** aPart)
nsWSDLMessage::GetPartByName(const nsAString& aName, nsIWSDLPart** aPart)
{
nsresult rv;
nsAutoString name;
*aPart = nsnull;
// XXX Do a linear search for now. If more efficiency is needed
// we can store the part in a hash as well.
PRUint32 index, count;
mParts.Count(&count);
PRUint32 i, count = mParts.Count();
for (index = 0; index < count; index++) {
nsCOMPtr<nsIWSDLPart> part;
for (i = 0; i < count; i++) {
nsIWSDLPart *part = mParts[i];
rv = mParts.QueryElementAt(index, NS_GET_IID(nsIWSDLPart),
getter_AddRefs(part));
if (NS_SUCCEEDED(rv)) {
nsAutoString name;
if (part) {
part->GetName(name);
if (name.Equals(aName)) {
@ -637,7 +650,7 @@ nsWSDLMessage::GetPartByName(const nsAString& aName,
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLMessage::SetDocumentationElement(nsIDOMElement* aElement)
{
mDocumentationElement = aElement;
@ -645,15 +658,15 @@ nsWSDLMessage::SetDocumentationElement(nsIDOMElement* aElement)
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLMessage::AddPart(nsIWSDLPart* aPart)
{
NS_ENSURE_ARG(aPart);
return mParts.AppendElement(aPart);
return mParts.AppendObject(aPart) ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsresult
nsWSDLMessage::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -675,8 +688,7 @@ nsSOAPMessageBinding::~nsSOAPMessageBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPMessageBinding,
nsIWSDLBinding,
NS_IMPL_ISUPPORTS3_CI(nsSOAPMessageBinding, nsIWSDLBinding, nsIWSDLSOAPBinding,
nsISOAPMessageBinding)
/* readonly attribute AString protocol; */
@ -774,9 +786,8 @@ nsWSDLPart::GetBinding(nsIWSDLBinding** aBinding)
return NS_OK;
}
NS_IMETHODIMP
nsWSDLPart::SetTypeInfo(const nsAString& aType,
const nsAString& aElementName,
nsresult
nsWSDLPart::SetTypeInfo(const nsAString& aType, const nsAString& aElementName,
nsISchemaComponent* aSchemaComponent)
{
mType.Assign(aType);
@ -786,7 +797,7 @@ nsWSDLPart::SetTypeInfo(const nsAString& aType,
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsWSDLPart::SetBinding(nsIWSDLBinding* aBinding)
{
mBinding = aBinding;
@ -802,8 +813,8 @@ nsWSDLPart::SetBinding(nsIWSDLBinding* aBinding)
nsSOAPPartBinding::nsSOAPPartBinding(PRUint16 aLocation, PRUint16 aUse,
const nsAString& aEncodingStyle,
const nsAString& aNamespace)
: mLocation(aLocation), mUse(aUse),
mEncodingStyle(aEncodingStyle), mNamespace(aNamespace)
: mLocation(aLocation), mUse(aUse), mEncodingStyle(aEncodingStyle),
mNamespace(aNamespace)
{
}
@ -811,8 +822,7 @@ nsSOAPPartBinding::~nsSOAPPartBinding()
{
}
NS_IMPL_ISUPPORTS2_CI(nsSOAPPartBinding,
nsIWSDLBinding,
NS_IMPL_ISUPPORTS3_CI(nsSOAPPartBinding, nsIWSDLBinding, nsIWSDLSOAPBinding,
nsISOAPPartBinding)
/* readonly attribute AString protocol; */

View File

@ -82,54 +82,68 @@ nsIAtom* nsWSDLAtoms::sHeader_atom = nsnull;
nsIAtom* nsWSDLAtoms::sHeaderFault_atom = nsnull;
nsIAtom* nsWSDLAtoms::sAddress_atom = nsnull;
void
#define SET_AND_CHECK_ATOM(_atom, _val) \
PR_BEGIN_MACRO \
_atom = NS_NewAtom(_val); \
if (!_atom) \
return NS_ERROR_OUT_OF_MEMORY; \
PR_END_MACRO
nsresult
nsWSDLAtoms::CreateWSDLAtoms()
{
sDefinitions_atom = NS_NewAtom("definitions");
sImport_atom = NS_NewAtom("import");
sTypes_atom = NS_NewAtom("types");
sMessage_atom = NS_NewAtom("message");
sPortType_atom = NS_NewAtom("portType");
sBinding_atom = NS_NewAtom("binding");
sService_atom = NS_NewAtom("service");
sPort_atom = NS_NewAtom("port");
sOperation_atom = NS_NewAtom("operation");
sPart_atom = NS_NewAtom("part");
sDocumentation_atom = NS_NewAtom("documentation");
sInput_atom = NS_NewAtom("input");
sOutput_atom = NS_NewAtom("output");
sFault_atom = NS_NewAtom("fault");
NS_ASSERTION(!sDefinitions_atom, "nsWSDLAtoms already created!");
sBody_atom = NS_NewAtom("body");
sHeader_atom = NS_NewAtom("header");
sHeaderFault_atom = NS_NewAtom("headerFault");
sAddress_atom = NS_NewAtom("address");
SET_AND_CHECK_ATOM(sDefinitions_atom, "definitions");
SET_AND_CHECK_ATOM(sImport_atom, "import");
SET_AND_CHECK_ATOM(sTypes_atom, "types");
SET_AND_CHECK_ATOM(sMessage_atom, "message");
SET_AND_CHECK_ATOM(sPortType_atom, "portType");
SET_AND_CHECK_ATOM(sBinding_atom, "binding");
SET_AND_CHECK_ATOM(sService_atom, "service");
SET_AND_CHECK_ATOM(sPort_atom, "port");
SET_AND_CHECK_ATOM(sOperation_atom, "operation");
SET_AND_CHECK_ATOM(sPart_atom, "part");
SET_AND_CHECK_ATOM(sDocumentation_atom, "documentation");
SET_AND_CHECK_ATOM(sInput_atom, "input");
SET_AND_CHECK_ATOM(sOutput_atom, "output");
SET_AND_CHECK_ATOM(sFault_atom, "fault");
SET_AND_CHECK_ATOM(sBody_atom, "body");
SET_AND_CHECK_ATOM(sHeader_atom, "header");
SET_AND_CHECK_ATOM(sHeaderFault_atom, "headerFault");
SET_AND_CHECK_ATOM(sAddress_atom, "address");
SET_AND_CHECK_ATOM(sSchema_atom, "schema");
return NS_OK;
}
void
nsWSDLAtoms::DestroyWSDLAtoms()
{
if (sDefinitions_atom) {
NS_RELEASE(sDefinitions_atom);
NS_RELEASE(sImport_atom);
NS_RELEASE(sTypes_atom);
NS_RELEASE(sMessage_atom);
NS_RELEASE(sPortType_atom);
NS_RELEASE(sBinding_atom);
NS_RELEASE(sService_atom);
NS_RELEASE(sPort_atom);
NS_RELEASE(sOperation_atom);
NS_RELEASE(sPart_atom);
NS_RELEASE(sDocumentation_atom);
NS_RELEASE(sInput_atom);
NS_RELEASE(sOutput_atom);
NS_RELEASE(sFault_atom);
NS_IF_RELEASE(sDefinitions_atom);
NS_IF_RELEASE(sImport_atom);
NS_IF_RELEASE(sTypes_atom);
NS_IF_RELEASE(sMessage_atom);
NS_IF_RELEASE(sPortType_atom);
NS_IF_RELEASE(sBinding_atom);
NS_IF_RELEASE(sService_atom);
NS_IF_RELEASE(sPort_atom);
NS_IF_RELEASE(sOperation_atom);
NS_IF_RELEASE(sPart_atom);
NS_IF_RELEASE(sDocumentation_atom);
NS_IF_RELEASE(sInput_atom);
NS_IF_RELEASE(sOutput_atom);
NS_IF_RELEASE(sFault_atom);
NS_RELEASE(sBody_atom);
NS_RELEASE(sHeader_atom);
NS_RELEASE(sHeaderFault_atom);
NS_RELEASE(sAddress_atom);
}
NS_IF_RELEASE(sBody_atom);
NS_IF_RELEASE(sHeader_atom);
NS_IF_RELEASE(sHeaderFault_atom);
NS_IF_RELEASE(sAddress_atom);
NS_IF_RELEASE(sSchema_atom);
}
////////////////////////////////////////////////////////////
@ -157,33 +171,41 @@ nsWSDLLoader::Init()
prefBranch->GetBoolPref("xml.xmlextras.soap.wsdl", &enabled);
}
if (!enabled)
if (!enabled) {
return NS_ERROR_WSDL_NOT_ENABLED;
}
if (!nsWSDLAtoms::sDefinitions_atom) {
nsWSDLAtoms::CreateWSDLAtoms();
nsresult rv = nsWSDLAtoms::CreateWSDLAtoms();
if (NS_FAILED(rv)) {
return rv;
}
}
return NS_OK;
}
nsresult
nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI,
const char* aMethod,
nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI, const char* aMethod,
nsIURI** aURI)
{
nsresult rv;
nsCOMPtr<nsIXPCNativeCallContext> cc;
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
if(NS_SUCCEEDED(rv)) {
rv = xpc->GetCurrentNativeCallContext(getter_AddRefs(cc));
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));
if(xpc) {
xpc->GetCurrentNativeCallContext(getter_AddRefs(cc));
}
if (NS_SUCCEEDED(rv) && cc) {
if (cc) {
JSContext* cx;
rv = cc->GetJSContext(&cx);
if (NS_FAILED(rv)) return rv;
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsIScriptSecurityManager> secMan(do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIScriptSecurityManager> secMan =
do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsIURI> baseURI;
nsCOMPtr<nsIPrincipal> principal;
@ -196,11 +218,11 @@ nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI,
}
rv = NS_NewURI(aURI, aWSDLURI, nsnull, baseURI);
if (NS_FAILED(rv)) return rv;
if (NS_FAILED(rv))
return rv;
rv = secMan->CheckLoadURIFromScript(cx, *aURI);
if (NS_FAILED(rv))
{
if (NS_FAILED(rv)) {
// Security check failed. The above call set a JS exception. The
// following lines ensure that the exception is propagated.
cc->SetExceptionWasThrown(PR_TRUE);
@ -209,81 +231,66 @@ nsWSDLLoader::GetResolvedURI(const nsAString& aWSDLURI,
}
else {
rv = NS_NewURI(aURI, aWSDLURI, nsnull);
if (NS_FAILED(rv)) return rv;
if (NS_FAILED(rv))
return rv;
}
return NS_OK;
}
/* nsIWSDLService load (in AString wsdlURI, in AString portName); */
NS_IMETHODIMP
nsWSDLLoader::Load(const nsAString& wsdlURI,
const nsAString& portName,
nsIWSDLPort **_retval)
// Internal helper called by Load() and Loadasync(). If aListener is
// non-null, it's an async load, if it's null, it's sync.
nsresult
nsWSDLLoader::doLoad(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLLoadListener *aListener, nsIWSDLPort **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
nsCOMPtr<nsIURI> resolvedURI;
nsresult rv = GetResolvedURI(wsdlURI, "load", getter_AddRefs(resolvedURI));
nsresult rv = GetResolvedURI(wsdlURI, aListener ? "loadAsync" : "load",
getter_AddRefs(resolvedURI));
if (NS_FAILED(rv)) {
return rv;
}
nsCAutoString spec;
resolvedURI->GetSpec(spec);
nsCOMPtr<nsIDOMEventListener> listener;
nsWSDLLoadRequest* request = new nsWSDLLoadRequest(PR_TRUE, nsnull,
nsWSDLLoadRequest* request = new nsWSDLLoadRequest(!aListener, nsnull,
portName);
if (!request) {
return NS_ERROR_OUT_OF_MEMORY;
}
listener = request;
rv = request->LoadDefinition(NS_ConvertASCIItoUCS2(spec.get()));
nsCAutoString spec;
resolvedURI->GetSpec(spec);
if (NS_SUCCEEDED(rv)) {
rv = request->LoadDefinition(NS_ConvertUTF8toUCS2(spec));
if (NS_SUCCEEDED(rv) && aListener) {
request->GetPort(_retval);
}
return rv;
}
/* nsIWSDLService load (in AString wsdlURI, in AString portName); */
NS_IMETHODIMP
nsWSDLLoader::Load(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLPort **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
*_retval = nsnull;
return doLoad(wsdlURI, portName, nsnull, _retval);
}
/* void loadAsync (in AString wsdlURI, in AString portName,
in nsIWSDLLoadListener listener); */
NS_IMETHODIMP
nsWSDLLoader::LoadAsync(const nsAString& wsdlURI,
const nsAString& portName,
nsWSDLLoader::LoadAsync(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLLoadListener *aListener)
{
NS_ENSURE_ARG(aListener);
nsCOMPtr<nsIURI> resolvedURI;
nsresult rv = GetResolvedURI(wsdlURI, "loadAsync", getter_AddRefs(resolvedURI));
if (NS_FAILED(rv)) {
return rv;
}
nsCAutoString spec;
resolvedURI->GetSpec(spec);
nsCOMPtr<nsIDOMEventListener> listener;
nsWSDLLoadRequest* request = new nsWSDLLoadRequest(PR_FALSE, aListener,
portName);
if (!request) {
return NS_ERROR_OUT_OF_MEMORY;
}
listener = request;
return request->LoadDefinition(NS_ConvertASCIItoUCS2(spec.get()));
}
/* nsISupports createPortProxy(in nsIWSDLPort service, in AString nameSpace); */
NS_IMETHODIMP
nsWSDLLoader::CreatePortProxy(nsIWSDLPort *port,
const nsAString& nameSpace,
PRBool sync,
nsISupports **_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
return doLoad(wsdlURI, portName, aListener, nsnull);
}
////////////////////////////////////////////////////////////
@ -305,12 +312,10 @@ nsWSDLLoadRequest::~nsWSDLLoadRequest()
}
}
NS_IMPL_ISUPPORTS1(nsWSDLLoadRequest,
nsIDOMEventListener)
NS_IMPL_ISUPPORTS1(nsWSDLLoadRequest, nsIDOMEventListener)
static inline PRBool
IsElementOfNamespace(nsIDOMElement* aElement,
const nsAString& aNamespace)
IsElementOfNamespace(nsIDOMElement* aElement, const nsAString& aNamespace)
{
nsAutoString namespaceURI;
aElement->GetNamespaceURI(namespaceURI);
@ -334,9 +339,8 @@ nsWSDLLoadRequest::LoadDefinition(const nsAString& aURI)
return rv;
}
rv = mRequest->OpenRequest("GET",
NS_ConvertUCS2toUTF8(aURI).get(),
!mIsSync, nsnull, nsnull);
rv = mRequest->OpenRequest("GET", NS_ConvertUCS2toUTF8(aURI).get(), !mIsSync,
nsnull, nsnull);
if (NS_FAILED(rv)) {
return rv;
}
@ -353,14 +357,12 @@ nsWSDLLoadRequest::LoadDefinition(const nsAString& aURI)
return NS_ERROR_UNEXPECTED;
}
rv = target->AddEventListener(NS_LITERAL_STRING("load"),
this, PR_FALSE);
rv = target->AddEventListener(NS_LITERAL_STRING("load"), this, PR_FALSE);
if (NS_FAILED(rv)) {
return rv;
}
rv = target->AddEventListener(NS_LITERAL_STRING("error"),
this, PR_FALSE);
rv = target->AddEventListener(NS_LITERAL_STRING("error"), this, PR_FALSE);
if (NS_FAILED(rv)) {
return rv;
}
@ -438,7 +440,6 @@ nsWSDLLoadRequest::ContineProcessingTillDone()
}
PopContext();
} while (GetCurrentContext() != nsnull);
return rv;
@ -457,14 +458,13 @@ nsWSDLLoadRequest::HandleEvent(nsIDOMEvent *event)
nsCOMPtr<nsIDOMDocument> document;
rv = mRequest->GetResponseXML(getter_AddRefs(document));
if (NS_SUCCEEDED(rv) && document) {
if (document) {
nsCOMPtr<nsIDOMElement> element;
document->GetDocumentElement(getter_AddRefs(element));
if (element) {
if (IsElementOfNamespace(element,
NS_LITERAL_STRING(NS_WSDL_NAMESPACE))) {
nsCOMPtr<nsIChannel> channel;
nsCOMPtr<nsIURI> uri;
nsCAutoString spec;
@ -478,7 +478,7 @@ nsWSDLLoadRequest::HandleEvent(nsIDOMEvent *event)
}
}
rv = PushContext(document, NS_ConvertASCIItoUCS2(spec.get()));
rv = PushContext(document, NS_ConvertUTF8toUCS2(spec));
if (NS_SUCCEEDED(rv)) {
rv = ContineProcessingTillDone();
@ -559,6 +559,9 @@ nsWSDLLoadRequest::ResumeProcessing()
// If we don't yet have a port, find the service element, create one
// and record the port's its binding name
if (mBindingName.IsEmpty()) {
// The service element tends to be at the end of WSDL files, so
// this would be more efficient if we iterated from last to first
// child...
while (NS_SUCCEEDED(iterator.GetNextChild(getter_AddRefs(childElement),
getter_AddRefs(tagName))) &&
childElement) {
@ -663,8 +666,8 @@ nsWSDLLoadRequest::PopContext()
{
PRUint32 count = mContextStack.Count();
if (count > 0) {
nsWSDLLoadingContext* context = NS_STATIC_CAST(nsWSDLLoadingContext*,
mContextStack.ElementAt(count-1));
nsWSDLLoadingContext* context =
NS_STATIC_CAST(nsWSDLLoadingContext*, mContextStack.ElementAt(count-1));
delete context;
mContextStack.RemoveElementAt(count-1);
}
@ -729,9 +732,9 @@ nsWSDLLoadRequest::GetMessage(const nsAString& aName,
const nsAString& aNamespace,
nsIWSDLMessage** aMessage)
{
nsAutoString keyStr;
keyStr.Assign(aName);
nsAutoString keyStr(aName);
keyStr.Append(aNamespace);
nsStringKey key(keyStr);
nsCOMPtr<nsISupports> sup = dont_AddRef(mMessages.Get(&key));
@ -751,9 +754,9 @@ nsWSDLLoadRequest::GetPortType(const nsAString& aName,
const nsAString& aNamespace,
nsIWSDLPort** aPort)
{
nsAutoString keyStr;
keyStr.Assign(aName);
nsAutoString keyStr(aName);
keyStr.Append(aNamespace);
nsStringKey key(keyStr);
nsCOMPtr<nsISupports> sup = dont_AddRef(mPortTypes.Get(&key));
@ -769,10 +772,8 @@ nsWSDLLoadRequest::GetPortType(const nsAString& aName,
}
static nsresult
ParseQualifiedName(nsIDOMElement* aContext,
const nsAString& aQualifiedName,
nsAString& aPrefix,
nsAString& aLocalName,
ParseQualifiedName(nsIDOMElement* aContext, const nsAString& aQualifiedName,
nsAString& aPrefix, nsAString& aLocalName,
nsAString& aNamespaceURI)
{
nsReadingIterator<PRUnichar> pos, begin, end;
@ -843,13 +844,17 @@ nsWSDLLoadRequest::ProcessImportElement(nsIDOMElement* aElement,
return NS_OK;
}
static const char* kSchemaNamespaces[] = {SCHEMA_1999_NAMESPACE,
SCHEMA_2001_NAMESPACE};
static PRUint32 kSchemaNamespacesLength = sizeof(kSchemaNamespaces) / sizeof(const char*);
nsresult
nsWSDLLoadRequest::ProcessTypesElement(nsIDOMElement* aElement)
{
static const char* kSchemaNamespaces[] =
{
SCHEMA_1999_NAMESPACE,
SCHEMA_2001_NAMESPACE
};
static const PRUint32 kSchemaNamespacesLength =
sizeof(kSchemaNamespaces) / sizeof(const char*);
nsresult rv = NS_OK;
nsChildElementIterator iterator(aElement,
@ -857,12 +862,10 @@ nsWSDLLoadRequest::ProcessTypesElement(nsIDOMElement* aElement)
nsCOMPtr<nsIDOMElement> childElement;
nsCOMPtr<nsIAtom> tagName;
nsCOMPtr<nsIAtom> schemaAtom(dont_AddRef(NS_NewAtom("schema")));
while (NS_SUCCEEDED(iterator.GetNextChild(getter_AddRefs(childElement),
getter_AddRefs(tagName))) &&
childElement) {
if (tagName == schemaAtom) {
if (tagName == nsWSDLAtoms::sSchema_atom) {
nsCOMPtr<nsISchema> schema;
rv = mSchemaLoader->ProcessSchemaElement(childElement,
getter_AddRefs(schema));
@ -907,11 +910,8 @@ nsWSDLLoadRequest::ProcessAbstractPartElement(nsIDOMElement* aElement,
if (!elementQName.IsEmpty()) {
nsAutoString elementPrefix, elementLocalName, elementNamespace;
rv = ParseQualifiedName(aElement,
elementQName,
elementPrefix,
elementLocalName,
elementNamespace);
rv = ParseQualifiedName(aElement, elementQName, elementPrefix,
elementLocalName, elementNamespace);
if (NS_FAILED(rv)) {
return rv;
}
@ -928,10 +928,7 @@ nsWSDLLoadRequest::ProcessAbstractPartElement(nsIDOMElement* aElement,
else if (!typeQName.IsEmpty()) {
nsAutoString typePrefix, typeLocalName, typeNamespace;
rv = ParseQualifiedName(aElement,
typeQName,
typePrefix,
typeLocalName,
rv = ParseQualifiedName(aElement, typeQName, typePrefix, typeLocalName,
typeNamespace);
if (NS_FAILED(rv)) {
return rv;
@ -947,8 +944,7 @@ nsWSDLLoadRequest::ProcessAbstractPartElement(nsIDOMElement* aElement,
schemaComponent = schemaType;
}
partInst->SetTypeInfo(typeQName, elementQName,
schemaComponent);
partInst->SetTypeInfo(typeQName, elementQName, schemaComponent);
aMessage->AddPart(part);
return NS_OK;
@ -1011,11 +1007,8 @@ nsWSDLLoadRequest::ProcessOperationComponent(nsIDOMElement* aElement,
nsAutoString messageQName, messagePrefix, messageLocalName, messageNamespace;
aElement->GetAttribute(NS_LITERAL_STRING("message"), messageQName);
rv = ParseQualifiedName(aElement,
messageQName,
messagePrefix,
messageLocalName,
messageNamespace);
rv = ParseQualifiedName(aElement, messageQName, messagePrefix,
messageLocalName, messageNamespace);
if (NS_FAILED(rv)) {
return rv;
}
@ -1103,24 +1096,21 @@ nsWSDLLoadRequest::ProcessAbstractOperation(nsIDOMElement* aElement,
operationInst->SetDocumentationElement(childElement);
}
else if (tagName == nsWSDLAtoms::sInput_atom) {
rv = ProcessOperationComponent(childElement,
getter_AddRefs(message));
rv = ProcessOperationComponent(childElement, getter_AddRefs(message));
if (NS_FAILED(rv)) {
return rv;
}
operationInst->SetInput(message);
}
else if (tagName == nsWSDLAtoms::sOutput_atom) {
rv = ProcessOperationComponent(childElement,
getter_AddRefs(message));
rv = ProcessOperationComponent(childElement, getter_AddRefs(message));
if (NS_FAILED(rv)) {
return rv;
}
operationInst->SetOutput(message);
}
else if (tagName == nsWSDLAtoms::sFault_atom) {
rv = ProcessOperationComponent(childElement,
getter_AddRefs(message));
rv = ProcessOperationComponent(childElement, getter_AddRefs(message));
if (NS_FAILED(rv)) {
return rv;
}
@ -1208,7 +1198,8 @@ nsWSDLLoadRequest::ProcessMessageBinding(nsIDOMElement* aElement,
}
nsCOMPtr<nsISOAPMessageBinding> messageBinding;
nsSOAPMessageBinding* messageBindingInst = new nsSOAPMessageBinding(namespaceStr);
nsSOAPMessageBinding* messageBindingInst =
new nsSOAPMessageBinding(namespaceStr);
if (!messageBindingInst) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -1218,10 +1209,9 @@ nsWSDLLoadRequest::ProcessMessageBinding(nsIDOMElement* aElement,
messageInst->SetBinding(messageBinding);
nsCOMPtr<nsISOAPPartBinding> binding;
nsSOAPPartBinding* bindingInst = new nsSOAPPartBinding(nsISOAPPartBinding::LOCATION_BODY,
use,
encodingStyle,
namespaceStr);
nsSOAPPartBinding* bindingInst =
new nsSOAPPartBinding(nsISOAPPartBinding::LOCATION_BODY, use,
encodingStyle, namespaceStr);
if (!bindingInst) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -1229,8 +1219,8 @@ nsWSDLLoadRequest::ProcessMessageBinding(nsIDOMElement* aElement,
nsCOMPtr<nsIWSDLPart> part;
nsWSDLPart* partInst;
// If there is no explicit parts attribute, this binding
// applies to all the parts.
// If there is no explicit parts attribute, this binding applies
// to all the parts.
if (partsStr.IsEmpty()) {
PRUint32 index, count;
@ -1335,7 +1325,8 @@ nsWSDLLoadRequest::ProcessOperationBinding(nsIDOMElement* aElement,
else {
nsCOMPtr<nsIWSDLBinding> portBinding;
aPort->GetBinding(getter_AddRefs(portBinding));
nsCOMPtr<nsISOAPPortBinding> soapPortBinding = do_QueryInterface(portBinding);
nsCOMPtr<nsISOAPPortBinding> soapPortBinding =
do_QueryInterface(portBinding);
if (soapPortBinding) {
PRUint16 styleVal;
soapPortBinding->GetStyle(&styleVal);
@ -1375,6 +1366,7 @@ nsWSDLLoadRequest::ProcessOperationBinding(nsIDOMElement* aElement,
operationInst->SetBinding(binding);
return NS_OK;
}
nsresult
@ -1397,10 +1389,7 @@ nsWSDLLoadRequest::ProcessBindingElement(nsIDOMElement* aElement)
nsCOMPtr<nsIWSDLPort> port;
nsAutoString typeQName, typePrefix, typeLocalName, typeNamespace;
aElement->GetAttribute(NS_LITERAL_STRING("type"), typeQName);
rv = ParseQualifiedName(aElement,
typeQName,
typePrefix,
typeLocalName,
rv = ParseQualifiedName(aElement, typeQName, typePrefix, typeLocalName,
typeNamespace);
if (NS_FAILED(rv)) {
return rv;
@ -1413,11 +1402,12 @@ nsWSDLLoadRequest::ProcessBindingElement(nsIDOMElement* aElement)
// the names will resolve to the targetNamespace, while
// they should technically resolve to the default namespace.
if (typePrefix.IsEmpty()) {
nsAutoString targetNamespace;
nsWSDLLoadingContext* context = GetCurrentContext();
if (!context) {
return NS_ERROR_UNEXPECTED;
}
nsAutoString targetNamespace;
context->GetTargetNamespace(targetNamespace);
rv = GetPortType(typeLocalName, targetNamespace, getter_AddRefs(port));
if (NS_FAILED(rv)) {
@ -1461,8 +1451,7 @@ nsWSDLLoadRequest::ProcessBindingElement(nsIDOMElement* aElement)
else if ((tagName == nsWSDLAtoms::sOperation_atom) &&
IsElementOfNamespace(childElement,
NS_LITERAL_STRING(NS_WSDL_NAMESPACE))) {
rv = ProcessOperationBinding(childElement,
port);
rv = ProcessOperationBinding(childElement, port);
if (NS_FAILED(rv)) {
return rv;
}
@ -1494,8 +1483,7 @@ nsWSDLLoadRequest::ProcessPortBinding(nsIDOMElement* aElement)
if ((tagName == nsWSDLAtoms::sAddress_atom) &&
IsElementOfNamespace(childElement,
NS_LITERAL_STRING(NS_WSDL_SOAP_NAMESPACE))) {
childElement->GetAttribute(NS_LITERAL_STRING("location"),
mAddress);
childElement->GetAttribute(NS_LITERAL_STRING("location"), mAddress);
}
}
@ -1522,11 +1510,8 @@ nsWSDLLoadRequest::ProcessServiceElement(nsIDOMElement* aElement)
nsAutoString bindingQName, bindingPrefix;
childElement->GetAttribute(NS_LITERAL_STRING("binding"), bindingQName);
rv = ParseQualifiedName(childElement,
bindingQName,
bindingPrefix,
mBindingName,
mBindingNamespace);
rv = ParseQualifiedName(childElement, bindingQName, bindingPrefix,
mBindingName, mBindingNamespace);
if (NS_FAILED(rv)) {
return rv; // binding of an unknown namespace
}

View File

@ -31,7 +31,6 @@
// XPCOM Includes
#include "nsCOMPtr.h"
#include "nsSupportsArray.h"
#include "nsString.h"
#include "nsIAtom.h"
#include "nsHashtable.h"
@ -50,9 +49,10 @@
#define NS_ERROR_WSDL_LOADPENDING NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_GENERAL, 1)
class nsWSDLAtoms {
class nsWSDLAtoms
{
public:
static void CreateWSDLAtoms();
static nsresult CreateWSDLAtoms();
static void DestroyWSDLAtoms();
static nsIAtom* sDefinitions_atom;
@ -74,9 +74,12 @@ public:
static nsIAtom* sHeader_atom;
static nsIAtom* sHeaderFault_atom;
static nsIAtom* sAddress_atom;
static nsIAtom* sSchema_atom;
};
class nsWSDLLoader : public nsIWSDLLoader {
class nsWSDLLoader : public nsIWSDLLoader
{
public:
nsWSDLLoader();
virtual ~nsWSDLLoader();
@ -85,45 +88,59 @@ public:
NS_DECL_NSIWSDLLOADER
nsresult Init();
protected:
nsresult doLoad(const nsAString& wsdlURI, const nsAString& portName,
nsIWSDLLoadListener *aListener, nsIWSDLPort **_retval);
nsresult GetResolvedURI(const nsAString& aSchemaURI,
const char* aMethod,
nsIURI** aURI);
protected:
nsWSDLPort* mPort;
};
class nsWSDLLoadingContext {
class nsWSDLLoadingContext
{
public:
nsWSDLLoadingContext(nsIDOMDocument* aDocument,
const nsAString& aLocation) :
mDocument(aDocument), mChildIndex(0), mDocumentLocation(aLocation) {
const nsAString& aLocation)
: mDocument(aDocument), mChildIndex(0), mDocumentLocation(aLocation)
{
}
~nsWSDLLoadingContext() {
~nsWSDLLoadingContext()
{
}
void GetRootElement(nsIDOMElement** aElement) {
void GetRootElement(nsIDOMElement** aElement)
{
mDocument->GetDocumentElement(aElement);
}
PRUint32 GetChildIndex() { return mChildIndex; }
void SetChildIndex(PRUint32 aChildIndex) { mChildIndex = aChildIndex; }
PRUint32 GetChildIndex()
{
return mChildIndex;
}
void SetChildIndex(PRUint32 aChildIndex)
{
mChildIndex = aChildIndex;
}
void GetTargetNamespace(nsAString& aNamespace) {
void GetTargetNamespace(nsAString& aNamespace)
{
nsCOMPtr<nsIDOMElement> element;
GetRootElement(getter_AddRefs(element));
if (element) {
element->GetAttribute(NS_LITERAL_STRING("targetNamespace"),
aNamespace);
element->GetAttribute(NS_LITERAL_STRING("targetNamespace"), aNamespace);
}
else {
aNamespace.Truncate();
}
}
void GetDocumentLocation(nsAString& aLocation) {
void GetDocumentLocation(nsAString& aLocation)
{
aLocation.Assign(mDocumentLocation);
}
@ -139,8 +156,7 @@ protected:
class nsWSDLLoadRequest : public nsIDOMEventListener
{
public:
nsWSDLLoadRequest(PRBool aIsSync,
nsIWSDLLoadListener* aListener,
nsWSDLLoadRequest(PRBool aIsSync, nsIWSDLLoadListener* aListener,
const nsAString& aPortName);
virtual ~nsWSDLLoadRequest();
@ -152,26 +168,21 @@ public:
nsresult ContineProcessingTillDone();
nsresult GetPort(nsIWSDLPort** aPort);
nsresult PushContext(nsIDOMDocument* aDocument,
const nsAString& aLocation);
nsresult PushContext(nsIDOMDocument* aDocument, const nsAString& aLocation);
nsWSDLLoadingContext* GetCurrentContext();
void PopContext();
nsresult GetSchemaElement(const nsAString& aName,
const nsAString& aNamespace,
nsISchemaElement** aSchemaComponent);
nsresult GetSchemaType(const nsAString& aName,
const nsAString& aNamespace,
nsresult GetSchemaType(const nsAString& aName, const nsAString& aNamespace,
nsISchemaType** aSchemaComponent);
nsresult GetMessage(const nsAString& aName,
const nsAString& aNamespace,
nsresult GetMessage(const nsAString& aName, const nsAString& aNamespace,
nsIWSDLMessage** aMessage);
nsresult GetPortType(const nsAString& aName,
const nsAString& aNamespace,
nsresult GetPortType(const nsAString& aName, const nsAString& aNamespace,
nsIWSDLPort** aPort);
nsresult ProcessImportElement(nsIDOMElement* aElement,
PRUint32 aIndex);
nsresult ProcessImportElement(nsIDOMElement* aElement, PRUint32 aIndex);
nsresult ProcessTypesElement(nsIDOMElement* aElement);
nsresult ProcessMessageElement(nsIDOMElement* aElement);
nsresult ProcessAbstractPartElement(nsIDOMElement* aElement,
@ -194,7 +205,7 @@ protected:
nsCOMPtr<nsIXMLHttpRequest> mRequest;
nsCOMPtr<nsISchemaLoader> mSchemaLoader;
PRBool mIsSync;
PRPackedBool mIsSync;
nsCOMPtr<nsIWSDLPort> mPort;
nsString mPortName;

View File

@ -35,8 +35,7 @@
// XPCOM Includes
#include "nsCOMPtr.h"
#include "nsVoidArray.h"
#include "nsSupportsArray.h"
#include "nsCOMArray.h"
#include "nsString.h"
#include "nsReadableUtils.h"
#include "nsWeakReference.h"
@ -51,7 +50,8 @@
#define NS_WSDL_NAMESPACE "http://schemas.xmlsoap.org/wsdl/"
#define NS_WSDL_SOAP_NAMESPACE "http://schemas.xmlsoap.org/wsdl/soap/"
class nsSOAPPortBinding : public nsISOAPPortBinding {
class nsSOAPPortBinding : public nsISOAPPortBinding
{
public:
nsSOAPPortBinding(const nsAString& aName);
virtual ~nsSOAPPortBinding();
@ -60,22 +60,23 @@ public:
NS_DECL_NSIWSDLBINDING
NS_DECL_NSISOAPPORTBINDING
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD SetAddress(const nsAString& aAddress);
NS_IMETHOD SetStyle(PRUint16 aStyle);
NS_IMETHOD SetTransport(const nsAString& aTransport);
NS_IMETHOD SetSoapVersion(PRUint16 aSoapVersion);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult SetAddress(const nsAString& aAddress);
nsresult SetStyle(PRUint16 aStyle);
nsresult SetTransport(const nsAString& aTransport);
nsresult SetSoapVersion(PRUint16 aSoapVersion);
protected:
nsString mName;
nsString mAddress;
PRUint16 mStyle;
nsString mTransport;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
PRUint16 mSoapVersion;
PRUint16 mStyle;
};
class nsWSDLPort : public nsIWSDLPort {
class nsWSDLPort : public nsIWSDLPort
{
public:
nsWSDLPort(const nsAString &aName);
virtual ~nsWSDLPort();
@ -83,18 +84,19 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLPORT
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD AddOperation(nsIWSDLOperation* aOperation);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult AddOperation(nsIWSDLOperation* aOperation);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
nsSupportsArray mOperations;
nsCOMArray<nsIWSDLOperation> mOperations;
nsCOMPtr<nsIWSDLBinding> mBinding;
};
class nsSOAPOperationBinding : public nsISOAPOperationBinding {
class nsSOAPOperationBinding : public nsISOAPOperationBinding
{
public:
nsSOAPOperationBinding();
virtual ~nsSOAPOperationBinding();
@ -103,17 +105,18 @@ public:
NS_DECL_NSIWSDLBINDING
NS_DECL_NSISOAPOPERATIONBINDING
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD SetStyle(PRUint16 aStyle);
NS_IMETHOD SetSoapAction(const nsAString& aAction);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult SetStyle(PRUint16 aStyle);
nsresult SetSoapAction(const nsAString& aAction);
protected:
PRUint16 mStyle;
nsString mSoapAction;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
PRUint16 mStyle;
};
class nsWSDLOperation : public nsIWSDLOperation {
class nsWSDLOperation : public nsIWSDLOperation
{
public:
nsWSDLOperation(const nsAString &aName);
virtual ~nsWSDLOperation();
@ -121,24 +124,25 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLOPERATION
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD SetInput(nsIWSDLMessage* aInputMessage);
NS_IMETHOD SetOutput(nsIWSDLMessage* aOutputMessage);
NS_IMETHOD AddFault(nsIWSDLMessage* aFaultMessage);
NS_IMETHOD AddParameter(const nsAString& aParameter);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult SetInput(nsIWSDLMessage* aInputMessage);
nsresult SetOutput(nsIWSDLMessage* aOutputMessage);
nsresult AddFault(nsIWSDLMessage* aFaultMessage);
nsresult AddParameter(const nsAString& aParameter);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
nsCOMPtr<nsIWSDLMessage> mInputMessage;
nsCOMPtr<nsIWSDLMessage> mOutputMessage;
nsSupportsArray mFaultMessages;
nsCOMArray<nsIWSDLMessage> mFaultMessages;
nsStringArray mParameters;
nsCOMPtr<nsIWSDLBinding> mBinding;
};
class nsSOAPMessageBinding : public nsISOAPMessageBinding {
class nsSOAPMessageBinding : public nsISOAPMessageBinding
{
public:
nsSOAPMessageBinding(const nsAString& aNamespace);
virtual ~nsSOAPMessageBinding();
@ -151,7 +155,8 @@ protected:
nsString mNamespace;
};
class nsWSDLMessage : public nsIWSDLMessage {
class nsWSDLMessage : public nsIWSDLMessage
{
public:
nsWSDLMessage(const nsAString& aName);
virtual ~nsWSDLMessage();
@ -159,18 +164,19 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLMESSAGE
NS_IMETHOD SetDocumentationElement(nsIDOMElement* aElement);
NS_IMETHOD AddPart(nsIWSDLPart* aPart);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetDocumentationElement(nsIDOMElement* aElement);
nsresult AddPart(nsIWSDLPart* aPart);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;
nsCOMPtr<nsIDOMElement> mDocumentationElement;
nsSupportsArray mParts;
nsCOMArray<nsIWSDLPart> mParts;
nsCOMPtr<nsIWSDLBinding> mBinding;
};
class nsSOAPPartBinding : public nsISOAPPartBinding {
class nsSOAPPartBinding : public nsISOAPPartBinding
{
public:
nsSOAPPartBinding(PRUint16 aLocation, PRUint16 aUse,
const nsAString& aEncodingStyle,
@ -188,7 +194,8 @@ protected:
nsString mNamespace;
};
class nsWSDLPart : public nsIWSDLPart {
class nsWSDLPart : public nsIWSDLPart
{
public:
nsWSDLPart(const nsAString& aName);
virtual ~nsWSDLPart();
@ -196,10 +203,9 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWSDLPART
NS_IMETHOD SetTypeInfo(const nsAString& aType,
const nsAString& aElementName,
nsresult SetTypeInfo(const nsAString& aType, const nsAString& aElementName,
nsISchemaComponent* aSchemaComponent);
NS_IMETHOD SetBinding(nsIWSDLBinding* aBinding);
nsresult SetBinding(nsIWSDLBinding* aBinding);
protected:
nsString mName;