//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: testmessenger.h
//
//Version: $Revision: 1.1 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/06/05 08:18:06 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Harri Sunila
//
//Description:
//      Simple classes to test difference in performance between messengers
//      with or without pfStorage.
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#ifndef __GSMP_TESTMESSENGER_H_
#define __GSMP_TESTMESSENGER_H_

#include "pf/messenge.h"
#include "pf/exception.h"
#include "pf/bytes.h"

//
// Class: testMessenger
//
// Description:
//        testMessenger is the base class for both testStorageMessenger and
//        testReferenceMessenger
//

class testMessenger : public pfMessenger
{
    public:
        static const pfByte TEST_STORAGEMESSENGER = 1;
        static const pfByte TEST_REFERENCEMESSENGER = 2;
        
        static testMessenger *create(pfFrame &frame_)
            throw (pfMemoryAllocationException, pfInvalidTypeException);
        
        testMessenger(const testMessenger &other_);
        virtual ~testMessenger(void);

        virtual void decode(pfFrame &frame_) = 0;
        virtual void encode(void) = 0;

        virtual pfFrame &returnFrame(void); 

    protected:
        testMessenger(void);

        pfFrame _frame;
};

//
// Class: testStorageMessenger
//
// Description:
//        This is a simple messenger class which utilizes pfStorage.
//        testStorageMessenger is similar to gsmpAddBranchMessage.

class testStorageMessenger : public testMessenger
{
    public:
        testStorageMessenger(void);
        testStorageMessenger(pfByte result_,
                             pfByte code_,
                             pfUlong transactionIdentifier_,
                             pfUlong portSessionNumber_,
                             pfUlong inputPort_,
                             pfUlong inputVPI_,
                             pfUlong inputVCI_,
                             pfUlong outputPort_,
                             pfUlong outputVPI_,
                             pfUlong outputVCI_,
                             pfUlong numberOfBranches_,
                             pfByte priority_);
        testStorageMessenger(const testStorageMessenger &other_);
        virtual ~testStorageMessenger(void);

        virtual void decode(pfFrame &frame_) throw (pfMethodFailed);
        virtual void encode(void);
};

//
// Class: testReferenceMessenger
//
// Description:
//        testReferenceMessenger does not utilize pfStorage.
//        testReferenceMessenger is similar to gsmpAddBranchMessage
//

class testReferenceMessenger : public testMessenger 
{
    public:
        testReferenceMessenger(void);
        testReferenceMessenger(pfByte result_,
                               pfByte code_,
                               pfUlong transactionIdentifier_,
                               pfUlong portSessionNumber_,
                               pfUlong inputPort_,
                               pfUlong inputVPI_,
                               pfUlong inputVCI_,
                               pfUlong outputPort_,
                               pfUlong outputVPI_,
                               pfUlong outputVCI_,
                               pfUlong numberOfBranches_,
                               pfByte priority_);
        testReferenceMessenger(const testReferenceMessenger &other_);
        ~testReferenceMessenger(void);

        virtual void decode(pfFrame &frame_) throw (pfMethodFailed);
        virtual void encode(void);

        pfFrame &returnFrame(void);
        
    private:
        pfFrame _frame;
        pfByte _version;
        pfByte _type;
        pfByte _result;
        pfByte _code;
        pfUlong _transactionIdentifier;
        pfUlong _portSessionNumber;
        pfUlong _inputPort;
        pfUlong _inputVPI;
        pfUlong _inputVCI;
        pfUlong _outputPort;
        pfUlong _outputVPI;
        pfUlong _outputVCI;
        pfUlong _numberOfBranches;
        pfByte _priority;
};

#endif // __GSMP_TESTMESSENGER_H_
