//+------------------------------------------------------------------- // 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 #include #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); }