windows-nt/Source/XPSP1/NT/multimedia/dshow/guidestore/guidedb.h
2020-09-26 16:20:57 +08:00

641 lines
15 KiB
C++

#ifndef __GUIDEDB_H_
#define __GUIDEDB_H_
#include "resource.h" // main symbols
#include "stdprop.h"
#include "SharedMemory.h"
// External classes
class CObject;
class CObjectType;
class CObjectTypes;
class CGuideDB;
/////////////////////////////////////////////////////////////////////////////
// CGuideDB
class ATL_NO_VTABLE CGuideDB :
public CComObjectRootEx<CComObjectThreadModel>,
public IConnectionPointContainerImpl<CGuideDB>,
public CategoriesPropSet,
public ChannelPropSet,
public ChannelsPropSet,
public CopyrightPropSet,
public TimePropSet,
public DescriptionPropSet,
public ProviderPropSet,
public RatingsPropSet,
public MPAARatingsPropSet,
public ScheduleEntryPropSet,
public ServicePropSet
{
public:
CGuideDB() : m_cacheObj(128), m_cacheObjs(0)
{
#if defined(_ATL_FREE_THREADED)
m_pUnkMarshaler = NULL;
#endif
m_fSQLServer = FALSE;
m_pobjtypes = NULL;
m_pobjtypeGeneric = NULL;
m_pobjtypeGuideDataProvider = NULL;
m_pobjtypeService = NULL;
m_pobjtypeScheduleEntry = NULL;
m_pobjtypeProgram = NULL;
m_pobjtypeChannel = NULL;
m_pobjtypeChannelLineup = NULL;
m_hwnd = NULL;
m_rgmsgItemEvent[Added] = NULL;
m_rgmsgItemEvent[Removed] = NULL;
m_rgmsgItemEvent[Changed] = NULL;
m_iTransLevel = 0;
}
~CGuideDB()
{
if (m_hwnd != NULL)
DestroyWindow(m_hwnd);
}
HRESULT GetDB(CGuideDB **ppdb)
{
*ppdb = this;
return S_OK;
}
_bstr_t & get_UUID()
{
return m_bstrUUID;
}
DECLARE_GET_CONTROLLING_UNKNOWN()
#if defined(_ATL_FREE_THREADED)
DECLARE_PROTECT_FINAL_CONSTRUCT()
#endif
BEGIN_COM_MAP(CGuideDB)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
#if defined(_ATL_FREE_THREADED)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
#endif
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CGuideDB)
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
public:
HRESULT CreateDB(const TCHAR *szDBName, const TCHAR *szDBFileName, const TCHAR *szConnection);
HRESULT CreateSQLDB(const TCHAR *szDBName, const TCHAR *szDBFileName, const TCHAR *szConnection);
HRESULT InitDB(ADOX::_Catalog *pcatalog);
HRESULT InitSQLDB(SQLDMO::_Database *pdb);
HRESULT OpenDB(IGuideStore *pgs, const TCHAR *szDBName);
boolean FSQLServer()
{
return m_fSQLServer;
}
enum ItemEvent {Added = 0, Removed, Changed};
UINT m_rgmsgItemEvent[3];
void Broadcast_ItemEvent(enum ItemEvent ev, long idObj, long idType);
void Broadcast_ItemAdded(long idObj, long idType)
{
Broadcast_ItemEvent(Added, idObj, idType);
}
void Broadcast_ItemRemoved(long idObj, long idType)
{
Broadcast_ItemEvent(Removed, idObj, idType);
}
void Broadcast_ItemChanged(long idObj, long idType)
{
Broadcast_ItemEvent(Changed, idObj, idType);
}
void Broadcast_ItemChanged(long idObj);
void Broadcast_ItemsChanged(long idType)
{
Broadcast_ItemEvent(Changed, 0, idType);
}
void Fire_ItemEvent(enum ItemEvent ev, long idObj, long lExtra);
static ATOM s_atomWindowClass;
static LRESULT _WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
CGuideDB *pdb = (CGuideDB *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (msg == WM_CREATE)
{
LPCREATESTRUCT pcreatestruct = (LPCREATESTRUCT) lparam;
pdb = (CGuideDB *) pcreatestruct->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) pdb);
}
if (pdb == NULL)
return DefWindowProc(hwnd, msg, wparam, lparam);;
return pdb->WindowProc(msg, wparam, lparam);
}
LRESULT WindowProc(UINT msg, WPARAM wparam, LPARAM lparam)
{
if (msg == m_rgmsgItemEvent[Added])
Fire_ItemEvent(Added, wparam, lparam);
else if (msg == m_rgmsgItemEvent[Removed])
Fire_ItemEvent(Removed, wparam, lparam);
else if (msg == m_rgmsgItemEvent[Changed])
Fire_ItemEvent(Changed, wparam, lparam);
else
return DefWindowProc(m_hwnd, msg, wparam, lparam);
return 0;
}
HRESULT CreateEventSinkWindow()
{
if (s_atomWindowClass == NULL)
{
WNDCLASS wndclass;
wndclass.style = 0;
wndclass.lpfnWndProc = _WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = _Module.GetModuleInstance();
wndclass.hIcon = NULL;
wndclass.hCursor = NULL;
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = _T("GuideStoreEventSink");
s_atomWindowClass = RegisterClass(&wndclass);
if (s_atomWindowClass == NULL)
return HRESULT_FROM_WIN32(GetLastError());
}
if (m_rgmsgItemEvent[Added] == 0)
{
TCHAR szMsg[128];
_bstr_t bstrUUID = get_UUID();
wsprintf(szMsg, _T("ItemAdded(%s)"), (LPCTSTR) bstrUUID);
m_rgmsgItemEvent[Added] = RegisterWindowMessage(szMsg);
wsprintf(szMsg, _T("ItemRemoved(%s)"), (LPCTSTR) bstrUUID);
m_rgmsgItemEvent[Removed] = RegisterWindowMessage(szMsg);
wsprintf(szMsg, _T("ItemChanged(%s)"), (LPCTSTR) bstrUUID);
m_rgmsgItemEvent[Changed] = RegisterWindowMessage(szMsg);
}
m_hwnd = CreateWindow( (LPCTSTR)(LONG_PTR)MAKELONG(s_atomWindowClass, 0), // registered class name
_T(""), // window name
WS_POPUP, // window style
0, 0, 0, 0, // window size and position
NULL, // handle to parent or owner window
NULL, // menu handle or child identifier
_Module.GetModuleInstance(),
(LPVOID) this // window-creation data
);
if (m_hwnd == NULL)
return HRESULT_FROM_WIN32(GetLastError());
return S_OK;
}
CComPtr<IGuideDataProvider> m_pdataprovider;
long GetIDGuideDataProvider();
HRESULT get_GuideDataProvider(IGuideDataProvider **ppdataprovider);
HRESULT putref_GuideDataProvider(IGuideDataProvider *pdataprovider);
HRESULT BeginTrans()
{
HRESULT hr;
long iLevel;
hr = m_pdb->BeginTrans(&iLevel);
if (FAILED(hr))
return hr;
m_iTransLevel++;
if (m_iTransLevel != iLevel)
return E_FAIL;
return S_OK;
}
HRESULT CommitTrans()
{
HRESULT hr;
hr = m_pdb->CommitTrans();
if (FAILED(hr))
return hr;
//UNDONE: Fire a bulk update event.
m_iTransLevel--;
if (m_iTransLevel == 0)
TransactionDone(TRUE);
return S_OK;
}
HRESULT RollbackTrans()
{
HRESULT hr;
hr = m_pdb->RollbackTrans();
if (FAILED(hr))
return hr;
m_iTransLevel--;
if (m_iTransLevel == 0)
TransactionDone(FALSE);
return S_OK;
}
void TransactionDone(boolean fCommit);
HRESULT NewQuery(_bstr_t bstrQuery, ADODB::_Recordset **pprs)
{
_variant_t varDB((IDispatch *)m_pdb);
_variant_t varQuery(bstrQuery);
ADODB::_RecordsetPtr prs;
HRESULT hr;
DeclarePerfTimer("CGuideDB::NewQuery");
PerfTimerReset();
hr = prs.CreateInstance(__uuidof(ADODB::Recordset));
if (FAILED(hr))
return hr;
hr = prs->Open(varQuery,
varDB, ADODB::adOpenUnspecified, ADODB::adLockPessimistic, ADODB::adCmdText);
if (FAILED(hr))
return hr;
*pprs = prs;
if (*pprs != NULL)
(*pprs)->AddRef();
PerfTimerDump("Succeeded");
return S_OK;
}
HRESULT Execute(BSTR bstrCmd, VARIANT *pvarCount = NULL,
long lOptions = ADODB::adExecuteNoRecords, ADODB::_Recordset **pprs = NULL)
{
HRESULT hr;
hr = m_pdb->Execute(bstrCmd, pvarCount, lOptions, pprs);
if (FAILED(hr))
{
DumpObjsCache(_T("CGuideDB::Execute() - After Fail\n"), TRUE);
CloseRels();
hr = m_pdb->Execute(bstrCmd, pvarCount, lOptions, pprs);
DumpObjsCache(_T("CGuideDB::Execute() - After Retry\n"), FALSE);
}
return hr;
}
HRESULT get_StringsRS(ADODB::_Recordset **pprs)
{
*pprs = m_prsStrings;
if (*pprs != NULL)
(*pprs)->AddRef();
return S_OK;
}
HRESULT get_PropSetsRS(ADODB::_Recordset **pprs)
{
*pprs = m_prsPropSets;
if (*pprs != NULL)
(*pprs)->AddRef();
return S_OK;
}
HRESULT get_PropTypesRS(ADODB::_Recordset **pprs)
{
*pprs = m_prsPropTypes;
if (*pprs != NULL)
(*pprs)->AddRef();
return S_OK;
}
HRESULT get_PropsRS(ADODB::_Recordset **pprs)
{
*pprs = m_prsProps;
if (*pprs != NULL)
(*pprs)->AddRef();
return S_OK;
}
HRESULT get_PropsIndexed(ADODB::_Recordset **pprs)
{
*pprs = m_prsPropsIndexed;
if (*pprs != NULL)
(*pprs)->AddRef();
return S_OK;
}
HRESULT get_ObjTypesRS(ADODB::_Recordset **pprs)
{
*pprs = m_prsObjTypes;
if (*pprs != NULL)
(*pprs)->AddRef();
return S_OK;
}
void RequeryObjectsTables()
{
m_prsObjs = NULL;
m_prsObjsByID = NULL;
m_prsObjsByType = NULL;
}
HRESULT get_ObjsRS(ADODB::_Recordset **pprs);
HRESULT get_ObjsByType(ADODB::_Recordset **pprs);
HRESULT get_ObjsByID(ADODB::_Recordset **pprs);
HRESULT get_RelsByID1Rel(ADODB::_Recordset **pprs);
HRESULT get_RelsByID2Rel(ADODB::_Recordset **pprs);
void CloseRels()
{
if (m_prsRelsByID1Rel != NULL)
m_prsRelsByID1Rel.Release();
if (m_prsRelsByID2Rel != NULL)
m_prsRelsByID2Rel.Release();
}
HRESULT get_MetaPropertySet(BSTR bstrName, IMetaPropertySet **pppropset)
{
return m_ppropsets->get_AddNew(bstrName, pppropset);
}
HRESULT get_MetaPropertyType(BSTR bstrName, IMetaPropertyType **ppproptype)
{
if (m_ppropsets == NULL)
return E_INVALIDARG;
return m_ppropsets->get_Lookup(bstrName, ppproptype);
}
HRESULT get_MetaPropertyType(long idPropType, IMetaPropertyType **ppproptype);
HRESULT put_MetaPropertyType(long idPropType, IMetaPropertyType *pproptype);
HRESULT SaveObject(IUnknown *punk, long *pid);
void DumpObjsCache(const TCHAR *psz, boolean fPurge);
HRESULT CacheCollection(IObjects *pobjs)
{
return m_cacheObjs.Cache((LONG_PTR)pobjs, pobjs);
}
HRESULT CacheObject(long idObj, long idObjType, IUnknown **ppobj);
HRESULT CacheObject(long idObj, CObjectType *pobjtype, IUnknown **ppobj);
HRESULT UncacheObject(long idObj);
HRESULT get_Object(long idObj, IUnknown **ppobj);
HRESULT get_IdOf(IUnknown *pobj, long *pid);
HRESULT get_MetaPropertiesOf(long id, IMetaProperties **ppprops);
STDMETHOD(get_MetaPropertiesOf)(/*[in]*/ IUnknown *punk, /*[out, retval]*/ IMetaProperties **ppprops)
{
ENTER_API
{
long idObj;
HRESULT hr;
hr = get_IdOf(punk, &idObj);
if (FAILED(hr))
return hr;
return get_MetaPropertiesOf(idObj, ppprops);
}
LEAVE_API
}
HRESULT get_ObjectsWithType(long idType, IObjects **ppobjs);
HRESULT get_ObjectsWithType(CObjectType *pobjtype, IObjects **ppobjs);
HRESULT get_ObjectsWithType(CLSID clsid, IObjects **ppobjs)
{
CObjectType *pobjtype;
get_ObjectType(clsid, &pobjtype);
return get_ObjectsWithType(pobjtype, ppobjs);
}
HRESULT get_ObjectType(long idObjType, CObjectType **ppobjtype);
HRESULT put_ObjectType(long idObjType, CObjectType *pobjtype);
HRESULT get_ObjectTypes(CObjectTypes **ppobjtypes);
HRESULT get_ObjectType(BSTR bstrCLSID, CObjectType **ppobjtype);
HRESULT get_ObjectType(CLSID clsid, CObjectType **ppobjtype);
HRESULT get_GenericObjectType(CObjectType **ppobjtype)
{
HRESULT hr;
if (m_pobjtypeGeneric == NULL)
{
hr = get_ObjectType(__uuidof(IUnknown), &m_pobjtypeGeneric);
if (FAILED(hr))
return hr;
}
if ((*ppobjtype = m_pobjtypeGeneric) == NULL)
return E_FAIL;
return S_OK;
}
HRESULT get_GuideDataProviderObjectType(CObjectType **ppobjtype)
{
HRESULT hr;
if (m_pobjtypeGuideDataProvider == NULL)
{
hr = get_ObjectType(CLSID_GuideDataProvider, &m_pobjtypeGuideDataProvider);
if (FAILED(hr))
return hr;
}
if ((*ppobjtype = m_pobjtypeGuideDataProvider) == NULL)
return E_FAIL;
return S_OK;
}
HRESULT get_ServiceObjectType(CObjectType **ppobjtype)
{
HRESULT hr;
if (m_pobjtypeService == NULL)
{
hr = get_ObjectType(CLSID_Service, &m_pobjtypeService);
if (FAILED(hr))
return hr;
}
if ((*ppobjtype = m_pobjtypeService) == NULL)
return E_FAIL;
return S_OK;
}
HRESULT get_ProgramObjectType(CObjectType **ppobjtype)
{
HRESULT hr;
if (m_pobjtypeProgram == NULL)
{
hr = get_ObjectType(CLSID_Program, &m_pobjtypeProgram);
if (FAILED(hr))
return hr;
}
if ((*ppobjtype = m_pobjtypeProgram) == NULL)
return E_FAIL;
return S_OK;
}
HRESULT get_ScheduleEntryObjectType(CObjectType **ppobjtype)
{
HRESULT hr;
if (m_pobjtypeScheduleEntry == NULL)
{
hr = get_ObjectType(CLSID_ScheduleEntry, &m_pobjtypeScheduleEntry);
if (FAILED(hr))
return hr;
}
if ((*ppobjtype = m_pobjtypeScheduleEntry) == NULL)
return E_FAIL;
return S_OK;
}
HRESULT get_ChannelObjectType(CObjectType **ppobjtype)
{
HRESULT hr;
if (m_pobjtypeChannel == NULL)
{
hr = get_ObjectType(CLSID_Channel, &m_pobjtypeChannel);
if (FAILED(hr))
return hr;
}
if ((*ppobjtype = m_pobjtypeChannel) == NULL)
return E_FAIL;
return S_OK;
}
HRESULT get_ChannelLineupObjectType(CObjectType **ppobjtype)
{
HRESULT hr;
if (m_pobjtypeChannelLineup == NULL)
{
hr = get_ObjectType(CLSID_ChannelLineup, &m_pobjtypeChannelLineup);
if (FAILED(hr))
return hr;
}
if ((*ppobjtype = m_pobjtypeChannelLineup) == NULL)
return E_FAIL;
return S_OK;
}
long ObjectCount()
{
return m_cacheObj.Count();
}
IUnknown * Object(long i)
{
return m_cacheObj.Item(i);
}
long CachedObjectCount()
{
return m_cacheObj.CachedCount();
}
HRESULT PurgeCachedObjects()
{
m_cacheObj.Keep(0);
m_cacheObj.Keep(128);
return S_OK;
}
CComObjectCacheByID & CacheObjs() { return m_cacheObjs; }
protected:
CComPtr<IMetaPropertySets> m_ppropsets;
ADODB::_ConnectionPtr m_pdb;
boolean m_fSQLServer;
ADODB::_RecordsetPtr m_prsStrings;
ADODB::_RecordsetPtr m_prsPropSets;
ADODB::_RecordsetPtr m_prsPropTypes;
ADODB::_RecordsetPtr m_prsProps;
ADODB::_RecordsetPtr m_prsPropsIndexed;
ADODB::_RecordsetPtr m_prsObjTypes;
ADODB::_RecordsetPtr m_prsObjs;
ADODB::_RecordsetPtr m_prsObjsByType;
ADODB::_RecordsetPtr m_prsObjsByID;
ADODB::_RecordsetPtr m_prsRelsByID1Rel;
ADODB::_RecordsetPtr m_prsRelsByID2Rel;
typedef map<long, IMetaPropertyType *> t_mapPropTypes;
t_mapPropTypes m_mapPropTypes;
CComObjectCacheByID m_cacheObj;
CComObjectCacheByID m_cacheObjs;
typedef map<long, IMetaProperties *> t_mapIdProps;
t_mapIdProps m_mapIdProps;
typedef map<long, IObjects *> t_mapObjsWithType;
t_mapObjsWithType m_mapObjsWithType;
typedef map<long, CObjectType *> t_mapObjTypes;
t_mapObjTypes m_mapObjTypes;
CObjectTypes *m_pobjtypes;
CObjectType *m_pobjtypeGeneric;
CObjectType *m_pobjtypeGuideDataProvider;
CObjectType *m_pobjtypeService;
CObjectType *m_pobjtypeScheduleEntry;
CObjectType *m_pobjtypeProgram;
CObjectType *m_pobjtypeChannel;
CObjectType *m_pobjtypeChannelLineup;
_bstr_t m_bstrUUID;
HWND m_hwnd;
long m_iTransLevel;
};
ATOM __declspec(selectany) CGuideDB::s_atomWindowClass = NULL;
#endif //__GUIDEDB_H_