Advertisement
alestane

Header for Data layer

Apr 17th, 2012
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.55 KB | None | 0 0
  1. //
  2. //  Mediator.h
  3. //  Chess
  4. //
  5. //  Created by Nevin Flanagan on 3/28/12.
  6. //  Copyright (c) 2012. All rights reserved.
  7. //
  8.  
  9. #ifndef Chess_Mediator_h
  10. #define Chess_Mediator_h
  11.  
  12. #include <exception>
  13. #include <map>
  14. #include <list>
  15. #include "Connection.h"
  16.  
  17. using namespace std;
  18.  
  19. class HostMediator {
  20. public:
  21.     class Acceptor{
  22.     protected:
  23.         typedef enum {
  24.             connection_lost,
  25.             packet_ready,
  26.             packet_acknowledged
  27.         } event;
  28.         friend class HostMediator;
  29.     public:
  30.         class Generator {
  31.         public:
  32.             virtual Acceptor& operator()(RemoteHost::Receptionist::Generator& creator) = 0;
  33.             virtual ~Generator() {}
  34.         };
  35.  
  36.         virtual void operator() (HostMediator&, event) = 0;
  37.         virtual ~Acceptor() {};
  38.     };
  39.    
  40.     class DeadConnection: public exception {
  41.     public:
  42.         DeadConnection(HostMediator&);
  43.     };
  44.    
  45.     class TimeoutExpired: public exception {};
  46.    
  47.     struct Transmission {
  48.         Transmission();
  49.         Transmission(unsigned short len,
  50.                      char const bytes[]);
  51.         unsigned short length;
  52.         char data[256];
  53.     };
  54.    
  55.     HostMediator(std::string const& targetAddress, int targetPort,
  56.                Acceptor& localProcessor, float errorRate = 0.0f);
  57.    
  58.     HostMediator& transmit(Transmission const&,
  59.                            bool reliable = true) throw (DeadConnection);
  60.     HostMediator& transmit(Transmission const&, float timeout,
  61.                            bool reliable = true) throw (DeadConnection, TimeoutExpired);
  62.    
  63.     HostMediator& collect(Transmission&)
  64.         throw (DeadConnection);
  65.     HostMediator& collect(Transmission&, float timeout)
  66.         throw (DeadConnection, TimeoutExpired);
  67.     static RemoteHost::Acceptor& supportHost(int socketID);
  68. private:
  69.     static char const DATA_LEADER = 0x01;
  70.     static char const ACK_LEADER = 0x06;
  71.     static char const NACK_LEADER = 0x15;
  72.  
  73.     typedef unsigned long long packetID;
  74.  
  75.     class SlidingWindow: private list< pair<unsigned char, RemoteHost::Transmission*> > {
  76.     public:
  77.         SlidingWindow(unsigned char size = 1) {reset(1);}
  78.         void reset(unsigned char size);
  79.         void extend(unsigned char size);
  80.         bool includes(unsigned char index);
  81.         bool contains(unsigned char index);
  82.         RemoteHost::Transmission*& operator[](unsigned char index);
  83.         bool operator>>(RemoteHost::Transmission*&);
  84.         list<unsigned char> missing();
  85.     };
  86.  
  87.     class SendBuffer: public HostMediator::Transmission {
  88.     public:
  89.         SendBuffer(packetID sendingPacket, Transmission const&);
  90.         unsigned char nextSequence() const {return sequenceNumber;}
  91.         bool operator>>(RemoteHost::Transmission&);
  92.         packetID const ID;
  93.     private:
  94.         char *buffer;
  95.         unsigned char sequenceNumber;
  96.     };
  97.     class ReceiveBuffer: public HostMediator::Transmission {
  98.     public:
  99.         ReceiveBuffer(packetID receivingPacket, unsigned short declaredLength);
  100.         unsigned char nextSequence() const {return sequenceNumber;}
  101.         bool operator<<(RemoteHost::Transmission const&);
  102.         packetID const ID;
  103.     private:
  104.         char *buffer;
  105.         unsigned char sequenceNumber;
  106.     };
  107.     class ConnectionManager: public RemoteHost::Acceptor {
  108.     public:
  109.         class Generator: public RemoteHost::Receptionist::Generator {
  110.         public:
  111.             RemoteHost::Acceptor& operator()(int);
  112.             Generator(HostMediator::Acceptor::Generator& source);
  113.         private:
  114.             HostMediator::Acceptor::Generator& generator;
  115.         };
  116.  
  117.         static RemoteHost::Acceptor& supportHost(int socketID);
  118.         ConnectionManager(HostMediator::Acceptor&);
  119.         ConnectionManager(HostMediator&);
  120.         void operator() (RemoteHost&, event);
  121.  
  122.     private:
  123.         HostMediator* mediator;
  124.         HostMediator* allocated;
  125.         HostMediator::Acceptor& acceptor;
  126.     };
  127.    
  128.     HostMediator(RemoteHost& link,
  129.                Acceptor& localProcessor);
  130.  
  131.     RemoteHost& partner;
  132.     HostMediator::Acceptor& processor;
  133.  
  134.     unsigned int sendWindowSize, receiveWindowSize;
  135.     list<RemoteHost::Transmission*> sendingBuffers;
  136.     list<RemoteHost::Transmission*> receivingBuffers;
  137.     SlidingWindow sendingWindow, receivingWindow;
  138.     ReceiveBuffer* incoming;
  139.     list<SendBuffer*> outgoingQueue;
  140.     list<HostMediator::Transmission*> incomingQueue;
  141.     packetID sendingID, receivingID, completedID, completedReceipt;
  142.    
  143.     static unsigned long checksum(HostMediator::Transmission const&);
  144.     static unsigned long checksum(RemoteHost::Transmission const&);
  145.     bool sendFrame();
  146.     RemoteHost::Transmission& nack(RemoteHost::Transmission& refusal, bool valid = true);
  147.     RemoteHost::Transmission& ack(RemoteHost::Transmission& complete);
  148.     RemoteHost::Transmission& ack(RemoteHost::Transmission& complete, unsigned char index);
  149.  
  150.     RemoteHost::Transmission& processFrame(RemoteHost::Transmission&);
  151.     RemoteHost::Transmission& processACK(RemoteHost::Transmission&);
  152.     RemoteHost::Transmission& processNACK(RemoteHost::Transmission&);
  153.  
  154. };
  155.  
  156. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement