/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
#if !defined (TSC_H_INCLUDED)
#define TSC_H_INCLUDED

#include "pvt_params.h"

#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif

#define PV_2WAY_TSC_EXTENSIONINTERFACE_UUID PVUuid(0x50e23520,0xf8a3,0x11d9,0xbe,0xab,0x00,0x02,0xa5,0xd5,0xc5,0x1b)
enum TSCState
{
    TSC_Idle = 0,
    TSC_Connecting,
    TSC_Communicating,
    TSC_Disconnected
};

/** Observer interface for TSC extension interface **/
class TSCObserver
{
    public:
        virtual ~TSCObserver() {}
        /* Responses to commands */
        /* Indicates completion of a previously issued Connect command */
        virtual void ConnectComplete(PVMFStatus status) = 0;

        /* Unsolicited indications */
        /* An internal error has occurred.  User should disconnect and teardown */
        virtual void InternalError() = 0;
        /* Requests the user to stop av codecs.  Logical channels will be closed by TSC */
        virtual void DisconnectRequestReceived() = 0;
        /* Indicates establishment of an outgoing logical channel by the stack */
        virtual void OutgoingChannelEstablished(TPVChannelId aId,
                                                PVCodecType_t aCodec,
                                                uint8* aFormatSpecificInfo = NULL, uint32 aFormatSpecificInfoLen = 0) = 0;
        /* Indicates establishment of an incoming logical channel by the stack */
        virtual TPVStatusCode IncomingChannel(TPVChannelId aId,
                                              PVCodecType_t aCodec,
                                              uint8* aFormatSpecificInfo = NULL, uint32 aFormatSpecificInfoLen = 0) = 0;
        /* Indicates closure of a logical channel by the stack */
        virtual void ChannelClosed(TPVDirection direction,
                                   TPVChannelId id,
                                   PVCodecType_t codec,
                                   PVMFStatus status = PVMFSuccess) = 0;
        /* Requests the user to generate Intra content for the specified port/logical channel */
        virtual void RequestFrameUpdate(PVMFPortInterface *port) = 0;
};

#define MAX_STACK_ELEMENTS 10

/** Abstract extension interface for all 2-way Terminal State Controllers **/
class TSC : public PVInterface
{
    public:
        virtual ~TSC() {};
        /* Terminal wide commands */
        /* Initializes the TSC with reference to mux and controls */
        virtual TPVStatusCode InitTsc() = 0;
        virtual TSCObserver* SetTscObserver(TSCObserver* aObserver)
        {
            if (!iObserver)
            {
                iObserver = aObserver;
                return iObserver;
            }
            return NULL;
        }
        //virtual TPVStatusCode SetCapability(CapabilitySet* capabilities) = 0;
        virtual CPvtTerminalCapability* GetRemoteCapability() = 0;
        virtual TSCState GetTscState()
        {
            return iState;
        }
        virtual TPVStatusCode ResetTsc() = 0;
        virtual TPVStatusCode Connect(uint16 info_len = 0, uint8* info_buf = NULL) = 0;
        virtual TPVStatusCode SetTimerRes(uint32 timer_res) = 0;

        virtual TPVStatusCode Disconnect() = 0;
        virtual TPVStatusCode Abort() = 0;

        /* Channel specific commands */
        virtual TPVStatusCode SetTerminalParam(CPVTerminalParam* params) = 0;
        virtual CPVTerminalParam* GetTerminalParam() = 0;
        virtual TPVStatusCode SetOutgoingBitrate(int32 bitrate) = 0;
        virtual TPVStatusCode RequestFrameUpdate(PVMFPortInterface* port) = 0;
        /* Returns a pointer to the logical channels buffer.  DO NOT DELETE */
        virtual const uint8* GetFormatSpecificInfo(PVMFPortInterface* port, uint32* len) = 0;

        virtual void SetLoopbackMode(TPVLoopbackMode aLoopbackMode) = 0;
        virtual void ResetStats() = 0;
        virtual void LogStats(TPVDirection dir) = 0;
        virtual LogicalChannelInfo* GetLogicalChannelInfo(PVMFPortInterface& port) = 0;
        virtual void SetDatapathLatency(TPVDirection aDir, PVMFPortInterface* aPort, uint32 aLatency) = 0;
        virtual void SetSkewReference(PVMFPortInterface* aPort, PVMFPortInterface* aReferencePort) = 0;

    protected:
        TSC() : iState(TSC_Idle), iObserver(NULL)
        {
        }

        TSCState iState;
        TSCObserver* iObserver;
    private:
};

#endif