// Ivy.h: interface for the Ivy class. // ////////////////////////////////////////////////////////////////////// #pragma once #pragma warning(disable: 4251) #ifdef WIN32 #ifdef IVY_EXPORTS class _declspec(dllexport) IvyWatcher; class _declspec(dllexport) IvyApplication; class _declspec(dllexport) Ivy; class _declspec(dllexport) CThreadedSocket; class _declspec(dllexport) CBufferedSocket; #else #pragma comment(lib,"Ivy.LIB" ) class _declspec(dllimport) IvyWatcher; class _declspec(dllimport) IvyApplication; class _declspec(dllimport) Ivy; class _declspec(dllimport) CThreadedSocket; class _declspec(dllimport) CBufferedSocket; #endif #endif #ifdef IVY_USE_OWN_DATATYPES #include "DataTypes.h" #else #include #include #include #include namespace ivy = std; #endif #include "IvyCallback.h" class Ivy { friend class IvyWatcher; friend class IvyApplication; private: int regexp_id; unsigned int applicationPort; void SendSubscriptions(IvyApplication *app); bool synchronous; // use Window Shink to made CB mono thread like IvyApplication * server; IvyWatcher * watcher; IvyDieCallback *die_callback; IvyDirectMessageCallback *direct_callback; IvyApplicationCallback *application_callback; IvyBindingCallback *binding_callback; /* list des adresses de broadcast */ ivy::string domain; /* nom de l'appliction */ ivy::string ApplicationName; /* Aplication Unique ID */ ivy::string ApplicationID; /* liste des clients connectes */ CRITICAL_SECTION m_application_cs; typedef ivy::list IvyApplicationList; IvyApplicationList applications; /* liste des souscriptions locale a emettre aux autres applications */ ivy::vector regexp_out; /* liste des callbacks a appeler */ ivy::vector< IvyMessageCallback* > callbacks; protected: void SubstituteInterval (const char *src, char *dst, size_t dst_len); void AddApplication( IvyApplication *app ); void RemoveApplication( IvyApplication *app); bool CheckConnected( IvyApplication *app ); void CallApplicationConnectedCallback( IvyApplication *app ); void CallApplicationDisconnectedCallback( IvyApplication *app ); void CallBindingAddCallback(IvyApplication * app, int id, const char * regexp); void CallBindingRemoveCallback(IvyApplication * app, int id, const char * regexp); void CallBindingFilterCallback(IvyApplication * app, int id, const char * regexp); bool CallDieCallback( IvyApplication *app, int id, const char *arg ); void CallDirectMessageCallback( IvyApplication *app, int id, const char *arg ); void CallMessageCallback( IvyApplication *app, int id, int argc, const char **argv ); const char *GenApplicationUniqueIdentifier(); /* message a emettre sur connection nouvelle application */ ivy::string ready_message; public: void SetBindCallback( IvyBindingCallback* bind_callback ); void SetFilter( int argc, const char **argv ); void SendDieMsg( IvyApplication *app ); IvyApplication *GetApplication(const char *name); void SendDirectMsg( IvyApplication *app, int id, const char *message); void BindDirectMsg( IvyDirectMessageCallback *callback ); int SendMsg( const char *message, ... ); const char *GetDomain(const char *domainlist); unsigned int GetApplicationPort(); int BindMsg( const char *regexp, IvyMessageCallback *cb ); int BindMsg( IvyMessageCallback *cb, const char *regexp, ... ); void UnbindMsg( int id ); Ivy( const char *name, const char* ready, IvyApplicationCallback *callback, bool Synchronous = true ); void start(const char *domain); void stop(); virtual ~Ivy(); };