//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project/CC
//
//File: ccprotocol.h
//
//Version: $Revision: 1.71 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/03 11:31:53 $
//
//Organisation:
//      University of Technology
// 
//Author:
//      Pasi Nummisalo
//
//Description:
//      The protocol is the main class of CC implementation. A call 
//      instance factory is used to create  new instance of the protocol 
//      for every call. The protocol is initialized with a state structure, 
//      which makes it an originating side or a terminating side protocol. 
//      Initialization is made based on direction of first incoming message 
//      (from lower layer or from originating side). The protocol class serves 
//      also as data manager and data storage.    
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//      
//Licence:
//     
//
//History:
//

#ifndef __CC_PROTOCOL_H__
#define __CC_PROTOCOL_H__

#include <OB/CORBA.h>
#include <OB/Util.h>
#include <OB/CosNaming.h>
#include "toveinap.h"

#include <typeinfo>
#include <string>

#include "sf/orbscheduler.h"
#include "pf/transp.h"
#include "pf/protocol.h"
#include "dp.h"

#include "iface/binapif/binappdus.h"
#include "ie/connectioninfo.h"

class ccINadapter;

class ccProtocol : public pfProtocol
{
    public:
        static ccProtocol *create(ccProtocol *controllingProtocol_ = 0);
        ccProtocol(const ccProtocol &other_); 
        virtual ~ccProtocol(void);

        virtual pfProtocol *cloneImplementation(void) const;

        virtual void error(pfUlong cause_);

        virtual void initOriginatingSide(void);
        virtual void initTerminatingSide(void);
        virtual void close(void);
        
        virtual void toOtherSide(pfMessenger *messenger_);
        virtual void toDown(pfMessenger *messenger_);
        virtual void toSelf(pfMessenger *messenger_);
        virtual void toCrossConnector(pfCrossConnecter *transporter_);

        virtual bool isSideO(void) const;
        
        virtual pfStorage getData(string name_);
        virtual void setData(string name_, pfStorage &storage_);
        virtual void saveData(string name_, pfMessenger *messenger_);
        virtual void copyData(pfMessenger *messenger_, string name_); 

        virtual void setArmedEDPcount(unsigned int count_);
        virtual void decreaseArmedEDPcount(void);
        virtual void setControlRelationship(void);
        virtual bool isRelationship(void) const;
        virtual bool isControlRelationship(void) const;
        
        virtual void setINon(void);

        virtual ccDp &getDpValueObject(int dp_);
        virtual ccDp &getDp(toveinap_EventTypeBCSMType dp_);

        virtual pfConduit getSideB(void);

        virtual string getCalledPartyNumber(void);
        virtual string getCallingPartyNumber(void) const;
        
        virtual bool isPointToMultiPointCall(void) const;
        virtual ccProtocol *getPointToMultiPointRoot(void) const;

        virtual void saveSelectRoute(binapSELECT_ROUTEpdu &pdu_);
         
        virtual void sendInitialDP(ccDp &dp_,
                                   toveinap_InitialDPArgType &initialDPArg_);
        virtual void sendEventReportBCSM(ccDp &dp_,
                                         toveinap_EventReportBCSMArgType
                                         &eventReportBCSMArg_);
        virtual void openDialog(string &addr_, string &ctx_);
        virtual bool isDialogOpen(void) const;
        virtual void endDialog(void);
        virtual void resetDialog(void);
        virtual void releaseCall(void);
        
        // Fabric related
        virtual void connect(void);
        virtual void disconnect(void);
        virtual ieConnectionInfo *getInConnection(void);
        virtual ieConnectionInfo *getOutConnection(void);
        virtual void setConnections(ieConnectionInfo *inConnection_, 
                                    ieConnectionInfo *outConnection_);
        
        virtual bool isDataConnectionActive(void) const;
        
        // Storage for primitive data
        pfStorage _data;
        
    protected:
        ccProtocol(void);
        virtual void acceptSynchronous(pfTransporter *transporter_);
        
        // Fabric ralated
        virtual void multiPointConnect(void);
        virtual void addConnection(ccProtocol *rootProtocol_);

    public: // temporary hack
        bool _dataConnectionActive;

    private:
        // Number of EDPs
        unsigned int _EDPcount;
        
        // Controlling instance ptr. Used in
        // point to multi point connection
        ccProtocol *_controllingProtocol;
 
        // true if dialog is open
        bool _controlRelationship;
        // My side
        ccSide _iam;
        // If IN functionality is in use _in = 1 else _in = 0
        bool _in;

        typedef less< toveinap_EventTypeBCSMType > ccLessType;
        typedef map< toveinap_EventTypeBCSMType, ccDp, ccLessType > ccMapType;
        typedef ccMapType::iterator ccMapIterType;
        typedef ccMapType::const_iterator ccMapConstIterType;

        // Default detection point
        ccDp _defaultDp;
        // Map for detection points
        ccMapType _dpData;
        // Iterator for dp data
        ccMapIterType _dpIter;

        // inapAdapter receives responses from SCP
        ccINadapter *_inapAdapter;
        // Reference to SCP
        toveinap_SSF_SCF_responder_var  _inapTarget;
        // Address of SCP (GT)
        string _inapTargetAddress;
        // Application context (below GT in naming tree)
        string _inapTargetApplicationContext;
        // assocationId = dialogId
        string _assocationId;
        // Number of sent invokes to SCP
        CORBA_ULong _invokeCount;
        // Dialog state
        bool _dialogOpen;
        // SelectRoute message (inap) from scp
        binapSELECT_ROUTEpdu _selectRoute;
        // In connection
        ieConnectionInfo *_inConnection;
        // Out connection
        ieConnectionInfo *_outConnection;
};

#endif // __CC__PROTOCOL_H__
