132 lines
4.5 KiB
C
132 lines
4.5 KiB
C
|
// Msg.h : Declaration of the CMsg
|
||
|
|
||
|
#ifndef __MSG_H_
|
||
|
#define __MSG_H_
|
||
|
|
||
|
#include "imsg.h"
|
||
|
#include "props.h"
|
||
|
|
||
|
|
||
|
// This template is used for declaring objects on the stack. It is just like
|
||
|
// CComObjectStack<>, except that it does not assert on Addref(), Release(), or
|
||
|
// QueryInterface().
|
||
|
template <class Base>
|
||
|
class CComObjectStackLoose : public Base
|
||
|
{
|
||
|
public:
|
||
|
CComObjectStackLoose() { m_dwRef=1; };
|
||
|
~CComObjectStackLoose() { FinalRelease(); };
|
||
|
STDMETHOD_(ULONG, AddRef)() { return (InternalAddRef()); };
|
||
|
STDMETHOD_(ULONG, Release)() {return (InternalRelease()); };
|
||
|
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
|
||
|
{ return _InternalQueryInterface(iid,ppvObject); }
|
||
|
};
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMsg
|
||
|
class ATL_NO_VTABLE __declspec(uuid("2DF59670-3D15-11d1-AA51-00AA006BC80B")) CMsg :
|
||
|
public CComObjectRoot,
|
||
|
// public CComCoClass<CMsg, &CLSID_Msg>,
|
||
|
public ISupportErrorInfo,
|
||
|
public IDispatchImpl<IMsg, &IID_IMsg, &LIBID_IMSGLib>,
|
||
|
public IMsgLog
|
||
|
{
|
||
|
public:
|
||
|
HRESULT FinalConstruct();
|
||
|
void FinalRelease();
|
||
|
void Init(CGenericPTable *pPTable, LPVOID pDefaultContext=NULL);
|
||
|
static HRESULT CreateInstance(CGenericPTable *pPTable, LPVOID pDefaultContext, CMsg **ppCMsg);
|
||
|
void SetLogging(LPVOID pvLogHandle, DWORD (*pLogInformation)(LPVOID,const INETLOG_INFORMATION *));
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(CMsg);
|
||
|
DECLARE_PROTECT_FINAL_CONSTRUCT();
|
||
|
|
||
|
// DECLARE_REGISTRY_RESOURCEID_EX(IDR_StdAfx,
|
||
|
// L"SMTP CMsg Class",
|
||
|
// L"SMTP.CMsg.1",
|
||
|
// L"SMTP.CMsg");
|
||
|
|
||
|
DECLARE_GET_CONTROLLING_UNKNOWN();
|
||
|
|
||
|
BEGIN_COM_MAP(CMsg)
|
||
|
COM_INTERFACE_ENTRY(IMsg)
|
||
|
COM_INTERFACE_ENTRY(IMsgLog)
|
||
|
COM_INTERFACE_ENTRY(IDispatch)
|
||
|
COM_INTERFACE_ENTRY(ISupportErrorInfo)
|
||
|
COM_INTERFACE_ENTRY_IID(__uuidof(CMsg),CMsg)
|
||
|
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// ISupportsErrorInfo
|
||
|
public:
|
||
|
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
|
||
|
|
||
|
// IMsg
|
||
|
public:
|
||
|
STDMETHOD(SetInterfaceW)(LPCWSTR pszName, IUnknown *punkValue);
|
||
|
STDMETHOD(SetInterfaceA)(LPCSTR pszName, IUnknown *punkValue);
|
||
|
// STDMETHOD(GetInterfaceW)(LPCWSTR pszName, IUnknown **ppunkResult);
|
||
|
// STDMETHOD(GetInterfaceA)(LPCSTR pszName, IUnknown **ppunkResult);
|
||
|
STDMETHOD(GetInterfaceW)(LPCWSTR pszName, const GUID &guid, IUnknown **ppunkResult);
|
||
|
STDMETHOD(GetInterfaceA)(LPCSTR pszName, const GUID &guid, IUnknown **ppunkResult);
|
||
|
STDMETHOD(SetDwordW)(LPCWSTR pszName, DWORD dwValue);
|
||
|
STDMETHOD(SetDwordA)(LPCSTR pszName, DWORD dwValue);
|
||
|
STDMETHOD(GetDwordW)(LPCWSTR pszName, DWORD *pdwResult);
|
||
|
STDMETHOD(GetDwordA)(LPCSTR pszName, DWORD *pdwResult);
|
||
|
STDMETHOD(SetStringW)(LPCWSTR pszName, DWORD chCount, LPCWSTR pszValue);
|
||
|
STDMETHOD(SetStringA)(LPCSTR pszName, DWORD chCount, LPCSTR pszValue);
|
||
|
STDMETHOD(GetStringW)(LPCWSTR pszName, DWORD *pchCount, LPWSTR pszResult);
|
||
|
STDMETHOD(GetStringA)(LPCSTR pszName, DWORD *pchCount, LPSTR pszResult);
|
||
|
STDMETHOD(SetVariantW)(LPCWSTR pszName, VARIANT *pvarValue);
|
||
|
STDMETHOD(SetVariantA)(LPCSTR pszName, VARIANT *pvarValue);
|
||
|
STDMETHOD(GetVariantW)(LPCWSTR pszName, VARIANT *pvarResult);
|
||
|
STDMETHOD(GetVariantA)(LPCSTR pszName, VARIANT *pvarResult);
|
||
|
STDMETHOD(get_Value)(BSTR bstrValue, /*[out, retval]*/ VARIANT *pVal);
|
||
|
STDMETHOD(put_Value)(BSTR bstrValue, /*[in]*/ VARIANT newVal);
|
||
|
|
||
|
// This method is called by the source after all sink processing
|
||
|
// to commit all changes to the media. Only changed properties
|
||
|
// are updated.
|
||
|
BOOL CommitChanges() { return(m_PTable.CommitChanges() == S_OK?TRUE:FALSE); }
|
||
|
|
||
|
// This method is called by the source to rollback
|
||
|
BOOL Rollback() { return(m_PTable.Invalidate() == S_OK?TRUE:FALSE); }
|
||
|
|
||
|
// IMsgLog
|
||
|
public:
|
||
|
STDMETHOD(WriteToLog)(LPCSTR pszClientHostName,
|
||
|
LPCSTR pszClientUserName,
|
||
|
LPCSTR pszServerAddress,
|
||
|
LPCSTR pszOperation,
|
||
|
LPCSTR pszTarget,
|
||
|
LPCSTR pszParameters,
|
||
|
LPCSTR pszVersion,
|
||
|
DWORD dwBytesSent,
|
||
|
DWORD dwBytesReceived,
|
||
|
DWORD dwProcessingTimeMS,
|
||
|
DWORD dwWin32Status,
|
||
|
DWORD dwProtocolStatus,
|
||
|
DWORD dwPort,
|
||
|
LPCSTR pszHTTPHeader);
|
||
|
|
||
|
private:
|
||
|
// We have an instance of CPropertyTable
|
||
|
CPropertyTable m_PTable; // Property table
|
||
|
LPVOID m_pContext; // Context pointer
|
||
|
CComPtr<IUnknown> m_pUnkMarshaler;
|
||
|
DWORD (*m_pLogInformation)(LPVOID,const INETLOG_INFORMATION *);
|
||
|
LPVOID m_pvLogHandle;
|
||
|
};
|
||
|
|
||
|
|
||
|
class CMsgStack : public CComObjectStackLoose<CMsg> {
|
||
|
public:
|
||
|
CMsgStack(CGenericPTable *pPTable, LPVOID pDefaultContext=NULL) {
|
||
|
Init(pPTable,pDefaultContext);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif //__MSG_H_
|