Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

ServiceTable.h

Go to the documentation of this file.
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     // Called by TranportLayer
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     //runs on a thread spawned by setBreak
00040     static void* repairConnection(void* arg);
00041     void repairConnectionImpl(ServiceEntry*);
00042     
00043     // generate unique numbers
00044     int generateConnectionDescriptor();
00045     int generateServiceNumber();
00046 
00047     // called by NetworkLayer
00048     void handleNetworkEvent(int eventCode, int vcn, NpPacket* packet);
00049 
00050     // called by SAR
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     //bool isBroken(int connectionDescriptor);
00060     //bool isAlive(int connectionDescriptor);
00061     //void removeBrokenConnections();
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     // called when data arrives
00072     bool handleDataPacket(int connectionDescriptor, NpPacket* packet);
00073 
00074     // called on a passive connect
00075     int signalListenComplete(int connectionDescriptor);
00076     
00077     // called on a active connect
00078     int signalConnectComplete(int connectionDescriptor);
00079     
00080     // called on a disconnect
00081     void signalDisconnect(int connectionDescriptor, NpPacket* packet);
00082     
00083     // called on a broken connection
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

Generated at Thu Jul 11 13:31:52 2002 for Peekabooty by doxygen1.2.9 written by Dimitri van Heesch, © 1997-2001