void CNetDDESvrApp::OnDDEStartAdvise(CNetDDESvrSocket& oConnection, CNetDDEPacket& oReqPacket) { ASSERT(oReqPacket.DataType() == CNetDDEPacket::DDE_START_ADVISE); bool bResult = false; CDDECltConv* pConv = NULL; CDDELink* pLink = NULL; HCONV hConv; uint32 nConvID; CString strItem; uint32 nFormat; bool bAsync; bool bReqVal; // Decode message. CMemStream oStream(oReqPacket.Buffer()); oStream.Open(); oStream.Seek(sizeof(CNetDDEPacket::Header)); oStream.Read(&hConv, sizeof(hConv)); oStream >> nConvID; oStream >> strItem; oStream >> nFormat; oStream >> bAsync; oStream >> bReqVal; oStream.Close(); if (App.m_bTraceAdvises) App.Trace(TXT("DDE_START_ADVISE: %s %s %s"), strItem, CClipboard::FormatName(nFormat), (bAsync) ? TXT("[ASYNC]") : TXT("")); try { // Locate the conversation. pConv = m_pDDEClient->FindConversation(hConv); if (pConv != NULL) { CNetDDEConv* pNetConv = oConnection.FindNetConv(pConv, nConvID); ASSERT(pNetConv != NULL); // Call DDE to create the link. pLink = pConv->CreateLink(strItem, nFormat); // Attach to the connection. pNetConv->m_aoLinks.Add(pLink); bResult = true; } } catch (CDDEException& e) { App.Trace(TXT("DDE_ERROR: %s"), e.twhat()); } // Sync advise start? if (!bAsync) { // Create response message. CBuffer oRspBuffer; CMemStream oRspStream(oRspBuffer); oRspStream.Create(); oRspStream << bResult; oRspStream.Close(); // Send response message. CNetDDEPacket oRspPacket(CNetDDEPacket::DDE_START_ADVISE, oReqPacket.PacketID(), oRspBuffer); oConnection.SendPacket(oRspPacket); // Update stats. ++m_nPktsSent; } // Failed async advise start? if ((bAsync) && (!bResult)) { // Create response message. CBuffer oRspBuffer; CMemStream oRspStream(oRspBuffer); oRspStream.Create(); oRspStream.Write(&hConv, sizeof(hConv)); oRspStream << strItem; oRspStream << nFormat; oRspStream << true; oRspStream.Close(); // Send response message. CNetDDEPacket oRspPacket(CNetDDEPacket::DDE_START_ADVISE_FAILED, oRspBuffer); oConnection.SendPacket(oRspPacket); // Update stats. ++m_nPktsSent; } CLinkValue* pLinkValue = NULL; // Link established AND 1st link AND need to request value? if ( (bResult) && (pLink->RefCount() == 1) && (bReqVal) ) { try { // Request links current value. CDDEData oData = pConv->Request(strItem, nFormat); // Find the links' value cache. if ((pLinkValue = m_oLinkCache.Find(pConv, pLink)) == NULL) pLinkValue = m_oLinkCache.Create(pConv, pLink); ASSERT(pLinkValue != NULL); // Update links' value cache. pLinkValue->m_oLastValue = oData.GetBuffer();; pLinkValue->m_tLastUpdate = CDateTime::Current(); } catch (CDDEException& e) { App.Trace(TXT("DDE_ERROR: %s"), e.twhat()); } } // Link established AND not 1st real link? else if ( (bResult) && (pLink->RefCount() > 1) ) { // Find last advise value. pLinkValue = m_oLinkCache.Find(pConv, pLink); } // Send initial advise? if (pLinkValue != NULL) { CBuffer oBuffer; CMemStream oStream(oBuffer); oStream.Create(); oStream.Write(&hConv, sizeof(hConv)); oStream << strItem; oStream << nFormat; oStream << pLinkValue->m_oLastValue; oStream << true; oStream.Close(); CNetDDEPacket oPacket(CNetDDEPacket::DDE_ADVISE, oBuffer); // Send links' last advise data. oConnection.SendPacket(oPacket); // Update stats. ++m_nPktsSent; if (App.m_bTraceUpdates) { CString strData; if (nFormat == CF_TEXT) strData = pLinkValue->m_oLastValue.ToString(ANSI_TEXT); else if (nFormat == CF_UNICODETEXT) strData = pLinkValue->m_oLastValue.ToString(UNICODE_TEXT); else strData = CClipboard::FormatName(nFormat); App.Trace(TXT("DDE_ADVISE: %s %u"), strItem, nFormat); } } }
void CNetDDESvrApp::OnDDERequest(CNetDDESvrSocket& oConnection, CNetDDEPacket& oReqPacket) { ASSERT(oReqPacket.DataType() == CNetDDEPacket::DDE_REQUEST); bool bResult = false; HCONV hConv; uint32 nConvID; CString strItem; uint32 nFormat; CBuffer oBuffer; // Decode message. CMemStream oStream(oReqPacket.Buffer()); oStream.Open(); oStream.Seek(sizeof(CNetDDEPacket::Header)); oStream.Read(&hConv, sizeof(hConv)); oStream >> nConvID; oStream >> strItem; oStream >> nFormat; oStream.Close(); if (App.m_bTraceRequests) App.Trace(TXT("DDE_REQUEST: %s %s"), strItem, CClipboard::FormatName(nFormat)); try { // Locate the conversation. CDDECltConv* pConv = m_pDDEClient->FindConversation(hConv); if (pConv != NULL) { // Call DDE to make the request. CDDEData oData = pConv->Request(strItem, nFormat); oBuffer = oData.GetBuffer(); bResult = true; } } catch (CDDEException& e) { App.Trace(TXT("DDE_ERROR: %s"), e.twhat()); } // Create response message. CBuffer oRspBuffer; CMemStream oRspStream(oRspBuffer); oRspStream.Create(); oRspStream << bResult; oRspStream << oBuffer; oRspStream.Close(); // Send response message. CNetDDEPacket oRspPacket(CNetDDEPacket::DDE_REQUEST, oReqPacket.PacketID(), oRspBuffer); oConnection.SendPacket(oRspPacket); // Update stats. ++m_nPktsSent; }