Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

629 lines
18 KiB

//+-------------------------------------------------------------------
// File: ioleobj.cxx
//
// Contents: IOleObject methods of COleObject class.
//
// Classes: COleObject - IOleObject implementation
//
// History: 7-Dec-92 DeanE Created
// 31-Dec-93 ErikGav Chicago port
//---------------------------------------------------------------------
#pragma optimize("",off)
#include <windows.h>
#include <ole2.h>
#include "testsrv.hxx"
//+-------------------------------------------------------------------
// Member: COleObject::COleObject()
//
// Synopsis: The constructor for COleObject.
//
// Arguments: None
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
COleObject::COleObject(CTestEmbed *pteObject)
{
_cRef = 1;
_pOAHolder = NULL;
_pocs = NULL;
_pteObject = pteObject;
_pmkContainer = NULL;
}
//+-------------------------------------------------------------------
// Member: COleObject::~COleObject()
//
// Synopsis: The destructor for COleObject.
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
COleObject::~COleObject()
{
// _cRef should be 1
if (1 != _cRef)
{
// BUGBUG - Log error - someone hasn't released
}
if (_pocs != NULL)
{
_pocs->Release();
}
if (_pmkContainer != NULL)
{
_pmkContainer->Release();
}
}
//+-------------------------------------------------------------------
// Method: COleObject::QueryInterface
//
// Synopsis: Forward this to the object we're associated with
//
// Parameters: [iid] - Interface ID to return.
// [ppv] - Pointer to pointer to object.
//
// Returns: S_OK if iid is supported, or E_NOINTERFACE if not.
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::QueryInterface(REFIID iid, void FAR * FAR *ppv)
{
return(_pteObject->QueryInterface(iid, ppv));
}
//+-------------------------------------------------------------------
// Method: COleObject::AddRef
//
// Synopsis: Forward this to the object we're associated with
//
// Returns: New reference count.
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP_(ULONG) COleObject::AddRef(void)
{
++_cRef;
return(_pteObject->AddRef());
}
//+-------------------------------------------------------------------
// Method: COleObject::Release
//
// Synopsis: Forward this to the object we're associated with
//
// Returns: New reference count.
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP_(ULONG) COleObject::Release(void)
{
--_cRef;
return(_pteObject->Release());
}
//+-------------------------------------------------------------------
// Method: COleObject::SetClientSite
//
// Synopsis: Save the IOleClientSite pointer passed - it's this
// object's client site object.
//
// Parameters: [pClientSite] - Pointer to the new client site object.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::SetClientSite(LPOLECLIENTSITE pClientSite)
{
if (_pocs != NULL)
{
_pocs->Release();
}
_pocs = pClientSite;
if (pClientSite)
{
_pocs->AddRef();
}
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::GetClientSite
//
// Synopsis: Return this objects current client site - NULL indicates
// it hasn't been set yet.
//
// Parameters: [ppClientSite] - Save current client site pointer here.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::GetClientSite(LPOLECLIENTSITE FAR *ppClientSite)
{
*ppClientSite = _pocs;
_pocs->AddRef();
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::SetHostNames
//
// Synopsis: See spec 2.00.09 p99. Returns names the caller can use
// to display our object name (in window titles and such).
//
// Parameters: [szContainerApp] - Name of container application.
// [szContainerObj] - Name of this object.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::SetHostNames(
LPCWSTR szContainerApp,
LPCWSTR szContainerObj)
{
szContainerApp = L"Test Server";
szContainerObj = L"Test Server:Test Object";
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::Close
//
// Synopsis: See spec 2.00.09 p104. Short story is: if fMerelyHide,
// turn off the UI of this object, else return to the
// "loaded" state, which for us means to shut down (since we
// don't do any caching).
//
// Parameters: [dwSaveOption] - ???
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//
// Notes: BUGBUG - what if we have multiple instances? Do we
// return the server app to the loaded state or do we
// return this object to the loaded state?
//--------------------------------------------------------------------
STDMETHODIMP COleObject::Close(DWORD dwSaveOption)
{
// BUGBUG - NYI
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::SetMoniker
//
// Synopsis: See spec 2.00.09 p99. The moniker for this object
// (or it's container) has been changed to that passed
// in. Take appropriate actions (de-register old object
// and register new, inform contained objects, etc).
//
// Parameters: [dwWhichMoniker] - Moniker type being sent.
// [pmk] - The new moniker.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::SetMoniker(DWORD dwWhichMoniker, LPMONIKER pmk)
{
if (_pmkContainer)
{
_pmkContainer->Release();
}
_pmkContainer = pmk;
pmk->AddRef();
// Set moniker in container
IOleObject *pobj;
HRESULT hresult = _pocs->QueryInterface(IID_IOleObject, (void **) &pobj);
pobj->SetMoniker(dwWhichMoniker, pmk);
pobj->Release();
return S_OK;
}
//+-------------------------------------------------------------------
// Method: COleObject::GetMoniker
//
// Synopsis: See spec 2.00.09 p100. Return either this objects
// container moniker, this objects relative moniker, or
// this objects full moniker.
//
// Parameters: [dwAssign] - Condition to get moniker.
// [dwWhichMoniker] - Kind of moniker being requested.
// [ppmk] - Return moniker here.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::GetMoniker(
DWORD dwAssign,
DWORD dwWhichMoniker,
LPMONIKER FAR *ppmk)
{
*ppmk = _pmkContainer;
_pmkContainer->AddRef();
return S_OK;
}
//+-------------------------------------------------------------------
// Method: COleObject::InitFromData
//
// Synopsis: See spec 2.00.09 p100. Initialize this object from
// the format passed in.
//
// Parameters: [pDataObject] - IDataObject providing data.
// [fCreation] - TRUE if this is the initial creation.
// [dwReserved] - Ignored.
//
// Returns: S_OK if we attempt to initialize, S_FALSE if we don't
// want to.
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::InitFromData(
LPDATAOBJECT pDataObject,
BOOL fCreation,
DWORD dwReserved)
{
// BUGBUG - NYI
return(S_FALSE);
}
//+-------------------------------------------------------------------
// Method: COleObject::GetClipboardData
//
// Synopsis: See spec 2.00.09 p101. Return clipboard object that would
// be created if Edit/Copy were done to this item.
//
// Parameters: [dwReserved] - Ignored.
// [ppDataObject] - IDataObject return locale.
//
// Returns: S_OK or ???
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::GetClipboardData(
DWORD dwReserved,
LPDATAOBJECT FAR *ppDataObject)
{
// BUGBUG - NYI
*ppDataObject = NULL;
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::DoVerb
//
// Synopsis: See spec 2.00.09 p101. Execute the verb passed in.
//
// Parameters: [iVerb] - Verb being requested.
// [pMsg] - Message that triggered the request.
// [pActiveSite] - IOleClientSite for this object.
// [lReserved] - Ignored.
//
// Returns: S_OK, or other ones specified but not defined yet...
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::DoVerb(
LONG iVerb,
LPMSG pMsg,
LPOLECLIENTSITE pActiveSite,
LONG lReserved,
HWND hwndParent,
LPCRECT lprcPosRect)
{
// HWND hwndObj;
if (OLEIVERB_SHOW == iVerb)
{
// BUGBUG - NYI
// Display the object (we're not in-place yet)
// PostMessage(g_hwndMain, WM_REPORT, MB_SHOWVERB, 0);
// PostMessage(0xFFFF, WM_REPORT, MB_SHOWVERB, 0);
// MessageBox(g_hwndMain, L"Received OLEIVERB_SHOW", L"OLE Server", MB_ICONINFORMATION | MB_OK);
// Get hwndObj
//_pteObject->GetWindow(&hwndObj);
//MessageBox(hwndObj, L"Received OLEIVERB_SHOW", L"OLE Server", MB_ICONINFORMATION | MB_OK);
}
else
{
// Return alternate error code?
}
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::EnumVerbs
//
// Synopsis: See spec 2.00.09 p103. Enumerate all the verbs available
// on this object in increasing numerical order.
//
// Parameters: [ppenmOleVerb] - Enumeration object return locale.
//
// Returns: S_OK or ???
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::EnumVerbs(IEnumOLEVERB FAR* FAR *ppenmOleVerb)
{
// BUGBUG - NYI
*ppenmOleVerb = NULL;
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::Update
//
// Synopsis: See spec 2.00.09 p105. Ensure any data or view caches
// maintained inside the object are up to date.
//
// Parameters: None
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::Update()
{
// We don't use any caches, so we don't have to do anything
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::IsUpToDate
//
// Synopsis: See spec 2.00.09 p105. Check to see if this object is
// up to date - including embedded children, etc.
//
// Parameters: None
//
// Returns: S_OK, S_FALSE, or ???
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::IsUpToDate()
{
// We should always be up to date as we don't have any caches
// or children or links
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::GetUserClassID
//
// Synopsis: I have little idea what this does. It's not in the
// spec 2.00.09.
//
// Parameters: [dwFormOfType] -
// [pszUserType] -
//
// Returns: S_OK?
//
// History: 16-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::GetUserClassID(
CLSID FAR *pClsid)
{
// BUGBUG - NYI
return(E_FAIL);
}
//+-------------------------------------------------------------------
// Method: COleObject::GetUserType
//
// Synopsis: I have little idea what this does. It's not in the
// spec 2.00.09.
//
// Parameters: [dwFormOfType] -
// [pszUserType] -
//
// Returns: S_OK?
//
// History: 16-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::GetUserType(
DWORD dwFormOfType,
LPWSTR FAR *pszUserType)
{
// BUGBUG - NYI
return(E_FAIL);
}
//+-------------------------------------------------------------------
// Method: COleObject::SetExtent
//
// Synopsis: See spec 2.00.09 p106. Set the rectangular extent of
// this object. Container will call us with the size
// it will give us; we must fit accordingly.
//
// Parameters: [dwDrawAspect] - DVASPECT specified for this object.
// [lpsizel] - Extent structure.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::SetExtent(DWORD dwDrawAspect, LPSIZEL lpsizel)
{
// BUGBUG - NYI
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::GetExtent
//
// Synopsis: See spec 2.00.09 p106. Size of the object given in the
// the last SetExtent call is returned. If SetExtent has
// not been called, the natural size of the object is
// returned.
//
// Parameters: [dwDrawAspect] - DVASPECT specified for this object.
// [lpsizel] - Extent structure to set.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::GetExtent(DWORD dwDrawAspect, LPSIZEL lpsizel)
{
// BUGBUG - NYI
return(S_OK);
}
//+-------------------------------------------------------------------
// Method: COleObject::Advise
//
// Synopsis: See spec 2.00.09 p121. Set up an advisory connection
// between this object and an advisory sink; when certain
// events happen (birthdays?) this sink should be informed
// by this object. Use the OleAdviseHolder object as a
// helper (see p122).
//
// Parameters: [pAdvSink] - Sink that should be informed of changes.
// [pdwConnection] - Pass advisory token returned so our
// caller can shut down the link.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::Advise(
IAdviseSink FAR *pAdvSink,
DWORD FAR *pdwConnection)
{
// if (NULL == _pOAHolder)
// {
// if (S_OK != CreateOleAdviseHolder(&_pOAHolder))
// {
// return(E_OUTOFMEMORY);
// }
// }
//
// return(_pOAHolder->Advise(pAdvSink, pdwConnection));
return S_OK;
}
//+-------------------------------------------------------------------
// Method: COleObject::Unadvise
//
// Synopsis: See spec 2.00.09 p121. Tear down an advisory connection
// set up previously.
//
// Parameters: [dwConnection] - Connection established earlier.
//
// Returns: S_OK or ???
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::Unadvise(DWORD dwConnection)
{
if (NULL == _pOAHolder)
{
// No one is registered - see ellipswt.cpp for this
return(E_INVALIDARG);
}
return(_pOAHolder->Unadvise(dwConnection));
}
//+-------------------------------------------------------------------
// Method: COleObject::EnumAdvise
//
// Synopsis: See spec 2.00.09 p122. Enumerate the advisory connections
// currently attached to this object.
//
// Parameters: [ppenmAdvise] - Enumeration object to return.
//
// Returns: S_OK
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::EnumAdvise(LPENUMSTATDATA FAR *ppenmAdvise)
{
if (NULL == _pOAHolder)
{
return(E_FAIL);
}
return(_pOAHolder->EnumAdvise(ppenmAdvise));
}
//+-------------------------------------------------------------------
// Method: COleObject::GetMiscStatus
//
// Synopsis: I have little idea what this does. It's not in the
// spec 2.00.09.
//
// Returns: S_OK?
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::GetMiscStatus(
DWORD dwAspect,
DWORD FAR *pdwStatus)
{
// BUGBUG - NYI
return(E_FAIL);
}
//+-------------------------------------------------------------------
// Method: COleObject::SetColorScheme
//
// Synopsis: I have little idea what this does. It's not in the
// spec 2.00.09.
//
// Returns: S_OK?
//
// History: 7-Dec-92 DeanE Created
//--------------------------------------------------------------------
STDMETHODIMP COleObject::SetColorScheme(LPLOGPALETTE lpLogpal)
{
// BUGBUG - NYI
return(S_OK);
}