#ifndef __DCL_HTTP_SERVLET_H__ #define __DCL_HTTP_SERVLET_H__ 20050530 // HTTP Server -let #ifndef __DCL_OBJECT_H__ #include <dcl/core/Object.h> #endif #ifndef __DCL_EXCEPTION_H__ #include <dcl/core/Exception.h> #endif #ifndef __DCL_COLLECTION_H__ #include <dcl/core/Collection.h> #endif #ifndef __DCL_HTTP_SERVER_EXTENSION_H__ #include <dcl/net/HttpServerExtension.h> #endif #ifndef __DCL_HTTP_HEADER_H__ #include <dcl/net/HttpHeader.h> #endif __DCL_BEGIN_NAMESPACE /* Object HttpServletContext; HttpServletContextEx; HttpServlet; HttpServletEx; */ class DCLNAPI HttpServletContext : public Object { DECLARE_CLASSINFO(HttpServletContext) public : HttpServletContext( const DCL_HTTP_SERVER_API* pSAPI, const DCL_HTTP_SERVLET_CONTEXT* pContext ); virtual ~HttpServletContext(); // request const char* remoteAddr() const; UINT32 remotePort() const; const char* method() const; UINT32 methodNo() const; const char* path() const; const char* queryString() const; const char* contentType() const; unsigned int contentLength() const; const char* scriptFile() const; const void* scriptData() const; size_t scriptLength() const; const String& resContentType() const; String getHttpHeader(const char* pszHeaderName = NULL) const; // NULL is ALL Headers String getCgiVariable(const char* pszVarName) const; size_t read(void* pv, size_t n) __DCL_THROWS1(IOException*); // response void setStatusCode(unsigned int uHttpStatusCode); void setContentType(const char* pszContentType, const char* pszCharset = NULL); void addHeader(const HttpHeader& httpHeader); void flushHeader(); void write(const void* pv, size_t n) __DCL_THROWS1(IOException*); protected: const DCL_HTTP_SERVER_API* m_pSAPI; const DCL_HTTP_SERVLET_CONTEXT* m_pContext; String m_strContentType; // response Content-Type UINT32 m_uHttpStatusCode; String m_strResponseHeaders; bool m_bHeaderFlushed; }; class DCLNAPI HttpServlet : public Object { DECLARE_CLASSINFO(HttpServlet) public: HttpServlet(); String getIniFileName(const char* pszBaseName = NULL) const; protected: // implement virtual void onInitialize() __DCL_THROWS1(Exception*); virtual void onCleanup() __DCL_THROWS1(Exception*); virtual void onHttpService( const DCL_HTTP_SERVLET_CONTEXT* pContext ) = 0 __DCL_THROWS1(Exception*); protected: String m_strModuleName; const DCL_HTTP_SERVER_API* m_pSAPI; public: // internal function static BOOL __initialize( HttpServlet* pServlet, const char* pszModuleName, const DCL_HTTP_SERVER_API* pSAPI, void* hErrorReport ); static BOOL __cleanup( HttpServlet* pServlet, void* hErrorReport ); static BOOL __httpService( HttpServlet* pServlet, const DCL_HTTP_SERVLET_CONTEXT* pContext, void* hErrorReport ); }; #define HTTP_SERVLET_INSTANCE(ServletClass, Description) \ static HttpServlet* __pServlet = NULL; \ static BOOL ModuleInitialize( \ const char* pszModuleName, \ const DCL_HTTP_SERVER_API* pSAPI, \ void* hErrorReport \ ) \ { \ __pServlet = new ServletClass; \ if (!__pServlet) \ { \ pSAPI->pfnReportError( \ hErrorReport, \ "Out of Memory", \ 13); \ return FALSE; \ } \ else \ { \ if (!HttpServlet::__initialize( \ __pServlet, \ pszModuleName, \ pSAPI, \ hErrorReport \ ) \ ) \ { \ delete __pServlet; \ __pServlet = NULL; \ return FALSE; \ } \ } \ return TRUE; \ } \ \ static BOOL ModuleCleanup( \ void* hErrorReport \ ) \ { \ BOOL bResult = HttpServlet::__cleanup( \ __pServlet, \ hErrorReport \ ); \ delete __pServlet; \ __pServlet = NULL; \ return bResult; \ } \ \ static BOOL ModuleHttpService( \ const DCL_HTTP_SERVLET_CONTEXT* pContext, \ void* hErrorReport \ ) \ { \ return HttpServlet::__httpService( \ __pServlet, \ pContext, \ hErrorReport \ ); \ }\ \ extern "C" { \ DCL_DSO_EXPORT \ DCL_HTTP_SERVLET DCL_DSO_ENTRY_POINT = { \ sizeof(DCL_HTTP_SERVLET), \ DCL_VERSION, \ __TIMESTAMP__, \ DCL_BUILD_FLAG, \ DCL_HTTP_SERVLET_MODULE, \ Description, \ DCL_HTTP_SERVER_VERSION, \ ModuleInitialize, \ ModuleCleanup, \ ModuleHttpService \ }; \ } \ #include "HttpServlet.inl" __DCL_END_NAMESPACE #endif // __DCL_HTTP_SERVLET_H__