|
|
#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_
|