/* ------------------------------------------------------------------
 * 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.
 * -------------------------------------------------------------------
 */
/**
 * @file pvmf_port_base_impl.h
 */
#ifndef PVMF_PORT_BASE_IMPL_H_INCLUDED
#define PVMF_PORT_BASE_IMPL_H_INCLUDED

#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_QUEUE_H_INCLUDED
#include "oscl_queue.h"
#endif
#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif
#ifndef PVMF_PORT_INTERFACE_H_INCLUDED
#include "pvmf_port_interface.h"
#endif
#ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
#include "oscl_string_containers.h"
#endif
#ifndef PVMF_MEDIA_DATA_H_INCLUDED
#include "pvmf_media_data.h"
#endif

/**
 * When this macro is defined to 1, statistics of this port will be tracked and can be
 * retrieved for debugging and performance analysis.
 */
#define PVMF_PORT_BASE_IMPL_STATS (PVLOGGER_INST_LEVEL >= PVLOGMSG_INST_MLDBG)

/** Structure containing statistics of a port */
struct PvmfPortBaseImplStats
{
    uint32 iOutgoingMsgQueued;      /**< Number of outgoing messages queued */
    uint32 iOutgoingMsgSent;        /**< Number of outgoing messages sent */
    uint32 iOutgoingMsgDiscarded;   /**< Number of outgoing messages discarded */
    uint32 iOutgoingQueueBusy;      /**< Number of times outgoing message queue became busy */
    uint32 iConnectedPortBusy;      /**< Number of times connected port became busy */
    uint32 iIncomingMsgRecv;        /**< Number of incoming messages received */
    uint32 iIncomingMsgConsumed;    /**< Number of incoming messages dequeued by the node */
    uint32 iIncomingQueueBusy;      /**< Number of times incoming message queue became busy */
};

/** Queue structure */
class PvmfPortBaseImplQueue
{
    public:
        void Construct(uint32 aCap, uint32 aReserve, uint32 aThresh);
        PVMFStatus SetCapacity(uint32);
        PVMFStatus SetReserve(uint32);
        PVMFStatus SetThreshold(uint32);

        Oscl_Queue<PVMFSharedMediaMsgPtr, OsclMemAllocator> iQ;

        // Flow control
        uint32 iCapacity;
        uint32 iThresholdPercent; /**< Threshold for allowing new messages, in terms of percentage of capacity. */
        uint32 iThreshold; /**< Threshold size for allowing new messages */
        bool iBusy;
};
/** Queue type */
enum TPvmfPortBaseImplQueueType
{
    EPVIncomingDataQueue
    , EPVOutgoingDataQueue
};

/** Default data queue capacity */
const uint32 DEFAULT_DATA_QUEUE_CAPACITY = 10;

/**
 * Threshold in terms of percentage of the total queue size at which a data queue
 * will be ready to resume receiving data. After the reaching the maximum queue size
 * the port would wait until enough queued messages are processed such that the queue
 * size drops below this threshold before notifying the sender port / node to resume
 * sending data.
 */
const uint32 DEFAULT_READY_TO_RECEIVE_THRESHOLD_PERCENT = 60;

/**
 * Base implementation of PVMFPortInterface. This implementation provides an incoming
 * and an outgoing queue for media messages, and depends on the PVMF Node that owns
 * this port on processing these messages asynchronously.  The node will be notified
 * of the events occurred to this port, and the node implementation will need to
 * handle these message as necessary in order for this base port implementation to
 * function.  This implementation does not perform capability exchange when two ports
 * are establishing a connection.  The final implementation of a port should derive
 * from this class and the PvmiConfigAndCapability interface for full functionality
 * with capability and data exchange.
 */
class PvmfPortBaseImpl : public PVMFPortInterface
{
    public:
        /**
         * Default constructor. Data queue size and ready to receive threshold will be set to
         * default values.
         *
         * @param aTag Port tag associated to this port
         * @param aNode The node that owns this port. Port events will be reported to this node.
         * @param name Optional port name.  If a name is provided, then datapath logging will
         *    be activated on the port.
         */
        OSCL_IMPORT_REF PvmfPortBaseImpl(int32 aPortTag, PVMFPortActivityHandler* aNode, const char*name = NULL);

        /**
         * Constructor specifying the data queue size and ready to receive threshold.
         *
         * @param aTag Port tag associated to this port
         * @param aNode The node that owns this port. Port events will be reported to this node.
         * @param aSize Data queue capacity. The data queue size will not grow beyond this capacity.
         * @param aReserve Size of data queue for which memory is reserved. This must be
         * less than or equal to the capacity. If this is less than capacity, memory will be
         * allocated when the queue grows beyond the reserve size, but will stop growing at
         * capacity.
         * @param aThreshold Ready-to-receive threshold, in terms of percentage of the data queue capacity.
         * This value should be between 0 - 100.
         * @param name Optional port name.  If a name is provided, then datapath logging will
         *    be activated on the port.
         */
        OSCL_IMPORT_REF PvmfPortBaseImpl(int32 aTag
                                         , PVMFPortActivityHandler* aNode
                                         , uint32 aInputCapacity
                                         , uint32 aInputReserve
                                         , uint32 aInputThreshold
                                         , uint32 aOutputCapacity
                                         , uint32 aOutputReserve
                                         , uint32 aOutputThreshold
                                         , const char*name = NULL);

        /** Destructor */
        OSCL_IMPORT_REF virtual ~PvmfPortBaseImpl();
        OSCL_IMPORT_REF virtual int32 GetPortTag() const;/*{ return iTag; }*/
        OSCL_IMPORT_REF virtual PVMFStatus Connect(PVMFPortInterface* aPort);
        OSCL_IMPORT_REF virtual PVMFStatus Disconnect();
        OSCL_IMPORT_REF virtual PVMFStatus PeerConnect(PVMFPortInterface* aPort);
        OSCL_IMPORT_REF virtual PVMFStatus PeerDisconnect() ;
        OSCL_IMPORT_REF virtual PVMFStatus QueueOutgoingMsg(PVMFSharedMediaMsgPtr aMsg);
        OSCL_IMPORT_REF virtual PVMFStatus Send();
        OSCL_IMPORT_REF virtual PVMFStatus Receive(PVMFSharedMediaMsgPtr aMsg);
        OSCL_IMPORT_REF virtual PVMFStatus DequeueIncomingMsg(PVMFSharedMediaMsgPtr& aMsg);
        OSCL_IMPORT_REF virtual PVMFStatus ReadyToReceive();
        OSCL_IMPORT_REF virtual PVMFStatus ClearMsgQueues();
        OSCL_IMPORT_REF virtual uint32 IncomingMsgQueueSize();
        OSCL_IMPORT_REF virtual uint32 OutgoingMsgQueueSize();
        OSCL_IMPORT_REF virtual bool IsOutgoingQueueBusy();
        OSCL_IMPORT_REF virtual bool IsConnectedPortBusy();
        OSCL_IMPORT_REF virtual void SuspendInput();
        OSCL_IMPORT_REF virtual void ResumeInput();

        /**
         * Return capacity of data queues
         * @return Capacity of data queues
         */
        OSCL_IMPORT_REF uint32 GetCapacity(TPvmfPortBaseImplQueueType);

        /**
         * Returns ready-to-receive threshold
         * @return Ready-to-receive threshold, in terms of percentage of the data queue capacity.
         */
        OSCL_IMPORT_REF uint32 GetThreshold(TPvmfPortBaseImplQueueType);

        /**
         * Update capacity of the data queues.
         *
         * @param aCapacity New capacity of the data queues.
         * @return Completion status.
         */
        OSCL_IMPORT_REF PVMFStatus SetCapacity(TPvmfPortBaseImplQueueType, uint32 aCapacity);
        /**
         * Update reserve of the data queues.
         *
         * @param aCapacity New capacity of the data queues.
         * @return Completion status.
         */
        OSCL_IMPORT_REF PVMFStatus SetReserve(TPvmfPortBaseImplQueueType, uint32 aCapacity);

        /**
         * Update ready-to-receive threshold, in terms of percentage of the data queue capacity.
         *
         * @param aThreshold Ready to receive threshold. This value should be between 0 and 100.
         * @return Completion status
         */
        OSCL_IMPORT_REF PVMFStatus SetThreshold(TPvmfPortBaseImplQueueType, uint32 aThreshold);

        /**
         * Return statistics of this port.
         * @param aStats Output parameter where port statistics will be repoted to.
         * @return Completion status.
         */
        OSCL_IMPORT_REF PVMFStatus GetStats(PvmfPortBaseImplStats& aStats);

        /**
         * Reports port activity to the activity handler (usually
         * the node).
         */
        OSCL_IMPORT_REF void PortActivity(PVMFPortActivityType aActivity);

        /**
         * Derived classes must override this if they
         * implement the capability and config interface
         */
        virtual void QueryInterface(const PVUuid&, OsclAny*&aPtr)
        {
            aPtr = NULL;
        }

        OSCL_IMPORT_REF void Construct();
        OSCL_IMPORT_REF virtual void EvaluateIncomingBusy();
        OSCL_IMPORT_REF virtual void EvaluateOutgoingBusy();
        OSCL_IMPORT_REF virtual bool isIncomingFull();
        OSCL_IMPORT_REF virtual bool isOutgoingFull();

        // Queues
        PvmfPortBaseImplQueue iIncomingQueue;
        PvmfPortBaseImplQueue iOutgoingQueue;

        // Flow control
        bool iConnectedPortBusy;
        bool iInputSuspended;

    protected:
        // Port tag
        int32 iTag;

        // Logging and statistics
        PVLogger* iLogger;
        PvmfPortBaseImplStats iStats;

        //For datapath logging.  If a port name is provided, either in
        //the constructor or by calling SetName, then datapath logging will
        //be activated on the port.
        OSCL_IMPORT_REF void SetName(const char*name);
        OSCL_StackString<20> iPortName;
        PVLogger* iDatapathLogger;
        char* PortName()
        {
            return iPortName.get_str();
        }
        void LogMediaMsgInfo(PVMFSharedMediaMsgPtr aMediaMsg, const char*, PvmfPortBaseImplQueue&);
    public:
        //a couple of functions for use by the nodes to log info about other internal
        //data queues using the port datapath logger.
        OSCL_IMPORT_REF void LogMediaMsgInfo(PVMFSharedMediaMsgPtr aMediaMsg, const char*, int32);
        OSCL_IMPORT_REF void LogMediaDataInfo(PVMFSharedMediaDataPtr aMediaData, const char*, int32);
};

#endif // PVMF_PORT_BASE_IMPL_H_INCLUDED
