Fawkes API
Fawkes Development Version
|
00001 00002 /*************************************************************************** 00003 * client.h - Fawkes network client 00004 * 00005 * Created: Tue Nov 21 18:42:10 2006 00006 * Copyright 2006 Tim Niemueller [www.niemueller.de] 00007 * 00008 ****************************************************************************/ 00009 00010 /* This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2 of the License, or 00013 * (at your option) any later version. A runtime exception applies to 00014 * this software (see LICENSE.GPL_WRE file mentioned below for details). 00015 * 00016 * This program is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU Library General Public License for more details. 00020 * 00021 * Read the full text in the LICENSE.GPL_WRE file in the doc directory. 00022 */ 00023 00024 #ifndef __NETCOMM_FAWKES_CLIENT_H_ 00025 #define __NETCOMM_FAWKES_CLIENT_H_ 00026 00027 #include <netcomm/fawkes/message_queue.h> 00028 #include <netcomm/fawkes/message.h> 00029 #include <netcomm/fawkes/component_ids.h> 00030 00031 #include <core/exception.h> 00032 #include <core/utils/lock_map.h> 00033 00034 namespace fawkes { 00035 00036 class StreamSocket; 00037 class Mutex; 00038 class WaitCondition; 00039 class FawkesNetworkClientHandler; 00040 class FawkesNetworkClientSendThread; 00041 class FawkesNetworkClientRecvThread; 00042 00043 class HandlerAlreadyRegisteredException : public Exception 00044 { 00045 public: 00046 HandlerAlreadyRegisteredException(); 00047 }; 00048 00049 #define FAWKES_TCP_PORT 1910 00050 00051 class FawkesNetworkClient 00052 { 00053 friend class FawkesNetworkClientSendThread; 00054 friend class FawkesNetworkClientRecvThread; 00055 public: 00056 FawkesNetworkClient(); 00057 FawkesNetworkClient(const char *hostname, unsigned short int port, const char *ip = NULL); 00058 FawkesNetworkClient(unsigned int id, const char *hostname, 00059 unsigned short int port, const char *ip = NULL); 00060 ~FawkesNetworkClient(); 00061 00062 void connect(); 00063 void disconnect(); 00064 void connect(const char *hostname, unsigned short int port); 00065 void connect(const char *hostname, const char *ip, unsigned short int port); 00066 00067 void enqueue(FawkesNetworkMessage *message); 00068 void enqueue_and_wait(FawkesNetworkMessage *message, unsigned int timeout_sec = 15); 00069 00070 void wait(unsigned int component_id, unsigned int timeout_sec = 15); 00071 void wake(unsigned int component_id); 00072 00073 void interrupt_connect(); 00074 00075 void register_handler(FawkesNetworkClientHandler *handler, unsigned int component_id); 00076 void deregister_handler(unsigned int component_id); 00077 00078 bool connected() const throw(); 00079 00080 bool has_id() const; 00081 unsigned int id() const; 00082 00083 const char *get_hostname() const; 00084 const char *get_ip() const; 00085 00086 private: 00087 void recv(); 00088 void notify_of_connection_established(); 00089 void notify_of_connection_dead(); 00090 00091 void wake_handlers(unsigned int cid); 00092 void dispatch_message(FawkesNetworkMessage *m); 00093 void connection_died(); 00094 void set_send_slave_alive(); 00095 void set_recv_slave_alive(); 00096 00097 char *__hostname; 00098 char *__ip; 00099 unsigned short int __port; 00100 00101 StreamSocket *s; 00102 00103 typedef LockMap<unsigned int, FawkesNetworkClientHandler *> HandlerMap; 00104 HandlerMap handlers; 00105 00106 WaitCondition *__connest_waitcond; 00107 Mutex *__connest_mutex; 00108 bool __connest; 00109 bool __connest_interrupted; 00110 00111 Mutex *__recv_mutex; 00112 WaitCondition *__recv_waitcond; 00113 std::map<unsigned int, bool> __recv_received; 00114 FawkesNetworkClientRecvThread *__recv_slave; 00115 FawkesNetworkClientSendThread *__send_slave; 00116 bool __recv_slave_alive; 00117 bool __send_slave_alive; 00118 00119 bool connection_died_recently; 00120 Mutex *slave_status_mutex; 00121 bool _has_id; 00122 unsigned int _id; 00123 }; 00124 00125 } // end namespace fawkes 00126 00127 #endif