Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
5.8 KiB

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#ifdef AFXCTL_CORE3_SEG
#pragma code_seg(AFXCTL_CORE3_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
/////////////////////////////////////////////////////////////////////////////
// Connection map
BEGIN_CONNECTION_MAP(COleControl, CCmdTarget)
CONNECTION_PART(COleControl, IID_IPropertyNotifySink, PropConnPt)
END_CONNECTION_MAP()
/////////////////////////////////////////////////////////////////////////////
// COleControl::GetConnectionHook - override the connection map
LPCONNECTIONPOINT COleControl::GetConnectionHook(REFIID iid)
{
if ((m_piidEvents != NULL) && IsEqualIID(iid, *m_piidEvents))
return (LPCONNECTIONPOINT)((char*)&m_xEventConnPt +
offsetof(CConnectionPoint, m_xConnPt));
else
return NULL;
}
/////////////////////////////////////////////////////////////////////////////
// COleControl::GetExtraConnectionPoints - override the connection map
BOOL COleControl::GetExtraConnectionPoints(CPtrArray* pConnPoints)
{
pConnPoints->Add((char*)&m_xEventConnPt +
offsetof(CConnectionPoint, m_xConnPt));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// COleControl::XProvideClassInfo
STDMETHODIMP_(ULONG) COleControl::XProvideClassInfo::AddRef()
{
METHOD_PROLOGUE_EX_(COleControl, ProvideClassInfo)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) COleControl::XProvideClassInfo::Release()
{
METHOD_PROLOGUE_EX_(COleControl, ProvideClassInfo)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP COleControl::XProvideClassInfo::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControl, ProvideClassInfo)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControl::XProvideClassInfo::GetClassInfo(
LPTYPEINFO* ppTypeInfo)
{
METHOD_PROLOGUE_EX(COleControl, ProvideClassInfo)
CLSID clsid;
pThis->GetClassID(&clsid);
return pThis->GetTypeInfoOfGuid(GetUserDefaultLCID(), clsid, ppTypeInfo);
}
STDMETHODIMP COleControl::XProvideClassInfo::GetGUID(DWORD dwGuidKind,
GUID* pGUID)
{
METHOD_PROLOGUE_EX_(COleControl, ProvideClassInfo)
if (dwGuidKind == GUIDKIND_DEFAULT_SOURCE_DISP_IID)
{
*pGUID = *pThis->m_piidEvents;
return NOERROR;
}
else
{
*pGUID = GUID_NULL;
return E_INVALIDARG;
}
}
/////////////////////////////////////////////////////////////////////////////
// COleControl::XEventConnPt
void COleControl::XEventConnPt::OnAdvise(BOOL bAdvise)
{
METHOD_PROLOGUE_EX(COleControl, EventConnPt)
pThis->OnEventAdvise(bAdvise);
}
REFIID COleControl::XEventConnPt::GetIID()
{
METHOD_PROLOGUE_EX_(COleControl, EventConnPt)
if (pThis->m_piidEvents != NULL)
return *(pThis->m_piidEvents);
else
return GUID_NULL;
}
/////////////////////////////////////////////////////////////////////////////
// COleControl::OnEventAdvise - called by XEventConnPt::OnAdvise
void COleControl::OnEventAdvise(BOOL)
{
// May be overridden by subclass
}
/////////////////////////////////////////////////////////////////////////////
// AfxConnectionAdvise
BOOL AFXAPI AfxConnectionAdvise(LPUNKNOWN pUnkSrc, REFIID iid,
LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD* pdwCookie)
{
ASSERT_POINTER(pUnkSrc, IUnknown);
ASSERT_POINTER(pUnkSink, IUnknown);
ASSERT_POINTER(pdwCookie, DWORD);
BOOL bSuccess = FALSE;
LPCONNECTIONPOINTCONTAINER pCPC;
if (SUCCEEDED(pUnkSrc->QueryInterface(
IID_IConnectionPointContainer,
(LPVOID*)&pCPC)))
{
ASSERT_POINTER(pCPC, IConnectionPointContainer);
LPCONNECTIONPOINT pCP;
if (SUCCEEDED(pCPC->FindConnectionPoint(iid, &pCP)))
{
ASSERT_POINTER(pCP, IConnectionPoint);
if (SUCCEEDED(pCP->Advise(pUnkSink, pdwCookie)))
bSuccess = TRUE;
pCP->Release();
// The connection point just AddRef'ed us. If we don't want to
// keep this reference count (because it would prevent us from
// being deleted; our reference count wouldn't go to zero), then
// we need to cancel the effects of the AddRef by calling
// Release.
if (bSuccess && !bRefCount)
pUnkSink->Release();
}
pCPC->Release();
}
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////
// AfxConnectionUnadvise
BOOL AFXAPI AfxConnectionUnadvise(LPUNKNOWN pUnkSrc, REFIID iid,
LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD dwCookie)
{
ASSERT_POINTER(pUnkSrc, IUnknown);
ASSERT_POINTER(pUnkSink, IUnknown);
// When we call Unadvise, the connection point will Release us. If we
// didn't keep the reference count when we called Advise, we need to
// AddRef now, to keep our reference count consistent. Note that if
// the Unadvise fails, then we need to undo this extra AddRef by
// calling Release before we return.
if (!bRefCount)
pUnkSink->AddRef();
BOOL bSuccess = FALSE;
LPCONNECTIONPOINTCONTAINER pCPC;
if (SUCCEEDED(pUnkSrc->QueryInterface(
IID_IConnectionPointContainer,
(LPVOID*)&pCPC)))
{
ASSERT_POINTER(pCPC, IConnectionPointContainer);
LPCONNECTIONPOINT pCP;
if (SUCCEEDED(pCPC->FindConnectionPoint(iid, &pCP)))
{
ASSERT_POINTER(pCP, IConnectionPoint);
if (SUCCEEDED(pCP->Unadvise(dwCookie)))
bSuccess = TRUE;
pCP->Release();
}
pCPC->Release();
}
// If we failed, undo the earlier AddRef.
if (!bRefCount && !bSuccess)
pUnkSink->Release();
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////
// Force any extra compiler-generated code into AFX_INIT_SEG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif