834 lines
20 KiB
C
834 lines
20 KiB
C
|
|
||
|
// object.h : Declaration of the CObject
|
||
|
|
||
|
#ifndef __Object_H_
|
||
|
#define __Object_H_
|
||
|
|
||
|
#include "resource.h" // main symbols
|
||
|
|
||
|
#include "property.h"
|
||
|
#include "guidedb.h"
|
||
|
|
||
|
class CObjectType;
|
||
|
class CObjectTypes;
|
||
|
class CObject;
|
||
|
class CObjectGlue;
|
||
|
class CObjects;
|
||
|
class CObjectPropertyBag;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CObjectType
|
||
|
class CObjectType
|
||
|
{
|
||
|
public:
|
||
|
CObjectType()
|
||
|
{
|
||
|
m_fKnowCollectionCLSID = FALSE;
|
||
|
}
|
||
|
|
||
|
HRESULT CreateInstance(long id, IUnknown **ppobj);
|
||
|
|
||
|
HRESULT Init(CGuideDB *pdb, long id, BSTR bstrCLSID)
|
||
|
|
||
|
{
|
||
|
CLSID clsid;
|
||
|
|
||
|
HRESULT hr = CLSIDFromString(bstrCLSID, &clsid);
|
||
|
if (hr == CO_E_CLASSSTRING)
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
return Init(pdb, id, clsid);
|
||
|
}
|
||
|
|
||
|
HRESULT Init(CGuideDB *pdb, long id, IID clsid)
|
||
|
{
|
||
|
m_pdb = pdb;
|
||
|
m_id = id;
|
||
|
m_clsid = clsid;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT GetDB(CGuideDB **ppdb);
|
||
|
|
||
|
public:
|
||
|
STDMETHOD(get_NewCollection)(/*[out, retval]*/ IObjects * *ppobjs);
|
||
|
STDMETHOD(get_New)(/*[out, retval]*/ IUnknown * *pVal);
|
||
|
STDMETHOD(get_IID)(/*[out, retval]*/ BSTR *pVal);
|
||
|
STDMETHOD(get_ID)(/*[out, retval]*/ long *pVal);
|
||
|
|
||
|
friend CObject;
|
||
|
protected:
|
||
|
CComPtr<CGuideDB> m_pdb;
|
||
|
CLSID m_clsid;
|
||
|
long m_id;
|
||
|
boolean m_fKnowCollectionCLSID;
|
||
|
CLSID m_clsidCollection;
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CObjectTypes
|
||
|
class CObjectTypes
|
||
|
{
|
||
|
public:
|
||
|
HRESULT Init(CGuideDB *pdb);
|
||
|
|
||
|
CObjectType *Cache(long id, BSTR bstrCLSID);
|
||
|
|
||
|
public:
|
||
|
STDMETHOD(get_AddNew)(BSTR bstrIID, /*[out, retval]*/ CObjectType * *pVal);
|
||
|
#if 0
|
||
|
STDMETHOD(get_AddNew)(CLSID clsid, /*[out, retval]*/ CObjectType * *pVal);
|
||
|
#endif
|
||
|
STDMETHOD(get_ItemWithCLSID)(BSTR bstrCLSID, /*[out, retval]*/ CObjectType * *pVal);
|
||
|
// STDMETHOD(get_ItemWithCLSID)(CLSID clsid, /*[out, retval]*/ CObjectType * *pVal);
|
||
|
|
||
|
protected:
|
||
|
CComPtr<CGuideDB> m_pdb;
|
||
|
ADODB::_RecordsetPtr m_prsObjTypes;
|
||
|
|
||
|
typedef MemCmpLess<CLSID> CLSIDLess;
|
||
|
typedef map<CLSID, CObjectType *, CLSIDLess> t_map;
|
||
|
t_map m_map;
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CObject
|
||
|
class DECLSPEC_UUID("4789011b-bc6d-49e2-b4df-420e40f4e318") ATL_NO_VTABLE CObject :
|
||
|
public IUnknown,
|
||
|
public CComObjectRootEx<CComObjectThreadModel>
|
||
|
{
|
||
|
public:
|
||
|
CObject()
|
||
|
{
|
||
|
m_id = 0;
|
||
|
}
|
||
|
|
||
|
DECLARE_GET_CONTROLLING_UNKNOWN()
|
||
|
|
||
|
BEGIN_COM_MAP(CObject)
|
||
|
COM_INTERFACE_ENTRY(CObject)
|
||
|
COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punk.p)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
friend class CObjectGlue;
|
||
|
|
||
|
CGuideDB *GetDB()
|
||
|
{
|
||
|
//UNSAFE... doesn't do AddRef()... use the pointer quickly!
|
||
|
return m_pdb;
|
||
|
}
|
||
|
|
||
|
HRESULT get_RelatedObjectID(boolean fInverse, long id, long idRel, long *pidRet);
|
||
|
HRESULT get_ItemsRelatedBy(CObjectType *pobjtype,
|
||
|
long idRel, boolean fInverse, IObjects **ppobjs);
|
||
|
|
||
|
HRESULT CreatePropBag(IPersist *ppersist);
|
||
|
|
||
|
public:
|
||
|
STDMETHOD(Init)(long id, CObjectType * pobjtype);
|
||
|
STDMETHOD(Save)(IUnknown *punk);
|
||
|
STDMETHOD(Load)();
|
||
|
STDMETHOD(get_ItemsInverseRelatedBy)(CObjectType *pobjtype, /* [in] */ long idRel, /*[out, retval]*/ IObjects **ppobjs1);
|
||
|
STDMETHOD(get_ItemInverseRelatedBy)(/* [in] */ long idRel, /*[out, retval]*/ IUnknown **ppobj1);
|
||
|
STDMETHOD(get_ItemsRelatedBy)(CObjectType *pobjtype, /* [in] */ long idRel, /*[out, retval]*/ IObjects **ppobjs2);
|
||
|
STDMETHOD(get_ItemRelatedBy)(/* [in] */ long idRel, /*[out, retval]*/ IUnknown **ppobj2);
|
||
|
STDMETHOD(put_ItemRelatedBy)(/* [in] */ long idRel, /*[in]*/ IUnknown *pobj2);
|
||
|
STDMETHOD(get_MetaProperties)(/*[out, retval]*/ IMetaProperties * *pVal);
|
||
|
STDMETHOD(get_ID)(/*[out, retval]*/ long *pVal);
|
||
|
STDMETHOD(get_Type)(/*[out, retval]*/ CObjectType * *pVal);
|
||
|
|
||
|
protected:
|
||
|
CObjectType *m_pobjtype;
|
||
|
CComPtr<IUnknown> m_punk;
|
||
|
CComPtr<CGuideDB> m_pdb;
|
||
|
CComPtr<IMetaProperties> m_pprops;
|
||
|
long m_id;
|
||
|
CComPtr<CObjectPropertyBag> m_ppropbag;
|
||
|
};
|
||
|
|
||
|
class CObjectGlue
|
||
|
{
|
||
|
public:
|
||
|
virtual IUnknown *GetControllingUnknown() = 0;
|
||
|
|
||
|
HRESULT get_ItemsRelatedBy(CObjectType *pobjtype,
|
||
|
IMetaPropertyType *pproptype, boolean fInverse, IObjects **ppobjs)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
CComQIPtr<CMetaPropertyType> pproptypeT(pproptype);
|
||
|
long idRel = pproptypeT->GetID();
|
||
|
|
||
|
return pobj->get_ItemsRelatedBy(pobjtype, idRel, fInverse, ppobjs);
|
||
|
}
|
||
|
|
||
|
// IObjectInt
|
||
|
protected:
|
||
|
STDMETHOD(Init)(long id, CObjectType * pobjtype)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
|
||
|
return pobj->Init(id, pobjtype);
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
STDMETHOD(get_ItemsInverseRelatedBy)(CObjectType *pobjtype,
|
||
|
IMetaPropertyType *pproptype, /*[out, retval]*/ IObjects **ppobjs1)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
CComQIPtr<CMetaPropertyType> pproptypeT(pproptype);
|
||
|
long idRel = pproptypeT->GetID();
|
||
|
|
||
|
return pobj->get_ItemsInverseRelatedBy(pobjtype, idRel, ppobjs1);
|
||
|
}
|
||
|
STDMETHOD(get_ItemInverseRelatedBy)(IMetaPropertyType *pproptype, /*[out, retval]*/ IUnknown **ppobj1)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
CComQIPtr<CMetaPropertyType> pproptypeT(pproptype);
|
||
|
long idRel = pproptypeT->GetID();
|
||
|
|
||
|
return pobj->get_ItemInverseRelatedBy(idRel, ppobj1);
|
||
|
}
|
||
|
STDMETHOD(get_ItemsRelatedBy)(CObjectType *pobjtype,
|
||
|
IMetaPropertyType *pproptype, /*[out, retval]*/ IObjects **ppobjs2)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
CComQIPtr<CMetaPropertyType> pproptypeT(pproptype);
|
||
|
long idRel = pproptypeT->GetID();
|
||
|
|
||
|
return pobj->get_ItemsRelatedBy(pobjtype, idRel, ppobjs2);
|
||
|
}
|
||
|
STDMETHOD(get_ItemRelatedBy)(IMetaPropertyType *pproptype, /*[out, retval]*/ IUnknown **ppobj2)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
CComQIPtr<CMetaPropertyType> pproptypeT(pproptype);
|
||
|
long idRel = pproptypeT->GetID();
|
||
|
|
||
|
return pobj->get_ItemRelatedBy(idRel, ppobj2);
|
||
|
}
|
||
|
STDMETHOD(put_ItemRelatedBy)(IMetaPropertyType *pproptype, /*[in]*/ IUnknown *pobj2)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
CComQIPtr<CMetaPropertyType> pproptypeT(pproptype);
|
||
|
long idRel = pproptypeT->GetID();
|
||
|
|
||
|
return pobj->put_ItemRelatedBy(idRel, pobj2);
|
||
|
}
|
||
|
STDMETHOD(get_MetaProperties)(/*[out, retval]*/ IMetaProperties * *ppprops)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
|
||
|
return pobj->get_MetaProperties(ppprops);
|
||
|
}
|
||
|
STDMETHOD(get_ID)(/*[out, retval]*/ long *pid)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
|
||
|
return pobj->get_ID(pid);
|
||
|
}
|
||
|
STDMETHOD(get_Type)(/*[out, retval]*/ CObjectType * *pobjtype)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
|
||
|
return pobj->get_Type(pobjtype);
|
||
|
}
|
||
|
|
||
|
template<class T_Related>
|
||
|
HRESULT _get_ItemRelatedBy(IMetaPropertyType *pproptype, T_Related **ppT)
|
||
|
{
|
||
|
CComPtr<IUnknown> pobj;
|
||
|
HRESULT hr;
|
||
|
|
||
|
hr = get_ItemRelatedBy(pproptype, &pobj);
|
||
|
if (hr == S_FALSE || FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobj->QueryInterface(__uuidof(T_Related), (void **) ppT);
|
||
|
}
|
||
|
template<class T_Related>
|
||
|
HRESULT _put_ItemRelatedBy(IMetaPropertyType *pproptype, T_Related *pT)
|
||
|
{
|
||
|
return put_ItemRelatedBy(pproptype, pT);
|
||
|
}
|
||
|
|
||
|
__declspec(property(get=GetDB)) CGuideDB *m_pdb;
|
||
|
CGuideDB *GetDB()
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(GetControllingUnknown());
|
||
|
|
||
|
return pobj->GetDB();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CObjects
|
||
|
|
||
|
class ATL_NO_VTABLE DECLSPEC_UUID("AC0F25D9-81C8-4C9E-B7AC-031E9A539E1E") CObjects :
|
||
|
public CComObjectRootEx<CComObjectThreadModel>,
|
||
|
public CComCoClass<CObjects, &CLSID_Objects>,
|
||
|
public IObjectsPrivate,
|
||
|
public IObjects
|
||
|
{
|
||
|
public:
|
||
|
CObjects()
|
||
|
{
|
||
|
#if defined(_ATL_FREE_THREADED)
|
||
|
m_pUnkMarshaler = NULL;
|
||
|
#endif
|
||
|
m_cItems = -1;
|
||
|
m_fInverse = FALSE;
|
||
|
m_pobjtype = NULL;
|
||
|
m_fOnlyUnreferenced = FALSE;
|
||
|
m_idChanged = NULL;
|
||
|
m_cChanged = 0;
|
||
|
|
||
|
m_idPropTypeKey = 0;
|
||
|
m_idProviderKey = 0;
|
||
|
m_idLangKey = 0;
|
||
|
m_vtKey = 0;
|
||
|
}
|
||
|
|
||
|
CGuideDB *GetDB()
|
||
|
{
|
||
|
//UNSAFE... doesn't do AddRef()... use the pointer quickly!
|
||
|
return m_pdb;
|
||
|
}
|
||
|
|
||
|
void Dump();
|
||
|
|
||
|
HRESULT Clone(IObjects **ppobjs);
|
||
|
|
||
|
HRESULT AddRelationshipAt(long idObj1, long idRel, long iItem, long idObj2);
|
||
|
|
||
|
HRESULT put_OnlyUnreferenced(boolean fOnlyUnreferenced)
|
||
|
{
|
||
|
m_fOnlyUnreferenced = fOnlyUnreferenced;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
// If in a transaction, NoteChanged() will be called to keep track of changes.
|
||
|
// TransactionDone() will be called when the transaction is done.
|
||
|
void NoteChanged(long idObj)
|
||
|
{
|
||
|
if (m_idChanged == 0)
|
||
|
{
|
||
|
m_idChanged = idObj;
|
||
|
m_cChanged++;
|
||
|
}
|
||
|
else if (m_idChanged != idObj)
|
||
|
{
|
||
|
m_cChanged++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void TransactionDone(boolean fCommited)
|
||
|
{
|
||
|
if (fCommited && (m_cChanged > 0))
|
||
|
{
|
||
|
long idType;
|
||
|
m_pobjtype->get_ID(&idType);
|
||
|
|
||
|
if (m_cChanged == 1)
|
||
|
{
|
||
|
m_pdb->Broadcast_ItemChanged(m_idChanged, idType);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pdb->Broadcast_ItemsChanged(idType);
|
||
|
}
|
||
|
}
|
||
|
m_cChanged = 0;
|
||
|
m_idChanged = NULL;
|
||
|
}
|
||
|
|
||
|
DECLARE_REGISTRY_RESOURCEID(IDR_OBJECTS)
|
||
|
DECLARE_GET_CONTROLLING_UNKNOWN()
|
||
|
|
||
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
||
|
|
||
|
BEGIN_COM_MAP(CObjects)
|
||
|
COM_INTERFACE_ENTRY(IObjects)
|
||
|
COM_INTERFACE_ENTRY(CObjects)
|
||
|
COM_INTERFACE_ENTRY(IObjectsPrivate)
|
||
|
#if defined(_ATL_FREE_THREADED)
|
||
|
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
|
||
|
#endif
|
||
|
COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkCollection.p)
|
||
|
END_COM_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 Init(CLSID &clsid)
|
||
|
{
|
||
|
return m_punkCollection.CoCreateInstance(clsid, (IObjects *) this);
|
||
|
}
|
||
|
// Call IObjectsNotifications to notify Add/Remove/Change Item
|
||
|
HRESULT Notify_ItemAdded(IUnknown * pobj)
|
||
|
{
|
||
|
CComQIPtr<IObjectsNotifications> pobjsevents((IObjects *) this);
|
||
|
|
||
|
if (pobjsevents == NULL)
|
||
|
return S_OK;
|
||
|
|
||
|
return pobjsevents->Notify_ItemAdded(pobj);
|
||
|
}
|
||
|
HRESULT Notify_ItemRemoved(long idObj)
|
||
|
{
|
||
|
CComQIPtr<IObjectsNotifications> pobjsevents((IObjects *) this);
|
||
|
|
||
|
if (pobjsevents == NULL)
|
||
|
return S_OK;
|
||
|
|
||
|
return pobjsevents->Notify_ItemRemoved(idObj);
|
||
|
}
|
||
|
HRESULT Notify_ItemChanged(IUnknown * pobj)
|
||
|
{
|
||
|
CComQIPtr<IObjectsNotifications> pobjsevents((IObjects *) this);
|
||
|
|
||
|
if (pobjsevents == NULL)
|
||
|
return S_OK;
|
||
|
|
||
|
return pobjsevents->Notify_ItemChanged(pobj);
|
||
|
}
|
||
|
HRESULT Notify_ItemsChanged()
|
||
|
{
|
||
|
CComQIPtr<IObjectsNotifications> pobjsevents((IObjects *) this);
|
||
|
|
||
|
if (pobjsevents == NULL)
|
||
|
return S_OK;
|
||
|
|
||
|
return pobjsevents->Notify_ItemsChanged();
|
||
|
}
|
||
|
//
|
||
|
|
||
|
HRESULT GetRS(ADODB::_Recordset **pprs);
|
||
|
enum QueryType {Select, Delete};
|
||
|
HRESULT GetQuery(QueryType qtype, _bstr_t *pbstr);
|
||
|
|
||
|
HRESULT get_DB(CGuideDB **ppdb)
|
||
|
{
|
||
|
m_pdb.CopyTo(ppdb);
|
||
|
return S_OK;
|
||
|
}
|
||
|
HRESULT put_DB(CGuideDB *pdb)
|
||
|
{
|
||
|
m_pdb = pdb;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT put_ObjectType(CObjectType *pobjtype)
|
||
|
{
|
||
|
#if 0
|
||
|
return pobjtype->QueryInterface(__uuidof(CObjectType), (void **) &m_pobjtype);
|
||
|
#else
|
||
|
m_pobjtype = pobjtype;
|
||
|
return S_OK;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
HRESULT get_ObjectType(CObjectType **ppobjtype)
|
||
|
{
|
||
|
if ((*ppobjtype = m_pobjtype))
|
||
|
return S_OK;
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
HRESULT put_MetaPropertyCond(IMetaPropertyCondition *ppropcond)
|
||
|
{
|
||
|
m_ppropcond = ppropcond;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT InitRelation(IUnknown *pobj, long idRel, boolean fInverse)
|
||
|
{
|
||
|
m_pobjRelated = pobj;
|
||
|
m_idRel = idRel;
|
||
|
m_fInverse = fInverse;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT get_ItemsRelatedToBy(IUnknown *pobj, IMetaPropertyType *pproptype,
|
||
|
boolean fInverse, IObjects **ppobjs);
|
||
|
|
||
|
HRESULT Remove(IUnknown *pobj);
|
||
|
HRESULT RemoveFromRelationship(IUnknown *pobj);
|
||
|
HRESULT get_ItemsWithType(CObjectType *ptype, /*[out, retval]*/ IObjects * *pVal);
|
||
|
|
||
|
HRESULT put_Key(IMetaPropertyType *pproptype, IGuideDataProvider *pprovider,
|
||
|
long idLang, long vt)
|
||
|
{
|
||
|
CComQIPtr<CMetaPropertyType> pproptypeKey(pproptype);
|
||
|
|
||
|
m_idPropTypeKey = pproptypeKey->GetID();
|
||
|
|
||
|
if (pprovider != NULL)
|
||
|
{
|
||
|
CComQIPtr<CObject> pobj(pprovider);
|
||
|
pobj->get_ID(&m_idProviderKey);
|
||
|
}
|
||
|
m_idLangKey = idLang;
|
||
|
m_vtKey = vt;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
// IObjects
|
||
|
public:
|
||
|
STDMETHOD(Resync)()
|
||
|
{
|
||
|
return Reset();
|
||
|
}
|
||
|
STDMETHOD(UnreferencedItems)(/* [out, retval] */ IObjects **ppobjs);
|
||
|
STDMETHOD(RemoveAll)();
|
||
|
STDMETHOD(Reset)();
|
||
|
STDMETHOD(get_ItemsInverseRelatedToBy)(IUnknown *pobj, /* [in] */ IMetaPropertyType *pproptype, /*[out, retval]*/ IObjects **ppobjs);
|
||
|
|
||
|
STDMETHOD(get_ItemsRelatedToBy)(IUnknown *pobj, /* [in] */ IMetaPropertyType *pproptype, /*[out, retval]*/ IObjects **ppobjs);
|
||
|
|
||
|
STDMETHOD(get_ItemsInTimeRange)(DATE dtStart, DATE dtEnd, /*[out, retval]*/ IObjects * *pVal);
|
||
|
STDMETHOD(get_SQLQuery)(/*[out, retval]*/ BSTR *pbstr)
|
||
|
{
|
||
|
ENTER_API
|
||
|
{
|
||
|
ValidateOut(pbstr);
|
||
|
//UNDONE: Remove this method...just for debugging
|
||
|
|
||
|
_bstr_t bstr;
|
||
|
|
||
|
GetQuery(Select, &bstr);
|
||
|
|
||
|
*pbstr = bstr.copy();
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
LEAVE_API
|
||
|
}
|
||
|
|
||
|
STDMETHOD(Remove)(VARIANT varIndex);
|
||
|
STDMETHOD(AddAt)(IUnknown *pobj, long index);
|
||
|
STDMETHOD(get_AddNew)(/*[out, retval]*/ IUnknown * *pVal);
|
||
|
STDMETHOD(get_AddNewAt)(long index, /*[out, retval]*/ IUnknown * *pVal);
|
||
|
STDMETHOD(get_ItemsWithMetaPropertyCond)(IMetaPropertyCondition *ppropcond, /*[out, retval]*/ IObjects * *pVal);
|
||
|
STDMETHOD(get_ItemsWithMetaProperty)(IMetaProperty *pprop, /*[out, retval]*/ IObjects * *pVal);
|
||
|
STDMETHOD(get_ItemWithID)(long id, /*[out, retval]*/ IUnknown * *pVal);
|
||
|
STDMETHOD(get_ItemsWithType)(BSTR bstrCLSID, /*[out, retval]*/ IObjects * *pVal);
|
||
|
STDMETHOD(get_ItemWithKey)(VARIANT varIndex, /*[out, retval]*/ IUnknown * *pVal);
|
||
|
STDMETHOD(get_ItemsByKey)(IMetaPropertyType *pproptype, IGuideDataProvider *pprovider, long idLang, long vt, IObjects * *pVal);
|
||
|
STDMETHOD(get_Item)(VARIANT varIndex, /*[out, retval]*/ IUnknown * *pVal);
|
||
|
STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal);
|
||
|
#ifdef IMPLEMENT_NewEnum
|
||
|
STDMETHOD(get__NewEnum)(IUnknown **ppunk)
|
||
|
{
|
||
|
ENTER_API
|
||
|
{
|
||
|
ValidateOutPtr<IUnknown>(ppunk, NULL);
|
||
|
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
LEAVE_API
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
protected:
|
||
|
void CObjects::Copy(CObjects *pobjs)
|
||
|
{
|
||
|
m_pdb = pobjs->m_pdb;
|
||
|
m_ppropcond = pobjs->m_ppropcond;
|
||
|
m_pobjRelated = pobjs->m_pobjRelated;
|
||
|
m_idRel = pobjs->m_idRel;
|
||
|
m_fInverse = pobjs->m_fInverse;
|
||
|
m_fOnlyUnreferenced = pobjs->m_fOnlyUnreferenced;
|
||
|
m_idPropTypeKey = pobjs->m_idPropTypeKey;
|
||
|
m_idProviderKey = pobjs->m_idProviderKey;
|
||
|
m_idLangKey = pobjs->m_idLangKey;
|
||
|
}
|
||
|
|
||
|
CComPtr<CGuideDB> m_pdb;
|
||
|
|
||
|
// All items in this collection are of the type specified by m_pobjtype.
|
||
|
CObjectType *m_pobjtype;
|
||
|
|
||
|
CComPtr<IUnknown> m_punkCollection;
|
||
|
|
||
|
CComPtr<IMetaPropertyCondition> m_ppropcond;
|
||
|
|
||
|
// All the items in this collection are related (or inverse related) to
|
||
|
// m_pobjRelated by the relationship m_idRel.
|
||
|
CComPtr<IUnknown> m_pobjRelated;
|
||
|
long m_idRel;
|
||
|
boolean m_fInverse;
|
||
|
|
||
|
ADODB::_RecordsetPtr m_prs;
|
||
|
long m_cItems;
|
||
|
|
||
|
boolean m_fOnlyUnreferenced;
|
||
|
|
||
|
long m_idChanged;
|
||
|
long m_cChanged;
|
||
|
|
||
|
long m_idPropTypeKey;
|
||
|
long m_idProviderKey;
|
||
|
long m_idLangKey;
|
||
|
long m_vtKey;
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CObjectsGlue
|
||
|
|
||
|
template<class T_Collection, class T_Item>
|
||
|
class ATL_NO_VTABLE CObjectsGlue : public IObjectsNotifications
|
||
|
{
|
||
|
public:
|
||
|
typedef CObjectsGlue<T_Collection, T_Item> ThisClass;
|
||
|
CObjectsGlue()
|
||
|
{
|
||
|
}
|
||
|
~CObjectsGlue()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
// Thunks to IObjects interface of aggregated CLSID_Objects object.
|
||
|
HRESULT _Remove(VARIANT varIndex)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
|
||
|
hr = pobjs->Remove(varIndex);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT _RemoveAll()
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
|
||
|
return pobjs->RemoveAll();
|
||
|
}
|
||
|
|
||
|
HRESULT _Resync()
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
|
||
|
return pobjs->Resync();
|
||
|
}
|
||
|
|
||
|
HRESULT _get_AddNew(T_Item **ppobj)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IUnknown> pobj;
|
||
|
|
||
|
hr = pobjs->get_AddNew(&pobj);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
hr = pobj->QueryInterface(__uuidof(T_Item), (void **) ppobj);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT _get_AddNewAt(long index, T_Item **ppobj)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IUnknown> pobj;
|
||
|
|
||
|
hr = pobjs->get_AddNewAt(index, &pobj);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
hr = pobj->QueryInterface(__uuidof(T_Item), (void **) ppobj);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT _AddAt(T_Item *pobj, long index)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
|
||
|
hr = pobjs->AddAt(pobj, index);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT _get_Item(VARIANT varIndex, T_Item **ppobj)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IUnknown> pobj;
|
||
|
|
||
|
HRESULT hr = pobjs->get_Item(varIndex, &pobj);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobj->QueryInterface(__uuidof(T_Item), (void **) ppobj);
|
||
|
}
|
||
|
|
||
|
HRESULT _get_ItemWithID(long id, T_Item **ppobj)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IUnknown> pobj;
|
||
|
|
||
|
HRESULT hr = pobjs->get_ItemWithID(id, &pobj);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobj->QueryInterface(__uuidof(T_Item), (void **) ppobj);
|
||
|
}
|
||
|
|
||
|
HRESULT _get_ItemWithKey(VARIANT varKey, T_Item **ppobj)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IUnknown> pobj;
|
||
|
|
||
|
HRESULT hr = pobjs->get_ItemWithKey(varKey, &pobj);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobj->QueryInterface(__uuidof(T_Item), (void **) ppobj);
|
||
|
}
|
||
|
|
||
|
HRESULT _get_ItemsByKey(IMetaPropertyType *pproptype, IGuideDataProvider *pprovider, long idLang, long vt, T_Collection **ppobjs)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IObjects> pobjsNew;
|
||
|
|
||
|
HRESULT hr = pobjs->get_ItemsByKey(pproptype, pprovider, idLang, vt, &pobjsNew);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobjsNew->QueryInterface(__uuidof(T_Collection), (void **) ppobjs);
|
||
|
}
|
||
|
|
||
|
HRESULT _get_ItemsWithMetaPropertyCond(IMetaPropertyCondition *ppropcond, T_Collection **ppobjs)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IObjects> pobjsNew;
|
||
|
|
||
|
HRESULT hr = pobjs->get_ItemsWithMetaPropertyCond(ppropcond, &pobjsNew);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobjsNew->QueryInterface(__uuidof(T_Collection), (void **) ppobjs);
|
||
|
}
|
||
|
HRESULT _get_ItemsInTimeRange(DATE dtStart, DATE dtEnd, /*[out, retval]*/ T_Collection * *ppitems)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IObjects> pobjsNew;
|
||
|
|
||
|
hr = pobjs->get_ItemsInTimeRange(dtStart, dtEnd, &pobjsNew);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobjsNew->QueryInterface(__uuidof(T_Collection), (void **) ppitems);
|
||
|
}
|
||
|
HRESULT _get_ItemsWithMetaProperty(IMetaProperty *pprop, T_Collection * *ppobjs)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IObjects> pobjsNew;
|
||
|
|
||
|
HRESULT hr = pobjs->get_ItemsWithMetaProperty(pprop, &pobjsNew);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobjsNew->QueryInterface(__uuidof(T_Collection), (void **) ppobjs);
|
||
|
}
|
||
|
|
||
|
HRESULT _UnreferencedItems(T_Collection **ppobjs)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
CComPtr<IObjects> pobjsNew;
|
||
|
|
||
|
HRESULT hr = pobjs->UnreferencedItems(&pobjsNew);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
return pobjsNew->QueryInterface(__uuidof(T_Collection), (void **) ppobjs);
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT _get_Count(long *plCount)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
|
||
|
return pobjs->get_Count(plCount);
|
||
|
}
|
||
|
|
||
|
#ifdef IMPLEMENT_NewEnum
|
||
|
HRESULT _get__NewEnum(IUnknown **ppunk)
|
||
|
{
|
||
|
CComQIPtr<IObjects> pobjs(this);
|
||
|
|
||
|
return pobjs->get__NewEnum(ppunk);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
virtual IUnknown *GetControllingUnknown() = 0;
|
||
|
__declspec(property(get=GetDB)) CGuideDB *m_pdb;
|
||
|
CGuideDB *GetDB()
|
||
|
{
|
||
|
CComQIPtr<CObjects> pobjs(GetControllingUnknown());
|
||
|
|
||
|
return pobjs->GetDB();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
class CObjectPropertyBag :
|
||
|
public CComObjectRootEx<CComObjectThreadModel>,
|
||
|
#if SUPPORT_PROPBAG2
|
||
|
public IPropertyBag2,
|
||
|
#endif
|
||
|
public IPropertyBag
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
void Init(IMetaProperties *pprops, IMetaPropertyTypes *pproptypes)
|
||
|
{
|
||
|
m_pprops = pprops;
|
||
|
m_pproptypes = pproptypes;
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
IMetaProperty * GetProp(_bstr_t bstrPropName, boolean fCreate);
|
||
|
|
||
|
BEGIN_COM_MAP(CObjectPropertyBag)
|
||
|
COM_INTERFACE_ENTRY(IPropertyBag)
|
||
|
#if SUPPORT_PROPBAG2
|
||
|
COM_INTERFACE_ENTRY(IPropertyBag2)
|
||
|
#endif
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// IPropertyBag interface
|
||
|
STDMETHOD(Read)(LPCOLESTR pszPropName, VARIANT *pvar, IErrorLog *pErrorLog);
|
||
|
STDMETHOD(Write)(LPCOLESTR pszPropName, VARIANT *pvar);
|
||
|
|
||
|
#if SUPPORT_PROPBAG2
|
||
|
// IPropertyBag2 interface
|
||
|
STDMETHOD(CountProperties)(long *plCount);
|
||
|
STDMETHOD(GetPropertyInfo)(ULONG iProp, ULONG cProps, PROPBAG2 *ppropbag2, ULONG *pcProps);
|
||
|
STDMETHOD(LoadObject)(LPCOLESTR pstrName, DWORD dwHint, IUnknown *punk, IErrorLog *perrlog);
|
||
|
STDMETHOD(Read)(ULONG cProps, PROPBAG2 *ppropbag2, IErrorLog *perrlog, VARIANT *rgvar, HRESULT *phr);
|
||
|
STDMETHOD(Write)(ULONG cProps, PROPBAG2 *ppropbag2, VARIANT *rgvar);
|
||
|
#endif
|
||
|
|
||
|
protected:
|
||
|
CComPtr<IMetaProperties> m_pprops;
|
||
|
CComPtr<IMetaPropertyTypes> m_pproptypes;
|
||
|
};
|
||
|
|
||
|
#endif //__Object_H_
|