/* ------------------------------------------------------------------
 * Copyright (C) 2008 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 pvmfprotocolenginenode_extension.h
 * @brief Extension interface for PVMFProtocolEngineNode
 */

#ifndef PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED
#define PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED

#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef PV_INTERFACE_H
#include "pv_interface.h"
#endif
#ifndef PV_UUID_H_INCLUDED
#include "pv_uuid.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
#ifndef OSCL_REFCOUNTER_MEMFRAG_H_INCLUDED
#include "oscl_refcounter_memfrag.h"
#endif
#ifndef OSCL_STRING_CONSTAINERS_H_INCLUDED
#include "oscl_string_containers.h"
#endif

// default number of redirect trials
#define PVPROTOCOLENGINE_DEFAULT_NUMBER_OF_REDIRECT_TRIALS 10
#define PVPROTOCOLENGINE_DEFAULT_MAXIMUM_ASF_HEADER_SIZE 262144 // 256K



#define PVMF_PROTOCOL_ENGINE_GENERIC_EXTENSION_MIMETYPE "pvxxx/PVMFProtocolEngineNode/GenericExtensionInterface"
#define KPVMFProtocolEngineNodeExtensionUuid PVUuid(0xca27cb64,0x83ed,0x40d6,0x96,0xa3,0xed,0x1d,0x8b,0x60,0x11,0x38)

enum HttpVersion
{
    HTTP_V10 = 0, // Http version 1.0
    HTTP_V11	// Http version 1.1
};

enum HttpMethod
{
    HTTP_GET = 0,
    HTTP_POST,
    HTTP_HEAD,
    HTTP_ALLMETHOD
};

enum DownloadProgressMode
{
    DownloadProgressMode_TimeBased = 0,
    DownloadProgressMode_ByteBased
};

/**
 * PVMFProtocolEngineNodeExtensionInterface allows a client to do exercise extended functions
 * of a PVMFProtocolEngineNode
 */
class PVMFProtocolEngineNodeExtensionInterface : public PVInterface
{
    public:

        /**
         * Retrieves the HTTP header. The memory persists until node gets destroyed or reset
         *
         * @param aHeader pointer to header data.
         * @param aHeaderLen length of header data.
         * @return true if config info is provided, else false.
         */
        virtual PVMFStatus GetHTTPHeader(uint8*& aHeader, uint32& aHeaderLen) = 0;

        /**
         * Retrieves the file size. The file size is retrived from http header
         * But server might not announce the file size info. In this case, file size
         * is not available, and set to zero.
         * @param aFileSize returned download file size.
         */
        virtual void GetFileSize(uint32& aFileSize) = 0;

        /**
         * Retrieves the host name and port number for socket node port request
         * set up by download manager node
         *
         * @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvs.pv.com;remote_port=554"
         * @return true if config info is provided, else false.
         * Note that this extension interface must be called AFTER data source
         * initialization interface (url is provided) gets called, otherwise it would fail
         */
        virtual bool GetSocketConfig(OSCL_String &aPortConfig) = 0;

        /**
         * Set the user agent field for a http request. Basically there are two modes, by default,
         * the new user agent field will be attached to the default user agent field (PVPlayer 4.0(Beta Release)).
         * Another one is the new user agent will replace our default one
         *
         * @param aUserAgent wide-character string of user agent
         * @param aOverwritable, flag to show whether the input user agent will replace or append the default one
         *		  aOverwritable=true => replace
         * @return true if user agent is set successfully, else false.
         */
        virtual bool SetUserAgent(OSCL_wString &aUserAgent, const bool isOverwritable = true) = 0;

        /**
         * Set the http version number (HTTP/1.0 or HTTP/1.1) for a http request.
         * @param aHttpVersion, a http version. The version is defined as an enum (see above)
         */
        virtual void SetHttpVersion(const uint32 aHttpVersion = HTTP_V11) = 0;

        /**
         * Set the NetworkTimeout for a http request/response. The unit of NetworkTimeout value is SECOND
         * @param aTimeout, timeout value in SECONDS
         */
        virtual void SetNetworkTimeout(const uint32 aTimeout) = 0;

        /**
         * Set the number of trials for redirect to avoid rediret looping. If the actual number redirect trials exceeds
         * the specified number, then there will be an error out.
         * @param aNumTrials, specified number of redirect trials
         */
        virtual void SetNumRedirectTrials(const uint32 aNumTrials) = 0;

        /**
         * Set the http extension header field. Three inputs, field key & field value plus method (field belongs to which HTTP method),
         * are needed for composing like "key: value"
         * @param aFieldKey, extension field key
         * @param aFieldValue, extension field value
         * @param aMethod, HTTP method, GET, POST or both
         * @param aPurgeOnRedirect - boolean indicating whether this header is carried over across redirects
         */
        virtual void SetHttpExtensionHeaderField(OSCL_String &aFieldKey,
                OSCL_String &aFieldValue,
                const HttpMethod aMethod = HTTP_GET,
                const bool aPurgeOnRedirect = false) = 0;

        /**
         * Set the download progress mode, i.e. the download percentage is time-based or byte-based
         * @param aMode, specified download progress mode
         */
        virtual void SetDownloadProgressMode(const DownloadProgressMode aMode = DownloadProgressMode_TimeBased) = 0;

        /**
         * Disable HTTP HEAD request
         * @param aDisableHeadRequest, flag to disabling sending HTTP HEAD request
         */
        virtual void DisableHttpHeadRequest(const bool aDisableHeadRequest = true) = 0;

};

#define PVMF_PROTOCOL_ENGINE_MSHTTP_STREAMING_EXTENSION_MIMETYPE "pvxxx/PVMFProtocolEngineNod/MSHTTPStreamingExtensionInterface"
#define KPVMFProtocolEngineNodeMSHTTPStreamingExtensionUuid PVUuid(0xe3fb7c31,0x9fb4,0x4263,0x8f,0x1f,0xa0,0xbc,0x77,0x86,0x10,0xea)

class PVMFProtocolEngineNodeMSHTTPStreamingParams
{
    public:
        PVMFProtocolEngineNodeMSHTTPStreamingParams()
        {
            reset();
        };

        ~PVMFProtocolEngineNodeMSHTTPStreamingParams()
        {
            reset();
        };

        // reset to default values
        void reset()
        {
            iStreamRate = 1;
            iStreamByteOffset = 0xFFFFFFFF;
            iStreamStartPacketNumber = 0xFFFFFFFF;
            iStreamStartTimeInMS = 0;
            iMaxStreamDurationInMS = 0x800188A3;
            iPacketGrouping = 0;
            iNumStreams = 1;
            iPlayBackMode = 1;
            iStreamIDList.clear();
            iStreamPlayBackModeList.clear();
        }

        // copy constructor
        PVMFProtocolEngineNodeMSHTTPStreamingParams(const PVMFProtocolEngineNodeMSHTTPStreamingParams &x)
        {
            iStreamRate					= x.iStreamRate;
            iStreamByteOffset			= x.iStreamByteOffset;
            iStreamStartTimeInMS		= x.iStreamStartTimeInMS;
            iMaxStreamDurationInMS		= x.iMaxStreamDurationInMS;
            iStreamStartPacketNumber	= x.iStreamStartPacketNumber;
            iPacketGrouping				= x.iPacketGrouping;
            iNumStreams					= x.iNumStreams;
            iPlayBackMode               = x.iPlayBackMode;
            iStreamIDList               = x.iStreamIDList;
            iStreamPlayBackModeList     = x.iStreamPlayBackModeList;
        }

        // assignment operator
        PVMFProtocolEngineNodeMSHTTPStreamingParams& operator=(const PVMFProtocolEngineNodeMSHTTPStreamingParams& x)
        {
            iStreamRate					= x.iStreamRate;
            iStreamByteOffset			= x.iStreamByteOffset;
            iStreamStartTimeInMS		= x.iStreamStartTimeInMS;
            iMaxStreamDurationInMS		= x.iMaxStreamDurationInMS;
            iStreamStartPacketNumber	= x.iStreamStartPacketNumber;
            iPacketGrouping				= x.iPacketGrouping;
            iNumStreams					= x.iNumStreams;
            iPlayBackMode               = x.iPlayBackMode;
            iStreamIDList               = x.iStreamIDList;
            iStreamPlayBackModeList     = x.iStreamPlayBackModeList;
            return *this;
        }

        uint32 iPlayBackMode;
        uint32 iStreamRate;
        uint32 iStreamByteOffset;
        uint32 iStreamStartTimeInMS;
        uint32 iMaxStreamDurationInMS;
        uint32 iStreamStartPacketNumber;
        uint32 iPacketGrouping;
        uint32 iNumStreams;
        Oscl_Vector<uint32, OsclMemAllocator> iStreamIDList;
        Oscl_Vector<uint32, OsclMemAllocator> iStreamPlayBackModeList;
};

/**
 * PVMFProtocolEngineNodeMSHTTPStreamingExtensionInterface allows a client to exercise
 * MS HTTP Streaming extended functions of a PVMFProtocolEngineNode
 */
class PVMFProtocolEngineNodeMSHTTPStreamingExtensionInterface : public PVInterface
{
    public:

        /**
         * Retrieves the ASF header. The ASF header can be retrived in fragments
         *
         * @param aHeader a vector of fragments
         * @param aHeaderLen length of header data.
         * @return true if the asf header is provided, else false.
         */
        virtual bool GetASFHeader(Oscl_Vector<OsclRefCounterMemFrag, OsclMemAllocator> &aHeader) = 0;

        /**
         * Sets ASF streaming params, viz rate, start time, start packet num etc
         * Used by HTTP PE Node to compose GET request
         *
         * @param aParams class containing all the params
         * @return true if params are accepted by PE Node, else false.
         */
        virtual bool SetStreamParams(const PVMFProtocolEngineNodeMSHTTPStreamingParams &aParams) = 0;

        /**
         * Retrieves the host name and port number for socket node port request
         * set up by streaming manager node
         *
         * @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvs.pv.com;remote_port=554"
         * @return true if config info is provided, else false.
         * Note that this extension interface must be called AFTER data source
         * initialization interface (url is provided) gets called, otherwise it would fail
         */
        virtual bool GetSocketConfig(OSCL_String &aPortConfig) = 0;

        /**
         * Retrieves the host name and port number for socket node port request, based on logging URL
         * set up by streaming manager node
         *
         * @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvs.pv.com;remote_port=554"
         * @return true if config info is provided, else false.
         * Note that this extension interface must be called AFTER data source
         * initialization interface (url is provided) gets called, otherwise it would fail
         */
        virtual bool GetSocketConfigForLogging(OSCL_String &aPortConfig) = 0;

        /**
         * Sends a Seek request to the server (HTTP GET) and returns seq number of
         * first data packet after seek. The API is asynchronous
         *
         * @param aNPTInMS Seek NPT in milliseconds .
         * @param aFirstSeqNumAfterSeek
         * @param aContext - Opaque data provided by caller, to be returned as part of
         * command completion.
         * @return PVMFCommandId
         */
        virtual PVMFCommandId Seek(PVMFSessionId aSessionId,
                                   uint64 aNPTInMS,
                                   uint32& aFirstSeqNumAfterSeek,
                                   OsclAny* aContext) = 0;

        /**
         * Sends a BitstreamSwitch request to the PE node and PE node will send a seek request
         * (HTTP GET) and returns seq number of first data packet after seek. The API is asynchronous
         *
         * @param aNPTInMS Seek NPT in milliseconds .
         * @param aFirstSeqNumAfterSwitch
         * @param aContext - Opaque data provided by caller, to be returned as part of
         * command completion.
         * @return PVMFCommandId
         */
        virtual PVMFCommandId BitstreamSwitch(PVMFSessionId aSessionId,
                                              uint64 aNPTInMS,
                                              uint32& aFirstSeqNumAfterSwitch,
                                              OsclAny* aContext) = 0;
        /**
         * Sets the size of the mem pool interms of number of memory buffers
         * for the media msg allocator associated with the port.
         *
         * @param aPort Port pointer .
         * @param aNumBuffersInAllocator - Number of buffers in allocator
         * @return PVMFStatus - PVMFSuccess or PVMFFailure
         */
        virtual PVMFStatus SetMediaMsgAllocatorNumBuffers(PVMFPortInterface* aPort,
                uint32 aNumBuffersInAllocator) = 0;

        /**
         * Set the user agent field for a http request. Basically there are two modes, by default,
         * the new user agent field will be attached to the default user agent field (PVPlayer 4.0(Beta Release)).
         * Another one is the new user agent will replace our default one
         *
         * @param aUserAgent wide-character string of user agent
         * @param aOverwritable, flag to show whether the input user agent will replace or append the default one
         *		  aOverwritable=true => replace
         * @return true if user agent is set successfully, else false.
         */
        virtual bool SetUserAgent(OSCL_wString &aUserAgent, const bool isOverwritable = true) = 0;

        /**
         * Set the NetworkTimeout for a http request/response. The unit of NetworkTimeout value is SECOND
         * @param aTimeout, timeout value in SECONDS
         */
        virtual void SetNetworkTimeout(const uint32 aTimeout) = 0;

        /**
         * Set the NetworkLoggingTimeout for MS streaming Logging POST request/response at stop or EOS. The unit of NetworkLoggingTimeout value is SECOND
         * @param aTimeout, timeout value in SECONDS
         */
        virtual void SetNetworkLoggingTimeout(const uint32 aTimeout) = 0;

        /**
         * Set the timeout value for Keep-Alive message. The unit of KeepAliveTimeout value is SECOND
         * @param aTimeout, timeout value in SECONDS
         */
        virtual void SetKeepAliveTimeout(const uint32 aTimeout) = 0;

        /**
         * Set the number of trials for redirect to avoid rediret looping. If the actual number redirect trials exceeds
         * the specified number, then there will be an error out.
         * @param aNumTrials, specified number of redirect trials
         */
        virtual void SetNumRedirectTrials(const uint32 aNumTrials) = 0;

        /**
         * Set the http extension header field. Three inputs, field key & field value plus method (field belongs to which HTTP method),
         * are needed for composing like "key: value"
         * @param aFieldKey, extension field key
         * @param aFieldValue, extension field value
         * @param aMethod, HTTP method, GET, POST or both
         * @param aPurgeOnRedirect - boolean indicating whether this header is carried over across redirects
         */
        virtual void SetHttpExtensionHeaderField(OSCL_String &aFieldKey,
                OSCL_String &aFieldValue,
                const HttpMethod aMethod = HTTP_GET,
                const bool aPurgeOnRedirect = false) = 0;

        /**
         * Set the logging URL
         * @param aSourceURL, a different URL for logging statistics
         */
        virtual void SetLoggingURL(OSCL_wString& aSourceURL) = 0;

        /**
         * Set the proxy URL and the port
         * @param aProxyURL, a proxy URL for streaming
         * @param aProxyPort, proxy number
         * @return true if proxy is set successfully, else false.
         */
        virtual bool SetStreamingProxy(OSCL_wString& aProxyURL, const uint32 aProxyPort) = 0;

        /**
         * Set the maximum ASF header size
         * @param aMaxASFHeaderSize, upper limit for ASF header supported
         */
        virtual void SetMaxASFHeaderSize(const uint32 aMaxASFHeaderSize = PVPROTOCOLENGINE_DEFAULT_MAXIMUM_ASF_HEADER_SIZE) = 0;

        /**
         * Set user authentication information, such as userID and password
         * @param aUserID, user id
         * @param aPasswd, password
         * @param aMaxASFHeaderSize, upper limit for ASF header supported
         */
        virtual void SetUserAuthInfo(OSCL_String &aUserID, OSCL_String &aPasswd) = 0;

        /**
         * Check the WM server 4.1 or not
         * @return true if the streaming server is wms4.1 else false.
         */
        virtual bool IsWMServerVersion4() = 0;

        /**
         * Set the accel bitrate for fast cache.
         * @param aAccelBitrate, specified accel bitrate
         */
        virtual void SetAccelBitrate(const uint32 aAccelBitrate) = 0;

        /**
         * Set the accel duration for fast cache.
         * @param aAccelDuration, specified accel duration
         */
        virtual void SetAccelDuration(const uint32 aAccelDuration) = 0;

};

#endif // PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED


