00001 #ifndef __SERVICETABLE_H
00002 #define __SERVICETABLE_H
00003
00004 #include <list>
00005
00006 using namespace std;
00007
00008 #include <sys/types.h>
00009 #include "ServiceEntry.h"
00010 #include "Counter.h"
00011 #include "ThreadMessageQueue.h"
00012 #include "NetworkLayer.h"
00013 #include "PacketWriter.h"
00014
00015 const int ST_INVALID_SERVICE = -1;
00016 const int ST_NOT_EXPECTING_CONNECTION = -2;
00017
00018
00019 class RepairConnectionObject {
00020 public:
00021 ServiceEntry* m_serviceEntry;
00022 ServiceTable* m_serviceTable;
00023 };
00024
00025
00026 class ServiceTable : public BasicObject, public NetworkLayerListener, public PacketWriter
00027 {
00028 public:
00029 ServiceTable();
00030 virtual ~ServiceTable();
00031
00032
00033 int listenService();
00034 int connectService();
00035 int disconnectService(int serviceNumber);
00036 int sendData(int serviceNumber, u_char* buf, int bufLength);
00037 int receiveData(int serviceNumber, u_char* buf, int bufLength);
00038
00039
00040 static void* repairConnection(void* arg);
00041 void repairConnectionImpl(ServiceEntry*);
00042
00043
00044 int generateConnectionDescriptor();
00045 int generateServiceNumber();
00046
00047
00048 void handleNetworkEvent(int eventCode, int vcn, NpPacket* packet);
00049
00050
00051 int sendDataPacket(int serviceNumber, TpPacket* queue);
00052
00053 NetworkLayer* getNetworkLayer();
00054
00055 virtual void toStream(std::ostream& out);
00056
00057 friend class ServiceTableCommand;
00058
00059
00060
00061
00062
00063 private:
00064
00065 ServiceEntry* getServiceEntry(int serviceNumber);
00066 ServiceEntry* getServiceEntryByDescriptor(int connectionDescriptor);
00067 void addServiceEntry(ServiceEntry*);
00068 bool removeServiceEntry(int serviceNumber);
00069 bool serviceExists(int serviceNumber);
00070
00071
00072 bool handleDataPacket(int connectionDescriptor, NpPacket* packet);
00073
00074
00075 int signalListenComplete(int connectionDescriptor);
00076
00077
00078 int signalConnectComplete(int connectionDescriptor);
00079
00080
00081 void signalDisconnect(int connectionDescriptor, NpPacket* packet);
00082
00083
00084 void signalBreak(int connectionDescriptor);
00085
00086
00088 list<ServiceEntry*> m_serviceList;
00089
00091 Mutex m_serviceListLock;
00092
00094 NetworkLayer* m_networkLayer;
00095
00097 Counter m_serviceCount;
00098
00100 Counter m_descriptorCount;
00101
00103 int m_receiveWindowSize;
00104
00106 bool m_listening;
00107
00109 ThreadMessageQueue<ServiceEntry> m_listenQueue;
00110
00113 bool m_listenThreadKilled;
00114 };
00115
00116 #endif