home *** CD-ROM | disk | FTP | other *** search
- /*
- * The contents of this file are subject to the Netscape Public
- * License Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * rights and limitations under the License.
- *
- * The Original Code is Mozilla Communicator client code, released
- * March 31, 1998.
- *
- * The Initial Developer of the Original Code is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998-1999 Netscape Communications Corporation. All
- * Rights Reserved.
- *
- * Contributor(s):
- * Akkana Peck (akkana@netscape.com)
- * Charles Manxke (cmanske@netscape.com)
- */
-
- // Variables used across all the links being checked:
- var gNumLinksToCheck = 0; // The number of nsILinkCheckers
- var gLinksBeingChecked = []; // Array of nsIURICheckers
- var gURIRefObjects = []; // Array of nsIURIRefObjects
- var gNumLinksCalledBack = 0;
- var gStartedAllChecks = false;
- var gLinkCheckTimerID = 0;
-
- // Implement nsIRequestObserver:
- var gRequestObserver =
- {
- // urichecker requires that we have an OnStartRequest even tho it's a nop.
- onStartRequest: function(request, ctxt) { },
-
- // onStopRequest is where we really handle the status.
- onStopRequest: function(request, ctxt, status)
- {
- var linkChecker = request.QueryInterface(Components.interfaces.nsIURIChecker);
- if (linkChecker)
- {
- gNumLinksCalledBack++;
- linkChecker.status = status;
- for (var i = 0; i < gNumLinksCalledBack; i++)
- {
- if (linkChecker == gLinksBeingChecked[i])
- gLinksBeingChecked[i].status = status;
- }
-
- if (gStartedAllChecks && gNumLinksCalledBack >= gNumLinksToCheck)
- {
- clearTimeout(gLinkCheckTimerID);
- LinkCheckTimeOut();
- }
- }
- }
- }
-
- function Startup()
- {
- var editor = GetCurrentEditor();
- if (!editor)
- {
- window.close();
- return;
- }
-
- // Get all objects that refer to other locations
- var objects;
- try {
- objects = editor.getLinkedObjects();
- } catch (e) {}
-
- if (!objects || objects.Count() == 0)
- {
- AlertWithTitle(GetString("Alert"), GetString("NoLinksToCheck"));
- window.close();
- return;
- }
-
- gDialog.LinksList = document.getElementById("LinksList");
- gDialog.Close = document.documentElement.getButton("cancel");
-
- // Set window location relative to parent window (based on persisted attributes)
- SetWindowLocation();
-
-
- // Loop over the nodes that have links:
- for (var i = 0; i < objects.Count(); i++)
- {
- var refobj = objects.GetElementAt(gNumLinksToCheck).QueryInterface(Components.interfaces.nsIURIRefObject);
- // Loop over the links in this node:
- if (refobj)
- {
- try {
- var uri;
- while ((uri = refobj.GetNextURI()))
- {
- // Use the real class in netlib:
- // Note that there may be more than one link per refobj
- gURIRefObjects[gNumLinksToCheck] = refobj;
-
- // Make a new nsIURIChecker
- gLinksBeingChecked[gNumLinksToCheck]
- = Components.classes["@mozilla.org/network/urichecker;1"]
- .createInstance()
- .QueryInterface(Components.interfaces.nsIURIChecker);
- // XXX uri creation needs to be localized
- gLinksBeingChecked[gNumLinksToCheck].init(GetIOService().newURI(uri, null, null));
- gLinksBeingChecked[gNumLinksToCheck].asyncCheck(gRequestObserver, null);
-
- // Add item
- var linkChecker = gLinksBeingChecked[gNumLinksToCheck].QueryInterface(Components.interfaces.nsIURIChecker);
- SetItemStatus(linkChecker.name, "busy");
- dump(" *** Linkcount = "+gNumLinksToCheck+"\n");
- gNumLinksToCheck++;
-
- };
- } catch (e) { dump (" *** EXCEPTION\n");}
- }
- }
- // Done with the loop, now we can be prepared for the finish:
- gStartedAllChecks = true;
-
- // Start timer to limit how long we wait for link checking
- gLinkCheckTimerID = setTimeout("LinkCheckTimeOut()", 5000);
- window.sizeToContent();
- }
-
- function LinkCheckTimeOut()
- {
- // We might have gotten here via a late timeout
- if (gNumLinksToCheck <= 0)
- return;
- gLinkCheckTimerID = 0;
-
- gNumLinksToCheck = 0;
- gStartedAllChecks = false;
- for (var i=0; i < gLinksBeingChecked.length; i++)
- {
- var linkChecker = gLinksBeingChecked[i].QueryInterface(Components.interfaces.nsIURIChecker);
- // nsIURIChecker status values:
- // NS_BINDING_SUCCEEDED link is valid
- // NS_BINDING_FAILED link is invalid (gave an error)
- // NS_BINDING_ABORTED timed out, or cancelled
- switch (linkChecker.status)
- {
- case 0: // NS_BINDING_SUCCEEDED
- SetItemStatus(linkChecker.name, "done");
- break;
- case 0x804b0001: // NS_BINDING_FAILED
- dump(">> " + linkChecker.name + " is broken\n");
- case 0x804b0002: // NS_BINDING_ABORTED
- // dump(">> " + linkChecker.name + " timed out\n");
- default:
- // dump(">> " + linkChecker.name + " not checked\n");
- SetItemStatus(linkChecker.name, "failed");
- break;
- }
- }
- gDialog.Close.setAttribute("label", GetString("Close"));
- }
-
- // Add url to list of links to check
- // or set status for file already in the list
- // Returns true if url was in the list
- function SetItemStatus(url, status)
- {
- if (!url)
- return false;
-
- if (!status)
- status = "busy";
-
- // Just set attribute for status icon
- // if we already have this url
- var listitems = document.getElementsByTagName("listitem");
- if (listitems)
- {
- for (var i=0; i < listitems.length; i++)
- {
- if (listitems[i].getAttribute("label") == url)
- {
- listitems[i].setAttribute("progress", status);
- return true;
- }
- }
- }
-
- // We're adding a new item to list
- var listitem = document.createElementNS(XUL_NS, "listitem");
- if (listitem)
- {
- listitem.setAttribute("class", "listitem-iconic progressitem");
- // This triggers CSS to show icon for each status state
- listitem.setAttribute("progress", status);
- listitem.setAttribute("label", url);
- gDialog.LinksList.appendChild(listitem);
- }
- return false;
- }
-
- function onAccept()
- {
- SaveWindowLocation();
- return true; // do close the window
- }
-
- function onCancelLinkChecker()
- {
- if (gLinkCheckTimerID)
- clearTimeout(gLinkCheckTimerID);
-
- /*
- LinkCheckTimeOut();
- */
- return onCancel();
- }
-