/* ------------------------------------------------------------------
 * 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.
 * -------------------------------------------------------------------
 */
#ifndef PVMF_DOWNLOAD_DATA_SOURCE_H_INCLUDED
#define PVMF_DOWNLOAD_DATA_SOURCE_H_INCLUDED

#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_STRING_H_INCLUDED
#include "oscl_string.h"
#endif
#ifndef PV_UUID_H_INCLUDED
#include "pv_uuid.h"
#endif
#ifndef PV_INTERFACE_H_INCLUDED
#include "pv_interface.h"
#endif

#define PVMF_DOWNLOAD_DATASOURCE_HTTP_UUID PVUuid(0xdea36265,0x6a59,0x4d8b,0xb3,0xea,0xdf,0x68,0x4d,0x7e,0x0e,0x08)

//Source data for HTTP Progressive download (format type PVMF_DATA_SOURCE_HTTP_URL)
class PVMFDownloadDataSourceHTTP : public PVInterface
{
    public:
        bool	bIsNewSession;				//true if the downloading a new file
        //false if keep downloading a partial downloading file
        OSCL_wString &iConfigFileName;		//download config file
        OSCL_wString &iDownloadFileName;	//local file name of the downloaded clip
        uint32	iMaxFileSize;				//the max size of the file.
        OSCL_String &iProxyName;			//HTTP proxy name, either ip or dns
        int32	iProxyPort;					//HTTP proxy port

        typedef enum 		// For Download only
        {
            ENoPlayback			= 0,
            EAfterDownload,
            EAsap,
            ENoSaveToFile,
            EReserve
        } TPVPlaybackControl;
        TPVPlaybackControl	iPlaybackControl;

        //Optional CPM usage flag.
        //If true, CPM will be used during playback.
        //If false, CPM will not be used during playback.
        bool iUseCPMPluginRegistryForPlayback;

        PVMFDownloadDataSourceHTTP(bool aIsNewSession
                                   , OSCL_wString &aConfigFile
                                   , OSCL_wString &aDownloadFileName
                                   , uint32 aMaxSize
                                   , OSCL_String &aProxyName
                                   , int32 aProxyPort
                                   , TPVPlaybackControl aPlaybackControl
                                   , bool aUseCPMPluginRegistryForPlayback = false)
                : bIsNewSession(aIsNewSession)
                , iConfigFileName(aConfigFile)
                , iDownloadFileName(aDownloadFileName)
                , iMaxFileSize(aMaxSize)
                , iProxyName(aProxyName)
                , iProxyPort(aProxyPort)
                , iPlaybackControl(aPlaybackControl)
                , iUseCPMPluginRegistryForPlayback(aUseCPMPluginRegistryForPlayback)
        {}

        /* From PVInterface */
        void addRef()
        {
            iRefCounter++;
        }
        void removeRef()
        {
            iRefCounter--;
        }
        bool queryInterface(const PVUuid& uuid, PVInterface*& iface)
        {
            if (uuid == PVUuid(PVMF_DOWNLOAD_DATASOURCE_HTTP_UUID))
            {
                iface = this;
                return true;
            }
            else
            {
                iface = NULL;
                return false;
            }
        }
        int32 iRefCounter;
};

#define PVMF_DOWNLOAD_DATASOURCE_PVX_UUID PVUuid(0xc3873d74,0x5759,0x42da,0xaa,0x27,0xfa,0x63,0xb1,0xa0,0xef,0x4e)

class CPVXInfo;

//Source data for Fasttrack download (format type PVMF_DATA_SOURCE_PVX_FILE)
class PVMFDownloadDataSourcePVX : public PVInterface
{
    public:
        bool	bIsNewSession;				//true if the downloading a new file
        //false if keep downloading a partial downloading file
        OSCL_wString &iConfigFileName;		//download config file
        OSCL_wString &iDownloadFileName;	//local file name of the downloaded clip
        uint32	iMaxFileSize;				//the max size of the file.
        OSCL_String &iProxyName;			//HTTP proxy name, either ip or dns
        int32	iProxyPort;					//HTTP proxy port

        CPVXInfo &iPvxInfo;					//class which contains all the info in the .pvx file except the URL

        PVMFDownloadDataSourcePVX(bool aIsNewSession, OSCL_wString &aConfigFile, OSCL_wString &aDownloadFileName, uint32 aMaxSize, OSCL_String &aProxyName, int32 aProxyPort, CPVXInfo &p)
                : bIsNewSession(aIsNewSession)
                , iConfigFileName(aConfigFile)
                , iDownloadFileName(aDownloadFileName)
                , iMaxFileSize(aMaxSize)
                , iProxyName(aProxyName)
                , iProxyPort(aProxyPort)
                , iPvxInfo(p)
        {}

        /* From PVInterface */
        void addRef()
        {
            iRefCounter++;
        }
        void removeRef()
        {
            iRefCounter--;
        }
        bool queryInterface(const PVUuid& uuid, PVInterface*& iface)
        {
            if (uuid == PVUuid(PVMF_DOWNLOAD_DATASOURCE_PVX_UUID))
            {
                iface = this;
                return true;
            }
            else
            {
                iface = NULL;
                return false;
            }
        }
        int32 iRefCounter;
};

#endif //PVMF_DATA_SOURCE_INIT_EXTENSION_H_INCLUDED

