/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: NPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is 
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2001
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   John Bandhauer (jband@netscape.com)
 *   Vidur Apparao (vidur@netscape.com)
 *
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the NPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the NPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "nsISupports.idl"
#include "nsIWSDL.idl"
#include "nsISimpleEnumerator.idl"
#include "nsIException.idl"
#include "nsISOAPResponse.idl"
#include "nsISOAPBlock.idl"
#include "nsIScriptableInterfaces.idl"

%{ C++
#include "nsAString.h"
%} 

interface nsIWebServiceProxy;
interface nsIWebServiceProxyCreationListener;
interface nsIInterfaceInfo;
interface nsIPropertyBag;

[scriptable, uuid(693611be-bb38-40e0-a98e-b46ff8a5bcca)]
interface nsIWebServiceProxyFactory : nsISupports {
  /**
   * Create a service proxy. Loading of the WSDL URL will occur
   * in a synchronous manner. Calls to web service can be made as
   * soon as this method completes.
   *
   * @param wsdlURL The URL of the WSDL service description. This
   *                description will be loaded and used as the basis
   *                for the service proxy.
   * @param portname The name of the port of the service that this 
   *                 service proxy represents. Currently the port
   *                 must represent a SOAP binding.
   * @param qualifier The user-specified qualifier is incorporated into
   *                  the names of XPCOM interfaces created for the 
   *                  service proxy. For C++ callers, this qualifier 
   *                  should be the  same one used in creating the IDL 
   *                  used at compile time. Script callers need not 
   *                  specify a qualifier.
   * @param isAsync If PR_TRUE, the method signatures of the service
   *                proxy represent an asynchronous calling convention.
   *                A callback instance must be registered with the proxy.
   *                A method call to a web service is only completed when
   *                the corresponding callback method is invoked.
   *                If PR_FALSE, the method signatures of the service
   *                proxy represent a synchronous callling convention.
   *                A method call to a web service is completed when the
   *                method call to the proxy returns.
   */
  nsIWebServiceProxy createProxy(in AString wsdlURL, in AString portname, 
                                 in AString qualifier, in boolean isAsync);

  /**
   * Create a service proxy. Loading of the WSDL URL will occur
   * in an asynchronous manner. Methods on the listener instance will
   * be invoked when the proxy has been created. Any method invocations
   * on the service proxy prior to asynchronous completion of the 
   * intialization step will fail. The caller is guaranteed that this
   * method will return before the listener is invoked.
   *
   * @param wsdlURL The URL of the WSDL service description. This
   *                description will be loaded and used as the basis
   *                for the service proxy.
   * @param portname The name of the port of the service that this 
   *                 service proxy represents. Currently the port
   *                 must represent a SOAP binding.
   * @param qualifier The user-specified qualifier is incorporated into
   *                  the names of XPCOM interfaces created for the 
   *                  service proxy. For C++ callers, this qualifier 
   *                  should be the same one used in creating the IDL 
   *                  used at compile time. Script callers need not 
   *                  specify a qualifier.
   * @param isAsync If PR_TRUE, the method signatures of the service
   *                proxy represent an asynchronous calling convention.
   *                A callback instance must be registered with the proxy.
   *                A method call to a web service is only completed when
   *                the corresponding callback method is invoked.
   *                If PR_FALSE, the method signatures of the service
   *                proxy represent a synchronous callling convention.
   *                A method call to a web service is completed when the
   *                method call to the proxy returns.
   * @param listener The callback instance which will be invoked when
   *                 the proxy is completely initialized.
   */
  void createProxyAsync(in AString wsdlURL, in AString portname, 
                        in AString qualifier, in boolean isAsync,
                        in nsIWebServiceProxyCreationListener listener);
};

/**
 * This interface should be implemented by a user who creates
 * a web service proxy in an asynchronous manner. An instance
 * of this interface is passed into the <code>initAsync</code>
 * method of the proxy.
 */
[scriptable, uuid(a711250b-47da-4f16-a1fd-593de16375a1)]
interface nsIWebServiceProxyCreationListener : nsISupports {
  /**
   * Invoked when the proxy is completely initialized. Method
   * calls on the proxy can be made once this method is called.
   * 
   * @param proxy The initialized web service proxy
   */
  void onLoad(in nsIWebServiceProxy proxy);

  /**
   * Invoked if an error occurs during web service proxy
   * initialization. This error code be a result of attempting
   * to load the specified WSDL URL or a result of processing
   * the WSDL and creating the interface information for the 
   * proxy.
   *
   * @param error The exception generated as a result of the
   *                  error. This object can be introspected
   *                  for further information.
   */ 
  void onError(in nsIException error);
};

[scriptable, uuid(2122421c-1326-41db-87f8-25519d8a12cb)]
interface nsIWebServiceProxy : nsISupports {
  
  [noscript] void Init(in nsIWSDLPort aPort, 
                       in nsIInterfaceInfo aPrimaryInterface,
                       in nsIInterfaceInfoManager aInterfaceInfoManager,
                       in AString aQualifier,
                       in boolean aIsAsync);

  /**
   * The WSDL port that this service proxy represents.
   *
   * @see nsIWSDLPort
   */
  readonly attribute nsIWSDLPort port;

  /**
   * PR_TRUE if the service proxy methods represent an asynchronous
   * calling convention. PR_FALSE if the methods are synchronous.
   */
  readonly attribute boolean isAsync;

  /**
   * The qualifier used for interface names related to
   * this service proxy.
   */
  readonly attribute AString qualifier;


  /**
   * An enumerator that returns the set of pending calls for the
   * service proxy. Each call is an instance of the 
   * <code>nsIWebServiceCallContext</code> interface.
   *
   * @see nsIWebServiceCallContext
   */
  readonly attribute nsISimpleEnumerator pendingCalls;  

  
  /**
   * The name of the primary interface for this proxy. This may or may not be
   * the async version depending on whether or not this is an async proxy.
   */
  readonly attribute string primaryInterfaceName;
  
  /**
   * The name of the primary async listener interface for this proxy. 
   * This will be null if this is not an async proxy.
   */
  readonly attribute string primaryAsyncListenerInterfaceName;

  /**
   * The collection of interfaces related to this service proxy. This
   * will include the primary interface implemented by the service
   * proxy as well as any listener or complex type interfaces required
   * for method parameters and return values.
   * NOTE: only interesting from JavaScript.
   */
  readonly attribute nsIScriptableInterfaces interfaces;
};


/**
 * A representation of a method invocation on a web service.
 * An instance of this interface is returned as a result of making
 * an asynchronous call and can be queried for status of the
 * call.
 */
[scriptable, uuid(87d87900-f102-4a15-b345-7b77a49d2df2)]
interface nsIWebServiceCallContext : nsISupports {
  
  /** 
   * Possible values of the <code>status</code> attribute. A pending
   * call has a status of PENDING. A completed call has a status of
   * SUCCEEDED or FAILED depending on the result of the call.
   */
  const PRUint32 PENDING = 0;
  const PRUint32 SUCCEEDED = 1;
  const PRUint32 FAILED = 2;
  const PRUint32 ABORTED = 3;

  /**
   * The proxy object on which the call was made.
   * 
   * @see nsIWebServiceProxy
   */
  readonly attribute nsIWebServiceProxy proxy;

  /**
   * The name of the method that was invoked.
   */
  readonly attribute AString methodName;

  /**
   * The status of the call, whether pending, completed successfully
   * or completed with a fault.
   */
  readonly attribute PRUint32 status;

  /**
   * The exception generated by the call if the status is FAILURE.
   * The exception object can be introspected for more information.
   * The <code>data</code> member can be QIed to a 
   * <code>nsISOAPFault</code> instance for calls that use a
   * SOAP binding.
   */ 
  readonly attribute nsIException pendingException;

  /**
   * The WSDL operation that correpsonds to the method being invoked.
   *
   * @see nsIWSDLOperation
   */
  readonly attribute nsIWSDLOperation operation;

  /**
   * Called to abort a pending call. If the call is still pending,
   * its callback instance's <code>onError</code> will be invoked,
   * passing in the specified exception.
   *
   * @param error The exception passed to the callback instance's
   *              <code>onError</code> method.
   */
  void abort(in nsIException error);
};

[scriptable, uuid(1ef83ece-b645-4b55-a501-df42c3333b47)]
interface nsIWebServiceSOAPCallContext : nsIWebServiceCallContext {
  /**
   * For users who want access to the lower-level constructs that
   * are used for the method invocation, this attributes provides
   * the SOAP response once the call has completed.
   *
   * @see nsISOAPResponse
   */
  readonly attribute nsISOAPResponse soapResponse;
};

[uuid(b16b15bc-bfad-43cf-b374-2e4651acbc3c)]
interface nsIWebServiceComplexTypeWrapper : nsISupports {
  void Init(in nsISupports aComplexTypeInstance,
            in nsIInterfaceInfo aInterfaceInfo);
};

[uuid(e0b1765e-c0be-4a28-aca3-b292c5c3788b)]
interface nsIWebServicePropertyBagWrapper : nsISupports {
  void Init(in nsIPropertyBag aPropertyBag,
            in nsIInterfaceInfo aInterfaceInfo);
};
 
%{ C++

#define NS_WEBSERVICEPROXYFACTORY_CLASSID           \
{ /* 4E557E69-CCE0-47da-A7D3-2A7ED666F566 */        \
 0x4e557e69, 0xcce0, 0x47da,                        \
 {0xa7, 0xd3, 0x2a, 0x7e, 0xd6, 0x66, 0xf5, 0x66}}
#define NS_WEBSERVICEPROXYFACTORY_CONTRACTID "@mozilla.org/xmlextras/proxy/webserviceproxyfactory;1"

#define NS_WEBSERVICEPROXY_CLASSID                  \
{ /* 1220efd4-8018-45b0-bfc1-0c0716ee0bfb */        \
 0x1220efd4, 0x8018, 0x45b0,                        \
 {0xbf, 0xc1, 0x0c, 0x07, 0x16, 0xee, 0x0b, 0xfb}}
#define NS_WEBSERVICEPROXY_CONTRACTID "@mozilla.org/xmlextras/proxy/webserviceproxy;1"

#define NS_WEBSERVICECOMPLEXTYPEWRAPPER_CLASSID     \
{ /* 615272eb-3908-4fcc-b8f6-94d5a146e2bc */        \
 0x615272eb, 0x3908, 0x4fcc,                        \
 {0xb8, 0xf6, 0x94, 0xd5, 0xa1, 0x46, 0xe2, 0xbc}}
#define NS_WEBSERVICECOMPLEXTYPEWRAPPER_CONTRACTID "@mozilla.org/xmlextras/proxy/webservicecomplextypewrapper;1"

#define NS_WEBSERVICEPROPERTYBAGWRAPPER_CLASSID     \
{ /* 1c76aea3-0810-45b7-bce9-03abc209eb8c */        \
 0x1c76aea3, 0x0810, 0x45b7,                        \
 {0xbc, 0xe9, 0x03, 0xab, 0xc2, 0x09, 0xeb, 0x8c}} 
#define NS_WEBSERVICEPROPERTYBAGWRAPPER_CONTRACTID "@mozilla.org/xmlextras/proxy/webservicepropertybagwrapper;1"

%} 
