windows-nt/Source/XPSP1/NT/com/ole32/stg/exp/astgconn.hxx
2020-09-26 16:20:57 +08:00

183 lines
4.3 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1996.
//
// File: astgconn.hxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 28-Mar-96 PhilipLa Created
//
//----------------------------------------------------------------------------
#ifndef __ASTGCONN_HXX__
#define __ASTGCONN_HXX__
#ifdef ASYNC
#include <sinklist.hxx>
#endif
#include <ocidl.h>
interface IDocfileAsyncConnectionPoint;
//+---------------------------------------------------------------------------
//
// Class: CAsyncConnection
//
// Purpose: Provide connection point for objects operating in async
// docfile.
//
// History: 28-Mar-96 PhilipLa Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CAsyncConnection: public IConnectionPoint
{
public:
inline CAsyncConnection();
SCODE Init(IConnectionPointContainer *pCPC,
CAsyncConnection *pacParent);
SCODE InitClone(IConnectionPointContainer *pCPC,
CAsyncConnection *pac);
SCODE InitMarshal(IConnectionPointContainer *pCPC,
DWORD dwAsyncFlags,
IDocfileAsyncConnectionPoint *pdacp);
~CAsyncConnection();
//From IUnknown
STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
STDMETHOD_(ULONG,AddRef)(void);
STDMETHOD_(ULONG,Release)(void);
//From IConnectionPoint
STDMETHOD(GetConnectionInterface)(IID *pIID);
STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer ** ppCPC);
STDMETHOD(Advise)(IUnknown *pUnkSink, DWORD *pdwCookie);
STDMETHOD(Unadvise)(DWORD dwCookie);
STDMETHOD(EnumConnections)(IEnumConnections **ppEnum);
SCODE Init(void);
SCODE Notify(SCODE scFailure,
ILockBytes *pilb,
CPerContext *ppc,
CSafeSem *pss);
inline BOOL IsInitialized(void) const;
inline IDocfileAsyncConnectionPoint * GetMarshalPoint(void);
inline void SetAsyncFlags(DWORD dwAsyncFlags);
inline DWORD GetAsyncFlags(void) const;
private:
IConnectionPointContainer *_pCPC;
IDocfileAsyncConnectionPoint *_pdacp;
DWORD _dwAsyncFlags;
LONG _cReferences;
};
inline CAsyncConnection::CAsyncConnection()
{
_pCPC = NULL;
_cReferences = 1;
_pdacp = NULL;
_dwAsyncFlags = 0;
}
inline void CAsyncConnection::SetAsyncFlags(DWORD dwAsyncFlags)
{
_dwAsyncFlags = dwAsyncFlags;
}
inline DWORD CAsyncConnection::GetAsyncFlags(void) const
{
return _dwAsyncFlags;
}
inline BOOL CAsyncConnection::IsInitialized(void) const
{
return (_pdacp != NULL);
}
inline IDocfileAsyncConnectionPoint * CAsyncConnection::GetMarshalPoint(void)
{
return _pdacp;
}
class __declspec(novtable)
CAsyncConnectionContainer: public IConnectionPointContainer
{
public:
SCODE InitConnection(CAsyncConnection *pacParent);
SCODE InitClone(CAsyncConnection *pac);
SCODE InitMarshal(IDocfileAsyncConnectionPoint *pdacp);
inline void SetAsyncFlags(DWORD dwAsyncFlags);
//From IConnectionPointContainer
STDMETHOD(EnumConnectionPoints)(IEnumConnectionPoints **ppEnum);
STDMETHOD(FindConnectionPoint)(REFIID iid, IConnectionPoint **ppCP);
protected:
inline IDocfileAsyncConnectionPoint * GetMarshalPoint(void);
CAsyncConnection _cpoint;
};
inline void CAsyncConnectionContainer::SetAsyncFlags(DWORD dwAsyncFlags)
{
_cpoint.SetAsyncFlags(dwAsyncFlags);
}
inline IDocfileAsyncConnectionPoint *
CAsyncConnectionContainer::GetMarshalPoint(void)
{
return _cpoint.GetMarshalPoint();
}
#ifdef ASYNC
#define BEGIN_PENDING_LOOP \
do \
{
//Note: There is a return in this macro. Cleanup needs to be done
// before the macro is used.
#define END_PENDING_LOOP \
if (!ISPENDINGERROR(sc)) \
{ \
break; \
} \
else \
{ \
SCODE sc2; \
sc2 = _cpoint.Notify(sc, \
_ppc->GetBase(), \
_ppc, \
&_ss); \
if (sc2 != S_OK) \
{ \
return ResultFromScode(sc2); \
} \
} \
} while (TRUE);
#else
#define BEGIN_PENDING_LOOP
#define END_PENDING_LOOP
#endif
#endif // #ifndef __ASTGCONN_HXX__