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.
270 lines
7.6 KiB
270 lines
7.6 KiB
/*****************************************************************/
|
|
/** Microsoft **/
|
|
/** Copyright (C) Microsoft Corp., 1991-1998 **/
|
|
/*****************************************************************/
|
|
|
|
//
|
|
// FACTORY.CPP -
|
|
//
|
|
|
|
// HISTORY:
|
|
//
|
|
// 07/28/98 donaldm created
|
|
//
|
|
|
|
#include "pre.h"
|
|
#include "webvwids.h"
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Implementation the ClassFactory Class Factory. CFWebView is the COM
|
|
object class for the Class Factory that can manufacture CLSID_ICWWEBVIEW
|
|
COM Components.
|
|
---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Method: ClassFactory::ClassFactory
|
|
|
|
Summary:
|
|
Args:
|
|
CServer* pServer)
|
|
Pointer to the server's control object.
|
|
|
|
Modifies: m_cRefs
|
|
|
|
Returns: void
|
|
---------------------------------------------------------------------------*/
|
|
ClassFactory::ClassFactory
|
|
(
|
|
CServer * pServer,
|
|
CLSID const* pclsid
|
|
)
|
|
{
|
|
// Zero the COM object's reference count.
|
|
m_cRefs = 0;
|
|
|
|
// Init the pointer to the server control object.
|
|
m_pServer = pServer;
|
|
|
|
// Keep track of the class type we need to create
|
|
m_pclsid = pclsid;
|
|
return;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Method: ClassFactory::~ClassFactory
|
|
|
|
Summary: ClassFactory Destructor.
|
|
|
|
Args: void
|
|
|
|
Modifies: .
|
|
|
|
Returns: void
|
|
---------------------------------------------------------------------------*/
|
|
ClassFactory::~ClassFactory(void)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Method: ClassFactory::QueryInterface
|
|
|
|
Summary: QueryInterface of the ClassFactory non-delegating
|
|
IUnknown implementation.
|
|
|
|
Args: REFIID riid,
|
|
[in] GUID of the Interface being requested.
|
|
void ** ppv)
|
|
[out] Address of the caller's pointer variable that will
|
|
receive the requested interface pointer.
|
|
|
|
Modifies: .
|
|
|
|
Returns: HRESULT
|
|
---------------------------------------------------------------------------*/
|
|
STDMETHODIMP ClassFactory::QueryInterface
|
|
(
|
|
REFIID riid,
|
|
void ** ppv
|
|
)
|
|
{
|
|
HRESULT hr = E_NOINTERFACE;
|
|
*ppv = NULL;
|
|
|
|
if (IID_IUnknown == riid)
|
|
{
|
|
*ppv = this;
|
|
}
|
|
else if (IID_IClassFactory == riid)
|
|
{
|
|
*ppv = static_cast<IClassFactory*>(this);
|
|
}
|
|
|
|
if (NULL != *ppv)
|
|
{
|
|
// We've handed out a pointer to the interface so obey the COM rules
|
|
// and AddRef the reference count.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
hr = NOERROR;
|
|
}
|
|
|
|
return (hr);
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Method: ClassFactory::AddRef
|
|
|
|
Summary: AddRef of the ClassFactory non-delegating IUnknown implementation.
|
|
|
|
Args: void
|
|
|
|
Modifies: m_cRefs.
|
|
|
|
Returns: ULONG
|
|
New value of m_cRefs (COM object's reference count).
|
|
---------------------------------------------------------------------------*/
|
|
STDMETHODIMP_(ULONG) ClassFactory::AddRef(void)
|
|
{
|
|
return InterlockedIncrement(&m_cRefs);
|
|
return m_cRefs;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Method: ClassFactory::Release
|
|
|
|
Summary: Release of the ClassFactory non-delegating IUnknown implementation.
|
|
|
|
Args: void
|
|
|
|
Modifies: m_cRefs.
|
|
|
|
Returns: ULONG
|
|
New value of m_cRefs (COM object's reference count).
|
|
---------------------------------------------------------------------------*/
|
|
STDMETHODIMP_(ULONG) ClassFactory::Release(void)
|
|
{
|
|
if (InterlockedDecrement(&m_cRefs) == 0)
|
|
{
|
|
// We've reached a zero reference count for this COM object.
|
|
// So we tell the server housing to decrement its global object
|
|
// count so that the server will be unloaded if appropriate.
|
|
if (NULL != m_pServer)
|
|
m_pServer->ObjectsDown();
|
|
|
|
delete this;
|
|
return 0 ;
|
|
}
|
|
TraceMsg(TF_CLASSFACTORY, "CFactory::Release %d", m_cRefs);
|
|
return m_cRefs;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Method: ClassFactory::CreateInstance
|
|
|
|
Summary: The CreateInstance member method of this IClassFactory interface
|
|
implementation. Creates an instance of the CICWWebView COM
|
|
component.
|
|
|
|
Args: IUnknown* pUnkOuter,
|
|
[in] Pointer to the controlling IUnknown.
|
|
REFIID riid,
|
|
[in] GUID of the Interface being requested.
|
|
void ** ppvCob)
|
|
[out] Address of the caller's pointer variable that will
|
|
receive the requested interface pointer.
|
|
|
|
Modifies: .
|
|
|
|
Returns: HRESULT
|
|
Standard OLE result code.
|
|
---------------------------------------------------------------------------*/
|
|
STDMETHODIMP ClassFactory::CreateInstance
|
|
(
|
|
IUnknown* pUnkOuter,
|
|
REFIID riid,
|
|
void ** ppv
|
|
)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
IUnknown * pCob = NULL;
|
|
|
|
// NULL the output pointer.
|
|
*ppv = NULL;
|
|
|
|
// We don't support aggregation
|
|
if (NULL != pUnkOuter)
|
|
hr = CLASS_E_NOAGGREGATION;
|
|
else
|
|
{
|
|
// Instantiate a COM Object, based on the clsid requsted by GetClassObject
|
|
if (IsEqualGUID(CLSID_ICWWEBVIEW, *m_pclsid))
|
|
pCob = (IUnknown *) new CICWWebView(m_pServer);
|
|
else if (IsEqualGUID(CLSID_ICWWALKER, *m_pclsid))
|
|
pCob = (IUnknown *) new CICWWalker(m_pServer);
|
|
else if (IsEqualGUID(CLSID_ICWGIFCONVERT, *m_pclsid))
|
|
pCob = (IUnknown *) new CICWGifConvert(m_pServer);
|
|
else if (IsEqualGUID(CLSID_ICWISPDATA, *m_pclsid))
|
|
pCob = (IUnknown *) new CICWISPData(m_pServer);
|
|
else
|
|
pCob = NULL;
|
|
|
|
if (NULL != pCob)
|
|
{
|
|
// We initially created the new COM object so tell the server
|
|
// to increment its global server object count to help ensure
|
|
// that the server remains loaded until this partial creation
|
|
// of a COM component is completed.
|
|
m_pServer->ObjectsUp();
|
|
|
|
// We QueryInterface this new COM Object not only to deposit the
|
|
// main interface pointer to the caller's pointer variable, but to
|
|
// also automatically bump the Reference Count on the new COM
|
|
// Object after handing out this reference to it.
|
|
hr = pCob->QueryInterface(riid, (void **)ppv);
|
|
if (FAILED(hr))
|
|
{
|
|
m_pServer->ObjectsDown();
|
|
delete pCob;
|
|
}
|
|
}
|
|
else
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Method: ClassFactory::LockServer
|
|
|
|
Summary: The LockServer member method of this IClassFactory interface
|
|
implementation.
|
|
|
|
Args: BOOL fLock)
|
|
[in] Flag determining whether to Lock or Unlock the server.
|
|
|
|
Modifies: .
|
|
|
|
Returns: HRESULT
|
|
Standard OLE result code.
|
|
---------------------------------------------------------------------------*/
|
|
STDMETHODIMP ClassFactory::LockServer
|
|
(
|
|
BOOL fLock
|
|
)
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
if (fLock)
|
|
m_pServer->Lock();
|
|
else
|
|
m_pServer->Unlock();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|