// TIFLoad.h : Declaration of the CTIFLoad #ifndef __TIFLOAD_H_ #define __TIFLOAD_H_ #include "resource.h" // main symbols #include "thread.h" #include "bdatif.h" ///////////////////////////////////////////////////////////////////////////// // CTIFLoad class ATL_NO_VTABLE CTIFLoad : public CComObjectRootEx, public CComCoClass, public IGuideDataLoader, public IGuideDataEvent { public: CTIFLoad() : m_pUnkMarshaler(NULL), m_dwPGDCookie(0), m_dwAdviseGuideDataEvents(0), m_pGSThread(NULL) {} ~CTIFLoad() { Terminate(); } DECLARE_REGISTRY_RESOURCEID(IDR_TIFLOAD) DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CTIFLoad) COM_INTERFACE_ENTRY(IGuideDataLoader) COM_INTERFACE_ENTRY(IGuideDataEvent) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) END_COM_MAP() HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; HRESULT InitGS(); STDMETHOD(ExecuteGuideDataAcquired)(); STDMETHOD(ExecuteProgramChanged)(VARIANT varProgramDescriptionID); STDMETHOD(ExecuteServiceChanged)(VARIANT varServiceDescriptionID); STDMETHOD(ExecuteScheduleEntryChanged)(VARIANT varScheduleEntryDescriptionID); STDMETHOD(ExecuteProgramDeleted)(VARIANT varProgramDescriptionID); STDMETHOD(ExecuteServiceDeleted)(VARIANT varServiceDescriptionID); STDMETHOD(ExecuteScheduleDeleted)(VARIANT varScheduleEntryDescriptionID); // ITIFLoad STDMETHOD(Init)(IGuideData *pgd); STDMETHOD(Terminate)(); HRESULT GetGuideDataProperty(IEnumGuideDataProperties *penumprops, const TCHAR *sz, long idLang, VARIANT *pvar) { if (!penumprops) { return E_POINTER; } HRESULT hr = penumprops->Reset(); if (FAILED(hr)) { return E_UNEXPECTED; } DWORD count; USES_CONVERSION; CComBSTR bsz(T2COLE(sz)); CComPtr pprop; hr = penumprops->Next(1, &pprop, &count); while (SUCCEEDED(hr) && hr != S_FALSE) { CComBSTR name; hr = pprop->get_Name(&name); if (SUCCEEDED(hr) && name == bsz) { long lang; hr = pprop->get_Language(&lang); if (SUCCEEDED(hr) && idLang == lang) { hr = pprop->get_Value(pvar); if (SUCCEEDED(hr)) { return NOERROR; } } } pprop.Release(); hr = penumprops->Next(1, &pprop, &count); } return E_FAIL; } HRESULT RemoveAllUnreferenced(IUnknown *punk); HRESULT LoadServices(); HRESULT LoadPrograms(); HRESULT LoadScheduleEntries(); HRESULT AddService(IEnumGuideDataProperties *penumprops, IService **ppservice); HRESULT AddProgram(IEnumGuideDataProperties *penumprops, IProgram **ppprog); HRESULT AddScheduleEntry(IEnumGuideDataProperties *penumprops, IScheduleEntry **ppschedentry); HRESULT AddObject(IObjects *pobjs, IEnumGuideDataProperties *penumprops, IUnknown **ppunk); HRESULT PutMetaProperty(IMetaProperties *pprops, IMetaPropertyType *pproptype, long idLang, VARIANT varValue); HRESULT PutMetaProperty(IUnknown *punk, IMetaPropertyType *pproptype, long idLang, VARIANT varValue); HRESULT UpdateObject(IUnknown *punk, IEnumGuideDataProperties *penumprops); HRESULT UpdateMetaProps(IMetaProperties *pprops, IEnumGuideDataProperties *penumprops); // IGuideDataEvent STDMETHOD(GuideDataAcquired)(); STDMETHOD(ProgramChanged)(VARIANT varProgramDescriptionID); STDMETHOD(ServiceChanged)(VARIANT varServiceDescriptionID); STDMETHOD(ScheduleEntryChanged)(VARIANT varScheduleEntryDescriptionID); STDMETHOD(ProgramDeleted)(VARIANT varProgramDescriptionID); STDMETHOD(ServiceDeleted)(VARIANT varServiceDescriptionID); STDMETHOD(ScheduleDeleted)(VARIANT varScheduleEntryDescriptionID); // ITIFLoad public: protected: // vars in tif thread context DWORD m_dwPGDCookie; // original IGuideData* DWORD m_dwAdviseGuideDataEvents; CComPtr m_pGIT; CComPtr m_pcp; // vars in worker thread context CComPtr m_pgd; IGuideStorePtr m_pgs; CComPtr m_pprovider; CComPtr m_ppropsets; CComPtr m_pproptypeID; CComPtr m_pproptypeVersion; CComPtr m_pproptypeSchedEntryServiceID; CComPtr m_pproptypeSchedEntryProgramID; CComPtr m_ppropcondNonBlankSchedEntryServiceID; CComPtr m_pservices; CComPtr m_pprogs; CComPtr m_pschedentries; CComPtr m_pchans; CGSThread* m_pGSThread; }; #endif //__TIFLOAD_H_