/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* INCLUDE: httpserver.hh
*
* MODULE: servercomm
* CLASS: HttpServer
*
* COMMENTS:
* No Comments
*/
#ifndef _HTTPSERVER_
#define _HTTPSERVER_
#include "servercomm/servercomm.hh"
//@ManMemo: Module: {\bf servercomm}
/*@Doc:
The class HttpServer describes the one and only server communication object
that can exist in a RasDaMan server. It manages listening for clients and
maps incoming calls to the respective procedures (which reside in the
file manager.cc).
This class implements the functions useful for HTTP communication
and is based on a copy of servercomm.hh (Version 1.48).
*/
class HttpServer : public ServerComm
{
public:
/// the class represents an MDD in HTTP transfer encoding
class MDDEncoding
{
public:
int objectType;
char *objectTypeName;
char *typeStructure;
int typeLength;
char *domain;
char *tileSize;
char *oidString;
int dataSize;
char *binData;
char *stringRepresentation;
/// default constructor
MDDEncoding();
/// destructor
~MDDEncoding();
// set objectType
void setObjectType(int type);
// set objectTypeName
void setObjectTypeName(char *name);
// set typeStructure
void setTypeStructure(char* type);
// set typeLength
void setTypeLength(int len);
// set domain
void setDomain(char *dom);
// set oid
void setOID(char *o);
// set tile size
void setTileSize(char *size);
// set dataSize
void setDataSize(int size);
// set binData
void setBinData(char *data);
// print Values
const char* toString();
};
/// stores a pointer to the actual servercomm object, only one can exist at a time
static HttpServer* actual_httpserver;
// the class uses the class ClientTblElt from ServerComm because it is used
// in some other files of the server, e.g., qlparser/qtmddaccess.cc or
// qlparser/qtcommand.cc or qlparser/qtinsert.cc all include servercomm.hh
/// default constructor
HttpServer();
// the acual constructor
HttpServer( unsigned long timeOut, unsigned long managementInterval , unsigned long listenPort, char* rasmgrHost, unsigned int rasmgrPort,char* serverName);
/// destructor
virtual ~HttpServer();
/// forces the server to listen for client calls
virtual void startRpcServer() throw( r_Error );
/// stops the server
virtual void stopRpcServer();
/// print server status to {\tt s}
virtual void printServerStatus( ostream& s=cout );
/// Executes a retrieval query and prepare the result for HTTP transer.
virtual long processRequest( unsigned long callingClientId, char* baseName,
int rascommand, char* query, int binDataSize, char *binData,
int Endianess, char* &result, char *capability );
/**
Executes a query and prepares the complete result for transfer via
HTTP. The length of the result is returned. The first parameter is
the unique client id for which the query should be executed. The
second parameter The third parameter is the query itself represented
as a string. {\tt result} will contain a pointer to the result as
needed for HTTP transfer. This pointer has to be freed by the caller
using free.
Return values on Error:
\begin{tabular}{lll}
-1 && parse errror\\
-2 && execution error\\
-3 && unknown error\\
\end{tabular}
Question: How to transfer the result?
*/
/// returns a pointer to the context of the calling client, 0 it there is no context
virtual ClientTblElt* getClientContext( unsigned long ClientId );
/**
Returns a pointer to the context of the calling client. Currently always
the same global context is returned.
*/
private:
int doIt_httpserver( int argc, char *argv[] );
bool flagInformRasMgr; // used to trigger informRasMGR(SERVERAVAILABLE)
};
#include "httpserver.icc"
#endif