/* * 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 . */ /************************************************************* * * * PURPOSE: * * * COMMENTS: * ************************************************************/ #ifndef RNPSERVERCOMM_HH #define RNPSERVERCOMM_HH //#include //#include #include "rnpcommunication.hh" #include "raslib/error.hh" using namespace rnp; /** * \ingroup Rnprotocols */ class ClientTimer { public: ClientTimer(); void setTimeoutInterval(int seconds); void markAction(); bool checkForTimeout(); private: time_t interval; time_t lastAction; bool enabled; }; /** * \ingroup Rnprotocols */ class RnpRasserverJob : public RnpServerJob { public: RnpRasserverJob() throw(); private: bool validateMessage() throw(); void executeOnAccept() throw(); void executeOnWriteReady() throw(); void specificCleanUpOnTimeout() throw(); void executeOnReadError() throw(); void executeOnWriteError() throw(); }; /** * \ingroup Rnprotocols */ class RnpRasDaManComm : public RnpBaseServerComm { public: RnpRasDaManComm() throw(); ~RnpRasDaManComm() throw(); void processRequest(CommBuffer *receiverBuffer, CommBuffer *transmiterBuffer, RnpTransport::CarrierProtocol, RnpServerJob *callingJob) throw(); void setTimeoutInterval(int seconds); void checkForTimeout(); private: // inherited from RnpBaseServerComm RnpServerJob* createJobs(int howMany); void decodeFragment() throw( r_Error ); ClientTimer clientTimer; private: // the execution functions: void executeConnect(); void executeDisconnect(); void executeOpenDB(); void executeCloseDB(); void executeBeginTA(); void executeCommitTA(); void executeAbortTA(); void executeIsTAOpen(); void executeQueryHttp(); void executeGetNewOId(); void executeQueryRpc(); void executeGetNextElement(); void executeEndTransfer(); void executeGetNextMDD(); void executeGetNextTile(); void executeUpdateQuery(); void executeStartInsertTransMDD(); void executeInsertTile(); void executeEndInsertMDD(); void executeInitUpdate(); void executeGetTypeStructure(); void executeStartInsertPersMDD(); void executeInsertMDD(); void executeInsertCollection(); void executeRemoveObjFromColl(); void executeDeleteObjByOId(); void executeDeleteCollByName(); void executeGetCollection(); void executeGetCollectionOIds(); void executeGetObjectType(); void executeSetFormat(); void executeCreateCollection(); void executeCreateMDD(); void executeExtendMDD(); void executeGetTileDomains(); void answerr_Error(r_Error&); private: // helper functions void connectClient(); // reset connection, without reporting availability to rasmgr void disconnectInternally(); // reset connection, with reporting availability to rasmgr void disconnectClient(); void verifyClientID( RnpQuark command ) throw (r_Error); int makeNewClientID(); int clientID; // un timestamp, de fapt! int requestCounter; // numara pachetele trimise de un client int fragmentCounter; // numara fragmentele trimise de un client static const int NoClient; }; /** * \ingroup Rnprotocols */ class RasserverCommunicator : public NbCommunicator { public: RasserverCommunicator(RnpRasDaManComm*) throw(); protected: bool executeOnTimeout() throw(); RnpRasDaManComm *commPtr; }; #endif // RNPSERVERCOMM_HH