/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #include "stdafx.h" #include "urlecho.h" #include "wfedde.h" extern "C" void FE_URLEcho(URL_Struct *pURL, int iStatus, MWContext *pContext) { // Purpose: Echo the URL to all appropriately registered applications that are monitoring such URL traffic. // Arguments: pURL The URL which is being loaded. // iStatus The status of the load. // pContext The context in which the load occurred. // Returns: void // Comments: Well, sometimes there isn't a window in which the load occurred, what to do then? // Just don't report. // Revision History: // 01-18-95 created GAB // // Check to make sure everything's OK to continue onwards. if(pURL == NULL) { return; } else if(pURL->address == NULL) { return; } else if(pContext == NULL) { return; } else if(GetFrame(pContext) == NULL) { // Have to have a frame, as the DDE implementation assumes there are windows around. return; } // Let the progress applications know what's up. if(pURL->server_status / 100 != 2 && pURL->server_status / 100 != 3 && pURL->server_status != 0) { // The server actually reported an error, be we won't display this as an error but render it in a window. // We will send these messages to an external type of applciation in this case only though that is monitoring // progress. CString myMsg = szLoadString(IDS_SERVER_ERR_NUM); char aBuffer[16]; sprintf(aBuffer, "%d", pURL->server_status); myMsg += aBuffer; return; } // Okay, let's start checking stuff out. // We will NOT report on failures to load. if(iStatus != MK_DATA_LOADED) { // This is an error. // Perhaps just an interrupting load by the user. // In any event, it will be reported to any monitoring applications in WFE_Alert. return; } // So the data was actually loaded. // Build a URL, and a Referrer URL. // Build the mime type, and a windowID. CString csURL; CString csReferrer; CString csMimeType; DWORD dwWindowID; csURL = pURL->address; if(pURL->referer != NULL) { csReferrer = pURL->referer; } if(pURL->content_type != NULL) { csMimeType = pURL->content_type; } dwWindowID = FE_GetContextID(pContext); CEchoItem::Echo(csURL, csMimeType, dwWindowID, csReferrer); return; } // Static property. CPtrList CEchoRegistry::m_Registry; void CEchoItem::Echo(CString& csURL, CString& csMimeType, DWORD dwWindowID, CString& csReferrer) { // Purpose: Go through every object in the registry, and echo the URL information to them. // Arguments: csURL The url being loaded. // csMimeType The mime type of the URL being loaded. // dwWindowID The window performing the load. // csReferrer The referring URL. // Returns: void // Comments: // Revision History: // 01-18-95 created GAB // // Go through the registry. CEchoItem *pItem; POSITION rIndex = m_Registry.GetHeadPosition(); while(rIndex != NULL) { pItem = (CEchoItem *)m_Registry.GetNext(rIndex); // Depending on how the watching server was registered, it is handled through this virtual // member mapping to the correct class. pItem->EchoURL(csURL, csMimeType, dwWindowID, csReferrer); } } void CDDEEchoItem::DDERegister(CString &csServiceName) { // Purpose: Register a DDE applciation to watch url echos. // Arguments: csServiceName The service name of the DDE server which wants to watch the urls. // Returns: void // Comments: Always works. // Revision History: // 01-18-95 created GAB // // Just create the item. Our job's done. CDDEEchoItem *pDontCare = new CDDEEchoItem(csServiceName); } BOOL CDDEEchoItem::DDEUnRegister(CString &csServiceName) { // Purpose: Deregister a DDE applciation watching url echos. // Arguments: csServiceName The DDE service name to unregister. // Returns: BOOL Wether or not unregistered. // Comments: Have to look through every entry in the registry, until we find the entry. // Revision History: // 01-18-95 created GAB // // Go through all registrations. POSITION rIndex = m_Registry.GetHeadPosition(); CEchoItem *pItem; CDDEEchoItem *pDelMe; while(rIndex != NULL) { pItem = (CEchoItem *)m_Registry.GetNext(rIndex); // Check the type of the registered app, could be OLE or something. if(pItem->GetType() == m_DDE) { pDelMe = (CDDEEchoItem *)pItem; if(pDelMe->GetServiceName() == csServiceName) { delete pDelMe; return(TRUE); } } } return(FALSE); } void CDDEEchoItem::EchoURL(CString& csURL, CString& csMimeType, DWORD dwWindowID, CString& csReferrer) { // Purpose: Send a registered DDE server an URL echo event. // Arguments: csURL The url loaded. // csMimeType The mime type of the loading URL. // dwWindowID The window performing the load. // csReferrer The referrer URL. // Returns: void // Comments: // Revision History: // 01-18-95 created GAB // CDDEWrapper::URLEcho(this, csURL, csMimeType, dwWindowID, csReferrer); }