// GuideStore2.h : Declaration of the CGuideStore

#ifndef __GUIDESTORE2_H_
#define __GUIDESTORE2_H_

#include "resource.h"       // main symbols
#include "property.h"
#include "Service.h"
#include "Program.h"
#include "ScheduleEntry.h"
#include "GuideDataProvider.h"
#include "object.h"
#include "GuideDB.h"

class CGuideStore;

/////////////////////////////////////////////////////////////////////////////
// CGuideStore
class ATL_NO_VTABLE CGuideStore : 
	public CComObjectRootEx<CComObjectThreadModel>,
	public CComCoClass<CGuideStore, &CLSID_GuideStore>,
	public IConnectionPointContainerImpl<CGuideStore>,
	public IDispatchImpl<IGuideStore, &IID_IGuideStore, &LIBID_GUIDESTORELib>,
	public IGuideStoreInternal
{
public:
	CGuideStore()
	{
#if defined(_ATL_FREE_THREADED)
		m_pUnkMarshaler = NULL;
#endif
		m_pobjs = NULL;
		m_pdb = NULL;
	}

DECLARE_REGISTRY_RESOURCEID(IDR_GUIDESTORE)
DECLARE_GET_CONTROLLING_UNKNOWN()

#if defined(_ATL_FREE_THREADED)
DECLARE_PROTECT_FINAL_CONSTRUCT()
#endif

BEGIN_COM_MAP(CGuideStore)
	COM_INTERFACE_ENTRY(IGuideStore)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
#if defined(_ATL_FREE_THREADED)
	COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
#endif
	COM_INTERFACE_ENTRY(IGuideStoreInternal)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CGuideStore)
END_CONNECTION_POINT_MAP()


#if defined(_ATL_FREE_THREADED)
	HRESULT FinalConstruct()
	{
		return CoCreateFreeThreadedMarshaler(
			GetControllingUnknown(), &m_pUnkMarshaler.p);
	}

	void FinalRelease()
		{
		m_pUnkMarshaler.Release();
		}

	CComPtr<IUnknown> m_pUnkMarshaler;
#endif

	HRESULT OpenDB(const TCHAR *szDBName);

// IGuideStoreInternal
	STDMETHOD(get_ObjectCount)(/*[out, retval] */ long *plCount)
		{
		ENTER_API
			{
			ValidateOut<long>(plCount);

			*plCount = m_pdb->ObjectCount();
			return S_OK;
			}
		LEAVE_API
		}
	STDMETHOD(get_Object)(/* [in] */ long iObject, /*[out, retval] */ IUnknown **ppunk)
		{
		ENTER_API
			{
			ValidateOutPtr<IUnknown>(ppunk);

			*ppunk = m_pdb->Object(iObject);
			return S_OK;
			}
		LEAVE_API
		}
	STDMETHOD(get_CachedObjectCount)(/*[out, retval] */ long *plCount)
		{
		ENTER_API
			{
			*plCount = m_pdb->CachedObjectCount();
			return S_OK;
			}
		LEAVE_API
		}
	STDMETHOD(PurgeCachedObjects)()
		{
		ENTER_API
			{
			return m_pdb->PurgeCachedObjects();
			}
		LEAVE_API
		}

// IGuideStore
public:
	STDMETHOD(BeginTrans)()
		{
		return m_pdb->BeginTrans();
		}
	STDMETHOD(CommitTrans)()
		{
		return m_pdb->CommitTrans();
		}
	STDMETHOD(RollbackTrans)()
		{
		return m_pdb->RollbackTrans();
		}
	STDMETHOD(get_UUID)(/* [out, retval] */ BSTR *pbstrUUID)
		{
		ENTER_API
			{
			ValidateOut(pbstrUUID);

			*pbstrUUID = m_pdb->get_UUID().copy();

			return S_OK;
			}
		LEAVE_API
		}

	STDMETHOD(get_IdOf)(/*[in]*/ IUnknown *punk, /*[out, retval]*/ long *pid)
		{
		ENTER_API
			{
			return m_pdb->get_IdOf(punk, pid);
			}
		LEAVE_API
		}
	STDMETHOD(get_MetaPropertiesOf)(/*[in]*/ IUnknown *punk, /*[out, retval]*/ IMetaProperties **ppprops)
		{
		ENTER_API
			{
			return m_pdb->get_MetaPropertiesOf(punk, ppprops);
			}
		LEAVE_API
		}
	
	STDMETHOD(get_ActiveGuideDataProvider)(/*[out, retval]*/ IGuideDataProvider * *pVal);
	STDMETHOD(putref_ActiveGuideDataProvider)(/*[in]*/ IGuideDataProvider * newVal);
	STDMETHOD(get_Channels)(/*[out, retval]*/ IChannels * *pVal);
	STDMETHOD(get_ChannelLineups)(/*[out, retval]*/ IChannelLineups * *pVal);
	STDMETHOD(get_Objects)(/*[out, retval]*/ IObjects * *pVal);
	STDMETHOD(Open)(BSTR bstrName);
	STDMETHOD(get_MetaPropertySets)(/*[out, retval]*/ IMetaPropertySets **pppropsets);
	STDMETHOD(get_ScheduleEntries)(/*[out, retval]*/ IScheduleEntries * *pVal);
	STDMETHOD(get_Programs)(/*[out, retval]*/ IPrograms * *pVal);
	STDMETHOD(get_Services)(/*[out, retval]*/ IServices * *pVal);
	STDMETHOD(get_GuideDataProviders)(/*[out, retval]*/ IGuideDataProviders * *pVal);

protected:
	CComPtr<IObjects> m_pobjs;
	CComPtr<IGuideDataProviders> m_pdataproviders;
	CComPtr<IServices> m_pservices;
	CComPtr<IPrograms> m_pprograms;
	CComPtr<IChannels> m_pchans;
	CComPtr<IScheduleEntries>  m_pschedentries;
	CComPtr<CMetaPropertySets> m_ppropsets;

	CComPtr<CGuideDB> m_pdb;
};

#endif //__GUIDESTORE2_H_