98 lines
3.8 KiB
C++
98 lines
3.8 KiB
C++
#if !defined (_SERVER_HANDLER_H_)
|
|
#define _SERVER_HANDLER_H_
|
|
|
|
// *****************************************************************************
|
|
// * SIG_PIPE_HANDLED:
|
|
// * This definition tells the SocketWriter class not to independently
|
|
// * handle the SIGPIPE signal.
|
|
// *****************************************************************************
|
|
#define SIG_PIPE_HANDLED 1
|
|
|
|
#include "cdevEventHandler.h"
|
|
#include "cdevAddr.h"
|
|
#include "cdevSocketConnector.h"
|
|
#include "cdevReactor.h"
|
|
|
|
#include "SocketUtil.h"
|
|
#include "fifo.h"
|
|
|
|
class ServerInterface;
|
|
class ServerHandlerCallbackNode;
|
|
class SignalManager;
|
|
|
|
// *****************************************************************************
|
|
// * ServerHandlerCallback :
|
|
// * This class is used by other classes to register to be informed when the
|
|
// * ServerHandler is destroyed.
|
|
// *****************************************************************************
|
|
class GENERIC_SERVER_API ServerHandlerCallback
|
|
{
|
|
public:
|
|
ServerHandlerCallback ( void ) {}
|
|
virtual ~ServerHandlerCallback ( void ) {}
|
|
virtual void executeServerHandlerCallback (class ServerHandler * handler) = 0;
|
|
};
|
|
|
|
|
|
// *****************************************************************************
|
|
// * ServerHandler:
|
|
// * This class provides the mechanisms that will be used to service the
|
|
// * requests of a client.
|
|
// *****************************************************************************
|
|
class GENERIC_SERVER_API ServerHandler : public cdevEventHandler,
|
|
public SocketReader,
|
|
public SocketWriter
|
|
{
|
|
protected:
|
|
static SignalManager signalManager;
|
|
static int signalManagerInit;
|
|
|
|
char hostName [MAXHOSTNAMELEN + 1];
|
|
char server [256];
|
|
FifoQueue & queue;
|
|
cdevSocketConnector stream;
|
|
ServerInterface * serverface;
|
|
ServerHandlerCallbackNode * callbacks;
|
|
size_t enqueuedPackets;
|
|
size_t enqueuedBytes;
|
|
short clientID;
|
|
int contextID;
|
|
int tagChanged;
|
|
int serverQuitFlag;
|
|
|
|
public:
|
|
ServerHandler (char * Server, ServerInterface * Interface);
|
|
~ServerHandler (void);
|
|
virtual int outputError (int severity, char *name, char *formatString, ...);
|
|
|
|
virtual int open (const cdevAddr &addr);
|
|
|
|
char * getHostName (void);
|
|
char * getName (void) const;
|
|
virtual int getHandle (void) const;
|
|
virtual char * getServer (void) const;
|
|
|
|
virtual int handleClose (void);
|
|
virtual int handleInput (void);
|
|
virtual int handleOutput (void);
|
|
virtual int handleExcept (void);
|
|
|
|
virtual void registerServerCallback (ServerHandlerCallback *);
|
|
virtual void unregisterServerCallback (ServerHandlerCallback *);
|
|
|
|
void enqueue (char * buf, size_t len);
|
|
void undequeue (char * buf, size_t len) { queue.undequeue(buf, len); }
|
|
int dequeue (char **buf, size_t *len) { return queue.dequeue(buf, len); }
|
|
int empty (void) { return queue.empty(); }
|
|
|
|
static short getNextClientID ( void );
|
|
short getClientID ( void ) { return clientID; }
|
|
void setClientID ( short ClientID ) { clientID=ClientID; }
|
|
int getContextID ( void ) { return contextID; }
|
|
void setContextID ( int ContextID ) { contextID = ContextID; }
|
|
int getTagChangeFlag ( void ) { return tagChanged; }
|
|
void setTagChangeFlag ( int flag ) { tagChanged = flag; }
|
|
};
|
|
|
|
#endif /* _SERVER_HANDLER_H_ */
|