mirror of https://github.com/lianthony/NT4.0
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.
147 lines
3.0 KiB
147 lines
3.0 KiB
/*-----------------------------------------------------------------**
|
|
** Implementation file for Internet Explorer OLE container support **
|
|
** **
|
|
** Author: Phil Cooper **
|
|
** Creation date: 08-27-95 **
|
|
**-----------------------------------------------------------------*/
|
|
|
|
#include "project.hpp"
|
|
#pragma hdrstop
|
|
|
|
#include <initguid.h>
|
|
#include <olectl.h>
|
|
|
|
#include "olepig.h"
|
|
#include "contain.hpp"
|
|
|
|
CContainer *g_Container = NULL;
|
|
extern PRIVATE_DATA POLEVTBL Mpolevtbl;
|
|
|
|
CContainer::CContainer()
|
|
{
|
|
_dwRef = 0;
|
|
_pSites.RemoveAll(); // Initialize to zero elements
|
|
|
|
_pIOleContainer = NULL;
|
|
_pIOleInPlaceFrame = NULL;
|
|
}
|
|
|
|
CContainer::~CContainer()
|
|
{
|
|
_pSites.RemoveAll();
|
|
|
|
ASSERT(_pIOleContainer != NULL && _pIOleContainer->GetRef() == 0);
|
|
ASSERT(_pIOleInPlaceFrame != NULL && _pIOleInPlaceFrame->GetRef() == 0);
|
|
|
|
SAFEDELETE(_pIOleContainer);
|
|
SAFEDELETE(_pIOleInPlaceFrame);
|
|
}
|
|
|
|
HRESULT CContainer::Init()
|
|
{
|
|
HRESULT hr = E_OUTOFMEMORY;
|
|
|
|
_pIOleContainer = new (COleContainer(this));
|
|
_pIOleInPlaceFrame = new (COleInPlaceFrame(this));
|
|
|
|
if ((_pIOleInPlaceFrame == NULL) || (_pIOleContainer == NULL))
|
|
goto cleanup;
|
|
|
|
AddRef(); // Stick around, Jack!
|
|
return S_OK;
|
|
|
|
cleanup:
|
|
SAFERELEASE(_pIOleContainer);
|
|
SAFERELEASE(_pIOleInPlaceFrame);
|
|
return hr;
|
|
}
|
|
|
|
BOOL CContainer::IsValid()
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
_pSites.AssertValid();
|
|
#endif
|
|
|
|
return ((_pIOleInPlaceFrame != NULL) && (_pIOleContainer != NULL));
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CContainer::AddRef(void)
|
|
{
|
|
return ++_dwRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CContainer::Release(void)
|
|
{
|
|
if (--_dwRef == 0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return _dwRef;
|
|
}
|
|
|
|
STDMETHODIMP CContainer::QueryInterface(REFIID riid, LPVOID *ppvObj)
|
|
{
|
|
// ppvObj must not be NULL
|
|
ASSERT(ppvObj != NULL);
|
|
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown))
|
|
*ppvObj = this;
|
|
else if (IsEqualIID(riid, IID_IOleInPlaceFrame))
|
|
*ppvObj = _pIOleInPlaceFrame;
|
|
else if (IsEqualIID(riid, IID_IOleInPlaceUIWindow))
|
|
*ppvObj = _pIOleInPlaceFrame;
|
|
else if (IsEqualIID(riid, IID_IOleContainer))
|
|
*ppvObj = _pIOleContainer;
|
|
else
|
|
return E_NOINTERFACE;
|
|
|
|
if (*ppvObj != NULL) // Should always be non-null, but just to be safe...
|
|
((LPUNKNOWN)*ppvObj)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CContainer::AddSite(CSite *pSite, LISTPOSITION *SiteCookie)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// Add a pointer to the embedded object's IOleObject interface
|
|
*SiteCookie = _pSites.AddTail(pSite);
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CContainer::DeleteSite(LISTPOSITION *SiteCookie)
|
|
{
|
|
ASSERT(SiteCookie != NULL);
|
|
if (*SiteCookie != NULL)
|
|
{
|
|
_pSites.RemoveAt(*SiteCookie);
|
|
*SiteCookie = NULL;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT InitializeContainer(void)
|
|
{
|
|
if (!g_Container)
|
|
{
|
|
if (SUCCEEDED(LoadOLE()))
|
|
{
|
|
g_Container = new (CContainer());
|
|
if (g_Container == NULL)
|
|
return E_OUTOFMEMORY;
|
|
return g_Container->Init();
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
void DestroyContainer(void)
|
|
{
|
|
SAFERELEASE(g_Container); // Bye Bye!!
|
|
}
|
|
|