/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1990-1997 * Laboratoire de Recherche en Informatique (LRI) * * Bus access, by Stephane Chatty * * $Id$ * $CurLog$ */ #ifndef BusAccess_H_ #define BusAccess_H_ #include "Datagram.h" #include "Stream.h" #include "BufStream.h" #include "SignalHandler.h" #include "ccu/List.h" #include "ccu/IdTable.h" #include "ccu/String.h" #include "ccu/HashTable.h" #include "dnn/Event.h" #include "dnn/Trigger.h" class UchBusSubscription; class UchBusTrigger; class DnnBaseReaction; class UchBusAccess : public UchDatagram, public UchBaseSignalHandler { friend class UchBusAgent; protected: static int Version; static const char* const DefaultBus; static const char* const DefaultBusNet; static sword const DefaultBusPort; CcuString Name; sword ListenPort; sword BroadcastPort; UchStream* Server; CcuListOf Agents; CcuListOf LocalSubscriptions; CcuIdTableOf IdToSubscription; void HandleRead (); void Clear (); void DeferredHandle (int); void HandleEvent (int, const char*); bool CheckUnicity (UchBusAgent*, sword); public: DnnTrigger NewAgents; UchBusAccess (const char*, const char* = 0); ~UchBusAccess (); void Subscribe (DnnBaseReaction&, const char*, ...); void Emit (const char*, ...); }; class UchBusAgent : public UchBufStream { friend class UchBusAccess; friend class UchBusServer; protected: CcuListOf RemoteSubscriptions; sword RemoteId; UchBusAccess* MyBus; CcuString Name; void WriteString (const char*); void ProcessLine (const char*); UchBusAgent (int, UchBusAccess*); UchBusAgent (const char*, sword, UchBusAccess*); ~UchBusAgent (); void HandleRead (); void SendLocalSubscription (const UchBusTrigger*); void SayHello (); void SayBye (); void EmitEvent (const char*); public: DnnTrigger Bye; CcuHashedArrayOf DirectMsg; void Emit (int, const char*, ...); inline const char* GetName () const { return Name; } }; class UchAgentEvent : public DnnEvent { public: static DnnEventType* BusNewAgent, *BusAgentBye; protected: UchBusAgent* Agent; public: UchAgentEvent (UchBusAgent*, DnnEventType*); ~UchAgentEvent (); inline UchBusAgent* GetAgent () const { return Agent;} }; class UchDirectEvent : public DnnEvent { public: UchBusAgent* Agent; CcuString Msg; public: UchDirectEvent (UchBusAgent*, const char*); ~UchDirectEvent (); }; class UchBusEvent : public DnnEvent { public: CcuString Regexp; int NbMatches; CcuListOf MatchList; CcuString Matches; UchBusEvent (const char*, const char*); ~UchBusEvent (); }; #endif /* BusAccess_H_ */