/* * 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 "ivl/List.h" #include "ivl/IdTable.h" #include "ivl/String.h" #include "ivl/HashTable.h" #include "ivl/Event.h" #include "ivl/Trigger.h" class IvlBusSubscription; class IvlBusTrigger; class IvlBaseReaction; class IvlBusAccess : public IvlDatagram, public IvlBaseScheduledHandler { friend class IvlBusAgent; protected: static int Version; static const char* const DefaultBus; static const char* const DefaultBusNet; static sword const DefaultBusPort; IvlString Name; sword ListenPort; sword BroadcastPort; IvlStream* Server; IvlListOf Agents; IvlListOf LocalSubscriptions; IvlIdTableOf IdToSubscription; void HandleRead (); void Clear (); void DeferredHandle (int); void HandleEvent (int, const char*); bool CheckUnicity (IvlBusAgent*, sword); public: IvlTrigger NewAgents; IvlBusAccess (const char*, const char* = 0); ~IvlBusAccess (); void Subscribe (IvlBaseReaction&, const char*, ...); void Emit (const char*, ...); }; class IvlBusAgent : public IvlBufStream { friend class IvlBusAccess; friend class IvlBusServer; protected: IvlListOf RemoteSubscriptions; sword RemoteId; IvlBusAccess* MyBus; IvlString Name; void WriteString (const char*); void ProcessLine (const char*); IvlBusAgent (int, IvlBusAccess*); IvlBusAgent (const char*, sword, IvlBusAccess*); ~IvlBusAgent (); void HandleRead (); void SendLocalSubscription (const IvlBusTrigger*); void SayHello (); void SayBye (); void EmitEvent (const char*); public: IvlTrigger Bye; IvlHashedArrayOf DirectMsg; void Emit (int, const char*, ...); inline const char* GetName () const { return Name; } }; class IvlAgentEvent : public IvlEvent { public: static IvlEventType* BusNewAgent, *BusAgentBye; protected: IvlBusAgent* Agent; public: IvlAgentEvent (IvlBusAgent*, IvlEventType*); ~IvlAgentEvent (); inline IvlBusAgent* GetAgent () const { return Agent;} }; class IvlDirectEvent : public IvlEvent { public: IvlBusAgent* Agent; IvlString Msg; public: IvlDirectEvent (IvlBusAgent*, const char*); ~IvlDirectEvent (); }; class IvlBusEvent : public IvlEvent { public: IvlString Regexp; int NbMatches; IvlListOf MatchList; IvlString Matches; IvlBusEvent (const char*, const char*); ~IvlBusEvent (); }; #endif /* BusAccess_H_ */