blob: d7335256d68124122d597269452f05cb8b85ba17 [file] [log] [blame]
/*
* Copyright 2003-2004 The Apache Software Foundation.
// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/**
* @file Stub.hpp
*
* Contains the Stub base class that all C++ web service stubs inherit
* from. The functions in this Stub base class provides the client
* application some added functionality to manipulate the SOAP messages.
*/
#ifndef STUB_INCLUDED
#define STUB_INCLUDED
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE */
/* ---------------------------------------------------------------- */
/* THIS HEADER FILE PATTERNED AFTER CORRESPONDING hpp HEADER FILE. */
/* CHANGES TO hpp HEADER FILE MAY NEED TO BE PROPAGATED HERE AND IN */
/* THE IMPLEMEMTATION OF THE C APIS. */
/* ---------------------------------------------------------------- */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
#ifdef __cplusplus
extern "C" {
#endif
#include <stdarg.h>
#include <axis/client/Call.h>
/**
* @class Stub
*
* @brief This is the client Stub base class to be inherited by all stub
* classes genarated by WSDL2WS tool. This class acts as the interface
* between the users and the Axis C++ engine (client side). Programmer
* can use the API defined here to enrich the client application
* functionality. Setting transport properties, setting SOAP headers,
* setting connection timeout and specifying a proxy on the client stub
* is facilitated with this interface.
*
*/
/**
* Constructor.
*
* @param pcEndPointURI End point URI of the service to connect to.
* e.g. http://localhost:8080/axis/services/echo
* @param eProtocol The protocol that this stub should use to communicate
* with the endpoint. See AXIS_PROTOCOL_TYPE in GDefine.h for
* possible values for eProtocol.
*/
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscStubCreate(const char * pcEndPointURI,
AXISC_PROTOCOL_TYPE eProtocol);
/**
* Destructor.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubDestroy(AXISCHANDLE stub);
/**
* Set end point of service to connect to.
*
* @param pcEndPointURI End point URI of the service to connect to.
* e.g. http://localhost:8080/axis/services/echo
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetEndPoint(AXISCHANDLE stub, const char * pcEndPointURI);
/**
* Set transport property.
*
* Handling the semantics of the headers is up to the user.
* The user has to make sure that the key:value paires passed to this method
* would make sense at transport level.
* The Stub class does not validate the key value paires to see if the properties
* make sense to the undelying transport.
*
* Some example transport properties:
* <BR> For HTTP: "Accept-Language: da, en-gb;q=0.8, en;q=0.7"
* <BR> For HTTP: "Cookie: sessiontoken=123345456;"
* <BR> For SMTP: "Reply-To: user@apache.org"
*
* @param pcKey Header name e.g. "Accept-Language".
* Note that the key is not tested for uniqueness.
* One can set several values to the same key and they all will
* appear in the outgoing transport header.
* e.g. If the method is called twise with (k,v1) and (k,v2)
* both k:v1 and k:v2 will appear in transport header as
* seperate properties.
* The exception to this is "Cookie" where multiple cookie values will only result in one "Cookie:" header being sent as is correct for HTTP.
* @param pcValue Header value e.g. "da, en-gb;q=0.8, en;q=0.7"
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetTransportProperty(AXISCHANDLE stub, const char * pcKey,
const char * pcValue);
/**
* Get a transport property.
*
* Returns the value of a transport property based on a key.
*
* @param key the property's name to search for
* @param response set to true searches the response message for the property
* set to false searches the send message for the property
* @return the value of the property or NULL if it was not found.
*/
AXISC_STORAGE_CLASS_INFO
const char * axiscStubGetTransportProperty(AXISCHANDLE stub, const char * key,
AxiscBool response);
/**
* Iterator initiatior for transport property keys
*
* This method must be called first to initiate access to the list of
* transport property keys. If you initialise e.g. response then ensure
* that you call this method for outgoing message too if you want the
* outgoing message in future calls.
*
*
* @param response whether the response or outgoing message is being used.
* @return First transport property key. If there are no transport
* properties set, returns NULL.
*/
AXISC_STORAGE_CLASS_INFO
const char * axiscStubGetFirstTransportPropertyKey(AXISCHANDLE stub, AxiscBool response);
/**
* Iterator for transport property keys
*
* getFirstTransportPropertyKey() method must have been called at least once
* before this method is called. If not behaviour is undefined.
*
* This method advances the iterator by one position.
* Repeated calls always retuen the next value.
*
* @param response whether the response or outgoing message should be used
* @return Next transport property key. If there are no transport
* properties set or if iterator is at the end of the list, returns NULL.
*/
AXISC_STORAGE_CLASS_INFO
const char * axiscStubGetNextTransportPropertyKey(AXISCHANDLE stub, AxiscBool response);
/**
* Accessor for transport property keys.
*
* This method gives access to the key corresponding to the transport key
* currently being pointed by transport property key iterator.
*
* getFirstTransportPropertyKey() method must have been called at least once
* before this method is called. If not behaviour is undefined.
*
* This method does not advance the iterator.
* Repeated calls always retuen the same key unless
* getNextTransportPropertyKey() is called in between.
*
* @param response whether the response or outgoing message is being used.
* @return Current transport property key. If there are no transport
* properties set or if iterator is at the end of the list, returns NULL.
*/
AXISC_STORAGE_CLASS_INFO
const char * axiscStubGetCurrentTransportPropertyKey(AXISCHANDLE stub, AxiscBool response);
/**
* Accessor for transport property values.
*
* This method gives access to the value corresponding to the transport key
* currently being pointed by transport property key iterator.
* As keys and values are treated as pairs, access to the value field is
* based on the access to the key field.
*
* getFirstTransportPropertyKey() method must have been called at least once
* before this method is called. It must be called with the same "response"
* value as used here. If not behaviour is undefined.
*
* This method does not advance the iterator.
* Repeated calls always retuen the same value unless
* getNextTransportPropertyKey() is called in between.
*
* @param response whether the response or outgoing message should be used
* @return Current transport property value. If there are no transport
* properties set or if iterator is at the end of the list, returns NULL.
*/
AXISC_STORAGE_CLASS_INFO
const char * axiscStubGetCurrentTransportPropertyValue(AXISCHANDLE stub, AxiscBool response);
/**
* Deletes the transport property key:value pair currently pointed to by
* the iterator.
* @param response true if it's the response property or false for the request
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubDeleteCurrentTransportProperty(AXISCHANDLE stub, AxiscBool response);
/**
* Deletes the given occurance of the transport property key:value pair
* corresponding to the given key.
*
* This method does not advance the iterator in line with the deletes done.
* In case you want to access the transport properties after using this
* method, it is advisable to reinitialize the iterator using
* getFirstTransportPropertyKey();
* However you can use this method despite where the iterator is
* pointing currently.
*
* NOTE: This method is used to delete individual cookies e.g. deleteTransportProperty("myCookie") will delete the cookie "myCookie" only.
* This method can also be used to delete all Cookies by doing deleteTransportProperty("Cookie").
*
* @param pcKey Key of the transport property key:value pair to be deleted
* If the given key is not set currently, nothing will happen.
* @param uiOccurance Which occerance of the key to be deleted, because
* there can be multiple values for the same key.
* Default is to delete the first occurance.
* Count starts from 1.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubDeleteTransportProperty(AXISCHANDLE stub, char * pcKey,
unsigned int uiOccurance);
/**
* Sets a property that can be accessed from a handler.
*
* @param name The name of the property
* @param value The value of the property
* @param len The length of the value
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetHandlerProperty(AXISCHANDLE stub, AxiscChar * name,
void * value,
int len);
/**
* Create and add a SOAP header block to the Stub.
*
* This will create a header block that would look like the following when
* serialized:
* \verbatim
<th:TestHeader xmlns:th="http://ws.apache.org/axisCppTest/">
</th:TestHeader>
\endverbatim
*
* User must use the IHeaderBlock pointer returned and fill in the header structure.
* e.g. To make the SOAP header look like
* \verbatim
<SOAP-ENV:Header>
<th:TestHeader xmlns:th="http://ws.apache.org/axisCppTest/">
<Credentials>
<username>Test User</username>
<password>Test Password</password>
</Credentials>
</th:TestHeader>
</SOAP-ENV:Header>
\endverbatim
* the following code segment could be used
* <code>
*
* IHeaderBlock *phb = ws.createSOAPHeaderBlock("TestHeader",
* "http://ws.apache.org/axisCppTest/",
* "th");
*
*
* //create parent node
*
* BasicNode *parentNode = phb->createChild(ELEMENT_NODE);
*
* parentNode->setLocalName("Credentials");
*
*
* //create child node
*
* BasicNode *childNode = phb->createChild(ELEMENT_NODE);
*
* childNode->setLocalName("username");
*
*
* //create char node for value
*
* BasicNode *valueNode = phb->createChild(CHARACTER_NODE);
*
* valueNode->setValue("Test User");
*
*
* //buld node tree
*
* childNode->addChild(valueNode);
*
* parentNode->addChild(childNode);
*
*
* //add another node set
*
* childNode = phb->createChild(ELEMENT_NODE);
*
* childNode->setLocalName("password");
*
*
* valueNode = phb->createChild(CHARACTER_NODE);
*
* valueNode->setValue("Test Password");
*
*
* childNode->addChild(valueNode);
*
* parentNode->addChild(childNode);
*
*
* phb->addChild(parentNode);
* </code>
*
* @param pachLocalName Local tag name of the SOAP header. e.g. TestHeader
* @param pachPrefix Prefix to be used in XML represenation of SOAP header
* e.g. th
* @param pachUri Namespace URI to be used in SOAP header.
e.g http://ws.apache.org/axisCppTestHeader/
*
* @return Pointer to the creater SOAP header block.
*/
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscStubCreateSOAPHeaderBlock(AXISCHANDLE stub, AxiscChar * pachLocalName,
AxiscChar * pachUri,
AxiscChar * pachPrefix);
/**
* Iterator initiatior for SOAP header blocks
*
* This method must be called first to initiate access to the list of
* SOAP header blocks.
*
* @return First SOAP header block pointer. If there are no SOAP header
* blocks set, returns NULL.
*/
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscStubGetFirstSOAPHeaderBlock(AXISCHANDLE stub);
/**
* Iterator for SOAP header blocks
*
* getFirstSOAPHeaderBlock() method must have been called at least once
* before this method is called. If not behaviour is undefined.
*
* This method advances the iterator by one position.
* Repeated calls always retuen the next value.
*
* @return Next SOAP header block pointer. If there are no SOAP header
* blocks set or if iterator is at the end of the list, returns NULL.
*/
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscStubGetNextSOAPHeaderBlock(AXISCHANDLE stub);
/**
* Accessor for SOAP header blocks
*
* This method gives access to the SOAP header block pointer corresponding
* to the SOAP header block currently being pointed by SOAP header blocks
* iterator.
*
* getFirstSOAPHeaderBlock() method must have been called at least once
* before this method is called. If not behaviour is undefined.
*
* This method does not advance the iterator.
* Repeated calls always retuen the same key unless
* getNextSOAPHeaderBlock() is called in between.
*
* @return Current SOAP header block pointer. If there are no SOAP header
* block set or if iterator is at the end of the list, returns NULL.
*/
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscStubGetCurrentSOAPHeaderBlock(AXISCHANDLE stub);
/**
* Deletes the SOAP header block currently pointed to by
* the iterator.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubDeleteCurrentSOAPHeaderBlock(AXISCHANDLE stub);
/**
* Deletes the given SOAP header block pointer from the current list of
* SOAP header blocks.
*
* This method does a pointer comparison. It does not compare the contents
* within objects.
* Hence it is expected that either the pointer returned by the
* create method or by one of the iterator methods would be used with
* this method.
*
* This method does not advance the iterator in line with the deletes done.
* In case you want to access the SOAP header blocks after using this
* method, it is advisable to reinitialize the iterator using
* getFirstSOAPHeaderBlock();
* However you can use this method despite where the iterator is
* pointing currently.
*
* @param pHeaderBlock Pointer of the header block to be deleted.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubDeleteSOAPHeaderBlock(AXISCHANDLE stub, AXISCHANDLE pHeaderBlock);
/**
* Set proxy server and port for transport.
*
* @param pcProxyHost Host name of proxy server
* @param uiProxyPort Port of proxy server
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetProxy(AXISCHANDLE stub, const char * pcProxyHost,
unsigned int uiProxyPort);
/**
* Set transport timeout.
*
* @param lSeconds Timeout in seconds.
* If lSeconds is 0, then the transport will assume no
* timeout. Hence you want to reset a timeout already set
* use 0.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetTransportTimeout(AXISCHANDLE stub, long lSeconds);
/**
* Set transport connect timeout.
*
* @param lSeconds Timeout in seconds.
* If lSeconds is 0, then the transport will assume no
* timeout. Hence you want to reset a timeout already set
* use 0.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetTransportConnectTimeout(AXISCHANDLE stub, long lSeconds);
/**
* Get the status of the stub to see any error situation
*/
AXISC_STORAGE_CLASS_INFO
int axiscStubGetStatus(AXISCHANDLE stub);
/**
* Set whether to Maintain session with service ot not.
* @param bSession - true if session should be maintained. False otherwise.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetMaintainSession(AXISCHANDLE stub, AxiscBool bSession);
/**
* Set transport protocol to be used by the transport.
* @param eProtocol - protocol to use
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetTransportProtocol(AXISCHANDLE stub, AXISC_PROTOCOL_TYPE eProtocol);
/**
* Get transport protocol being used by the transport.
* @return Protocol used by transport
*/
AXISC_STORAGE_CLASS_INFO
AXISC_PROTOCOL_TYPE axiscStubGetTransportProtocol(AXISCHANDLE stub);
/**
* Sets the username to be used for basic authentication
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetUsername(AXISCHANDLE stub, const char * pcUsername);
/**
* Sets the password to be used for basic authentication
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetPassword(AXISCHANDLE stub, const char * pcPassword);
/**
* Sets the username to be used for Proxy authentication
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetProxyUsername(AXISCHANDLE stub, const char * pcProxyUsername);
/**
* Sets the password to be used for Proxy authentication
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetProxyPassword(AXISCHANDLE stub, const char * pcProxyPassword);
/**
* Call object of the Stub. This is the point of access to the internals
* of the Axis engine.
*/
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscStubGetCall(AXISCHANDLE stub);
/**
* Creates an ISoapAttachment which represents an attachment. The ISoapAttachment should be passed as
* an attachmment parameter to a web service. The storage associated with the ISoapAttachment will be
* automatically deleted by Axis C++ if it is passed as a parameter to a web service.
*/
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscStubCreateSoapAttachment(AXISCHANDLE stub);
/**
* Set SSL configuration properties.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetSecure(AXISCHANDLE stub, char * pszArguments,
... );
/**
* Set pointer to exception handler function for stub object.
* This function was added in support of the c-Binding implementation.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetCExceptionHandler(AXISCHANDLE stub, void * pExceptionHandler);
/**
* Get pointer to exception handling function for call object.
* This function was added in support of the c-Binding implementation.
*/
AXISC_STORAGE_CLASS_INFO
void * axiscStubGetCExceptionHandler(AXISCHANDLE stub);
/**
* Apply user set preferences to each call made on the Stub object.
* This method is required because Axis engine holds only part of the state
* with refereance to subsequent calls on the same Stub object.
* Foxing this approach would make the engine much more efficient.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubApplyUserPreferences(AXISCHANDLE stub);
/**
* Apply SSL configuration properties.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubIncludeSecure(AXISCHANDLE stub);
/**
* Set SOAP Headers stored in m_vSOAPHeaderBlock vector.
* Called by applyUserPreferences for each and every method invocation.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetSOAPHeaders(AXISCHANDLE stub);
/**
* Check for extraneous elements. Called at the end of SOAP processing
* to ensure that there are no extraneous elements. Will throw an
* exception if extraneous elements are detected.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubCheckForExtraneousElements(AXISCHANDLE stub);
/**
* =============
* Following is not in stub C++ class but is here to make things easier for C users.
* =============
*/
/**
* Indicates whether transport is to automatically handle http redirects.
* By default, redirects are not handled by the transport. If enabled,
* auto-redirect will only occur when going from http to http or https to https.
*
* @param handleRedirect false=no auto-redirect. true=handle redirect automatically.
* @param maxCount how many redirects to follow. Default is 1. A value less than 1
* is the same as setting handleRedirect to false.
*
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubSetTransportAutoRedirect(AXISCHANDLE stub, AxiscBool handleRedirect, int maxCount);
/**
* Add namespace to SOAP header.
*
* @param pUri The namespace uri .
* @param pPrefix The prefix to associate with the uri.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubAddNamespaceToSOAPHeader(AXISCHANDLE stub,
const AxiscChar * pUri,
const AxiscChar * pPrefix);
/**
* Clears SOAP header namespaces.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubClearSOAPHeaderNamespaces(AXISCHANDLE stub);
/**
* Add attribute to SOAP header.
*
* @param pLocalname The local name of the Attribute.
* @param pPrefix The prefix of the Attribute.
* @param pValue The value of the Attribute.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubAddAttributeToSOAPHeader(AXISCHANDLE stub,
const AxiscChar * pLocalname,
const AxiscChar * pPrefix,
const AxiscChar * pValue);
/**
* Clears SOAP header attributes.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubClearSOAPHeaderAttributes(AXISCHANDLE stub);
/**
* Add namespace to SOAP body.
*
* @param pUri The namespace uri .
* @param pPrefix The prefix to associate with the uri.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubAddNamespaceToSOAPBody(AXISCHANDLE stub,
const AxiscChar * pUri,
const AxiscChar * pPrefix);
/**
* Clears SOAP body namespaces.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubClearSOAPBodyNamespaces(AXISCHANDLE stub);
/**
* Add attribute to SOAP body.
*
* @param pLocalname The local name of the Attribute.
* @param pPrefix The prefix of the Attribute.
* @param pUri The namespace uri of the Attribute.
* @param pValue The value of the Attribute.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubAddAttributeToSOAPBody(AXISCHANDLE stub,
const AxiscChar * pLocalname,
const AxiscChar * pPrefix,
const AxiscChar * pValue);
/**
* Clears SOAP body attributes.
*/
AXISC_STORAGE_CLASS_INFO
void axiscStubClearSOAPBodyAttributes(AXISCHANDLE stub);
#ifdef __cplusplus
}
#endif
#endif /* STUB_INCLUDED */