00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef CONEXUSDATASERVER_H
00020 #define CONEXUSDATASERVER_H
00021
00022 #include <set>
00023 #include <queue>
00024
00025 #include <sys/select.h>
00026 #include <pthread.h>
00027
00028 #include <glibmm/dispatcher.h>
00029 #include <glibmm/thread.h>
00030
00031 #include <conexus/object.h>
00032 #include <conexus/data.h>
00033
00034 namespace Conexus {
00035
00036 typedef enum ReadWrite {
00037 READ = 0x01,
00038 WRITE = 0x02,
00039 READWRITE = 0x03
00040 } ReadWrite;
00041
00045 class DataServer : public Object {
00046 public:
00047 DataServer();
00048
00049 virtual ~DataServer();
00050
00051 virtual void start( ReadWrite rw = READ, bool use_dispatcher = false );
00052 virtual void stop( ReadWrite rw = READ );
00053
00054 sigc::signal<void, Data> signal_data();
00055 sigc::signal<void, CData> signal_cdata();
00056
00057 sigc::signal<void, size_t> signal_data_received();
00058 sigc::signal<void, size_t> signal_data_transmitted();
00059
00060 virtual bool is_running();
00061 virtual bool is_read_running();
00062 virtual bool is_write_running();
00063
00064 virtual const std::string& object_type() { static std::string s("Conexus::DataServer"); return s; }
00065
00066 protected:
00067 bool m_running[ 2 ];
00068 pthread_t m_thread[ 2 ];
00069 pthread_attr_t m_thread_attr[ 2 ];
00070
00071 pthread_mutex_t m_mutex_queue[ 2 ];
00072 pthread_mutex_t m_mutex_can_stop[ 2 ];
00073 pthread_mutex_t m_mutex_can_start[ 2 ];
00074
00075 Glib::Dispatcher* m_dispatcher;
00076 bool m_use_dispatcher;
00077 sigc::connection m_dispatcher_connection;
00078
00079 sigc::signal<void, Data> m_signal_data;
00080 sigc::signal<void, CData> m_signal_cdata;
00081 sigc::signal<void, size_t> m_signal_data_received;
00082 sigc::signal<void, size_t> m_signal_data_transmitted;
00083 std::queue<Data> m_read_queue;
00084 std::queue<Data> m_write_queue;
00085
00086 virtual void read_thread_main();
00087 virtual void read_thread_cleanup();
00088 virtual void write_thread_main();
00089 virtual void write_thread_cleanup();
00090
00091 void queue_received_data( Data d );
00092 void queue_write_data( Data d );
00093 void emit_received_data( );
00094
00095 private:
00096 static void* read_thread_main_static( void* );
00097 static void* write_thread_main_static( void* );
00098
00099 };
00100
00101 }
00102
00103 #endif