summaryrefslogtreecommitdiffstats
path: root/private/ole32/com/remote/dde/server/ddesink.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'private/ole32/com/remote/dde/server/ddesink.cxx')
-rw-r--r--private/ole32/com/remote/dde/server/ddesink.cxx251
1 files changed, 251 insertions, 0 deletions
diff --git a/private/ole32/com/remote/dde/server/ddesink.cxx b/private/ole32/com/remote/dde/server/ddesink.cxx
new file mode 100644
index 000000000..302db683e
--- /dev/null
+++ b/private/ole32/com/remote/dde/server/ddesink.cxx
@@ -0,0 +1,251 @@
+// ddesink.cpp
+//
+// Methods for CDefClient::CAdviseSinkImpl
+//
+// Author:
+// Jason Fuller jasonful 8-16-92
+//
+// Copyright (c) 1990, 1991 Microsoft Corporation
+
+
+#include <ole2int.h>
+#include "srvr.h"
+#include "ddedebug.h"
+
+
+ASSERTDATA
+
+STDUNKIMPL_FORDERIVED (DefClient, AdviseSinkImpl)
+
+ BOOL PeekOneMessage
+ (MSG FAR* pmsg,
+ HWND hwnd,
+ UINT message)
+{
+ // We have to verify pmsg->message because PeekMessage will return
+ // WM_QUIT even if you didn't ask for it.
+
+ if (SSPeekMessage (pmsg, hwnd, message, message, PM_REMOVE))
+ {
+ if (pmsg->message==message)
+ return TRUE;
+ else
+ {
+ AssertSz (pmsg->message == WM_QUIT, "Unexpected message");
+ if (WM_QUIT==pmsg->message)
+ {
+ // Put message back
+ PostQuitMessage (pmsg->wParam);
+ }
+ return FALSE;
+ }
+ }
+ else
+ return FALSE;
+}
+
+
+
+
+
+
+STDMETHODIMP_(void) NC(CDefClient,CAdviseSinkImpl)::OnClose
+ (void)
+{
+ MSG msg;
+ intrDebugOut((DEB_ITRACE,
+ "%x _IN CDefClient::OnClose\n",
+ this));
+
+ ChkC(m_pDefClient);
+
+ m_pDefClient->m_fInOnClose = TRUE;
+ // AddRef/Release safety bracket. Do not remove.
+ m_pDefClient->m_pUnkOuter->AddRef();
+
+ #ifdef _DEBUG
+ if (m_pDefClient->m_bContainer)
+ {
+ if (NOERROR != m_pDefClient->NoItemConnections())
+ Warn ("OnClose called on document before item");
+ }
+ #endif
+
+ if (m_pDefClient->m_ExecuteAck.f)
+ {
+ // in case the server closes in the middle of a DoVerb, send the ACK
+ // for the EXECUTE now to keep the messages in order.
+ m_pDefClient->SendExecuteAck (NOERROR);
+ }
+
+ if (!m_pDefClient->m_fGotStdCloseDoc)
+ {
+ // if client sent us StdCloseDocument, then he certainly
+ // is not in a state to receive callbacks
+ m_pDefClient->ItemCallBack (OLE_CLOSED);
+ }
+
+ // We have to check the message field because PeekMessage will return
+ // WM_QUIT even if you didn't ask for it.
+ if (PeekOneMessage (&msg, m_pDefClient->m_hwnd, WM_DDE_EXECUTE))
+ {
+ LPARAM lp = MAKE_DDE_LPARAM(WM_DDE_ACK,POSITIVE_ACK,
+ GET_WM_DDE_EXECUTE_HDATA(msg.wParam,msg.lParam));
+
+ intrDebugOut((DEB_ITRACE,
+ "%x ::OnClose found StdCloseDocument in queue\n",
+ this));
+
+ if(!PostMessageToClient ((HWND)msg.wParam,
+ WM_DDE_ACK,
+ (UINT) m_pDefClient->m_hwnd,
+ lp))
+ {
+ DDEFREE(WM_DDE_ACK,lp);
+ }
+
+ }
+
+
+ ChkC (m_pDefClient);
+
+ if (m_pDefClient->m_bContainer)
+ {
+ // If the document (container) is closing, then we
+ // should send a TERMINATE to the client windows.
+ // We don't do this for items because a client window
+ // may still be connected to another item.
+ // Items within one document share one window.
+
+ m_pDefClient->SendTerminateMsg ();
+ ChkC (m_pDefClient);
+ AssertIsDoc (m_pDefClient);
+ m_pDefClient->ReleaseAllItems();
+ }
+ else
+ {
+ m_pDefClient->RemoveItemFromItemList ();
+ }
+
+ // If item was deleted in client app, m_lpoleObj could be NULL
+ m_pDefClient->ReleaseObjPtrs ();
+
+ // If "this" is an item, get the doc that contains this item
+ LPCLIENT pdoc = m_pDefClient->m_pdoc;
+ Assert (pdoc);
+
+ Assert (pdoc->m_chk==chkDefClient);
+ if (pdoc->m_chk==chkDefClient && pdoc->m_fRunningInSDI)
+ if (pdoc->m_fRunningInSDI)
+ {
+ Puts ("Running in SDI\r\n");
+ // The server app never registered a class factory, so no
+ // RevokeClassFactory will trigger the destruction of the
+ // CDdeServer, so we do it here if there are no other clients
+ // connected to that CDdeServer
+ if (pdoc->m_psrvrParent->QueryRevokeClassFactory())
+ {
+ // Assert (No sibling documents)
+ Verify (NOERROR==pdoc->m_psrvrParent->Revoke());
+ pdoc->m_psrvrParent = NULL;
+ }
+ }
+ m_pDefClient->m_fInOnClose = FALSE;
+
+ // AddRef/Release safety bracket. Do not remove.
+ // Do not use m_pDefClient after this Release.
+ m_pDefClient->m_pUnkOuter->Release();
+
+ intrDebugOut((DEB_ITRACE,
+ "%x _OUT CDefClient::OnClose\n",
+ this));
+}
+
+
+
+
+STDMETHODIMP_(void) NC(CDefClient,CAdviseSinkImpl)::OnSave
+ (THIS)
+{
+ intrDebugOut((DEB_ITRACE,
+ "%x _IN CDefClient::OnSave\n",
+ this));
+
+ ChkC(m_pDefClient);
+ if (!m_pDefClient->m_fInOleSave)
+ {
+ // If we called OleSave to get the native data, then of course
+ // we will get an OnSave notification.
+ m_pDefClient->ItemCallBack (OLE_SAVED);
+ }
+ intrDebugOut((DEB_ITRACE,
+ "%x _OUT CDefClient::OnSave\n",
+ this));
+}
+
+
+
+STDMETHODIMP_(void) NC(CDefClient,CAdviseSinkImpl)::OnDataChange
+ (THIS_ FORMATETC FAR* pFormatetc,
+ STGMEDIUM FAR* pStgmed)
+{
+ intrDebugOut((DEB_ITRACE,
+ "%x _IN CDefClient::OnDataChange pFormatetc=%x\n",
+ this,
+ pFormatetc));
+ // note we are ignoring both the pformatetc and the pStgMed.
+ // ItemCallBack will ask (using GetData) for the data the client wants.
+ // We are treating a call to this function as a simple Ping.
+
+ ChkC(m_pDefClient);
+ m_pDefClient->ItemCallBack (OLE_CHANGED);
+ intrDebugOut((DEB_ITRACE,
+ "%x _OUT CDefClient::OnDataChange\n",
+ this));
+}
+
+
+
+STDMETHODIMP_(void) NC(CDefClient,CAdviseSinkImpl)::OnRename
+ (THIS_ LPMONIKER pmk)
+{
+ intrDebugOut((DEB_ITRACE,
+ "%x _IN CDefClient::OnRename pmk=%x\n",
+ this,pmk));
+
+ LPOLESTR szFile=NULL;
+
+ ChkC(m_pDefClient);
+ if (Ole10_ParseMoniker (pmk, &szFile, NULL) != NOERROR)
+ {
+ // Wrong type of moniker
+ intrDebugOut((DEB_IERROR,
+ "%x ::OnRename pmk=%x wrong moniker\n",
+ this,pmk));
+ }
+ else
+ {
+ intrDebugOut((DEB_ITRACE,
+ "%x ::OnRename pmk=%x pmk.Name=(%ws)\n",
+ this,
+ pmk,
+ WIDECHECK(szFile)));
+ // Notify client
+ m_pDefClient->ItemCallBack (OLE_RENAMED, szFile);
+ CoTaskMemFree(szFile);
+ }
+
+ intrDebugOut((DEB_ITRACE,
+ "%x _OUT CDefClient::OnRename\n",
+ this));
+}
+
+
+
+STDMETHODIMP_(void) NC(CDefClient,CAdviseSinkImpl)::OnViewChange
+ (THIS_ DWORD aspects, LONG lindex)
+{
+ // Response to IViewObjectAdvise::Advise, which we do not do
+}
+
+