#ifndef __AGCEventData_h__
#define __AGCEventData_h__
#include <AGC.h>
#include "AGCEvent.h"
class CAGCEventData
{
public:
typedef CAGCEvent::XProperties XProperties;
private:
CAGCEventData(const CAGCEventData&); public:
CAGCEventData(UINT cbData, BYTE* pbData);
CAGCEventData(AGCEventID idEvent, LPCSTR pszContext, LPCOLESTR pszSubject,
long idSubject, long cArgTriplets, va_list argptr);
~CAGCEventData();
void Attach(UINT cbData, BYTE* pbData);
BYTE* Detach(UINT* pcbData = NULL);
public:
AGCEventID GetEventID() const;
DATE GetTime () const;
long GetSubjectID() const;
long GetArgCount () const;
void GetVarData (BSTR* pbstrContext, BSTR* pbstrSubject,
XProperties* pProperties) const;
protected:
static UINT ComputeVariableDataSize(LPCSTR pszContext,
LPCOLESTR pszSubject, long cArgTriplets, va_list argptr);
void CopyVariableData(LPCSTR pszContext, LPCOLESTR pszSubject,
long cArgTriplets, va_list argptr);
static UINT CreateVARIANTFromData(BYTE* pbData, CComVariant& var);
static UINT CreateBSTRFromData(BYTE* pbData, BSTR* pbstr);
static UINT CreateBSTRFromData_LPSTR(BYTE* pbData, BSTR* pbstr);
static UINT CreateBSTRFromData_LPWSTR(BYTE* pbData, BSTR* pbstr);
static UINT CreateObjectFromData(BYTE* pbData, REFIID riid, void** ppvUnk);
protected:
#pragma pack(push, 4)
struct XData
{
AGCEventID m_id;
DATE m_time;
long m_idSubject;
long m_cArgTriplets;
};
#pragma pack(pop)
protected:
UINT m_cbData;
BYTE* m_pbData;
};
inline CAGCEventData::CAGCEventData(UINT cbData, BYTE* pbData) :
m_cbData(0),
m_pbData(NULL)
{
Attach(cbData, pbData);
}
inline CAGCEventData::CAGCEventData(AGCEventID idEvent, LPCSTR pszContext,
LPCOLESTR pszSubject, long idSubject, long cArgTriplets, va_list argptr) :
m_cbData(0),
m_pbData(NULL)
{
m_cbData = ComputeVariableDataSize(pszContext, pszSubject, cArgTriplets, argptr);
m_cbData += sizeof(XData);
m_pbData = new BYTE[m_cbData];
assert(m_pbData);
XData* pFixed = reinterpret_cast<XData*>(m_pbData);
pFixed->m_id = idEvent;
pFixed->m_time = GetVariantDateTime();
pFixed->m_idSubject = idSubject;
pFixed->m_cArgTriplets = cArgTriplets;
CopyVariableData(pszContext, pszSubject, cArgTriplets, argptr);
}
inline CAGCEventData::~CAGCEventData()
{
delete [] Detach();
}
inline void CAGCEventData::Attach(UINT cbData, BYTE* pbData)
{
delete [] Detach();
m_cbData = cbData;
m_pbData = pbData;
}
inline BYTE* CAGCEventData::Detach(UINT* pcbData)
{
if (pcbData)
*pcbData = m_cbData;
BYTE* pbData = m_pbData;
m_cbData = 0;
m_pbData = NULL;
return pbData;
}
inline AGCEventID CAGCEventData::GetEventID() const
{
assert(m_pbData && m_cbData >= sizeof(XData));
XData* pData = reinterpret_cast<XData*>(m_pbData);
return pData->m_id;
}
inline DATE CAGCEventData::GetTime() const
{
assert(m_pbData && m_cbData >= sizeof(XData));
XData* pData = reinterpret_cast<XData*>(m_pbData);
return pData->m_time;
}
inline long CAGCEventData::GetSubjectID() const
{
assert(m_pbData && m_cbData >= sizeof(XData));
XData* pData = reinterpret_cast<XData*>(m_pbData);
return pData->m_idSubject;
}
inline long CAGCEventData::GetArgCount() const
{
assert(m_pbData && m_cbData >= sizeof(XData));
XData* pData = reinterpret_cast<XData*>(m_pbData);
return pData->m_cArgTriplets;
}
#endif