blob: dab85637e6838cbdcdc17098dd9608e1abffa68e [file] [log] [blame]
/** Interface for the ISAPI_SoapServerFactory class
* @file ISAPI_SoapServerFactory.h
* @author Christian Aberger
* Copyright (C) 2001 WebWare (http://www.webware.at)
*/
#ifndef SoapServerFactory_H
#define SoapServerFactory_H
#include <string>
#include <httpext.h>
#include "stdsoap2.h"
typedef SOAP_FMAC1 void (SOAP_FMAC2 *isapi_gsoap_server_fn)(struct soap *); ///< calls soap_serve inside shared library
typedef SOAP_FMAC1 void (SOAP_FMAC2 *isapi_soap_delete_fn)(struct soap*, void*);
typedef SOAP_FMAC1 int (SOAP_FMAC2 *isapi_soap_register_plugin_fn)(struct soap*, int (*fcreate)(struct soap *, struct soap_plugin *, void*), void *arg);
typedef SOAP_FMAC1 void* SOAP_FMAC2 (*isapi_soap_lookup_plugin_fn)(struct soap*, const char*);
extern "C" {
typedef int (*mod_gsoap_init_fn)();
typedef int (*mod_gsoap_terminate_fn)();
}
class mod_gsoap_interface {
public:
mod_gsoap_interface();
mod_gsoap_interface(const mod_gsoap_interface&); ///< copy constructor.
mod_gsoap_interface& operator=(const mod_gsoap_interface&); ///< assignment operator
bool linked() const;
public:
isapi_gsoap_server_fn fsoap_init;
isapi_gsoap_server_fn fsoap_serve;
isapi_soap_delete_fn fsoap_delete;
isapi_gsoap_server_fn fsoap_done;
isapi_gsoap_server_fn fsoap_end;
isapi_soap_register_plugin_fn fsoap_register_plugin_arg;
isapi_soap_lookup_plugin_fn fsoap_lookup_plugin;
mod_gsoap_init_fn fmod_gsoap_init;
mod_gsoap_terminate_fn fmod_gsoap_terminate;
void *reserved;
};
/** a dynamic link library containing the gsoap entry points soap_init, soap_server etc. */
class SoapDll {
public:
SoapDll(); ///< constructor
SoapDll(const SoapDll&); ///< copy constructor
virtual ~SoapDll(); ///< virtual destructor.
SoapDll& operator=(const SoapDll&); ///< assignment operator
bool load(const char *pszPath); ///< dynamically load this dll.
bool unload(); ///< dynamically load this dll.
const mod_gsoap_interface *gsoap_interface() const; ///< @return the function pointers for calling into this dll.
const char *getLastError() const; ///< @return the latest error message that occurred.
protected:
bool GetEntryPoints(const char *pszPath);
protected:
HMODULE m_hDll; ///< the handle if the dll is already loaded.
std::string m_strLastError; ///< last error message for error reporting
mod_gsoap_interface m_interface;
};
/** Factory object that creates the appropriate server for a given QueryString.
See documentation of the createServer function for details of how the
QueryString is evaluated.
*/
class ISAPI_SoapServerFactory {
public:
static ISAPI_SoapServerFactory *instance(); ///< it is a singleton
void shutdown();
const mod_gsoap_interface *getInterface(const char *pszDll);
const char *getLastError(); ///< return the error message if the last operation failed.
protected:
ISAPI_SoapServerFactory();
~ISAPI_SoapServerFactory();
bool GetEntryPoints();
protected:
class DllMap *m_pDlls;
std::string m_strError;
static ISAPI_SoapServerFactory *m_pInstance;
CRITICAL_SECTION m_cs;
};
#endif // SoapServerFactory_H