2020-09-30 17:12:29 +02:00

144 lines
5.7 KiB
C++

//+-------------------------------------------------------------------
//
// File: stdid.hxx
//
// Contents: identity object and creation function
//
// History: 1-Dec-93 CraigWi Created
//
//--------------------------------------------------------------------
#ifndef _STDID_HXX_
#define _STDID_HXX_
#include <marshal.hxx> // CStdMarshal
#include <idtable.hxx> // IDTable APIs
#include <srvhdl.h>
#include <security.hxx> // CClientSecurity
#define DECLARE_INTERNAL_UNK() \
class CInternalUnk : public IInternalUnknown, public IMultiQI \
{ \
public: \
/* IUnknown methods */ \
STDMETHOD(QueryInterface)(REFIID riid, VOID **ppv); \
STDMETHOD_(ULONG,AddRef)(void) ; \
STDMETHOD_(ULONG,Release)(void); \
\
/* IInternalUnknown methods */ \
STDMETHOD(QueryInternalInterface)(REFIID riid, VOID **ppv); \
\
/* IMultiQI methods */ \
STDMETHOD(QueryMultipleInterfaces)(ULONG cMQIs, MULTI_QI *pMQIs); \
}; \
friend CInternalUnk; \
CInternalUnk m_InternalUnk;
typedef enum tagSTDID_FLAGS
{
STDID_SERVER = 0x0, // on server side
STDID_CLIENT = 0x1, // on client side (non-local in RH terms)
STDID_FREETHREADED = 0x2, // this object is callable on any thread
STDID_HAVEID = 0x4, // have an OID in the table
STDID_IGNOREID = 0x8, // dont put OID in the table
STDID_AGGREGATED = 0x10, // dont put OID in the table
STDID_INDESTRUCTOR = 0x100,// dtor entered; assert on AddRef and others
STDID_LOCKEDINMEM = 0x200,// dont delete this object regardless of refcnt
} STDID_FLAGS;
class CStdIdentity : public IProxyManager, public CStdMarshal,
public CClientSecurity
{
public:
CStdIdentity(DWORD flags, IUnknown *pUnkOuter, IUnknown *pUnkControl,
IUnknown **ppUnkInternal);
~CStdIdentity();
// IUnknown
STDMETHOD(QueryInterface) (REFIID riid, LPVOID *ppvObj);
STDMETHOD_(ULONG,AddRef) (void);
STDMETHOD_(ULONG,Release) (void);
// IProxyManager (only if client side)
STDMETHOD(CreateServer)(REFCLSID rclsid, DWORD clsctx, void *pv);
STDMETHOD_(BOOL, IsConnected)(void);
STDMETHOD(LockConnection)(BOOL fLock, BOOL fLastUnlockReleases);
STDMETHOD_(void, Disconnect)();
STDMETHOD(CreateServerWithHandler)(REFCLSID rclsid, DWORD clsctx, void *pv,
REFCLSID rclsidHandler, IID iidSrv, void **ppv,
IID iidClnt, void *pClientSiteInterface);
IUnknown *GetCtrlUnk(void) { return m_pUnkControl; };
IUnknown *GetServer();
void ReleaseCtrlUnk(void);
REFMOID GetOID (void) { return m_moid; }
HRESULT SetOID (REFMOID rmoid);
void IgnoreOID (void) { m_flags |= STDID_IGNOREID; }
void RevokeOID (void);
ULONG GetRC (void) { return m_refs; }
BOOL IsFreeThreaded(void) { return m_flags & STDID_FREETHREADED; }
BOOL IsAggregated(void) { return m_flags & STDID_AGGREGATED; }
void SetLockedInMemory() { m_flags |= STDID_LOCKEDINMEM; }
ULONG UnlockAndRelease(void);
// methods to manipulate the strong reference count.
void IncStrongCnt();
void DecStrongCnt(BOOL fKeepAlive);
// method used by CoLockObjectExternal
HRESULT LockObjectExternal(BOOL fLock, BOOL fLastUR);
// internal unknown
DECLARE_INTERNAL_UNK()
friend INTERNAL CreateIdentityHandler(IUnknown *pUnkOuter,
DWORD flags, REFIID riid, void **ppv);
friend INTERNAL_(void) IDTableThreadUninitializeHelper(DWORD);
#if DBG == 1
void AssertValid();
CStdIdentity(); // debug ctor for debug list head
#else
void AssertValid() { }
#endif
private:
BOOL IsClient() { return m_flags & STDID_CLIENT; }
void SetNowInDestructor() { m_flags |= STDID_INDESTRUCTOR; }
BOOL IsInDestructor() { return m_flags & STDID_INDESTRUCTOR; }
BOOL IsLockedOrInDestructor(){ return (m_flags & (STDID_INDESTRUCTOR |
STDID_LOCKEDINMEM)); }
DWORD m_refs; // number of pointer refs
DWORD m_flags; // see STDID_* values above; set once.
IUnknown *m_pUnkOuter; // controlling unknown; set once.
IUnknown *m_pUnkControl; // the controlling unk of the object;
// this member has three possible values:
// pUnkOuter - client side; not addref'd
// pUnkControl - server side (which may
// be pUnkOuter if aggregated); addref'd
// NULL - server side, disconnected
MOID m_moid; // the identity (OID + MID)
IExternalConnection *m_pIEC;// of the server if supported
LONG m_cStrongRefs; // count of strong references
#if DBG==1
CStdIdentity *m_pNext; // double chain list of instantiated
CStdIdentity *m_pPrev; // identity objects for debugging
#endif // DBG
};
#endif // _STDID_HXX