//==========================================================================;
// MSVidFilePlayback.h : Declaration of the CMSVidFilePlayback class
// copyright (c) Microsoft Corp. 1998-1999.
//==========================================================================;

#ifndef __MSVidFILEPLAYBACK_H_
#define __MSVidFILEPLAYBACK_H_

#pragma once

#include <algorithm>
#include <objectwithsiteimplsec.h>
#include "pbsegimpl.h"
#include "fileplaybackimpl.h"
#include "fileplaybackcp.h"
#include "seg.h"
#include "resource.h"       // main symbols

/////////////////////////////////////////////////////////////////////////////
// CMSVidFilePlayback
class ATL_NO_VTABLE __declspec(uuid("37B0353C-A4C8-11d2-B634-00C04F79498E")) CMSVidFilePlayback : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CMSVidFilePlayback, &__uuidof(CMSVidFilePlayback)>,
    public IObjectWithSiteImplSec<CMSVidFilePlayback>,
	public ISupportErrorInfo,
	public IConnectionPointContainerImpl<CMSVidFilePlayback>,
    public CProxy_FilePlaybackEvent<CMSVidFilePlayback>,
	public IMSVidPBGraphSegmentImpl<CMSVidFilePlayback, MSVidSEG_SOURCE, &GUID_NULL>,
    public IMSVidFilePlaybackImpl<CMSVidFilePlayback, &LIBID_MSVidCtlLib, &GUID_NULL, IMSVidFilePlayback>,
    public IProvideClassInfo2Impl<&CLSID_MSVidFilePlaybackDevice, &IID_IMSVidFilePlaybackEvent, &LIBID_MSVidCtlLib>
{
public:
    CMSVidFilePlayback()
    {
        m_fEnableResetOnStop = true;
    }

REGISTER_AUTOMATION_OBJECT(IDS_PROJNAME, 
						   IDS_REG_FILEPLAYBACK_PROGID, 
						   IDS_REG_FILEPLAYBACK_DESC,
						   LIBID_MSVidCtlLib,
						   __uuidof(CMSVidFilePlayback));

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CMSVidFilePlayback)
	COM_INTERFACE_ENTRY(IMSVidFilePlayback)
	COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IObjectWithSite)
	COM_INTERFACE_ENTRY(IMSVidGraphSegment)
	COM_INTERFACE_ENTRY(ISupportErrorInfo)
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
	COM_INTERFACE_ENTRY(IMSVidPlayback)
	COM_INTERFACE_ENTRY(IMSVidInputDevice)
	COM_INTERFACE_ENTRY(IMSVidDevice)
	COM_INTERFACE_ENTRY(IPersist)
	COM_INTERFACE_ENTRY(IProvideClassInfo2)
	COM_INTERFACE_ENTRY(IProvideClassInfo)
END_COM_MAP()

	BEGIN_CATEGORY_MAP(CMSVidFilePlayback)
		IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
		IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
		IMPLEMENTED_CATEGORY(CATID_PersistsToPropertyBag)
	END_CATEGORY_MAP()

BEGIN_CONNECTION_POINT_MAP(CMSVidFilePlayback)
	CONNECTION_POINT_ENTRY(IID_IMSVidFilePlaybackEvent)    
END_CONNECTION_POINT_MAP()


// ISupportsErrorInfo
	STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);

public:
    STDMETHOD(put_Rate)(double lRate);
    STDMETHOD(get_Rate)(double *lRate);
    STDMETHOD(PostStop)();
    STDMETHOD(PostRun)();
    STDMETHOD(PreStop)();
    // DON'T addref the container.  we're guaranteed nested lifetimes
    // and an addref creates circular refcounts so we never unload.
    CComBSTR __declspec(property(get=GetName)) m_Name;
    CComBSTR GetName(void) {
        CString csName;
        if(m_iReader != -1){
            csName = (m_Filters[m_iReader]).GetName();
        }        
        if (csName.IsEmpty()) {
            csName = _T("File Playback");
        }
        return CComBSTR(csName);
    }
    HRESULT Unload(void) {
        HRESULT hr = IMSVidGraphSegmentImpl<CMSVidFilePlayback, MSVidSEG_SOURCE, &GUID_NULL>::Unload();
        m_iReader = -1;
        return hr;
	}

    virtual ~CMSVidFilePlayback() {}

// IMSVidGraphSegment
	STDMETHOD(put_Init)(IUnknown *pInit)
	{
        HRESULT hr = IMSVidGraphSegmentImpl<CMSVidFilePlayback, MSVidSEG_SOURCE, &GUID_NULL>::put_Init(pInit);
        if (FAILED(hr)) {
            return hr;
        }
        if (pInit) {
            m_fInit = false;
            return E_NOTIMPL;
        }
        return NOERROR;
	}

    STDMETHOD(Build)();
	STDMETHOD(put_Container)(IMSVidGraphSegmentContainer *pVal);
    STDMETHOD(OnEventNotify)(long lEvent, LONG_PTR lParam1, LONG_PTR lParam2);

// IMSVidDevice
	STDMETHOD(get_Name)(BSTR * Name)
	{
        if (!m_fInit) {
	 	    return Error(IDS_OBJ_NO_INIT, __uuidof(IMSVidFilePlayback), CO_E_NOTINITIALIZED);
        }
		if (Name == NULL)
			return E_POINTER;
        try {
		    *Name = m_Name.Copy();	
        } catch(...) {
            return E_POINTER;
        }
		return NOERROR;
	}
    // IMSVidInputDevice
	STDMETHOD(IsViewable)(VARIANT* pv, VARIANT_BOOL *pfViewable)
	{
        if (!m_fInit) {
	 	    return Error(IDS_OBJ_NO_INIT, __uuidof(IMSVidFilePlayback), CO_E_NOTINITIALIZED);
        }
        if (!pv) {
			return E_POINTER;
        }
		return E_NOTIMPL;
	}
	STDMETHOD(View)(VARIANT* pv) {
        if (!m_fInit) {
	 	    return Error(IDS_OBJ_NO_INIT, __uuidof(IMSVidFilePlayback), CO_E_NOTINITIALIZED);
        }
		if (!pv) {
			return E_POINTER;
		}
        if (pv->vt != VT_BSTR) {
			return E_INVALIDARG;
        }
        // if its a string then its either a dvd url or a filename
        // we don't do dvd urls
        if (!_wcsnicmp(pv->bstrVal, L"DVD:", 4)) {
            return E_FAIL;
        }
        if (m_pGraph && !m_pGraph.IsStopped()) {
	        return Error(IDS_INVALID_STATE, __uuidof(IMSVidFilePlayback), HRESULT_FROM_WIN32(ERROR_INVALID_STATE));
        }
		return put_FileName(pv->bstrVal);
	}
// IMSVidPlayback
// IMSVidFilePlayback
};

#endif //__MSVidFILEPLAYBACK_H_