/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1990-1993 * Laboratoire de Recherche en Informatique (LRI) * * Servers * * $Id$ * $CurLog$ */ #ifndef Server_H_ #define Server_H_ #include "ccu/List.h" #include "MsgStream.h" #include "Multiplexer.h" #include "error.h" class UchServer; class UchClient : public UchMsgStream { friend class UchServer; protected: UchServer* MyServer; public: UchClient (); UchClient (const UchClient& cl); UchClient (UchChannel* ch); ~UchClient (); UchChannel* Copy () const; void Delete (); inline UchServer* GetServer () { return MyServer; } void SetOwner (UchServer*); }; class UchServer : public UchStream { friend class UchClient; protected: #ifndef CPLUS_BUG19 CcuListOf Clients; #else CcuList Clients; #endif pUchBaseMultiplexer Mpx; public: UchServer (); UchServer (const UchServer&); UchServer (UchAddress*); ~UchServer (); UchChannel* Copy () const; void HandleRead (); bool Setup (UchBaseMultiplexer* cs = 0); inline UchBaseMultiplexer* GetMultiplexer () { return Mpx; } void RemoveClient (UchClient*); MPX_RES Run (); void Unlisten (); void Broadcast (UchMessage&, bool = FALSE); void Broadcast (UchMessage&, UchClient*, bool = FALSE); void Broadcast (UchMsgBuffer&, bool = FALSE); void Broadcast (UchMsgBuffer&, UchClient*, bool = FALSE); // called by HandleRead when a new client connects: must build up a client from a channel virtual UchClient* HandleNew (UchChannel*); virtual void HandleRemove (UchClient*); virtual bool SysError (errtype, const char*, int = 0, int = 0); virtual void Error (errtype, const char*, const char*); }; #endif /* Server_H_ */