#ifndef _VIP_PROTOCOL_HH_
#define _VIP_PROTOCOL_HH_

#include <vos/vip/vipdefs.hh>

namespace VIP
{
    class Protocol;
}

#include <vos/vip/connection.hh>

namespace VIP
{
    class Protocol
    {
    protected:
        Connection* connection;

    public:
        Protocol(Connection* c) : connection(c) { }
        virtual ~Protocol() { }

        virtual int getProtocolNum() = 0;
        virtual void makeSYN(uint8_t* buf, unsigned int* bufsize) = 0;
        virtual bool replySYN(uint8_t* received, unsigned int recvsz,
                               uint8_t* reply, unsigned int* replysz) = 0;
        virtual void setupWithSYN(uint8_t* received, unsigned int recvsz) = 0;

        virtual int queueData(Message* m) = 0;
        virtual void handleChunk(uint8_t* buf, unsigned int* bufsize) = 0;
        virtual void getNextChunk(uint8_t* buf, unsigned int* bufsize, bool ackOnly) = 0;

        virtual double desiredWaitTime() = 0;

        virtual bool hasQueuedData() = 0;
        virtual unsigned int queuedBytes(int channel) = 0;
    };
}

#endif
