Compare commits
10 Commits
RJCTEST_BA
...
SSU_PERSON
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5015e62d91 | ||
|
|
2a627a36b7 | ||
|
|
a69924abd2 | ||
|
|
9746b6018a | ||
|
|
ee45cb13fa | ||
|
|
b928df1b00 | ||
|
|
3324619a2d | ||
|
|
59e5e73bdf | ||
|
|
c96b32104d | ||
|
|
e4ccec7149 |
@@ -1,32 +0,0 @@
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
DIRS = public src resources
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
nsIBookmarksService.idl
|
||||
@@ -1,35 +0,0 @@
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = appcomps
|
||||
XPIDL_MODULE = bookmarks
|
||||
|
||||
XPIDLSRCS = nsIBookmarksService.idl
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**
|
||||
* The Browser Bookmarks service
|
||||
*/
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
interface nsIRDFResource;
|
||||
|
||||
[scriptable, uuid(a82e9300-e4af-11d2-8fdf-0008c70adc7b)]
|
||||
interface nsIBookmarksService : nsISupports
|
||||
{
|
||||
const unsigned long BOOKMARK_DEFAULT_TYPE = 0;
|
||||
const unsigned long BOOKMARK_SEARCH_TYPE = 1;
|
||||
const unsigned long BOOKMARK_FIND_TYPE = 2;
|
||||
|
||||
boolean ReadBookmarks();
|
||||
boolean IsBookmarked(in string aURI);
|
||||
|
||||
void addBookmarkImmediately(in string aURI, in wstring aTitle, in long bmType, in wstring docCharset);
|
||||
|
||||
nsIRDFResource createFolder(in wstring aName, in nsIRDFResource aParentFolder);
|
||||
nsIRDFResource createFolderWithDetails(in wstring aName, in nsIRDFResource aParentFolder,
|
||||
in long aIndex);
|
||||
|
||||
nsIRDFResource createGroup(in wstring aName, in nsIRDFResource aParentFolder);
|
||||
nsIRDFResource createGroupWithDetails(in wstring aName, in nsIRDFResource aParentFolder,
|
||||
in long aIndex);
|
||||
|
||||
nsIRDFResource createBookmark(in wstring aName, in string aURL, in nsIRDFResource aParentFolder);
|
||||
nsIRDFResource createBookmarkWithDetails(in wstring aName, in string aURI, in wstring docCharSet,
|
||||
in nsIRDFResource aFolder, in long aIndex);
|
||||
|
||||
void updateBookmarkIcon(in string aURL, in wstring iconURL);
|
||||
void removeBookmarkIcon(in string aURL, in wstring iconURL);
|
||||
|
||||
void updateLastVisitedDate(in string aURL, in wstring docCharset);
|
||||
|
||||
string resolveKeyword(in wstring aName);
|
||||
|
||||
wstring getLastCharset(in string aURI);
|
||||
|
||||
void importSystemBookmarks(in nsIRDFResource aParentFolder);
|
||||
};
|
||||
|
||||
%{C++
|
||||
|
||||
// {E638D760-8687-11d2-B530-000000000000}
|
||||
#define NS_BOOKMARKS_SERVICE_CID \
|
||||
{ 0xe638d760, 0x8687, 0x11d2, { 0xb5, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } }
|
||||
|
||||
#define NS_BOOKMARKS_SERVICE_CONTRACTID \
|
||||
"@mozilla.org/browser/bookmarks-service;1"
|
||||
|
||||
#define NS_BOOKMARKS_DATASOURCE_CONTRACTID \
|
||||
"@mozilla.org/rdf/datasource;1?name=bookmarks"
|
||||
|
||||
%}
|
||||
@@ -1,9 +0,0 @@
|
||||
bm-find.js
|
||||
bm-find.xul
|
||||
bm-panel.js
|
||||
bm-panel.xul
|
||||
bm-props.js
|
||||
bm-props.xul
|
||||
bookmarks.js
|
||||
bookmarksDD.js
|
||||
bookmarks.xul
|
||||
@@ -1,30 +0,0 @@
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,348 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com> (Original Author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**
|
||||
* Add Bookmark Dialog.
|
||||
* ====================
|
||||
*
|
||||
* This is a generic bookmark dialog that allows for bookmark addition
|
||||
* and folder selection. It can be opened with various parameters that
|
||||
* result in appearance/purpose differences and initial state.
|
||||
*
|
||||
* Use: Open with 'openDialog', with the flags
|
||||
* 'centerscreen,chrome,dialog=no,resizable=yes'
|
||||
*
|
||||
* Parameters:
|
||||
* Apart from the standard openDialog parameters, this dialog can
|
||||
* be passed additional information, which gets mapped to the
|
||||
* window.arguments array:
|
||||
*
|
||||
* window.arguments[0]: Bookmark Name. The value to be prefilled
|
||||
* into the "Name: " field (if visible).
|
||||
* window.arguments[1]: Bookmark URL: The location of the bookmark.
|
||||
* The value to be filled in the "Location: "
|
||||
* field (if visible).
|
||||
* window.arguments[2]: Bookmark Folder. The RDF Resource URI of the
|
||||
* folder that this bookmark should be created in.
|
||||
* window.arguments[3]: Bookmark Charset. The charset that should be
|
||||
* used when adding a bookmark to the specified
|
||||
* URL. (Usually the charset of the current
|
||||
* document when launching this window).
|
||||
* window.arguments[4]: The mode of operation. See notes for details.
|
||||
* window.arguments[5]: If the mode is "addGroup", this is an array
|
||||
* of objects with name, URL and charset
|
||||
* properties, one for each group member.
|
||||
*
|
||||
* Mode of Operation Notes:
|
||||
* ------------------------
|
||||
* This dialog can be opened in four different ways by using a parameter
|
||||
* passed through the call to openDialog. The 'mode' of operation
|
||||
* of the window is expressed in window.arguments[4]. The valid modes are:
|
||||
*
|
||||
* 1) <default> (no fifth open parameter).
|
||||
* Opens this dialog with the bookmark Name, URL and folder selection
|
||||
* components visible.
|
||||
* 2) "newBookmark" (fifth open parameter = String("newBookmark"))
|
||||
* Opens the dialog as in (1) above except the folder selection tree
|
||||
* is hidden. This type of mode is useful when the creation folder
|
||||
* is pre-determined.
|
||||
* 3) "selectFolder" (fifth open parameter = String("selectFolder"))
|
||||
* Opens the dialog as in (1) above except the Name/Location section
|
||||
* is hidden, and the dialog takes on the utility of a Folder chooser.
|
||||
* Used when the user must select a Folder for some purpose.
|
||||
* 4) "addGroup" (fifth open parameter = String("addGroup"))
|
||||
* Opens the dialog like <default>, with a checkbox to select between
|
||||
* filing a single bookmark or a group. For the single bookmark the
|
||||
* values are taken from the name, URL and charset arguments.
|
||||
* For the group, the values are taken from the sixth argument.
|
||||
* This parameter can also be String("addGroup,group") where "group"
|
||||
* specifies that the dialog starts in filing as a group.
|
||||
*/
|
||||
|
||||
var gFld_Name = null;
|
||||
var gFld_URL = null;
|
||||
var gFolderTree = null;
|
||||
var gCB_AddGroup = null;
|
||||
|
||||
var gBookmarkCharset = null;
|
||||
|
||||
const kRDFSContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFSIID = Components.interfaces.nsIRDFService;
|
||||
const kRDF = Components.classes[kRDFSContractID].getService(kRDFSIID);
|
||||
|
||||
var gSelectItemObserver = null;
|
||||
|
||||
var gCreateInFolder = "NC:NewBookmarkFolder";
|
||||
|
||||
function Startup()
|
||||
{
|
||||
gFld_Name = document.getElementById("name");
|
||||
gFld_URL = document.getElementById("url");
|
||||
gCB_AddGroup = document.getElementById("addgroup");
|
||||
var bookmarkView = document.getElementById("bookmarks-view");
|
||||
|
||||
var shouldSetOKButton = true;
|
||||
var dialogElement = document.documentElement;
|
||||
if ("arguments" in window) {
|
||||
var ind;
|
||||
var folderItem = null;
|
||||
var arg;
|
||||
if (window.arguments.length < 5)
|
||||
arg = null;
|
||||
else
|
||||
arg = window.arguments[4];
|
||||
switch (arg) {
|
||||
case "selectFolder":
|
||||
// If we're being opened as a folder selection window
|
||||
document.getElementById("bookmarknamegrid").setAttribute("hidden", "true");
|
||||
document.getElementById("createinseparator").setAttribute("hidden", "true");
|
||||
document.getElementById("nameseparator").setAttribute("hidden", "true");
|
||||
sizeToContent();
|
||||
dialogElement.setAttribute("title", dialogElement.getAttribute("title-selectFolder"));
|
||||
shouldSetOKButton = false;
|
||||
if (window.arguments[2])
|
||||
folderItem = bookmarkView.rdf.GetResource(window.arguments[2]);
|
||||
if (folderItem) {
|
||||
ind = bookmarkView.treeBuilder.getIndexOfResource(folderItem);
|
||||
bookmarkView.treeBoxObject.selection.select(ind);
|
||||
}
|
||||
break;
|
||||
case "newBookmark":
|
||||
setupFields();
|
||||
if (window.arguments[2])
|
||||
gCreateInFolder = window.arguments[2];
|
||||
document.getElementById("folderbox").setAttribute("hidden", "true");
|
||||
sizeToFit();
|
||||
break;
|
||||
case "addGroup":
|
||||
document.getElementById("showaddgroup").setAttribute("hidden", "false");
|
||||
setupFields();
|
||||
sizeToFit();
|
||||
break;
|
||||
case "addGroup,group":
|
||||
document.getElementById("showaddgroup").setAttribute("hidden", "false");
|
||||
gCB_AddGroup.setAttribute("checked", "true");
|
||||
setupFields();
|
||||
toggleGroup();
|
||||
sizeToFit();
|
||||
break;
|
||||
default:
|
||||
// Regular Add Bookmark
|
||||
setupFields();
|
||||
if (window.arguments[2]) {
|
||||
gCreateInFolder = window.arguments[2];
|
||||
folderItem = bookmarkView.rdf.GetResource(gCreateInFolder);
|
||||
if (folderItem) {
|
||||
ind = bookmarkView.treeBuilder.getIndexOfResource(folderItem);
|
||||
bookmarkView.treeBoxObject.selection.select(ind);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldSetOKButton)
|
||||
onFieldInput();
|
||||
if (document.getElementById("bookmarknamegrid").hasAttribute("hidden")) {
|
||||
bookmarkView.tree.focus();
|
||||
if (bookmarkView.currentIndex == -1)
|
||||
bookmarkView.treeBoxObject.selection.select(0);
|
||||
}
|
||||
else {
|
||||
gFld_Name.select();
|
||||
gFld_Name.focus();
|
||||
}
|
||||
}
|
||||
|
||||
function sizeToFit()
|
||||
{
|
||||
var dialogElement = document.documentElement;
|
||||
dialogElement.removeAttribute("persist");
|
||||
dialogElement.removeAttribute("height");
|
||||
dialogElement.removeAttribute("width");
|
||||
dialogElement.setAttribute("style", dialogElement.getAttribute("style"));
|
||||
sizeToContent();
|
||||
}
|
||||
|
||||
function setupFields()
|
||||
{
|
||||
// New bookmark in predetermined folder.
|
||||
gFld_Name.value = window.arguments[0] || "";
|
||||
gFld_URL.value = window.arguments[1] || "";
|
||||
onFieldInput();
|
||||
gFld_Name.select();
|
||||
gFld_Name.focus();
|
||||
gBookmarkCharset = window.arguments[3] || null;
|
||||
}
|
||||
|
||||
function onFieldInput()
|
||||
{
|
||||
const ok = document.documentElement.getButton("accept");
|
||||
ok.disabled = gFld_URL.value == "" && !addingGroup() ||
|
||||
gFld_Name.value == "";
|
||||
}
|
||||
|
||||
function onOK()
|
||||
{
|
||||
if (!document.getElementById("folderbox").hasAttribute("hidden")) {
|
||||
var bookmarkView = document.getElementById("bookmarks-view");
|
||||
var currentIndex = bookmarkView.currentIndex;
|
||||
if (currentIndex != -1)
|
||||
gCreateInFolder = bookmarkView.treeBuilder.getResourceAtIndex(currentIndex).Value;
|
||||
}
|
||||
// In Select Folder Mode, do nothing but tell our caller what
|
||||
// folder was selected.
|
||||
if (window.arguments.length > 4 && window.arguments[4] == "selectFolder")
|
||||
window.arguments[5].selectedFolder = gCreateInFolder;
|
||||
else {
|
||||
// Otherwise add a bookmark to the selected folder.
|
||||
|
||||
const kBMDS = kRDF.GetDataSource("rdf:bookmarks");
|
||||
const kBMSContractID = "@mozilla.org/browser/bookmarks-service;1";
|
||||
const kBMSIID = Components.interfaces.nsIBookmarksService;
|
||||
const kBMS = Components.classes[kBMSContractID].getService(kBMSIID);
|
||||
var rFolder = kRDF.GetResource(gCreateInFolder, true);
|
||||
const kRDFCContractID = "@mozilla.org/rdf/container;1";
|
||||
const kRDFIID = Components.interfaces.nsIRDFContainer;
|
||||
const kRDFC = Components.classes[kRDFCContractID].getService(kRDFIID);
|
||||
try {
|
||||
kRDFC.Init(kBMDS, rFolder);
|
||||
}
|
||||
catch (e) {
|
||||
// No "NC:NewBookmarkFolder" exists, just append to the root.
|
||||
rFolder = kRDF.GetResource("NC:BookmarksRoot", true);
|
||||
kRDFC.Init(kBMDS, rFolder);
|
||||
}
|
||||
|
||||
// if no URL was provided and we're not filing as a group, do nothing
|
||||
if (!gFld_URL.value && !addingGroup())
|
||||
return;
|
||||
|
||||
var url;
|
||||
if (addingGroup()) {
|
||||
const group = kBMS.createGroup(gFld_Name.value, rFolder);
|
||||
const groups = window.arguments[5];
|
||||
for (var i = 0; i < groups.length; ++i) {
|
||||
url = getNormalizedURL(groups[i].url);
|
||||
kBMS.createBookmarkWithDetails(groups[i].name, url,
|
||||
groups[i].charset, group, -1);
|
||||
}
|
||||
} else {
|
||||
url = getNormalizedURL(gFld_URL.value);
|
||||
var newBookmark = kBMS.createBookmarkWithDetails(gFld_Name.value, url, gBookmarkCharset, rFolder, -1);
|
||||
if (window.arguments.length > 4 && window.arguments[4] == "newBookmark") {
|
||||
window.arguments[5].newBookmark = newBookmark;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getNormalizedURL(url)
|
||||
{
|
||||
// Check to see if the item is a local directory path, and if so, convert
|
||||
// to a file URL so that aggregation with rdf:files works
|
||||
try {
|
||||
const kLF = Components.classes["@mozilla.org/file/local;1"]
|
||||
.createInstance(Components.interfaces.nsILocalFile);
|
||||
kLF.initWithPath(url);
|
||||
if (kLF.exists()) {
|
||||
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
||||
.getService(Components.classes.nsIIOService);
|
||||
|
||||
url = ioService.getURLSpecFromFile(kLF);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
var gBookmarksShell = null;
|
||||
function createNewFolder ()
|
||||
{
|
||||
var bookmarksView = document.getElementById("bookmarks-view");
|
||||
bookmarksView.createNewFolder();
|
||||
}
|
||||
|
||||
function useDefaultFolder ()
|
||||
{
|
||||
const kBMDS = kRDF.GetDataSource("rdf:bookmarks");
|
||||
var bookmarkView = document.getElementById("bookmarks-view");
|
||||
var sources = kBMDS.GetSources(bookmarkView.rdf.GetResource(NC_NS + "FolderType"), bookmarkView.rdf.GetResource("NC:NewBookmarkFolder"), true);
|
||||
var folder = null;
|
||||
if (sources.hasMoreElements()) {
|
||||
folder = sources.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
|
||||
}
|
||||
var ind = bookmarkView.treeBuilder.getIndexOfResource(folder);
|
||||
if (ind != -1) {
|
||||
bookmarkView.tree.focus();
|
||||
bookmarkView.treeBoxObject.selection.select(ind);
|
||||
gCreateInFolder = folder.Value;
|
||||
}
|
||||
else {
|
||||
bookmarkView.treeBoxObject.selection.clearSelection();
|
||||
gCreateInFolder = "NC:BookmarksRoot";
|
||||
}
|
||||
}
|
||||
|
||||
var gOldNameValue = "";
|
||||
var gOldURLValue = "";
|
||||
|
||||
function toggleGroup()
|
||||
{
|
||||
// swap between single bookmark and group name
|
||||
var temp = gOldNameValue;
|
||||
gOldNameValue = gFld_Name.value;
|
||||
gFld_Name.value = temp;
|
||||
|
||||
// swap between single bookmark and group url
|
||||
temp = gOldURLValue;
|
||||
gOldURLValue = gFld_URL.value;
|
||||
gFld_URL.value = temp;
|
||||
gFld_URL.disabled = gCB_AddGroup.getAttribute("checked") == "true";
|
||||
|
||||
gFld_Name.select();
|
||||
gFld_Name.focus();
|
||||
onFieldInput();
|
||||
}
|
||||
|
||||
function addingGroup()
|
||||
{
|
||||
const showAddGroup = document.getElementById("showaddgroup");
|
||||
return showAddGroup.getAttribute("hidden") != "true" && gCB_AddGroup.getAttribute("checked") == "true";
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!-- -*- Mode: HTML; indent-tabs-mode: nil; -*- -->
|
||||
<!--
|
||||
|
||||
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.org code.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Ben Goodger <ben@netscape.com> (Original Author)
|
||||
|
||||
-->
|
||||
|
||||
<?xml-stylesheet href="chrome://communicator/skin/"?>
|
||||
<?xml-stylesheet href="chrome://communicator/skin/bookmarks/bookmarks.css"?>
|
||||
<?xml-stylesheet href="chrome://communicator/content/bookmarks/bookmarks.css" type="text/css"?>
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
|
||||
%brandDTD;
|
||||
<!ENTITY % addBookmarkDTD SYSTEM "chrome://communicator/locale/bookmarks/addBookmark.dtd">
|
||||
%addBookmarkDTD;
|
||||
]>
|
||||
|
||||
<dialog id="newBookmarkDialog" style="width: 36em;"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
ondialogaccept="return onOK(event)"
|
||||
title="&newBookmark.title;" title-selectFolder="&selectFolder.label;"
|
||||
onload="Startup();"
|
||||
persist="screenX screenY width height"
|
||||
screenX="24" screenY="24">
|
||||
|
||||
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksOverlay.js"/>
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksTree.js"/>
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/addBookmark.js"/>
|
||||
|
||||
<stringbundle id="bookmarksbundle"
|
||||
src="chrome://communicator/locale/bookmarks/bookmark.properties"/>
|
||||
|
||||
<broadcaster id="showaddgroup" hidden="true"/>
|
||||
|
||||
<separator id="nameseparator" class="thin"/>
|
||||
|
||||
<grid id="bookmarknamegrid">
|
||||
<columns>
|
||||
<column/>
|
||||
<column flex="5"/>
|
||||
<column flex="1"/>
|
||||
</columns>
|
||||
<rows>
|
||||
<row align="center">
|
||||
<label value="&name.label;" accesskey="&name.accesskey;" control="name"/>
|
||||
<textbox id="name" oninput="onFieldInput();"/>
|
||||
<spacer/>
|
||||
</row>
|
||||
<row>
|
||||
<separator class="thin"/>
|
||||
<separator class="thin"/>
|
||||
<spacer/>
|
||||
</row>
|
||||
<row align="center">
|
||||
<label value="&url.label;" accesskey="&url.accesskey;" control="url"/>
|
||||
<textbox id="url" oninput="onFieldInput();"/>
|
||||
<spacer/>
|
||||
</row>
|
||||
<row observes="showaddgroup">
|
||||
<separator class="thin"/>
|
||||
<separator class="thin"/>
|
||||
<spacer/>
|
||||
</row>
|
||||
<row observes="showaddgroup">
|
||||
<spacer/>
|
||||
<hbox pack="start">
|
||||
<checkbox id="addgroup" label="&addGroup.label;"
|
||||
accesskey="&addGroup.accesskey;" oncommand="toggleGroup();"/>
|
||||
</hbox>
|
||||
<spacer/>
|
||||
</row>
|
||||
</rows>
|
||||
</grid>
|
||||
|
||||
<separator id="createinseparator"/>
|
||||
|
||||
<vbox id="folderbox" flex="1">
|
||||
<separator/>
|
||||
<hbox flex="1">
|
||||
<label id="createinlabel" value="&createin.label;"/>
|
||||
<hbox flex="1">
|
||||
<bookmarks-tree id="bookmarks-view" flex="1" type="folders"/>
|
||||
<vbox>
|
||||
<button label="&button.newfolder.label;" accesskey="&button.newfolder.accesskey;"
|
||||
oncommand="createNewFolder();"/>
|
||||
<button label="&button.defaultfolder.label;"
|
||||
accesskey="&button.defaultfolder.accesskey;"
|
||||
oncommand="useDefaultFolder();"/>
|
||||
</vbox>
|
||||
</hbox>
|
||||
</hbox>
|
||||
</vbox>
|
||||
|
||||
<separator/>
|
||||
|
||||
</dialog>
|
||||
@@ -1,87 +0,0 @@
|
||||
<?xml version="1.0"?> <!-- -*- Mode: SGML; indent-tabs-mode: nil; -*- -->
|
||||
<!--
|
||||
|
||||
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.org code.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Ben Goodger <ben@netscape.com> (Original Author, v2.0)
|
||||
|
||||
-->
|
||||
|
||||
<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://communicator/skin/sidebar/sidebarListView.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://communicator/skin/bookmarks/bookmarksWindow.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://communicator/content/bookmarks/bookmarks.css" type="text/css"?>
|
||||
|
||||
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://communicator/content/bookmarks/bookmarksOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://communicator/content/tasksOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://communicator/content/communicatorOverlay.xul"?>
|
||||
|
||||
<!DOCTYPE window SYSTEM "chrome://communicator/locale/bookmarks/bookmarks.dtd">
|
||||
|
||||
<page id="bookmarksPanel"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
onload="Startup();" elementtofocus="bookmarks-view">
|
||||
|
||||
<!-- XXX - would like to cut this dependency out -->
|
||||
<script type="application/x-javascript" src="chrome://global/content/strres.js"/>
|
||||
<script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/>
|
||||
|
||||
<!-- Bookmarks Shell -->
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksOverlay.js"/>
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksPanel.js"/>
|
||||
|
||||
<!-- Drag and Drop -->
|
||||
<script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
|
||||
<script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksDD.js"/>
|
||||
|
||||
|
||||
<!-- context menu, tooltips, etc -->
|
||||
<popupset id="bookmarksPopupset"/>
|
||||
|
||||
<!-- bookmarks string bundle -->
|
||||
<stringbundleset id="stringbundleset"/>
|
||||
|
||||
<!-- bookmarks & edit commands -->
|
||||
<commands id="commands">
|
||||
<commandset id="CommandUpdate_Bookmarks"
|
||||
commandupdater="true"
|
||||
events="click,focus"
|
||||
oncommandupdate="document.getElementById('bookmarks-view').onCommandUpdate();">
|
||||
</commandset>
|
||||
<commandset id="bookmarksItems"/>
|
||||
</commands>
|
||||
|
||||
<hbox id="panel-bar" class="toolbar">
|
||||
<toolbarbutton id="btnAddBookmark" label="&command.addBookmark.label;"
|
||||
oncommand="addBookmark();"/>
|
||||
<toolbarbutton id="btnManageBookmarks" label="&command.manageBookmarks.label;"
|
||||
oncommand="manageBookmarks();"/>
|
||||
<spacer flex="1"/>
|
||||
<toolbarseparator/>
|
||||
<toolbarbutton id="btnFindBookmarks" label="&command.findBookmarks.label;"
|
||||
oncommand="document.getElementById('bookmarks-view').openFindDialog();"/>
|
||||
</hbox>
|
||||
|
||||
<bookmarks-tree id="bookmarks-view" class="sidebar" type="single-column" flex="1"/>
|
||||
|
||||
</page>
|
||||
@@ -1,387 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
var NC_NAMESPACE_URI = "http://home.netscape.com/NC-rdf#";
|
||||
|
||||
// XXX MAKE SURE that the "url" field is LAST!
|
||||
// This is important for what happens if/when the URL itself is changed.
|
||||
// Ask rjc@netscape.com if you want to know why exactly this is.
|
||||
|
||||
// This is the set of fields that are visible in the window.
|
||||
var gFields = ["name", "shortcut", "description", "url"];
|
||||
|
||||
// ...and this is a parallel array that contains the RDF properties
|
||||
// that they are associated with.
|
||||
var gProperties = [NC_NAMESPACE_URI + "Name",
|
||||
NC_NAMESPACE_URI + "ShortcutURL",
|
||||
NC_NAMESPACE_URI + "Description",
|
||||
NC_NAMESPACE_URI + "URL"];
|
||||
|
||||
var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"]
|
||||
.getService(Components.interfaces.nsIRDFService);
|
||||
|
||||
var RDFC = Components.classes["@mozilla.org/rdf/container-utils;1"]
|
||||
.getService(Components.interfaces.nsIRDFContainerUtils);
|
||||
|
||||
var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
|
||||
|
||||
var gBookmarkURL = "";
|
||||
|
||||
function Init()
|
||||
{
|
||||
var x;
|
||||
gBookmarkURL = window.arguments[0];
|
||||
|
||||
// Initialize the properties panel by copying the values from the
|
||||
// RDF graph into the fields on screen.
|
||||
|
||||
for (var i = 0; i < gFields.length; ++i) {
|
||||
var field = document.getElementById(gFields[i]);
|
||||
|
||||
var value = Bookmarks.GetTarget(RDF.GetResource(gBookmarkURL),
|
||||
RDF.GetResource(gProperties[i]),
|
||||
true);
|
||||
|
||||
if (value)
|
||||
value = value.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
||||
|
||||
if (value) //make sure were aren't stuffing null into any fields
|
||||
field.value = value;
|
||||
}
|
||||
|
||||
var propsWindow = document.getElementById("bmPropsWindow");
|
||||
var nameNode = document.getElementById("name");
|
||||
var title = propsWindow.getAttribute("title");
|
||||
title = title.replace(/\*\*bm_title\*\*/gi, nameNode.value);
|
||||
propsWindow.setAttribute("title", title);
|
||||
|
||||
// check bookmark schedule
|
||||
value = Bookmarks.GetTarget(RDF.GetResource(gBookmarkURL),
|
||||
RDF.GetResource("http://home.netscape.com/WEB-rdf#Schedule"),
|
||||
true);
|
||||
|
||||
if (value) {
|
||||
value = value.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
||||
|
||||
if (value) {
|
||||
var values = value.split("|");
|
||||
if (values.length == 4) {
|
||||
// get day range
|
||||
var days = values[0];
|
||||
var dayNode = document.getElementById("dayRange");
|
||||
var dayItems = dayNode.childNodes[0].childNodes;
|
||||
for (x=0; x < dayItems.length; ++x) {
|
||||
if (dayItems[x].getAttribute("value") == days) {
|
||||
dayNode.selectedItem = dayItems[x];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// get hour range
|
||||
var hours = values[1].split("-");
|
||||
var startHour = "";
|
||||
var endHour = "";
|
||||
|
||||
if (hours.length == 2) {
|
||||
startHour = hours[0];
|
||||
endHour = hours[1];
|
||||
}
|
||||
|
||||
// set start hour
|
||||
var startHourNode = document.getElementById("startHourRange");
|
||||
var startHourItems = startHourNode.childNodes[0].childNodes;
|
||||
for (x=0; x < startHourItems.length; ++x) {
|
||||
if (startHourItems[x].getAttribute("value") == startHour) {
|
||||
startHourNode.selectedItem = startHourItems[x];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// set end hour
|
||||
var endHourNode = document.getElementById("endHourRange");
|
||||
var endHourItems = endHourNode.childNodes[0].childNodes;
|
||||
for (x=0; x < endHourItems.length; ++x) {
|
||||
if (endHourItems[x].getAttribute("value") == endHour) {
|
||||
endHourNode.selectedItem = endHourItems[x];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// get duration
|
||||
var duration = values[2];
|
||||
var durationNode = document.getElementById("duration");
|
||||
durationNode.value = duration;
|
||||
|
||||
// get notification method
|
||||
var method = values[3];
|
||||
if (method.indexOf("icon") >= 0)
|
||||
document.getElementById("bookmarkIcon").checked = true;
|
||||
|
||||
if (method.indexOf("sound") >= 0)
|
||||
document.getElementById("playSound").checked = true;
|
||||
|
||||
if (method.indexOf("alert") >= 0)
|
||||
document.getElementById("showAlert").checked = true;
|
||||
|
||||
if (method.indexOf("open") >= 0)
|
||||
document.getElementById("openWindow").checked = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if its a container, disable some things
|
||||
var isContainerFlag = RDFC.IsContainer(Bookmarks, RDF.GetResource(gBookmarkURL));
|
||||
if (!isContainerFlag) {
|
||||
// XXX To do: the "RDFC.IsContainer" call above only works for RDF sequences;
|
||||
// if its not a RDF sequence, we should to more checking to see if
|
||||
// the item in question is really a container of not. A good example
|
||||
// of this is the "File System" container.
|
||||
}
|
||||
|
||||
if (isContainerFlag) {
|
||||
// If it is a folder, it has no URL or Keyword
|
||||
document.getElementById("locationrow").setAttribute("hidden", "true");
|
||||
document.getElementById("shortcutrow").setAttribute("hidden", "true");
|
||||
}
|
||||
|
||||
if (gBookmarkURL.substr(0, 7).toLowerCase() != "http://" &&
|
||||
gBookmarkURL.substr(0, 8).toLowerCase() != "https://") {
|
||||
// only allow scheduling of http/https URLs
|
||||
document.getElementById("ScheduleTab").setAttribute("hidden", "true");
|
||||
document.getElementById("NotifyTab").setAttribute("hidden", "true");
|
||||
}
|
||||
|
||||
sizeToContent();
|
||||
|
||||
// Set up the enabled of controls on the scheduling panels
|
||||
dayRangeChange(document.getElementById("dayRange"));
|
||||
|
||||
// set initial focus
|
||||
var name = document.getElementById("name");
|
||||
name.focus();
|
||||
name.select();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function Commit()
|
||||
{
|
||||
var changed = false;
|
||||
|
||||
// Grovel through the fields to see if any of the values have
|
||||
// changed. If so, update the RDF graph and force them to be saved
|
||||
// to disk.
|
||||
for (var i = 0; i < gFields.length; ++i) {
|
||||
var field = document.getElementById(gFields[i]);
|
||||
|
||||
if (field) {
|
||||
// Get the new value as a literal, using 'null' if the value is empty.
|
||||
var newvalue = field.value;
|
||||
|
||||
var oldvalue = Bookmarks.GetTarget(RDF.GetResource(gBookmarkURL),
|
||||
RDF.GetResource(gProperties[i]),
|
||||
true);
|
||||
|
||||
if (oldvalue)
|
||||
oldvalue = oldvalue.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
|
||||
if (newvalue && gProperties[i] == (NC_NAMESPACE_URI + "ShortcutURL")) {
|
||||
// shortcuts are always lowercased internally
|
||||
newvalue = newvalue.toLowerCase();
|
||||
}
|
||||
else if (newvalue && gProperties[i] == (NC_NAMESPACE_URI + "URL")) {
|
||||
// we're dealing with the URL attribute;
|
||||
// if a scheme isn't specified, use "http://"
|
||||
if (newvalue.indexOf(":") < 0)
|
||||
newvalue = "http://" + newvalue;
|
||||
}
|
||||
|
||||
if (newvalue)
|
||||
newvalue = RDF.GetLiteral(newvalue);
|
||||
|
||||
if (updateAttribute(gProperties[i], oldvalue, newvalue)) {
|
||||
// Update gBookmarkURL if the url changed
|
||||
if (newvalue && gProperties[i] == NC_NAMESPACE_URI + "URL")
|
||||
gBookmarkURL = newvalue.Value;
|
||||
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update bookmark schedule if necessary;
|
||||
// if the tab was removed, just skip it
|
||||
var scheduleTab = document.getElementById("ScheduleTab");
|
||||
if (scheduleTab) {
|
||||
var scheduleRes = "http://home.netscape.com/WEB-rdf#Schedule";
|
||||
oldvalue = Bookmarks.GetTarget(RDF.GetResource(gBookmarkURL),
|
||||
RDF.GetResource(scheduleRes), true);
|
||||
newvalue = "";
|
||||
var dayRangeNode = document.getElementById("dayRange");
|
||||
var dayRange = dayRangeNode.selectedItem.getAttribute("value");
|
||||
|
||||
if (dayRange) {
|
||||
var startHourRangeNode = document.getElementById("startHourRange");
|
||||
var startHourRange = startHourRangeNode.selectedItem.getAttribute("value");
|
||||
|
||||
var endHourRangeNode = document.getElementById("endHourRange");
|
||||
var endHourRange = endHourRangeNode.selectedItem.getAttribute("value");
|
||||
|
||||
if (parseInt(startHourRange) > parseInt(endHourRange)) {
|
||||
var temp = startHourRange;
|
||||
startHourRange = endHourRange;
|
||||
endHourRange = temp;
|
||||
}
|
||||
|
||||
var bookmarkBundle;
|
||||
var duration = document.getElementById("duration").value;
|
||||
if (!duration) {
|
||||
bookmarkBundle = document.getElementById("bundle_bookmark");
|
||||
alert (bookmarkBundle.getString("pleaseEnterADuration"));
|
||||
return false;
|
||||
}
|
||||
|
||||
var methods = [];
|
||||
if (document.getElementById("bookmarkIcon").checked)
|
||||
methods.push("icon");
|
||||
if (document.getElementById("playSound").checked)
|
||||
methods.push("sound");
|
||||
if (document.getElementById("showAlert").checked)
|
||||
methods.push("alert");
|
||||
if (document.getElementById("openWindow").checked)
|
||||
methods.push("open");
|
||||
|
||||
if (methods.length == 0) {
|
||||
bookmarkBundle = document.getElementById("bundle_bookmark");
|
||||
alert (bookmarkBundle.getString("pleaseSelectANotification"));
|
||||
return false;
|
||||
}
|
||||
|
||||
var method = methods.join(); // join string in array with ","
|
||||
|
||||
newvalue = dayRange + "|" + startHourRange + "-" + endHourRange + "|" + duration + "|" + method;
|
||||
}
|
||||
|
||||
if (newvalue)
|
||||
newvalue = RDF.GetLiteral(newvalue);
|
||||
|
||||
if (updateAttribute(scheduleRes, oldvalue, newvalue))
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
if (remote)
|
||||
remote.Flush();
|
||||
}
|
||||
|
||||
window.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
function updateAttribute(prop, oldvalue, newvalue)
|
||||
{
|
||||
var changed = false;
|
||||
|
||||
if (prop && (oldvalue || newvalue) && oldvalue != newvalue) {
|
||||
|
||||
if (oldvalue && !newvalue) {
|
||||
Bookmarks.Unassert(RDF.GetResource(gBookmarkURL),
|
||||
RDF.GetResource(prop),
|
||||
oldvalue);
|
||||
}
|
||||
else if (!oldvalue && newvalue) {
|
||||
Bookmarks.Assert(RDF.GetResource(gBookmarkURL),
|
||||
RDF.GetResource(prop),
|
||||
newvalue,
|
||||
true);
|
||||
}
|
||||
else /* if (oldvalue && newvalue) */ {
|
||||
Bookmarks.Change(RDF.GetResource(gBookmarkURL),
|
||||
RDF.GetResource(prop),
|
||||
oldvalue,
|
||||
newvalue);
|
||||
}
|
||||
|
||||
changed = true;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
function setEndHourRange()
|
||||
{
|
||||
// Get the values of the start-time and end-time as ints
|
||||
var startHourRangeNode = document.getElementById("startHourRange");
|
||||
var startHourRange = startHourRangeNode.selectedItem.getAttribute("value");
|
||||
var startHourRangeInt = parseInt(startHourRange);
|
||||
|
||||
var endHourRangeNode = document.getElementById("endHourRange");
|
||||
var endHourRange = endHourRangeNode.selectedItem.getAttribute("value");
|
||||
var endHourRangeInt = parseInt(endHourRange);
|
||||
|
||||
var endHourItemNode = endHourRangeNode.firstChild.firstChild;
|
||||
|
||||
var index = 0;
|
||||
|
||||
// disable all those end-times before the start-time
|
||||
for (; index < startHourRangeInt; ++index) {
|
||||
endHourItemNode.setAttribute("disabled", "true");
|
||||
endHourItemNode = endHourItemNode.nextSibling;
|
||||
}
|
||||
|
||||
// update the selected value if it's out of the allowed range
|
||||
if (startHourRangeInt >= endHourRangeInt)
|
||||
endHourRangeNode.selectedItem = endHourItemNode;
|
||||
|
||||
// make sure all the end-times after the start-time are enabled
|
||||
for (; index < 24; ++index) {
|
||||
endHourItemNode.removeAttribute("disabled");
|
||||
endHourItemNode = endHourItemNode.nextSibling;
|
||||
}
|
||||
}
|
||||
|
||||
function dayRangeChange (aMenuList)
|
||||
{
|
||||
var controls = ["startHourRange", "endHourRange", "duration", "bookmarkIcon",
|
||||
"showAlert", "openWindow", "playSound", "durationSubLabel",
|
||||
"durationLabel", "startHourRangeLabel", "endHourRangeLabel"];
|
||||
for (var i = 0; i < controls.length; ++i)
|
||||
document.getElementById(controls[i]).disabled = !aMenuList.value;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,235 +0,0 @@
|
||||
<?xml version="1.0"?> <!-- -*- Mode: SGML; indent-tabs-mode: nil; -*- -->
|
||||
<!--
|
||||
|
||||
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.org code.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
|
||||
-->
|
||||
|
||||
<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://communicator/skin/bookmarks/bookmarks.css" type="text/css"?>
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
|
||||
%brandDTD;
|
||||
<!ENTITY % bmpropsDTD SYSTEM "chrome://communicator/locale/bookmarks/bm-props.dtd">
|
||||
%bmpropsDTD;
|
||||
]>
|
||||
|
||||
<dialog id="bmPropsWindow" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
title="&bookmarks.windowtitle.label;"
|
||||
onload="Init()" style="width: 30em;"
|
||||
ondialogaccept="return Commit();">
|
||||
|
||||
<stringbundle id="bundle_bookmark" src="chrome://communicator/locale/bookmarks/bookmark.properties"/>
|
||||
<script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/>
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bm-props.js"/>
|
||||
|
||||
<keyset id="keyset"/>
|
||||
|
||||
<tabbox>
|
||||
<tabs>
|
||||
<tab label="&generalInfo.label;" accesskey="&generalInfo.accesskey;"/>
|
||||
<tab id="ScheduleTab" label="&schedule.label;" accesskey="&schedule.accesskey;"/>
|
||||
<tab id="NotifyTab" label="¬ification.label;" accesskey="¬ification.accesskey;"/>
|
||||
</tabs>
|
||||
<tabpanels>
|
||||
<vbox>
|
||||
<separator class="thin"/>
|
||||
<hbox align="start">
|
||||
<image class="message-icon"/>
|
||||
<separator class="thin" orient="vertical"/>
|
||||
<description flex="1">&generaldesc.label;</description>
|
||||
</hbox>
|
||||
|
||||
<separator class="thin"/>
|
||||
|
||||
<vbox class="box-padded">
|
||||
<grid>
|
||||
<columns>
|
||||
<column />
|
||||
<column flex="1"/>
|
||||
</columns>
|
||||
<rows>
|
||||
<row align="center">
|
||||
<label value="&bookmarks.name.label;" control="name"/>
|
||||
<textbox id="name"/>
|
||||
</row>
|
||||
<row id="locationrow" align="center">
|
||||
<label value="&bookmarks.location.label;" control="url"/>
|
||||
<textbox id="url" />
|
||||
</row>
|
||||
<row id="shortcutrow" align="center">
|
||||
<label value="&bookmarks.shortcut.label;" control="shortcut"/>
|
||||
<textbox id="shortcut" />
|
||||
</row>
|
||||
<row>
|
||||
<label value="&bookmarks.description.label;" control="description"/>
|
||||
<textbox multiline="true" wrap="virtual" id="description" flex="1"/>
|
||||
</row>
|
||||
</rows>
|
||||
</grid>
|
||||
<separator/>
|
||||
</vbox>
|
||||
</vbox>
|
||||
|
||||
<vbox>
|
||||
<separator class="thin"/>
|
||||
<hbox align="center">
|
||||
<image id="schedule-icon"/>
|
||||
<separator class="thin" orient="vertical"/>
|
||||
<description flex="1">&schedule.description;</description>
|
||||
</hbox>
|
||||
<separator class="thin"/>
|
||||
<hbox class="box-padded">
|
||||
<spacer flex="1"/>
|
||||
<groupbox>
|
||||
<caption label="&checkforupdates.legend.label;"/>
|
||||
<grid flex="1">
|
||||
<columns>
|
||||
<column/>
|
||||
<column flex="1"/>
|
||||
</columns>
|
||||
<rows>
|
||||
<row align="center">
|
||||
<label value="&when.label;" control="dayRange"/>
|
||||
<hbox>
|
||||
<menulist id="dayRange" oncommand="dayRangeChange(this);">
|
||||
<menupopup>
|
||||
<menuitem value="" label="&checknever.label;"/>
|
||||
<menuseparator />
|
||||
<menuitem value="0123456" label="&checkeveryday.label;"/>
|
||||
<menuitem value="12345" label="&checkweekdays.label;"/>
|
||||
<menuitem value="06" label="&checkweekends.label;"/>
|
||||
<menuitem value="1" label="&checkmondays.label;"/>
|
||||
<menuitem value="2" label="&checktuesdays.label;"/>
|
||||
<menuitem value="3" label="&checkwednesdays.label;"/>
|
||||
<menuitem value="4" label="&checkthursdays.label;"/>
|
||||
<menuitem value="5" label="&checkfridays.label;"/>
|
||||
<menuitem value="6" label="&checksaturdays.label;"/>
|
||||
<menuitem value="0" label="&checksundays.label;"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
</hbox>
|
||||
</row>
|
||||
<row align="center">
|
||||
<label id="startHourRangeLabel"
|
||||
value="&from.label;" control="startHourRange"/>
|
||||
<hbox align="center">
|
||||
<menulist id="startHourRange" oncommand="setEndHourRange()">
|
||||
<menupopup>
|
||||
<menuitem value="0" label="&midnight.label;"/>
|
||||
<menuitem value="1" label="&AMone.label;"/>
|
||||
<menuitem value="2" label="&AMtwo.label;"/>
|
||||
<menuitem value="3" label="&AMthree.label;"/>
|
||||
<menuitem value="4" label="&AMfour.label;"/>
|
||||
<menuitem value="5" label="&AMfive.label;"/>
|
||||
<menuitem value="6" label="&AMsix.label;"/>
|
||||
<menuitem value="7" label="&AMseven.label;"/>
|
||||
<menuitem value="8" label="&AMeight.label;"/>
|
||||
<menuitem value="9" label="&AMnine.label;"/>
|
||||
<menuitem value="10" label="&AMten.label;"/>
|
||||
<menuitem value="11" label="&AMeleven.label;"/>
|
||||
<menuitem value="12" label="&noon.label;"/>
|
||||
<menuitem value="13" label="&PMone.label;"/>
|
||||
<menuitem value="14" label="&PMtwo.label;"/>
|
||||
<menuitem value="15" label="&PMthree.label;"/>
|
||||
<menuitem value="16" label="&PMfour.label;"/>
|
||||
<menuitem value="17" label="&PMfive.label;"/>
|
||||
<menuitem value="18" label="&PMsix.label;"/>
|
||||
<menuitem value="19" label="&PMseven.label;"/>
|
||||
<menuitem value="20" label="&PMeight.label;"/>
|
||||
<menuitem value="21" label="&PMnine.label;"/>
|
||||
<menuitem value="22" label="&PMten.label;"/>
|
||||
<menuitem value="23" label="&PMeleven.label;"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
<label id="endHourRangeLabel"
|
||||
value="&to.label;" control="endHourRange"/>
|
||||
<menulist id="endHourRange">
|
||||
<menupopup onpopupshowing="setEndHourRange()">
|
||||
<menuitem value="1" label="&AMone.label;"/>
|
||||
<menuitem value="2" label="&AMtwo.label;"/>
|
||||
<menuitem value="3" label="&AMthree.label;"/>
|
||||
<menuitem value="4" label="&AMfour.label;"/>
|
||||
<menuitem value="5" label="&AMfive.label;"/>
|
||||
<menuitem value="6" label="&AMsix.label;"/>
|
||||
<menuitem value="7" label="&AMseven.label;"/>
|
||||
<menuitem value="8" label="&AMeight.label;"/>
|
||||
<menuitem value="9" label="&AMnine.label;"/>
|
||||
<menuitem value="10" label="&AMten.label;"/>
|
||||
<menuitem value="11" label="&AMeleven.label;"/>
|
||||
<menuitem value="12" label="&noon.label;"/>
|
||||
<menuitem value="13" label="&PMone.label;"/>
|
||||
<menuitem value="14" label="&PMtwo.label;"/>
|
||||
<menuitem value="15" label="&PMthree.label;"/>
|
||||
<menuitem value="16" label="&PMfour.label;"/>
|
||||
<menuitem value="17" label="&PMfive.label;"/>
|
||||
<menuitem value="18" label="&PMsix.label;"/>
|
||||
<menuitem value="19" label="&PMseven.label;"/>
|
||||
<menuitem value="20" label="&PMeight.label;"/>
|
||||
<menuitem value="21" label="&PMnine.label;"/>
|
||||
<menuitem value="22" label="&PMten.label;"/>
|
||||
<menuitem value="23" label="&PMeleven.label;"/>
|
||||
<menuitem value="24" label="&midnight.label;"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
</hbox>
|
||||
</row>
|
||||
<row align="center">
|
||||
<label id="durationLabel"
|
||||
value="&every.label;" control="duration"/>
|
||||
<hbox align="center">
|
||||
<textbox id="duration" size="4" value="60" />
|
||||
<label id="durationSubLabel" value="&minutes.label;" />
|
||||
</hbox>
|
||||
</row>
|
||||
</rows>
|
||||
</grid>
|
||||
<separator class="thin"/>
|
||||
</groupbox>
|
||||
<spacer flex="1"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
|
||||
<vbox>
|
||||
<separator class="thin"/>
|
||||
<hbox align="start">
|
||||
<image id="notification-icon"/>
|
||||
<separator class="thin" orient="vertical"/>
|
||||
<description flex="1">¬ification.description;</description>
|
||||
</hbox>
|
||||
<separator class="thin"/>
|
||||
<hbox class="box-padded">
|
||||
<spacer flex="1"/>
|
||||
<groupbox>
|
||||
<caption label="¬ifications.legend.label;" />
|
||||
<vbox align="start">
|
||||
<checkbox id="bookmarkIcon" label="¬ification.icon.label;" />
|
||||
<checkbox id="showAlert" label="¬ification.alert.label;" />
|
||||
<checkbox id="openWindow" label="¬ification.window.label;" />
|
||||
<checkbox id="playSound" label="¬ification.sound.label;" />
|
||||
</vbox>
|
||||
</groupbox>
|
||||
<spacer flex="1"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
</tabpanels>
|
||||
</tabbox>
|
||||
</dialog>
|
||||
@@ -1,854 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/*
|
||||
This is the old bookmarks code, included here for the sake of the bookmarks sidebar panel,
|
||||
which will be fixed to use my new code in .9. In the mean time, this file provides a
|
||||
life line to various functionality.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
var NC_NS = "http://home.netscape.com/NC-rdf#";
|
||||
var RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
|
||||
|
||||
function Init() {
|
||||
var tree = document.getElementById("bookmarksTree");
|
||||
tree.controllers.appendController(BookmarksController);
|
||||
var children = document.getElementById('treechildren-bookmarks');
|
||||
tree.selectItem(children.firstChild);
|
||||
tree.focus();
|
||||
|
||||
RefreshSort();
|
||||
}
|
||||
|
||||
var BookmarksController = {
|
||||
supportsCommand: function(command)
|
||||
{
|
||||
switch(command)
|
||||
{
|
||||
case "cmd_undo":
|
||||
case "cmd_redo":
|
||||
return false;
|
||||
case "cmd_cut":
|
||||
case "cmd_copy":
|
||||
case "cmd_paste":
|
||||
case "cmd_delete":
|
||||
case "cmd_selectAll":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
},
|
||||
isCommandEnabled: function(command)
|
||||
{
|
||||
switch(command)
|
||||
{
|
||||
case "cmd_undo":
|
||||
case "cmd_redo":
|
||||
return false;
|
||||
case "cmd_cut":
|
||||
case "cmd_copy":
|
||||
case "cmd_paste":
|
||||
case "cmd_delete":
|
||||
case "cmd_selectAll":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
},
|
||||
doCommand: function(command)
|
||||
{
|
||||
switch(command)
|
||||
{
|
||||
case "cmd_undo":
|
||||
case "cmd_redo":
|
||||
break;
|
||||
case "cmd_cut":
|
||||
doCut();
|
||||
break;
|
||||
case "cmd_copy":
|
||||
doCopy();
|
||||
break;
|
||||
case "cmd_paste":
|
||||
doPaste();
|
||||
break;
|
||||
case "cmd_delete":
|
||||
doDelete();
|
||||
break;
|
||||
case "cmd_selectAll":
|
||||
doSelectAll();
|
||||
break;
|
||||
}
|
||||
},
|
||||
onEvent: function(event)
|
||||
{
|
||||
// On blur events set the menu item texts back to the normal values
|
||||
/*if (event == 'blur' )
|
||||
{
|
||||
goSetMenuValue('cmd_undo', 'valueDefault');
|
||||
goSetMenuValue('cmd_redo', 'valueDefault');
|
||||
}*/
|
||||
}
|
||||
};
|
||||
|
||||
function CommandUpdate_Bookmarks()
|
||||
{
|
||||
//goUpdateCommand('button_delete');
|
||||
// get selection info from dir pane
|
||||
/*
|
||||
var oneAddressBookSelected = false;
|
||||
if ( dirTree && dirTree.selectedItems && (dirTree.selectedItems.length == 1) )
|
||||
oneAddressBookSelected = true;
|
||||
|
||||
// get selection info from results pane
|
||||
var selectedCards = GetSelectedAddresses();
|
||||
var oneOrMoreCardsSelected = false;
|
||||
if ( selectedCards )
|
||||
oneOrMoreCardsSelected = true;
|
||||
*/
|
||||
// set commands to enabled / disabled
|
||||
//goSetCommandEnabled('cmd_PrintCard', oneAddressBookSelected);
|
||||
goSetCommandEnabled('bm_cmd_find', true/*oneAddressBookSelected*/);
|
||||
}
|
||||
|
||||
function copySelectionToClipboard()
|
||||
{
|
||||
var treeNode = document.getElementById("bookmarksTree");
|
||||
if (!treeNode) return false;
|
||||
var select_list = treeNode.selectedItems;
|
||||
if (!select_list) return false;
|
||||
if (select_list.length < 1) return false;
|
||||
|
||||
var rdf_uri = "@mozilla.org/rdf/rdf-service;1"
|
||||
var RDF = Components.classes[rdf_uri].getService();
|
||||
RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
|
||||
if (!RDF) return false;
|
||||
|
||||
var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
|
||||
if (!Bookmarks) return false;
|
||||
|
||||
var nameRes = RDF.GetResource(NC_NS + "Name");
|
||||
if (!nameRes) return false;
|
||||
|
||||
// Build a url that encodes all the select nodes
|
||||
// as well as their parent nodes
|
||||
var url = "";
|
||||
var text = "";
|
||||
var html = "";
|
||||
|
||||
for (var nodeIndex = 0; nodeIndex < select_list.length; nodeIndex++)
|
||||
{
|
||||
var node = select_list[nodeIndex];
|
||||
if (!node) continue;
|
||||
|
||||
var ID = getAbsoluteID("bookmarksTree", node);
|
||||
if (!ID) continue;
|
||||
|
||||
var IDRes = RDF.GetResource(ID);
|
||||
if (!IDRes) continue;
|
||||
var nameNode = Bookmarks.GetTarget(IDRes, nameRes, true);
|
||||
var theName = "";
|
||||
if (nameNode)
|
||||
nameNode =
|
||||
nameNode.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
if (nameNode) theName = nameNode.Value;
|
||||
|
||||
url += "ID:{" + ID + "};";
|
||||
url += "NAME:{" + theName + "};";
|
||||
|
||||
if (node.getAttribute("container") == "true")
|
||||
{
|
||||
var type = node.getAttribute("type");
|
||||
if (type == NC_NS + "BookmarkSeparator")
|
||||
{
|
||||
// Note: can't encode separators in text, just html
|
||||
html += "<hr><p>";
|
||||
}
|
||||
else
|
||||
{
|
||||
text += ID + "\r";
|
||||
|
||||
html += "<a href='" + ID + "'>";
|
||||
if (theName != "")
|
||||
{
|
||||
html += theName;
|
||||
}
|
||||
html += "</a><p>";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (url == "") return false;
|
||||
|
||||
// get some useful components
|
||||
var trans_uri = "@mozilla.org/widget/transferable;1";
|
||||
var trans = Components.classes[trans_uri].createInstance();
|
||||
if (trans) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
|
||||
if (!trans) return false;
|
||||
|
||||
var clip_uri = "@mozilla.org/widget/clipboard;1";
|
||||
var clip = Components.classes[clip_uri].getService();
|
||||
if (clip) clip = clip.QueryInterface(Components.interfaces.nsIClipboard);
|
||||
if (!clip) return false;
|
||||
clip.emptyClipboard(Components.interfaces.nsIClipboard.kGlobalClipboard);
|
||||
|
||||
// save bookmark's ID
|
||||
trans.addDataFlavor("moz/bookmarkclipboarditem");
|
||||
var data_uri = "@mozilla.org/supports-wstring;1";
|
||||
var data = Components.classes[data_uri].createInstance();
|
||||
if (data) {
|
||||
data = data.QueryInterface(Components.interfaces.nsISupportsWString);
|
||||
}
|
||||
if (!data) return false;
|
||||
data.data = url;
|
||||
// double byte data
|
||||
trans.setTransferData("moz/bookmarkclipboarditem", data, url.length*2);
|
||||
|
||||
if (text != "")
|
||||
{
|
||||
trans.addDataFlavor("text/unicode");
|
||||
|
||||
var textData_uri = "@mozilla.org/supports-wstring;1";
|
||||
var textData = Components.classes[textData_uri].createInstance();
|
||||
if (textData) textData = textData.QueryInterface(Components.interfaces.nsISupportsWString);
|
||||
if (!textData) return false;
|
||||
textData.data = text;
|
||||
// double byte data
|
||||
trans.setTransferData("text/unicode", textData, text.length*2);
|
||||
}
|
||||
if (html != "")
|
||||
{
|
||||
trans.addDataFlavor("text/html");
|
||||
|
||||
var wstring_uri = "@mozilla.org/supports-wstring;1";
|
||||
var htmlData = Components.classes[wstring_uri].createInstance();
|
||||
if (htmlData) {
|
||||
var wstring_interface = Components.interfaces.nsISupportsWString;
|
||||
htmlData = htmlData.QueryInterface(wstring_interface);
|
||||
}
|
||||
if (!htmlData) return false;
|
||||
htmlData.data = html;
|
||||
// double byte data
|
||||
trans.setTransferData("text/html", htmlData, html.length*2);
|
||||
}
|
||||
clip.setData(trans, null,
|
||||
Components.interfaces.nsIClipboard.kGlobalClipboard);
|
||||
return true;
|
||||
}
|
||||
|
||||
function doCut()
|
||||
{
|
||||
if (copySelectionToClipboard() == true) {
|
||||
doDelete(false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function doCopy()
|
||||
{
|
||||
copySelectionToClipboard();
|
||||
return true;
|
||||
}
|
||||
|
||||
function doPaste()
|
||||
{
|
||||
var treeNode = document.getElementById("bookmarksTree");
|
||||
if (!treeNode) return false;
|
||||
var select_list = treeNode.selectedItems;
|
||||
if (!select_list) return false;
|
||||
if (select_list.length != 1) return false;
|
||||
|
||||
var pasteNodeID = select_list[0].getAttribute("id");
|
||||
var isContainerFlag = (select_list[0].getAttribute("container") == "true");
|
||||
|
||||
var clip_uri = "@mozilla.org/widget/clipboard;1";
|
||||
var clip = Components.classes[clip_uri].getService();
|
||||
if (clip) clip = clip.QueryInterface(Components.interfaces.nsIClipboard);
|
||||
if (!clip) return false;
|
||||
|
||||
var trans_uri = "@mozilla.org/widget/transferable;1";
|
||||
var trans = Components.classes[trans_uri].createInstance();
|
||||
if (trans) {
|
||||
trans = trans.QueryInterface(Components.interfaces.nsITransferable);
|
||||
}
|
||||
if (!trans) return false;
|
||||
trans.addDataFlavor("moz/bookmarkclipboarditem");
|
||||
|
||||
clip.getData(trans, Components.interfaces.nsIClipboard.kGlobalClipboard);
|
||||
var data = new Object();
|
||||
var dataLen = new Object();
|
||||
trans.getTransferData("moz/bookmarkclipboarditem", data, dataLen);
|
||||
if (data) {
|
||||
var data_interface = Components.interfaces.nsISupportsWString
|
||||
data = data.value.QueryInterface(data_interface);
|
||||
}
|
||||
var url = null;
|
||||
// double byte data
|
||||
if (data) url = data.data.substring(0, dataLen.value / 2);
|
||||
if (!url) return false;
|
||||
|
||||
var strings = url.split(";");
|
||||
if (!strings) return false;
|
||||
|
||||
var rdf_uri = "@mozilla.org/rdf/rdf-service;1";
|
||||
var RDF = Components.classes[rdf_uri].getService();
|
||||
RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
|
||||
if (!RDF) return false;
|
||||
var rdfc_uri = "@mozilla.org/rdf/container;1";
|
||||
var RDFC = Components.classes[rdfc_uri].getService();
|
||||
RDFC = RDFC.QueryInterface(Components.interfaces.nsIRDFContainer);
|
||||
if (!RDFC) return false;
|
||||
var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
|
||||
if (!Bookmarks) return false;
|
||||
|
||||
var nameRes = RDF.GetResource(NC_NS + "Name");
|
||||
if (!nameRes) return false;
|
||||
|
||||
pasteNodeRes = RDF.GetResource(pasteNodeID);
|
||||
if (!pasteNodeRes) return false;
|
||||
var pasteContainerRes = null;
|
||||
var pasteNodeIndex = -1;
|
||||
if (isContainerFlag == true)
|
||||
{
|
||||
pasteContainerRes = pasteNodeRes;
|
||||
}
|
||||
else
|
||||
{
|
||||
var parID = select_list[0].parentNode.parentNode.getAttribute("ref");
|
||||
if (!parID) {
|
||||
parID = select_list[0].parentNode.parentNode.getAttribute("id");
|
||||
}
|
||||
if (!parID) return false;
|
||||
pasteContainerRes = RDF.GetResource(parID);
|
||||
if (!pasteContainerRes) return false;
|
||||
}
|
||||
RDFC.Init(Bookmarks, pasteContainerRes);
|
||||
|
||||
if (isContainerFlag == false)
|
||||
{
|
||||
pasteNodeIndex = RDFC.IndexOf(pasteNodeRes);
|
||||
if (pasteNodeIndex < 0) return false; // how did that happen?
|
||||
}
|
||||
|
||||
var typeRes = RDF.GetResource(RDF_NS + "type");
|
||||
if (!typeRes) return false;
|
||||
var bmTypeRes = RDF.GetResource(NC_NS + "Bookmark");
|
||||
if (!bmTypeRes) return false;
|
||||
|
||||
var dirty = false;
|
||||
for (var x=0; x<strings.length; x=x+2)
|
||||
{
|
||||
var theID = strings[x];
|
||||
var theName = strings[x+1];
|
||||
if ((theID.indexOf("ID:{") == 0) && (theName.indexOf("NAME:{") == 0))
|
||||
{
|
||||
theID = theID.substr(4, theID.length-5);
|
||||
theName = theName.substr(6, theName.length-7);
|
||||
|
||||
var IDRes = RDF.GetResource(theID);
|
||||
if (!IDRes) continue;
|
||||
|
||||
if (RDFC.IndexOf(IDRes) > 0)
|
||||
continue;
|
||||
|
||||
if (theName != "")
|
||||
{
|
||||
var NameLiteral = RDF.GetLiteral(theName);
|
||||
if (NameLiteral)
|
||||
{
|
||||
Bookmarks.Assert(IDRes, nameRes, NameLiteral, true);
|
||||
dirty = true;
|
||||
}
|
||||
}
|
||||
if (isContainerFlag == true)
|
||||
RDFC.AppendElement(IDRes);
|
||||
else
|
||||
RDFC.InsertElementAt(IDRes, pasteNodeIndex++, true);
|
||||
dirty = true;
|
||||
|
||||
// make sure appropriate bookmark type is set
|
||||
var bmTypeNode = Bookmarks.GetTarget( IDRes, typeRes, true );
|
||||
if (!bmTypeNode)
|
||||
{
|
||||
// set default bookmark type
|
||||
Bookmarks.Assert(IDRes, typeRes, bmTypeRes, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dirty == true)
|
||||
{
|
||||
var rdf_ds_interface = Components.interfaces.nsIRDFRemoteDataSource;
|
||||
var remote = Bookmarks.QueryInterface(rdf_ds_interface);
|
||||
if (remote)
|
||||
remote.Flush();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function doDelete(promptFlag)
|
||||
{
|
||||
var treeNode = document.getElementById("bookmarksTree");
|
||||
if (!treeNode) return false;
|
||||
var select_list = treeNode.selectedItems;
|
||||
if (!select_list) return false;
|
||||
if (select_list.length < 1) return false;
|
||||
|
||||
if (promptFlag == true)
|
||||
{
|
||||
var deleteStr = '';
|
||||
if (select_list.length == 1) {
|
||||
deleteStr = get_localized_string("DeleteItem");
|
||||
} else {
|
||||
deleteStr = get_localized_string("DeleteItems");
|
||||
}
|
||||
var ok = confirm(deleteStr);
|
||||
if (!ok) return false;
|
||||
}
|
||||
|
||||
var RDF_uri = "@mozilla.org/rdf/rdf-service;1";
|
||||
var RDF = Components.classes[RDF_uri].getService();
|
||||
RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
|
||||
if (!RDF) return false;
|
||||
|
||||
var RDFC_uri = "@mozilla.org/rdf/container;1";
|
||||
var RDFC = Components.classes[RDFC_uri].getService();
|
||||
RDFC = RDFC.QueryInterface(Components.interfaces.nsIRDFContainer);
|
||||
if (!RDFC) return false;
|
||||
|
||||
var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
|
||||
if (!Bookmarks) return false;
|
||||
|
||||
var dirty = false;
|
||||
|
||||
// note: backwards delete so that we handle odd deletion cases such as
|
||||
// deleting a child of a folder as well as the folder itself
|
||||
for (var nodeIndex=select_list.length-1; nodeIndex>=0; nodeIndex--)
|
||||
{
|
||||
var node = select_list[nodeIndex];
|
||||
if (!node) continue;
|
||||
var ID = node.getAttribute("id");
|
||||
if (!ID) continue;
|
||||
|
||||
// don't allow deletion of various "special" folders
|
||||
if ((ID == "NC:BookmarksRoot") || (ID == "NC:IEFavoritesRoot"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var parentID = node.parentNode.parentNode.getAttribute("ref");
|
||||
if (!parentID) parentID = node.parentNode.parentNode.getAttribute("id");
|
||||
if (!parentID) continue;
|
||||
|
||||
var IDRes = RDF.GetResource(ID);
|
||||
if (!IDRes) continue;
|
||||
var parentIDRes = RDF.GetResource(parentID);
|
||||
if (!parentIDRes) continue;
|
||||
|
||||
RDFC.Init(Bookmarks, parentIDRes);
|
||||
RDFC.RemoveElement(IDRes, true);
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
if (dirty == true)
|
||||
{
|
||||
var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
if (remote)
|
||||
remote.Flush();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function doSelectAll()
|
||||
{
|
||||
var treeNode = document.getElementById("bookmarksTree");
|
||||
if (!treeNode) return false;
|
||||
treeNode.selectAll();
|
||||
return true;
|
||||
}
|
||||
|
||||
function doUnload()
|
||||
{
|
||||
// Get the current window position/size.
|
||||
var x = window.screenX;
|
||||
var y = window.screenY;
|
||||
var h = window.outerHeight;
|
||||
var w = window.outerWidth;
|
||||
|
||||
// Store these into the window attributes (for persistence).
|
||||
var win = document.getElementById("bookmark-window");
|
||||
win.setAttribute("x", x);
|
||||
win.setAttribute("y", y);
|
||||
win.setAttribute("height", h);
|
||||
win.setAttribute("width", w);
|
||||
}
|
||||
|
||||
function BookmarkProperties()
|
||||
{
|
||||
var treeNode = document.getElementById('bookmarksTree');
|
||||
var select_list = treeNode.selectedItems;
|
||||
|
||||
if (select_list.length >= 1) {
|
||||
// don't bother showing properties on bookmark separators
|
||||
var type = select_list[0].getAttribute('type');
|
||||
if (type != NC_NS + "BookmarkSeparator") {
|
||||
window.openDialog("chrome://communicator/content/bookmarks/bm-props.xul",
|
||||
"_blank", "centerscreen,chrome,menubar",
|
||||
select_list[0].getAttribute("id"));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function OpenBookmarksFind()
|
||||
{
|
||||
window.openDialog("chrome://communicator/content/bookmarks/bm-find.xul",
|
||||
"FindBookmarksWindow",
|
||||
"dialog=no,close,chrome,resizable", "bookmarks");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getAbsoluteID(root, node)
|
||||
{
|
||||
var url = node.getAttribute("ref");
|
||||
if ((url == null) || (url == ""))
|
||||
{
|
||||
url = node.getAttribute("id");
|
||||
}
|
||||
try
|
||||
{
|
||||
var rootNode = document.getElementById(root);
|
||||
var ds = null;
|
||||
if (rootNode)
|
||||
{
|
||||
ds = rootNode.database;
|
||||
}
|
||||
|
||||
// add support for anonymous resources such as Internet Search results,
|
||||
// IE favorites under Win32, and NetPositive URLs under BeOS
|
||||
var rdf_uri = "@mozilla.org/rdf/rdf-service;1";
|
||||
var rdf = Components.classes[rdf_uri].getService();
|
||||
if (rdf) rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
|
||||
if (rdf && ds)
|
||||
{
|
||||
var src = rdf.GetResource(url, true);
|
||||
var prop = rdf.GetResource(NC_NS + "URL",
|
||||
true);
|
||||
var target = ds.GetTarget(src, prop, true);
|
||||
if (target) target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
if (target) target = target.Value;
|
||||
if (target) url = target;
|
||||
}
|
||||
}
|
||||
catch(ex)
|
||||
{
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
function OpenURL(event, node, root)
|
||||
{
|
||||
if ((event.button != 0) || (event.detail != 2)
|
||||
|| (node.nodeName != "treeitem"))
|
||||
return false;
|
||||
|
||||
if (node.getAttribute("container") == "true")
|
||||
return false;
|
||||
|
||||
var url = getAbsoluteID(root, node);
|
||||
|
||||
// Ignore "NC:" urls.
|
||||
if (url.substring(0, 3) == "NC:")
|
||||
return false;
|
||||
|
||||
if (event.altKey)
|
||||
{
|
||||
BookmarkProperties();
|
||||
}
|
||||
else
|
||||
{
|
||||
// get right sized window
|
||||
window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", url);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
const nsIFilePicker = Components.interfaces.nsIFilePicker;
|
||||
|
||||
function doContextCmd(cmdName)
|
||||
{
|
||||
// Do some prompting/confirmation for various bookmark
|
||||
// commands that we know about.
|
||||
// If we have values to pass it, they are added to the arguments array
|
||||
|
||||
var nameVal = "";
|
||||
var urlVal = "";
|
||||
var promptStr;
|
||||
|
||||
var picker_uri;
|
||||
var filePicker;
|
||||
|
||||
if (cmdName == NC_NS + "command?cmd=newbookmark")
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
promptStr = get_localized_string("NewBookmarkURLPrompt");
|
||||
urlVal = prompt(promptStr, "");
|
||||
if (!urlVal || urlVal=="") return false;
|
||||
|
||||
// ensure we get a fully qualified URL (protocol colon address)
|
||||
var colonOffset = urlVal.indexOf(":");
|
||||
if (colonOffset > 0) break;
|
||||
alert(get_localized_string("NeedValidURL"));
|
||||
}
|
||||
|
||||
promptStr = get_localized_string("NewBookmarkNamePrompt");
|
||||
nameVal = prompt(promptStr, "");
|
||||
if (!nameVal || nameVal=="") return false;
|
||||
}
|
||||
else if (cmdName == NC_NS + "command?cmd=newfolder")
|
||||
{
|
||||
promptStr = get_localized_string("NewFolderNamePrompt");
|
||||
nameVal = prompt(promptStr, "");
|
||||
if (!nameVal || nameVal=="") return false;
|
||||
}
|
||||
else if ((cmdName == NC_NS + "command?cmd=deletebookmark") ||
|
||||
(cmdName == NC_NS + "command?cmd=deletebookmarkfolder") ||
|
||||
(cmdName == NC_NS + "command?cmd=deletebookmarkseparator"))
|
||||
{
|
||||
return doDelete(true);
|
||||
//var promptStr = get_localized_string("DeleteItems");
|
||||
//if (!confirm(promptStr)) return false;
|
||||
}
|
||||
else if (cmdName == NC_NS + "command?cmd=import")
|
||||
{
|
||||
try
|
||||
{
|
||||
picker_uri = "@mozilla.org/filepicker;1";
|
||||
filePicker = Components.classes[picker_uri].createInstance(nsIFilePicker);
|
||||
if (!filePicker) return false;
|
||||
|
||||
promptStr = get_localized_string("SelectImport");
|
||||
filePicker.init(window, promptStr, nsIFilePicker.modeOpen);
|
||||
filePicker.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
|
||||
if (filePicker.show() != nsIFilePicker.returnCancel)
|
||||
var filename = filePicker.fileURL.spec;
|
||||
if ((!filename) || (filename == "")) return false;
|
||||
|
||||
urlVal = filename;
|
||||
}
|
||||
catch(ex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (cmdName == NC_NS + "command?cmd=export")
|
||||
{
|
||||
try
|
||||
{
|
||||
picker_uri = "@mozilla.org/filepicker;1";
|
||||
filePicker = Components.classes[picker_uri].createInstance(nsIFilePicker);
|
||||
if (!filePicker) return false;
|
||||
|
||||
promptStr = get_localized_string("EnterExport");
|
||||
filePicker.init(window, promptStr, nsIFilePicker.modeSave);
|
||||
filePicker.defaultString = "bookmarks.html";
|
||||
filePicker.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
|
||||
if (filePicker.show() != nsIFilePicker.returnCancel &&
|
||||
filePicker.fileURL.spec &&
|
||||
filePicker.fileURL.spec.length > 0) {
|
||||
urlVal = filePicker.fileURL.spec;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch(ex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
var treeNode = document.getElementById("bookmarksTree");
|
||||
if (!treeNode) return false;
|
||||
var db = treeNode.database;
|
||||
if (!db) return false;
|
||||
|
||||
var compositeDB = db.QueryInterface(Components.interfaces.nsIRDFDataSource);
|
||||
if (!compositeDB) return false;
|
||||
|
||||
var isupports_uri = "@mozilla.org/rdf/rdf-service;1";
|
||||
var isupports = Components.classes[isupports_uri].getService();
|
||||
if (!isupports) return false;
|
||||
var rdf = isupports.QueryInterface(Components.interfaces.nsIRDFService);
|
||||
if (!rdf) return false;
|
||||
|
||||
// need a resource for the command
|
||||
var cmdResource = rdf.GetResource(cmdName);
|
||||
if (!cmdResource) return false;
|
||||
cmdResource = cmdResource.QueryInterface(Components.interfaces.nsIRDFResource);
|
||||
if (!cmdResource) return false;
|
||||
|
||||
// set up selection nsISupportsArray
|
||||
var selection_uri = "@mozilla.org/supports-array;1";
|
||||
var selectionInstance = Components.classes[selection_uri].createInstance();
|
||||
var selectionArray = selectionInstance.QueryInterface(Components.interfaces.nsISupportsArray);
|
||||
|
||||
// set up arguments nsISupportsArray
|
||||
var arguments_uri = "@mozilla.org/supports-array;1";
|
||||
var argumentsInstance = Components.classes[arguments_uri].createInstance();
|
||||
var argumentsArray = argumentsInstance.QueryInterface(Components.interfaces.nsISupportsArray);
|
||||
|
||||
// get various arguments (parent, name)
|
||||
var parentArc = rdf.GetResource(NC_NS + "parent");
|
||||
if (!parentArc) return false;
|
||||
var nameArc = rdf.GetResource(NC_NS + "Name");
|
||||
if (!nameArc) return false;
|
||||
var urlArc = rdf.GetResource(NC_NS + "URL");
|
||||
if (!urlArc) return false;
|
||||
|
||||
var select_list = treeNode.selectedItems;
|
||||
|
||||
var uri;
|
||||
var rdfNode;
|
||||
|
||||
if (select_list.length < 1)
|
||||
{
|
||||
// if nothing is selected, default to using the "ref"
|
||||
// on the root of the tree
|
||||
uri = treeNode.getAttribute("ref");
|
||||
if (!uri || uri=="") return false;
|
||||
rdfNode = rdf.GetResource(uri);
|
||||
// add node into selection array
|
||||
if (rdfNode)
|
||||
{
|
||||
selectionArray.AppendElement(rdfNode);
|
||||
}
|
||||
|
||||
// add singular arguments into arguments array
|
||||
if ((nameVal) && (nameVal != ""))
|
||||
{
|
||||
var nameLiteral = rdf.GetLiteral(nameVal);
|
||||
if (!nameLiteral) return false;
|
||||
argumentsArray.AppendElement(nameArc);
|
||||
argumentsArray.AppendElement(nameLiteral);
|
||||
}
|
||||
if ((urlVal) && (urlVal != ""))
|
||||
{
|
||||
var urlLiteral = rdf.GetLiteral(urlVal);
|
||||
if (!urlLiteral) return false;
|
||||
argumentsArray.AppendElement(urlArc);
|
||||
argumentsArray.AppendElement(urlLiteral);
|
||||
}
|
||||
}
|
||||
else for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++)
|
||||
{
|
||||
var node = select_list[nodeIndex];
|
||||
if (!node) break;
|
||||
uri = node.getAttribute("ref");
|
||||
if ((uri) || (uri == ""))
|
||||
{
|
||||
uri = node.getAttribute("id");
|
||||
}
|
||||
if (!uri) return false;
|
||||
|
||||
rdfNode = rdf.GetResource(uri);
|
||||
if (!rdfNode) break;
|
||||
|
||||
// add node into selection array
|
||||
selectionArray.AppendElement(rdfNode);
|
||||
|
||||
// get the parent's URI
|
||||
var parentURI = "";
|
||||
var theParent = node.parentNode.parentNode;
|
||||
parentURI = theParent.getAttribute("ref");
|
||||
if ((!parentURI) || (parentURI == ""))
|
||||
{
|
||||
parentURI = theParent.getAttribute("id");
|
||||
}
|
||||
if (parentURI == "") return false;
|
||||
|
||||
var parentNode = rdf.GetResource(parentURI, true);
|
||||
if (!parentNode) return false;
|
||||
|
||||
// add multiple arguments into arguments array
|
||||
argumentsArray.AppendElement(parentArc);
|
||||
argumentsArray.AppendElement(parentNode);
|
||||
|
||||
if ((nameVal) && (nameVal != ""))
|
||||
{
|
||||
var nameLiteral2 = rdf.GetLiteral(nameVal);
|
||||
if (!nameLiteral2) return false;
|
||||
argumentsArray.AppendElement(nameArc);
|
||||
argumentsArray.AppendElement(nameLiteral2);
|
||||
}
|
||||
if ((urlVal) && (urlVal != ""))
|
||||
{
|
||||
var urlLiteral2 = rdf.GetLiteral(urlVal);
|
||||
if (!urlLiteral2) return false;
|
||||
argumentsArray.AppendElement(urlArc);
|
||||
argumentsArray.AppendElement(urlLiteral2);
|
||||
}
|
||||
}
|
||||
|
||||
// do the command
|
||||
compositeDB.DoCommand(selectionArray, cmdResource, argumentsArray);
|
||||
return true;
|
||||
}
|
||||
|
||||
function bookmarkSelect()
|
||||
{
|
||||
var tree = document.getElementById("bookmarksTree");
|
||||
var status = document.getElementById("statusbar-text");
|
||||
var val = "";
|
||||
if (tree.selectedItems.length == 1)
|
||||
{
|
||||
val = getAbsoluteID("bookmarksTree", tree.selectedItems[0]);
|
||||
|
||||
// Ignore "NC:" urls.
|
||||
if (val.substring(0, 3) == "NC:")
|
||||
{
|
||||
val = "";
|
||||
}
|
||||
}
|
||||
status.label = val;
|
||||
return true;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
bookmarks-tree, bookmarks-tree[type="multi-column"]
|
||||
{
|
||||
-moz-binding : url("chrome://communicator/content/bookmarks/bookmarks.xml#bookmarks-tree-full");
|
||||
}
|
||||
|
||||
bookmarks-tree[type="single-column"]
|
||||
{
|
||||
-moz-binding : url("chrome://communicator/content/bookmarks/bookmarks.xml#bookmarks-tree-name");
|
||||
}
|
||||
|
||||
bookmarks-tree[type="folders"]
|
||||
{
|
||||
-moz-binding : url("chrome://communicator/content/bookmarks/bookmarks.xml#bookmarks-tree-folders");
|
||||
}
|
||||
@@ -1,219 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com> (Original Author, v3.0)
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Initialize the command controllers, set focus, tree root,
|
||||
// window title state, etc.
|
||||
function Startup()
|
||||
{
|
||||
const windowNode = document.getElementById("bookmark-window");
|
||||
const bookmarksView = document.getElementById("bookmarks-view");
|
||||
var titleString;
|
||||
|
||||
// If we've been opened with a parameter, root the tree on it.
|
||||
if ("arguments" in window && window.arguments[0]) {
|
||||
var title;
|
||||
var uri = window.arguments[0];
|
||||
bookmarksView.tree.setAttribute("ref", uri);
|
||||
if (uri.substring(0,5) == "find:") {
|
||||
title = bookmarksView._bundle.GetStringFromName("search_results_title");
|
||||
// Update the windowtype so that future searches are directed
|
||||
// there and the window is not re-used for bookmarks.
|
||||
windowNode.setAttribute("windowtype", "bookmarks:searchresults");
|
||||
}
|
||||
else {
|
||||
const krNameArc = bookmarksView.rdf.GetResource(NC_NS + "Name");
|
||||
const krRoot = bookmarksView.rdf.GetResource(window.arguments[0]);
|
||||
var rName = bookmarksView.db.GetTarget(krRoot, krNameArc, true);
|
||||
title = rName.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
||||
}
|
||||
titleString = bookmarksView._bundle.GetStringFromName("window_title");
|
||||
titleString = titleString.replace(/%folder_name%/gi, title);
|
||||
windowNode.setAttribute("title", titleString);
|
||||
}
|
||||
else {
|
||||
const kProfileContractID = "@mozilla.org/profile/manager;1";
|
||||
const kProfileIID = Components.interfaces.nsIProfile;
|
||||
const kProfile = Components.classes[kProfileContractID].getService(kProfileIID);
|
||||
var length = {value:0};
|
||||
var profileList = kProfile.getProfileList(length);
|
||||
// unset the default BM title if the user has more than one profile
|
||||
// or if he/she has changed the name of the default one.
|
||||
// the profile "default" is not localizable.
|
||||
if (length.value > 1 || kProfile.currentProfile.toLowerCase() != "default") {
|
||||
titleString = bookmarksView._bundle.GetStringFromName("bookmarks_root");
|
||||
titleString = titleString.replace(/%user_name%/, kProfile.currentProfile);
|
||||
windowNode.setAttribute("title", titleString);
|
||||
}
|
||||
}
|
||||
|
||||
bookmarksView.treeBoxObject.selection.select(0);
|
||||
bookmarksView.tree.focus();
|
||||
}
|
||||
|
||||
function Shutdown ()
|
||||
{
|
||||
// Store current window position and size in window attributes (for persistence).
|
||||
var win = document.getElementById("bookmark-window");
|
||||
win.setAttribute("x", screenX);
|
||||
win.setAttribute("y", screenY);
|
||||
win.setAttribute("height", outerHeight);
|
||||
win.setAttribute("width", outerWidth);
|
||||
|
||||
var bookmarksView = document.getElementById("bookmarks-view");
|
||||
bookmarksView.flushBMDatasource();
|
||||
}
|
||||
|
||||
var gConstructedViewMenuSortItems = false;
|
||||
function fillViewMenu(aEvent)
|
||||
{
|
||||
var adjacentElement = document.getElementById("fill-before-this-node");
|
||||
var popupElement = aEvent.target;
|
||||
|
||||
var bookmarksView = document.getElementById("bookmarks-view");
|
||||
var columns = bookmarksView.columns;
|
||||
|
||||
if (!gConstructedViewMenuSortItems) {
|
||||
for (var i = 0; i < columns.length; ++i) {
|
||||
var name = columns[i].name;
|
||||
var accesskey = columns[i].accesskey;
|
||||
|
||||
var menuitem = document.createElement("menuitem");
|
||||
var nameTemplate = bookmarksView._bundle.GetStringFromName("SortMenuItem");
|
||||
name = nameTemplate.replace(/%NAME%/g, columns[i].label);
|
||||
menuitem.setAttribute("label", name);
|
||||
menuitem.setAttribute("accesskey", columns[i].accesskey);
|
||||
menuitem.setAttribute("resource", columns[i].resource);
|
||||
menuitem.setAttribute("id", "sortMenuItem:" + columns[i].resource);
|
||||
menuitem.setAttribute("checked", columns[i].sortActive);
|
||||
menuitem.setAttribute("name", "sortSet");
|
||||
menuitem.setAttribute("type", "radio");
|
||||
|
||||
popupElement.insertBefore(menuitem, adjacentElement);
|
||||
}
|
||||
|
||||
gConstructedViewMenuSortItems = true;
|
||||
}
|
||||
|
||||
const kPrefSvcContractID = "@mozilla.org/preferences;1";
|
||||
const kPrefSvcIID = Components.interfaces.nsIPrefService;
|
||||
var prefSvc = Components.classes[kPrefSvcContractID].getService(kPrefSvcIID);
|
||||
var bookmarksSortPrefs = prefSvc.getBranch("browser.bookmarks.sort.");
|
||||
|
||||
if (gConstructedViewMenuSortItems) {
|
||||
var resource = bookmarksSortPrefs.getCharPref("resource");
|
||||
var element = document.getElementById("sortMenuItem:" + resource);
|
||||
if (element)
|
||||
element.setAttribute("checked", "true");
|
||||
}
|
||||
|
||||
var sortAscendingMenu = document.getElementById("ascending");
|
||||
var sortDescendingMenu = document.getElementById("descending");
|
||||
var noSortMenu = document.getElementById("natural");
|
||||
|
||||
sortAscendingMenu.setAttribute("checked", "false");
|
||||
sortDescendingMenu.setAttribute("checked", "false");
|
||||
noSortMenu.setAttribute("checked", "false");
|
||||
var direction = bookmarksSortPrefs.getCharPref("direction");
|
||||
if (direction == "natural")
|
||||
sortAscendingMenu.setAttribute("checked", "true");
|
||||
else if (direction == "ascending")
|
||||
sortDescendingMenu.setAttribute("checked", "true");
|
||||
else
|
||||
noSortMenu.setAttribute("checked", "true");
|
||||
}
|
||||
|
||||
function onViewMenuSortItemSelected(aEvent)
|
||||
{
|
||||
var resource = aEvent.target.getAttribute("resource");
|
||||
|
||||
const kPrefSvcContractID = "@mozilla.org/preferences;1";
|
||||
const kPrefSvcIID = Components.interfaces.nsIPrefService;
|
||||
var prefSvc = Components.classes[kPrefSvcContractID].getService(kPrefSvcIID);
|
||||
var bookmarksSortPrefs = prefSvc.getBranch("browser.bookmarks.sort.");
|
||||
|
||||
switch (resource) {
|
||||
case "":
|
||||
break;
|
||||
case "direction":
|
||||
var dirn = bookmarksSortPrefs.getCharPref("direction");
|
||||
if (aEvent.target.id == "ascending")
|
||||
bookmarksSortPrefs.setCharPref("direction", "natural");
|
||||
else if (aEvent.target.id == "descending")
|
||||
bookmarksSortPrefs.setCharPref("direction", "ascending");
|
||||
else
|
||||
bookmarksSortPrefs.setCharPref("direction", "descending");
|
||||
break;
|
||||
default:
|
||||
bookmarksSortPrefs.setCharPref("resource", resource);
|
||||
var direction = bookmarksSortPrefs.getCharPref("direction");
|
||||
if (direction == "descending")
|
||||
bookmarksSortPrefs.setCharPref("direction", "natural");
|
||||
break;
|
||||
}
|
||||
|
||||
aEvent.preventCapture();
|
||||
}
|
||||
|
||||
var gConstructedColumnsMenuItems = false;
|
||||
function fillColumnsMenu(aEvent)
|
||||
{
|
||||
var bookmarksView = document.getElementById("bookmarks-view");
|
||||
var columns = bookmarksView.columns;
|
||||
var i;
|
||||
|
||||
if (!gConstructedColumnsMenuItems) {
|
||||
for (i = 0; i < columns.length; ++i) {
|
||||
var menuitem = document.createElement("menuitem");
|
||||
menuitem.setAttribute("label", columns[i].label);
|
||||
menuitem.setAttribute("resource", columns[i].resource);
|
||||
menuitem.setAttribute("id", "columnMenuItem:" + columns[i].resource);
|
||||
menuitem.setAttribute("type", "checkbox");
|
||||
menuitem.setAttribute("checked", columns[i].hidden != "true");
|
||||
aEvent.target.appendChild(menuitem);
|
||||
}
|
||||
|
||||
gConstructedColumnsMenuItems = true;
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < columns.length; ++i) {
|
||||
var element = document.getElementById("columnMenuItem:" + columns[i].resource);
|
||||
if (element && columns[i].hidden != "true")
|
||||
element.setAttribute("checked", "true");
|
||||
}
|
||||
}
|
||||
|
||||
aEvent.preventBubble();
|
||||
}
|
||||
|
||||
function onViewMenuColumnItemSelected(aEvent)
|
||||
{
|
||||
var resource = aEvent.target.getAttribute("resource");
|
||||
if (resource != "") {
|
||||
var bookmarksView = document.getElementById("bookmarks-view");
|
||||
bookmarksView.toggleColumnVisibility(resource);
|
||||
}
|
||||
|
||||
aEvent.preventBubble();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,252 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!-- -*- Mode: HTML; indent-tabs-mode: nil; -*- -->
|
||||
<!--
|
||||
|
||||
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.org code.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Ben Goodger <ben@netscape.com>
|
||||
Blake Ross <blakeross@telocity.com>
|
||||
Dean Tessman <dean_tessman@hotmail.com>
|
||||
|
||||
-->
|
||||
|
||||
<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://communicator/skin/bookmarks/bookmarksWindow.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://communicator/content/bookmarks/bookmarks.css" type="text/css"?>
|
||||
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://communicator/content/bookmarks/bookmarksOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://communicator/content/tasksOverlay.xul"?>
|
||||
<?xul-overlay href="chrome://communicator/content/communicatorOverlay.xul"?>
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % utilDTD SYSTEM "chrome://communicator/locale/utilityOverlay.dtd" >
|
||||
%utilDTD;
|
||||
<!ENTITY % bmDTD SYSTEM "chrome://communicator/locale/bookmarks/bookmarks.dtd">
|
||||
%bmDTD;
|
||||
]>
|
||||
|
||||
<window id="bookmark-window" windowtype="bookmarks:manager"
|
||||
title="&bookmarksWindowTitle.label;"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:web="http://home.netscape.com/WEB-rdf#"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
width="630" height="400" screenX="20" screenY="20"
|
||||
persist="width height screenX screenY sizemode"
|
||||
onload="Startup();" onunload="Shutdown();">
|
||||
|
||||
<!-- The order of loading of these script files is IMPORTANT -->
|
||||
|
||||
<!-- Shared Libraries -->
|
||||
<script type="application/x-javascript" src="chrome://global/content/strres.js"></script>
|
||||
|
||||
<!-- XXX - This should SO become an XBL widget -->
|
||||
<script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"></script>
|
||||
|
||||
<!-- Shared Bookmarks Utility Library -->
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksOverlay.js"/>
|
||||
<!-- Tree-based Bookmarks UI Utility Library -->
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksTree.js"/>
|
||||
<!-- Bookmarks Window -->
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarks.js"/>
|
||||
|
||||
<!-- Bookmarks Window Drag & Drop -->
|
||||
<script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
|
||||
<script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksDD.js"/>
|
||||
|
||||
<popupset id="bookmarksPopupset"/>
|
||||
|
||||
<commands id="commands">
|
||||
<commandset id="CommandUpdate_Bookmarks"
|
||||
commandupdater="true"
|
||||
events="focus,tree-select"
|
||||
oncommandupdate="document.getElementById('bookmarks-view').onCommandUpdate();">
|
||||
</commandset>
|
||||
|
||||
<commandset id="tasksCommands"/>
|
||||
|
||||
<!-- File Menu -->
|
||||
<command id="cmd_close" oncommand="close()"/>
|
||||
<command id="cmd_quit"/>
|
||||
<!-- Edit Menu -->
|
||||
<command id="cmd_undo"/>
|
||||
</commands>
|
||||
|
||||
<stringbundleset id="stringbundleset"/>
|
||||
|
||||
<keyset id="tasksKeys">
|
||||
<!-- File Menu -->
|
||||
<key id="key_close"/>
|
||||
<key id="key_quit"/>
|
||||
<!-- Edit Menu -->
|
||||
<key id="key_undo"/>
|
||||
|
||||
<!-- These keybindings do not have a command specified in the overlay,
|
||||
which is good, but we need to specify it ourselves here -->
|
||||
<key id="key_cut" command="cmd_bm_cut"/>
|
||||
<key id="key_copy" command="cmd_bm_copy"/>
|
||||
<key id="key_paste" command="cmd_bm_paste"/>
|
||||
<key id="key_selectAll" command="cmd_bm_selectAll"/>
|
||||
|
||||
<!-- We need to provide our own delete key binding because the key_delete
|
||||
handler in platformGlobalOverlay.xul maps command to "cmd_delete" which
|
||||
is NOT what we want! -->
|
||||
<key id="key_bm_delete" keycode="VK_DELETE" command="cmd_bm_delete"/>
|
||||
|
||||
<key id="bm_key_find"
|
||||
key="&edit.find.keybinding;"
|
||||
command="cmd_bm_find" modifiers="accel"/>
|
||||
<key id="bm_key_properties"
|
||||
key="&edit.properties.keybinding;"
|
||||
command="cmd_bm_properties" modifiers="accel"/>
|
||||
</keyset>
|
||||
|
||||
<toolbox id="bookmarks-toolbox">
|
||||
<menubar id="main-menubar" grippytooltiptext="&menuBar.tooltip;">
|
||||
<menu id="menu_File">
|
||||
<menupopup id="menu_FilePopup">
|
||||
<menu id="menu_New">
|
||||
<menupopup>
|
||||
<menuitem label="&menuitem.newBookmark.label;"
|
||||
accesskey="&command.newBookmark.accesskey;"
|
||||
observes="cmd_bm_newbookmark"/>
|
||||
<menuitem label="&menuitem.newFolder.label;"
|
||||
accesskey="&command.newFolder.accesskey;"
|
||||
observes="cmd_bm_newfolder"/>
|
||||
<menuitem label="&menuitem.newSeparator.label;"
|
||||
accesskey="&command.newSeparator.accesskey;"
|
||||
observes="cmd_bm_newseparator"/>
|
||||
</menupopup>
|
||||
</menu>
|
||||
<menuitem id="menu_close"/>
|
||||
</menupopup>
|
||||
</menu>
|
||||
<menu id="menu_Edit">
|
||||
<menupopup>
|
||||
<menuitem id="menu_undo" disabled="true"/>
|
||||
<menuseparator/>
|
||||
<menuitem id="menu_bm_cut"
|
||||
label="&cutCmd.label;" accesskey="&cutCmd.accesskey;"
|
||||
key="key_cut" command="cmd_bm_cut"/>
|
||||
<menuitem id="menu_bm_copy"
|
||||
label="©Cmd.label;" accesskey="©Cmd.accesskey;"
|
||||
key="key_copy" command="cmd_bm_copy"/>
|
||||
<menuitem id="menu_bm_paste"
|
||||
label="&pasteCmd.label;" accesskey="&pasteCmd.accesskey;"
|
||||
key="key_paste" command="cmd_bm_paste"/>
|
||||
<menuitem id="menu_bm_delete"
|
||||
label="&deleteCmd.label;" accesskey="&deleteCmd.label;"
|
||||
key="key_bm_delete" command="cmd_bm_delete"/>
|
||||
<menuseparator/>
|
||||
<menuitem id="menu_bm_selectAll"
|
||||
label="&selectAllCmd.label;" accesskey="&selectAllCmd.accesskey;"
|
||||
key="key_selectAll" command="cmd_bm_selectAll"/>
|
||||
<menuseparator/>
|
||||
<menuitem label="&command.fileBookmark.label;"
|
||||
accesskey="&command.fileBookmark.accesskey;"
|
||||
command="cmd_bm_fileBookmark"/>
|
||||
<menuseparator/>
|
||||
<menuitem observes="cmd_bm_properties" key="bm_key_properties"
|
||||
label="&command.properties.label;"
|
||||
accesskey="&command.properties.accesskey;" />
|
||||
</menupopup>
|
||||
</menu>
|
||||
|
||||
<menu id="menu_View">
|
||||
<menupopup onpopupshowing="fillViewMenu(event)"
|
||||
oncommand="onViewMenuSortItemSelected(event);">
|
||||
<menuitem id="viewCommandToolbar" type="checkbox" class="menuitem-iconic"
|
||||
label="&menuitem.view.command.toolbar.label;"
|
||||
accesskey="&menuitem.view.command.toolbar.accesskey;"
|
||||
oncommand="goToggleToolbar('command-toolbar', 'viewCommandToolbar'); event.preventBubble();"
|
||||
persist="checked"/>
|
||||
<menuseparator id="fill-after-this-node"/>
|
||||
<menuitem id="natural" label="&menuitem.view.unsorted.label;"
|
||||
accesskey="&menuitem.view.unsorted.accesskey;"
|
||||
type="radio"
|
||||
resource="direction" name="sortSet"/>
|
||||
<menuseparator id="fill-before-this-node"/>
|
||||
<menuitem id="ascending" label="&menuitem.view.ascending.label;"
|
||||
accesskey="&menuitem.view.ascending.accesskey;"
|
||||
type="radio"
|
||||
resource="direction" name="sortDirectionSet"/>
|
||||
<menuitem id="descending" label="&menuitem.view.descending.label;"
|
||||
accesskey="&menuitem.view.descending.accesskey;"
|
||||
type="radio"
|
||||
resource="direction" name="sortDirectionSet"/>
|
||||
<menuseparator/>
|
||||
<menu id="descending" label="&menuitem.view.show_columns.label;"
|
||||
accesskey="&menuitem.view.show_columns.accesskey;">
|
||||
<menupopup id="columnsPopup" onpopupshowing="fillColumnsMenu(event);"
|
||||
oncommand="onViewMenuColumnItemSelected(event);"/>
|
||||
</menu>
|
||||
<menuseparator/>
|
||||
<menuitem label="&menuitem.newbookmarkfolder.label;"
|
||||
command="cmd_bm_setnewbookmarkfolder"
|
||||
accesskey="&menuitem.newbookmarkfolder.accesskey;"/>
|
||||
<menuitem label="&menuitem.newinternetsearchfolder.label;"
|
||||
command="cmd_bm_setnewsearchfolder"
|
||||
accesskey="&menuitem.newinternetsearchfolder.accesskey;"/>
|
||||
<menuitem label="&menuitem.personaltoolbarfolder.label;"
|
||||
command="cmd_bm_setpersonaltoolbarfolder"
|
||||
accesskey="&menuitem.personaltoolbarfolder.accesskey;"/>
|
||||
</menupopup>
|
||||
</menu>
|
||||
<menu id="tasksMenu">
|
||||
<menupopup id="taskPopup">
|
||||
<menuitem command="cmd_bm_find" key="bm_key_find"
|
||||
label="&menuitem.find.label;"
|
||||
accesskey="&menuitem.find.accesskey;"/>
|
||||
<menuitem label="&menuitem.import.label;"
|
||||
accesskey="&menuitem.import.accesskey;"
|
||||
observes="cmd_bm_import"/>
|
||||
<menuitem label="&menuitem.export.label;"
|
||||
accesskey="&menuitem.export.accesskey;"
|
||||
observes="cmd_bm_export"/>
|
||||
<menuseparator/>
|
||||
</menupopup>
|
||||
</menu>
|
||||
<menu id="windowMenu"/>
|
||||
<menu id="menu_Help"/>
|
||||
</menubar>
|
||||
|
||||
<toolbar id="command-toolbar" tbalign="stretch" grippytooltiptext="&bookmarkToolbar.tooltip;">
|
||||
<toolbarbutton id="newfolder" label="&button.newFolder.label;"
|
||||
command="cmd_bm_newfolder"/>
|
||||
<toolbarbutton id="newseparator" label="&button.newSeparator.label;"
|
||||
command="cmd_bm_newseparator"/>
|
||||
<toolbarseparator/>
|
||||
<toolbarbutton id="fileBookmark" label="&command.fileBookmark.label;"
|
||||
command="cmd_bm_fileBookmark"/>
|
||||
<toolbarseparator/>
|
||||
<toolbarbutton id="properties" label="&command.properties.label;"
|
||||
command="cmd_bm_properties"/>
|
||||
<toolbarbutton id="rename" label="&command.rename.label;"
|
||||
command="cmd_bm_rename"/>
|
||||
<toolbarbutton id="delete" label="&command.delete.label;"
|
||||
command="cmd_bm_delete"/>
|
||||
</toolbar>
|
||||
</toolbox>
|
||||
|
||||
<bookmarks-tree id="bookmarks-view" flex="1"/>
|
||||
|
||||
</window>
|
||||
|
||||
@@ -1,508 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/*
|
||||
This is the old bookmarks code, included here for the sake of the bookmarks sidebar panel,
|
||||
which will be fixed to use my new code in .9. In the mean time, this file provides a
|
||||
life line to various functionality.
|
||||
*/
|
||||
|
||||
|
||||
var NC_NS = "http://home.netscape.com/NC-rdf#";
|
||||
var RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
|
||||
|
||||
|
||||
|
||||
function TopLevelDrag ( event )
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
function BeginDragTree ( event )
|
||||
{
|
||||
//XXX we rely on a capturer to already have determined which item the mouse was over
|
||||
//XXX and have set an attribute.
|
||||
|
||||
// if the click is on the tree proper, ignore it. We only care about clicks on items.
|
||||
|
||||
var tree = document.getElementById("bookmarksTree");
|
||||
if ( event.target == tree || event.target.localName == "treechildren" )
|
||||
return(true); // continue propagating the event
|
||||
|
||||
var childWithDatabase = tree;
|
||||
if ( ! childWithDatabase )
|
||||
return(false);
|
||||
|
||||
var dragStarted = false;
|
||||
|
||||
var trans =
|
||||
Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
|
||||
if ( !trans ) return(false);
|
||||
|
||||
var genData =
|
||||
Components.classes["@mozilla.org/supports-wstring;1"].createInstance(Components.interfaces.nsISupportsWString);
|
||||
if (!genData) return(false);
|
||||
|
||||
var genDataURL =
|
||||
Components.classes["@mozilla.org/supports-wstring;1"].createInstance(Components.interfaces.nsISupportsWString);
|
||||
if (!genDataURL) return(false);
|
||||
|
||||
trans.addDataFlavor("text/unicode");
|
||||
trans.addDataFlavor("moz/rdfitem");
|
||||
|
||||
// ref/id (url) is on the <treeitem> which is two levels above the <treecell> which is
|
||||
// the target of the event.
|
||||
var id = event.target.parentNode.parentNode.getAttribute("ref");
|
||||
if (!id || id=="")
|
||||
{
|
||||
id = event.target.parentNode.parentNode.getAttribute("id");
|
||||
}
|
||||
|
||||
var parentID = event.target.parentNode.parentNode.parentNode.parentNode.getAttribute("ref");
|
||||
if (!parentID || parentID == "")
|
||||
{
|
||||
parentID = event.target.parentNode.parentNode.parentNode.parentNode.getAttribute("id");
|
||||
}
|
||||
|
||||
var trueID = id;
|
||||
if (parentID != null)
|
||||
{
|
||||
trueID += "\n" + parentID;
|
||||
}
|
||||
genData.data = trueID;
|
||||
genDataURL.data = id;
|
||||
|
||||
var database = childWithDatabase.database;
|
||||
var rdf =
|
||||
Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
|
||||
if ((!rdf) || (!database)) { dump("CAN'T GET DATABASE\n"); return(false); }
|
||||
|
||||
// make sure its a bookmark, bookmark separator, or bookmark folder
|
||||
var src = rdf.GetResource(id, true);
|
||||
var prop = rdf.GetResource(RDF_NS + "type", true);
|
||||
var target = database.GetTarget(src, prop, true);
|
||||
|
||||
if (target) target = target.QueryInterface(Components.interfaces.nsIRDFResource);
|
||||
if (target) target = target.Value;
|
||||
if ((!target) || (target == "")) {dump("BAD\n"); return(false);}
|
||||
|
||||
if ((target != NC_NS + "BookmarkSeparator") &&
|
||||
(target != NC_NS + "Bookmark") &&
|
||||
(target != NC_NS + "Folder")) return(false);
|
||||
|
||||
trans.setTransferData ( "moz/rdfitem", genData, genData.data.length * 2); // double byte data
|
||||
trans.setTransferData ( "text/unicode", genDataURL, genDataURL.data.length * 2); // double byte data
|
||||
|
||||
var transArray =
|
||||
Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
|
||||
if ( !transArray ) return(false);
|
||||
|
||||
// put it into the transferable as an |nsISupports|
|
||||
var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
|
||||
transArray.AppendElement(genTrans);
|
||||
|
||||
var dragService =
|
||||
Components.classes["@mozilla.org/widget/dragservice;1"].getService(Components.interfaces.nsIDragService);
|
||||
if ( !dragService ) return(false);
|
||||
|
||||
var nsIDragService = Components.interfaces.nsIDragService;
|
||||
dragService.invokeDragSession ( event.target, transArray, null, nsIDragService.DRAGDROP_ACTION_COPY +
|
||||
nsIDragService.DRAGDROP_ACTION_MOVE );
|
||||
dragStarted = true;
|
||||
|
||||
return(!dragStarted);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function DragOverTree ( event )
|
||||
{
|
||||
var validFlavor = false;
|
||||
var dragSession = null;
|
||||
var retVal = true;
|
||||
|
||||
var dragService =
|
||||
Components.classes["@mozilla.org/widget/dragservice;1"].getService(Components.interfaces.nsIDragService);
|
||||
if ( !dragService ) return(false);
|
||||
|
||||
dragSession = dragService.getCurrentSession();
|
||||
if ( !dragSession ) return(false);
|
||||
|
||||
if ( dragSession.isDataFlavorSupported("moz/rdfitem") ) validFlavor = true;
|
||||
else if ( dragSession.isDataFlavorSupported("text/unicode") ) validFlavor = true;
|
||||
//XXX other flavors here...
|
||||
|
||||
// touch the attribute on the rowgroup to trigger the repaint with the drop feedback.
|
||||
if ( validFlavor )
|
||||
{
|
||||
var treeRoot = document.getElementById("bookmarksTree");
|
||||
if (!treeRoot) return(false);
|
||||
var treeDatabase = treeRoot.database;
|
||||
if (!treeDatabase) return(false);
|
||||
|
||||
//XXX this is really slow and likes to refresh N times per second.
|
||||
var rowGroup = event.target.parentNode.parentNode;
|
||||
var sortActive = treeRoot.getAttribute("sortActive");
|
||||
if (sortActive == "true")
|
||||
rowGroup.setAttribute ( "dd-triggerrepaintsorted", 0 );
|
||||
else
|
||||
rowGroup.setAttribute ( "dd-triggerrepaint", 0 );
|
||||
|
||||
dragSession.canDrop = true;
|
||||
// necessary??
|
||||
retVal = false;
|
||||
}
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function DropOnTree ( event )
|
||||
{
|
||||
var treeRoot = document.getElementById("bookmarksTree");
|
||||
if (!treeRoot) return(false);
|
||||
var treeDatabase = treeRoot.database;
|
||||
if (!treeDatabase) return(false);
|
||||
|
||||
// for beta1, don't allow D&D if sorting is active
|
||||
var sortActive = treeRoot.getAttribute("sortActive");
|
||||
if (sortActive == "true")
|
||||
{
|
||||
dump("Sorry, drag&drop is currently disabled when sorting is active.\n");
|
||||
return(false);
|
||||
}
|
||||
|
||||
var RDF =
|
||||
Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
|
||||
if (!RDF) return(false);
|
||||
var RDFC =
|
||||
Components.classes["@mozilla.org/rdf/container;1"].getService(Components.interfaces.nsIRDFContainer);
|
||||
if (!RDFC) return(false);
|
||||
|
||||
var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
|
||||
if (!Bookmarks) return(false);
|
||||
|
||||
// target is the <treecell>, and "ref/id" is on the <treeitem> two levels above
|
||||
var treeItem = event.target.parentNode.parentNode;
|
||||
if (!treeItem) return(false);
|
||||
|
||||
// get drop hint attributes
|
||||
var dropBefore = treeItem.getAttribute("dd-droplocation");
|
||||
var dropOn = treeItem.getAttribute("dd-dropon");
|
||||
|
||||
// calculate drop action
|
||||
var dropAction;
|
||||
if (dropBefore == "true") dropAction = "before";
|
||||
else if (dropOn == "true") dropAction = "on";
|
||||
else dropAction = "after";
|
||||
|
||||
// calculate parent container node
|
||||
var containerItem = treeItem;
|
||||
if (dropAction != "on")
|
||||
{
|
||||
containerItem = treeItem.parentNode.parentNode;
|
||||
}
|
||||
|
||||
// magical fix for bug # 33546: handle dropping after open container
|
||||
if (treeItem.getAttribute("container") == "true")
|
||||
{
|
||||
if (treeItem.getAttribute("open") == "true")
|
||||
{
|
||||
if (dropAction == "after")
|
||||
{
|
||||
dropAction = "before";
|
||||
containerItem = treeItem;
|
||||
|
||||
// find <treechildren>, drop before first child
|
||||
var treeChildren = treeItem;
|
||||
treeItem = null;
|
||||
for (var x = 0; x < treeChildren.childNodes.length; x++)
|
||||
{
|
||||
if (treeChildren.childNodes[x].tagName == "treechildren")
|
||||
{
|
||||
treeItem = treeChildren.childNodes[x].childNodes[0];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!treeItem)
|
||||
{
|
||||
dropAction = "on";
|
||||
containerItem = treeItem.parentNode.parentNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var targetID = getAbsoluteID("bookmarksTree", treeItem);
|
||||
if (!targetID) return(false);
|
||||
var targetNode = RDF.GetResource(targetID, true);
|
||||
if (!targetNode) return(false);
|
||||
|
||||
var containerID = getAbsoluteID("bookmarksTree", containerItem);
|
||||
if (!containerID) return(false);
|
||||
var containerNode = RDF.GetResource(containerID);
|
||||
if (!containerNode) return(false);
|
||||
|
||||
var dragService =
|
||||
Components.classes["@mozilla.org/widget/dragservice;1"].getService(Components.interfaces.nsIDragService);
|
||||
if ( !dragService ) return(false);
|
||||
|
||||
var dragSession = dragService.getCurrentSession();
|
||||
if ( !dragSession ) return(false);
|
||||
|
||||
var trans =
|
||||
Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
|
||||
if ( !trans ) return(false);
|
||||
trans.addDataFlavor("moz/rdfitem");
|
||||
trans.addDataFlavor("text/x-moz-url");
|
||||
trans.addDataFlavor("text/unicode");
|
||||
|
||||
var typeRes = RDF.GetResource(RDF_NS + "type");
|
||||
if (!typeRes) return false;
|
||||
var bmTypeRes = RDF.GetResource(NC_NS + "Bookmark");
|
||||
if (!bmTypeRes) return false;
|
||||
|
||||
var dirty = false;
|
||||
|
||||
for ( var i = 0; i < dragSession.numDropItems; ++i )
|
||||
{
|
||||
dragSession.getData ( trans, i );
|
||||
var dataObj = new Object();
|
||||
var bestFlavor = new Object();
|
||||
var len = new Object();
|
||||
trans.getAnyTransferData ( bestFlavor, dataObj, len );
|
||||
if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
|
||||
if ( !dataObj ) continue;
|
||||
|
||||
var sourceID = null;
|
||||
var parentID = null;
|
||||
var checkNameHack = false;
|
||||
var name=null;
|
||||
|
||||
if (bestFlavor.value == "moz/rdfitem")
|
||||
{
|
||||
// pull the URL out of the data object
|
||||
var data = dataObj.data.substring(0, len.value / 2);
|
||||
|
||||
// moz/rdfitem allows parent ID specified on next line; check for it
|
||||
var cr = data.indexOf("\n");
|
||||
if (cr >= 0)
|
||||
{
|
||||
sourceID = data.substr(0, cr);
|
||||
parentID = data.substr(cr+1);
|
||||
}
|
||||
else
|
||||
{
|
||||
sourceID = data;
|
||||
}
|
||||
}
|
||||
else if (bestFlavor.value == "text/x-moz-url")
|
||||
{
|
||||
// pull the URL out of the data object
|
||||
data = dataObj.data.substring(0, len.value / 2);
|
||||
sourceID = data;
|
||||
|
||||
// we may need to synthesize a name (just use the URL)
|
||||
checkNameHack = true;
|
||||
}
|
||||
else if (bestFlavor.value == "text/unicode")
|
||||
{
|
||||
sourceID = dataObj.data;
|
||||
|
||||
// we may need to synthesize a name (just use the URL)
|
||||
checkNameHack = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// unknown flavor, skip
|
||||
continue;
|
||||
}
|
||||
|
||||
// pull the (optional) name out of the URL
|
||||
var separator = sourceID.indexOf("\n");
|
||||
if (separator >= 0)
|
||||
{
|
||||
name = sourceID.substr(separator+1);
|
||||
sourceID = sourceID.substr(0, separator);
|
||||
}
|
||||
|
||||
var sourceNode = RDF.GetResource(sourceID, true);
|
||||
if (!sourceNode) continue;
|
||||
|
||||
var parentNode = null;
|
||||
if (parentID != null)
|
||||
{
|
||||
parentNode = RDF.GetResource(parentID, true);
|
||||
}
|
||||
|
||||
// Prevent dropping of a node before, after, or on itself
|
||||
if (sourceNode == targetNode) continue;
|
||||
// Prevent dropping of a node onto its parent container
|
||||
if ((dropAction == "on") && (containerID) && (containerID == parentID)) continue;
|
||||
|
||||
RDFC.Init(Bookmarks, containerNode);
|
||||
|
||||
// make sure appropriate bookmark type is set
|
||||
var bmTypeNode = Bookmarks.GetTarget( sourceNode, typeRes, true );
|
||||
if (!bmTypeNode)
|
||||
{
|
||||
// set default bookmark type
|
||||
Bookmarks.Assert(sourceNode, typeRes, bmTypeRes, true);
|
||||
}
|
||||
|
||||
if ((dropAction == "before") || (dropAction == "after"))
|
||||
{
|
||||
// drop before or after
|
||||
var nodeIndex;
|
||||
|
||||
nodeIndex = RDFC.IndexOf(sourceNode);
|
||||
|
||||
if (nodeIndex >= 1)
|
||||
{
|
||||
// moving a node around inside of the container
|
||||
// so remove, then re-add the node
|
||||
RDFC.RemoveElementAt(nodeIndex, true, sourceNode);
|
||||
}
|
||||
|
||||
nodeIndex = RDFC.IndexOf(targetNode);
|
||||
|
||||
if (nodeIndex < 1) return(false);
|
||||
if (dropAction == "after") ++nodeIndex;
|
||||
|
||||
RDFC.InsertElementAt(sourceNode, nodeIndex, true);
|
||||
|
||||
// select the newly added node
|
||||
if (parentID)
|
||||
{
|
||||
selectDroppedItems(treeRoot, containerID, sourceID);
|
||||
}
|
||||
|
||||
dirty = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// drop on
|
||||
RDFC.AppendElement(sourceNode);
|
||||
|
||||
// select the newly added node
|
||||
if (parentID)
|
||||
{
|
||||
selectDroppedItems(treeRoot, containerID, sourceID);
|
||||
}
|
||||
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
if ((checkNameHack == true) || (name != null))
|
||||
{
|
||||
var srcArc = RDF.GetResource(sourceID, true);
|
||||
var propArc = RDF.GetResource(NC_NS + "Name", true);
|
||||
if (srcArc && propArc && Bookmarks)
|
||||
{
|
||||
var targetArc = Bookmarks.GetTarget(srcArc, propArc, true);
|
||||
if (!targetArc)
|
||||
{
|
||||
// if no name, fallback to using the URL as the name
|
||||
var defaultNameArc = RDF.GetLiteral((name != null && name != "") ? name : sourceID);
|
||||
if (defaultNameArc)
|
||||
{
|
||||
Bookmarks.Assert(srcArc, propArc, defaultNameArc, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// should we move the node? (i.e. take it out of the source container?)
|
||||
if ((parentNode != null) && (containerNode != parentNode))
|
||||
{
|
||||
try
|
||||
{
|
||||
RDFC.Init(Bookmarks, parentNode);
|
||||
nodeIndex = RDFC.IndexOf(sourceNode);
|
||||
|
||||
if (nodeIndex >= 1)
|
||||
{
|
||||
RDFC.RemoveElementAt(nodeIndex, true, sourceNode);
|
||||
}
|
||||
}
|
||||
catch(ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
if (dirty == true)
|
||||
{
|
||||
var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
if (remote)
|
||||
{
|
||||
remote.Flush();
|
||||
}
|
||||
}
|
||||
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function selectDroppedItems(treeRoot, containerID, targetID)
|
||||
{
|
||||
var select_list = treeRoot.getElementsByAttribute("id", targetID);
|
||||
for (var x=0; x<select_list.length; x++)
|
||||
{
|
||||
var node = select_list[x];
|
||||
if (!node) continue;
|
||||
|
||||
var parent = node.parentNode.parentNode;
|
||||
if (!parent) continue;
|
||||
|
||||
var id = parent.getAttribute("ref");
|
||||
if (!id || id=="")
|
||||
{
|
||||
id = parent.getAttribute("id");
|
||||
}
|
||||
if (!id || id=="") continue;
|
||||
|
||||
if (id == containerID)
|
||||
{
|
||||
treeRoot.selectItem(node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,397 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com> (Original Author, v2.0)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
var NC_NS = "http://home.netscape.com/NC-rdf#";
|
||||
var RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
|
||||
|
||||
var gSpringLoadTracker = {
|
||||
timeout: 0,
|
||||
element: null,
|
||||
|
||||
open: function (aRDFNode)
|
||||
{
|
||||
if (this.element)
|
||||
this.element.setAttribute("open", "true");
|
||||
clearTimeout(this.timeout);
|
||||
}
|
||||
};
|
||||
|
||||
var bookmarksDNDObserver = {
|
||||
_RDF: null,
|
||||
get RDF ()
|
||||
{
|
||||
if (!this._RDF) {
|
||||
const kRDFContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFIID = Components.interfaces.nsIRDFService;
|
||||
this._RDF = Components.classes[kRDFContractID].getService(kRDFIID);
|
||||
}
|
||||
return this._RDF;
|
||||
},
|
||||
|
||||
// XXX I belong somewhere shared.
|
||||
getResource: function(aString)
|
||||
{
|
||||
return this.RDF.GetResource(aString, true);
|
||||
},
|
||||
|
||||
getTarget: function(aDS, aSourceID, aPropertyID)
|
||||
{
|
||||
var source = this.getResource(aSourceID);
|
||||
var property = this.getResource(aPropertyID);
|
||||
return aDS.GetTarget(source, property, true);
|
||||
},
|
||||
|
||||
onDragStart: function (aEvent, aXferData, aDragAction)
|
||||
{
|
||||
var bookmarksTree = document.getElementById("bookmarksTree");
|
||||
if (aEvent.target == bookmarksTree || aEvent.target.localName == "treechildren" ||
|
||||
aEvent.target.localName == "splitter" || aEvent.target.localName == "menu")
|
||||
throw Components.results.NS_OK; // not a draggable item.
|
||||
if (aEvent.target.parentNode && aEvent.target.parentNode.parentNode &&
|
||||
aEvent.target.parentNode.parentNode.localName == "treehead")
|
||||
throw Components.results.NS_OK; // don't drag treehead cells.
|
||||
if (bookmarksTree.getAttribute("sortActive") == "true")
|
||||
throw Components.results.NS_OK;
|
||||
|
||||
var selItems = null;
|
||||
if (bookmarksTree.selectedItems.length <= 0)
|
||||
selItems = [aEvent.target.parentNode.parentNode];
|
||||
else
|
||||
selItems = bookmarksTree.selectedItems;
|
||||
aXferData.data = new TransferDataSet();
|
||||
for (var i = 0; i < selItems.length; ++i) {
|
||||
var currItem = selItems[i];
|
||||
var currURI = NODE_ID(currItem);
|
||||
|
||||
var parentItem = currItem.parentNode.parentNode;
|
||||
var parentURI = NODE_ID(parentItem);
|
||||
|
||||
var type = this.getTarget(bookmarksTree.database, currURI, RDF_NS + "type");
|
||||
type = type.QueryInterface(Components.interfaces.nsIRDFResource).Value;
|
||||
if (!type || (type != (NC_NS + "BookmarkSeparator") &&
|
||||
type != (NC_NS + "Bookmark") &&
|
||||
type != (NC_NS + "Folder")))
|
||||
throw Components.results.NS_OK;
|
||||
var name = this.getTarget(bookmarksTree.database, currURI, NC_NS + "Name");
|
||||
var data = new TransferData();
|
||||
if (name) {
|
||||
name = name.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
||||
data.addDataForFlavour("text/x-moz-url", currURI + "\n" + name);
|
||||
}
|
||||
else {
|
||||
data.addDataForFlavour("text/x-moz-url", currURI);
|
||||
}
|
||||
data.addDataForFlavour("moz/rdfitem", currURI + "\n" + parentURI);
|
||||
|
||||
data.addDataForFlavour("text/unicode", currURI);
|
||||
aXferData.data.push(data);
|
||||
}
|
||||
|
||||
if (aEvent.ctrlKey) {
|
||||
const kDSIID = Components.interfaces.nsIDragService;
|
||||
aDragAction.action = kDSIID.DRAGDROP_ACTION_COPY + kDSIID.DRAGDROP_ACTION_LINK;
|
||||
}
|
||||
},
|
||||
|
||||
onDragOver: function (aEvent, aFlavour, aDragSession)
|
||||
{
|
||||
var bookmarksTree = document.getElementById("bookmarksTree");
|
||||
var rowGroup = aEvent.target.parentNode.parentNode;
|
||||
if (rowGroup)
|
||||
rowGroup.setAttribute("dd-triggerrepaint" +
|
||||
(bookmarksTree.getAttribute("sortActive") == "true" ? "sorted" : ""), 0);
|
||||
|
||||
var rdfNode = gBookmarksShell.findRDFNode(aEvent.target, true);
|
||||
var rdfParent = rdfNode.parentNode.parentNode;
|
||||
var isContainer = false;
|
||||
if (rdfParent && rdfParent.getAttribute("container") == "true") {
|
||||
var rDragOverContainer = this.RDF.GetResource(NODE_ID(rdfParent));
|
||||
|
||||
const kBMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
const kRDFCUtilsContractID = "@mozilla.org/rdf/container-utils;1";
|
||||
const kRDFCUtilsIID = Components.interfaces.nsIRDFContainerUtils;
|
||||
const kRDFCUtils = Components.classes[kRDFCUtilsContractID].getService(kRDFCUtilsIID);
|
||||
isContainer = kRDFCUtils.IsContainer(kBMDS, rDragOverContainer);
|
||||
}
|
||||
|
||||
if (!isContainer || rowGroup.id == "headRow") {
|
||||
// Not a container, or dropping onto something that isn't designed to take drops
|
||||
// (e.g. the tree header)
|
||||
aDragSession.canDrop = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Springloaded folders.
|
||||
/* XXX - not yet.
|
||||
if (rdfNode && rdfNode.getAttribute("container") == "true" &&
|
||||
rdfNode.getAttribute("open") != "true") {
|
||||
if (!gSpringLoadTracker.element || gSpringLoadTracker.element.id != rdfNode.id) {
|
||||
// XXX - this is not good enough. We need to keep track of nesting and close up
|
||||
// folders after the user has dragged out of them otherwise we end up with
|
||||
// everything open and a big mess!
|
||||
if (gSpringLoadTracker.timeout)
|
||||
clearTimeout(gSpringLoadTracker.timeout);
|
||||
gSpringLoadTracker.element = rdfNode;
|
||||
gSpringLoadTracker.timeout = setTimeout("gSpringLoadTracker.open()", 100);
|
||||
}
|
||||
}
|
||||
*/
|
||||
},
|
||||
|
||||
_flavourSet: null,
|
||||
getSupportedFlavours: function ()
|
||||
{
|
||||
if (!this._flavourSet) {
|
||||
this._flavourSet = new FlavourSet();
|
||||
this._flavourSet.appendFlavour("moz/rdfitem");
|
||||
this._flavourSet.appendFlavour("text/x-moz-url");
|
||||
this._flavourSet.appendFlavour("text/unicode");
|
||||
}
|
||||
return this._flavourSet;
|
||||
},
|
||||
|
||||
canHandleMultipleItems: true,
|
||||
|
||||
onDrop: function (aEvent, aXferData, aDragSession)
|
||||
{
|
||||
var bookmarksTree = document.getElementById("bookmarksTree");
|
||||
// XXX lame
|
||||
if (bookmarksTree.getAttribute("sortActive") == "true") return;
|
||||
|
||||
const kRDFCContractID = "@mozilla.org/rdf/container;1";
|
||||
const kRDFIID = Components.interfaces.nsIRDFContainer;
|
||||
var RDFC = Components.classes[kRDFCContractID].getService(kRDFIID);
|
||||
|
||||
const kBMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
|
||||
var dropItem = aEvent.target.parentNode.parentNode;
|
||||
if (aEvent.target.localName == "treechildren")
|
||||
dropItem = aEvent.target.parentNode; // handle drop on blank space.
|
||||
|
||||
// In the default view, the root node is the NC root, and we don't want to append
|
||||
// to that. Adjust accordingly...
|
||||
if (NODE_ID(dropItem) == "NC:NavCenter")
|
||||
dropItem = document.getElementById("treechildren-bookmarks").firstChild;
|
||||
|
||||
// Don't allow drops on the header row & prevent catastrophe
|
||||
if (dropItem.id == "headRow" || !dropItem) return;
|
||||
|
||||
// XXX we could probably compute this ourselves, but let the tree do this
|
||||
// automagically for now.
|
||||
var dropBefore = dropItem.getAttribute("dd-droplocation");
|
||||
var dropOn = dropItem.getAttribute("dd-dropon");
|
||||
|
||||
var dropAction = dropBefore == "true" ? "before" : dropOn == "true" ? "on" : "after";
|
||||
if (aEvent.target.localName == "treechildren")
|
||||
dropAction = "on"; // handle drop on blank space.
|
||||
var containerItem = dropAction == "on" ? dropItem : dropItem.parentNode.parentNode;
|
||||
|
||||
// XXX magical fix for bug # 33546: handle dropping after open container
|
||||
if (dropItem.getAttribute("container") && dropItem.getAttribute("open") &&
|
||||
dropAction == "after") {
|
||||
dropAction = "before";
|
||||
containerItem = dropItem;
|
||||
|
||||
dropItem = null;
|
||||
for (var i = 0; i < containerItem.childNodes.length; ++i) {
|
||||
if (containerItem.childNodes[i].localName == "treechildren") {
|
||||
dropItem = containerItem.childNodes[i].firstChild;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!dropItem) {
|
||||
dropAction = "on";
|
||||
dropItem = containerItem.parentNode.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
var rTarget = this.getResource(NODE_ID(dropItem));
|
||||
var rContainer = this.getResource(NODE_ID(containerItem));
|
||||
|
||||
const kRDFCUtilsContractID = "@mozilla.org/rdf/container-utils;1";
|
||||
const kRDFCUtilsIID = Components.interfaces.nsIRDFContainerUtils;
|
||||
const kRDFCUtils = Components.classes[kRDFCUtilsContractID].getService(kRDFCUtilsIID);
|
||||
var isContainer = kRDFCUtils.IsContainer(kBMDS, rContainer);
|
||||
|
||||
// XXX
|
||||
var rType = this.getResource(RDF_NS + "type");
|
||||
var rBookmark = this.getResource(NC_NS + "Bookmark");
|
||||
|
||||
var dirty = false;
|
||||
var additiveFlag = false;
|
||||
var numObjects = aXferData.dataList.length;
|
||||
/*
|
||||
if (numObjects > 1) {
|
||||
var bo = bookmarksTree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject);
|
||||
bo.beginBatch();
|
||||
}
|
||||
*/
|
||||
|
||||
var sourceID = [], parentID = [], nameRequired = [], name = [];
|
||||
var flavourData;
|
||||
for (i = 0; i < numObjects; ++i) {
|
||||
flavourData = aXferData.dataList[i].first;
|
||||
nameRequired[i] = false;
|
||||
name[i] = null;
|
||||
var data = flavourData.data;
|
||||
switch (flavourData.flavour.contentType) {
|
||||
case "moz/rdfitem":
|
||||
var ix = data.indexOf("\n");
|
||||
sourceID[i] = ix >= 0 ? (parentID[i] = data.substr(ix+1), data.substr(0, ix)) : data;
|
||||
break;
|
||||
case "text/x-moz-url":
|
||||
ix = data.indexOf("\n");
|
||||
sourceID[i] = ix >= 0 ? (name[i] = data.substr(ix+1), data.substr(0, ix)) : data;
|
||||
break;
|
||||
case "text/unicode":
|
||||
sourceID[i] = data;
|
||||
nameRequired[i] = true;
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
var rSource = this.getResource(sourceID[i]);
|
||||
var rParent = parentID[i] ? this.getResource(parentID[i]) : null;
|
||||
|
||||
// Prevent dropping node on itself, before or after itself, on its parent
|
||||
// container, or a weird situation when an open container is dropped into
|
||||
// itself (which results in data loss!).
|
||||
// Also prevent dropping into a folder that isn't actually a container
|
||||
// (and is thus probably a pseudo-container from an aggregated datasource,
|
||||
// see bug 68656 fir details).
|
||||
if (rSource == rTarget || (dropAction == "on" && rContainer == rParent) ||
|
||||
rContainer == rSource || !isContainer)
|
||||
return;
|
||||
|
||||
// Prevent dropping node into one of its own subfolders
|
||||
var dropItem2 = dropItem;
|
||||
do {
|
||||
var targetAncestor = NODE_ID(dropItem2);
|
||||
dropItem2 = dropItem2.parentNode;
|
||||
} while (targetAncestor != "NC:BookmarksRoot" && targetAncestor != sourceID[i]);
|
||||
if (targetAncestor == sourceID[i]) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < numObjects; ++i) {
|
||||
flavourData = aXferData.dataList[i].first;
|
||||
rSource = this.getResource(sourceID[i]);
|
||||
rParent = parentID[i] ? this.getResource(parentID[i]) : null;
|
||||
|
||||
// XXX if any of the following fails, the nodes are gone for good!
|
||||
const kDSIID = Components.interfaces.nsIDragService;
|
||||
const kCopyAction = kDSIID.DRAGDROP_ACTION_COPY + kDSIID.DRAGDROP_ACTION_LINK;
|
||||
if (rParent) {
|
||||
if (!(aDragSession.dragAction & kCopyAction)) {
|
||||
try {
|
||||
RDFC.Init(kBMDS, rParent);
|
||||
ix = RDFC.IndexOf(rSource);
|
||||
if (ix >= 1)
|
||||
RDFC.RemoveElementAt(ix, true);
|
||||
}
|
||||
catch (ex) { }
|
||||
}
|
||||
}
|
||||
|
||||
RDFC.Init(kBMDS, rContainer);
|
||||
|
||||
// If this item already exists in this container, don't paste, as
|
||||
// this will result in the creation of multiple copies in the datasource
|
||||
// but will not result in an update of the UI. (In Short: we don't
|
||||
// handle multiple bookmarks well)
|
||||
ix = RDFC.IndexOf(rSource);
|
||||
if (ix != -1)
|
||||
continue;
|
||||
|
||||
var bmType = this.getTarget(bookmarksTree.database, sourceID[i], RDF_NS + "type");
|
||||
if (!bmType)
|
||||
kBMDS.Assert(rSource, rType, rBookmark, true);
|
||||
if (bmType == NC_NS + "Folder") {
|
||||
// If we're going to copy a folder type, we need to clone the folder
|
||||
// rather than just asserting the new node as a child of the drop folder.
|
||||
if (aDragSession.dragAction & kCopyAction)
|
||||
rSource = BookmarksUtils.cloneFolder(rSource, rContainer, rTarget);
|
||||
}
|
||||
|
||||
if (dropAction == "before" || dropAction == "after") {
|
||||
var dropIx = RDFC.IndexOf(rTarget);
|
||||
RDFC.InsertElementAt(rSource, dropAction == "after" ? ++dropIx : dropIx, true);
|
||||
}
|
||||
else
|
||||
RDFC.AppendElement(rSource); // drop on
|
||||
|
||||
dirty = true;
|
||||
|
||||
if (rParent) {
|
||||
gBookmarksShell.selectFolderItem(rContainer.Value, sourceID[i], additiveFlag);
|
||||
if (!additiveFlag) additiveFlag = true;
|
||||
}
|
||||
|
||||
// If a name is supplied, we want to assert this information into the
|
||||
// graph. E.g. user drags an internet shortcut to the app, we want to
|
||||
// preserve not only the URL but the name of the shortcut. The other case
|
||||
// where we need to assert a name is when the node does not already exist
|
||||
// in the graph, in this case we'll just use the URL as the name.
|
||||
if (name[i] || nameRequired[i]) {
|
||||
var currentName = this.getTarget(bookmarksTree.database, sourceID[i], NC_NS + "Name");
|
||||
if (!currentName) {
|
||||
var rDefaultName = this.RDF.GetLiteral(name[i] || sourceID[i]);
|
||||
if (rDefaultName) {
|
||||
var rName = this.RDF.GetResource(NC_NS + "Name");
|
||||
kBMDS.Assert(rSource, rName, rDefaultName, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if (numObjects > 1) {
|
||||
var bo = bookmarksTree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject);
|
||||
bo.endBatch();
|
||||
}
|
||||
*/
|
||||
|
||||
if (dirty) {
|
||||
var remoteDS = kBMDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
remoteDS.Flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,954 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com> (Original Author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
var NC_NS = "http://home.netscape.com/NC-rdf#";
|
||||
var RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
|
||||
const NC_NS_CMD = NC_NS + "command?cmd=";
|
||||
|
||||
/**
|
||||
* XXX - 04/16/01
|
||||
* ACK! massive command name collision problems are causing big issues
|
||||
* in getting this stuff to work in the Navigator window. For sanity's
|
||||
* sake, we need to rename all the commands to be of the form cmd_bm_*
|
||||
* otherwise there'll continue to be problems. For now, we're just
|
||||
* renaming those that affect the personal toolbar (edit operations,
|
||||
* which were clashing with the textfield controller)
|
||||
*
|
||||
* There are also several places that need to be updated if you need
|
||||
* to change a command name.
|
||||
* 1) the controller in ALL clients (bookmarksTree.js, personalToolbar.js)
|
||||
* 2) the command nodes in the overlay
|
||||
* 3) the command human-readable name key in bookmark.properties
|
||||
* 4) the function 'getAllCmds' in bookmarksOverlay.js
|
||||
* 5) the function 'execCommand' in bookmarksOverlay.js
|
||||
* Yes, this blows crusty dead goats through straws, and I should probably
|
||||
* create some constants somewhere to bring this number down to 3.
|
||||
* However, if you fail to do one of these, you WILL break something
|
||||
* and I WILL come after you with a knife.
|
||||
*/
|
||||
|
||||
function LITERAL (aDB, aElement, aPropertyID)
|
||||
{
|
||||
var RDF = BookmarksUIElement.prototype.RDF;
|
||||
var rSource = RDF.GetResource(aElement.id);
|
||||
var rProperty = RDF.GetResource(aPropertyID);
|
||||
var node = aDB.GetTarget(rSource, rProperty, true);
|
||||
return node ? node.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : "";
|
||||
}
|
||||
|
||||
function BookmarksUIElement () { }
|
||||
BookmarksUIElement.prototype = {
|
||||
_rdf: null,
|
||||
get RDF ()
|
||||
{
|
||||
if (!this._rdf) {
|
||||
const kRDFContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFIID = Components.interfaces.nsIRDFService;
|
||||
this._rdf = Components.classes[kRDFContractID].getService(kRDFIID);
|
||||
}
|
||||
return this._rdf;
|
||||
},
|
||||
|
||||
propertySet: function (sourceID, propertyID, newValue)
|
||||
{
|
||||
if (!newValue) return;
|
||||
const kRDFContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFIID = Components.interfaces.nsIRDFService;
|
||||
const kRDF = Components.classes[kRDFContractID].getService(kRDFIID);
|
||||
// need to shuffle this into an API.
|
||||
const kBMDS = kRDF.GetDataSource("rdf:bookmarks");
|
||||
const krProperty = kRDF.GetResource(propertyID);
|
||||
const krItem = kRDF.GetResource(sourceID);
|
||||
var rCurrValue = kBMDS.GetTarget(krItem, krProperty, true);
|
||||
const krNewValue = kRDF.GetLiteral(newValue);
|
||||
if (!rCurrValue)
|
||||
kBMDS.Assert(krItem, krProperty, krNewValue, true);
|
||||
else {
|
||||
rCurrValue = rCurrValue.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
if (rCurrValue.Value != newValue)
|
||||
kBMDS.Change(krItem, krProperty, rCurrValue, krNewValue);
|
||||
}
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Fill a context menu popup with menuitems that are appropriate for the current
|
||||
// selection.
|
||||
createContextMenu: function (aEvent)
|
||||
{
|
||||
var popup = aEvent.target;
|
||||
// clear out the old context menu contents (if any)
|
||||
while (popup.hasChildNodes())
|
||||
popup.removeChild(popup.firstChild);
|
||||
|
||||
var popupNode = document.popupNode;
|
||||
|
||||
if (!("findRDFNode" in this))
|
||||
throw "Clients must implement findRDFNode!";
|
||||
var itemNode = this.findRDFNode(popupNode, true);
|
||||
if (!itemNode || !itemNode.getAttributeNS(RDF_NS, "type") || itemNode.getAttribute("mode") == "edit") {
|
||||
aEvent.preventDefault();
|
||||
return;
|
||||
}
|
||||
if (!("getContextSelection" in this))
|
||||
throw "Clients must implement getContextSelection!";
|
||||
var selection = this.getContextSelection (itemNode);
|
||||
var commonCommands = [];
|
||||
for (var i = 0; i < selection.length; ++i) {
|
||||
var commands = this.getAllCmds(selection[i].id);
|
||||
if (!commands) {
|
||||
aEvent.preventDefault();
|
||||
return;
|
||||
}
|
||||
commands = this.flattenEnumerator(commands);
|
||||
if (!commonCommands.length) commonCommands = commands;
|
||||
commonCommands = this.findCommonNodes(commands, commonCommands);
|
||||
}
|
||||
|
||||
if (!commonCommands.length) {
|
||||
aEvent.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
||||
// Now that we should have generated a list of commands that is valid
|
||||
// for the entire selection, build a context menu.
|
||||
for (i = 0; i < commonCommands.length; ++i) {
|
||||
const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
var currCommand = commonCommands[i].QueryInterface(Components.interfaces.nsIRDFResource).Value;
|
||||
var element = null;
|
||||
if (currCommand != NC_NS_CMD + "bm_separator") {
|
||||
var commandName = this.getCommandName(currCommand);
|
||||
element = this.createMenuItem(commandName, currCommand, itemNode);
|
||||
}
|
||||
else if (i != 0 && i < commonCommands.length-1) {
|
||||
// Never append a separator as the first or last element in a context
|
||||
// menu.
|
||||
element = document.createElementNS(kXULNS, "menuseparator");
|
||||
}
|
||||
|
||||
if (element)
|
||||
popup.appendChild(element);
|
||||
}
|
||||
return;
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Given two unique arrays, return an array that contains only the elements
|
||||
// common to both.
|
||||
findCommonNodes: function (aNewArray, aOldArray)
|
||||
{
|
||||
var common = [];
|
||||
for (var i = 0; i < aNewArray.length; ++i) {
|
||||
for (var j = 0; j < aOldArray.length; ++j) {
|
||||
if (common.length > 0 && common[common.length-1] == aNewArray[i])
|
||||
continue;
|
||||
if (aNewArray[i] == aOldArray[j])
|
||||
common.push(aNewArray[i]);
|
||||
}
|
||||
}
|
||||
return common;
|
||||
},
|
||||
|
||||
flattenEnumerator: function (aEnumerator)
|
||||
{
|
||||
if ("_index" in aEnumerator)
|
||||
return aEnumerator._inner;
|
||||
|
||||
var temp = [];
|
||||
while (aEnumerator.hasMoreElements())
|
||||
temp.push(aEnumerator.getNext());
|
||||
return temp;
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// For a given URI (a unique identifier of a resource in the graph) return
|
||||
// an enumeration of applicable commands for that URI.
|
||||
getAllCmds: function (aNodeID)
|
||||
{
|
||||
var type = this.resolveType(aNodeID);
|
||||
if (!type) {
|
||||
if (aNodeID == "NC:PersonalToolbarFolder" || aNodeID == "NC:BookmarksRoot")
|
||||
type = "http://home.netscape.com/NC-rdf#Folder";
|
||||
else
|
||||
return null;
|
||||
}
|
||||
var commands = [];
|
||||
// menu order:
|
||||
//
|
||||
// bm_open
|
||||
// bm_openfolder
|
||||
// bm_openinnewwindow
|
||||
// /* bm_openinnewtab not yet supported */
|
||||
// ---------------------
|
||||
// /* bm_find removed */
|
||||
// bm_newfolder
|
||||
// ---------------------
|
||||
// bm_cut
|
||||
// bm_copy
|
||||
// bm_paste
|
||||
// bm_fileBookmark
|
||||
// ---------------------
|
||||
// bm_delete
|
||||
// bm_rename
|
||||
// ---------------------
|
||||
// bm_properties
|
||||
switch (type) {
|
||||
case "http://home.netscape.com/NC-rdf#BookmarkSeparator":
|
||||
commands = ["bm_newfolder", "bm_separator",
|
||||
"bm_cut", "bm_copy", "bm_paste", "bm_separator",
|
||||
"bm_delete"];
|
||||
break;
|
||||
case "http://home.netscape.com/NC-rdf#Bookmark":
|
||||
commands = ["bm_open", "bm_openinnewwindow", /* "bm_openinnewtab", */ "bm_separator",
|
||||
"bm_newfolder", "bm_separator",
|
||||
"bm_cut", "bm_copy", "bm_paste", "bm_fileBookmark", "bm_separator",
|
||||
"bm_delete", "bm_rename", "bm_separator",
|
||||
"bm_properties"];
|
||||
break;
|
||||
case "http://home.netscape.com/NC-rdf#Folder":
|
||||
commands = ["bm_openfolder", "bm_openinnewwindow", "bm_separator",
|
||||
"bm_newfolder", "bm_separator",
|
||||
"bm_cut", "bm_copy", "bm_paste", "bm_fileBookmark", "bm_separator",
|
||||
"bm_delete", "bm_rename", "bm_separator",
|
||||
"bm_properties"];
|
||||
break;
|
||||
case "http://home.netscape.com/NC-rdf#IEFavoriteFolder":
|
||||
commands = ["bm_openfolder", "bm_separator",
|
||||
"bm_delete"];
|
||||
break;
|
||||
case "http://home.netscape.com/NC-rdf#IEFavorite":
|
||||
commands = ["bm_open", "bm_openinnewwindow", /* "bm_openinnewtab", */ "bm_separator",
|
||||
"bm_copy"];
|
||||
break;
|
||||
case "http://home.netscape.com/NC-rdf#FileSystemObject":
|
||||
commands = ["bm_open", "bm_openinnewwindow", /* "bm_openinnewtab", */ "bm_separator",
|
||||
"bm_copy"];
|
||||
break;
|
||||
default:
|
||||
var source = this.RDF.GetResource(aNodeID);
|
||||
return this.db.GetAllCmds(source);
|
||||
}
|
||||
return new CommandArrayEnumerator(commands);
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Retrieve the human-readable name for a particular command. Used when
|
||||
// manufacturing a UI to invoke commands.
|
||||
getCommandName: function (aCommand)
|
||||
{
|
||||
var cmdName = aCommand.substring(NC_NS_CMD.length);
|
||||
try {
|
||||
// Note: this will succeed only if there's a string in the bookmarks
|
||||
// string bundle for this command name. Otherwise, <xul:stringbundle/>
|
||||
// will throw, we'll catch & stifle the error, and look up the command
|
||||
// name in the datasource.
|
||||
return this.getLocaleString ("cmd_" + cmdName);
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
// XXX - WORK TO DO HERE! (rjc will cry if we don't fix this)
|
||||
// need to ask the ds for the commands for this node, however we don't
|
||||
// have the right params. This is kind of a problem.
|
||||
dump("*** BAD! EVIL! WICKED! NO! ACK! ARGH! ORGH!\n");
|
||||
const rName = this.RDF.GetResource(NC_NS + "Name");
|
||||
const rSource = this.RDF.GetResource(aNodeID);
|
||||
return this.db.GetTarget(rSource, rName, true).Value;
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Perform a command based on a UI event. XXX - work to do here.
|
||||
preExecCommand: function (aEvent)
|
||||
{
|
||||
var commandID = aEvent.target.getAttribute("cmd");
|
||||
if (!commandID) return;
|
||||
goDoCommand("cmd_" + commandID.substring(NC_NS_CMD.length));
|
||||
},
|
||||
|
||||
execCommand: function (aCommandID)
|
||||
{
|
||||
var args = [];
|
||||
var selection = this.getSelection ();
|
||||
if (selection.length >= 1)
|
||||
var selectedItem = selection[0];
|
||||
switch (aCommandID) {
|
||||
case "bm_open":
|
||||
this.open(null, selectedItem, false);
|
||||
break;
|
||||
case "bm_openfolder":
|
||||
this.commands.openFolder(selectedItem);
|
||||
break;
|
||||
case "bm_openinnewwindow":
|
||||
if (this.resolveType(selectedItem.id) == NC_NS + "Folder")
|
||||
this.openFolderInNewWindow(selectedItem);
|
||||
else
|
||||
this.open(null, selectedItem, true);
|
||||
break;
|
||||
case "bm_rename":
|
||||
// XXX - this is SO going to break if we ever do column re-ordering.
|
||||
this.commands.editCell(selectedItem, 0);
|
||||
break;
|
||||
case "bm_editurl":
|
||||
this.commands.editCell(selectedItem, 1);
|
||||
break;
|
||||
case "bm_setnewbookmarkfolder":
|
||||
case "bm_setpersonaltoolbarfolder":
|
||||
case "bm_setnewsearchfolder":
|
||||
BookmarksUtils.doBookmarksCommand(selectedItem.id, NC_NS_CMD + aCommandID, args);
|
||||
// XXX - The containing node seems to be closed here and the
|
||||
// focus/selection is destroyed.
|
||||
this.selectElement(selectedItem);
|
||||
break;
|
||||
case "bm_properties":
|
||||
this.showPropertiesForNode(selectedItem);
|
||||
break;
|
||||
case "bm_find":
|
||||
this.findInBookmarks();
|
||||
break;
|
||||
case "bm_cut":
|
||||
this.copySelection(selection);
|
||||
this.deleteSelection(selection);
|
||||
break;
|
||||
case "bm_copy":
|
||||
this.copySelection(selection);
|
||||
break;
|
||||
case "bm_paste":
|
||||
this.paste(selection);
|
||||
break;
|
||||
case "bm_delete":
|
||||
this.deleteSelection(selection);
|
||||
break;
|
||||
case "bm_fileBookmark":
|
||||
var rv = { selectedFolder: null };
|
||||
openDialog("chrome://communicator/content/bookmarks/addBookmark.xul", "",
|
||||
"centerscreen,chrome,modal=yes,dialog=yes,resizable=yes", null, null, folder, null, "selectFolder", rv);
|
||||
if (rv.selectedFolder) {
|
||||
for (var k = 0; k < selection.length; ++k) {
|
||||
if (selection[k].id == rv.selectedFolder)
|
||||
return; // Selection contains the target folder. Just fail silently.
|
||||
}
|
||||
var additiveFlag = false;
|
||||
var selectedItems = [].concat(this.getSelection())
|
||||
for (var i = 0; i < selectedItems.length; ++i) {
|
||||
var currItem = selectedItems[i];
|
||||
var currURI = currItem.id;
|
||||
var parent = gBookmarksShell.findRDFNode(currItem, false);
|
||||
gBookmarksShell.moveBookmark(currURI, parent.id, rv.selectedFolder);
|
||||
gBookmarksShell.selectFolderItem(rv.selectedFolder, currURI, additiveFlag);
|
||||
if (!additiveFlag) additiveFlag = true;
|
||||
}
|
||||
gBookmarksShell.flushDataSource();
|
||||
}
|
||||
break;
|
||||
case "bm_newfolder":
|
||||
var nfseln = this.getBestItem();
|
||||
this.commands.createBookmarkItem("folder", nfseln);
|
||||
break;
|
||||
case "bm_newbookmark":
|
||||
var folder = this.getSelectedFolder();
|
||||
openDialog("chrome://communicator/content/bookmarks/addBookmark.xul", "",
|
||||
"centerscreen,chrome,modal=yes,dialog=yes,resizable=no", null, null, folder, null, "newBookmark");
|
||||
break;
|
||||
case "bm_newseparator":
|
||||
nfseln = this.getBestItem();
|
||||
var parentNode = this.findRDFNode(nfseln, false);
|
||||
args = [{ property: NC_NS + "parent",
|
||||
resource: parentNode.id }];
|
||||
BookmarksUtils.doBookmarksCommand(nfseln.id, NC_NS_CMD + "newseparator", args);
|
||||
break;
|
||||
case "bm_import":
|
||||
case "bm_export":
|
||||
const isImport = aCommandID == "bm_import";
|
||||
try {
|
||||
const kFilePickerContractID = "@mozilla.org/filepicker;1";
|
||||
const kFilePickerIID = Components.interfaces.nsIFilePicker;
|
||||
const kFilePicker = Components.classes[kFilePickerContractID].createInstance(kFilePickerIID);
|
||||
|
||||
const kTitle = this.getLocaleString(isImport ? "SelectImport": "EnterExport");
|
||||
kFilePicker.init(window, kTitle, kFilePickerIID[isImport ? "modeOpen" : "modeSave"]);
|
||||
kFilePicker.appendFilters(kFilePickerIID.filterHTML | kFilePickerIID.filterAll);
|
||||
if (!isImport) kFilePicker.defaultString = "bookmarks.html";
|
||||
if (kFilePicker.show() != kFilePickerIID.returnCancel) {
|
||||
var fileName = kFilePicker.fileURL.spec;
|
||||
if (!fileName) break;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
catch (e) {
|
||||
break;
|
||||
}
|
||||
var seln = this.getBestItem();
|
||||
args = [{ property: NC_NS + "URL", literal: fileName}];
|
||||
BookmarksUtils.doBookmarksCommand(seln.id, NC_NS_CMD + aCommandID, args);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
openFolderInNewWindow: function (aSelectedItem)
|
||||
{
|
||||
openDialog("chrome://communicator/content/bookmarks/bookmarks.xul",
|
||||
"", "chrome,all,dialog=no", aSelectedItem.id);
|
||||
},
|
||||
|
||||
copySelection: function (aSelection)
|
||||
{
|
||||
const kSuppArrayContractID = "@mozilla.org/supports-array;1";
|
||||
const kSuppArrayIID = Components.interfaces.nsISupportsArray;
|
||||
var itemArray = Components.classes[kSuppArrayContractID].createInstance(kSuppArrayIID);
|
||||
|
||||
const kSuppWStringContractID = "@mozilla.org/supports-wstring;1";
|
||||
const kSuppWStringIID = Components.interfaces.nsISupportsWString;
|
||||
var bmstring = Components.classes[kSuppWStringContractID].createInstance(kSuppWStringIID);
|
||||
var unicodestring = Components.classes[kSuppWStringContractID].createInstance(kSuppWStringIID);
|
||||
var htmlstring = Components.classes[kSuppWStringContractID].createInstance(kSuppWStringIID);
|
||||
|
||||
var sBookmarkItem = ""; var sTextUnicode = ""; var sTextHTML = "";
|
||||
for (var i = 0; i < aSelection.length; ++i) {
|
||||
var url = LITERAL(this.db, aSelection[i], NC_NS + "URL");
|
||||
var name = LITERAL(this.db, aSelection[i], NC_NS + "Name");
|
||||
sBookmarkItem += aSelection[i].id + "\n";
|
||||
sTextUnicode += url + "\n";
|
||||
sTextHTML += "<A HREF=\"" + url + "\">" + name + "</A>";
|
||||
}
|
||||
|
||||
const kXferableContractID = "@mozilla.org/widget/transferable;1";
|
||||
const kXferableIID = Components.interfaces.nsITransferable;
|
||||
var xferable = Components.classes[kXferableContractID].createInstance(kXferableIID);
|
||||
|
||||
xferable.addDataFlavor("moz/bookmarkclipboarditem");
|
||||
bmstring.data = sBookmarkItem;
|
||||
xferable.setTransferData("moz/bookmarkclipboarditem", bmstring, sBookmarkItem.length*2)
|
||||
|
||||
xferable.addDataFlavor("text/html");
|
||||
htmlstring.data = sTextHTML;
|
||||
xferable.setTransferData("text/html", htmlstring, sTextHTML.length*2)
|
||||
|
||||
xferable.addDataFlavor("text/unicode");
|
||||
unicodestring.data = sTextUnicode;
|
||||
xferable.setTransferData("text/unicode", unicodestring, sTextUnicode.length*2)
|
||||
|
||||
const kClipboardContractID = "@mozilla.org/widget/clipboard;1";
|
||||
const kClipboardIID = Components.interfaces.nsIClipboard;
|
||||
var clipboard = Components.classes[kClipboardContractID].getService(kClipboardIID);
|
||||
clipboard.setData(xferable, null, kClipboardIID.kGlobalClipboard);
|
||||
},
|
||||
|
||||
paste: function (aSelection)
|
||||
{
|
||||
const kXferableContractID = "@mozilla.org/widget/transferable;1";
|
||||
const kXferableIID = Components.interfaces.nsITransferable;
|
||||
var xferable = Components.classes[kXferableContractID].createInstance(kXferableIID);
|
||||
xferable.addDataFlavor("moz/bookmarkclipboarditem");
|
||||
xferable.addDataFlavor("text/x-moz-url");
|
||||
xferable.addDataFlavor("text/unicode");
|
||||
|
||||
const kClipboardContractID = "@mozilla.org/widget/clipboard;1";
|
||||
const kClipboardIID = Components.interfaces.nsIClipboard;
|
||||
var clipboard = Components.classes[kClipboardContractID].getService(kClipboardIID);
|
||||
clipboard.getData(xferable, kClipboardIID.kGlobalClipboard);
|
||||
|
||||
var flavour = { };
|
||||
var data = { };
|
||||
var length = { };
|
||||
xferable.getAnyTransferData(flavour, data, length);
|
||||
var nodes = []; var names = [];
|
||||
data = data.value.QueryInterface(Components.interfaces.nsISupportsWString).data;
|
||||
switch (flavour.value) {
|
||||
case "moz/bookmarkclipboarditem":
|
||||
nodes = data.split("\n");
|
||||
break;
|
||||
case "text/x-moz-url":
|
||||
var ix = data.indexOf("\n");
|
||||
nodes.push(data.substring(0, ix != -1 ? ix : data.length));
|
||||
names.push(data.substring(ix));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
const lastSelected = aSelection[aSelection.length-1];
|
||||
const kParentNode = this.resolvePasteFolder(aSelection);
|
||||
const krParent = this.RDF.GetResource(kParentNode.id);
|
||||
const krSource = this.RDF.GetResource(lastSelected.id);
|
||||
|
||||
const kRDFCContractID = "@mozilla.org/rdf/container;1";
|
||||
const kRDFCIID = Components.interfaces.nsIRDFContainer;
|
||||
const ksRDFC = Components.classes[kRDFCContractID].getService(kRDFCIID);
|
||||
const kBMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
|
||||
var additiveFlag = false;
|
||||
for (var i = 0; i < nodes.length; ++i) {
|
||||
if (!nodes[i]) continue;
|
||||
var rCurrent = this.RDF.GetResource(nodes[i]);
|
||||
const krTypeProperty = this.RDF.GetResource(RDF_NS + "type");
|
||||
var rType = this.db.GetTarget(rCurrent, krTypeProperty, true);
|
||||
try {
|
||||
rType = rType.QueryInterface(Components.interfaces.nsIRDFResource);
|
||||
}
|
||||
catch (e) {
|
||||
try {
|
||||
rType = rType.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
}
|
||||
catch (e) {
|
||||
// OK, no type exists, so node does not exist in the graph.
|
||||
// (e.g. user pastes url as text)
|
||||
// Do some housekeeping.
|
||||
const krName = this.RDF.GetResource(names[i]);
|
||||
const krNameProperty = this.RDF.GetResource(NC_NS + "Name");
|
||||
const krBookmark = this.RDF.GetResource(NC_NS + "Bookmark");
|
||||
kBMDS.Assert(rCurrent, krNameProperty, krName, true);
|
||||
kBMDS.Assert(rCurrent, krTypeProperty, krBookmark, true);
|
||||
}
|
||||
}
|
||||
|
||||
// If the node is a folder, then we need to create a new anonymous
|
||||
// resource and copy all the arcs over.
|
||||
if (rType && rType.Value == NC_NS + "Folder")
|
||||
rCurrent = BookmarksUtils.cloneFolder(rCurrent, krParent, krSource);
|
||||
|
||||
// If this item already exists in this container, don't paste, as
|
||||
// this will result in the creation of multiple copies in the datasource
|
||||
// but will not result in an update of the UI. (In Short: we don't
|
||||
// handle multiple bookmarks well)
|
||||
ksRDFC.Init(kBMDS, krParent);
|
||||
ix = ksRDFC.IndexOf(rCurrent);
|
||||
if (ix != -1)
|
||||
continue;
|
||||
|
||||
ix = ksRDFC.IndexOf(krSource);
|
||||
if (ix != -1)
|
||||
ksRDFC.InsertElementAt(rCurrent, ix+1, true);
|
||||
else
|
||||
ksRDFC.AppendElement(rCurrent);
|
||||
this.selectFolderItem(krSource.Value, rCurrent.Value, additiveFlag);
|
||||
if (!additiveFlag) additiveFlag = true;
|
||||
|
||||
var rds = kBMDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
rds.Flush();
|
||||
}
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// For the given selection, determines the element that should form the
|
||||
// container to paste items into.
|
||||
resolvePasteFolder: function (aSelection)
|
||||
{
|
||||
const lastSelected = aSelection[aSelection.length-1];
|
||||
if (lastSelected.getAttribute("container") == "true" &&
|
||||
aSelection.length == 1)
|
||||
return lastSelected;
|
||||
return this.findRDFNode(lastSelected, false);
|
||||
},
|
||||
|
||||
canPaste: function ()
|
||||
{
|
||||
const kClipboardContractID = "@mozilla.org/widget/clipboard;1";
|
||||
const kClipboardIID = Components.interfaces.nsIClipboard;
|
||||
var clipboard = Components.classes[kClipboardContractID].getService(kClipboardIID);
|
||||
const kSuppArrayContractID = "@mozilla.org/supports-array;1";
|
||||
const kSuppArrayIID = Components.interfaces.nsISupportsArray;
|
||||
var flavourArray = Components.classes[kSuppArrayContractID].createInstance(kSuppArrayIID);
|
||||
const kSuppStringContractID = "@mozilla.org/supports-string;1";
|
||||
const kSuppStringIID = Components.interfaces.nsISupportsString;
|
||||
|
||||
var flavours = ["moz/bookmarkclipboarditem", "text/x-moz-url"];
|
||||
for (var i = 0; i < flavours.length; ++i) {
|
||||
const kSuppString = Components.classes[kSuppStringContractID].createInstance(kSuppStringIID);
|
||||
kSuppString.data = flavours[i];
|
||||
flavourArray.AppendElement(kSuppString);
|
||||
}
|
||||
var hasFlavours = clipboard.hasDataMatchingFlavors(flavourArray, kClipboardIID.kGlobalClipboard);
|
||||
return hasFlavours;
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// aSelection is a mutable array, not a NodeList.
|
||||
deleteSelection: function (aSelection)
|
||||
{
|
||||
const kRDFCContractID = "@mozilla.org/rdf/container;1";
|
||||
const kRDFCIID = Components.interfaces.nsIRDFContainer;
|
||||
const ksRDFC = Components.classes[kRDFCContractID].getService(kRDFCIID);
|
||||
|
||||
var nextElement;
|
||||
var count = 0;
|
||||
|
||||
var selectionLength = aSelection.length;
|
||||
while (aSelection.length && aSelection[count]) {
|
||||
const currParent = this.findRDFNode(aSelection[count], false);
|
||||
const kSelectionURI = aSelection[count].id;
|
||||
|
||||
// Disallow the removal of certain 'special' nodes
|
||||
if (kSelectionURI == "NC:BookmarksRoot") {
|
||||
aSelection.splice(count++,1);
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the current bookmark is the IE Favorites folder, we have a little
|
||||
// extra work to do - set the pref |browser.bookmarks.import_system_favorites|
|
||||
// to ensure that we don't re-import next time.
|
||||
if (aSelection[count].getAttribute("type") == (NC_NS + "IEFavoriteFolder")) {
|
||||
const kPrefSvcContractID = "@mozilla.org/preferences-service;1";
|
||||
const kPrefSvcIID = Components.interfaces.nsIPrefBranch;
|
||||
const kPrefSvc = Components.classes[kPrefSvcContractID].getService(kPrefSvcIID);
|
||||
kPrefSvc.setBoolPref("browser.bookmarks.import_system_favorites", false);
|
||||
}
|
||||
|
||||
const krParent = this.RDF.GetResource(currParent.id);
|
||||
const krBookmark = this.RDF.GetResource(kSelectionURI);
|
||||
const kBMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
|
||||
ksRDFC.Init(kBMDS, krParent);
|
||||
nextElement = this.getNextElement(aSelection[count]);
|
||||
ksRDFC.RemoveElement(krBookmark, true);
|
||||
|
||||
try {
|
||||
// XXX - UGH. Template builder is NOT removing the element from the
|
||||
// tree, and so selection remains non-zero in length and we go into
|
||||
// an infinite loop here. Tear the node out of the document.
|
||||
var parent = aSelection[count].parentNode;
|
||||
parent.removeChild(aSelection[count]);
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
// Manipulate the selection array ourselves.
|
||||
aSelection.splice(count,1);
|
||||
}
|
||||
this.selectElement(nextElement);
|
||||
},
|
||||
|
||||
moveBookmark: function (aBookmarkURI, aFromFolderURI, aToFolderURI)
|
||||
{
|
||||
const kBMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
const kRDFCContractID = "@mozilla.org/rdf/container;1";
|
||||
const kRDFCIID = Components.interfaces.nsIRDFContainer;
|
||||
const kRDFC = Components.classes[kRDFCContractID].getService(kRDFCIID);
|
||||
const krSrc = this.RDF.GetResource(aBookmarkURI);
|
||||
const krOldParent = this.RDF.GetResource(aFromFolderURI);
|
||||
const krNewParent = this.RDF.GetResource(aToFolderURI);
|
||||
kRDFC.Init(kBMDS, krNewParent);
|
||||
kRDFC.AppendElement(krSrc);
|
||||
kRDFC.Init(kBMDS, krOldParent);
|
||||
kRDFC.RemoveElement(krSrc, true);
|
||||
},
|
||||
|
||||
open: function (aEvent, aRDFNode, aInNewWindow)
|
||||
{
|
||||
var urlValue = LITERAL(this.db, aRDFNode, NC_NS + "URL");
|
||||
|
||||
// Ignore "NC:" and empty urls.
|
||||
if (urlValue.substring(0,3) == "NC:" || !urlValue) return;
|
||||
|
||||
if (aEvent && aEvent.altKey)
|
||||
this.showPropertiesForNode (aRDFNode);
|
||||
else if (aInNewWindow)
|
||||
openDialog (getBrowserURL(), "_blank", "chrome,all,dialog=no", urlValue);
|
||||
else
|
||||
openTopWin (urlValue);
|
||||
if (aEvent)
|
||||
aEvent.preventBubble();
|
||||
},
|
||||
|
||||
showPropertiesForNode: function (aBookmarkItem)
|
||||
{
|
||||
if (aBookmarkItem.getAttribute("type") != NC_NS + "BookmarkSeparator")
|
||||
openDialog("chrome://communicator/content/bookmarks/bm-props.xul",
|
||||
"", "centerscreen,chrome,resizable=no", aBookmarkItem.id);
|
||||
},
|
||||
|
||||
findInBookmarks: function ()
|
||||
{
|
||||
openDialog("chrome://communicator/content/bookmarks/findBookmark.xul",
|
||||
"FindBookmarksWindow",
|
||||
"centerscreen,resizable=no,chrome,dependent");
|
||||
},
|
||||
|
||||
getLocaleString: function (aStringKey)
|
||||
{
|
||||
var bundle = document.getElementById("bookmarksbundle");
|
||||
return bundle.getString (aStringKey);
|
||||
},
|
||||
|
||||
flushDataSource: function ()
|
||||
{
|
||||
const kBMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
var remoteDS = kBMDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
remoteDS.Flush();
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Determine the rdf:type property for the given resource.
|
||||
resolveType: function (aID)
|
||||
{
|
||||
const krType = this.RDF.GetResource(RDF_NS + "type");
|
||||
const krElement = this.RDF.GetResource(aID);
|
||||
const type = gBookmarksShell.db.GetTarget(krElement, krType, true);
|
||||
try {
|
||||
return type.QueryInterface(Components.interfaces.nsIRDFResource).Value;
|
||||
}
|
||||
catch (e) {
|
||||
try {
|
||||
return type.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
||||
}
|
||||
catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// takes a node and adds the appropriate adornments for a bookmark container.
|
||||
createBookmarkFolderDecorations: function (aNode)
|
||||
{
|
||||
aNode.setAttribute("type", "http://home.netscape.com/NC-rdf#Folder");
|
||||
aNode.setAttribute("container", "true");
|
||||
return aNode;
|
||||
}
|
||||
};
|
||||
|
||||
function CommandArrayEnumerator (aCommandArray)
|
||||
{
|
||||
this._inner = [];
|
||||
const kRDFContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFIID = Components.interfaces.nsIRDFService;
|
||||
const RDF = Components.classes[kRDFContractID].getService(kRDFIID);
|
||||
for (var i = 0; i < aCommandArray.length; ++i)
|
||||
this._inner.push(RDF.GetResource(NC_NS_CMD + aCommandArray[i]));
|
||||
|
||||
this._index = 0;
|
||||
}
|
||||
|
||||
CommandArrayEnumerator.prototype = {
|
||||
getNext: function ()
|
||||
{
|
||||
return this._inner[this._index];
|
||||
},
|
||||
|
||||
hasMoreElements: function ()
|
||||
{
|
||||
return this._index < this._inner.length;
|
||||
}
|
||||
};
|
||||
|
||||
var BookmarksUtils = {
|
||||
_rdf: null,
|
||||
get RDF ()
|
||||
{
|
||||
if (!this._rdf) {
|
||||
const kRDFContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFIID = Components.interfaces.nsIRDFService;
|
||||
this._rdf = Components.classes[kRDFContractID].getService(kRDFIID);
|
||||
}
|
||||
return this._rdf;
|
||||
},
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Execute a command with the given source and arguments
|
||||
doBookmarksCommand: function (aSourceURI, aCommand, aArgumentsArray)
|
||||
{
|
||||
var rCommand = this.RDF.GetResource(aCommand);
|
||||
|
||||
var kSuppArrayContractID = "@mozilla.org/supports-array;1";
|
||||
var kSuppArrayIID = Components.interfaces.nsISupportsArray;
|
||||
var sourcesArray = Components.classes[kSuppArrayContractID].createInstance(kSuppArrayIID);
|
||||
if (aSourceURI) {
|
||||
var rSource = this.RDF.GetResource(aSourceURI);
|
||||
sourcesArray.AppendElement (rSource);
|
||||
}
|
||||
|
||||
var argsArray = Components.classes[kSuppArrayContractID].createInstance(kSuppArrayIID);
|
||||
for (var i = 0; i < aArgumentsArray.length; ++i) {
|
||||
var rArc = this.RDF.GetResource(aArgumentsArray[i].property);
|
||||
argsArray.AppendElement(rArc);
|
||||
var rValue = null;
|
||||
if ("resource" in aArgumentsArray[i]) {
|
||||
rValue = this.RDF.GetResource(aArgumentsArray[i].resource);
|
||||
}
|
||||
else
|
||||
rValue = this.RDF.GetLiteral(aArgumentsArray[i].literal);
|
||||
argsArray.AppendElement(rValue);
|
||||
}
|
||||
|
||||
// Exec the command in the Bookmarks datasource.
|
||||
const kBMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
kBMDS.DoCommand(sourcesArray, rCommand, argsArray);
|
||||
},
|
||||
|
||||
cloneFolder: function (aFolder, aParent, aRelativeItem)
|
||||
{
|
||||
var BMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
|
||||
var nameArc = this.RDF.GetResource(NC_NS + "Name");
|
||||
var rName = BMDS.GetTarget(aFolder, nameArc, true);
|
||||
rName = rName.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
|
||||
var newFolder = this.createFolderWithID(rName.Value, aRelativeItem, aParent);
|
||||
|
||||
// Now need to append kiddies.
|
||||
try {
|
||||
const kRDFCContractID = "@mozilla.org/rdf/container;1";
|
||||
const kRDFCIID = Components.interfaces.nsIRDFContainer;
|
||||
var RDFC = Components.classes[kRDFCContractID].getService(kRDFCIID);
|
||||
const kRDFCUContractID = "@mozilla.org/rdf/container-utils;1";
|
||||
const kRDFCUIID = Components.interfaces.nsIRDFContainerUtils;
|
||||
var RDFCU = Components.classes[kRDFCUContractID].getService(kRDFCUIID);
|
||||
|
||||
RDFC.Init(BMDS, aFolder);
|
||||
var elts = RDFC.GetElements();
|
||||
RDFC.Init(BMDS, newFolder);
|
||||
|
||||
while (elts.hasMoreElements()) {
|
||||
var curr = elts.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
|
||||
if (RDFCU.IsContainer(BMDS, curr))
|
||||
BookmarksUtils.cloneFolder(curr, newFolder);
|
||||
else
|
||||
RDFC.AppendElement(curr);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
return newFolder;
|
||||
},
|
||||
|
||||
createFolderWithID: function (aTitle, aRelativeItem, aParentFolder)
|
||||
{
|
||||
const kRDFCContractID = "@mozilla.org/rdf/container;1";
|
||||
const kRDFCIID = Components.interfaces.nsIRDFContainer;
|
||||
var RDFC = Components.classes[kRDFCContractID].createInstance(kRDFCIID);
|
||||
var BMDS = this.RDF.GetDataSource("rdf:bookmarks");
|
||||
try {
|
||||
RDFC.Init(BMDS, aParentFolder);
|
||||
}
|
||||
catch (e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var ix = RDFC.IndexOf(aRelativeItem);
|
||||
var BMSvc = BMDS.QueryInterface(Components.interfaces.nsIBookmarksService);
|
||||
return BMSvc.createFolderWithDetails(aTitle, aParentFolder, ix);
|
||||
},
|
||||
|
||||
|
||||
addBookmarkForTabBrowser: function( aTabBrowser, aSelect )
|
||||
{
|
||||
var tabsInfo = [];
|
||||
var currentTabInfo = { name: "", url: "", charset: null };
|
||||
|
||||
const activeBrowser = aTabBrowser.selectedBrowser;
|
||||
const browsers = aTabBrowser.browsers;
|
||||
for (var i = 0; i < browsers.length; ++i) {
|
||||
var webNav = browsers[i].webNavigation;
|
||||
var url = webNav.currentURI.spec;
|
||||
var name = "";
|
||||
var charset;
|
||||
try {
|
||||
var doc = webNav.document;
|
||||
name = doc.title || url;
|
||||
charset = doc.characterSet;
|
||||
} catch (e) {
|
||||
name = url;
|
||||
}
|
||||
|
||||
tabsInfo[i] = { name: name, url: url, charset: charset };
|
||||
|
||||
if (browsers[i] == activeBrowser)
|
||||
currentTabInfo = tabsInfo[i];
|
||||
}
|
||||
|
||||
openDialog("chrome://communicator/content/bookmarks/addBookmark.xul", "",
|
||||
"centerscreen,chrome,dialog=yes,resizable,dependent",
|
||||
currentTabInfo.name, currentTabInfo.url, null,
|
||||
currentTabInfo.charset, "addGroup" + (aSelect ? ",group" : ""), tabsInfo);
|
||||
},
|
||||
|
||||
addBookmarkForBrowser: function (aDocShell, aShowDialog)
|
||||
{
|
||||
// Bug 52536: We obtain the URL and title from the nsIWebNavigation
|
||||
// associated with a <browser/> rather than from a DOMWindow.
|
||||
// This is because when a full page plugin is loaded, there is
|
||||
// no DOMWindow (?) but information about the loaded document
|
||||
// may still be obtained from the webNavigation.
|
||||
var url = aDocShell.currentURI.spec;
|
||||
var title, docCharset = null;
|
||||
try {
|
||||
title = aDocShell.document.title || url;
|
||||
docCharset = aDocShell.document.characterSet;
|
||||
}
|
||||
catch (e) {
|
||||
title = url;
|
||||
}
|
||||
|
||||
this.addBookmark(url, title, docCharset, aShowDialog);
|
||||
},
|
||||
|
||||
addBookmark: function (aURL, aTitle, aCharset, aShowDialog)
|
||||
{
|
||||
if (aCharset === undefined) {
|
||||
var fw = document.commandDispatcher.focusedWindow;
|
||||
aCharset = fw.document.characterSet;
|
||||
}
|
||||
|
||||
if (aShowDialog)
|
||||
openDialog("chrome://communicator/content/bookmarks/addBookmark.xul", "",
|
||||
"centerscreen,chrome,dialog=yes,resizable,dependent", aTitle, aURL, null, aCharset);
|
||||
else {
|
||||
// User has elected to override the file dialog and always file bookmarks
|
||||
// into the default bookmark folder.
|
||||
const kBMSvcContractID = "@mozilla.org/browser/bookmarks-service;1";
|
||||
const kBMSvcIID = Components.interfaces.nsIBookmarksService;
|
||||
const kBMSvc = Components.classes[kBMSvcContractID].getService(kBMSvcIID);
|
||||
kBMSvc.addBookmarkImmediately(aURL, aTitle, kBMSvcIID.BOOKMARK_DEFAULT_TYPE, aCharset);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var ContentUtils = {
|
||||
childByLocalName: function (aSelectedItem, aLocalName)
|
||||
{
|
||||
var temp = aSelectedItem.firstChild;
|
||||
while (temp) {
|
||||
if (temp.localName == aLocalName)
|
||||
return temp;
|
||||
temp = temp.nextSibling;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!-- -*- Mode: HTML; indent-tabs-mode: nil; -*- -->
|
||||
<!--
|
||||
|
||||
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.org code.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Ben Goodger <ben@netscape.com> (Original Author)
|
||||
-->
|
||||
|
||||
<!DOCTYPE window SYSTEM "chrome://communicator/locale/bookmarks/bookmarksOverlay.dtd">
|
||||
|
||||
<overlay id="bookmarksOverlay"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
|
||||
<stringbundleset id="stringbundleset">
|
||||
<stringbundle id="bookmarksbundle"
|
||||
src="chrome://communicator/locale/bookmarks/bookmark.properties"/>
|
||||
</stringbundleset>
|
||||
|
||||
<popupset id="bookmarksPopupset">
|
||||
<popup id="bmContext"
|
||||
onpopupshowing="gBookmarksShell.createContextMenu(event);"/>
|
||||
</popupset>
|
||||
|
||||
<commands id="commands">
|
||||
<commandset id="bookmarksItems">
|
||||
<command id="cmd_bm_open" oncommand="goDoCommand('cmd_bm_open');"/>
|
||||
<command id="cmd_bm_openfolder" oncommand="goDoCommand('cmd_bm_openfolder');"/>
|
||||
<command id="cmd_bm_newfolder" oncommand="goDoCommand('cmd_bm_newfolder');"/>
|
||||
<command id="cmd_bm_newbookmark" oncommand="goDoCommand('cmd_bm_newbookmark');"/>
|
||||
<command id="cmd_bm_newseparator" oncommand="goDoCommand('cmd_bm_newseparator');"/>
|
||||
<command id="cmd_bm_find" oncommand="goDoCommand('cmd_bm_find');"/>
|
||||
<command id="cmd_bm_setnewbookmarkfolder" oncommand="goDoCommand('cmd_bm_setnewbookmarkfolder');"/>
|
||||
<command id="cmd_bm_setpersonaltoolbarfolder" oncommand="goDoCommand('cmd_bm_setpersonaltoolbarfolder');"/>
|
||||
<command id="cmd_bm_setnewsearchfolder" oncommand="goDoCommand('cmd_bm_setnewsearchfolder');"/>
|
||||
<command id="cmd_bm_properties" oncommand="goDoCommand('cmd_bm_properties');"/>
|
||||
<command id="cmd_bm_rename" oncommand="goDoCommand('cmd_bm_rename');"/>
|
||||
<command id="cmd_bm_openinnewwindow" oncommand="goDoCommand('cmd_bm_openinnewwindow');"/>
|
||||
<command id="cmd_bm_import" oncommand="goDoCommand('cmd_bm_import');"/>
|
||||
<command id="cmd_bm_export" oncommand="goDoCommand('cmd_bm_export');"/>
|
||||
<command id="cmd_bm_fileBookmark" oncommand="goDoCommand('cmd_bm_fileBookmark');"/>
|
||||
|
||||
<command id="cmd_bm_cut" oncommand="goDoCommand('cmd_bm_cut');"/>
|
||||
<command id="cmd_bm_copy" oncommand="goDoCommand('cmd_bm_copy');"/>
|
||||
<command id="cmd_bm_paste" oncommand="goDoCommand('cmd_bm_paste');"/>
|
||||
<command id="cmd_bm_delete" oncommand="goDoCommand('cmd_bm_delete');"/>
|
||||
<command id="cmd_bm_selectAll" oncommand="goDoCommand('cmd_bm_selectAll');"/>
|
||||
</commandset>
|
||||
<commandset id="selectEditMenuItems"/>
|
||||
<commandset id="globalEditMenuItems"/>
|
||||
</commands>
|
||||
|
||||
</overlay>
|
||||
@@ -1,64 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com> (Original Author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Get the two bookmarks utility libraries running, attach controllers, focus
|
||||
// tree widget, etc.
|
||||
function Startup()
|
||||
{
|
||||
var bookmarksView = document.getElementById("bookmarks-view");
|
||||
bookmarksView.treeBoxObject.selection.select(0);
|
||||
}
|
||||
|
||||
function manageBookmarks() {
|
||||
openDialog("chrome://communicator/content/bookmarks/bookmarks.xul", "", "chrome,dialog=no,resizable=yes");
|
||||
}
|
||||
|
||||
function addBookmark() {
|
||||
var contentArea = top.document.getElementById('content');
|
||||
if (contentArea) {
|
||||
const browsers = contentArea.browsers;
|
||||
if (browsers.length > 1)
|
||||
BookmarksUtils.addBookmarkForTabBrowser(contentArea);
|
||||
else
|
||||
BookmarksUtils.addBookmarkForBrowser(contentArea.webNavigation, true);
|
||||
}
|
||||
else
|
||||
BookmarksUtils.addBookmark(null, null, undefined, true);
|
||||
}
|
||||
@@ -1,759 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com> (Original Author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
var gBookmarksShell = null;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Tracks the selected item, the cell last clicked on, and the number of clicks
|
||||
// given to it. Used to activate inline edit mode.
|
||||
var gSelectionTracker = { currentItem: null, currentCell: null, clickCount: 0 };
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Class which defines methods for a bookmarks UI implementation based around
|
||||
// a treeview. Subclasses BookmarksBase in bookmarksOverlay.js. Some methods
|
||||
// are required by the base class, others are for event handling. Window specific
|
||||
// glue code should go into the BookmarksWindow class in bookmarks.js
|
||||
function BookmarksTree (aID)
|
||||
{
|
||||
this.id = aID;
|
||||
}
|
||||
|
||||
BookmarksTree.prototype = {
|
||||
__proto__: BookmarksUIElement.prototype,
|
||||
|
||||
// XXX - change this to .element and move into base.
|
||||
get tree ()
|
||||
{
|
||||
return document.getElementById(this.id);
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// This method constructs a menuitem for a context menu for the given command.
|
||||
// This is implemented by the client so that it can intercept menuitem naming
|
||||
// as appropriate.
|
||||
createMenuItem: function (aDisplayName, aCommandName, aItemNode)
|
||||
{
|
||||
const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
var xulElement = document.createElementNS(kXULNS, "menuitem");
|
||||
xulElement.setAttribute("cmd", aCommandName);
|
||||
xulElement.setAttribute("command", "cmd_" + aCommandName.substring(NC_NS_CMD.length));
|
||||
|
||||
switch (aCommandName) {
|
||||
case NC_NS_CMD + "open":
|
||||
xulElement.setAttribute("label", aDisplayName);
|
||||
xulElement.setAttribute("default", "true");
|
||||
break;
|
||||
case NC_NS_CMD + "openfolder":
|
||||
aDisplayName = aItemNode.getAttribute("open") == "true" ? this.getLocaleString("cmd_openfolder2") : aDisplayName;
|
||||
xulElement.setAttribute("label", aDisplayName);
|
||||
xulElement.setAttribute("default", "true");
|
||||
break;
|
||||
case NC_NS_CMD + "renamebookmark":
|
||||
if (!document.popupNode.hasAttribute("type")) {
|
||||
xulElement.setAttribute("label", this.getLocaleString("cmd_renamebookmark2"));
|
||||
xulElement.setAttribute("cmd", (NC_NS_CMD + "editurl"));
|
||||
}
|
||||
else
|
||||
xulElement.setAttribute("label", aDisplayName);
|
||||
break;
|
||||
default:
|
||||
xulElement.setAttribute("label", aDisplayName);
|
||||
break;
|
||||
}
|
||||
return xulElement;
|
||||
},
|
||||
|
||||
// XXX - ideally this would be in the base. this.tree needs to change to
|
||||
// this.element and then we can do just that.
|
||||
setRoot: function (aRoot)
|
||||
{
|
||||
this.tree.setAttribute("ref", aRoot);
|
||||
},
|
||||
|
||||
// Command implementation
|
||||
commands: {
|
||||
openFolder: function (aSelectedItem)
|
||||
{
|
||||
if (aSelectedItem.getAttribute("open") == "true")
|
||||
aSelectedItem.removeAttribute("open");
|
||||
else
|
||||
aSelectedItem.setAttribute("open", "true");
|
||||
},
|
||||
|
||||
// Things Needed to Satisfy Mac Weenies:
|
||||
// 1) need to implement timed single click edit. This could be Hard.
|
||||
// 2) need to implement some other method of key access apart from F2.
|
||||
// mpt claims that 'Cmd+U' is the excel equivalent.
|
||||
editCell: function (aSelectedItem, aCell)
|
||||
{
|
||||
// XXX throw up properties dialog with name selected so user can rename
|
||||
// that way, until tree conversion allows us to use IL again.
|
||||
goDoCommand("cmd_properties");
|
||||
return; // Disable inline edit for now.
|
||||
|
||||
var editCell = aSelectedItem.firstChild.childNodes[aCell];
|
||||
if (editCell.getAttribute("editable") != "true")
|
||||
return;
|
||||
|
||||
// Cause the inline edit cell binding to be used.
|
||||
editCell.setAttribute("class", "treecell-indent treecell-editable");
|
||||
var editColGroup = document.getElementById("theColumns");
|
||||
var count = 0;
|
||||
var property = "";
|
||||
for (var i = 0; i < editColGroup.childNodes.length; ++i) {
|
||||
var currCol = editColGroup.childNodes[i];
|
||||
if (currCol.getAttribute("hidden") == "true")
|
||||
return;
|
||||
if (count == aCell) {
|
||||
property = currCol.getAttribute("resource");
|
||||
break;
|
||||
}
|
||||
++count;
|
||||
|
||||
// Deal with interleaved column resizer splitters
|
||||
if (currCol.nextSibling.localName == "splitter") ++i;
|
||||
}
|
||||
|
||||
if (property) {
|
||||
editCell.setMode("edit");
|
||||
editCell.addObserver(this.postModifyCallback, "accept",
|
||||
[editCell, aSelectedItem, property]);
|
||||
}
|
||||
},
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Called after an inline-edit cell has left inline-edit mode, and data
|
||||
// needs to be modified in the datasource.
|
||||
postModifyCallback: function (aParams)
|
||||
{
|
||||
var selItemURI = NODE_ID(aParams[1]);
|
||||
gBookmarksShell.propertySet(selItemURI, aParams[2], aParams[3]);
|
||||
gBookmarksShell.selectFolderItem(NODE_ID(gBookmarksShell.findRDFNode(aParams[1], false)),
|
||||
selItemURI, false);
|
||||
gBookmarksShell.tree.focus();
|
||||
gSelectionTracker.clickCount = 0;
|
||||
|
||||
// Set the cell back to use the standard treecell binding.
|
||||
var editCell = aParams[0];
|
||||
editCell.setAttribute("class", "treecell-indent");
|
||||
},
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// New Folder Creation
|
||||
// Strategy: create a dummy row with edit fields to harvest information
|
||||
// from the user, then destroy these rows and create an item
|
||||
// in its place.
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Edit folder name & update the datasource if name is valid
|
||||
onEditFolderName: function (aParams, aTopic)
|
||||
{
|
||||
var name = aParams[3];
|
||||
var shell = gBookmarksShell.commands; // suck
|
||||
var dummyItem = aParams[2];
|
||||
var relativeNode = aParams[1];
|
||||
var parentNode = relativeNode ? gBookmarksShell.findRDFNode(relativeNode, false) : gBookmarksShell.tree;
|
||||
|
||||
dummyItem.parentNode.removeChild(dummyItem);
|
||||
|
||||
if (!shell.validateNameAndTopic(name, aTopic, relativeNode, dummyItem)) {
|
||||
gBookmarksShell.tree.selectItem(relativeNode);
|
||||
gBookmarksShell.tree.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
if (relativeNode) {
|
||||
// If we're attempting to create a folder as a subfolder of an open folder,
|
||||
// we need to set the parentFolder to be relativeNode, which will be the
|
||||
// parent of the new folder, rather than the parent of the relativeNode,
|
||||
// which will result in the folder being created in an incorrect position
|
||||
// (adjacent to the relativeNode).
|
||||
var selKids = ContentUtils.childByLocalName(relativeNode, "treechildren");
|
||||
if (selKids && selKids.hasChildNodes() && selKids.lastChild == dummyItem)
|
||||
parentNode = relativeNode;
|
||||
}
|
||||
|
||||
var args = [{ property: NC_NS + "parent",
|
||||
resource: NODE_ID(parentNode) },
|
||||
{ property: NC_NS + "Name",
|
||||
literal: name }];
|
||||
|
||||
const kBMDS = gBookmarksShell.RDF.GetDataSource("rdf:bookmarks");
|
||||
kBMDS.AddObserver(newFolderRDFObserver);
|
||||
var relId = relativeNode ? NODE_ID(relativeNode) : "NC:BookmarksRoot";
|
||||
BookmarksUtils.doBookmarksCommand(relId, NC_NS_CMD + "newfolder", args);
|
||||
kBMDS.RemoveObserver(newFolderRDFObserver);
|
||||
var newFolderItem = document.getElementById(newFolderRDFObserver._newFolderURI);
|
||||
gBookmarksShell.tree.focus();
|
||||
gBookmarksShell.tree.selectItem(newFolderItem);
|
||||
// Can't use newFolderItem because it may not have been created yet. Hack, huh?
|
||||
var index = gBookmarksShell.tree.getIndexOfItem(relativeNode);
|
||||
gBookmarksShell.tree.ensureIndexIsVisible(index+1);
|
||||
gSelectionTracker.clickCount = 0;
|
||||
},
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Performs simple validation on what the user has entered:
|
||||
// 1) prevents entering an empty string
|
||||
// 2) in the case of a canceled operation, remove the dummy item and
|
||||
// restore selection.
|
||||
validateNameAndTopic: function (aName, aTopic, aOldSelectedItem, aDummyItem)
|
||||
{
|
||||
// Don't allow user to enter an empty string "";
|
||||
if (!aName) return false;
|
||||
|
||||
// If the user hit escape, go no further.
|
||||
if (aTopic == "reject") {
|
||||
if (aOldSelectedItem)
|
||||
gBookmarksShell.tree.selectItem(aOldSelectedItem);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Creates a dummy item that can be placed in edit mode to retrieve data
|
||||
// to create new bookmarks/folders.
|
||||
createBookmarkItem: function (aMode, aSelectedItem)
|
||||
{
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// HACK HACK HACK HACK HACK
|
||||
// Disable Inline-Edit for now and just use a dialog.
|
||||
|
||||
// XXX - most of this is just copy-pasted from the other two folder
|
||||
// creation functions. Yes it's ugly, but it'll do the trick for
|
||||
// now as this is in no way intended to be a long-term solution.
|
||||
|
||||
const kPromptSvcContractID = "@mozilla.org/embedcomp/prompt-service;1";
|
||||
const kPromptSvcIID = Components.interfaces.nsIPromptService;
|
||||
const kPromptSvc = Components.classes[kPromptSvcContractID].getService(kPromptSvcIID);
|
||||
|
||||
var defaultValue = gBookmarksShell.getLocaleString("ile_newfolder");
|
||||
var dialogTitle = gBookmarksShell.getLocaleString("newfolder_dialog_title");
|
||||
var dialogMsg = gBookmarksShell.getLocaleString("newfolder_dialog_msg");
|
||||
var stringValue = { value: defaultValue };
|
||||
if (kPromptSvc.prompt(window, dialogTitle, dialogMsg, stringValue, null, { value: 0 })) {
|
||||
var relativeNode = gBookmarksShell.tree;
|
||||
var parentNode;
|
||||
if (aSelectedItem && aSelectedItem.localName != "tree") {
|
||||
// By default, create adjacent to the selected item
|
||||
relativeNode = aSelectedItem;
|
||||
if (relativeNode.getAttribute("container") == "true" &&
|
||||
relativeNode.getAttribute("open") == "true") {
|
||||
// But if it's an open container, the relative node should be the last child.
|
||||
var treechildren = ContentUtils.childByLocalName(relativeNode, "treechildren");
|
||||
if (treechildren && treechildren.hasChildNodes())
|
||||
relativeNode = treechildren.lastChild; // folder non-empty, set relativeNode
|
||||
parentNode = aSelectedItem; // no matter what, folder is open, so make it parent
|
||||
} else {
|
||||
parentNode = relativeNode ? gBookmarksShell.findRDFNode(relativeNode, false) : gBookmarksShell.tree;
|
||||
}
|
||||
}
|
||||
|
||||
var args = [{ property: NC_NS + "parent",
|
||||
resource: NODE_ID(parentNode) },
|
||||
{ property: NC_NS + "Name",
|
||||
literal: stringValue.value }];
|
||||
|
||||
const kBMDS = gBookmarksShell.RDF.GetDataSource("rdf:bookmarks");
|
||||
kBMDS.AddObserver(newFolderRDFObserver);
|
||||
var relId = relativeNode ? NODE_ID(relativeNode) : "NC:BookmarksRoot";
|
||||
BookmarksUtils.doBookmarksCommand(relId, NC_NS_CMD + "newfolder", args);
|
||||
kBMDS.RemoveObserver(newFolderRDFObserver);
|
||||
var newFolderItem = document.getElementById(newFolderRDFObserver._newFolderURI);
|
||||
gBookmarksShell.tree.focus();
|
||||
gBookmarksShell.tree.selectItem(newFolderItem);
|
||||
// Can't use newFolderItem because it may not have been created yet. Hack, huh?
|
||||
var index = gBookmarksShell.tree.getIndexOfItem(relativeNode);
|
||||
gBookmarksShell.tree.ensureIndexIsVisible(index+1);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
// HACK HACK HACK HACK HACK
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Disable inline edit for now
|
||||
const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
var dummyItem = document.createElementNS(kXULNS, "treeitem");
|
||||
dummyItem = gBookmarksShell.createBookmarkFolderDecorations(dummyItem);
|
||||
dummyItem.setAttribute("class", "bookmark-item");
|
||||
|
||||
var dummyRow = document.createElementNS(kXULNS, "treerow");
|
||||
var dummyCell = document.createElementNS(kXULNS, "treecell");
|
||||
var dummyCell2 = document.createElementNS(kXULNS, "treecell");
|
||||
dummyCell.setAttribute("label", gBookmarksShell.getLocaleString("ile_newfolder") + " ");
|
||||
dummyCell.setAttribute("type", NC_NS + "Folder");
|
||||
dummyCell.setAttribute("editable", "true");
|
||||
dummyCell.setAttribute("class", "treecell-indent treecell-editable");
|
||||
dummyRow.appendChild(dummyCell);
|
||||
dummyItem.appendChild(dummyRow);
|
||||
|
||||
var relativeNode = null;
|
||||
|
||||
// If there are selected items, try to create the dummy item relative to the
|
||||
// best item, and position the bookmark there when created. Otherwise just
|
||||
// append to the root.
|
||||
if (aSelectedItem && aSelectedItem.localName != "tree") {
|
||||
// By default, create adjacent to the selected item
|
||||
relativeNode = aSelectedItem;
|
||||
if (relativeNode.getAttribute("container") == "true" &&
|
||||
relativeNode.getAttribute("open") == "true") {
|
||||
// But if it's an open container, the relative node should be the last child.
|
||||
var treechildren = ContentUtils.childByLocalName(relativeNode, "treechildren");
|
||||
if (treechildren && treechildren.hasChildNodes())
|
||||
relativeNode = treechildren.lastChild;
|
||||
}
|
||||
|
||||
if (aSelectedItem.getAttribute("container") == "true") {
|
||||
if (aSelectedItem.getAttribute("open") == "true") {
|
||||
var treechildren = ContentUtils.childByLocalName(aSelectedItem, "treechildren");
|
||||
if (!treechildren) {
|
||||
treechildren = document.createElementNS(kXULNS, "treechildren");
|
||||
aSelectedItem.appendChild(treechildren);
|
||||
}
|
||||
// Insert new item after last item.
|
||||
treechildren.appendChild(dummyItem);
|
||||
}
|
||||
else {
|
||||
if (aSelectedItem.nextSibling)
|
||||
aSelectedItem.parentNode.insertBefore(dummyItem, aSelectedItem.nextSibling);
|
||||
else
|
||||
aSelectedItem.parentNode.appendChild(dummyItem);
|
||||
}
|
||||
var index = gBookmarksShell.tree.getIndexOfItem(dummyItem);
|
||||
gBookmarksShell.tree.ensureIndexIsVisible(index);
|
||||
}
|
||||
else {
|
||||
if (aSelectedItem.nextSibling)
|
||||
aSelectedItem.parentNode.insertBefore(dummyItem, aSelectedItem.nextSibling);
|
||||
else
|
||||
aSelectedItem.parentNode.appendChild(dummyItem);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// No items in the tree. Append to the root.
|
||||
var rootKids = document.getElementById("treechildren-bookmarks");
|
||||
rootKids.appendChild(dummyItem);
|
||||
}
|
||||
|
||||
dummyCell.setMode("edit");
|
||||
dummyCell.addObserver(this.onEditFolderName, "accept", [dummyCell, relativeNode, dummyItem]);
|
||||
dummyCell.addObserver(this.onEditFolderName, "reject", [dummyCell, relativeNode, dummyItem]);
|
||||
*/
|
||||
}
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Evaluates an event to determine whether or not it affords opening a tree
|
||||
// item. Typically, this is when the left mouse button is used, and provided
|
||||
// the click-rate matches that specified by our owning tree class. For example,
|
||||
// some trees open an item when double clicked (bookmarks/history windows) and
|
||||
// others on a single click (sidebar panels).
|
||||
isValidOpenEvent: function (aEvent)
|
||||
{
|
||||
return !(aEvent.type == "click" &&
|
||||
(aEvent.button != 0 || aEvent.detail != this.openClickCount))
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// For the given selection, selects the best adjacent element. This method is
|
||||
// useful when an action such as a cut or a deletion is performed on a
|
||||
// selection, and focus/selection needs to be restored after the operation
|
||||
// is performed.
|
||||
getNextElement: function (aElement)
|
||||
{
|
||||
if (aElement.nextSibling)
|
||||
return aElement.nextSibling;
|
||||
else if (aElement.previousSibling)
|
||||
return aElement.previousSibling;
|
||||
else
|
||||
return aElement.parentNode.parentNode;
|
||||
},
|
||||
|
||||
selectElement: function (aElement)
|
||||
{
|
||||
this.tree.selectItem(aElement);
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Add the treeitem element specified by aURI to the tree's current selection.
|
||||
addItemToSelection: function (aURI)
|
||||
{
|
||||
var item = document.getElementById(aURI) // XXX flawed for multiple ids
|
||||
this.tree.addItemToSelection(item);
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Return a set of DOM nodes that represent the selection in the tree widget.
|
||||
// This method is takes a node parameter which is the popupNode for the
|
||||
// document. If the popupNode is not contained by the selection, the
|
||||
// popupNode is selected and the new selection returned.
|
||||
getSelection: function ()
|
||||
{
|
||||
// Note that we don't just the selectedItems NodeList here because that
|
||||
// is a reference to a LIVE DOM NODE LIST. We want to maintain control
|
||||
// over what is in the selection array ourselves.
|
||||
return [].concat(this.tree.selectedItems);
|
||||
},
|
||||
|
||||
getBestItem: function ()
|
||||
{
|
||||
var seln = this.getSelection ();
|
||||
if (seln.length < 1) {
|
||||
var kids = ContentUtils.childByLocalName(this.tree, "treechildren");
|
||||
return kids.lastChild || this.tree;
|
||||
}
|
||||
else
|
||||
return seln[0];
|
||||
return this.tree;
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Return a set of DOM nodes that represent the selection in the tree widget.
|
||||
// This method is takes a node parameter which is the popupNode for the
|
||||
// document. If the popupNode is not contained by the selection, the
|
||||
// popupNode is selected and the new selection returned.
|
||||
getContextSelection: function (aItemNode)
|
||||
{
|
||||
// How a context-click works:
|
||||
// if the popup node is contained by the selection, the context menu is
|
||||
// built for that selection. However, if the popup node is invoked on a
|
||||
// non-selected node, unless modifiers are pressed**, the previous
|
||||
// selection is discarded and that node selected.
|
||||
var selectedItems = this.tree.selectedItems;
|
||||
for (var i = 0; i < selectedItems.length; ++i) {
|
||||
if (selectedItems[i] == aItemNode)
|
||||
return selectedItems;
|
||||
}
|
||||
if (aItemNode.localName == "treeitem")
|
||||
this.tree.selectItem(aItemNode);
|
||||
return this.tree.selectedItems.length ? this.tree.selectedItems : [this.tree];
|
||||
},
|
||||
|
||||
getSelectedFolder: function ()
|
||||
{
|
||||
var selectedItem = this.getBestItem();
|
||||
if (!selectedItem) return "NC:BookmarksRoot";
|
||||
while (selectedItem && selectedItem.nodeType == Node.ELEMENT_NODE) {
|
||||
if (selectedItem.getAttribute("container") == "true" &&
|
||||
selectedItem.getAttribute("open") == "true")
|
||||
return NODE_ID(selectedItem);
|
||||
selectedItem = selectedItem.parentNode.parentNode;
|
||||
}
|
||||
return "NC:BookmarksRoot";
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// For a given start DOM element, find the enclosing DOM element that contains
|
||||
// the template builder RDF resource decorations (id, ref, etc).
|
||||
findRDFNode: function (aStartNode, aIncludeStartNodeFlag)
|
||||
{
|
||||
var temp = aIncludeStartNodeFlag ? aStartNode : aStartNode.parentNode;
|
||||
while (temp && temp.localName != "treeitem")
|
||||
temp = temp.parentNode;
|
||||
return temp || this.tree;
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Tree click events. This handles when to go into inline-edit mode for
|
||||
// editable cells.
|
||||
treeClicked: function (aEvent)
|
||||
{
|
||||
// We are disabling Inline Edit for now. It's too buggy in the old XUL tree widget.
|
||||
// A more solid implementation will follow the conversion to tree
|
||||
/*
|
||||
if (this.tree.selectedItems.length > 1 || aEvent.detail > 1 || aEvent.button != 0) {
|
||||
gSelectionTracker.clickCount = 0;
|
||||
return;
|
||||
}
|
||||
if (gSelectionTracker.currentItem == this.tree.currentItem &&
|
||||
gSelectionTracker.currentCell == aEvent.target)
|
||||
++gSelectionTracker.clickCount;
|
||||
else
|
||||
gSelectionTracker.clickCount = 0;
|
||||
|
||||
if (!this.tree.currentItem)
|
||||
return;
|
||||
|
||||
gSelectionTracker.currentItem = this.tree.currentItem;
|
||||
gSelectionTracker.currentCell = aEvent.target;
|
||||
|
||||
if (gSelectionTracker.currentItem.getAttribute("type") != NC_NS + "Bookmark" &&
|
||||
gSelectionTracker.currentItem.getAttribute("type") != NC_NS + "Folder")
|
||||
return;
|
||||
|
||||
var row = gSelectionTracker.currentItem.firstChild;
|
||||
if (row) {
|
||||
for (var i = 0; i < row.childNodes.length; ++i) {
|
||||
if (row.childNodes[i] == gSelectionTracker.currentCell) {
|
||||
// Don't allow inline-edit of cells other than name for folders.
|
||||
// XXX - so so skeezy. Change this to look for NC:Name or some such.
|
||||
if (gSelectionTracker.currentItem.getAttribute("type") != NC_NS + "Bookmark" && i)
|
||||
return;
|
||||
// Don't allow editing of the root folder name
|
||||
if (gSelectionTracker.currentItem.id == "NC:BookmarksRoot")
|
||||
return;
|
||||
if (gSelectionTracker.clickCount == 1 && this.openClickCount > 1)
|
||||
gBookmarksShell.commands.editCell(this.tree.currentItem, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
},
|
||||
|
||||
treeOpen: function (aEvent)
|
||||
{
|
||||
if (this.isValidOpenEvent(aEvent)) {
|
||||
var rdfNode = this.findRDFNode(aEvent.target, true);
|
||||
if (rdfNode.getAttribute("container") != "true")
|
||||
this.open(aEvent, rdfNode);
|
||||
}
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Tree key events. This handles when to go into inline-edit mode for editable
|
||||
// cells, when to load a URL, etc.
|
||||
treeKeyPress: function (aEvent)
|
||||
{
|
||||
if (this.tree.selectedItems.length > 1) return;
|
||||
|
||||
/* Disabling Inline Edit
|
||||
if (aEvent.keyCode == 113 && aEvent.shiftKey) {
|
||||
const kNodeId = NODE_ID(this.tree.currentItem);
|
||||
if (this.resolveType(kNodeId) == NC_NS + "Bookmark")
|
||||
gBookmarksShell.commands.editCell (this.tree.currentItem, 1);
|
||||
}
|
||||
else */
|
||||
if (aEvent.keyCode == 113)
|
||||
goDoCommand("cmd_rename");
|
||||
else if (aEvent.keyCode == 13) // && this.tree.currentItem.firstChild.getAttribute("inline-edit") != "true")
|
||||
goDoCommand(aEvent.altKey ? "cmd_properties" : "cmd_open");
|
||||
},
|
||||
|
||||
selectFolderItem: function (aFolderURI, aItemURI, aAdditiveFlag)
|
||||
{
|
||||
var folder = document.getElementById(aFolderURI);
|
||||
var kids = ContentUtils.childByLocalName(folder, "treechildren");
|
||||
if (!kids) return;
|
||||
|
||||
var item = kids.firstChild;
|
||||
while (item) {
|
||||
if (item.id == aItemURI) break;
|
||||
item = item.nextSibling;
|
||||
}
|
||||
if (!item) return;
|
||||
|
||||
this.tree[aAdditiveFlag ? "addItemToSelection" : "selectItem"](item);
|
||||
},
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Command handling & Updating.
|
||||
controller: {
|
||||
supportsCommand: function (aCommand)
|
||||
{
|
||||
switch(aCommand) {
|
||||
case "cmd_undo":
|
||||
case "cmd_redo":
|
||||
return false;
|
||||
case "cmd_bm_cut":
|
||||
case "cmd_bm_copy":
|
||||
case "cmd_bm_paste":
|
||||
case "cmd_bm_delete":
|
||||
case "cmd_bm_selectAll":
|
||||
return true;
|
||||
case "cmd_open":
|
||||
case "cmd_openfolder":
|
||||
case "cmd_openfolderinnewwindow":
|
||||
case "cmd_newbookmark":
|
||||
case "cmd_newfolder":
|
||||
case "cmd_newseparator":
|
||||
case "cmd_find":
|
||||
case "cmd_properties":
|
||||
case "cmd_rename":
|
||||
case "cmd_setnewbookmarkfolder":
|
||||
case "cmd_setpersonaltoolbarfolder":
|
||||
case "cmd_setnewsearchfolder":
|
||||
case "cmd_import":
|
||||
case "cmd_export":
|
||||
case "cmd_bm_fileBookmark":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
isCommandEnabled: function (aCommand)
|
||||
{
|
||||
var numSelectedItems = gBookmarksShell.tree.selectedItems.length;
|
||||
var seln, firstSelected, folderType, bItemCountCorrect;
|
||||
switch(aCommand) {
|
||||
case "cmd_undo":
|
||||
case "cmd_redo":
|
||||
return false;
|
||||
case "cmd_bm_paste":
|
||||
return gBookmarksShell.canPaste();
|
||||
case "cmd_bm_cut":
|
||||
case "cmd_bm_copy":
|
||||
case "cmd_bm_delete":
|
||||
return numSelectedItems >= 1;
|
||||
case "cmd_bm_selectAll":
|
||||
return true;
|
||||
case "cmd_open":
|
||||
seln = gBookmarksShell.tree.selectedItems;
|
||||
return numSelectedItems == 1 && seln[0].getAttribute("type") == NC_NS + "Bookmark";
|
||||
case "cmd_openfolder":
|
||||
case "cmd_openfolderinnewwindow":
|
||||
seln = gBookmarksShell.tree.selectedItems;
|
||||
return numSelectedItems == 1 && seln[0].getAttribute("type") == NC_NS + "Folder";
|
||||
case "cmd_find":
|
||||
case "cmd_newbookmark":
|
||||
case "cmd_newfolder":
|
||||
case "cmd_newseparator":
|
||||
case "cmd_import":
|
||||
case "cmd_export":
|
||||
return true;
|
||||
case "cmd_properties":
|
||||
case "cmd_rename":
|
||||
seln = gBookmarksShell.tree.selectedItems;
|
||||
return numSelectedItems == 1 && seln[0].getAttribute("type") != NC_NS + "BookmarkSeparator";
|
||||
case "cmd_setnewbookmarkfolder":
|
||||
seln = gBookmarksShell.tree.selectedItems;
|
||||
firstSelected = seln.length ? seln[0] : gBookmarksShell.tree;
|
||||
folderType = firstSelected.getAttribute("type") == (NC_NS + "Folder");
|
||||
bItemCountCorrect = seln.length ? numSelectedItems == 1 : true;
|
||||
return bItemCountCorrect && !(NODE_ID(firstSelected) == "NC:NewBookmarkFolder") && folderType;
|
||||
case "cmd_setpersonaltoolbarfolder":
|
||||
seln = gBookmarksShell.tree.selectedItems;
|
||||
firstSelected = seln.length ? seln[0] : gBookmarksShell.tree;
|
||||
folderType = firstSelected.getAttribute("type") == (NC_NS + "Folder");
|
||||
bItemCountCorrect = seln.length ? numSelectedItems == 1 : true;
|
||||
return bItemCountCorrect && !(NODE_ID(firstSelected) == "NC:PersonalToolbarFolder") && folderType;
|
||||
case "cmd_setnewsearchfolder":
|
||||
seln = gBookmarksShell.tree.selectedItems;
|
||||
firstSelected = seln.length ? seln[0] : gBookmarksShell.tree;
|
||||
folderType = firstSelected.getAttribute("type") == (NC_NS + "Folder");
|
||||
bItemCountCorrect = seln.length ? numSelectedItems == 1 : true;
|
||||
return bItemCountCorrect == 1 && !(NODE_ID(firstSelected) == "NC:NewSearchFolder") && folderType;
|
||||
case "cmd_bm_fileBookmark":
|
||||
seln = gBookmarksShell.tree.selectedItems;
|
||||
return seln.length > 0;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
doCommand: function (aCommand)
|
||||
{
|
||||
switch(aCommand) {
|
||||
case "cmd_undo":
|
||||
case "cmd_redo":
|
||||
break;
|
||||
case "cmd_bm_paste":
|
||||
case "cmd_bm_copy":
|
||||
case "cmd_bm_cut":
|
||||
case "cmd_bm_delete":
|
||||
case "cmd_newbookmark":
|
||||
case "cmd_newfolder":
|
||||
case "cmd_newseparator":
|
||||
case "cmd_properties":
|
||||
case "cmd_rename":
|
||||
case "cmd_open":
|
||||
case "cmd_openfolder":
|
||||
case "cmd_openfolderinnewwindow":
|
||||
case "cmd_setnewbookmarkfolder":
|
||||
case "cmd_setpersonaltoolbarfolder":
|
||||
case "cmd_setnewsearchfolder":
|
||||
case "cmd_find":
|
||||
case "cmd_import":
|
||||
case "cmd_export":
|
||||
case "cmd_bm_fileBookmark":
|
||||
gBookmarksShell.execCommand(aCommand.substring("cmd_".length));
|
||||
break;
|
||||
case "cmd_bm_selectAll":
|
||||
gBookmarksShell.tree.selectAll();
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
onEvent: function (aEvent)
|
||||
{
|
||||
switch (aEvent) {
|
||||
case "tree-select":
|
||||
this.onCommandUpdate();
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
onCommandUpdate: function ()
|
||||
{
|
||||
var commands = ["cmd_properties", "cmd_rename", "cmd_bm_copy",
|
||||
"cmd_bm_paste", "cmd_bm_cut", "cmd_bm_delete",
|
||||
"cmd_setpersonaltoolbarfolder",
|
||||
"cmd_setnewbookmarkfolder",
|
||||
"cmd_setnewsearchfolder", "cmd_bm_fileBookmark",
|
||||
"cmd_openfolderinnewwindow", "cmd_openfolder"];
|
||||
for (var i = 0; i < commands.length; ++i)
|
||||
goUpdateCommand(commands[i]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var newFolderRDFObserver = {
|
||||
_newFolderURI: null,
|
||||
onAssert: function (aDS, aSource, aProperty, aValue)
|
||||
{
|
||||
try {
|
||||
var value = aValue.QueryInterface(Components.interfaces.nsIRDFResource);
|
||||
if (aDS.URI == "rdf:bookmarks" && aProperty.Value == RDF_NS + "type" &&
|
||||
value.Value == NC_NS + "Folder")
|
||||
this._newFolderURI = aSource.Value;
|
||||
}
|
||||
catch (e) {
|
||||
// Failures are OK, the value could be a literal instead of a resource.
|
||||
}
|
||||
},
|
||||
|
||||
onUnassert: function (aDS, aSource, aProperty, aTarget) { },
|
||||
onChange: function (aDS, aSource, aProperty, aOldTarget, aNewTarget) { },
|
||||
onMove: function (aDS, aOldSource, aNewSource, aProperty, aTarget) { },
|
||||
beginUpdateBatch: function (aDS) { },
|
||||
endUpdateBatch: function (aDS) { }
|
||||
};
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@netscape.com> (Original Author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
const BMARKS_CONTRACTID = "@mozilla.org/browser/bookmarks-service;1";
|
||||
const nsIBookmarksService = Components.interfaces.nsIBookmarksService;
|
||||
|
||||
var gOKButton;
|
||||
var gSearchField;
|
||||
function Startup()
|
||||
{
|
||||
var bundle = document.getElementById("bookmarksBundle");
|
||||
gOKButton = document.documentElement.getButton("accept");
|
||||
gOKButton.label = bundle.getString("search_button_label");
|
||||
gOKButton.disabled = true;
|
||||
gSearchField = document.getElementById("searchField");
|
||||
gSearchField.focus();
|
||||
}
|
||||
var gCreatingNewWindow = false;
|
||||
function find()
|
||||
{
|
||||
// Build up a find URI from the search fields and open a new window
|
||||
// rooted on the URI.
|
||||
var match = document.getElementById("matchList");
|
||||
var method = document.getElementById("methodList");
|
||||
var searchURI = "find:datasource=rdf:bookmarks"
|
||||
searchURI += "&match=" + match.selectedItem.value;
|
||||
searchURI += "&method=" + method.selectedItem.value;
|
||||
searchURI += "&text=" + escape(gSearchField.value);
|
||||
var bmWindow = findMostRecentWindow("bookmarks:searchresults", "chrome://communicator/content/bookmarks/bookmarks.xul", searchURI);
|
||||
|
||||
// Update the root of the tree if we're using an existing search window.
|
||||
if (!gCreatingNewWindow)
|
||||
bmWindow.document.getElementById("bookmarks-view").tree.setAttribute("ref", searchURI);
|
||||
|
||||
bmWindow.focus();
|
||||
|
||||
if (document.getElementById("saveQuery").checked == true)
|
||||
{
|
||||
var bundle = document.getElementById("bookmarksBundle");
|
||||
var findTitle = bundle.stringBundle.formatStringFromName(
|
||||
"ShortFindTitle", [gSearchField.value], 1);
|
||||
var bmks = Components.classes[BMARKS_CONTRACTID].getService(nsIBookmarksService);
|
||||
bmks.addBookmarkImmediately(searchURI, findTitle, bmks.BOOKMARK_FIND_TYPE, null);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function findMostRecentWindow(aType, aURI, aParam)
|
||||
{
|
||||
var WM = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
|
||||
WM = WM.QueryInterface(Components.interfaces.nsIWindowMediator);
|
||||
var topWindow = WM.getMostRecentWindow(aType);
|
||||
if (!topWindow) gCreatingNewWindow = true;
|
||||
return topWindow || openDialog("chrome://communicator/content/bookmarks/bookmarks.xul",
|
||||
"", "chrome,all,dialog=no", aParam);
|
||||
}
|
||||
|
||||
function doEnabling()
|
||||
{
|
||||
gOKButton.disabled = !gSearchField.value;
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!-- -*- Mode: HTML; indent-tabs-mode: nil; -*- -->
|
||||
<!--
|
||||
|
||||
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.org code.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Ben Goodger <ben@netscape.com> (Original Author)
|
||||
-->
|
||||
|
||||
<!--
|
||||
"Find Bookmarks" window
|
||||
-->
|
||||
|
||||
<?xml-stylesheet href="chrome://communicator/skin/"?>
|
||||
<!DOCTYPE window SYSTEM "chrome://communicator/locale/bookmarks/findBookmark.dtd">
|
||||
|
||||
<dialog id="findBookmarkWindow" style="width: 36em;"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
title="&findBookmark.title;"
|
||||
onload="Startup();"
|
||||
ondialogaccept="return find();">
|
||||
|
||||
<stringbundle id="bookmarksBundle" src="chrome://communicator/locale/bookmarks/bookmark.properties"/>
|
||||
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/bookmarksOverlay.js"/>
|
||||
<script type="application/x-javascript" src="chrome://communicator/content/bookmarks/findBookmark.js"/>
|
||||
|
||||
<label value="&search.for.label;"/>
|
||||
<hbox align="center">
|
||||
<menulist id="matchList" class="menulist-toolbar">
|
||||
<menupopup>
|
||||
<menuitem value="http://home.netscape.com/NC-rdf#Name" label="&search.name.label;"/>
|
||||
<menuitem value="http://home.netscape.com/NC-rdf#URL" label="&search.url.label;"/>
|
||||
<menuitem value="http://home.netscape.com/NC-rdf#Description" label="&search.description.label;"/>
|
||||
<menuitem value="http://home.netscape.com/NC-rdf#ShortcutURL" label="&search.shortcut.label;"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
<menulist id="methodList" class="menulist-toolbar">
|
||||
<menupopup>
|
||||
<menuitem value="contains" label="&search.contains.label;"/>
|
||||
<menuitem value="startswith" label="&search.startswith.label;"/>
|
||||
<menuitem value="endswith" label="&search.endswith.label;"/>
|
||||
<menuitem value="is" label="&search.is.label;"/>
|
||||
<menuitem value="isnot" label="&search.isnot.label;"/>
|
||||
<menuitem value="doesntcontain" label="&search.doesntcontain.label;"/>
|
||||
</menupopup>
|
||||
</menulist>
|
||||
<textbox id="searchField" flex="1" oninput="doEnabling();"/>
|
||||
</hbox>
|
||||
<checkbox id="saveQuery" label="&save.query.label;" />
|
||||
</dialog>
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
comm.jar:
|
||||
content/communicator/bookmarks/addBookmark.xul
|
||||
content/communicator/bookmarks/addBookmark.js
|
||||
content/communicator/bookmarks/bm-props.js
|
||||
content/communicator/bookmarks/bm-props.xul
|
||||
content/communicator/bookmarks/bookmarksDD.js
|
||||
content/communicator/bookmarks/bookmarks.xul
|
||||
content/communicator/bookmarks/bookmarks.js
|
||||
content/communicator/bookmarks/bookmarks.css
|
||||
content/communicator/bookmarks/bookmarks.xml
|
||||
content/communicator/bookmarks/bookmarksTree.js
|
||||
content/communicator/bookmarks/bookmarksOverlay.xul
|
||||
content/communicator/bookmarks/bookmarksOverlay.js
|
||||
content/communicator/bookmarks/bm-panel.xul
|
||||
content/communicator/bookmarks/bookmarksPanel.js
|
||||
content/communicator/bookmarks/findBookmark.js
|
||||
content/communicator/bookmarks/findBookmark.xul
|
||||
content/communicator/bookmarks/pref-bookmarks.xul
|
||||
content/communicator/bookmarks/oTest.xul
|
||||
|
||||
en-US.jar:
|
||||
locale/en-US/communicator/bookmarks/addBookmark.dtd (locale/en-US/addBookmark.dtd)
|
||||
locale/en-US/communicator/bookmarks/bm-props.dtd (locale/en-US/bm-props.dtd)
|
||||
locale/en-US/communicator/bookmarks/bookmarks.dtd (locale/en-US/bookmarks.dtd)
|
||||
locale/en-US/communicator/bookmarks/bookmark.properties (locale/en-US/bookmark.properties)
|
||||
locale/en-US/communicator/bookmarks/bookmarksOverlay.dtd (locale/en-US/bookmarksOverlay.dtd)
|
||||
locale/en-US/communicator/bookmarks/findBookmark.dtd (locale/en-US/findBookmark.dtd)
|
||||
locale/en-US/communicator/bookmarks/pref-bookmarks.dtd (locale/en-US/pref-bookmarks.dtd)
|
||||
@@ -1,4 +0,0 @@
|
||||
en-US:bm-find.dtd
|
||||
en-US:bm-props.dtd
|
||||
en-US:bookmarks.dtd
|
||||
en-US:bookmark.properties
|
||||
@@ -1,4 +0,0 @@
|
||||
bm-find.dtd
|
||||
bm-props.dtd
|
||||
bookmark.properties
|
||||
bookmarks.dtd
|
||||
@@ -1,46 +0,0 @@
|
||||
<!--
|
||||
- The contents of this file are subject to the Mozilla 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/MPL/
|
||||
-
|
||||
- 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.
|
||||
-
|
||||
- The Initial Developer of the Original Code is Netscape
|
||||
- Communications Corp. Portions created by Netscape Communications
|
||||
- Corp. are Copyright (C) 1999 Netscape Communications Corp. All
|
||||
- Rights Reserved.
|
||||
-
|
||||
- Contributor(s):
|
||||
- Ben Goodger <ben@netscape.com> (Original Author)
|
||||
-->
|
||||
|
||||
<!ENTITY newBookmark.title "Add Bookmark">
|
||||
<!ENTITY newbookmark.label "&brandShortName; will add a bookmark to this page.">
|
||||
<!ENTITY name.label "Name:">
|
||||
<!ENTITY name.accesskey "n">
|
||||
<!ENTITY url.label "Location:">
|
||||
<!ENTITY url.accesskey "l">
|
||||
<!ENTITY button.createin.label "Create In >>">
|
||||
<!ENTITY button.createin.accesskey "c">
|
||||
<!ENTITY button.createin2.label "Create In <<">
|
||||
<!ENTITY createin.label "Create in:">
|
||||
<!ENTITY createin.accesskey "i">
|
||||
<!ENTITY button.newfolder.label "New Folder...">
|
||||
<!ENTITY button.newfolder.accesskey "w">
|
||||
<!ENTITY alwayscreateinfolder.label "Don't show this dialog again">
|
||||
<!ENTITY alwayscreateinfolder.accesskey "a">
|
||||
<!ENTITY dontshowmessage.tooltip "When this option is selected, new Bookmarks will be added using the title provided by the page.">
|
||||
<!ENTITY button.defaultfolder.label "Use Default">
|
||||
<!ENTITY button.defaultfolder.accesskey "d">
|
||||
<!ENTITY selectFolder.label "Choose Folder">
|
||||
<!ENTITY addGroup.label "Bookmark this group of tabs">
|
||||
<!ENTITY addGroup.accesskey "B">
|
||||
|
||||
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
<!--
|
||||
- The contents of this file are subject to the Mozilla 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/MPL/
|
||||
-
|
||||
- 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.
|
||||
-
|
||||
- The Initial Developer of the Original Code is Netscape
|
||||
- Communications Corp. Portions created by Netscape Communications
|
||||
- Corp. are Copyright (C) 1999 Netscape Communications Corp. All
|
||||
- Rights Reserved.
|
||||
-
|
||||
- Contributor(s): Stephen Lamm <slamm@netscape.com>
|
||||
- Robert John Churchill <rjc@netscape.com>
|
||||
- Ben Goodger <ben@netscape.com>
|
||||
-->
|
||||
|
||||
<!ENTITY bookmarks.windowtitle.label "Properties for "**bm_title**"">
|
||||
|
||||
<!ENTITY generalInfo.label "Info">
|
||||
<!ENTITY generalInfo.accesskey "i">
|
||||
<!ENTITY generaldesc.label "&brandShortName; can remember the locations of sites on the Internet for you. Enter the site's name and location in the fields below, then select the site from the Bookmarks menu or your Bookmarks Sidebar tab to visit the site.">
|
||||
|
||||
<!ENTITY schedule.label "Schedule">
|
||||
<!ENTITY schedule.accesskey "s">
|
||||
<!ENTITY schedule.description "&brandShortName; can check this site for updates and notify you when one occurs. Use these settings to customize the schedule for this Bookmark.">
|
||||
<!ENTITY notification.label "Notify">
|
||||
<!ENTITY notification.accesskey "n">
|
||||
<!-- ICK. fix me -->
|
||||
<!ENTITY notification.description "&brandShortName; will notify you when this site changes. Use these settings to customize notification.">
|
||||
|
||||
<!ENTITY bookmarks.information.label "Information:">
|
||||
<!ENTITY bookmarks.name.label "Name:">
|
||||
<!ENTITY bookmarks.location.label "Location:">
|
||||
<!ENTITY bookmarks.shortcut.label "Keyword:">
|
||||
<!ENTITY bookmarks.description.label "Description:">
|
||||
|
||||
<!ENTITY checkforupdates.legend.label "Check this location for updates:">
|
||||
<!ENTITY when.label "When:">
|
||||
<!ENTITY from.label "from:">
|
||||
<!ENTITY to.label "to: ">
|
||||
<!ENTITY every.label "every">
|
||||
<!ENTITY minutes.label "minute(s)">
|
||||
<!ENTITY notifications.legend.label "Notification:">
|
||||
|
||||
<!ENTITY checknever.label "Never">
|
||||
<!ENTITY checkeveryday.label "Every day">
|
||||
<!ENTITY checkweekdays.label "Weekdays">
|
||||
<!ENTITY checkweekends.label "Weekends">
|
||||
<!ENTITY checkmondays.label "Mondays">
|
||||
<!ENTITY checktuesdays.label "Tuesdays">
|
||||
<!ENTITY checkwednesdays.label "Wednesdays">
|
||||
<!ENTITY checkthursdays.label "Thursdays">
|
||||
<!ENTITY checkfridays.label "Fridays">
|
||||
<!ENTITY checksaturdays.label "Saturdays">
|
||||
<!ENTITY checksundays.label "Sundays">
|
||||
|
||||
<!ENTITY midnight.label "Midnight">
|
||||
<!ENTITY AMone.label "1 AM">
|
||||
<!ENTITY AMtwo.label "2 AM">
|
||||
<!ENTITY AMthree.label "3 AM">
|
||||
<!ENTITY AMfour.label "4 AM">
|
||||
<!ENTITY AMfive.label "5 AM">
|
||||
<!ENTITY AMsix.label "6 AM">
|
||||
<!ENTITY AMseven.label "7 AM">
|
||||
<!ENTITY AMeight.label "8 AM">
|
||||
<!ENTITY AMnine.label "9 AM">
|
||||
<!ENTITY AMten.label "10 AM">
|
||||
<!ENTITY AMeleven.label "11 AM">
|
||||
<!ENTITY noon.label "Noon">
|
||||
<!ENTITY PMone.label "1 PM">
|
||||
<!ENTITY PMtwo.label "2 PM">
|
||||
<!ENTITY PMthree.label "3 PM">
|
||||
<!ENTITY PMfour.label "4 PM">
|
||||
<!ENTITY PMfive.label "5 PM">
|
||||
<!ENTITY PMsix.label "6 PM">
|
||||
<!ENTITY PMseven.label "7 PM">
|
||||
<!ENTITY PMeight.label "8 PM">
|
||||
<!ENTITY PMnine.label "9 PM">
|
||||
<!ENTITY PMten.label "10 PM">
|
||||
<!ENTITY PMeleven.label "11 PM">
|
||||
|
||||
<!ENTITY notification.icon.label "Change the bookmark's icon">
|
||||
<!ENTITY notification.sound.label "Play a sound">
|
||||
<!ENTITY notification.alert.label "Display an alert">
|
||||
<!ENTITY notification.window.label "Open web page in a new window">
|
||||
@@ -1,80 +0,0 @@
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
cmd_bm_open = Open
|
||||
cmd_bm_openfolder = Expand
|
||||
cmd_bm_openfolder2 = Collapse
|
||||
cmd_bm_find = Find a Bookmark...
|
||||
cmd_bm_cut = Cut
|
||||
cmd_bm_copy = Copy
|
||||
cmd_bm_paste = Paste
|
||||
cmd_bm_delete = Delete
|
||||
cmd_bm_selectAll = Select All
|
||||
cmd_bm_rename = Rename...
|
||||
cmd_bm_renamebookmark2 = Change Location...
|
||||
cmd_bm_properties = Properties
|
||||
cmd_bm_fileBookmark = File Bookmark(s)...
|
||||
|
||||
cmd_bm_openinnewwindow = Open in New Window
|
||||
cmd_bm_newfolder = New Folder...
|
||||
cmd_bm_newbookmark = New Bookmark...
|
||||
cmd_bm_newseparator = New Separator
|
||||
cmd_bm_setnewbookmarkfolder = Set as New Bookmark folder
|
||||
cmd_bm_setpersonaltoolbarfolder = Set as Personal Toolbar folder
|
||||
cmd_bm_setnewsearchfolder = Set as Saved Search Results folder
|
||||
|
||||
ile_newfolder = New Folder
|
||||
ile_newbookmark = New Bookmark
|
||||
newfolder_dialog_title = Create New Folder
|
||||
newfolder_dialog_msg = Create a New Folder named:
|
||||
|
||||
window_title = %folder_name% - Bookmarks
|
||||
search_results_title = Search Results
|
||||
|
||||
file_in = File in "%folder_name%"
|
||||
|
||||
bookmarks_root = Bookmarks for %user_name%
|
||||
status_foldercount = %num_items% object(s)
|
||||
|
||||
WebPageUpdated = The following web page has been updated:
|
||||
WebPageTitle = Title:
|
||||
WebPageURL = URL:
|
||||
WebPageAskDisplay = Would you like to display it?
|
||||
WebPageAskStopOption = Stop checking for updates on this web page
|
||||
|
||||
pleaseEnterALocation = Please enter a location
|
||||
pleaseEnterADuration = Please enter a duration.
|
||||
pleaseSelectANotification = Please enter at least one notification method.
|
||||
|
||||
SortMenuItem = Sorted by %NAME%
|
||||
|
||||
ShortFindTitle = Find: '%S'
|
||||
FindTitle = Find: %S %S '%S' in %S
|
||||
|
||||
ImportedIEFavorites = Imported IE Favorites
|
||||
ImportedIEStaticFavorites = Imported IE Favorites
|
||||
ImportedNetPositiveBookmarks = Imported NetPositive Bookmarks
|
||||
DefaultPersonalToolbarFolder = Personal Toolbar Folder
|
||||
|
||||
SelectImport = Import bookmark file:
|
||||
EnterExport = Export bookmark file:
|
||||
|
||||
search_button_label = Find
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
<!--
|
||||
- The contents of this file are subject to the Mozilla 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/MPL/
|
||||
-
|
||||
- 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.
|
||||
-
|
||||
- The Initial Developer of the Original Code is Netscape
|
||||
- Communications Corp. Portions created by Netscape Communications
|
||||
- Corp. are Copyright (C) 1999 Netscape Communications Corp. All
|
||||
- Rights Reserved.
|
||||
-
|
||||
- Contributor(s):
|
||||
- Stephen Lamm <slamm@netscape.com>
|
||||
- Blake Ross <blakeross@telocity.com>
|
||||
-->
|
||||
|
||||
<!-- extracted from ./bookmarks.xul -->
|
||||
<!ENTITY menuBar.tooltip "Menu Bar">
|
||||
<!ENTITY bookmarkToolbar.tooltip "Bookmark Toolbar">
|
||||
<!ENTITY menuitem.newBookmark.label "Bookmark">
|
||||
<!ENTITY command.newBookmark.accesskey "B">
|
||||
<!ENTITY menuitem.newFolder.label "Folder">
|
||||
<!ENTITY button.newFolder.label "New Folder">
|
||||
<!ENTITY command.newFolder.accesskey "F">
|
||||
<!ENTITY menuitem.newSeparator.label "Separator">
|
||||
<!ENTITY button.newSeparator.label "New Separator">
|
||||
<!ENTITY command.newSeparator.accesskey "S">
|
||||
<!ENTITY menuitem.import.label "Import...">
|
||||
<!ENTITY menuitem.import.accesskey "i">
|
||||
<!ENTITY menuitem.export.label "Export...">
|
||||
<!ENTITY menuitem.export.accesskey "e">
|
||||
<!ENTITY menuitem.find.label "Search Bookmarks...">
|
||||
<!ENTITY command.findBookmarks.label "Search...">
|
||||
<!ENTITY menuitem.find.accesskey "S">
|
||||
<!ENTITY edit.find.keybinding "f">
|
||||
<!ENTITY command.properties.label "Properties...">
|
||||
<!ENTITY command.properties.accesskey "r">
|
||||
<!ENTITY edit.properties.keybinding "i">
|
||||
<!ENTITY command.rename.label "Rename...">
|
||||
<!ENTITY command.delete.label "Delete">
|
||||
<!ENTITY command.fileBookmark.label "File Bookmark(s)...">
|
||||
<!ENTITY command.fileBookmark.accesskey "l">
|
||||
<!ENTITY command.addBookmark.label "Add...">
|
||||
<!ENTITY command.manageBookmarks.label "Manage">
|
||||
|
||||
|
||||
<!ENTITY menuitem.view.command.toolbar.label "Toolbar">
|
||||
<!ENTITY menuitem.view.command.toolbar.accesskey "t">
|
||||
<!ENTITY menuitem.view.unsorted.label "Unsorted">
|
||||
<!ENTITY menuitem.view.unsorted.accesskey "u">
|
||||
<!ENTITY menuitem.view.ascending.label "A > Z Sort Order">
|
||||
<!ENTITY menuitem.view.ascending.accesskey "a">
|
||||
<!ENTITY menuitem.view.descending.label "Z > A Sort Order">
|
||||
<!ENTITY menuitem.view.descending.accesskey "z">
|
||||
<!ENTITY menuitem.view.show_columns.label "Show columns">
|
||||
<!ENTITY menuitem.view.show_columns.accesskey "S">
|
||||
<!ENTITY menuitem.newbookmarkfolder.label "Set as New Bookmark Folder">
|
||||
<!ENTITY menuitem.newbookmarkfolder.accesskey "b">
|
||||
<!ENTITY menuitem.newinternetsearchfolder.label "Set as New Internet Search Folder">
|
||||
<!ENTITY menuitem.newinternetsearchfolder.accesskey "i">
|
||||
<!ENTITY menuitem.personaltoolbarfolder.label "Set as Personal Toolbar Folder">
|
||||
<!ENTITY menuitem.personaltoolbarfolder.accesskey "p">
|
||||
|
||||
<!ENTITY treecol.name.label "Name">
|
||||
<!ENTITY treecol.name.accesskey "n">
|
||||
<!ENTITY treecol.url.label "Location">
|
||||
<!ENTITY treecol.url.accesskey "l">
|
||||
<!ENTITY treecol.shortcut.label "Keyword">
|
||||
<!ENTITY treecol.shortcut.accesskey "k">
|
||||
<!ENTITY treecol.addedon.label "Added">
|
||||
<!ENTITY treecol.addedon.accesskey "a">
|
||||
<!ENTITY treecol.lastmod.label "Last Modified">
|
||||
<!ENTITY treecol.lastmod.accesskey "m">
|
||||
<!ENTITY treecol.lastvisit.label "Last Visited">
|
||||
<!ENTITY treecol.lastvisit.accesskey "b">
|
||||
<!ENTITY treecol.description.label "Description">
|
||||
<!ENTITY treecol.description.accesskey "d">
|
||||
|
||||
<!ENTITY bookmarksWindowTitle.label "Bookmark Manager">
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
|
||||
<!ENTITY findABookmark.label "Find a Bookmark...">
|
||||
<!ENTITY findABookmark.accesskey "f">
|
||||
<!ENTITY newBookmark.label "New Bookmark...">
|
||||
<!ENTITY newBookmark.accesskey "n">
|
||||
<!ENTITY newFolder.label "New Folder...">
|
||||
<!ENTITY newFolder.accesskey "e">
|
||||
<!ENTITY newSeparator.label "New Separator">
|
||||
<!ENTITY newSeparator.accesskey "s">
|
||||
<!ENTITY setAsNewBookmarkFolder.label "Set as new Bookmark folder">
|
||||
<!ENTITY setAsNewBookmarkFolder.accesskey "b">
|
||||
<!ENTITY setAsNewSearchFolder.label "Set as new Search Results folder">
|
||||
<!ENTITY setAsNewSearchFolder.accesskey "r">
|
||||
<!ENTITY setAsNewToolbarFolder.label "Set as new Personal Toolbar folder">
|
||||
<!ENTITY setAsNewToolbarFolder.accesskey "p">
|
||||
<!ENTITY exportBookmarks.label "Export...">
|
||||
<!ENTITY exportBookmarks.accesskey "x">
|
||||
<!ENTITY importBookmarks.label "Import...">
|
||||
<!ENTITY importBookmarks.accesskey "i">
|
||||
|
||||
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
|
||||
<!ENTITY search.name.label "name">
|
||||
<!ENTITY search.url.label "location">
|
||||
<!ENTITY search.shortcut.label "keyword">
|
||||
<!ENTITY search.description.label "description">
|
||||
<!ENTITY search.startswith.label "starts with">
|
||||
<!ENTITY search.endswith.label "ends with">
|
||||
<!ENTITY search.is.label "is">
|
||||
<!ENTITY search.isnot.label "is not">
|
||||
<!ENTITY search.contains.label "contains">
|
||||
<!ENTITY search.doesntcontain.label "doesn't contain">
|
||||
<!ENTITY save.query.label "Save query in bookmarks">
|
||||
<!ENTITY search.for.label "Find Bookmarks whose">
|
||||
<!ENTITY findBookmark.title "Find Bookmarks">
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
#!nmake
|
||||
# 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) 1999 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
DEPTH = ..\..\..\..\..\..
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
<!ENTITY lHeader "Bookmarks">
|
||||
<!ENTITY filingBookmarks.label "Adding Bookmarks">
|
||||
<!ENTITY autoFile.label "&brandShortName; will ask you to choose a title and folder when adding a new Bookmark.">
|
||||
<!ENTITY enableAutoFile.label "Automatically set title and destination">
|
||||
<!ENTITY defaultFolder.label "By default, all new Bookmarks will be added into this folder:">
|
||||
<!ENTITY chooseDefaultFolder.label "Choose Folder...">
|
||||
<!ENTITY chooseDefaultFolder.accesskey "c">
|
||||
<!ENTITY extendedDataViews.label "Extended Data Views">
|
||||
<!ENTITY extendedDataExplanation.label "&brandShortName; can display some types of special data (e.g. local file folders and ftp directories) in the bookmarks window or menu as folders, rather than as normal links.">
|
||||
<!ENTITY showExtendedData.label "Show Extended Data as folders in the Bookmarks window and menu">
|
||||
<!ENTITY showExtendedData.accesskey "x">
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
#!nmake
|
||||
# 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) 1999 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ..\..\..\..\..
|
||||
|
||||
DIRS = en-US
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
@@ -1,27 +0,0 @@
|
||||
#!nmake
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..\..\..
|
||||
|
||||
DIRS= locale
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
packages/core.jar:
|
||||
communicator/content/bookmarks/bm-find.js
|
||||
communicator/content/bookmarks/bm-find.xul
|
||||
communicator/content/bookmarks/bm-panel.js
|
||||
communicator/content/bookmarks/bm-panel.xul
|
||||
communicator/content/bookmarks/bm-props.js
|
||||
communicator/content/bookmarks/bm-props.xul
|
||||
communicator/content/bookmarks/bookmarks.js
|
||||
communicator/content/bookmarks/bookmarksDD.js
|
||||
communicator/content/bookmarks/bookmarks.xul
|
||||
@@ -1,2 +0,0 @@
|
||||
|
||||
|
||||
@@ -1,162 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<?xml-stylesheet href="chrome://communicator/skin/"?>
|
||||
<?xml-stylesheet href="chrome://communicator/content/bookmarks/oTest.css"?>
|
||||
|
||||
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
|
||||
|
||||
<window id="bookmarksTreeTest" width="640" height="480"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
orient="vertical"
|
||||
onload="Startup();">
|
||||
|
||||
|
||||
<script>
|
||||
<![CDATA[
|
||||
var bookmarksBuilderObserver = {
|
||||
onToggleOpenState: function (aIndex) {
|
||||
dump("*** onToggleOpenState(" + aIndex + ");\n");
|
||||
},
|
||||
|
||||
onCycleHeader: function (aColID, aDOMElement) {
|
||||
dump("*** onCycleHeader(" + aColID + ", " + aDOMElement + ");\n");
|
||||
},
|
||||
|
||||
onCycleCell: function (aIndex, aColID) {
|
||||
dump("*** onCycleCell(" + aIndex + ", " + aColID + ");\n");
|
||||
},
|
||||
|
||||
onSelectionChanged: function () {
|
||||
dump("*** onSelectionChanged\n");
|
||||
},
|
||||
|
||||
isEditable: function (aIndex, aColID) {
|
||||
dump("*** isEditable(" + aIndex + ", " + aColID + ");\n");
|
||||
return aColID == "NameColumn";
|
||||
},
|
||||
|
||||
onSetCellText: function (aIndex, aColID, aValue) {
|
||||
dump("*** onSetCellText(" + aIndex + ", " + aColID + ", " + aValue + ");\n");
|
||||
},
|
||||
|
||||
onPerformAction: function (aAction) {
|
||||
dump("*** onPerformAction(" + aAction + ");\n");
|
||||
},
|
||||
|
||||
onPerformActionOnRow: function (aAction, aIndex) {
|
||||
dump("*** onPerformActionOnRow(" + aAction + ", " + aIndex + ");\n");
|
||||
},
|
||||
|
||||
onPerformActionOnCell: function (aAction, aIndex, aColID) {
|
||||
dump("*** onPerformActionOnCell(" + aAction + ", " + aIndex + ", " + aColID + ");\n");
|
||||
}
|
||||
};
|
||||
|
||||
function Startup()
|
||||
{
|
||||
var tree = document.getElementById("tree");
|
||||
var builder = tree.builder.QueryInterface(Components.interfaces.nsIXULTreeBuilder);
|
||||
builder.addObserver(bookmarksBuilderObserver);
|
||||
}
|
||||
|
||||
function getItemRect(aEvent)
|
||||
{
|
||||
var tree = document.getElementById("tree-proper");
|
||||
var obo = tree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject);
|
||||
var row = { };
|
||||
var col = { };
|
||||
var elt = { };
|
||||
obo.getCellAt(aEvent.clientX, aEvent.clientY, row, col, elt);
|
||||
|
||||
var x = { };
|
||||
var y = { };
|
||||
var w = { };
|
||||
var h = { };
|
||||
var crp = { };
|
||||
obo.getCoordsForCellItem(row.value, col.value, elt.value, x, y, w, h, crp);
|
||||
dump("*** (x,y) = (" + x.value + "," + y.value + "); (w,h) = (" + w.value + "," + h.value + ");\n");
|
||||
}
|
||||
|
||||
const kRDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
|
||||
function createContextMenu (aEvent)
|
||||
{
|
||||
var tree = document.getElementById("tree-proper");
|
||||
var obo = tree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject);
|
||||
var row = { };
|
||||
var col = { };
|
||||
var elt = { };
|
||||
obo.getCellAt(aEvent.clientX, aEvent.clientY, row, col, elt);
|
||||
dump("*** row.value = " + row.value + "\n")
|
||||
|
||||
var treeBody = document.getElementById("tree");
|
||||
var rowResource = treeBody.builder.getResourceAtIndex(row.value);
|
||||
|
||||
const kRDFSvcContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFSvcIID = Components.interfaces.nsIRDFService;
|
||||
const kRDFSvc = Components.classes[kRDFSvcContractID].getService(kRDFSvcIID);
|
||||
var database = treeBody.database;
|
||||
|
||||
const krType = kRDFSvc.GetResource(kRDF_NS + "type");
|
||||
var typeNode = kDatabase.GetTarget(rowResource, krType, true);
|
||||
typeNode = typeNode.QueryInterface(Components.interfaces.nsIRDFResource);
|
||||
dump("*** typeNode = " + typeNode.Value + "\n");
|
||||
aEvent.preventBubble();
|
||||
}
|
||||
]]>
|
||||
</script>
|
||||
|
||||
<popupset id="contextSet">
|
||||
<popup id="bookmarkContextMenu" onpopupshowing="createContextMenu(event);"/>
|
||||
</popupset>
|
||||
|
||||
<toolbox>
|
||||
<toolbar>
|
||||
<button class="button-toolbar-2" label="Foopy Noopy" oncommand="alert('hi');"/>
|
||||
</toolbar>
|
||||
</toolbox>
|
||||
|
||||
<stack>
|
||||
<button label="Foopy Noopy" flex="1"/>
|
||||
<bulletinboard flex="1">
|
||||
<textbox value="NerpNerp" left="10" top="50" onblur="this.setAttribute('hidden','true');"/>
|
||||
</bulletinboard>
|
||||
</stack>
|
||||
|
||||
<tree flex="1" flags="dont-test-empty" id="tree-proper">
|
||||
<treecols>
|
||||
<treecol id="NameColumn"
|
||||
class="treecol-header treecol-inset-header sortDirectionIndicator"
|
||||
flex="1"
|
||||
sort="rdf:http://home.netscape.com/NC-rdf#Name"
|
||||
sortActive="true"
|
||||
label="Name"
|
||||
persist="width hidden sortActive sortDirection"
|
||||
primary="true" />
|
||||
|
||||
<splitter class="tree-splitter"/>
|
||||
|
||||
<treecol id="URLColumn"
|
||||
class="treecol-header treecol-inset-header sortDirectionIndicator"
|
||||
flex="1"
|
||||
sort="rdf:http://home.netscape.com/NC-rdf#URL"
|
||||
label="Location"
|
||||
persist="width hidden sortActive sortDirection" />
|
||||
</treecols>
|
||||
|
||||
<treebody id="tree" datasources="rdf:bookmarks rdf:internetsearch rdf:files" flex="1"
|
||||
onclick="getItemRect(event);" ref="NC:BookmarksRoot">
|
||||
<template>
|
||||
<treerow uri="rdf:*" properties="rdf:http://www.w3.org/1999/02/22-rdf-syntax-ns#type rdf:http://home.netscape.com/NC-rdf#loading">
|
||||
<treecell ref="NameColumn"
|
||||
label="rdf:http://home.netscape.com/NC-rdf#Name" />
|
||||
|
||||
<treecell ref="URLColumn"
|
||||
label="rdf:http://home.netscape.com/NC-rdf#URL" />
|
||||
</treerow>
|
||||
</template>
|
||||
</treebody>
|
||||
</tree>
|
||||
|
||||
</window>
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
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):
|
||||
-->
|
||||
<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
|
||||
%brandDTD;
|
||||
<!ENTITY % prefBookmarkDTD SYSTEM "chrome://communicator/locale/bookmarks/pref-bookmarks.dtd">
|
||||
%prefBookmarkDTD;
|
||||
]>
|
||||
|
||||
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
onload="parent.initPanel('chrome://communicator/content/bookmarks/pref-bookmarks.xul');"
|
||||
headertitle="&lHeader;">
|
||||
|
||||
<script type="application/x-javascript">
|
||||
<![CDATA[
|
||||
var _elementIDs = ["enableAutoFile", "showExtendedData"];
|
||||
|
||||
var gCreateInFolder = "NC:NewBookmarkFolder";
|
||||
function Startup ()
|
||||
{
|
||||
const kDisplay = document.getElementById("defaultFolder");
|
||||
const kRDFSvcContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFSvcIID = Components.interfaces.nsIRDFService;
|
||||
const kRDFSvc = Components.classes[kRDFSvcContractID].getService(kRDFSvcIID);
|
||||
const kBMDS = kRDFSvc.GetDataSource("rdf:bookmarks");
|
||||
const krDefaultFolder = kRDFSvc.GetResource("NC:NewBookmarkFolder");
|
||||
const krType = kRDFSvc.GetResource("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
|
||||
const krFolder = kRDFSvc.GetResource("http://home.netscape.com/NC-rdf#Folder");
|
||||
const isFolder = kBMDS.HasAssertion(krDefaultFolder, krType, krFolder, true);
|
||||
const krNameArc = kRDFSvc.GetResource("http://home.netscape.com/NC-rdf#Name");
|
||||
if (!isFolder) {
|
||||
const krRoot = kRDFSvc.GetResource("NC:BookmarksRoot");
|
||||
gCreateInFolder = "NC:BookmarksRoot";
|
||||
}
|
||||
var rName = kBMDS.GetTarget(isFolder ? krDefaultFolder : krRoot, krNameArc, true);
|
||||
rName = rName.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
kDisplay.value = rName.Value;
|
||||
}
|
||||
|
||||
function chooseDefaultFolder ()
|
||||
{
|
||||
var rv = { selectedFolder: null };
|
||||
openDialog("chrome://communicator/content/bookmarks/addBookmark.xul", "",
|
||||
"centerscreen,chrome,dialog=no,resizable=no",
|
||||
null, null, gCreateInFolder, null, "selectFolder", rv);
|
||||
if (rv && rv.selectedFolder) {
|
||||
const kRDFSvcContractID = "@mozilla.org/rdf/rdf-service;1";
|
||||
const kRDFSvcIID = Components.interfaces.nsIRDFService;
|
||||
const kRDFSvc = Components.classes[kRDFSvcContractID].getService(kRDFSvcIID);
|
||||
const kBMDS = kRDFSvc.GetDataSource("rdf:bookmarks");
|
||||
const krDefaultFolder = kRDFSvc.GetResource(rv.selectedFolder);
|
||||
const krNameArc = kRDFSvc.GetResource("http://home.netscape.com/NC-rdf#Name");
|
||||
rName = kBMDS.GetTarget(krDefaultFolder, krNameArc, true);
|
||||
rName = rName.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
||||
document.getElementById("defaultFolder").value = rName.Value;
|
||||
}
|
||||
|
||||
}
|
||||
]]>
|
||||
</script>
|
||||
|
||||
<groupbox>
|
||||
<caption label="&filingBookmarks.label;"/>
|
||||
<description flex="1">&autoFile.label;</description>
|
||||
<hbox align="center">
|
||||
<checkbox id="enableAutoFile" label="&enableAutoFile.label;"
|
||||
preftype="bool" prefstring="browser.bookmarks.add_without_dialog"
|
||||
prefattribute="checked"/>
|
||||
</hbox>
|
||||
<separator/>
|
||||
<description flex="1">&defaultFolder.label;</description>
|
||||
<hbox align="center">
|
||||
<textbox readonly="true" id="defaultFolder" crop="right" flex="1"/>
|
||||
<button label="&chooseDefaultFolder.label;" accesskey="&chooseDefaultFolder.accesskey;"
|
||||
oncommand="chooseDefaultFolder();"
|
||||
id="browser.bookmarks.choosefolder" preftype="bool"
|
||||
prefstring="pref.browser.homepage.disable_button.choose_folder" prefattribute="disabled"/>
|
||||
</hbox>
|
||||
</groupbox>
|
||||
|
||||
<groupbox>
|
||||
<caption label="&extendedDataViews.label;"/>
|
||||
<vbox align="start">
|
||||
<description>&extendedDataExplanation.label;</description>
|
||||
<checkbox id="showExtendedData" label="&showExtendedData.label;"
|
||||
accesskey="&showExtendedData.accesskey;"
|
||||
preftype="bool" prefstring="browser.bookmarks.show_extended_data"
|
||||
prefattribute="checked"/>
|
||||
</vbox>
|
||||
</groupbox>
|
||||
|
||||
|
||||
</page>
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = appcomps
|
||||
LIBRARY_NAME = bookmarks_s
|
||||
REQUIRES = xpcom \
|
||||
string \
|
||||
rdf \
|
||||
appshell \
|
||||
widget \
|
||||
necko \
|
||||
nkcache \
|
||||
uconv \
|
||||
pref \
|
||||
dom \
|
||||
intl \
|
||||
webshell \
|
||||
windowwatcher \
|
||||
unicharutil \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = nsBookmarksService.cpp
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a
|
||||
# static lib.
|
||||
FORCE_STATIC_LIB = 1
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
#!nmake
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..\..\..
|
||||
MODULE=bookmarks
|
||||
REQUIRES = xpcom \
|
||||
string \
|
||||
rdf \
|
||||
appshell \
|
||||
widget \
|
||||
necko \
|
||||
nkcache \
|
||||
uconv \
|
||||
pref \
|
||||
dom \
|
||||
intl \
|
||||
webshell \
|
||||
windowwatcher \
|
||||
unicharutil \
|
||||
$(NULL)
|
||||
|
||||
CPP_OBJS= \
|
||||
.\$(OBJDIR)\nsBookmarksService.obj \
|
||||
$(NULL)
|
||||
|
||||
LIBRARY_NAME=bookmarks_s
|
||||
|
||||
LCFLAGS = \
|
||||
$(LCFLAGS) \
|
||||
$(DEFINES) \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
libs:: $(LIBRARY)
|
||||
$(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib
|
||||
|
||||
clobber::
|
||||
rm -f $(DIST)\lib\$(LIBRARY_NAME).lib
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,258 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef bookmarksservice___h___
|
||||
#define bookmarksservice___h___
|
||||
|
||||
#include "nsIRDFDataSource.h"
|
||||
#include "nsIRDFRemoteDataSource.h"
|
||||
#include "nsIStreamListener.h"
|
||||
#include "nsIRDFObserver.h"
|
||||
#include "nsISupportsArray.h"
|
||||
#include "nsIStringBundle.h"
|
||||
#include "nsITimer.h"
|
||||
#include "nsIRDFNode.h"
|
||||
#include "nsIBookmarksService.h"
|
||||
#include "nsString.h"
|
||||
#include "nsIFileSpec.h"
|
||||
#include "nsIObserver.h"
|
||||
#include "nsWeakReference.h"
|
||||
#include "nsIIOService.h"
|
||||
#include "nsICacheService.h"
|
||||
#include "nsICacheSession.h"
|
||||
#include "nsILocalFile.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef XP_MAC
|
||||
#include <Timer.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
class nsBookmarksService : public nsIBookmarksService,
|
||||
public nsIRDFDataSource,
|
||||
public nsIRDFRemoteDataSource,
|
||||
public nsIStreamListener,
|
||||
public nsIRDFObserver,
|
||||
public nsIObserver,
|
||||
public nsSupportsWeakReference
|
||||
{
|
||||
protected:
|
||||
nsIRDFDataSource* mInner;
|
||||
nsCOMPtr<nsIRDFResource> busyResource;
|
||||
nsCOMPtr<nsISupportsArray> mObservers;
|
||||
nsCOMPtr<nsIStringBundle> mBundle;
|
||||
nsCOMPtr<nsITimer> mTimer;
|
||||
nsCOMPtr<nsIIOService> mNetService;
|
||||
nsCOMPtr<nsICacheService> mCacheService;
|
||||
nsCOMPtr<nsICacheSession> mCacheSession;
|
||||
|
||||
PRUint32 htmlSize;
|
||||
PRInt32 mUpdateBatchNest;
|
||||
nsString mPersonalToolbarName;
|
||||
PRBool mBookmarksAvailable;
|
||||
PRBool mDirty;
|
||||
PRBool mBrowserIcons;
|
||||
PRBool busySchedule;
|
||||
|
||||
// System Bookmark parsing
|
||||
#ifdef XP_WIN
|
||||
// @param aDirectory - Favorites Folder to import from.
|
||||
// @param aParentResource - Folder into which to place imported
|
||||
// Favorites.
|
||||
nsresult ParseFavoritesFolder(nsIFile* aDirectory,
|
||||
nsIRDFResource* aParentResource);
|
||||
#elif XP_MAC
|
||||
PRBool mIEFavoritesAvailable;
|
||||
|
||||
nsresult ReadFavorites();
|
||||
#endif
|
||||
|
||||
#if defined(XP_WIN) || defined(XP_MAC)
|
||||
void HandleSystemBookmarks(nsIRDFNode* aNode);
|
||||
#endif
|
||||
|
||||
static void FireTimer(nsITimer* aTimer, void* aClosure);
|
||||
nsresult ExamineBookmarkSchedule(nsIRDFResource *theBookmark, PRBool & examineFlag);
|
||||
nsresult GetBookmarkToPing(nsIRDFResource **theBookmark);
|
||||
|
||||
nsresult GetBookmarksFile(nsFileSpec* aResult);
|
||||
nsresult WriteBookmarks(nsFileSpec *bookmarksFile, nsIRDFDataSource *ds, nsIRDFResource *root);
|
||||
nsresult WriteBookmarksContainer(nsIRDFDataSource *ds, nsOutputFileStream& strm, nsIRDFResource *container, PRInt32 level, nsISupportsArray *parentArray);
|
||||
nsresult GetTextForNode(nsIRDFNode* aNode, nsString& aResult);
|
||||
nsresult GetSynthesizedType(nsIRDFResource *aNode, nsIRDFNode **aType);
|
||||
nsresult UpdateBookmarkLastModifiedDate(nsIRDFResource *aSource);
|
||||
nsresult WriteBookmarkProperties(nsIRDFDataSource *ds, nsOutputFileStream& strm, nsIRDFResource *node,
|
||||
nsIRDFResource *property, const char *htmlAttrib, PRBool isFirst);
|
||||
PRBool CanAccept(nsIRDFResource* aSource, nsIRDFResource* aProperty, nsIRDFNode* aTarget);
|
||||
|
||||
nsresult getArgumentN(nsISupportsArray *arguments, nsIRDFResource *res, PRInt32 offset, nsIRDFNode **argValue);
|
||||
nsresult insertBookmarkItem(nsIRDFResource *src, nsISupportsArray *aArguments, nsIRDFResource *objType);
|
||||
nsresult deleteBookmarkItem(nsIRDFResource *src, nsISupportsArray *aArguments, PRInt32 parentArgIndex, nsIRDFResource *objType);
|
||||
nsresult setFolderHint(nsIRDFResource *src, nsIRDFResource *objType);
|
||||
nsresult getFolderViaHint(nsIRDFResource *src, PRBool fallbackFlag, nsIRDFResource **folder);
|
||||
nsresult importBookmarks(nsISupportsArray *aArguments);
|
||||
nsresult exportBookmarks(nsISupportsArray *aArguments);
|
||||
nsresult ProcessCachedBookmarkIcon(nsIRDFResource* aSource, const PRUnichar *iconURL, nsIRDFNode** aTarget);
|
||||
nsresult getResourceFromLiteralNode(nsIRDFNode *node, nsIRDFResource **res);
|
||||
void AnnotateBookmarkSchedule(nsIRDFResource* aSource, PRBool scheduleFlag);
|
||||
nsresult IsBookmarkedInternal(nsIRDFResource *bookmark, PRBool *isBookmarkedFlag);
|
||||
|
||||
nsresult ChangeURL(nsIRDFResource* aOldURL,
|
||||
nsIRDFResource* aNewURL);
|
||||
|
||||
nsresult getLocaleString(const char *key, nsString &str);
|
||||
|
||||
nsresult CreateFolderWithDetails(const PRUnichar* aName,
|
||||
nsIRDFResource* aParentFolder, PRInt32 aIndex,
|
||||
nsIRDFResource** aResult, PRBool aIsGroup);
|
||||
|
||||
nsresult LoadBookmarks();
|
||||
nsresult initDatasource();
|
||||
|
||||
// nsIStreamObserver methods:
|
||||
NS_DECL_NSIREQUESTOBSERVER
|
||||
|
||||
// nsIStreamListener methods:
|
||||
NS_DECL_NSISTREAMLISTENER
|
||||
|
||||
// nsIObserver methods:
|
||||
NS_DECL_NSIOBSERVER
|
||||
|
||||
public:
|
||||
nsBookmarksService();
|
||||
virtual ~nsBookmarksService();
|
||||
nsresult Init();
|
||||
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsIBookmarksService
|
||||
NS_DECL_NSIBOOKMARKSSERVICE
|
||||
|
||||
// nsIRDFDataSource
|
||||
NS_IMETHOD GetURI(char* *uri);
|
||||
|
||||
NS_IMETHOD GetSource(nsIRDFResource* property,
|
||||
nsIRDFNode* target,
|
||||
PRBool tv,
|
||||
nsIRDFResource** source) {
|
||||
return mInner->GetSource(property, target, tv, source);
|
||||
}
|
||||
|
||||
NS_IMETHOD GetSources(nsIRDFResource* property,
|
||||
nsIRDFNode* target,
|
||||
PRBool tv,
|
||||
nsISimpleEnumerator** sources) {
|
||||
return mInner->GetSources(property, target, tv, sources);
|
||||
}
|
||||
|
||||
NS_IMETHOD GetTarget(nsIRDFResource* source,
|
||||
nsIRDFResource* property,
|
||||
PRBool tv,
|
||||
nsIRDFNode** target);
|
||||
|
||||
NS_IMETHOD GetTargets(nsIRDFResource* source,
|
||||
nsIRDFResource* property,
|
||||
PRBool tv,
|
||||
nsISimpleEnumerator** targets) {
|
||||
return mInner->GetTargets(source, property, tv, targets);
|
||||
}
|
||||
|
||||
NS_IMETHOD Assert(nsIRDFResource* aSource,
|
||||
nsIRDFResource* aProperty,
|
||||
nsIRDFNode* aTarget,
|
||||
PRBool aTruthValue);
|
||||
|
||||
NS_IMETHOD Unassert(nsIRDFResource* aSource,
|
||||
nsIRDFResource* aProperty,
|
||||
nsIRDFNode* aTarget);
|
||||
|
||||
NS_IMETHOD Change(nsIRDFResource* aSource,
|
||||
nsIRDFResource* aProperty,
|
||||
nsIRDFNode* aOldTarget,
|
||||
nsIRDFNode* aNewTarget);
|
||||
|
||||
NS_IMETHOD Move(nsIRDFResource* aOldSource,
|
||||
nsIRDFResource* aNewSource,
|
||||
nsIRDFResource* aProperty,
|
||||
nsIRDFNode* aTarget);
|
||||
|
||||
NS_IMETHOD HasAssertion(nsIRDFResource* source,
|
||||
nsIRDFResource* property,
|
||||
nsIRDFNode* target,
|
||||
PRBool tv,
|
||||
PRBool* hasAssertion);
|
||||
|
||||
NS_IMETHOD AddObserver(nsIRDFObserver* aObserver);
|
||||
NS_IMETHOD RemoveObserver(nsIRDFObserver* aObserver);
|
||||
|
||||
NS_IMETHOD HasArcIn(nsIRDFNode *aNode, nsIRDFResource *aArc, PRBool *_retval);
|
||||
NS_IMETHOD HasArcOut(nsIRDFResource *aSource, nsIRDFResource *aArc, PRBool *_retval);
|
||||
|
||||
NS_IMETHOD ArcLabelsIn(nsIRDFNode* node,
|
||||
nsISimpleEnumerator** labels) {
|
||||
return mInner->ArcLabelsIn(node, labels);
|
||||
}
|
||||
|
||||
NS_IMETHOD ArcLabelsOut(nsIRDFResource* source,
|
||||
nsISimpleEnumerator** labels);
|
||||
|
||||
NS_IMETHOD GetAllResources(nsISimpleEnumerator** aResult);
|
||||
|
||||
NS_IMETHOD GetAllCommands(nsIRDFResource* source,
|
||||
nsIEnumerator/*<nsIRDFResource>*/** commands);
|
||||
|
||||
NS_IMETHOD GetAllCmds(nsIRDFResource* source,
|
||||
nsISimpleEnumerator/*<nsIRDFResource>*/** commands);
|
||||
|
||||
NS_IMETHOD IsCommandEnabled(nsISupportsArray/*<nsIRDFResource>*/* aSources,
|
||||
nsIRDFResource* aCommand,
|
||||
nsISupportsArray/*<nsIRDFResource>*/* aArguments,
|
||||
PRBool* aResult);
|
||||
|
||||
NS_IMETHOD DoCommand(nsISupportsArray/*<nsIRDFResource>*/* aSources,
|
||||
nsIRDFResource* aCommand,
|
||||
nsISupportsArray/*<nsIRDFResource>*/* aArguments);
|
||||
|
||||
// nsIRDFRemoteDataSource
|
||||
NS_DECL_NSIRDFREMOTEDATASOURCE
|
||||
|
||||
// nsIRDFObserver
|
||||
NS_DECL_NSIRDFOBSERVER
|
||||
};
|
||||
|
||||
#endif // bookmarksservice___h___
|
||||
@@ -1,121 +0,0 @@
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = appcomps
|
||||
LIBRARY_NAME = appcomps
|
||||
EXPORT_LIBRARY = 1
|
||||
IS_COMPONENT = 1
|
||||
MODULE_NAME = application
|
||||
REQUIRES = xpcom \
|
||||
string \
|
||||
content \
|
||||
rdf \
|
||||
necko \
|
||||
necko2 \
|
||||
nkcache \
|
||||
intl \
|
||||
locale \
|
||||
mork \
|
||||
widget \
|
||||
dom \
|
||||
downloadmanager \
|
||||
alerts\
|
||||
uriloader \
|
||||
mimetype \
|
||||
webbrowserpersist \
|
||||
progressDlg \
|
||||
pref \
|
||||
docshell \
|
||||
webshell \
|
||||
appshell \
|
||||
history \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = nsModule.cpp
|
||||
|
||||
ifdef MOZ_LDAP_XPCOM
|
||||
REQUIRES += mozldap
|
||||
DEFINES += -DMOZ_LDAP_XPCOM
|
||||
endif
|
||||
|
||||
ifdef MOZ_PERF_METRICS
|
||||
EXTRA_DSO_LIBS += mozutil_s
|
||||
endif
|
||||
|
||||
SHARED_LIBRARY_LIBS = \
|
||||
$(DIST)/lib/$(LIB_PREFIX)autocomplete_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)bookmarks_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)directory_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)downloadmanager_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)history_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)appcompintl_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)related_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)search_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)urlbarhistory_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)timebomb_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)windowds_s.$(LIB_SUFFIX) \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES = \
|
||||
-I$(srcdir)/../autocomplete/src \
|
||||
-I$(srcdir)/../bookmarks/src \
|
||||
-I$(srcdir)/../directory \
|
||||
-I$(srcdir)/../download-manager/src \
|
||||
-I$(srcdir)/../history/src \
|
||||
-I$(srcdir)/../related/src \
|
||||
-I$(srcdir)/../search/src \
|
||||
-I$(srcdir)/../timebomb \
|
||||
-I$(srcdir)/../urlbarhistory/src \
|
||||
-I$(srcdir)/../windowds \
|
||||
$(NULL)
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
DEFINES += -DWIN32_LEAN_AND_MEAN
|
||||
SHARED_LIBRARY_LIBS += \
|
||||
$(DIST)/lib/$(LIB_PREFIX)urlwidgt_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)winhooks_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)alerts_s.$(LIB_SUFFIX) \
|
||||
$(NULL)
|
||||
OS_LIBS += ole32.lib shell32.lib
|
||||
LOCAL_INCLUDES += \
|
||||
-I$(srcdir)/../urlwidget \
|
||||
-I$(srcdir)/../winhooks \
|
||||
-I$(srcdir)/../alerts/src \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
EXTRA_DSO_LDOPTS = \
|
||||
$(MOZ_COMPONENT_LIBS) \
|
||||
$(EXTRA_DSO_LIBS) \
|
||||
$(MOZ_UNICHARUTIL_LIBS) \
|
||||
$(MOZ_JS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
#!gmake
|
||||
#
|
||||
# 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.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=appcomps
|
||||
LIBRARY_NAME=appcomps
|
||||
MODULE_NAME=application
|
||||
REQUIRES = xpcom \
|
||||
string \
|
||||
rdf \
|
||||
necko \
|
||||
necko2 \
|
||||
nkcache \
|
||||
intl \
|
||||
locale \
|
||||
mork \
|
||||
widget \
|
||||
dom \
|
||||
pref \
|
||||
docshell \
|
||||
downloadmanager \
|
||||
webshell \
|
||||
timebomb \
|
||||
bookmarks \
|
||||
content \
|
||||
history \
|
||||
search \
|
||||
alerts \
|
||||
progressDlg \
|
||||
related \
|
||||
urlbarhistory \
|
||||
uriloader \
|
||||
mimetype \
|
||||
mozldap \
|
||||
webbrowserpersist \
|
||||
appshell \
|
||||
$(NULL)
|
||||
|
||||
LCFLAGS = -DWIN32_LEAN_AND_MEAN
|
||||
|
||||
!if !defined(DISABLE_LDAP)
|
||||
LCFLAGS = $(LCFLAGS) -DMOZ_LDAP_XPCOM
|
||||
!endif
|
||||
|
||||
CPP_OBJS= \
|
||||
.\$(OBJDIR)\nsModule.obj \
|
||||
$(NULL)
|
||||
|
||||
SUB_LIBRARIES= \
|
||||
$(DIST)\lib\autocomplete_s.lib \
|
||||
$(DIST)\lib\bookmarks_s.lib \
|
||||
$(DIST)\lib\directory_s.lib \
|
||||
$(DIST)\lib\downloadmanager_s.lib \
|
||||
$(DIST)\lib\history_s.lib \
|
||||
$(DIST)\lib\appcompintl_s.lib \
|
||||
$(DIST)\lib\related_s.lib \
|
||||
$(DIST)\lib\search_s.lib \
|
||||
$(DIST)\lib\alerts_s.lib \
|
||||
$(DIST)\lib\timebomb_s.lib \
|
||||
$(DIST)\lib\urlbarhistory_s.lib \
|
||||
$(DIST)\lib\urlwidgt_s.lib \
|
||||
$(DIST)\lib\windowds_s.lib \
|
||||
$(DIST)\lib\winhooks_s.lib \
|
||||
$(NULL)
|
||||
|
||||
WIN_LIBS = \
|
||||
ole32.lib \
|
||||
shell32.lib \
|
||||
$(NULL)
|
||||
|
||||
LLIBS= \
|
||||
$(DIST)\lib\js3250.lib \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(DIST)\lib\unicharutil_s.lib \
|
||||
$(LIBNSPR) \
|
||||
$(NULL)
|
||||
|
||||
INCS = $(INCS) \
|
||||
-I$(DEPTH)\xpfe\components\autocomplete\src \
|
||||
-I$(DEPTH)\xpfe\components\bookmarks\src \
|
||||
-I$(DEPTH)\xpfe\components\directory \
|
||||
-I$(DEPTH)\xpfe\components\download-manager\src \
|
||||
-I$(DEPTH)\xpfe\components\history\src \
|
||||
-I$(DEPTH)\xpfe\components\related\src \
|
||||
-I$(DEPTH)\xpfe\components\search\src \
|
||||
-I$(DEPTH)\xpfe\components\timebomb \
|
||||
-I$(DEPTH)\xpfe\components\urlbarhistory\src \
|
||||
-I$(DEPTH)\xpfe\components\urlwidget \
|
||||
-I$(DEPTH)\xpfe\components\windowds \
|
||||
-I$(DEPTH)\xpfe\components\winhooks \
|
||||
-I$(DEPTH)\xpfe\components\alerts\src \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
@@ -1,207 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#include "nsIGenericFactory.h"
|
||||
#include "nsICategoryManager.h"
|
||||
#include "nsAutoComplete.h"
|
||||
#include "nsBookmarksService.h"
|
||||
#include "nsDirectoryViewer.h"
|
||||
#include "nsDownloadManager.h"
|
||||
#include "nsDownloadProxy.h"
|
||||
#include "nsGlobalHistory.h"
|
||||
#include "rdf.h"
|
||||
#include "nsTimeBomb.h"
|
||||
#include "nsLocalSearchService.h"
|
||||
#include "nsInternetSearchService.h"
|
||||
#include "nsRelatedLinksHandlerImpl.h"
|
||||
#include "nsUrlbarHistory.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "nsCharsetMenu.h"
|
||||
#include "nsFontPackageHandler.h"
|
||||
#include "nsWindowDataSource.h"
|
||||
#if defined(XP_WIN)
|
||||
#include "nsAlertsService.h"
|
||||
#include "nsUrlWidget.h"
|
||||
#include "nsWindowsHooks.h"
|
||||
#endif // Windows
|
||||
#if defined(MOZ_LDAP_XPCOM)
|
||||
#include "nsLDAPAutoCompleteSession.h"
|
||||
#endif
|
||||
|
||||
// Factory constructors
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAutoCompleteItem)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAutoCompleteResults)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsBookmarksService, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsHTTPIndex, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDirectoryViewerFactory)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsDownloadManager, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDownloadProxy)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGlobalHistory, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(LocalSearchDataSource, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(InternetSearchDataSource, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(RelatedLinksHandlerImpl, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimeBomb)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUrlbarHistory)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsFontPackageHandler)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsWindowDataSource, Init)
|
||||
#if defined(XP_WIN)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAlertsService)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsUrlWidget, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindowsHooks)
|
||||
#endif // Windows
|
||||
#if defined(MOZ_LDAP_XPCOM)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsLDAPAutoCompleteSession)
|
||||
#endif
|
||||
|
||||
static NS_METHOD
|
||||
RegisterProc(nsIComponentManager *aCompMgr,
|
||||
nsIFile *aPath,
|
||||
const char *registryLocation,
|
||||
const char *componentType,
|
||||
const nsModuleComponentInfo *info)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsICategoryManager> catman = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
// add the MIME types layotu can handle to the handlers category.
|
||||
// this allows users of layout's viewers (the docshell for example)
|
||||
// to query the types of viewers layout can create.
|
||||
nsXPIDLCString previous;
|
||||
rv = catman->AddCategoryEntry("Gecko-Content-Viewers", "application/http-index-format",
|
||||
NS_DOCUMENT_LOADER_FACTORY_CONTRACTID_PREFIX "view;1?type=application/http-index-format",
|
||||
PR_TRUE,
|
||||
PR_TRUE,
|
||||
getter_Copies(previous));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = catman->AddCategoryEntry("Gecko-Content-Viewers", "application/http-index-format; x-view-type=view-source",
|
||||
NS_DOCUMENT_LOADER_FACTORY_CONTRACTID_PREFIX "view;1?type=application/http-index-format; x-view-type=view-source",
|
||||
PR_TRUE,
|
||||
PR_TRUE,
|
||||
getter_Copies(previous));
|
||||
|
||||
return rv;
|
||||
}
|
||||
static NS_METHOD
|
||||
UnregisterProc(nsIComponentManager *aCompMgr,
|
||||
nsIFile *aPath,
|
||||
const char *registryLocation,
|
||||
const nsModuleComponentInfo *info)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsICategoryManager> catman = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = catman->DeleteCategoryEntry("Gecko-Content-Viewers",
|
||||
"application/http-index-format", PR_TRUE);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = catman->DeleteCategoryEntry("Gecko-Content-Viewers",
|
||||
"application/http-index-format; x-view-type=view-source", PR_TRUE);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static const nsModuleComponentInfo components[] = {
|
||||
{ "AutoComplete Search Results", NS_AUTOCOMPLETERESULTS_CID, NS_AUTOCOMPLETERESULTS_CONTRACTID,
|
||||
nsAutoCompleteResultsConstructor},
|
||||
{ "AutoComplete Search Item", NS_AUTOCOMPLETEITEM_CID, NS_AUTOCOMPLETEITEM_CONTRACTID,
|
||||
nsAutoCompleteItemConstructor},
|
||||
{ "Bookmarks", NS_BOOKMARKS_SERVICE_CID, NS_BOOKMARKS_SERVICE_CONTRACTID,
|
||||
nsBookmarksServiceConstructor },
|
||||
{ "Bookmarks", NS_BOOKMARKS_SERVICE_CID, NS_BOOKMARKS_DATASOURCE_CONTRACTID,
|
||||
nsBookmarksServiceConstructor },
|
||||
{ "Directory Viewer", NS_DIRECTORYVIEWERFACTORY_CID,
|
||||
NS_DOCUMENT_LOADER_FACTORY_CONTRACTID_PREFIX "view;1?type=application/http-index-format",
|
||||
nsDirectoryViewerFactoryConstructor, RegisterProc, UnregisterProc },
|
||||
{ "Directory Viewer", NS_DIRECTORYVIEWERFACTORY_CID,
|
||||
NS_DOCUMENT_LOADER_FACTORY_CONTRACTID_PREFIX "view;1?type=application/http-index-format; x-view-type=view-source",
|
||||
nsDirectoryViewerFactoryConstructor }, // Let the standard type do the registration
|
||||
{ "Directory Viewer", NS_HTTPINDEX_SERVICE_CID, NS_HTTPINDEX_SERVICE_CONTRACTID,
|
||||
nsHTTPIndexConstructor },
|
||||
{ "Directory Viewer", NS_HTTPINDEX_SERVICE_CID, NS_HTTPINDEX_DATASOURCE_CONTRACTID,
|
||||
nsHTTPIndexConstructor },
|
||||
{ "Download Manager", NS_DOWNLOADMANAGER_CID, NS_DOWNLOADMANAGER_CONTRACTID,
|
||||
nsDownloadManagerConstructor },
|
||||
{ "Download", NS_DOWNLOAD_CID, NS_DOWNLOAD_CONTRACTID,
|
||||
nsDownloadProxyConstructor },
|
||||
{ "Global History", NS_GLOBALHISTORY_CID, NS_GLOBALHISTORY_CONTRACTID,
|
||||
nsGlobalHistoryConstructor },
|
||||
{ "Global History", NS_GLOBALHISTORY_CID, NS_GLOBALHISTORY_DATASOURCE_CONTRACTID,
|
||||
nsGlobalHistoryConstructor },
|
||||
{ "Global History", NS_GLOBALHISTORY_CID, NS_GLOBALHISTORY_AUTOCOMPLETE_CONTRACTID,
|
||||
nsGlobalHistoryConstructor },
|
||||
{ "Local Search", NS_RDFFINDDATASOURCE_CID,
|
||||
NS_LOCALSEARCH_SERVICE_CONTRACTID, LocalSearchDataSourceConstructor },
|
||||
{ "Local Search", NS_RDFFINDDATASOURCE_CID,
|
||||
NS_LOCALSEARCH_DATASOURCE_CONTRACTID, LocalSearchDataSourceConstructor },
|
||||
{ "Internet Search", NS_RDFSEARCHDATASOURCE_CID,
|
||||
NS_INTERNETSEARCH_SERVICE_CONTRACTID, InternetSearchDataSourceConstructor },
|
||||
{ "Internet Search", NS_RDFSEARCHDATASOURCE_CID,
|
||||
NS_INTERNETSEARCH_DATASOURCE_CONTRACTID, InternetSearchDataSourceConstructor },
|
||||
{ "Related Links Handler", NS_RELATEDLINKSHANDLER_CID, NS_RELATEDLINKSHANDLER_CONTRACTID,
|
||||
RelatedLinksHandlerImplConstructor},
|
||||
{ "Netscape TimeBomb", NS_TIMEBOMB_CID, NS_TIMEBOMB_CONTRACTID, nsTimeBombConstructor},
|
||||
{ "nsUrlbarHistory", NS_URLBARHISTORY_CID,
|
||||
NS_URLBARHISTORY_CONTRACTID, nsUrlbarHistoryConstructor },
|
||||
{ "nsUrlbarHistory", NS_URLBARHISTORY_CID,
|
||||
NS_URLBARAUTOCOMPLETE_CONTRACTID, nsUrlbarHistoryConstructor },
|
||||
{ "nsCharsetMenu", NS_CHARSETMENU_CID,
|
||||
NS_RDF_DATASOURCE_CONTRACTID_PREFIX NS_CHARSETMENU_PID,
|
||||
NS_NewCharsetMenu },
|
||||
{ "nsFontPackageHandler", NS_FONTPACKAGEHANDLER_CID,
|
||||
"@mozilla.org/locale/default-font-package-handler;1",
|
||||
nsFontPackageHandlerConstructor },
|
||||
{ "nsWindowDataSource",
|
||||
NS_WINDOWDATASOURCE_CID,
|
||||
NS_RDF_DATASOURCE_CONTRACTID_PREFIX "window-mediator",
|
||||
nsWindowDataSourceConstructor },
|
||||
#if defined(XP_WIN)
|
||||
{ NS_IURLWIDGET_CLASSNAME, NS_IURLWIDGET_CID, NS_IURLWIDGET_CONTRACTID,
|
||||
nsUrlWidgetConstructor },
|
||||
{ "nsAlertsService", NS_ALERTSSERVICE_CID, NS_ALERTSERVICE_CONTRACTID, nsAlertsServiceConstructor},
|
||||
{ NS_IWINDOWSHOOKS_CLASSNAME, NS_IWINDOWSHOOKS_CID, NS_IWINDOWSHOOKS_CONTRACTID,
|
||||
nsWindowsHooksConstructor },
|
||||
#endif // Windows
|
||||
#if defined(MOZ_LDAP_XPCOM)
|
||||
{ "LDAP Autocomplete Session", NS_LDAPAUTOCOMPLETESESSION_CID,
|
||||
"@mozilla.org/autocompleteSession;1?type=ldap",
|
||||
nsLDAPAutoCompleteSessionConstructor },
|
||||
#endif
|
||||
};
|
||||
|
||||
NS_IMPL_NSGETMODULE(application, components)
|
||||
@@ -1,256 +0,0 @@
|
||||
?StartAssignment@?$nsMdbPtr@VnsIMdbThumb@@@@QAEPAPAVnsIMdbThumb@@XZ ; 18413
|
||||
??1?$nsMdbPtr@VnsIMdbRow@@@@QAE@XZ ; 18363
|
||||
?assign_assuming_AddRef@nsCOMPtr_base@@IAEXPAVnsISupports@@@Z ; 12166
|
||||
?ExamineBookmarkSchedule@nsBookmarksService@@IAEIPAVnsIRDFResource@@AAH@Z ; 10780
|
||||
?HasAssertion@nsBookmarksService@@UAGIPAVnsIRDFResource@@0PAVnsIRDFNode@@HPAH@Z ; 10016
|
||||
?HasAssertion@LocalSearchDataSource@@UAGIPAVnsIRDFResource@@0PAVnsIRDFNode@@HPAH@Z ; 9886
|
||||
?OpenDB@nsGlobalHistory@@IAEIXZ ; 9142
|
||||
?FindRow@nsGlobalHistory@@IAEIIPBDPAPAVnsIMdbRow@@@Z ; 9142
|
||||
?IsVisited@nsGlobalHistory@@UAGIPBDPAH@Z ; 8972
|
||||
?HasAssertion@InternetSearchDataSource@@UAGIPAVnsIRDFResource@@0PAVnsIRDFNode@@HPAH@Z ; 8845
|
||||
?WriteBookmarkProperties@nsBookmarksService@@IAEIPAVnsIRDFDataSource@@AAVnsOutputFileStream@@PAVnsIRDFResource@@2PBDH@Z ; 2484
|
||||
?HasAssertion@nsHTTPIndex@@UAGIPAVnsIRDFResource@@0PAVnsIRDFNode@@HPAH@Z ; 2326
|
||||
?AddRef@nsBookmarksService@@UAGKXZ ; 1466
|
||||
?Release@nsBookmarksService@@UAGKXZ ; 1459
|
||||
?isSearchURI@InternetSearchDataSource@@IAEHPAVnsIRDFResource@@@Z ; 1154
|
||||
?isSearchCategoryURI@InternetSearchDataSource@@IAEHPAVnsIRDFResource@@@Z ; 923
|
||||
?isSearchCategoryEngineURI@InternetSearchDataSource@@IAEHPAVnsIRDFResource@@@Z ; 921
|
||||
?OnAssert@nsBookmarksService@@UAGIPAVnsIRDFDataSource@@PAVnsIRDFResource@@1PAVnsIRDFNode@@@Z ; 911
|
||||
?isEngineURI@InternetSearchDataSource@@IAEHPAVnsIRDFResource@@@Z ; 686
|
||||
?GetTextForNode@nsBookmarksService@@IAEIPAVnsIRDFNode@@AAVnsString@@@Z ; 618
|
||||
?GetData@InternetSearchDataSource@@IAEIPBGPBDI1AAVnsString@@@Z ; 589
|
||||
?NotifyAssert@nsGlobalHistory@@IAEIPAVnsIRDFResource@@0PAVnsIRDFNode@@@Z ; 570
|
||||
?updateAtom@BookmarkParser@@IAEIPAVnsIRDFDataSource@@PAVnsIRDFResource@@1PAVnsIRDFNode@@PAH@Z ; 536
|
||||
?GetHostIndex@nsUrlbarHistory@@MAGIPBGPAH@Z ; 505
|
||||
?GetTarget@InternetSearchDataSource@@UAGIPAVnsIRDFResource@@0HPAPAVnsIRDFNode@@@Z ; 437
|
||||
?isSearchCommand@InternetSearchDataSource@@IAEHPAVnsIRDFResource@@@Z ; 437
|
||||
?QueryInterface@nsBookmarksService@@UAGIABUnsID@@PAPAX@Z ; 371
|
||||
?GetFindUriPrefix@nsGlobalHistory@@IAEXABUsearchQuery@@HAAVnsACString@@@Z ; 324
|
||||
?GetSources@nsBookmarksService@@UAGIPAVnsIRDFResource@@PAVnsIRDFNode@@HPAPAVnsISimpleEnumerator@@@Z ; 291
|
||||
?QueryInterface@InternetSearchDataSource@@UAGIABUnsID@@PAPAX@Z ; 262
|
||||
?ParseDate@BookmarkParser@@KAIPAVnsIRDFResource@@AAVnsString@@PAPAVnsIRDFNode@@@Z ; 256
|
||||
?AddRef@nsAutoCompleteResults@@UAGKXZ ; 249
|
||||
?HasArcOut@InternetSearchDataSource@@UAGIPAVnsIRDFResource@@0PAH@Z ; 248
|
||||
?FindData@InternetSearchDataSource@@IAEIPAVnsIRDFResource@@PAPAVnsIRDFLiteral@@@Z ; 247
|
||||
?GetTargets@InternetSearchDataSource@@UAGIPAVnsIRDFResource@@0HPAPAVnsISimpleEnumerator@@@Z ; 237
|
||||
?AddRef@InternetSearchDataSource@@UAGKXZ ; 234
|
||||
?GetTargets@LocalSearchDataSource@@UAGIPAVnsIRDFResource@@0HPAPAVnsISimpleEnumerator@@@Z ; 230
|
||||
?GetTargets@nsHTTPIndex@@UAGIPAVnsIRDFResource@@0HPAPAVnsISimpleEnumerator@@@Z ; 230
|
||||
?GetTargets@nsBookmarksService@@UAGIPAVnsIRDFResource@@0HPAPAVnsISimpleEnumerator@@@Z ; 230
|
||||
?Release@InternetSearchDataSource@@UAGKXZ ; 228
|
||||
?Release@nsAutoCompleteItem@@UAGKXZ ; 225
|
||||
?ArcLabelsIn@nsBookmarksService@@UAGIPAVnsIRDFNode@@PAPAVnsISimpleEnumerator@@@Z ; 181
|
||||
?ParseLiteral@BookmarkParser@@KAIPAVnsIRDFResource@@AAVnsString@@PAPAVnsIRDFNode@@@Z ; 167
|
||||
?GetTarget@nsHTTPIndex@@UAGIPAVnsIRDFResource@@0HPAPAVnsIRDFNode@@@Z ; 165
|
||||
??1searchTerm@@QAE@XZ ; 162
|
||||
??0searchTerm@@QAE@PBDI0I0I0I@Z ; 162
|
||||
?GetNow@nsGlobalHistory@@IAE_JXZ ; 162
|
||||
?getEOL@BookmarkParser@@IAEHPBDHH@Z ; 153
|
||||
?isWellknownContainerURI@nsHTTPIndex@@IAEHPAVnsIRDFResource@@@Z ; 153
|
||||
?GetDestination@nsHTTPIndex@@IAEPADPAVnsIRDFResource@@@Z ; 153
|
||||
?ProcessLine@BookmarkParser@@QAEIPAVnsIRDFContainer@@PAVnsIRDFResource@@AAV?$nsCOMPtr@VnsIRDFResource@@@@ABVnsString@@AAV5@AAH5@Z ; 152
|
||||
?DecodeBuffer@BookmarkParser@@QAEIAAVnsString@@PADI@Z ; 152
|
||||
?AddRef@nsGlobalHistory@@UAGKXZ ; 132
|
||||
?SetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IAB_J@Z ; 131
|
||||
?Release@nsGlobalHistory@@UAGKXZ ; 128
|
||||
?HasArcOut@nsBookmarksService@@UAGIPAVnsIRDFResource@@0PAH@Z ; 124
|
||||
?HasArcOut@nsHTTPIndex@@UAGIPAVnsIRDFResource@@0PAH@Z ; 122
|
||||
?HasArcOut@LocalSearchDataSource@@UAGIPAVnsIRDFResource@@0PAH@Z ; 122
|
||||
?QueryInterface@nsAutoCompleteItem@@UAGIABUnsID@@PAPAX@Z ; 118
|
||||
?OnUnassert@nsBookmarksService@@UAGIPAVnsIRDFDataSource@@PAVnsIRDFResource@@1PAVnsIRDFNode@@@Z ; 115
|
||||
?ParseResource@BookmarkParser@@KAIPAVnsIRDFResource@@AAVnsString@@PAPAVnsIRDFNode@@@Z ; 114
|
||||
?ParseBookmarkInfo@BookmarkParser@@IAEIPAUBookmarkField@1@HABVnsString@@ABV?$nsCOMPtr@VnsIRDFContainer@@@@PAVnsIRDFResource@@AAV?$nsCOMPtr@VnsIRDFResource@@@@@Z ; 114
|
||||
?Unescape@RelatedLinksStreamListener@@QAEIAAVnsString@@@Z ; 114
|
||||
?GetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IPA_J@Z ; 112
|
||||
?FireTimer@nsBookmarksService@@KAXPAVnsITimer@@PAX@Z ; 110
|
||||
?GetBookmarkToPing@nsBookmarksService@@IAEIPAPAVnsIRDFResource@@@Z ; 110
|
||||
?QueryInterface@nsGlobalHistory@@UAGIABUnsID@@PAPAX@Z ; 105
|
||||
?SetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IPBD@Z ; 100
|
||||
?ParseHeaderEnd@BookmarkParser@@IAEIABVnsString@@@Z ; 96
|
||||
?GetLastCharset@nsBookmarksService@@UAGIPBDPAPAG@Z ; 91
|
||||
?SetPageTitle@nsGlobalHistory@@UAGIPBDPBG@Z ; 89
|
||||
?GetItems@nsAutoCompleteResults@@UAGIPAPAVnsISupportsArray@@@Z ; 89
|
||||
?GetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IAAVnsAString@@@Z ; 87
|
||||
?SetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IPBG@Z ; 87
|
||||
?NotifyChange@nsGlobalHistory@@IAEIPAVnsIRDFResource@@0PAVnsIRDFNode@@1@Z ; 84
|
||||
?GetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IAAVnsACString@@@Z ; 82
|
||||
?AddPage@nsGlobalHistory@@UAGIPBD@Z ; 81
|
||||
?AddPageToDatabase@nsGlobalHistory@@IAEIPBD_J@Z ; 81
|
||||
?SaveLastPageVisited@nsGlobalHistory@@IAEIPBD@Z ; 81
|
||||
?do_GetService@@YA?BVnsGetServiceByCID@@ABUnsID@@PAI@Z ; 81
|
||||
?NotifyFindAssertions@nsGlobalHistory@@IAEIPAVnsIRDFResource@@PAVnsIMdbRow@@@Z ; 81
|
||||
?SetDirty@nsGlobalHistory@@IAEIXZ ; 81
|
||||
?GetTarget@nsBookmarksService@@UAGIPAVnsIRDFResource@@0HPAPAVnsIRDFNode@@@Z ; 78
|
||||
?QueryInterface@nsAutoCompleteResults@@UAGIABUnsID@@PAPAX@Z ; 76
|
||||
?Release@InternetSearchContext@@UAGKXZ ; 62
|
||||
?AddRef@InternetSearchContext@@UAGKXZ ; 62
|
||||
?GetValue@nsAutoCompleteItem@@UAGIPAPAG@Z ; 58
|
||||
?updateAtom@InternetSearchDataSource@@IAEIPAVnsIRDFDataSource@@PAVnsIRDFResource@@1PAVnsIRDFNode@@PAH@Z ; 58
|
||||
?SetURLToHiddenControl@nsUrlWidget@@UAGIPBDPAVnsIDOMWindowInternal@@@Z ; 50
|
||||
?FindInternetSearchResults@InternetSearchDataSource@@UAGIPBDPAH@Z ; 50
|
||||
?UpdateBookmarkLastVisitedDate@nsBookmarksService@@UAGIPBDPBG@Z ; 50
|
||||
?AddNewPageToDatabase@nsGlobalHistory@@IAEIPBD_JPAPAVnsIMdbRow@@@Z ; 50
|
||||
?do_GetIOService@@YA?BVnsGetServiceByCID@@PAI@Z ; 48
|
||||
?NS_NewURI@@YAIPAPAVnsIURI@@PBDPAV1@PAVnsIIOService@@@Z ; 48
|
||||
?ArcLabelsOut@nsBookmarksService@@UAGIPAVnsIRDFResource@@PAPAVnsISimpleEnumerator@@@Z ; 45
|
||||
?QueryInterface@InternetSearchContext@@UAGIABUnsID@@PAPAX@Z ; 44
|
||||
?ArcLabelsOut@nsHTTPIndex@@UAGIPAVnsIRDFResource@@PAPAVnsISimpleEnumerator@@@Z ; 43
|
||||
??_GnsArrayEnumerator@@UAEPAXI@Z ; 43
|
||||
?ArcLabelsOut@InternetSearchDataSource@@UAGIPAVnsIRDFResource@@PAPAVnsISimpleEnumerator@@@Z ; 43
|
||||
?ArcLabelsOut@LocalSearchDataSource@@UAGIPAVnsIRDFResource@@PAPAVnsISimpleEnumerator@@@Z ; 43
|
||||
?isSearchResultFiltered@InternetSearchDataSource@@IAEHABVnsString@@@Z ; 42
|
||||
?ConvertEntities@InternetSearchDataSource@@IAEIAAVnsString@@HHH@Z ; 42
|
||||
?OnDataAvailable@InternetSearchDataSource@@UAGIPAVnsIRequest@@PAVnsISupports@@PAVnsIInputStream@@II@Z ; 38
|
||||
?GetUnicodeDecoder@InternetSearchContext@@UAGIPAPAVnsIUnicodeDecoder@@@Z ; 38
|
||||
?AppendUnicodeBytes@InternetSearchContext@@UAGIPBGH@Z ; 37
|
||||
?GetDefaultItemIndex@nsAutoCompleteResults@@UAGIPAH@Z ; 36
|
||||
?AddRef@nsUrlbarHistory@@UAGKXZ ; 32
|
||||
?SetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IH@Z ; 31
|
||||
?GetRowValue@nsGlobalHistory@@IAEIPAVnsIMdbRow@@IPAH@Z ; 31
|
||||
?AddExistingPageToDatabase@nsGlobalHistory@@IAEIPAVnsIMdbRow@@_JPA_JPAH@Z ; 31
|
||||
?WriteBookmarksContainer@nsBookmarksService@@IAEIPAVnsIRDFDataSource@@AAVnsOutputFileStream@@PAVnsIRDFResource@@HPAVnsISupportsArray@@@Z ; 30
|
||||
?GetSearchEngineToPing@InternetSearchDataSource@@IAEIPAPAVnsIRDFResource@@AAVnsCString@@@Z ; 28
|
||||
?FireTimer@InternetSearchDataSource@@KAXPAVnsITimer@@PAX@Z ; 28
|
||||
?Flush@nsGlobalHistory@@UAGIXZ ; 26
|
||||
?SetValue@nsAutoCompleteItem@@UAGIPBG@Z ; 26
|
||||
?Commit@nsGlobalHistory@@IAEIW4eCommitType@1@@Z ; 26
|
||||
?Sync@nsGlobalHistory@@IAEXXZ ; 25
|
||||
?fireSyncTimer@nsGlobalHistory@@KAXPAVnsITimer@@PAX@Z ; 25
|
||||
??1RegistryEntry@@QAE@XZ ; 24
|
||||
??_EnsString@@UAEPAXI@Z ; 20
|
||||
?SetDefaultItemIndex@nsAutoCompleteResults@@UAGIH@Z ; 17
|
||||
?OnChange@nsBookmarksService@@UAGIPAVnsIRDFDataSource@@PAVnsIRDFResource@@1PAVnsIRDFNode@@2@Z ; 16
|
||||
?Release@nsUrlbarHistory@@UAGKXZ ; 16
|
||||
?Refresh@nsBookmarksService@@UAGIH@Z ; 16
|
||||
?Parse@BookmarkParser@@QAEIPAVnsIRDFResource@@0@Z ; 15
|
||||
??1nsAutoCompleteItem@@UAE@XZ ; 15
|
||||
??_EnsAutoCompleteItem@@UAEPAXI@Z ; 15
|
||||
??0nsAutoCompleteItem@@QAE@XZ ; 15
|
||||
?currentSetting@RegistryEntry@@QBE?AVnsCString@@XZ ; 13
|
||||
??BBoolRegistryEntry@@QAEPAXXZ ; 13
|
||||
??0RegistryEntry@@QAE@PAUHKEY__@@PBD11@Z ; 13
|
||||
?valueNameArg@RegistryEntry@@QBEPBDXZ ; 13
|
||||
??0nsAutoCompleteResults@@QAE@XZ ; 12
|
||||
??1nsAutoCompleteResults@@UAE@XZ ; 12
|
||||
?AddRef@nsHTTPIndex@@UAGKXZ ; 12
|
||||
?QueryInterface@nsUrlbarHistory@@UAGIABUnsID@@PAPAX@Z ; 12
|
||||
??_EnsAutoCompleteResults@@UAEPAXI@Z ; 12
|
||||
?GetTarget@LocalSearchDataSource@@UAGIPAVnsIRDFResource@@0HPAPAVnsIRDFNode@@@Z ; 12
|
||||
??0ProtocolRegistryEntry@@QAE@PBD@Z ; 11
|
||||
?Release@LocalSearchDataSource@@UAGKXZ ; 10
|
||||
?Release@nsWindowsHooks@@UAGKXZ ; 10
|
||||
?Release@nsUrlWidget@@UAGKXZ ; 10
|
||||
?QueryInterface@nsUrlWidget@@UAGIABUnsID@@PAPAX@Z ; 10
|
||||
?QueryInterface@nsWindowsHooks@@UAGIABUnsID@@PAPAX@Z ; 10
|
||||
?CheckItemAvailability@nsUrlbarHistory@@MAGIPBGPAVnsIAutoCompleteResults@@PAH@Z ; 9
|
||||
?AddObserver@InternetSearchDataSource@@UAGIPAVnsIRDFObserver@@@Z ; 8
|
||||
?SetParam@nsAutoCompleteItem@@UAGIPAVnsISupports@@@Z ; 8
|
||||
?Release@nsHTTPIndex@@UAGKXZ ; 8
|
||||
?NS_GetSpecialDirectory@@YAIPBDPAPAVnsIFile@@@Z ; 8
|
||||
?SaveEngineInfoIntoGraph@InternetSearchDataSource@@IAEIPAVnsIFile@@0PBG1H@Z ; 7
|
||||
?GetContextType@InternetSearchContext@@UAGIPAI@Z ; 6
|
||||
?MapEncoding@InternetSearchDataSource@@IAEIABVnsString@@AAV2@@Z ; 6
|
||||
??0InternetSearchContext@@QAE@IPAVnsIRDFResource@@0PAVnsIUnicodeDecoder@@PBG@Z ; 6
|
||||
??1InternetSearchContext@@UAE@XZ ; 6
|
||||
?OnStopRequest@InternetSearchDataSource@@UAGIPAVnsIRequest@@PAVnsISupports@@IPBG@Z ; 6
|
||||
?AddObserver@LocalSearchDataSource@@UAGIPAVnsIRDFObserver@@@Z ; 6
|
||||
?AddObserver@nsBookmarksService@@UAGIPAVnsIRDFObserver@@@Z ; 6
|
||||
?updateDataHintsInGraph@InternetSearchDataSource@@IAEIPAVnsIRDFResource@@PBG@Z ; 6
|
||||
??_EInternetSearchContext@@UAEPAXI@Z ; 6
|
||||
?ReadFileContents@InternetSearchDataSource@@IAEIABVnsFileSpec@@AAVnsString@@@Z ; 6
|
||||
?NS_OpenURI@@YAIPAPAVnsIChannel@@PAVnsIURI@@PAVnsIIOService@@PAVnsILoadGroup@@PAVnsIInterfaceRequestor@@I@Z ; 6
|
||||
??1FileTypeRegistryEntry@@QAE@XZ ; 6
|
||||
?NS_NewInternetSearchContext@@YAIIPAVnsIRDFResource@@0PAVnsIUnicodeDecoder@@PBGPAPAVnsIInternetSearchContext@@@Z ; 6
|
||||
?OnStartLookup@nsUrlbarHistory@@UAGIPBGPAVnsIAutoCompleteResults@@PAVnsIAutoCompleteListener@@@Z ; 5
|
||||
?VerifyAndCreateEntry@nsUrlbarHistory@@MAGIPBGPAGPAVnsIAutoCompleteResults@@@Z ; 5
|
||||
?GetBufferConst@InternetSearchContext@@UAGIPAPBG@Z ; 5
|
||||
?SearchCache@nsUrlbarHistory@@MAGIPBGPAVnsIAutoCompleteResults@@@Z ; 5
|
||||
?OnStartRequest@InternetSearchDataSource@@UAGIPAVnsIRequest@@PAVnsISupports@@@Z ; 4
|
||||
?Truncate@InternetSearchContext@@UAGIXZ ; 4
|
||||
?GetEngine@InternetSearchContext@@UAGIPAPAVnsIRDFResource@@@Z ; 4
|
||||
?AddObserver@nsHTTPIndex@@UAGIPAVnsIRDFObserver@@@Z ; 4
|
||||
?OnAutoComplete@nsUrlbarHistory@@UAGIPBGPAVnsIAutoCompleteResults@@PAVnsIAutoCompleteListener@@@Z ; 3
|
||||
?Release@nsTimeBomb@@UAGKXZ ; 3
|
||||
?DoSearch@InternetSearchDataSource@@IAEIPAVnsIRDFResource@@0ABVnsString@@1@Z ; 3
|
||||
?QueryInterface@nsHTTPIndex@@UAGIABUnsID@@PAPAX@Z ; 3
|
||||
?validateEngine@InternetSearchDataSource@@IAEIPAVnsIRDFResource@@@Z ; 3
|
||||
?QueryInterface@LocalSearchDataSource@@UAGIABUnsID@@PAPAX@Z ; 3
|
||||
?ParseHTML@InternetSearchDataSource@@IAEIPAVnsIURI@@PAVnsIRDFResource@@1PBG@Z ; 3
|
||||
?Stop@InternetSearchDataSource@@UAGIXZ ; 3
|
||||
?FindShortcut@nsBookmarksService@@UAGIPBGPAPAD@Z ; 3
|
||||
?GetBookmarksFile@nsBookmarksService@@IAEIPAVnsFileSpec@@@Z ; 3
|
||||
?GetSource@nsBookmarksService@@UAGIPAVnsIRDFResource@@PAVnsIRDFNode@@HPAPAV2@@Z ; 3
|
||||
?GetParent@InternetSearchContext@@UAGIPAPAVnsIRDFResource@@@Z ; 3
|
||||
?GetNumInterpretSections@InternetSearchDataSource@@IAEIPBGAAI@Z ; 3
|
||||
?GetSearchFolder@InternetSearchDataSource@@IAEIPAPAVnsIFile@@@Z ; 3
|
||||
?RememberLastSearchText@InternetSearchDataSource@@UAGIPBG@Z ; 3
|
||||
?ClearResults@InternetSearchDataSource@@UAGIH@Z ; 3
|
||||
?webSearchFinalize@InternetSearchDataSource@@IAEIPAVnsIChannel@@PAVnsIInternetSearchContext@@@Z ; 3
|
||||
?GetInputs@InternetSearchDataSource@@IAEIPBGAAVnsString@@ABV2@1@Z ; 3
|
||||
?Flush@nsBookmarksService@@UAGIXZ ; 2
|
||||
?CheckSettings@nsWindowsHooks@@UAGIPAVnsIDOMWindowInternal@@@Z ; 2
|
||||
?saveContents@InternetSearchDataSource@@IAEIPAVnsIChannel@@PAVnsIInternetSearchContext@@I@Z ; 2
|
||||
?RemoveObserver@InternetSearchDataSource@@UAGIPAVnsIRDFObserver@@@Z ; 2
|
||||
?NS_NewLoadGroup@@YAIPAPAVnsILoadGroup@@PAVnsIStreamObserver@@@Z ; 2
|
||||
?WriteBookmarks@nsBookmarksService@@IAEIPAVnsFileSpec@@PAVnsIRDFDataSource@@PAVnsIRDFResource@@@Z ; 2
|
||||
?getLocaleString@nsBookmarksService@@IAEIPBDAAVnsString@@@Z ; 2
|
||||
?GetBufferLength@InternetSearchContext@@UAGIPAH@Z ; 2
|
||||
??1nsWindowsHooksSettings@@UAE@XZ ; 1
|
||||
??1nsUrlbarHistory@@MAE@XZ ; 1
|
||||
??1nsUrlWidget@@UAE@XZ ; 1
|
||||
?Init@nsTimeBomb@@UAGIXZ ; 1
|
||||
?CreateAnonymousResource@BookmarkParser@@KAIPAV?$nsCOMPtr@VnsIRDFResource@@@@@Z ; 1
|
||||
?GetURI@nsBookmarksService@@UAGIPAPAD@Z ; 1
|
||||
?validateEngineNow@InternetSearchDataSource@@IAEIPAVnsIRDFResource@@@Z ; 1
|
||||
?DeferredInit@InternetSearchDataSource@@QAGIXZ ; 1
|
||||
??_EnsUrlbarHistory@@MAEPAXI@Z ; 1
|
||||
??0nsGlobalHistory@@QAE@XZ ; 1
|
||||
?GetURI@LocalSearchDataSource@@UAGIPAPAD@Z ; 1
|
||||
??0InternetSearchDataSource@@QAE@XZ ; 1
|
||||
?GetSettings@nsWindowsHooks@@MAGIPAPAVnsWindowsHooksSettings@@@Z ; 1
|
||||
?Init@nsBookmarksService@@QAEIXZ ; 1
|
||||
?Init@LocalSearchDataSource@@QAEIXZ ; 1
|
||||
?GetSearchEngineList@InternetSearchDataSource@@IAEIPAVnsIFile@@H@Z ; 1
|
||||
?Release@nsWindowsHooksSettings@@UAGKXZ ; 1
|
||||
?CreateTokens@nsGlobalHistory@@IAEIXZ ; 1
|
||||
??0nsUrlWidget@@QAE@XZ ; 1
|
||||
?AppendBytes@InternetSearchContext@@UAGIPBDH@Z ; 1
|
||||
?GetInt64ForPref@nsTimeBomb@@IAEIPBDPA_J@Z ; 1
|
||||
?Init@nsGlobalHistory@@QAGIXZ ; 1
|
||||
?Init@nsHTTPIndex@@QAEIXZ ; 1
|
||||
?GetFirstLaunch@nsTimeBomb@@UAGIPA_J@Z ; 1
|
||||
??0nsWindowsHooksSettings@@QAE@XZ ; 1
|
||||
??0BookmarkParser@@QAE@XZ ; 1
|
||||
??_EnsWindowsHooksSettings@@UAEPAXI@Z ; 1
|
||||
?GetURI@nsHTTPIndex@@UAGIPAPAD@Z ; 1
|
||||
??_GnsUrlWidget@@UAEPAXI@Z ; 1
|
||||
??_EnsWindowsHooks@@UAEPAXI@Z ; 1
|
||||
?CommonInit@nsHTTPIndex@@IAEIXZ ; 1
|
||||
?GetURI@InternetSearchDataSource@@UAGIPAPAD@Z ; 1
|
||||
??0nsUrlbarHistory@@QAE@XZ ; 1
|
||||
??1BookmarkParser@@QAE@XZ ; 1
|
||||
??1nsTimeBomb@@UAE@XZ ; 1
|
||||
??0nsHTTPIndex@@QAE@XZ ; 1
|
||||
?GetCategoryList@InternetSearchDataSource@@IAEIXZ ; 1
|
||||
??_GnsTimeBomb@@UAEPAXI@Z ; 1
|
||||
?GetCategoryDataSource@InternetSearchDataSource@@UAGIPAPAVnsIRDFDataSource@@@Z ; 1
|
||||
?CheckHostnameEntries@nsGlobalHistory@@IAEIXZ ; 1
|
||||
??0nsTimeBomb@@QAE@XZ ; 1
|
||||
_NSGetModule ; 1
|
||||
??0LocalSearchDataSource@@QAE@XZ ; 1
|
||||
?Init@InternetSearchDataSource@@QAGIXZ ; 1
|
||||
?ParseBookmarkSeparator@BookmarkParser@@IAEIABVnsString@@ABV?$nsCOMPtr@VnsIRDFContainer@@@@@Z ; 1
|
||||
?setFolderHint@BookmarkParser@@IAEIPAVnsIRDFResource@@0@Z ; 1
|
||||
?Init@BookmarkParser@@QAEIPAVnsFileSpec@@PAVnsIRDFDataSource@@ABVnsString@@@Z ; 1
|
||||
??1nsWindowsHooks@@UAE@XZ ; 1
|
||||
?GetEnabled@nsTimeBomb@@UAGIPAH@Z ; 1
|
||||
?QueryInterface@nsTimeBomb@@UAGIABUnsID@@PAPAX@Z ; 1
|
||||
?CheckWithUI@nsTimeBomb@@UAGIPAH@Z ; 1
|
||||
?AddSearchEngine@InternetSearchDataSource@@UAGIPBD0PBG1@Z ; 1
|
||||
?OpenExistingFile@nsGlobalHistory@@IAEIPAVnsIMdbFactory@@PBD@Z ; 1
|
||||
??0nsWindowsHooks@@QAE@XZ ; 1
|
||||
??0nsBookmarksService@@QAE@XZ ; 1
|
||||
?ParseMetaTag@BookmarkParser@@IAEIABVnsString@@PAPAVnsIUnicodeDecoder@@@Z ; 1
|
||||
?GetURI@nsGlobalHistory@@UAGIPAPAD@Z ; 1
|
||||
?ReadBookmarks@nsBookmarksService@@UAGIXZ ; 1
|
||||
?Init@nsUrlWidget@@QAEIXZ ; 1
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
239
mozilla/xpinstall/packager/windows/browser.jst
Normal file
239
mozilla/xpinstall/packager/windows/browser.jst
Normal file
@@ -0,0 +1,239 @@
|
||||
function createShortcuts()
|
||||
{
|
||||
var subkey;
|
||||
var valname;
|
||||
var szStartMenuPrograms;
|
||||
var szStartMenu;
|
||||
var szFolderDesktop;
|
||||
var szFolderQuickLaunch;
|
||||
var szFolderSendTo;
|
||||
var winreg;
|
||||
var fWindows;
|
||||
var fTemp;
|
||||
var fCommunicator;
|
||||
var fileExe;
|
||||
var scExeDesc;
|
||||
var scProfileDesc;
|
||||
var scProfileDescParam;
|
||||
var scFolderName;
|
||||
var fFolderPath;
|
||||
var fFolderPathStr;
|
||||
var is_winnt;
|
||||
var szCurrentVersion;
|
||||
|
||||
winreg = getWinRegistry();
|
||||
fWindows = getFolder("Windows");
|
||||
fCommunicator = getFolder("Communicator");
|
||||
fTemp = fCommunicator + "\\mozilla.exe";
|
||||
fileExe = getFolder("file:///", fTemp);
|
||||
scExeDesc = "Mozilla Seamonkey";
|
||||
scProfileDesc = "Profile Manager";
|
||||
scProfileDescParam = "-ProfileManager";
|
||||
scFolderName = "Mozilla Seamonkey";
|
||||
if(winreg != null)
|
||||
{
|
||||
winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE);
|
||||
subkey = "SOFTWARE\\Mozilla\\Mozilla Seamonkey\\$UserAgent$\\Main";
|
||||
valname = "Program Folder Path";
|
||||
fFolderPathStr = winreg.getValueString(subkey, valname);
|
||||
if((fFolderPathStr == "") || (fFolderPathStr == null))
|
||||
{
|
||||
/* determine if the script is running under NT or not */
|
||||
winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE);
|
||||
subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
|
||||
valname = "CurrentVersion";
|
||||
szCurrentVersion = winreg.getValueString(subkey, valname);
|
||||
logComment("szCurrentVersion: " + szCurrentVersion);
|
||||
if((szCurrentVersion == "") || (szCurrentVersion == null))
|
||||
{
|
||||
is_winnt = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
is_winnt = true;
|
||||
}
|
||||
|
||||
if(is_winnt == false)
|
||||
{
|
||||
logComment("is_winnt is false: " + is_winnt);
|
||||
|
||||
winreg.setRootKey(winreg.HKEY_CURRENT_USER);
|
||||
subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
|
||||
valname = "Programs";
|
||||
szStartMenuPrograms = winreg.getValueString(subkey, valname);
|
||||
valname = "Start Menu";
|
||||
szStartMenu = winreg.getValueString(subkey, valname);
|
||||
valname = "Desktop";
|
||||
szFolderDesktop = winreg.getValueString(subkey, valname);
|
||||
}
|
||||
else
|
||||
{
|
||||
logComment("is_winnt is true: " + is_winnt);
|
||||
|
||||
winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE);
|
||||
subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
|
||||
valname = "Common Programs";
|
||||
szStartMenuPrograms = winreg.getValueString(subkey, valname);
|
||||
valname = "Common Start Menu";
|
||||
szStartMenu = winreg.getValueString(subkey, valname);
|
||||
valname = "Common Desktop";
|
||||
szFolderDesktop = winreg.getValueString(subkey, valname);
|
||||
}
|
||||
|
||||
winreg.setRootKey(winreg.HKEY_CURRENT_USER);
|
||||
subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
|
||||
valname = "SendTo";
|
||||
szFolderSendTo = winreg.getValueString(subkey, valname);
|
||||
|
||||
subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GrpConv\\MapGroups";
|
||||
valname = "Quick Launch";
|
||||
szFolderQuickLaunch = winreg.getValueString(subkey, valname);
|
||||
|
||||
fTemp = szStartMenuPrograms + "\\" + scFolderName;
|
||||
fFolderPath = getFolder("file:///", fTemp);
|
||||
|
||||
logComment("Folder StartMenuPrograms: " + szStartMenuPrograms);
|
||||
logComment("Folder StartMenu: " + szStartMenu);
|
||||
logComment("Folder FolderDesktop: " + szFolderDesktop);
|
||||
logComment("Folder FolderSendTo: " + szFolderSendTo);
|
||||
logComment("Folder FolderQuickLaunch: " + szFolderQuickLaunch);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* convert the path string to a path folder object */
|
||||
fFolderPath = getFolder("file:///", fFolderPathStr);
|
||||
}
|
||||
|
||||
logComment("fileExe: " + fileExe);
|
||||
logComment("fFolderPath: " + fFolderPath);
|
||||
logComment("scExeDesc: " + scExeDesc);
|
||||
logComment("fCommunicator : " + fCommunicator);
|
||||
|
||||
/* explicitly create the fFolderPath even though the windowsShortcut function creates the folder.
|
||||
* This is so that the folder creation gets logged for uninstall to remove it. */
|
||||
File.dirCreate(fFolderPath);
|
||||
|
||||
/* create the shortcuts */
|
||||
File.windowsShortcut(fileExe, fFolderPath, scExeDesc, fCommunicator, "", fileExe, 0);
|
||||
File.windowsShortcut(fileExe, fFolderPath, scProfileDesc, fCommunicator, scProfileDescParam, fileExe, 0);
|
||||
|
||||
/* set the Program Folder Path in the Mozilla key in the Windows Registry */
|
||||
winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE);
|
||||
subkey = "SOFTWARE\\Mozilla";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
valname = "CurrentVersion";
|
||||
subkey = "SOFTWARE\\Mozilla\\Mozilla Seamonkey";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
valname = "CurrentVersion";
|
||||
value = "$UserAgent$";
|
||||
err = winreg.setValueString(subkey, valname, value);
|
||||
|
||||
subkey = "SOFTWARE\\Mozilla\\Mozilla Seamonkey\\$UserAgent$";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
subkey = "SOFTWARE\\Mozilla\\Mozilla Seamonkey\\$UserAgent$\\Main";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
valname = "Program Folder Path";
|
||||
value = fFolderPath;
|
||||
err = winreg.setValueString(subkey, valname, value);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
logComment("winreg is null");
|
||||
}
|
||||
}
|
||||
|
||||
function updateWinReg()
|
||||
{
|
||||
//Notes:
|
||||
// can't use a double backslash before subkey - Windows already puts it in.
|
||||
// subkeys have to exist before values can be put in.
|
||||
var winreg = getWinRegistry();
|
||||
var subkey; //the name of the subkey you are poking around in
|
||||
var valname; // the name of the value you want to look at
|
||||
var value; //the data in the value you want to look at.
|
||||
|
||||
if(winreg != null)
|
||||
{
|
||||
winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE);
|
||||
subkey = "SOFTWARE\\Mozilla";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
subkey = "SOFTWARE\\Mozilla\\Mozilla Seamonkey";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
valname = "CurrentVersion";
|
||||
value = "$UserAgent$";
|
||||
err = winreg.setValueString(subkey, valname, value);
|
||||
|
||||
subkey = "SOFTWARE\\Mozilla\\Mozilla Seamonkey\\$UserAgent$";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
subkey = "SOFTWARE\\Mozilla\\Mozilla Seamonkey\\$UserAgent$\\Main";
|
||||
winreg.createKey(subkey,"");
|
||||
|
||||
valname = "Install Directory";
|
||||
value = fCommunicator;
|
||||
err = winreg.setValueString(subkey, valname, value);
|
||||
|
||||
// set the App Paths key here
|
||||
subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\mozilla.exe";
|
||||
winreg.createKey(subkey,"");
|
||||
valname = "";
|
||||
value = fCommunicator + "\\mozilla.exe";
|
||||
err = winreg.setValueString(subkey, valname, value);
|
||||
|
||||
valname = "Path";
|
||||
value = fCommunicator;
|
||||
err = winreg.setValueString(subkey, valname, value);
|
||||
}
|
||||
}
|
||||
|
||||
// main
|
||||
var srDest;
|
||||
var err;
|
||||
var fCommunicator;
|
||||
var fWindowsSystem;
|
||||
var fileComponentRegStr;
|
||||
var fileComponentReg;
|
||||
|
||||
srDest = $SpaceRequired$:bin;
|
||||
err = startInstall("Mozilla Seamonkey", "Browser", "$Version$");
|
||||
logComment("startInstall: " + err);
|
||||
|
||||
fCommunicator = getFolder("Communicator");
|
||||
fWindowsSystem = getFolder("Win System");
|
||||
logComment("fCommunicator: " + fCommunicator);
|
||||
|
||||
if(verifyDiskSpace(fCommunicator, srDest) == true)
|
||||
{
|
||||
setPackageFolder(fCommunicator);
|
||||
err = addDirectory("",
|
||||
"$Version$",
|
||||
"bin", // dir name in jar to extract
|
||||
fCommunicator, // Where to put this file (Returned from GetFolder)
|
||||
"", // subdir name to create relative to fCommunicator
|
||||
true); // Force Flag
|
||||
logComment("addDirectory() of Program returned: " + err);
|
||||
|
||||
// check return value
|
||||
if(!checkError(err))
|
||||
{
|
||||
fileComponentRegStr = fCommunicator + "\\component.reg";
|
||||
fileComponentReg = getFolder("file:///", fileComponentRegStr);
|
||||
err = fileDelete(fileComponentReg);
|
||||
logComment("fileDelete() returned: " + err);
|
||||
|
||||
updateWinReg();
|
||||
createShortcuts();
|
||||
|
||||
err = finalizeInstall();
|
||||
logComment("finalizeInstall() returned: " + err);
|
||||
}
|
||||
}
|
||||
|
||||
// end main
|
||||
494
mozilla/xpinstall/packager/windows/config.it
Normal file
494
mozilla/xpinstall/packager/windows/config.it
Normal file
@@ -0,0 +1,494 @@
|
||||
[General]
|
||||
; Run Mode values:
|
||||
; Normal - Shows all dialogs. Requires user input.
|
||||
; Auto - Shows some dialogs, but none requiring user input. It will
|
||||
; automatically install the product using default values.
|
||||
; Silent - Show no dialogs at all. It will install product using default
|
||||
; values.
|
||||
Run Mode=Normal
|
||||
|
||||
Product Name=Mozilla Seamonkey
|
||||
|
||||
; Destination Path values:
|
||||
; PROGRAMFILESDIR
|
||||
; WINDISK
|
||||
; WINDIR
|
||||
; WINSYSDIR
|
||||
Path=[PROGRAMFILESDIR]\Mozilla\Seamonkey
|
||||
|
||||
; Program Folder Path values:
|
||||
; COMMON_STARTUP
|
||||
; COMMON_PROGRAMS
|
||||
; COMMON_STARTMENU
|
||||
; COMMON_DESKTOP
|
||||
;
|
||||
; PERSONAL_STARTUP
|
||||
; PERSONAL_PROGRAMS
|
||||
; PERSONAL_STARTMENU
|
||||
; PERSONAL_DESKTOP
|
||||
;
|
||||
; PERSONAL_APPDATA
|
||||
; PERSONAL_CACHE
|
||||
; PERSONAL_COOKIES
|
||||
; PERSONAL_FAVORITES
|
||||
; PERSONAL_FONTS
|
||||
; PERSONAL_HISTORY
|
||||
; PERSONAL_NETHOOD
|
||||
; PERSONAL_PERSONAL
|
||||
; PERSONAL_PRINTHOOD (supported only under Windows NT)
|
||||
; PERSONAL_RECENT
|
||||
; PERSONAL_SENDTO
|
||||
; PERSONAL_TEMPLATES
|
||||
;
|
||||
; PROGRAMFILESDIR
|
||||
; COMMONFILESDIR
|
||||
; MEDIAPATH
|
||||
; CONFIGPATH (supported only under Windows95 and Windows98)
|
||||
; DEVICEPATH
|
||||
Program Folder Name=Mozilla Seamonkey
|
||||
Program Folder Path=[COMMON_PROGRAMS]
|
||||
|
||||
; Default Setup Type values:
|
||||
; Setup Type 0 - first radio button (default)
|
||||
; Setup Type 1 - second radio button
|
||||
; Setup Type 2 - third radio button
|
||||
; Setup Type 3 - fourth radio button (usually the Custom option)
|
||||
Default Setup Type=Setup Type 0
|
||||
|
||||
; Default Font Size is 32
|
||||
; Default Font Color is WHITE (of BLACK and GREEN)
|
||||
; Default Font Shadow is TRUE
|
||||
Setup Title0=Mozilla Seamonkey Pr2 Setup
|
||||
Setup Title0 Font Size=
|
||||
Setup Title0 Font Color=
|
||||
Setup Title0 Font Shadow=TRUE
|
||||
Setup Title1=Build $Version$
|
||||
Setup Title1 Font Size=12
|
||||
Setup Title1 Font Color=BLACK
|
||||
Setup Title1 Font Shadow=FALSE
|
||||
Setup Title2=
|
||||
Setup Title2 Font Size=
|
||||
Setup Title2 Font Color=
|
||||
Setup Title2 Font Shadow=TRUE
|
||||
|
||||
; HKey: valid decryptable setup keys are [Mozilla Seamonkey CurrentVersion]
|
||||
; and [Mozilla Seamonkey CurrentVersion].
|
||||
; Decrypt HKey: there are times when '[' and ']' are valid part of windows registry key names.
|
||||
; Contains Filename: tells setup that the path contains filename needed to be removed before
|
||||
; using it as a path.
|
||||
; Verify Existance: FILE or PATH
|
||||
;
|
||||
[Locate Previous Product Path0]
|
||||
HRoot=HKEY_LOCAL_MACHINE
|
||||
HKey=[Netscape Seamonkey CurrentVersion]\Main
|
||||
Name=Install Directory
|
||||
Decrypt HKey=TRUE
|
||||
Contains Filename=FALSE
|
||||
Verify Existance=
|
||||
|
||||
; This section checks for legacy files.
|
||||
; If the file(s), indicated by the Filename= key, is found to have a version of less than the value
|
||||
; indicated by the Version= key, then display the string in the Message= key.
|
||||
[Legacy Check0]
|
||||
Filename=[SETUP PATH]\mozilla.exe
|
||||
Version=6.0.0.0
|
||||
Message=Setup has detected an old version of Mozilla in the chosen destination directory that may pose compatibility issues. It is highly recommended that a different destination directory be used. Would you like to choose a different directory?
|
||||
|
||||
[Dialog Welcome]
|
||||
Show Dialog=TRUE
|
||||
Title=Welcome
|
||||
Message0=Welcome to %s Setup.
|
||||
Message1=It is strongly recommended that you exit all Windows programs before running this Setup program.
|
||||
Message2=Click Cancel to quit Setup and then close any programs you have running. Click Next to continue the Setup program.
|
||||
|
||||
[Dialog License]
|
||||
Show Dialog=FALSE
|
||||
Title=Software License Agreement
|
||||
License File=license.txt
|
||||
Message0=Please read the following license agreement. Use the scroll bar to view the rest of this agreement.
|
||||
Message1=Click Accept if you accept the terms of the preceeding license agreement. If No is clicked, setup will quit.
|
||||
|
||||
[Dialog Setup Type]
|
||||
Show Dialog=TRUE
|
||||
Title=Setup Type
|
||||
Message0=Click the type of setup you prefer, then click Next.
|
||||
Readme Filename=readme.txt
|
||||
Readme App=notepad.exe
|
||||
|
||||
; at least one Setup Type needs to be set, and up to 4 can be
|
||||
; set (Setup Type0, Setup Type1, Setup Type2, Setup Type3).
|
||||
[Setup Type0]
|
||||
Description Short=B&ase
|
||||
Description Long=Program will be installed with the minimal options.
|
||||
|
||||
; List of components to install/enable for this Setup Type.
|
||||
; All other components not listed here will be disabled if
|
||||
; this Setup Type is selected.
|
||||
C0=Component0
|
||||
C1=Component1
|
||||
|
||||
[Setup Type1]
|
||||
Description Short=C&omplete
|
||||
Description Long=Program will be installed with the most common options.
|
||||
|
||||
; List of components to install/enable for this Setup Type.
|
||||
; All other components not listed here will be disabled if
|
||||
; this Setup Type is selected.
|
||||
C0=Component0
|
||||
C1=Component1
|
||||
C2=Component2
|
||||
|
||||
[Setup Type2]
|
||||
Description Short=C&ustom
|
||||
Description Long=You may choose the options you want to install. Recommended for advanced users only.
|
||||
;Description Short=&Pro
|
||||
;Description Long=Program will be installed with all the options available.
|
||||
|
||||
; List of components to install/enable for this Setup Type.
|
||||
; All other components not listed here will be disabled if
|
||||
; this Setup Type is selected.
|
||||
C0=Component0
|
||||
C1=Component1
|
||||
C2=Component2
|
||||
|
||||
;[Setup Type3]
|
||||
;Description Short=C&ustom
|
||||
;Description Long=You may choose the options you want to install. Recommended for advanced users.
|
||||
|
||||
; List of components to install/enable for this Setup Type.
|
||||
; All other components not listed here will be disabled if
|
||||
; this Setup Type is selected.
|
||||
;C0=Component0
|
||||
;C1=Component1
|
||||
;C2=Component2
|
||||
;C3=Component3
|
||||
|
||||
[Dialog Select Components]
|
||||
Show Dialog=TRUE
|
||||
Title=Select Components
|
||||
Message0=The browser is always installed. Select or clear the additional components you want to install.
|
||||
|
||||
[Dialog Windows Integration]
|
||||
Show Dialog=FALSE
|
||||
Title=Windows Integration
|
||||
Message0=Check the Mozilla Preference options you would like Setup to perform.
|
||||
Message1=These settings allow you to set default Internet preferences for browsing and searching. They affect browsers installed on your machine, including Mozilla Communicator and Microsoft Internet Explorer.
|
||||
|
||||
; Only a maximum of 4 "Windows Integration-Item"s are allowded. Each Item
|
||||
; shows up as a checkbox in the Windows Integration dialog.
|
||||
[Windows Integration-Item0]
|
||||
CheckBoxState=FALSE
|
||||
Description=Make Mozilla Communicator my default Internet browser
|
||||
Archive=
|
||||
|
||||
[Windows Integration-Item1]
|
||||
CheckBoxState=FALSE
|
||||
Description=Make Mozilla Netcenter my home page
|
||||
Archive=
|
||||
|
||||
[Windows Integration-Item2]
|
||||
CheckBoxState=FALSE
|
||||
Description=Use Mozilla Netcenter to search the Web
|
||||
Archive=
|
||||
|
||||
[Dialog Program Folder]
|
||||
Show Dialog=TRUE
|
||||
Title=Select Program Folder
|
||||
Message0=Setup will add program icons to the Program Folder listed below. You may type a new folder name, or select one from the Existing Folder list. Click Install to begin installation.
|
||||
|
||||
[Dialog Site Selector]
|
||||
Show Dialog=FALSE
|
||||
Title=Site Selector
|
||||
Message0=Select the region you wish to download from, or leave it on Default for Setup to automatically determine the best place to download from relative to where you are.
|
||||
|
||||
[Dialog Start Install]
|
||||
Show Dialog=FALSE
|
||||
Title=Start Install
|
||||
Message0=Setup has enough information to start copying the program files. If you want to review or change settings, click Back. If you are satisfied with the current settings, click Install to begin copying files.
|
||||
|
||||
[Dialog Reboot]
|
||||
; Show Dialog values are:
|
||||
; TRUE - Always show
|
||||
; FALSE - Don't show unless at least one component has its reboot show value set
|
||||
; to TRUE. This will not show even if some files were in use and a reboot
|
||||
; is necessary.
|
||||
; AUTO - Don't show unless a component has its reboot show value set to
|
||||
; TRUE or there was at least one file in use and a reboot is
|
||||
; is required for the file to be replaced correctly.
|
||||
Show Dialog=AUTO
|
||||
|
||||
; These SmartDownload sections contain information to configure SmartDownload.
|
||||
; The info is applied to all components to be downloaded.
|
||||
[SmartDownload-Netscape Install]
|
||||
;core_file=base.zip
|
||||
;core_dir=[SETUP PATH]
|
||||
no_ads=true
|
||||
silent=false
|
||||
execution=false
|
||||
confirm_install=false
|
||||
;extract_msg=Uncompressing Seamonkey. Please wait...
|
||||
|
||||
[SmartDownload-Proxy]
|
||||
|
||||
[SmartDownload-Execution]
|
||||
exe=
|
||||
exe_param=
|
||||
|
||||
[Check Instance0]
|
||||
Class Name=NetscapeWindowClass
|
||||
Window Name=
|
||||
Message=Setup has detected that an instance of Seamonkey is currently running. Please quit Seamonkey before continuing Setup.
|
||||
|
||||
[Check Instance1]
|
||||
Process Name=psm.exe
|
||||
Message=Setup has detected that an instance of Personal Security Manager is currently running. Personal Security Manager will quit by itself when there are no other applications running that require it. A reboot might be necessary. Setup will then be able to continue.
|
||||
|
||||
; These are the components to be offered to the user (shown in the Select
|
||||
; Components dialog) for installation.
|
||||
; There is no limit to the number of components to install.
|
||||
[Component0]
|
||||
Description Short=Mozilla Xpinstall Engine
|
||||
Description Long=Install Engine
|
||||
Archive=core.xpi
|
||||
$InstallSize$:core
|
||||
$InstallSizeSystem$
|
||||
$InstallSizeArchive$:core.xpi
|
||||
;Dependency0=
|
||||
Dependee0=Mozilla Seamonkey
|
||||
; Attributes can be the following values:
|
||||
; SELECTED - the component is selected to be installed by default.
|
||||
; INVISIBLE - the component is not shown in the Select Components dialog.
|
||||
Attributes=SELECTED|INVISIBLE
|
||||
; url keys can be as many as needed. url0 is attempted first. if it fails,
|
||||
; the next url key is tried in sequential order.
|
||||
; The url should not contain the filename. Setup will assemble the complete url
|
||||
; using the url keys and the Archive key.
|
||||
Domain0=$Domain$
|
||||
Server Path0=$ServerPath$
|
||||
|
||||
[Component1]
|
||||
Description Short=Mozilla Seamonkey
|
||||
Description Long=Browser software for the internet
|
||||
Archive=browser.xpi
|
||||
$InstallSize$:browser
|
||||
$InstallSizeSystem$
|
||||
$InstallSizeArchive$:browser.xpi
|
||||
;Dependency0=
|
||||
; Attributes can be the following values:
|
||||
; SELECTED - the component is selected to be installed by default.
|
||||
; INVISIBLE - the component is not shown in the Select Components dialog.
|
||||
Attributes=SELECTED|DISABLED
|
||||
; url keys can be as many as needed. url0 is attempted first. if it fails,
|
||||
; the next url key is tried in sequential order.
|
||||
; The url should not contain the filename. Setup will assemble the complete url
|
||||
; using the url keys and the Archive key.
|
||||
Domain0=$Domain$
|
||||
Server Path0=$ServerPath$
|
||||
;url0=$URLPath$
|
||||
|
||||
[Component2]
|
||||
Description Short=Mail & News
|
||||
Description Long=Seamonkey Mail && News
|
||||
Archive=mail.xpi
|
||||
$InstallSize$:mail
|
||||
$InstallSizeSystem$
|
||||
$InstallSizeArchive$:mail.xpi
|
||||
;Dependency0=
|
||||
; Attributes can be the following values:
|
||||
; SELECTED - the component is selected to be installed by default.
|
||||
; INVISIBLE - the component is not shown in the Select Components dialog.
|
||||
Attributes=SELECTED
|
||||
Parameter=
|
||||
; url keys can be as many as needed. url0 is attempted first. if it fails,
|
||||
; the next url key is tried in sequential order.
|
||||
; The url should not contain the filename. Setup will assemble the complete url
|
||||
; using the url keys and the Archive key.
|
||||
Domain0=$Domain$
|
||||
Server Path0=$ServerPath$
|
||||
;url0=$URLPath$
|
||||
|
||||
[Core]
|
||||
Source=[XPI PATH]\core.xpi
|
||||
Destination=[WIZTEMP]\core.ns
|
||||
$InstallSize$:core
|
||||
Cleanup=TRUE
|
||||
Message=Preparing Install, please wait...
|
||||
|
||||
[Redirect]
|
||||
Status=Enabled
|
||||
url0=$RedirIniUrl$
|
||||
Description=
|
||||
Message=
|
||||
|
||||
; The Timing key needs to be one of the following values:
|
||||
; pre download - process before any files have been downloaded.
|
||||
; post download - process after all files have been downloaded.
|
||||
; pre core - process before the core file has been uncompressed.
|
||||
; post core - process after the core file has been uncompressed.
|
||||
; pre smartupdate - process before the smartupdate engine has been launched.
|
||||
; post smartupdate - process after the smartupdate engine has been launched.
|
||||
; pre launchapp - process before the launching of executables.
|
||||
; post launchapp - process after the launching of executables.
|
||||
; depend reboot - process depending on if a reboot is necessary or not.
|
||||
; if reboot is necessary, installer can set it up so
|
||||
; the app runs once upon windows reboot.
|
||||
|
||||
;Uncompress FileX sections
|
||||
;[Uncompress File0]
|
||||
;Timing=post download
|
||||
;Source=[XPI PATH]\core.xpi
|
||||
;Destination=[SETUP PATH]
|
||||
;Message=Configuring Seamonkey, please wait...
|
||||
|
||||
;[Uncompress File1]
|
||||
;Timing=post download
|
||||
;Source=[XPI PATH]\extratest.xpi
|
||||
;Destination=[SETUP PATH]
|
||||
;Message=Configuring Extra test files, please wait...
|
||||
|
||||
;Move FileX sections
|
||||
;[Move File0]
|
||||
;Timing=post download
|
||||
;Source=[SETUP PATH]\bin\*
|
||||
;Destination=[SETUP PATH]\program
|
||||
|
||||
;[Move File1]
|
||||
;Timing=post download
|
||||
;Source=[SETUP PATH]\ftmain\*
|
||||
;Destination=[SETUP PATH]\program
|
||||
|
||||
;Copy FileX sections
|
||||
[Copy File0]
|
||||
Timing=post launchapp
|
||||
Source=[JRE BIN PATH]\npjava*.dll
|
||||
Destination=[SETUP PATH]\Plugins
|
||||
Fail If Exists=FALSE
|
||||
|
||||
;[Copy File1]
|
||||
;Timing=post launchapp
|
||||
;Source=[TEMP]\xtratest\bin\*.*
|
||||
;Destination=[SETUP PATH]
|
||||
;Fail If Exists=FALSE
|
||||
|
||||
;[Copy File1]
|
||||
;Timing=post download
|
||||
;Source=[SETUP PATH]\bin\*.exe
|
||||
;Destination=[TEMP]
|
||||
;Fail If Exists=
|
||||
|
||||
;Create DirectoryX sections
|
||||
[Create Directory0]
|
||||
Timing=post download
|
||||
Destination=[SETUP PATH]\Plugins
|
||||
|
||||
;[Create Directory1]
|
||||
;Timing=post download
|
||||
;Destination=[TEMP]\Test\temp
|
||||
|
||||
;Delete FileX sections
|
||||
[Delete File0]
|
||||
Timing=post download
|
||||
Destination=[COMMON_PROGRAMS]\Mozilla Seamonkey\Mozilla AppRunner.lnk
|
||||
|
||||
;Remove DirectoryX sections
|
||||
;[Remove Directory0]
|
||||
;Timing=post launchapp
|
||||
;Destination=[TEMP]\xtratest
|
||||
;Remove subdirs=TRUE
|
||||
|
||||
;RunAppX sections
|
||||
[RunApp0]
|
||||
Timing=depend reboot
|
||||
Wait=FALSE
|
||||
Target=[SETUP PATH]\mozilla.exe
|
||||
Parameters=-installer
|
||||
WorkingDir=[SETUP PATH]
|
||||
|
||||
[Windows Registry0]
|
||||
Root Key=HKEY_LOCAL_MACHINE
|
||||
Key=Software\Mozilla\Mozilla Seamonkey\$UserAgent$\Main
|
||||
Name=Program Folder Path
|
||||
Name Value=[Default Folder]
|
||||
Type=REG_SZ
|
||||
Decrypt Key=FALSE
|
||||
Decrypt Name=FALSE
|
||||
Decrypt Name Value=TRUE
|
||||
Overwrite Key=TRUE
|
||||
Overwrite Name=TRUE
|
||||
Timing=pre smartupdate
|
||||
|
||||
; Values for Show Folder:
|
||||
; HIDE Hides the window and activates another window.
|
||||
; MAXIMIZE Maximizes the specified window.
|
||||
; MINIMIZE Minimizes the specified window and activates the next
|
||||
; top-level window in the z-order.
|
||||
; RESTORE Activates and displays the window. If the window is
|
||||
; minimized or maximized, Windows restores it to its
|
||||
; original size and position. An application should specify
|
||||
; this flag when restoring a minimized window.
|
||||
; SHOW Activates the window and displays it in its current size
|
||||
; and position.
|
||||
; SHOWMAXIMIZED Activates the window and displays it as a maximized
|
||||
; window.
|
||||
; SHOWMINIMIZED Activates the window and displays it as a minimized
|
||||
; window.
|
||||
; SHOWMINNOACTIVE Displays the window as a minimized window. The active
|
||||
; window remains active.
|
||||
; SHOWNA Displays the window in its current state. The active
|
||||
; window remains active.
|
||||
; SHOWNOACTIVATE Displays a window in its most recent size and position.
|
||||
; The active window remains active.
|
||||
; SHOWNORMAL Activates and displays a window. If the window is
|
||||
; minimized or maximized, Windows restores it to its
|
||||
; original size and position. An application should specify
|
||||
; this flag when displaying the window for the first time.
|
||||
[Program Folder0]
|
||||
Timing=post smartupdate
|
||||
Show Folder=SHOW
|
||||
Program Folder=[Default Folder]
|
||||
|
||||
;[Program Folder0-Shortcut0]
|
||||
;File=[SETUP PATH]\mozilla.exe
|
||||
;Arguments=
|
||||
;Working Dir=[SETUP PATH]
|
||||
;Description=Mozilla Seamonkey
|
||||
;Icon Path=[SETUP PATH]\mozilla.exe
|
||||
;Icon Id=0
|
||||
|
||||
;[Program Folder0-Shortcut1]
|
||||
;File=[SETUP PATH]\mozilla.exe
|
||||
;Arguments=-ProfileManager
|
||||
;Working Dir=[SETUP PATH]
|
||||
;Description=Profile Manager
|
||||
;Icon Path=[SETUP PATH]\mozilla.exe
|
||||
;Icon Id=0
|
||||
|
||||
;[Program Folder0-Shortcut2]
|
||||
;File=[SETUP PATH]\bin\Net2fone.exe
|
||||
;Arguments=
|
||||
;Working Dir=[SETUP PATH]
|
||||
;Description=Net2Fone
|
||||
;Icon Path=[SETUP PATH]\bin\Net2fone.exe
|
||||
;Icon Id=0
|
||||
|
||||
;[Program Folder1]
|
||||
;Timing=post download
|
||||
;Show Folder=SHOW
|
||||
;Program Folder=[Default Folder]\lala land
|
||||
|
||||
;[Program Folder1-Shortcut0]
|
||||
;File=c:\bin\getver.exe
|
||||
;Arguments=
|
||||
;Working Dir=[TEMP]
|
||||
;Description=Getver Test
|
||||
;Icon Path=[WINDISK]\4nt\4nt.exe
|
||||
;Icon Id=0
|
||||
|
||||
;[Program Folder1-Shortcut1]
|
||||
;File=c:\perl\bin\perl.exe
|
||||
;Arguments=
|
||||
;Working Dir=[WINSYS]
|
||||
;Description=Perl
|
||||
;Icon Path=c:\perl\bin\perl.exe
|
||||
;Icon Id=0
|
||||
|
||||
41
mozilla/xpinstall/packager/windows/core.jst
Normal file
41
mozilla/xpinstall/packager/windows/core.jst
Normal file
@@ -0,0 +1,41 @@
|
||||
// main
|
||||
var srDest;
|
||||
var err;
|
||||
var communicatorFolder;
|
||||
var fWindowsSystem;
|
||||
var fileComponentRegStr;
|
||||
var fileComponentReg;
|
||||
|
||||
srDest = $SpaceRequired$:bin;
|
||||
err = startInstall("Mozilla XPCom", "XPCom", "$Version$");
|
||||
logComment("startInstall: " + err);
|
||||
|
||||
communicatorFolder = getFolder("Communicator");
|
||||
fWindowsSystem = getFolder("Win System");
|
||||
logComment("communicatorFolder: " + communicatorFolder);
|
||||
|
||||
if(verifyDiskSpace(communicatorFolder, srDest) == true)
|
||||
{
|
||||
setPackageFolder(communicatorFolder);
|
||||
err = addDirectory("",
|
||||
"$Version$",
|
||||
"bin", // dir name in jar to extract
|
||||
communicatorFolder, // Where to put this file (Returned from GetFolder)
|
||||
"", // subdir name to create relative to communicatorFolder
|
||||
true); // Force Flag
|
||||
logComment("addDirectory() of Program returned: " + err);
|
||||
|
||||
// check return value
|
||||
if(!checkError(err))
|
||||
{
|
||||
fileComponentRegStr = communicatorFolder + "\\component.reg";
|
||||
fileComponentReg = getFolder("file:///", fileComponentRegStr);
|
||||
err = fileDelete(fileComponentReg);
|
||||
logComment("fileDelete() returned: " + err);
|
||||
|
||||
err = finalizeInstall();
|
||||
logComment("finalizeInstall() returned: " + err);
|
||||
}
|
||||
}
|
||||
|
||||
// end main
|
||||
18
mozilla/xpinstall/packager/windows/editor.jst
Normal file
18
mozilla/xpinstall/packager/windows/editor.jst
Normal file
@@ -0,0 +1,18 @@
|
||||
var err = StartInstall("Mozilla Editor", "Seamonkey", "$Version$");
|
||||
LogComment("StartInstall: " + err);
|
||||
|
||||
var communicatorFolder = Install.GetFolder("Communicator");
|
||||
LogComment("communicatorFolder: " + communicatorFolder);
|
||||
|
||||
err = AddDirectory("Program",
|
||||
"$Version$",
|
||||
"bin", // fileName in jar,
|
||||
communicatorFolder, // Where to put this file (Returned from GetFolder)
|
||||
"", // fileName in jar,
|
||||
true); // Force Flag
|
||||
|
||||
LogComment("AddDirectory() returned: " + err);
|
||||
|
||||
err = FinalizeInstall();
|
||||
LogComment("FinalizeInstall() returned: " + err);
|
||||
|
||||
34
mozilla/xpinstall/packager/windows/mail.jst
Normal file
34
mozilla/xpinstall/packager/windows/mail.jst
Normal file
@@ -0,0 +1,34 @@
|
||||
// main
|
||||
var srDest;
|
||||
var err;
|
||||
var communicatorFolder;
|
||||
|
||||
srDest = $SpaceRequired$:bin;
|
||||
err = startInstall("Mozilla Mail", "Mail", "$Version$");
|
||||
logComment("startInstall: " + err);
|
||||
// check return value
|
||||
checkError(err);
|
||||
|
||||
communicatorFolder = getFolder("Communicator");
|
||||
logComment("communicatorFolder: " + communicatorFolder);
|
||||
|
||||
if(verifyDiskSpace(communicatorFolder, srDest) == true)
|
||||
{
|
||||
setPackageFolder(communicatorFolder);
|
||||
err = addDirectory("",
|
||||
"$Version$",
|
||||
"bin", // dir name in jar to extract
|
||||
communicatorFolder, // Where to put this file (Returned from GetFolder)
|
||||
"", // subdir name to create relative to communicatorFolder
|
||||
true); // Force Flag
|
||||
logComment("addDirectory() returned: " + err);
|
||||
|
||||
// check return value
|
||||
if(!checkError(err))
|
||||
{
|
||||
err = finalizeInstall();
|
||||
logComment("finalizeInstall() returned: " + err);
|
||||
}
|
||||
}
|
||||
|
||||
// end main
|
||||
134
mozilla/xpinstall/packager/windows/makeall.pl
Normal file
134
mozilla/xpinstall/packager/windows/makeall.pl
Normal file
@@ -0,0 +1,134 @@
|
||||
#!c:\perl\bin\perl
|
||||
#
|
||||
# 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):
|
||||
# Sean Su <ssu@netscape.com>
|
||||
#
|
||||
|
||||
#
|
||||
# This perl script builds the xpi, config.ini, and js files.
|
||||
#
|
||||
|
||||
# Make sure there are at least four arguments
|
||||
if($#ARGV < 2)
|
||||
{
|
||||
die "usage: $0 <default version> <staging path> <dist install path>
|
||||
|
||||
default version : y2k compliant based date version.
|
||||
ie: 5.0.0.2000040413
|
||||
|
||||
staging path : full path to where the components are staged at
|
||||
|
||||
dist install path : full path to where the dist install dir is at.
|
||||
ie: d:\\builds\\mozilla\\dist\\win32_o.obj\\install
|
||||
\n";
|
||||
}
|
||||
|
||||
$inDefaultVersion = $ARGV[0];
|
||||
$inStagePath = $ARGV[1];
|
||||
$inDistPath = $ARGV[2];
|
||||
|
||||
$inRedirIniUrl = "ftp://not.needed.com/because/the/xpi/files/will/be/located/in/the/same/dir/as/the/installer";
|
||||
$inXpiUrl = "ftp://not.needed.com/because/the/xpi/files/will/be/located/in/the/same/dir/as/the/installer";
|
||||
|
||||
$seiFileNameGeneric = "nsinstall.exe";
|
||||
$seiFileNameSpecific = "mozilla-win32-installer.exe";
|
||||
$userAgent = "5.0b2 (en)";
|
||||
|
||||
# Check for existance of staging path
|
||||
if(!(-e "$inStagePath"))
|
||||
{
|
||||
die "invalid path: $inStagePath\n";
|
||||
}
|
||||
|
||||
# Make sure inDestPath exists
|
||||
if(!(-e "$inDistPath"))
|
||||
{
|
||||
mkdir ("$inDestPath",0775);
|
||||
}
|
||||
|
||||
# Make .js files
|
||||
MakeJsFile("core");
|
||||
MakeJsFile("browser");
|
||||
MakeJsFile("mail");
|
||||
|
||||
# Make .xpi files
|
||||
MakeXpiFile("core");
|
||||
MakeXpiFile("browser");
|
||||
MakeXpiFile("mail");
|
||||
|
||||
MakeConfigFile();
|
||||
|
||||
if(-e "$inDistPath\\setup")
|
||||
{
|
||||
unlink <$inDistPath\\setup\\*>;
|
||||
}
|
||||
else
|
||||
{
|
||||
mkdir ("$inDistPath\\setup",0775);
|
||||
}
|
||||
|
||||
# Copy the setup files to the dist setup directory.
|
||||
system("xcopy /f config.ini $inDistPath\\");
|
||||
system("xcopy /f config.ini $inDistPath\\setup\\");
|
||||
system("xcopy /f $inDistPath\\setup.exe $inDistPath\\setup\\");
|
||||
system("xcopy /f $inDistPath\\setuprsc.dll $inDistPath\\setup\\");
|
||||
|
||||
# build the self-extracting .exe file.
|
||||
print "\nbuilding self-extracting installer ($seiFileNameSpecific)...\n";
|
||||
system("copy $inDistPath\\$seiFileNameGeneric $inDistPath\\$seiFileNameSpecific");
|
||||
system("$inDistPath\\nszip.exe $inDistPath\\$seiFileNameSpecific $inDistPath\\setup\\*.* $inDistPath\\xpi\\*.*");
|
||||
|
||||
print " done!\n";
|
||||
|
||||
# end of script
|
||||
exit(0);
|
||||
|
||||
sub MakeConfigFile
|
||||
{
|
||||
# Make config.ini file
|
||||
if(system("perl makecfgini.pl config.it $inDefaultVersion \"$userAgent\" $inStagePath $inDistPath\\xpi $inRedirIniUrl $inXpiUrl") != 0)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
sub MakeJsFile
|
||||
{
|
||||
my($componentName) = @_;
|
||||
|
||||
# Make .js file
|
||||
if(system("perl makejs.pl $componentName.jst $inDefaultVersion \"$userAgent\" $inStagePath\\$componentName") != 0)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
sub MakeXpiFile
|
||||
{
|
||||
my($componentName) = @_;
|
||||
|
||||
# Make .xpi file
|
||||
if(system("perl makexpi.pl $componentName $inStagePath $inDistPath\\xpi") != 0)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
277
mozilla/xpinstall/packager/windows/makecfgini.pl
Normal file
277
mozilla/xpinstall/packager/windows/makecfgini.pl
Normal file
@@ -0,0 +1,277 @@
|
||||
#!c:\perl\bin\perl
|
||||
#
|
||||
# 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):
|
||||
# Sean Su <ssu@netscape.com>
|
||||
#
|
||||
|
||||
#
|
||||
# This perl script parses the input file for special variables
|
||||
# in the format of $Variable$ and replace it with the appropriate
|
||||
# value(s).
|
||||
#
|
||||
# Input: .it file
|
||||
# - which is a .ini template
|
||||
#
|
||||
# version
|
||||
# - version to display on the blue background
|
||||
#
|
||||
# UserAgent
|
||||
# - user agent to use in the windows registry. should be the same as the one
|
||||
# built into the browser (ie "6.0b2 (en)")
|
||||
#
|
||||
# Path to staging area
|
||||
# - path on where the seamonkey built bits are staged to
|
||||
#
|
||||
# xpi path
|
||||
# - path on where xpi files will be located at
|
||||
#
|
||||
# redirect file url
|
||||
# - url to where the redirect.ini file will be staged at.
|
||||
# Either ftp:// or http:// can be used
|
||||
# ie: ftp://ftp.netscape.com/pub/seamonkey
|
||||
#
|
||||
# xpi url
|
||||
# - url to where the .xpi files will be staged at.
|
||||
# Either ftp:// or http:// can be used
|
||||
# ie: ftp://ftp.netscape.com/pub/seamonkey/xpi
|
||||
#
|
||||
# ie: perl makecfgini.pl config.it 5.0.0.1999120608 "5.0b1 (en)" k:\windows\32bit\5.0 d:\builds\mozilla\dist\win32_o.obj\install\xpi ftp://ftp.netscape.com/pub/seamonkey/windows/32bit/x86/1999-09-13-10-M10 ftp://ftp.netscape.com/pub/seamonkey/windows/32bit/x86/1999-09-13-10-M10/xpi
|
||||
#
|
||||
#
|
||||
|
||||
# Make sure there are at least two arguments
|
||||
if($#ARGV < 6)
|
||||
{
|
||||
die "usage: $0 <.it file> <version> <UserAgent> <staging path> <.xpi path> <redirect file url> <xpi url>
|
||||
|
||||
.it file : input ini template file
|
||||
|
||||
version : version to be shown in setup. Typically the same version
|
||||
as show in mozilla.exe.
|
||||
|
||||
UserAgent : user agent to use in the windows registry. should be the same as the one
|
||||
built into the browser (ie \"6.0b2 (en)\")
|
||||
|
||||
staging path : path to where the components are staged at
|
||||
|
||||
.xpi path : path to where the .xpi files have been built to
|
||||
ie: d:\\builds\\mozilla\\dist\\win32_o.obj\\install\\xpi
|
||||
|
||||
redirect file : url to where the redirect.ini file will be staged at.
|
||||
url Either ftp:// or http:// can be used
|
||||
ie: ftp://ftp.netscape.com/pub/seamonkey
|
||||
xpi url : url to where the .xpi files will be staged at.
|
||||
Either ftp:// or http:// can be used
|
||||
ie: ftp://ftp.netscape.com/pub/seamonkey/xpi
|
||||
\n";
|
||||
}
|
||||
|
||||
$inItFile = $ARGV[0];
|
||||
$inVersion = $ARGV[1];
|
||||
$inUserAgent = $ARGV[2];
|
||||
$inStagePath = $ARGV[3];
|
||||
$inXpiPath = $ARGV[4];
|
||||
$inRedirIniUrl = $ARGV[5];
|
||||
$inUrl = $ARGV[6];
|
||||
|
||||
$inDomain;
|
||||
$inServerPath;
|
||||
|
||||
($inDomain, $inServerPath) = ParseDomainAndPath($inUrl);
|
||||
|
||||
# Get the name of the file replacing the .it extension with a .ini extension
|
||||
@inItFileSplit = split(/\./,$inItFile);
|
||||
$outIniFile = $inItFileSplit[0];
|
||||
$outIniFile .= ".ini";
|
||||
|
||||
# Open the input file
|
||||
open(fpInIt, $inItFile) || die "\ncould not open $ARGV[0]: $!\n";
|
||||
|
||||
# Open the output file
|
||||
open(fpOutIni, ">$outIniFile") || die "\nCould not open $outIniFile: $!\n";
|
||||
|
||||
print "\n Making $outIniFile...\n";
|
||||
|
||||
# While loop to read each line from input file
|
||||
while($line = <fpInIt>)
|
||||
{
|
||||
# For each line read, search and replace $InstallSize$ with the calculated size
|
||||
if($line =~ /\$InstallSize\$/i)
|
||||
{
|
||||
$installSize = 0;
|
||||
$installSizeSystem = 0;
|
||||
|
||||
# split read line by ":" deliminator
|
||||
@colonSplit = split(/:/, $line);
|
||||
if($#colonSplit >= 0)
|
||||
{
|
||||
$componentName = $colonSplit[1];
|
||||
chop($componentName);
|
||||
|
||||
$installSize = OutputInstallSize("$inStagePath\\$componentName");
|
||||
|
||||
# special oji consideration here. Since it's an installer that
|
||||
# seamonkey installer will be calling, the disk space allocation
|
||||
# needs to be adjusted by an expansion factor of 3.62.
|
||||
if($componentName =~ /oji/i)
|
||||
{
|
||||
$installSize = int($installSize * 3.62);
|
||||
}
|
||||
}
|
||||
|
||||
# Read the next line to calculate for the "Install Size System="
|
||||
if($line = <fpInIt>)
|
||||
{
|
||||
if($line =~ /\$InstallSizeSystem\$/i)
|
||||
{
|
||||
$installSizeSystem = OutputInstallSizeSystem($line, "$inStagePath\\$componentName");
|
||||
}
|
||||
}
|
||||
|
||||
$installSize -= $installSizeSystem;
|
||||
print fpOutIni "Install Size=$installSize\n";
|
||||
print fpOutIni "Install Size System=$installSizeSystem\n";
|
||||
}
|
||||
elsif($line =~ /\$InstallSizeArchive\$/i)
|
||||
{
|
||||
$installSizeArchive = 0;
|
||||
|
||||
# split read line by ":" deliminator
|
||||
@colonSplit = split(/:/, $line);
|
||||
if($#colonSplit >= 0)
|
||||
{
|
||||
$componentName = $colonSplit[1];
|
||||
chop($componentName);
|
||||
|
||||
$installSizeArchive = OutputInstallSizeArchive("$inXpiPath\\$componentName");
|
||||
}
|
||||
|
||||
print fpOutIni "Install Size Archive=$installSizeArchive\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
# For each line read, search and replace $Version$ with the version passed in
|
||||
$line =~ s/\$Version\$/$inVersion/i;
|
||||
$line =~ s/\$Domain\$/$inDomain/i;
|
||||
$line =~ s/\$ServerPath\$/$inServerPath/i;
|
||||
$line =~ s/\$RedirIniUrl\$/$inRedirIniUrl/i;
|
||||
$line =~ s/\$UserAgent\$/$inUserAgent/i;
|
||||
print fpOutIni $line;
|
||||
}
|
||||
}
|
||||
|
||||
print " done!\n";
|
||||
|
||||
# end of script
|
||||
exit(0);
|
||||
|
||||
sub ParseDomainAndPath()
|
||||
{
|
||||
my($aUrl) = @_;
|
||||
my($aDomain, $aServerPath);
|
||||
|
||||
@slashSplit = split(/\//, $aUrl);
|
||||
if($#slashSplit >= 0)
|
||||
{
|
||||
for($i = 0; $i <= $#slashSplit; $i++)
|
||||
{
|
||||
if($i <= 2)
|
||||
{
|
||||
if($aDomain eq "")
|
||||
{
|
||||
$aDomain = "$slashSplit[$i]";
|
||||
}
|
||||
else
|
||||
{
|
||||
$aDomain = "$aDomain/$slashSplit[$i]";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if($aServerPath eq "")
|
||||
{
|
||||
$aServerPath = "/$slashSplit[$i]";
|
||||
}
|
||||
else
|
||||
{
|
||||
$aServerPath = "$aServerPath/$slashSplit[$i]";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return($aDomain, $aServerPath);
|
||||
}
|
||||
|
||||
sub OutputInstallSize()
|
||||
{
|
||||
my($inPath) = @_;
|
||||
my($installSize);
|
||||
|
||||
print " calculating size for $inPath\n";
|
||||
$installSize = `ds32.exe /D /L0 /A /S /C 32768 $inPath`;
|
||||
$installSize += 32768; # take into account install.js
|
||||
$installSize = int($installSize / 1024);
|
||||
$installSize += 1;
|
||||
return($installSize);
|
||||
}
|
||||
|
||||
sub OutputInstallSizeArchive()
|
||||
{
|
||||
my($inPath) = @_;
|
||||
my($installSizeArchive);
|
||||
my($dev, $ino, $mode, $nlink, $uid, $gui, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks);
|
||||
|
||||
print " calculating size for $inPath\n";
|
||||
($dev, $ino, $mode, $nlink, $uid, $gui, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat $inPath;
|
||||
$installSizeArchive += 32768; # take into account install.js
|
||||
$installSizeArchive = int($size / 1024);
|
||||
$installSizeArchive += 1;
|
||||
return($installSizeArchive);
|
||||
}
|
||||
|
||||
sub OutputInstallSizeSystem()
|
||||
{
|
||||
my($inLine, $inPath) = @_;
|
||||
my($installSizeSystem) = 0;
|
||||
|
||||
# split read line by ":" deliminator
|
||||
@colonSplit = split(/:/, $inLine);
|
||||
if($#colonSplit >= 0)
|
||||
{
|
||||
# split line by "," deliminator
|
||||
@commaSplit = split(/\,/, $colonSplit[1]);
|
||||
if($#commaSplit >= 0)
|
||||
{
|
||||
foreach(@commaSplit)
|
||||
{
|
||||
# calculate the size of component installed using ds32.exe in Kbytes
|
||||
print " calculating size for $inPath\\$_";
|
||||
$installSizeSystem += `ds32.exe /D /L0 /A /S /C 32768 $inPath\\$_`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$installSizeSystem = int($installSizeSystem / 1024);
|
||||
$installSizeSystem += 1;
|
||||
return($installSizeSystem);
|
||||
}
|
||||
|
||||
122
mozilla/xpinstall/packager/windows/makejs.pl
Normal file
122
mozilla/xpinstall/packager/windows/makejs.pl
Normal file
@@ -0,0 +1,122 @@
|
||||
#!c:\perl\bin\perl
|
||||
#
|
||||
# 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):
|
||||
# Sean Su <ssu@netscape.com>
|
||||
#
|
||||
|
||||
#
|
||||
# This perl script parses the input file for special variables
|
||||
# in the format of $Variable$ and replace it with the appropriate
|
||||
# value(s).
|
||||
#
|
||||
# Input: .jst file - which is a .js template
|
||||
# default version - a julian date in the form of:
|
||||
# major.minor.release.yydoy
|
||||
# ie: 5.0.0.99256
|
||||
# user agent - user agent of product
|
||||
# component staging path - path to where the components are staged at
|
||||
#
|
||||
# ie: perl makejs.pl core.jst 5.0.0.99256
|
||||
#
|
||||
|
||||
# Make sure there are at least two arguments
|
||||
if($#ARGV < 3)
|
||||
{
|
||||
die "usage: $0 <.jst file> <default version> <UserAgent> <staging path>
|
||||
|
||||
.jst file : .js template input file
|
||||
default version : default julian base version number to use in the
|
||||
form of: major.minor.release.yydoy
|
||||
ie: 5.0.0.99256
|
||||
user agent : user agent of product (5.0b1 [en])
|
||||
component staging path : path to where this component is staged at
|
||||
ie: z:\\stage\\windows\\32bit\\en\\5.0\\core
|
||||
\n";
|
||||
}
|
||||
|
||||
$inJstFile = $ARGV[0];
|
||||
$inVersion = $ARGV[1];
|
||||
$inUserAgent = $ARGV[2];
|
||||
$inStagePath = $ARGV[3];
|
||||
|
||||
# Get the name of the file replacing the .jst extension with a .js extension
|
||||
@inJstFileSplit = split(/\./,$inJstFile);
|
||||
$outJsFile = $inJstFileSplit[0];
|
||||
$outJsFile .= ".js";
|
||||
$outTempFile = $inJstFileSplit[0];
|
||||
$outTempFile .= ".template";
|
||||
|
||||
system("copy ..\\common\\share.t $outTempFile");
|
||||
system("cat $inJstFile >> $outTempFile");
|
||||
|
||||
# Open the input .template file
|
||||
open(fpInTemplate, $outTempFile) || die "\ncould not open $outTempFile: $!\n";
|
||||
|
||||
# Open the output .js file
|
||||
open(fpOutJs, ">$outJsFile") || die "\nCould not open $outJsFile: $!\n";
|
||||
|
||||
# While loop to read each line from input file
|
||||
while($line = <fpInTemplate>)
|
||||
{
|
||||
# For each line read, search and replace $Version$ with the version passed in
|
||||
if($line =~ /\$Version\$/i)
|
||||
{
|
||||
$line =~ s/\$Version\$/$inVersion/i;
|
||||
}
|
||||
elsif($line =~ /\$UserAgent\$/i)
|
||||
{
|
||||
$line =~ s/\$UserAgent\$/$inUserAgent/i;
|
||||
}
|
||||
elsif($line =~ /\$SpaceRequired\$/i) # For each line read, search and replace $InstallSize$ with the calculated size
|
||||
{
|
||||
$spaceRequired = 0;
|
||||
|
||||
# split read line by ":" deliminator
|
||||
@colonSplit = split(/:/, $line);
|
||||
if($#colonSplit > 0)
|
||||
{
|
||||
@semiColonSplit = split(/;/, $colonSplit[1]);
|
||||
$subDir = $semiColonSplit[0];
|
||||
$spaceRequired = GetSpaceRequired("$inStagePath\\$subDir");
|
||||
$line =~ s/\$SpaceRequired\$:$subDir/$spaceRequired/i;
|
||||
}
|
||||
else
|
||||
{
|
||||
$spaceRequired = GetSpaceRequired("$inStagePath");
|
||||
$line =~ s/\$SpaceRequired\$/$spaceRequired/i;
|
||||
}
|
||||
}
|
||||
|
||||
print fpOutJs $line;
|
||||
}
|
||||
|
||||
sub GetSpaceRequired()
|
||||
{
|
||||
my($inPath) = @_;
|
||||
my($spaceRequired);
|
||||
|
||||
print " calulating size for $inPath\n";
|
||||
$spaceRequired = `ds32.exe /D /L0 /A /S /C 32768 $inPath`;
|
||||
$spaceRequired = int($spaceRequired / 1024);
|
||||
$spaceRequired += 1;
|
||||
return($spaceRequired);
|
||||
}
|
||||
|
||||
114
mozilla/xpinstall/packager/windows/makexpi.pl
Normal file
114
mozilla/xpinstall/packager/windows/makexpi.pl
Normal file
@@ -0,0 +1,114 @@
|
||||
#!c:\perl\bin\perl
|
||||
#
|
||||
# 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):
|
||||
# Sean Su <ssu@netscape.com>
|
||||
#
|
||||
|
||||
#
|
||||
# This perl script creates .xpi files given component input name
|
||||
#
|
||||
# Input: component name
|
||||
# - name of the component directory located in the staging path
|
||||
# staging path
|
||||
# - path to where the built files are staged at
|
||||
# dest path
|
||||
# - path to where the .xpi files are are to be created at.
|
||||
# ** MUST BE AN ABSOLUTE PATH, NOT A RELATIVE PATH **
|
||||
#
|
||||
# ie: perl makexpi.pl core z:\exposed\windows\32bit\en\5.0 d:\build\mozilla\dist\win32_o.obj\install\working
|
||||
#
|
||||
|
||||
use File::Copy;
|
||||
use Cwd;
|
||||
|
||||
# Make sure there are at least three arguments
|
||||
if($#ARGV < 2)
|
||||
{
|
||||
die "usage: $0 <component name> <staging path> <dest path>
|
||||
|
||||
component name : name of component directory within staging path
|
||||
staging path : path to where the components are staged at
|
||||
dest path : path to where the .xpi files are to be created at
|
||||
\n";
|
||||
}
|
||||
|
||||
$inComponentName = $ARGV[0];
|
||||
$inStagePath = $ARGV[1];
|
||||
$inDestPath = $ARGV[2];
|
||||
|
||||
# check for existance of staging component path
|
||||
if(!(-e "$inStagePath\\$inComponentName"))
|
||||
{
|
||||
die "invalid path: $inStagePath\\$inComponentName\n";
|
||||
}
|
||||
|
||||
# check for existance of .js script
|
||||
if(!(-e "$inComponentName.js"))
|
||||
{
|
||||
die "missing .js script: $inComponentName.js\n";
|
||||
}
|
||||
|
||||
# delete component .xpi file
|
||||
if(-e "$inDestPath\\$inComponentName.xpi")
|
||||
{
|
||||
unlink("$inDestPath\\$inComponentName.xpi");
|
||||
}
|
||||
if(-e "$inStagePath\\$incomponentName\\$inComponentName.xpi")
|
||||
{
|
||||
unlink("$inDestPath\\$inComponentName.xpi");
|
||||
}
|
||||
|
||||
# delete install.js
|
||||
if(-e "install.js")
|
||||
{
|
||||
unlink("install.js");
|
||||
}
|
||||
|
||||
# make sure inDestPath exists
|
||||
if(!(-e "$inDestPath"))
|
||||
{
|
||||
system("mkdir $inDestPath");
|
||||
}
|
||||
|
||||
print "\n Making $inComponentName.xpi...\n";
|
||||
|
||||
$saveCwdir = cwd();
|
||||
|
||||
# change directory to where the files are, else zip will store
|
||||
# unwanted path information.
|
||||
chdir("$inStagePath\\$inComponentName");
|
||||
system("zip -r $inDestPath\\$inComponentName.xpi *");
|
||||
chdir("$saveCwdir");
|
||||
|
||||
copy("$inComponentName.js", "install.js");
|
||||
system("zip -g $inDestPath\\$inComponentName.xpi install.js");
|
||||
|
||||
# delete install.js
|
||||
if(-e "install.js")
|
||||
{
|
||||
unlink("install.js");
|
||||
}
|
||||
|
||||
print " done!\n";
|
||||
|
||||
# end of script
|
||||
exit(0);
|
||||
|
||||
111
mozilla/xpinstall/packager/windows/rdir.pl
Normal file
111
mozilla/xpinstall/packager/windows/rdir.pl
Normal file
@@ -0,0 +1,111 @@
|
||||
#!c:\perl\bin\perl
|
||||
#
|
||||
# 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):
|
||||
# Sean Su <ssu@netscape.com>
|
||||
#
|
||||
|
||||
use Cwd;
|
||||
|
||||
if($#ARGV < 0)
|
||||
{
|
||||
print_usage();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
print "removing directory:\n";
|
||||
for($i = 0; $i <= $#ARGV; $i++)
|
||||
{
|
||||
print " $ARGV[$i]";
|
||||
remove_dir_structure($ARGV[$i]);
|
||||
print "\n";
|
||||
}
|
||||
|
||||
exit(0);
|
||||
# end
|
||||
|
||||
sub remove_dir_structure
|
||||
{
|
||||
my($curr_dir) = @_;
|
||||
$save_cwd = cwd();
|
||||
$save_cwd =~ s/\//\\/g;
|
||||
if((-e "$curr_dir") && (-d "$curr_dir"))
|
||||
{
|
||||
remove_all_dir($curr_dir);
|
||||
chdir($save_cwd);
|
||||
remove_directory($curr_dir);
|
||||
print " done!";
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!(-e "$curr_dir"))
|
||||
{
|
||||
print "\n";
|
||||
print "$curr_dir does not exist!";
|
||||
}
|
||||
elsif(!(-d "$curr_dir"))
|
||||
{
|
||||
print "\n";
|
||||
print "$curr_dir is not a valid directory!";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub remove_all_dir
|
||||
{
|
||||
my($curr_dir) = @_;
|
||||
my(@dirlist);
|
||||
my($dir);
|
||||
|
||||
chdir("$curr_dir");
|
||||
@dirlist = <*>;
|
||||
foreach $dir (@dirlist)
|
||||
{
|
||||
if(-d "$dir")
|
||||
{
|
||||
print ".";
|
||||
remove_all_dir($dir);
|
||||
}
|
||||
}
|
||||
chdir("..");
|
||||
remove_directory($curr_dir);
|
||||
}
|
||||
|
||||
sub remove_directory
|
||||
{
|
||||
my($directory) = @_;
|
||||
my($save_cwd);
|
||||
|
||||
$save_cwd = cwd();
|
||||
$save_cwd =~ s/\//\\/g;
|
||||
|
||||
if(-e "$directory")
|
||||
{
|
||||
chdir($directory);
|
||||
unlink <*>; # remove files
|
||||
chdir($save_cwd);
|
||||
rmdir $directory; # remove directory
|
||||
}
|
||||
}
|
||||
|
||||
sub print_usage
|
||||
{
|
||||
print "usage: $0 <dir1> [dir2 dir3...]\n";
|
||||
}
|
||||
83
mozilla/xpinstall/src/Makefile.in
Normal file
83
mozilla/xpinstall/src/Makefile.in
Normal file
@@ -0,0 +1,83 @@
|
||||
#
|
||||
# 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 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Daniel Veditz <dveditz@netscape.com>
|
||||
# Douglas Turner <dougt@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = xpinstall
|
||||
LIBRARY_NAME = xpinstall
|
||||
SHORT_LIBNAME = xpinstal
|
||||
IS_COMPONENT = 1
|
||||
|
||||
EXTRA_DSO_LIBS = jsdom
|
||||
|
||||
REQUIRES = dom js netlib raptor xpcom
|
||||
|
||||
# XXX shouldn't need to export this
|
||||
EXPORTS = nsXPITriggerInfo.h
|
||||
|
||||
CPPSRCS = \
|
||||
nsInstall.cpp \
|
||||
nsInstallTrigger.cpp \
|
||||
nsInstallVersion.cpp \
|
||||
nsInstallFolder.cpp \
|
||||
nsJSInstall.cpp \
|
||||
nsJSFile.cpp \
|
||||
nsJSInstallTriggerGlobal.cpp \
|
||||
nsJSInstallVersion.cpp \
|
||||
nsSoftwareUpdate.cpp \
|
||||
nsSoftwareUpdateRun.cpp \
|
||||
nsInstallFile.cpp \
|
||||
nsInstallDelete.cpp \
|
||||
nsInstallExecute.cpp \
|
||||
nsInstallPatch.cpp \
|
||||
nsInstallUninstall.cpp \
|
||||
nsInstallResources.cpp \
|
||||
nsTopProgressNotifier.cpp \
|
||||
nsLoggingProgressNotifier.cpp \
|
||||
ScheduledTasks.cpp \
|
||||
nsInstallProgressDialog.cpp \
|
||||
nsXPITriggerInfo.cpp \
|
||||
nsXPInstallManager.cpp \
|
||||
nsInstallFileOpItem.cpp \
|
||||
nsJSFileSpecObj.cpp \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES = -I$(srcdir)/../public
|
||||
|
||||
EXTRA_DSO_LDOPTS = \
|
||||
$(MOZ_REGISTRY_LIBS) \
|
||||
-L$(DIST)/bin \
|
||||
$(EXTRA_DSO_LIBS) \
|
||||
$(MOZ_JS_LIBS) \
|
||||
$(MOZ_COMPONENT_LIBS) \
|
||||
$(ZLIB_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
924
mozilla/xpinstall/src/PatchableAppleSingle.cpp
Normal file
924
mozilla/xpinstall/src/PatchableAppleSingle.cpp
Normal file
@@ -0,0 +1,924 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
#include "PatchableAppleSingle.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
OSErr PAS_EncodeFile(FSSpec *inSpec, FSSpec *outSpec);
|
||||
OSErr PAS_DecodeFile(FSSpec *inSpec, FSSpec *outSpec);
|
||||
|
||||
OSErr PAS_encodeResource(FSSpec *inFile, short outRefNum);
|
||||
OSErr PAS_decodeResource(PASEntry *entry, FSSpec *outFile, short inRefNum);
|
||||
|
||||
OSErr PAS_encodeMisc(FSSpec *inFile, short outRefNum);
|
||||
OSErr PAS_decodeMisc(PASEntry *entry, FSSpec *outFile, short inRefNum);
|
||||
|
||||
OSErr PAS_encodeData(FSSpec *inFile, short outRefNum);
|
||||
OSErr PAS_decodeData(PASEntry *entry, FSSpec *outFile, short inRefNum);
|
||||
|
||||
OSErr PAS_encodeHeader(short refnum);
|
||||
OSErr PAS_decodeHeader(short refNum, PASHeader *header);
|
||||
|
||||
|
||||
unsigned long PAS_getDataSize(FSSpec *spec);
|
||||
short PAS_getResourceID(Handle resource);
|
||||
|
||||
OSErr PAS_flattenResource(ResType type, short *ids, long count, short source, short dest);
|
||||
OSErr PAS_unflattenResource(PASResource *pasRes, Ptr buffer);
|
||||
|
||||
void PAS_sortTypes(short sourceRefNum, ResType **resTypePtr, long *count);
|
||||
void PAS_sortIDs(short sourceRefNum, OSType theType, short **IdPtr, long *count);
|
||||
void PAS_bubbleSortResType(ResType *types, long count);
|
||||
void PAS_bubbleSortIDS(short *ids, long count);
|
||||
|
||||
OSErr PAS_EncodeFile(FSSpec *inSpec, FSSpec *outSpec)
|
||||
{
|
||||
OSErr err;
|
||||
short outRefNum;
|
||||
|
||||
PASEntry dataEntry, miscEntry, resourceEntry;
|
||||
long sizeOfEntry;
|
||||
|
||||
|
||||
if (inSpec == NULL || outSpec == NULL)
|
||||
return paramErr;
|
||||
|
||||
|
||||
memset(&dataEntry, 0, sizeof(PASEntry));
|
||||
memset(&miscEntry, 0, sizeof(PASEntry));
|
||||
memset(&resourceEntry, 0, sizeof(PASEntry));
|
||||
|
||||
FSpDelete( outSpec ) ;
|
||||
|
||||
err = FSpCreate( outSpec, kCreator, kType ,smSystemScript );
|
||||
|
||||
if (err != noErr) return err;
|
||||
|
||||
|
||||
err = FSpOpenDF(outSpec, fsRdWrPerm, &outRefNum);
|
||||
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
// Write Out Header
|
||||
|
||||
err = PAS_encodeHeader(outRefNum);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
/* Why am I using three (3)?
|
||||
|
||||
E stand for entry.
|
||||
|
||||
The data for the entry is after the THREE headers
|
||||
|
||||
|---------|----|----|----|---------------------->
|
||||
header E E E
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// Write Out Data Entry
|
||||
dataEntry.entryID = ePas_Data;
|
||||
dataEntry.entryLength = PAS_getDataSize(inSpec);
|
||||
dataEntry.entryOffset = sizeof(PASHeader) + (3 * sizeof(PASEntry));
|
||||
|
||||
sizeOfEntry = sizeof(PASEntry);
|
||||
if(dataEntry.entryLength < 0)
|
||||
{
|
||||
err = dataEntry.entryLength;
|
||||
goto error;
|
||||
}
|
||||
|
||||
err = FSWrite(outRefNum, &sizeOfEntry, &dataEntry);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
|
||||
// Write Out Misc Entry
|
||||
miscEntry.entryID = ePas_Misc;
|
||||
miscEntry.entryLength = sizeof(PASMiscInfo);
|
||||
miscEntry.entryOffset = sizeof(PASHeader) + (3 * sizeof(PASEntry)) + dataEntry.entryLength;
|
||||
|
||||
sizeOfEntry = sizeof(PASEntry);
|
||||
err = FSWrite(outRefNum, &sizeOfEntry, &miscEntry);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
// Write Out Resource Entry
|
||||
resourceEntry.entryID = ePas_Resource;
|
||||
resourceEntry.entryLength = -1;
|
||||
resourceEntry.entryOffset = sizeof(PASHeader) + (3 * sizeof(PASEntry)) + dataEntry.entryLength + miscEntry.entryLength;
|
||||
|
||||
|
||||
sizeOfEntry = sizeof(PASEntry);
|
||||
err = FSWrite(outRefNum, &sizeOfEntry, &resourceEntry);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
err = PAS_encodeData(inSpec, outRefNum);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
err = PAS_encodeMisc(inSpec, outRefNum);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
err = PAS_encodeResource(inSpec, outRefNum);
|
||||
|
||||
if (err == kResFileNotOpened)
|
||||
{
|
||||
// there was no resource fork
|
||||
err = noErr;
|
||||
}
|
||||
else if (err != noErr)
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
|
||||
FSClose(outRefNum);
|
||||
|
||||
return noErr;
|
||||
|
||||
|
||||
|
||||
error:
|
||||
|
||||
|
||||
if (outRefNum != kResFileNotOpened)
|
||||
{
|
||||
FSClose(outRefNum);
|
||||
}
|
||||
|
||||
FSpDelete( outSpec ) ;
|
||||
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
OSErr PAS_DecodeFile(FSSpec *inSpec, FSSpec *outSpec)
|
||||
{
|
||||
OSErr err;
|
||||
short inRefNum;
|
||||
|
||||
PASHeader header;
|
||||
|
||||
PASEntry dataEntry, miscEntry, resourceEntry;
|
||||
long sizeOfEntry;
|
||||
|
||||
if (inSpec == NULL || outSpec == NULL)
|
||||
return paramErr;
|
||||
|
||||
|
||||
FSpDelete( outSpec ) ;
|
||||
|
||||
err = FSpCreate( outSpec, kCreator, kType ,smSystemScript );
|
||||
|
||||
if (err != noErr) return err;
|
||||
|
||||
|
||||
|
||||
err = FSpOpenDF(inSpec, fsRdPerm, &inRefNum);
|
||||
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
// Read Header
|
||||
|
||||
err = PAS_decodeHeader(inRefNum, &header);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
if( header.magicNum != PAS_MAGIC_NUM ||
|
||||
header.versionNum != PAS_VERSION)
|
||||
{
|
||||
err = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Read Data Entry
|
||||
|
||||
|
||||
err = SetFPos(inRefNum, fsFromStart, sizeof(PASHeader));
|
||||
if (err != noErr) goto error;
|
||||
|
||||
sizeOfEntry = sizeof(PASEntry);
|
||||
|
||||
err = FSRead(inRefNum, &sizeOfEntry, &dataEntry);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
|
||||
|
||||
// Read Misc Entry
|
||||
|
||||
|
||||
err = SetFPos(inRefNum, fsFromStart, (sizeof(PASHeader) + sizeof(PASEntry)));
|
||||
if (err != noErr) goto error;
|
||||
|
||||
sizeOfEntry = sizeof(PASEntry);
|
||||
|
||||
err = FSRead(inRefNum, &sizeOfEntry, &miscEntry);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
// Read Resource Entry
|
||||
|
||||
|
||||
err = SetFPos(inRefNum, fsFromStart, (sizeof(PASHeader) + (2 * sizeof(PASEntry)))) ;
|
||||
if (err != noErr) goto error;
|
||||
|
||||
sizeOfEntry = sizeof(PASEntry);
|
||||
|
||||
err = FSRead(inRefNum, &sizeOfEntry, &resourceEntry);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
err = PAS_decodeData(&dataEntry, outSpec, inRefNum);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
err = PAS_decodeMisc(&miscEntry, outSpec, inRefNum);
|
||||
if (err != noErr) goto error;
|
||||
|
||||
err = PAS_decodeResource(&resourceEntry, outSpec, inRefNum);
|
||||
if (err == kResFileNotOpened)
|
||||
{
|
||||
// there was no resource fork
|
||||
err = noErr;
|
||||
}
|
||||
else if (err != noErr)
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
FSClose(inRefNum);
|
||||
|
||||
return noErr;
|
||||
|
||||
|
||||
|
||||
error:
|
||||
|
||||
if (inRefNum != kResFileNotOpened)
|
||||
{
|
||||
FSClose(inRefNum);
|
||||
}
|
||||
|
||||
FSpDelete( outSpec ) ;
|
||||
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#pragma mark -
|
||||
|
||||
|
||||
OSErr PAS_encodeResource(FSSpec *inFile, short outRefNum)
|
||||
{
|
||||
OSErr err;
|
||||
short inRefNum;
|
||||
PASResFork resInfo;
|
||||
SInt32 currentWrite;
|
||||
|
||||
ResType *resTypes;
|
||||
long typeCount;
|
||||
|
||||
short *ids;
|
||||
long idCount;
|
||||
|
||||
short oldResFile;
|
||||
|
||||
oldResFile=CurResFile();
|
||||
inRefNum = FSpOpenResFile(inFile, fsRdPerm);
|
||||
if (inRefNum < noErr) return inRefNum;
|
||||
|
||||
UseResFile(inRefNum);
|
||||
|
||||
memset(&resInfo, 0, sizeof(PASResFork));
|
||||
|
||||
PAS_sortTypes(inRefNum, &resTypes, &typeCount);
|
||||
|
||||
resInfo.NumberOfTypes = typeCount;
|
||||
|
||||
currentWrite = sizeof(PASResFork);
|
||||
|
||||
err = FSWrite(outRefNum, ¤tWrite, &resInfo);
|
||||
if (err != noErr) return err;
|
||||
|
||||
for (typeCount = 0; ((typeCount < resInfo.NumberOfTypes) && (err == noErr)); typeCount++)
|
||||
{
|
||||
PAS_sortIDs(inRefNum, resTypes[typeCount], &ids, &idCount);
|
||||
err = PAS_flattenResource(resTypes[typeCount], ids, idCount, inRefNum, outRefNum);
|
||||
DisposePtr((Ptr)ids);
|
||||
}
|
||||
|
||||
DisposePtr((Ptr)resTypes);
|
||||
|
||||
|
||||
UseResFile(oldResFile);
|
||||
CloseResFile(inRefNum);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr PAS_decodeResource(PASEntry *entry, FSSpec *outFile, short inRefNum)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
short outRefNum;
|
||||
PASResFork info;
|
||||
SInt32 infoSize;
|
||||
short oldResFile;
|
||||
|
||||
PASResource pasRes;
|
||||
SInt32 pasResSize;
|
||||
|
||||
long bufSize;
|
||||
Handle buffer;
|
||||
long counter=0;
|
||||
|
||||
infoSize = sizeof(PASResFork);
|
||||
|
||||
err = SetFPos(inRefNum, fsFromStart, (*entry).entryOffset );
|
||||
if (err != noErr) return err;
|
||||
|
||||
err = FSRead( inRefNum, &infoSize, &info);
|
||||
if (err != noErr) return err;
|
||||
|
||||
if(infoSize != sizeof(PASResFork))
|
||||
{
|
||||
err = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
oldResFile=CurResFile();
|
||||
|
||||
outRefNum = FSpOpenResFile(outFile, fsRdWrPerm);
|
||||
if (outRefNum < noErr) return outRefNum;
|
||||
|
||||
UseResFile(outRefNum);
|
||||
|
||||
|
||||
while (1)
|
||||
{
|
||||
pasResSize = sizeof(PASResource);
|
||||
err = FSRead( inRefNum, &pasResSize, &pasRes);
|
||||
|
||||
if (err != noErr)
|
||||
{
|
||||
if(err == eofErr)
|
||||
err = noErr;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
bufSize = pasRes.length;
|
||||
buffer = NewHandle(bufSize);
|
||||
HLock(buffer);
|
||||
|
||||
if(buffer == NULL)
|
||||
{
|
||||
// if we did not get our memory, try updateresfile
|
||||
|
||||
HUnlock(buffer);
|
||||
|
||||
|
||||
UpdateResFile(outRefNum);
|
||||
counter=0;
|
||||
|
||||
buffer = NewHandle(bufSize);
|
||||
HLock(buffer);
|
||||
|
||||
if(buffer == NULL)
|
||||
{
|
||||
err = memFullErr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
err = FSRead( inRefNum, &bufSize, &(**buffer));
|
||||
if (err != noErr && err != eofErr) break;
|
||||
|
||||
AddResource(buffer, pasRes.attrType, pasRes.attrID, pasRes.attrName);
|
||||
WriteResource(buffer);
|
||||
|
||||
SetResAttrs(buffer, pasRes.attr);
|
||||
ChangedResource(buffer);
|
||||
WriteResource(buffer);
|
||||
|
||||
ReleaseResource(buffer);
|
||||
|
||||
if (counter++ > 100)
|
||||
{
|
||||
UpdateResFile(outRefNum);
|
||||
counter=0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
error:
|
||||
|
||||
UseResFile(oldResFile);
|
||||
CloseResFile(outRefNum);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
OSErr PAS_encodeMisc(FSSpec *inFile, short outRefNum)
|
||||
{
|
||||
OSErr err;
|
||||
short inRefNum;
|
||||
PASMiscInfo infoBlock;
|
||||
FInfo fInfo;
|
||||
SInt32 currentRead;
|
||||
|
||||
err = FSpOpenDF(inFile, fsRdPerm, &inRefNum);
|
||||
if (err != noErr) return err;
|
||||
|
||||
memset(&infoBlock, 0, sizeof(PASMiscInfo));
|
||||
|
||||
err = FSpGetFInfo(inFile, &fInfo);
|
||||
if (err != noErr) return err;
|
||||
|
||||
infoBlock.fileType = fInfo.fdType;
|
||||
infoBlock.fileCreator = fInfo.fdCreator;
|
||||
infoBlock.fileFlags = fInfo.fdFlags;
|
||||
|
||||
|
||||
FSClose(inRefNum);
|
||||
|
||||
|
||||
inRefNum = FSpOpenResFile(inFile, fsRdPerm);
|
||||
if (inRefNum > noErr)
|
||||
{
|
||||
infoBlock.fileHasResFork = 1;
|
||||
infoBlock.fileResAttrs = GetResFileAttrs(inRefNum);
|
||||
FSClose(inRefNum);
|
||||
}
|
||||
else
|
||||
{
|
||||
infoBlock.fileHasResFork = 0;
|
||||
infoBlock.fileResAttrs = 0;
|
||||
}
|
||||
currentRead = sizeof(PASMiscInfo);
|
||||
|
||||
err = FSWrite(outRefNum, ¤tRead, &infoBlock);
|
||||
if (err != noErr) return err;
|
||||
|
||||
CloseResFile(inRefNum);
|
||||
|
||||
return noErr;
|
||||
}
|
||||
|
||||
|
||||
OSErr PAS_decodeMisc(PASEntry *entry, FSSpec *outFile, short inRefNum)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
short outRefNum;
|
||||
PASMiscInfo info;
|
||||
SInt32 infoSize;
|
||||
FInfo theFInfo;
|
||||
|
||||
|
||||
infoSize = sizeof(PASMiscInfo);
|
||||
|
||||
err = SetFPos(inRefNum, fsFromStart, (*entry).entryOffset );
|
||||
if (err != noErr) return err;
|
||||
|
||||
err = FSRead( inRefNum, &infoSize, &info);
|
||||
if (err != noErr) return err;
|
||||
|
||||
if(infoSize != sizeof(PASMiscInfo))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = FSpOpenDF(outFile, fsRdWrPerm, &outRefNum);
|
||||
if (err != noErr) return err;
|
||||
|
||||
memset(&theFInfo, 0, sizeof(FInfo));
|
||||
|
||||
theFInfo.fdType = info.fileType;
|
||||
theFInfo.fdCreator = info.fileCreator;
|
||||
theFInfo.fdFlags = info.fileFlags;
|
||||
|
||||
err = FSpSetFInfo(outFile, &theFInfo);
|
||||
if (err != noErr) return err;
|
||||
|
||||
FSClose(outRefNum);
|
||||
|
||||
if (info.fileHasResFork)
|
||||
{
|
||||
outRefNum = FSpOpenResFile(outFile, fsRdWrPerm);
|
||||
if (outRefNum < noErr)
|
||||
{
|
||||
// maybe it does not have one!
|
||||
|
||||
FSpCreateResFile(outFile, info.fileCreator, info.fileType, smSystemScript);
|
||||
|
||||
outRefNum = FSpOpenResFile(outFile, fsRdWrPerm);
|
||||
if (outRefNum < noErr)
|
||||
{
|
||||
return outRefNum;
|
||||
}
|
||||
}
|
||||
|
||||
SetResFileAttrs(outRefNum, info.fileResAttrs);
|
||||
|
||||
|
||||
CloseResFile(outRefNum);
|
||||
}
|
||||
|
||||
|
||||
if(info.fileType == 'APPL')
|
||||
{
|
||||
// we need to add applications to the desktop database.
|
||||
|
||||
/* FIX :: need to find DTSetAPPL() function
|
||||
err = DTSetAPPL( NULL,
|
||||
outFile->vRefNum,
|
||||
info.fileCreator,
|
||||
outFile->parID,
|
||||
outFile->name);
|
||||
*/ }
|
||||
|
||||
|
||||
return err;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
OSErr PAS_encodeData(FSSpec *inFile, short outRefNum)
|
||||
{
|
||||
OSErr err;
|
||||
short inRefNum;
|
||||
Ptr buffer;
|
||||
SInt32 currentRead = PAS_BUFFER_SIZE;
|
||||
|
||||
buffer = NewPtr(currentRead);
|
||||
|
||||
err = FSpOpenDF(inFile, fsRdPerm, &inRefNum);
|
||||
if (err != noErr) return err;
|
||||
|
||||
while ( currentRead > 0 )
|
||||
{
|
||||
err = FSRead( inRefNum, ¤tRead, buffer);
|
||||
if (err != noErr && err != eofErr) return err;
|
||||
|
||||
err = FSWrite(outRefNum, ¤tRead, buffer);
|
||||
if (err != noErr) return err;
|
||||
}
|
||||
|
||||
FSClose(inRefNum);
|
||||
|
||||
DisposePtr(buffer);
|
||||
|
||||
return noErr;
|
||||
}
|
||||
|
||||
OSErr PAS_decodeData(PASEntry *entry, FSSpec *outFile, short inRefNum)
|
||||
{
|
||||
OSErr err;
|
||||
short outRefNum;
|
||||
Ptr buffer;
|
||||
SInt32 currentWrite = PAS_BUFFER_SIZE;
|
||||
SInt32 totalSize;
|
||||
|
||||
|
||||
buffer = NewPtr(currentWrite);
|
||||
|
||||
|
||||
err = FSpOpenDF(outFile, fsRdWrPerm, &outRefNum);
|
||||
if (err != noErr) return err;
|
||||
|
||||
|
||||
err = SetFPos(inRefNum, fsFromStart, (*entry).entryOffset );
|
||||
if (err != noErr) return err;
|
||||
|
||||
err = SetFPos(outRefNum, fsFromStart, 0 );
|
||||
if (err != noErr) return err;
|
||||
|
||||
totalSize = (*entry).entryLength;
|
||||
|
||||
while(totalSize > 0)
|
||||
{
|
||||
currentWrite = PAS_BUFFER_SIZE;
|
||||
|
||||
if (totalSize < currentWrite)
|
||||
{
|
||||
currentWrite = totalSize;
|
||||
}
|
||||
|
||||
err = FSRead( inRefNum, ¤tWrite, buffer);
|
||||
if (err != noErr && err != eofErr) return err;
|
||||
|
||||
err = FSWrite(outRefNum, ¤tWrite, buffer);
|
||||
if (err != noErr) return err;
|
||||
|
||||
totalSize = totalSize - currentWrite;
|
||||
|
||||
}
|
||||
|
||||
FSClose(outRefNum);
|
||||
|
||||
DisposePtr(buffer);
|
||||
|
||||
return noErr;
|
||||
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
OSErr PAS_encodeHeader(short refnum)
|
||||
{
|
||||
PASHeader header;
|
||||
long sizeOfHeader;
|
||||
OSErr err;
|
||||
|
||||
|
||||
sizeOfHeader = sizeof(PASHeader);
|
||||
|
||||
memset(&header, 0, sizeOfHeader);
|
||||
|
||||
header.magicNum = PAS_MAGIC_NUM;
|
||||
header.versionNum = PAS_VERSION;
|
||||
header.numEntries = 3;
|
||||
|
||||
// Write Out Header
|
||||
err = FSWrite(refnum, &sizeOfHeader, &header);
|
||||
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
OSErr PAS_decodeHeader(short refNum, PASHeader *header)
|
||||
{
|
||||
OSErr err;
|
||||
long sizeOfHeader = sizeof(PASHeader);
|
||||
|
||||
memset(header, 0, sizeOfHeader);
|
||||
|
||||
err = FSRead(refNum, &sizeOfHeader, header);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
|
||||
unsigned long PAS_getDataSize(FSSpec *spec)
|
||||
{
|
||||
short refNum;
|
||||
OSErr err;
|
||||
Str255 temp;
|
||||
CInfoPBRec cbrec;
|
||||
err = FSpOpenDF(spec, fsRdPerm, &refNum);
|
||||
|
||||
memcpy( temp, spec->name, spec->name[0] + 1);
|
||||
|
||||
cbrec.hFileInfo.ioNamePtr = temp;
|
||||
cbrec.hFileInfo.ioDirID = spec->parID;
|
||||
cbrec.hFileInfo.ioVRefNum = spec->vRefNum;
|
||||
cbrec.hFileInfo.ioFDirIndex = 0;
|
||||
|
||||
err = PBGetCatInfoSync(&cbrec);
|
||||
FSClose(refNum);
|
||||
|
||||
if(err != noErr)
|
||||
{
|
||||
cbrec.hFileInfo.ioFlLgLen = err;
|
||||
}
|
||||
|
||||
return (cbrec.hFileInfo.ioFlLgLen);
|
||||
}
|
||||
|
||||
short PAS_getResourceID(Handle resource)
|
||||
{
|
||||
ResType theType;
|
||||
Str255 name;
|
||||
short theID;
|
||||
|
||||
memset(&name, 0, sizeof(Str255));
|
||||
|
||||
GetResInfo(resource, &theID, &theType, name);
|
||||
|
||||
return theID;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
OSErr PAS_flattenResource(ResType type, short *ids, long count, short source, short dest)
|
||||
{
|
||||
long idIndex;
|
||||
|
||||
|
||||
Handle resToCopy;
|
||||
long handleLength;
|
||||
|
||||
PASResource pasResource;
|
||||
long pasResLen;
|
||||
|
||||
OSErr err;
|
||||
|
||||
for (idIndex=0; idIndex < count; idIndex++)
|
||||
{
|
||||
if( (type == 'SIZE') && ( ids[idIndex] == 1 || ids[idIndex] == 0 ) )
|
||||
{
|
||||
/*
|
||||
We do not want to encode/flatten SIZE 0 or 1 because this
|
||||
is the resource that the user can modify. Most applications
|
||||
will not be affected if we remove these resources
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
resToCopy=Get1Resource(type,ids[idIndex]);
|
||||
|
||||
if(!resToCopy)
|
||||
{
|
||||
return resNotFound;
|
||||
}
|
||||
|
||||
memset(&pasResource, 0, sizeof(PASResource));
|
||||
|
||||
GetResInfo( resToCopy,
|
||||
&pasResource.attrID,
|
||||
&pasResource.attrType,
|
||||
pasResource.attrName);
|
||||
|
||||
pasResource.attr = GetResAttrs(resToCopy);
|
||||
|
||||
DetachResource(resToCopy);
|
||||
HLock(resToCopy);
|
||||
|
||||
pasResource.length = GetHandleSize(resToCopy);
|
||||
handleLength = pasResource.length;
|
||||
|
||||
pasResLen = sizeof(PASResource);
|
||||
|
||||
err = FSWrite(dest, &pasResLen, &pasResource);
|
||||
|
||||
if(err != noErr)
|
||||
{
|
||||
return err;
|
||||
}
|
||||
|
||||
err = FSWrite(dest, &handleLength, &(**resToCopy));
|
||||
|
||||
if(err != noErr)
|
||||
{
|
||||
return err;
|
||||
}
|
||||
|
||||
HUnlock(resToCopy);
|
||||
DisposeHandle(resToCopy);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return noErr;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
|
||||
void PAS_sortTypes(short sourceRefNum, ResType **resTypePtr, long *count)
|
||||
{
|
||||
short oldRef;
|
||||
short typeIndex;
|
||||
short numberOfTypes;
|
||||
|
||||
*count = -1;
|
||||
|
||||
oldRef = CurResFile();
|
||||
|
||||
UseResFile(sourceRefNum);
|
||||
|
||||
numberOfTypes = Count1Types();
|
||||
|
||||
*resTypePtr = (ResType*) NewPtrClear( numberOfTypes * sizeof(OSType) );
|
||||
|
||||
for (typeIndex=1; typeIndex <= numberOfTypes; typeIndex++)
|
||||
{
|
||||
Get1IndType(&(*resTypePtr)[typeIndex-1], typeIndex);
|
||||
}
|
||||
|
||||
UseResFile(oldRef);
|
||||
|
||||
PAS_bubbleSortResType(*resTypePtr, numberOfTypes);
|
||||
|
||||
*count = numberOfTypes;
|
||||
}
|
||||
|
||||
|
||||
void PAS_sortIDs(short sourceRefNum, OSType theType, short **IdPtr, long *count)
|
||||
{
|
||||
short oldRef;
|
||||
Handle theHandle;
|
||||
short resCount;
|
||||
short resIndex;
|
||||
|
||||
*count = -1;
|
||||
|
||||
oldRef = CurResFile();
|
||||
|
||||
UseResFile(sourceRefNum);
|
||||
|
||||
resCount = Count1Resources(theType);
|
||||
|
||||
*IdPtr = (short*) NewPtrClear( resCount * sizeof(short) );
|
||||
|
||||
for (resIndex=1; resIndex <= resCount; resIndex++)
|
||||
{
|
||||
theHandle = Get1IndResource(theType, resIndex);
|
||||
|
||||
if(theHandle == NULL) return;
|
||||
|
||||
(*IdPtr)[resIndex-1] = PAS_getResourceID(theHandle);
|
||||
|
||||
ReleaseResource(theHandle);
|
||||
}
|
||||
|
||||
UseResFile(oldRef);
|
||||
|
||||
PAS_bubbleSortIDS(*IdPtr, resCount);
|
||||
|
||||
|
||||
*count = resCount;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
void
|
||||
PAS_bubbleSortResType(ResType *types, long count)
|
||||
{
|
||||
long x, y;
|
||||
OSType temp;
|
||||
|
||||
for (x=0; x < count-1; x++)
|
||||
{
|
||||
for (y=0; y < count-x-1; y++)
|
||||
{
|
||||
if (types[y] > types[y+1])
|
||||
{
|
||||
temp=types[y];
|
||||
types[y]=types[y+1];
|
||||
types[y+1]=temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
PAS_bubbleSortIDS(short *ids, long count)
|
||||
{
|
||||
long x, y;
|
||||
short temp;
|
||||
|
||||
for (x=0; x < count-1; x++)
|
||||
{
|
||||
for (y=0; y < count-x-1; y++)
|
||||
{
|
||||
if (ids[y] > ids[y+1])
|
||||
{
|
||||
temp=ids[y];
|
||||
ids[y]=ids[y+1];
|
||||
ids[y+1]=temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
117
mozilla/xpinstall/src/PatchableAppleSingle.h
Normal file
117
mozilla/xpinstall/src/PatchableAppleSingle.h
Normal file
@@ -0,0 +1,117 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
#ifndef SU_PAS_H
|
||||
#define SU_PAS_H
|
||||
|
||||
|
||||
#include <Errors.h>
|
||||
#include <Types.h>
|
||||
#include <Files.h>
|
||||
#include <Script.h>
|
||||
#include <Resources.h>
|
||||
|
||||
typedef struct PASHeader /* header portion of Patchable AppleSingle */
|
||||
{
|
||||
UInt32 magicNum; /* internal file type tag = 0x00244200*/
|
||||
UInt32 versionNum; /* format version: 1 = 0x00010000 */
|
||||
UInt8 filler[16]; /* filler */
|
||||
UInt16 numEntries; /* number of entries which follow */
|
||||
} PASHeader ;
|
||||
|
||||
|
||||
typedef struct PASEntry /* one Patchable AppleSingle entry descriptor */
|
||||
{
|
||||
UInt32 entryID; /* entry type: see list, 0 invalid */
|
||||
UInt32 entryOffset; /* offset, in bytes, from beginning */
|
||||
/* of file to this entry's data */
|
||||
UInt32 entryLength; /* length of data in octets */
|
||||
|
||||
} PASEntry;
|
||||
|
||||
|
||||
typedef struct PASMiscInfo
|
||||
{
|
||||
short fileHasResFork;
|
||||
short fileResAttrs;
|
||||
OSType fileType;
|
||||
OSType fileCreator;
|
||||
UInt32 fileFlags;
|
||||
|
||||
} PASMiscInfo;
|
||||
|
||||
|
||||
typedef struct PASResFork
|
||||
{
|
||||
short NumberOfTypes;
|
||||
|
||||
} PASResFork;
|
||||
|
||||
|
||||
typedef struct PASResource
|
||||
{
|
||||
short attr;
|
||||
short attrID;
|
||||
OSType attrType;
|
||||
Str255 attrName;
|
||||
unsigned long length;
|
||||
|
||||
} PASResource;
|
||||
|
||||
|
||||
|
||||
#if PRAGMA_ALIGN_SUPPORTED
|
||||
#pragma options align=reset
|
||||
#endif
|
||||
|
||||
|
||||
#define kCreator 'MOSS'
|
||||
#define kType 'PASf'
|
||||
#define PAS_BUFFER_SIZE (1024*512)
|
||||
|
||||
#define PAS_MAGIC_NUM (0x00244200)
|
||||
#define PAS_VERSION (0x00010000)
|
||||
|
||||
enum
|
||||
{
|
||||
ePas_Data = 1,
|
||||
ePas_Misc,
|
||||
ePas_Resource
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Prototypes */
|
||||
OSErr PAS_EncodeFile(FSSpec *inSpec, FSSpec *outSpec);
|
||||
OSErr PAS_DecodeFile(FSSpec *inSpec, FSSpec *outSpec);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SU_PAS_H */
|
||||
481
mozilla/xpinstall/src/ScheduledTasks.cpp
Normal file
481
mozilla/xpinstall/src/ScheduledTasks.cpp
Normal file
@@ -0,0 +1,481 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "nsFileStream.h"
|
||||
#include "nsInstall.h" // for error codes
|
||||
#include "prmem.h"
|
||||
#include "ScheduledTasks.h"
|
||||
|
||||
|
||||
|
||||
static nsresult
|
||||
GetPersistentStringFromSpec(const nsFileSpec& inSpec, char **string)
|
||||
{
|
||||
if (!string) return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsCOMPtr<nsIFileSpec> spec;
|
||||
#ifdef XP_MAC
|
||||
nsFileSpec interim = inSpec.GetFSSpec(); /* XXX get rid of mError in nsFileSpec */
|
||||
nsresult rv = NS_NewFileSpecWithSpec(interim, getter_AddRefs(spec));
|
||||
#else
|
||||
nsresult rv = NS_NewFileSpecWithSpec(inSpec, getter_AddRefs(spec));
|
||||
#endif
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = spec->GetPersistentDescriptorString(string);
|
||||
}
|
||||
else {
|
||||
*string = nsnull;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <sys/stat.h>
|
||||
#include <windows.h>
|
||||
|
||||
PRInt32 ReplaceExistingWindowsFile(const nsFileSpec& currentSpec, const nsFileSpec& finalSpec)
|
||||
{
|
||||
// this routine is now for DOS-based windows only. WinNT should
|
||||
// be taken care of by the XP code
|
||||
//
|
||||
// NOTE for WINNT:
|
||||
//
|
||||
// the MOVEFILE_DELAY_UNTIL_REBOOT option doesn't work on
|
||||
// NT 3.51 SP4 or on NT 4.0 until SP2. On the broken versions
|
||||
// of NT 4.0 Microsoft warns using it can lead to an irreparably
|
||||
// corrupt windows' registry "after an unknown number of calls".
|
||||
// Time to reinstall windows when that happens.
|
||||
//
|
||||
// I don't want to risk it, I also don't want two separate code
|
||||
// paths to test, so we do it the lame way on all NT systems
|
||||
// until such time as there are few enough old revs around to
|
||||
// make it worth switching back to MoveFileEx().
|
||||
|
||||
PRInt32 err = -1;
|
||||
|
||||
/* Get OS version info */
|
||||
DWORD dwVersion = GetVersion();
|
||||
|
||||
/* Get build numbers for Windows NT or Win32s */
|
||||
|
||||
if (dwVersion > 0x80000000)
|
||||
{
|
||||
// Windows 95 or Win16
|
||||
|
||||
// Place an entry in the WININIT.INI file in the Windows directory
|
||||
// to delete finalName and rename currentName to be finalName at reboot
|
||||
|
||||
int strlen;
|
||||
char Src[_MAX_PATH]; // 8.3 name
|
||||
char Dest[_MAX_PATH]; // 8.3 name
|
||||
|
||||
char* final = strdup(finalSpec.GetNativePathCString());
|
||||
char* current = strdup(currentSpec.GetNativePathCString());
|
||||
|
||||
strlen = GetShortPathName( (LPCTSTR)current, (LPTSTR)Src, (DWORD)sizeof(Src) );
|
||||
if ( strlen > 0 )
|
||||
{
|
||||
free(current);
|
||||
current = strdup(Src);
|
||||
}
|
||||
|
||||
strlen = GetShortPathName( (LPCTSTR) final, (LPTSTR) Dest, (DWORD) sizeof(Dest));
|
||||
if ( strlen > 0 )
|
||||
{
|
||||
free(final);
|
||||
final = strdup(Dest);
|
||||
}
|
||||
|
||||
/* NOTE: use OEM filenames! Even though it looks like a Windows
|
||||
* .INI file, WININIT.INI is processed under DOS
|
||||
*/
|
||||
|
||||
AnsiToOem( final, final );
|
||||
AnsiToOem( current, current );
|
||||
|
||||
if ( WritePrivateProfileString( "Rename", final, current, "WININIT.INI" ) )
|
||||
err = 0;
|
||||
|
||||
free(final);
|
||||
free(current);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
PRInt32 DeleteFileNowOrSchedule(const nsFileSpec& filename)
|
||||
{
|
||||
|
||||
PRInt32 result = nsInstall::SUCCESS;
|
||||
|
||||
filename.Delete(PR_FALSE);
|
||||
if (filename.Exists())
|
||||
{
|
||||
// could not delete, schedule it for later
|
||||
|
||||
RKEY newkey;
|
||||
HREG reg;
|
||||
REGERR err;
|
||||
result = nsInstall::UNEXPECTED_ERROR;
|
||||
|
||||
err = NR_RegOpen("", ®) ;
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
err = NR_RegAddKey(reg,ROOTKEY_PRIVATE,REG_DELETE_LIST_KEY,&newkey);
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
char valname[20];
|
||||
char* fnamestr = nsnull;
|
||||
|
||||
err = NR_RegGetUniqueName( reg, valname, sizeof(valname) );
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
nsresult rv;
|
||||
rv = GetPersistentStringFromSpec( filename, &fnamestr );
|
||||
if ( NS_SUCCEEDED(rv) && fnamestr )
|
||||
{
|
||||
|
||||
err = NR_RegSetEntry( reg, newkey, valname,
|
||||
REGTYPE_ENTRY_BYTES,
|
||||
(void*)fnamestr,
|
||||
strlen(fnamestr)+1);
|
||||
|
||||
if ( err == REGERR_OK )
|
||||
result = nsInstall::REBOOT_NEEDED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NR_RegClose(reg);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
PRInt32 ReplaceFileNow(nsFileSpec& replacementFile, nsFileSpec& doomedFile )
|
||||
{
|
||||
// replacement file must exist, doomed file doesn't have to
|
||||
if ( !replacementFile.Exists() )
|
||||
return nsInstall::DOES_NOT_EXIST;
|
||||
|
||||
// don't have to do anything if the files are the same
|
||||
if ( replacementFile == doomedFile )
|
||||
return nsInstall::SUCCESS;
|
||||
|
||||
|
||||
PRInt32 result = nsInstall::ACCESS_DENIED;
|
||||
|
||||
// first try to rename the doomed file out of the way (if it exists)
|
||||
char* leafname;
|
||||
nsFileSpec tmpFile( doomedFile );
|
||||
if ( tmpFile.Exists() )
|
||||
{
|
||||
tmpFile.MakeUnique();
|
||||
leafname = tmpFile.GetLeafName();
|
||||
tmpFile = doomedFile;
|
||||
tmpFile.Rename( leafname );
|
||||
nsCRT::free( leafname );
|
||||
}
|
||||
|
||||
|
||||
// if doomedFile is gone move new file into place
|
||||
nsresult rv;
|
||||
if ( !doomedFile.Exists() )
|
||||
{
|
||||
nsFileSpec parentofFinalFile;
|
||||
nsFileSpec parentofReplacementFile;
|
||||
|
||||
doomedFile.GetParent(parentofFinalFile);
|
||||
replacementFile.GetParent(parentofReplacementFile);
|
||||
|
||||
// XXX looks dangerous, the replacement file name may NOT be unique in the
|
||||
// target directory if we have to move it! Either we should never move the
|
||||
// files like this (i.e. error if not in the same dir) or we need to take
|
||||
// a little more care in the move.
|
||||
if(parentofReplacementFile != parentofFinalFile)
|
||||
{
|
||||
NS_WARN_IF_FALSE( 0, "File unpacked into a non-dest dir" );
|
||||
rv = replacementFile.MoveToDir(parentofFinalFile);
|
||||
}
|
||||
else
|
||||
rv = NS_OK;
|
||||
|
||||
leafname = doomedFile.GetLeafName();
|
||||
if ( NS_SUCCEEDED(rv) )
|
||||
rv = replacementFile.Rename( leafname );
|
||||
|
||||
if ( NS_SUCCEEDED(rv) )
|
||||
{
|
||||
// we replaced the old file OK, now we have to
|
||||
// get rid of it permanently
|
||||
result = DeleteFileNowOrSchedule( tmpFile );
|
||||
}
|
||||
else
|
||||
{
|
||||
// couldn't rename file, try to put old file back
|
||||
tmpFile.Rename( leafname );
|
||||
}
|
||||
nsCRT::free( leafname );
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
PRInt32 ReplaceFileNowOrSchedule(nsFileSpec& replacementFile, nsFileSpec& doomedFile )
|
||||
{
|
||||
PRInt32 result = ReplaceFileNow( replacementFile, doomedFile );
|
||||
|
||||
if ( result == nsInstall::ACCESS_DENIED )
|
||||
{
|
||||
// if we couldn't replace the file schedule it for later
|
||||
#ifdef _WINDOWS
|
||||
if ( ReplaceExistingWindowsFile(replacementFile, doomedFile) == 0 )
|
||||
return nsInstall::REBOOT_NEEDED;
|
||||
#endif
|
||||
|
||||
RKEY listkey;
|
||||
RKEY filekey;
|
||||
HREG reg;
|
||||
REGERR err;
|
||||
|
||||
if ( REGERR_OK == NR_RegOpen("", ®) )
|
||||
{
|
||||
err = NR_RegAddKey( reg, ROOTKEY_PRIVATE, REG_REPLACE_LIST_KEY, &listkey );
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
char valname[20];
|
||||
char* fsrc = nsnull;
|
||||
char* fdest = nsnull;
|
||||
REGERR err2;
|
||||
nsresult rv, rv2;
|
||||
|
||||
err = NR_RegGetUniqueName( reg, valname, sizeof(valname) );
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
err = NR_RegAddKey( reg, listkey, valname, &filekey );
|
||||
if ( REGERR_OK == err )
|
||||
{
|
||||
rv = GetPersistentStringFromSpec(replacementFile, &fsrc);
|
||||
rv2 = GetPersistentStringFromSpec(doomedFile, &fdest);
|
||||
if ( NS_SUCCEEDED(rv) && NS_SUCCEEDED(rv2) )
|
||||
{
|
||||
|
||||
err = NR_RegSetEntry( reg, filekey,
|
||||
REG_REPLACE_SRCFILE,
|
||||
REGTYPE_ENTRY_BYTES,
|
||||
(void*)fsrc,
|
||||
strlen(fsrc));
|
||||
|
||||
err2 = NR_RegSetEntry(reg, filekey,
|
||||
REG_REPLACE_DESTFILE,
|
||||
REGTYPE_ENTRY_BYTES,
|
||||
(void*)fdest,
|
||||
strlen(fdest));
|
||||
|
||||
if ( err == REGERR_OK && err2 == REGERR_OK )
|
||||
result = nsInstall::REBOOT_NEEDED;
|
||||
else
|
||||
NR_RegDeleteKey( reg, listkey, valname );
|
||||
}
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
nsCRT::free(fsrc);
|
||||
|
||||
if (NS_SUCCEEDED(rv2))
|
||||
nsCRT::free(fdest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NR_RegClose(reg);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// STARTUP: DO SCHEDULED ACTIONS
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void DeleteScheduledFiles(HREG);
|
||||
void ReplaceScheduledFiles(HREG);
|
||||
|
||||
void PerformScheduledTasks(HREG reg)
|
||||
{
|
||||
DeleteScheduledFiles( reg );
|
||||
ReplaceScheduledFiles( reg );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DeleteScheduledFiles( HREG reg )
|
||||
{
|
||||
REGERR err;
|
||||
RKEY key;
|
||||
REGENUM state = 0;
|
||||
|
||||
/* perform scheduled file deletions */
|
||||
if (REGERR_OK == NR_RegGetKey(reg,ROOTKEY_PRIVATE,REG_DELETE_LIST_KEY,&key))
|
||||
{
|
||||
// the delete key exists, so we loop through its children
|
||||
// and try to delete all the listed files
|
||||
|
||||
char namebuf[MAXREGNAMELEN];
|
||||
char valbuf[MAXREGPATHLEN];
|
||||
|
||||
nsFileSpec doomedFile;
|
||||
nsCOMPtr<nsIFileSpec> spec;
|
||||
|
||||
nsresult rv = NS_NewFileSpec(getter_AddRefs(spec));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
while (REGERR_OK == NR_RegEnumEntries( reg, key, &state, namebuf,
|
||||
sizeof(namebuf), 0 ) )
|
||||
{
|
||||
uint32 bufsize = sizeof(valbuf); // gets changed, must reset
|
||||
err = NR_RegGetEntry( reg, key, namebuf, valbuf, &bufsize );
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
// no need to check return value of
|
||||
// SetPersistentDescriptorString, it's always NS_OK
|
||||
spec->SetPersistentDescriptorString(valbuf);
|
||||
rv = spec->GetFileSpec(&doomedFile);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
doomedFile.Delete(PR_FALSE);
|
||||
if ( !doomedFile.Exists() )
|
||||
{
|
||||
// deletion successful, don't have to retry
|
||||
NR_RegDeleteEntry( reg, key, namebuf );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* delete list node if empty */
|
||||
state = 0;
|
||||
err = NR_RegEnumEntries(reg, key, &state, namebuf, sizeof(namebuf), 0);
|
||||
if ( err == REGERR_NOMORE )
|
||||
{
|
||||
NR_RegDeleteKey(reg, ROOTKEY_PRIVATE, REG_DELETE_LIST_KEY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ReplaceScheduledFiles( HREG reg )
|
||||
{
|
||||
RKEY key;
|
||||
|
||||
/* replace files if any listed */
|
||||
if (REGERR_OK == NR_RegGetKey(reg,ROOTKEY_PRIVATE,REG_REPLACE_LIST_KEY,&key))
|
||||
{
|
||||
char keyname[MAXREGNAMELEN];
|
||||
char doomedFile[MAXREGPATHLEN];
|
||||
char srcFile[MAXREGPATHLEN];
|
||||
|
||||
nsFileSpec doomedSpec;
|
||||
nsFileSpec srcSpec;
|
||||
nsCOMPtr<nsIFileSpec> src;
|
||||
nsCOMPtr<nsIFileSpec> dest;
|
||||
nsresult rv1, rv2;
|
||||
|
||||
rv1 = NS_NewFileSpec(getter_AddRefs(src));
|
||||
rv2 = NS_NewFileSpec(getter_AddRefs(dest));
|
||||
if (NS_SUCCEEDED(rv1) && NS_SUCCEEDED(rv2))
|
||||
{
|
||||
uint32 bufsize;
|
||||
REGENUM state = 0;
|
||||
while (REGERR_OK == NR_RegEnumSubkeys( reg, key, &state,
|
||||
keyname, sizeof(keyname), REGENUM_CHILDREN))
|
||||
{
|
||||
bufsize = sizeof(srcFile);
|
||||
REGERR err1 = NR_RegGetEntry( reg, (RKEY)state,
|
||||
REG_REPLACE_SRCFILE, srcFile, &bufsize);
|
||||
|
||||
bufsize = sizeof(doomedFile);
|
||||
REGERR err2 = NR_RegGetEntry( reg, (RKEY)state,
|
||||
REG_REPLACE_DESTFILE, doomedFile, &bufsize);
|
||||
|
||||
if ( err1 == REGERR_OK && err2 == REGERR_OK )
|
||||
{
|
||||
src->SetPersistentDescriptorString(srcFile);
|
||||
rv1 = src->GetFileSpec(&srcSpec);
|
||||
|
||||
dest->SetPersistentDescriptorString(doomedFile);
|
||||
rv2 = dest->GetFileSpec(&doomedSpec);
|
||||
|
||||
if (NS_SUCCEEDED(rv1) && NS_SUCCEEDED(rv2))
|
||||
{
|
||||
// finally now try to do the replace
|
||||
PRInt32 result = ReplaceFileNow( srcSpec, doomedSpec );
|
||||
|
||||
if ( result == nsInstall::DOES_NOT_EXIST ||
|
||||
result == nsInstall::SUCCESS )
|
||||
{
|
||||
// This one is done
|
||||
NR_RegDeleteKey( reg, key, keyname );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* delete list node if empty */
|
||||
state = 0;
|
||||
if (REGERR_NOMORE == NR_RegEnumSubkeys( reg, key, &state, keyname,
|
||||
sizeof(keyname), REGENUM_CHILDREN ))
|
||||
{
|
||||
NR_RegDeleteKey(reg, ROOTKEY_PRIVATE, REG_REPLACE_LIST_KEY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
44
mozilla/xpinstall/src/ScheduledTasks.h
Normal file
44
mozilla/xpinstall/src/ScheduledTasks.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
#ifndef __SCHEDULEDTASKS_H__
|
||||
#define __SCHEDULEDTASKS_H__
|
||||
|
||||
|
||||
#include "NSReg.h"
|
||||
//#include "mozreg.h"
|
||||
#include "nsFileSpec.h"
|
||||
|
||||
PR_BEGIN_EXTERN_C
|
||||
|
||||
PRInt32 DeleteFileNowOrSchedule(const nsFileSpec& filename);
|
||||
PRInt32 ReplaceFileNowOrSchedule(nsFileSpec& tmpfile, nsFileSpec& target );
|
||||
|
||||
|
||||
void PerformScheduledTasks(HREG reg);
|
||||
|
||||
PR_END_EXTERN_C
|
||||
|
||||
#endif
|
||||
139
mozilla/xpinstall/src/gdiff.h
Normal file
139
mozilla/xpinstall/src/gdiff.h
Normal file
@@ -0,0 +1,139 @@
|
||||
/* -*- 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.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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*--------------------------------------------------------------
|
||||
* GDIFF.H
|
||||
*
|
||||
* Constants used in processing the GDIFF format
|
||||
*--------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "prio.h"
|
||||
#include "nsFileSpec.h"
|
||||
|
||||
#define GDIFF_MAGIC "\xD1\xFF\xD1\xFF"
|
||||
#define GDIFF_MAGIC_LEN 4
|
||||
#define GDIFF_VER 5
|
||||
#define GDIFF_EOF "\0"
|
||||
|
||||
#define GDIFF_VER_POS 4
|
||||
#define GDIFF_CS_POS 5
|
||||
#define GDIFF_CSLEN_POS 6
|
||||
|
||||
#define GDIFF_HEADERSIZE 7
|
||||
#define GDIFF_APPDATALEN 4
|
||||
|
||||
#define GDIFF_CS_NONE 0
|
||||
#define GDIFF_CS_MD5 1
|
||||
#define GDIFF_CS_SHA 2
|
||||
#define GDIFF_CS_CRC32 32
|
||||
|
||||
#define CRC32_LEN 4
|
||||
|
||||
/*--------------------------------------
|
||||
* GDIFF opcodes
|
||||
*------------------------------------*/
|
||||
#define ENDDIFF 0
|
||||
#define ADD8MAX 246
|
||||
#define ADD16 247
|
||||
#define ADD32 248
|
||||
#define COPY16BYTE 249
|
||||
#define COPY16SHORT 250
|
||||
#define COPY16LONG 251
|
||||
#define COPY32BYTE 252
|
||||
#define COPY32SHORT 253
|
||||
#define COPY32LONG 254
|
||||
#define COPY64 255
|
||||
|
||||
/* instruction sizes */
|
||||
#define ADD16SIZE 2
|
||||
#define ADD32SIZE 4
|
||||
#define COPY16BYTESIZE 3
|
||||
#define COPY16SHORTSIZE 4
|
||||
#define COPY16LONGSIZE 6
|
||||
#define COPY32BYTESIZE 5
|
||||
#define COPY32SHORTSIZE 6
|
||||
#define COPY32LONGSIZE 8
|
||||
#define COPY64SIZE 12
|
||||
|
||||
|
||||
/*--------------------------------------
|
||||
* error codes
|
||||
*------------------------------------*/
|
||||
#define GDIFF_OK 0
|
||||
#define GDIFF_ERR_UNKNOWN -1
|
||||
#define GDIFF_ERR_ARGS -2
|
||||
#define GDIFF_ERR_ACCESS -3
|
||||
#define GDIFF_ERR_MEM -4
|
||||
#define GDIFF_ERR_HEADER -5
|
||||
#define GDIFF_ERR_BADDIFF -6
|
||||
#define GDIFF_ERR_OPCODE -7
|
||||
#define GDIFF_ERR_OLDFILE -8
|
||||
#define GDIFF_ERR_CHKSUMTYPE -9
|
||||
#define GDIFF_ERR_CHECKSUM -10
|
||||
#define GDIFF_ERR_CHECKSUM_TARGET -11
|
||||
#define GDIFF_ERR_CHECKSUM_RESULT -12
|
||||
|
||||
|
||||
/*--------------------------------------
|
||||
* types
|
||||
*------------------------------------*/
|
||||
#ifndef AIX
|
||||
#ifdef OSF1
|
||||
#include <sys/types.h>
|
||||
#else
|
||||
typedef unsigned char uchar;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef struct _diffdata {
|
||||
PRFileDesc* fSrc;
|
||||
PRFileDesc* fOut;
|
||||
PRFileDesc* fDiff;
|
||||
uint8 checksumType;
|
||||
uint8 checksumLength;
|
||||
uchar* oldChecksum;
|
||||
uchar* newChecksum;
|
||||
PRBool bMacAppleSingle;
|
||||
PRBool bWin32BoundImage;
|
||||
uchar* databuf;
|
||||
uint32 bufsize;
|
||||
} DIFFDATA;
|
||||
|
||||
typedef DIFFDATA* pDIFFDATA;
|
||||
|
||||
|
||||
/*--------------------------------------
|
||||
* miscellaneous
|
||||
*------------------------------------*/
|
||||
|
||||
#define APPFLAG_W32BOUND "autoinstall:Win32PE"
|
||||
#define APPFLAG_APPLESINGLE "autoinstall:AppleSingle"
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
|
||||
106
mozilla/xpinstall/src/makefile.win
Normal file
106
mozilla/xpinstall/src/makefile.win
Normal file
@@ -0,0 +1,106 @@
|
||||
|
||||
#!nmake
|
||||
#
|
||||
# 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 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Daniel Veditz <dveditz@netscape.com>
|
||||
# Douglas Turner <dougt@netscape.com>
|
||||
|
||||
|
||||
DEPTH=..\..
|
||||
|
||||
include <$(DEPTH)/config/config.mak>
|
||||
|
||||
MAKE_OBJ_TYPE = DLL
|
||||
MODULE=xpinstal
|
||||
XPIDL_MODULE=xpinstall
|
||||
|
||||
DLL=.\$(OBJDIR)\$(MODULE).dll
|
||||
|
||||
DEFINES=-D_IMPL_NS_DOM -DWIN32_LEAN_AND_MEAN
|
||||
|
||||
LCFLAGS = \
|
||||
$(LCFLAGS) \
|
||||
$(DEFINES) \
|
||||
$(NULL)
|
||||
|
||||
|
||||
LLIBS = \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(DIST)\lib\js3250.lib \
|
||||
$(DIST)\lib\jsdombase_s.lib \
|
||||
$(DIST)\lib\jsdomevents_s.lib \
|
||||
$(DIST)\lib\zlib.lib \
|
||||
$(DIST)\lib\strres.lib \
|
||||
$(LIBNSPR) \
|
||||
$(DIST)\lib\mozreg.lib \
|
||||
$(NULL)
|
||||
|
||||
|
||||
OBJS = \
|
||||
.\$(OBJDIR)\nsInstall.obj \
|
||||
.\$(OBJDIR)\nsInstallTrigger.obj \
|
||||
.\$(OBJDIR)\nsInstallVersion.obj \
|
||||
.\$(OBJDIR)\nsInstallFolder.obj \
|
||||
.\$(OBJDIR)\nsJSInstall.obj \
|
||||
.\$(OBJDIR)\nsJSFile.obj \
|
||||
.\$(OBJDIR)\nsJSInstallTriggerGlobal.obj \
|
||||
.\$(OBJDIR)\nsJSInstallVersion.obj \
|
||||
.\$(OBJDIR)\nsSoftwareUpdate.obj \
|
||||
.\$(OBJDIR)\nsSoftwareUpdateRun.obj \
|
||||
.\$(OBJDIR)\nsInstallFile.obj \
|
||||
.\$(OBJDIR)\nsInstallDelete.obj \
|
||||
.\$(OBJDIR)\nsInstallExecute.obj \
|
||||
.\$(OBJDIR)\nsInstallPatch.obj \
|
||||
.\$(OBJDIR)\nsInstallUninstall.obj \
|
||||
.\$(OBJDIR)\nsInstallResources.obj \
|
||||
.\$(OBJDIR)\nsTopProgressNotifier.obj \
|
||||
.\$(OBJDIR)\nsLoggingProgressNotifier.obj\
|
||||
.\$(OBJDIR)\ScheduledTasks.obj \
|
||||
.\$(OBJDIR)\nsWinReg.obj \
|
||||
.\$(OBJDIR)\nsJSWinReg.obj \
|
||||
.\$(OBJDIR)\nsWinRegItem.obj \
|
||||
.\$(OBJDIR)\nsWinRegValue.obj \
|
||||
.\$(OBJDIR)\nsWinProfile.obj \
|
||||
.\$(OBJDIR)\nsJSWinProfile.obj \
|
||||
.\$(OBJDIR)\nsWinProfileItem.obj \
|
||||
.\$(OBJDIR)\nsInstallProgressDialog.obj \
|
||||
.\$(OBJDIR)\nsXPITriggerInfo.obj \
|
||||
.\$(OBJDIR)\nsXPInstallManager.obj \
|
||||
.\$(OBJDIR)\nsInstallFileOpItem.obj \
|
||||
.\$(OBJDIR)\nsWinShortcut.obj \
|
||||
.\$(OBJDIR)\nsJSFileSpecObj.obj \
|
||||
# .\$(OBJDIR)\nsUpdateNotification.obj \
|
||||
$(NULL)
|
||||
|
||||
WIN_LIBS= \
|
||||
ole32.lib \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
install:: $(DLL)
|
||||
$(MAKE_INSTALL) .\$(OBJDIR)\$(MODULE).lib $(DIST)\lib
|
||||
$(MAKE_INSTALL) .\$(OBJDIR)\$(MODULE).dll $(DIST)\bin\components
|
||||
|
||||
clobber::
|
||||
$(RM) $(DIST)\lib\$(MODULE).lib
|
||||
$(RM) $(DIST)\bin\components\$(MODULE).dll
|
||||
|
||||
744
mozilla/xpinstall/src/nsAppleSingleDecoder.cpp
Normal file
744
mozilla/xpinstall/src/nsAppleSingleDecoder.cpp
Normal file
@@ -0,0 +1,744 @@
|
||||
/* -*- 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.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) 1999
|
||||
* Netscape Communications Corporation. All Rights Reserved.
|
||||
*
|
||||
* Contributors:
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _NS_APPLESINGLEDECODER_H_
|
||||
#include "nsAppleSingleDecoder.h"
|
||||
#endif
|
||||
|
||||
#include "MoreFilesExtras.h"
|
||||
#include "MoreDesktopMgr.h"
|
||||
#include "IterateDirectory.h"
|
||||
#include "nsISupportsUtils.h"
|
||||
|
||||
/*----------------------------------------------------------------------*
|
||||
* Constructors/Destructor
|
||||
*----------------------------------------------------------------------*/
|
||||
MOZ_DECL_CTOR_COUNTER(nsAppleSingleDecoder);
|
||||
|
||||
nsAppleSingleDecoder::nsAppleSingleDecoder(FSSpec *inSpec, FSSpec *outSpec)
|
||||
: mInSpec(NULL),
|
||||
mOutSpec(NULL),
|
||||
mInRefNum(0),
|
||||
mRenameReqd(false)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsAppleSingleDecoder);
|
||||
|
||||
if (inSpec && outSpec)
|
||||
{
|
||||
/* merely point to FSSpecs, not own 'em */
|
||||
mInSpec = inSpec;
|
||||
mOutSpec = outSpec;
|
||||
}
|
||||
}
|
||||
|
||||
nsAppleSingleDecoder::nsAppleSingleDecoder()
|
||||
: mInSpec(NULL),
|
||||
mOutSpec(NULL),
|
||||
mInRefNum(0),
|
||||
mRenameReqd(false)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsAppleSingleDecoder);
|
||||
}
|
||||
|
||||
nsAppleSingleDecoder::~nsAppleSingleDecoder()
|
||||
{
|
||||
/* not freeing FSSpecs since we don't own 'em */
|
||||
MOZ_COUNT_DTOR(nsAppleSingleDecoder);
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*
|
||||
* Public methods
|
||||
*----------------------------------------------------------------------*/
|
||||
OSErr
|
||||
nsAppleSingleDecoder::Decode()
|
||||
{
|
||||
OSErr err = noErr;
|
||||
ASHeader header;
|
||||
long bytesRead = sizeof(header);
|
||||
|
||||
// param check
|
||||
if (!mInSpec || !mOutSpec)
|
||||
return paramErr;
|
||||
|
||||
// check for existence
|
||||
FSSpec tmp;
|
||||
err = FSMakeFSSpec(mInSpec->vRefNum, mInSpec->parID, mInSpec->name, &tmp);
|
||||
if (err == fnfErr)
|
||||
return err;
|
||||
|
||||
MAC_ERR_CHECK(FSpOpenDF( mInSpec, fsRdPerm, &mInRefNum ));
|
||||
MAC_ERR_CHECK(FSRead( mInRefNum, &bytesRead, &header ));
|
||||
|
||||
if ( (bytesRead != sizeof(header)) ||
|
||||
(header.magicNum != 0x00051600) ||
|
||||
(header.versionNum != 0x00020000) ||
|
||||
(header.numEntries == 0) ) // empty file?
|
||||
return -1;
|
||||
|
||||
// create the outSpec which we'll rename correctly later
|
||||
err = FSMakeFSSpec( mInSpec->vRefNum, mInSpec->parID, "\pdecode", mOutSpec );
|
||||
if (err!=noErr && err!=fnfErr)
|
||||
return err;
|
||||
MAC_ERR_CHECK(FSMakeUnique( mOutSpec ));
|
||||
MAC_ERR_CHECK(FSpCreate( mOutSpec, 'MOZZ', '????', 0 ));
|
||||
|
||||
|
||||
/* Loop through the entries, processing each.
|
||||
** Set the time/date stamps last, because otherwise they'll
|
||||
** be destroyed when we write.
|
||||
*/
|
||||
{
|
||||
Boolean hasDateEntry = false;
|
||||
ASEntry dateEntry;
|
||||
long offset;
|
||||
ASEntry entry;
|
||||
|
||||
for ( int i=0; i < header.numEntries; i++ )
|
||||
{
|
||||
offset = sizeof( ASHeader ) + sizeof( ASEntry ) * i;
|
||||
MAC_ERR_CHECK(SetFPos( mInRefNum, fsFromStart, offset ));
|
||||
|
||||
bytesRead = sizeof(entry);
|
||||
MAC_ERR_CHECK(FSRead( mInRefNum, &bytesRead, &entry ));
|
||||
if (bytesRead != sizeof(entry))
|
||||
return -1;
|
||||
|
||||
if ( entry.entryID == AS_FILEDATES )
|
||||
{
|
||||
hasDateEntry = true;
|
||||
dateEntry = entry;
|
||||
}
|
||||
else
|
||||
MAC_ERR_CHECK(ProcessASEntry( entry ));
|
||||
}
|
||||
if ( hasDateEntry )
|
||||
MAC_ERR_CHECK(ProcessASEntry( dateEntry ));
|
||||
}
|
||||
|
||||
// close the inSpec
|
||||
FSClose( mInRefNum );
|
||||
|
||||
// rename if need be
|
||||
if (mRenameReqd)
|
||||
{
|
||||
FSSpec old; // delete old version of target file
|
||||
|
||||
FSMakeFSSpec(mInSpec->vRefNum, mInSpec->parID, mInSpec->name, &old);
|
||||
MAC_ERR_CHECK(FSpDelete(&old));
|
||||
MAC_ERR_CHECK(FSpRename(mOutSpec, mInSpec->name));
|
||||
|
||||
// reflect change in outSpec
|
||||
nsAppleSingleDecoder::PLstrncpy( mOutSpec->name, mInSpec->name, mInSpec->name[0] );
|
||||
mOutSpec->name[0] = mInSpec->name[0];
|
||||
mRenameReqd = false; // XXX redundant reinit?
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::Decode(FSSpec *inSpec, FSSpec *outSpec)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
|
||||
// param check
|
||||
if (inSpec && outSpec)
|
||||
{
|
||||
mInSpec = inSpec; // reinit
|
||||
mOutSpec = outSpec;
|
||||
mRenameReqd = false;
|
||||
}
|
||||
else
|
||||
return paramErr;
|
||||
|
||||
err = Decode();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
pascal void
|
||||
DecodeDirIterateFilter(const CInfoPBRec * const cpbPtr, Boolean *quitFlag, void *yourDataPtr)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
FSSpec currFSp, outFSp;
|
||||
nsAppleSingleDecoder* thisObj = NULL;
|
||||
Boolean isDir = false;
|
||||
long dummy;
|
||||
|
||||
// param check
|
||||
if (!yourDataPtr || !cpbPtr || !quitFlag)
|
||||
return;
|
||||
|
||||
*quitFlag = false;
|
||||
|
||||
// extract 'this' -- an nsAppleSingleDecoder instance
|
||||
thisObj = (nsAppleSingleDecoder*) yourDataPtr;
|
||||
|
||||
// make an FSSpec from the CInfoPBRec*
|
||||
err = FSMakeFSSpec(cpbPtr->hFileInfo.ioVRefNum, cpbPtr->hFileInfo.ioFlParID,
|
||||
cpbPtr->hFileInfo.ioNamePtr, &currFSp);
|
||||
if (err == noErr)
|
||||
{
|
||||
FSpGetDirectoryID(&currFSp, &dummy, &isDir);
|
||||
|
||||
// if current FSSpec is file
|
||||
if (!isDir)
|
||||
{
|
||||
// if file is in AppleSingle format
|
||||
if (nsAppleSingleDecoder::IsAppleSingleFile(&currFSp))
|
||||
{
|
||||
// decode file
|
||||
thisObj->Decode(&currFSp, &outFSp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// else if current FSSpec is folder ignore
|
||||
// XXX never reached?
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::DecodeFolder(FSSpec *aFolder)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
long dummy;
|
||||
Boolean isDir = false;
|
||||
|
||||
// check that FSSpec is folder
|
||||
if (aFolder)
|
||||
{
|
||||
FSpGetDirectoryID(aFolder, &dummy, &isDir);
|
||||
if (!isDir)
|
||||
return dirNFErr;
|
||||
}
|
||||
|
||||
// recursively enumerate contents of folder (maxLevels=0 means recurse all)
|
||||
FSpIterateDirectory(aFolder, 0, DecodeDirIterateFilter, (void*)this);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
Boolean
|
||||
nsAppleSingleDecoder::IsAppleSingleFile(FSSpec *inSpec)
|
||||
{
|
||||
OSErr err;
|
||||
Boolean bAppleSingle = false;
|
||||
short inRefNum;
|
||||
UInt32 magic;
|
||||
long bytesRead = sizeof(magic);
|
||||
|
||||
// param checks
|
||||
if (!inSpec)
|
||||
return false;
|
||||
|
||||
// check for existence
|
||||
FSSpec tmp;
|
||||
err = FSMakeFSSpec(inSpec->vRefNum, inSpec->parID, inSpec->name, &tmp);
|
||||
if (err!=noErr)
|
||||
return false;
|
||||
|
||||
// open and read the magic number len bytes
|
||||
err = FSpOpenDF( inSpec, fsRdPerm, &inRefNum );
|
||||
if (err!=noErr)
|
||||
return false;
|
||||
|
||||
err = FSRead( inRefNum, &bytesRead, &magic );
|
||||
if (err!=noErr)
|
||||
return false;
|
||||
|
||||
FSClose(inRefNum);
|
||||
if (bytesRead != sizeof(magic))
|
||||
return false;
|
||||
|
||||
// check if bytes read match magic number
|
||||
bAppleSingle = (magic == 0x00051600);
|
||||
return bAppleSingle;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*
|
||||
* Private methods
|
||||
*----------------------------------------------------------------------*/
|
||||
OSErr
|
||||
nsAppleSingleDecoder::ProcessASEntry(ASEntry inEntry)
|
||||
{
|
||||
switch (inEntry.entryID)
|
||||
{
|
||||
case AS_DATA:
|
||||
return ProcessDataFork( inEntry );
|
||||
break;
|
||||
case AS_RESOURCE:
|
||||
return ProcessResourceFork( inEntry );
|
||||
break;
|
||||
case AS_REALNAME:
|
||||
ProcessRealName( inEntry );
|
||||
break;
|
||||
// return 0; // Ignore these errors in ASD <--- XXX remove
|
||||
case AS_COMMENT:
|
||||
// return ProcessComment( inEntry );
|
||||
break;
|
||||
case AS_ICONBW:
|
||||
// return ProcessIconBW( inEntry );
|
||||
break;
|
||||
case AS_ICONCOLOR:
|
||||
// return ProcessIconColor( inEntry );
|
||||
break;
|
||||
case AS_FILEDATES:
|
||||
return ProcessFileDates( inEntry );
|
||||
break;
|
||||
case AS_FINDERINFO:
|
||||
return ProcessFinderInfo( inEntry );
|
||||
break;
|
||||
case AS_MACINFO:
|
||||
return ProcessMacInfo( inEntry );
|
||||
break;
|
||||
case AS_PRODOSINFO:
|
||||
case AS_MSDOSINFO:
|
||||
case AS_AFPNAME:
|
||||
case AS_AFPINFO:
|
||||
case AS_AFPDIRID:
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::ProcessDataFork(ASEntry inEntry)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
SInt16 refNum;
|
||||
|
||||
/* Setup the files */
|
||||
err = FSpOpenDF (mOutSpec, fsWrPerm, &refNum);
|
||||
|
||||
if ( err == noErr )
|
||||
err = EntryToMacFile( inEntry, refNum );
|
||||
|
||||
FSClose( refNum );
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::ProcessResourceFork(ASEntry inEntry)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
SInt16 refNum;
|
||||
|
||||
err = FSpOpenRF(mOutSpec, fsWrPerm, &refNum);
|
||||
|
||||
if ( err == noErr )
|
||||
err = EntryToMacFile( inEntry, refNum );
|
||||
|
||||
FSClose( refNum );
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::ProcessRealName(ASEntry inEntry)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
Str255 newName;
|
||||
long bytesRead;
|
||||
|
||||
if ( inEntry.entryLength > 32 ) /* Max file name length for the Mac */
|
||||
return -1;
|
||||
|
||||
MAC_ERR_CHECK(SetFPos(mInRefNum, fsFromStart, inEntry.entryOffset));
|
||||
|
||||
bytesRead = inEntry.entryLength;
|
||||
MAC_ERR_CHECK(FSRead(mInRefNum, &bytesRead, &newName[1]));
|
||||
if (bytesRead != inEntry.entryLength)
|
||||
return -1;
|
||||
|
||||
newName[0] = inEntry.entryLength;
|
||||
err = FSpRename(mOutSpec, newName);
|
||||
if (err == dupFNErr)
|
||||
{
|
||||
// if we are trying to rename temp decode file to src name, rename later
|
||||
if (nsAppleSingleDecoder::PLstrcmp(newName, mInSpec->name))
|
||||
{
|
||||
mRenameReqd = true;
|
||||
return noErr;
|
||||
}
|
||||
|
||||
FSSpec old; // delete old version of target file
|
||||
|
||||
FSMakeFSSpec(mOutSpec->vRefNum, mOutSpec->parID, newName, &old);
|
||||
MAC_ERR_CHECK(FSpDelete(&old));
|
||||
MAC_ERR_CHECK(FSpRename(mOutSpec, newName));
|
||||
}
|
||||
nsAppleSingleDecoder::PLstrncpy( mOutSpec->name, newName, inEntry.entryLength );
|
||||
mOutSpec->name[0] = inEntry.entryLength;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::ProcessFileDates(ASEntry inEntry)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
ASFileDates dates;
|
||||
long bytesRead;
|
||||
|
||||
if ( inEntry.entryLength != sizeof(dates) ) /* Max file name length for the Mac */
|
||||
return -1;
|
||||
|
||||
MAC_ERR_CHECK(SetFPos(mInRefNum, fsFromStart, inEntry.entryOffset));
|
||||
|
||||
bytesRead = inEntry.entryLength;
|
||||
MAC_ERR_CHECK(FSRead(mInRefNum, &bytesRead, &dates));
|
||||
if (bytesRead != inEntry.entryLength)
|
||||
return -1;
|
||||
|
||||
Str31 name;
|
||||
nsAppleSingleDecoder::PLstrncpy(name, mOutSpec->name, mOutSpec->name[0]);
|
||||
name[0] = mOutSpec->name[0];
|
||||
CInfoPBRec pb;
|
||||
pb.hFileInfo.ioNamePtr = &name[0];
|
||||
pb.hFileInfo.ioVRefNum = mOutSpec->vRefNum;
|
||||
pb.hFileInfo.ioDirID = mOutSpec->parID;
|
||||
pb.hFileInfo.ioFDirIndex = 0; /* use ioNamePtr and ioDirID */
|
||||
err = PBGetCatInfoSync(&pb);
|
||||
if ( err != noErr )
|
||||
return -1;
|
||||
#define YR_2000_SECONDS 3029529600
|
||||
pb.hFileInfo.ioFlCrDat = dates.create + YR_2000_SECONDS;
|
||||
pb.hFileInfo.ioFlMdDat = dates.modify + YR_2000_SECONDS;
|
||||
pb.hFileInfo.ioFlBkDat = dates.backup + YR_2000_SECONDS;
|
||||
/* Not sure if mac has the last access time */
|
||||
|
||||
nsAppleSingleDecoder::PLstrncpy(name, mOutSpec->name, mOutSpec->name[0]);
|
||||
name[0] = mOutSpec->name[0];
|
||||
pb.hFileInfo.ioNamePtr = name;
|
||||
pb.hFileInfo.ioVRefNum = mOutSpec->vRefNum;
|
||||
pb.hFileInfo.ioDirID = mOutSpec->parID;
|
||||
pb.hFileInfo.ioFDirIndex = 0; /* use ioNamePtr and ioDirID */
|
||||
err = PBSetCatInfo(&pb, false);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::ProcessFinderInfo(ASEntry inEntry)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
ASFinderInfo info;
|
||||
long bytesRead;
|
||||
|
||||
if (inEntry.entryLength != sizeof( ASFinderInfo ))
|
||||
return -1;
|
||||
|
||||
MAC_ERR_CHECK(SetFPos(mInRefNum, fsFromStart, inEntry.entryOffset));
|
||||
|
||||
bytesRead = sizeof(info);
|
||||
MAC_ERR_CHECK(FSRead(mInRefNum, &bytesRead, &info));
|
||||
if (bytesRead != inEntry.entryLength)
|
||||
return -1;
|
||||
|
||||
err = FSpSetFInfo(mOutSpec, &info.ioFlFndrInfo);
|
||||
if (err!=noErr && err!=fnfErr)
|
||||
return err;
|
||||
|
||||
Str31 name;
|
||||
nsAppleSingleDecoder::PLstrncpy(name, mOutSpec->name, mOutSpec->name[0]);
|
||||
name[0] = mOutSpec->name[0];
|
||||
CInfoPBRec pb;
|
||||
pb.hFileInfo.ioNamePtr = name;
|
||||
pb.hFileInfo.ioVRefNum = mOutSpec->vRefNum;
|
||||
pb.hFileInfo.ioDirID = mOutSpec->parID;
|
||||
pb.hFileInfo.ioFDirIndex = 0; /* use ioNamePtr and ioDirID */
|
||||
MAC_ERR_CHECK(PBGetCatInfoSync(&pb));
|
||||
|
||||
pb.hFileInfo.ioNamePtr = name;
|
||||
pb.hFileInfo.ioVRefNum = mOutSpec->vRefNum;
|
||||
pb.hFileInfo.ioDirID = mOutSpec->parID;
|
||||
pb.hFileInfo.ioFDirIndex = 0; /* use ioNamePtr and ioDirID */
|
||||
pb.hFileInfo.ioFlXFndrInfo = info.ioFlXFndrInfo;
|
||||
err = PBSetCatInfo(&pb, false);
|
||||
|
||||
|
||||
|
||||
if (info.ioFlFndrInfo.fdType == 'APPL')
|
||||
{
|
||||
// need to register in desktop database or bad things will happen
|
||||
|
||||
DTSetAPPL( NULL,
|
||||
mOutSpec->vRefNum,
|
||||
info.ioFlFndrInfo.fdCreator,
|
||||
mOutSpec->parID,
|
||||
mOutSpec->name );
|
||||
|
||||
}
|
||||
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::ProcessMacInfo(ASEntry inEntry)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
ASMacInfo info;
|
||||
long bytesRead;
|
||||
|
||||
if (inEntry.entryLength != sizeof( ASMacInfo ))
|
||||
return -1;
|
||||
|
||||
MAC_ERR_CHECK(SetFPos(mInRefNum, fsFromStart, inEntry.entryOffset));
|
||||
|
||||
bytesRead = sizeof(info);
|
||||
MAC_ERR_CHECK(FSRead(mInRefNum, &bytesRead, &info));
|
||||
if (bytesRead != inEntry.entryLength)
|
||||
return -1;
|
||||
|
||||
Str31 name;
|
||||
nsAppleSingleDecoder::PLstrncpy(name, mOutSpec->name, mOutSpec->name[0]);
|
||||
name[0] = mOutSpec->name[0];
|
||||
CInfoPBRec pb;
|
||||
pb.hFileInfo.ioNamePtr = name;
|
||||
pb.hFileInfo.ioVRefNum = mOutSpec->vRefNum;
|
||||
pb.hFileInfo.ioDirID = mOutSpec->parID;
|
||||
pb.hFileInfo.ioFDirIndex = 0; /* use ioNamePtr and ioDirID */
|
||||
MAC_ERR_CHECK(PBGetCatInfoSync(&pb));
|
||||
|
||||
pb.hFileInfo.ioNamePtr = name;
|
||||
pb.hFileInfo.ioVRefNum = mOutSpec->vRefNum;
|
||||
pb.hFileInfo.ioDirID = mOutSpec->parID;
|
||||
pb.hFileInfo.ioFlAttrib = info.ioFlAttrib;
|
||||
err = PBSetCatInfo(&pb, false);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::EntryToMacFile(ASEntry inEntry, UInt16 inTargetSpecRefNum)
|
||||
{
|
||||
#define BUFFER_SIZE 8192
|
||||
|
||||
OSErr err = noErr;
|
||||
char buffer[BUFFER_SIZE];
|
||||
long totalRead = 0, bytesRead, bytesToWrite;
|
||||
|
||||
MAC_ERR_CHECK(SetFPos( mInRefNum, fsFromStart, inEntry.entryOffset ));
|
||||
|
||||
while ( totalRead < inEntry.entryLength )
|
||||
{
|
||||
// Should we yield in here?
|
||||
bytesRead = BUFFER_SIZE;
|
||||
err = FSRead( mInRefNum, &bytesRead, buffer );
|
||||
if (err!=noErr && err!=eofErr)
|
||||
return err;
|
||||
|
||||
if ( bytesRead <= 0 )
|
||||
return -1;
|
||||
bytesToWrite = totalRead + bytesRead > inEntry.entryLength ?
|
||||
inEntry.entryLength - totalRead :
|
||||
bytesRead;
|
||||
|
||||
totalRead += bytesRead;
|
||||
MAC_ERR_CHECK(FSWrite(inTargetSpecRefNum, &bytesToWrite, buffer));
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr DTSetAPPL(Str255 volName,
|
||||
short vRefNum,
|
||||
OSType creator,
|
||||
long applParID,
|
||||
Str255 applName)
|
||||
{
|
||||
OSErr err;
|
||||
DTPBRec *pb = NULL;
|
||||
short dtRefNum;
|
||||
short realVRefNum;
|
||||
Boolean newDTDatabase;
|
||||
/* get the real vRefnum */
|
||||
err = DetermineVRefNum(volName, vRefNum, &realVRefNum);
|
||||
if (err == noErr)
|
||||
{
|
||||
err = DTOpen(volName, vRefNum, &dtRefNum, &newDTDatabase);
|
||||
if (err == noErr && !newDTDatabase)
|
||||
{
|
||||
pb = (DTPBRec*) NewPtrClear( sizeof(DTPBRec) );
|
||||
|
||||
if (pb==NULL) return -1;
|
||||
|
||||
pb->ioNamePtr = applName;
|
||||
pb->ioDTRefNum = dtRefNum;
|
||||
pb->ioDirID = applParID;
|
||||
pb->ioFileCreator = creator;
|
||||
|
||||
err = PBDTAddAPPLSync(pb);
|
||||
|
||||
if (pb) DisposePtr((Ptr)pb);
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
OSErr
|
||||
nsAppleSingleDecoder::FSMakeUnique(FSSpec *ioSpec)
|
||||
{
|
||||
OSErr err = noErr;
|
||||
Boolean bUnique = false;
|
||||
FSSpec tmp;
|
||||
long uniqueID = 0;
|
||||
Str255 name;
|
||||
short i, j;
|
||||
unsigned char puniqueID[16];
|
||||
char *cuniqueIDPtr;
|
||||
|
||||
// grab suggested name from in-out FSSpec
|
||||
nsAppleSingleDecoder::PLstrncpy(name, ioSpec->name, ioSpec->name[0]);
|
||||
name[0] = ioSpec->name[0];
|
||||
|
||||
for (i=0; i<65536; i++) // prevent infinite loop
|
||||
{
|
||||
if (!bUnique)
|
||||
{
|
||||
err = FSMakeFSSpec( ioSpec->vRefNum, ioSpec->parID, name, &tmp );
|
||||
if (err == fnfErr)
|
||||
{
|
||||
bUnique = true;
|
||||
break;
|
||||
}
|
||||
else if (err == noErr) // file already exists
|
||||
{
|
||||
// grab suggested name from in-out FSSpec
|
||||
nsAppleSingleDecoder::PLstrncpy(name, ioSpec->name, ioSpec->name[0]);
|
||||
name[0] = ioSpec->name[0];
|
||||
|
||||
// attempt to create a new unique file name
|
||||
nsAppleSingleDecoder::PLstrncat( name, "\p-", 1 );
|
||||
|
||||
// tack on digit(s)
|
||||
cuniqueIDPtr = nsAppleSingleDecoder::ltoa(uniqueID++);
|
||||
puniqueID[0] = strlen(cuniqueIDPtr);
|
||||
for (j=0; j<strlen(cuniqueIDPtr); j++)
|
||||
{
|
||||
puniqueID[j+1] = cuniqueIDPtr[j];
|
||||
}
|
||||
|
||||
nsAppleSingleDecoder::PLstrncat( name, puniqueID, puniqueID[0] );
|
||||
DisposePtr((Ptr)cuniqueIDPtr);
|
||||
}
|
||||
else
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
// put back unique name into in-out FSSpec
|
||||
nsAppleSingleDecoder::PLstrncpy(ioSpec->name, name, name[0]);
|
||||
ioSpec->name[0] = name[0];
|
||||
|
||||
return noErr;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*
|
||||
* Utilities
|
||||
*----------------------------------------------------------------------*/
|
||||
char *
|
||||
nsAppleSingleDecoder::ltoa(long n)
|
||||
{
|
||||
char *s;
|
||||
int i, j, sign, tmp;
|
||||
|
||||
/* check sign and convert to positive to stringify numbers */
|
||||
if ( (sign = n) < 0)
|
||||
n = -n;
|
||||
i = 0;
|
||||
s = (char*) malloc(sizeof(char));
|
||||
|
||||
/* grow string as needed to add numbers from powers of 10 down till none left */
|
||||
do
|
||||
{
|
||||
s = (char*) realloc(s, (i+1)*sizeof(char));
|
||||
s[i++] = n % 10 + '0'; /* '0' or 30 is where ASCII numbers start from */
|
||||
s[i] = '\0';
|
||||
}
|
||||
while( (n /= 10) > 0);
|
||||
|
||||
/* tack on minus sign if we found earlier that this was negative */
|
||||
if (sign < 0)
|
||||
{
|
||||
s = (char*) realloc(s, (i+1)*sizeof(char));
|
||||
s[i++] = '-';
|
||||
}
|
||||
s[i] = '\0';
|
||||
|
||||
/* pop numbers (and sign) off of string to push back into right direction */
|
||||
for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
|
||||
{
|
||||
tmp = s[i];
|
||||
s[i] = s[j];
|
||||
s[j] = tmp;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
StringPtr
|
||||
nsAppleSingleDecoder::PLstrncpy(StringPtr dst, ConstStr255Param src, short max)
|
||||
{
|
||||
int srcLen = src[0];
|
||||
if (srcLen > max)
|
||||
srcLen = max;
|
||||
dst[0] = srcLen;
|
||||
memcpy(&dst[1], &src[1], srcLen);
|
||||
return dst;
|
||||
}
|
||||
|
||||
StringPtr
|
||||
nsAppleSingleDecoder::PLstrncat(StringPtr dst, ConstStr255Param src, short max)
|
||||
{
|
||||
int srcLen = src[0], dstLen = dst[0];
|
||||
if (srcLen > max)
|
||||
srcLen = max;
|
||||
dst[0] += srcLen;
|
||||
memcpy(&dst[dstLen+1], &src[1], srcLen);
|
||||
return dst;
|
||||
}
|
||||
|
||||
Boolean
|
||||
nsAppleSingleDecoder::PLstrcmp(StringPtr str1, StringPtr str2)
|
||||
{
|
||||
Boolean bEqual = true;
|
||||
|
||||
// check for same length
|
||||
if (str1[0] == str2[0])
|
||||
{
|
||||
// verify mem blocks match
|
||||
if (0 != memcmp(&str1[1], &str2[1], str1[0]))
|
||||
bEqual = false;
|
||||
}
|
||||
else
|
||||
bEqual = false;
|
||||
|
||||
return bEqual;
|
||||
}
|
||||
222
mozilla/xpinstall/src/nsAppleSingleDecoder.h
Normal file
222
mozilla/xpinstall/src/nsAppleSingleDecoder.h
Normal file
@@ -0,0 +1,222 @@
|
||||
/* -*- 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.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) 1999
|
||||
* Netscape Communications Corporation. All Rights Reserved.
|
||||
*
|
||||
* Contributors:
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*
|
||||
* Implements a simple AppleSingle decoder, as described in RFC1740
|
||||
* http://andrew2.andrew.cmu.edu/rfc/rfc1740.html
|
||||
*----------------------------------------------------------------------*/
|
||||
|
||||
#ifndef macintosh
|
||||
#error Sorry! This is Mac only functionality!
|
||||
#endif
|
||||
|
||||
#pragma options align=mac68k
|
||||
|
||||
#ifndef _NS_APPLESINGLEDECODER_H_
|
||||
#define _NS_APPLESINGLEDECODER_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <Files.h>
|
||||
#include <Errors.h>
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*
|
||||
* Struct definitions from RFC1740
|
||||
*----------------------------------------------------------------------*/
|
||||
typedef struct ASHeader /* header portion of AppleSingle */
|
||||
{
|
||||
/* AppleSingle = 0x00051600; AppleDouble = 0x00051607 */
|
||||
UInt32 magicNum; /* internal file type tag */
|
||||
UInt32 versionNum; /* format version: 2 = 0x00020000 */
|
||||
UInt8 filler[16]; /* filler, currently all bits 0 */
|
||||
UInt16 numEntries; /* number of entries which follow */
|
||||
} ASHeader ; /* ASHeader */
|
||||
|
||||
typedef struct ASEntry /* one AppleSingle entry descriptor */
|
||||
{
|
||||
UInt32 entryID; /* entry type: see list, 0 invalid */
|
||||
UInt32 entryOffset; /* offset, in octets, from beginning */
|
||||
/* of file to this entry's data */
|
||||
UInt32 entryLength; /* length of data in octets */
|
||||
} ASEntry; /* ASEntry */
|
||||
|
||||
typedef struct ASFinderInfo
|
||||
{
|
||||
FInfo ioFlFndrInfo; /* PBGetFileInfo() or PBGetCatInfo() */
|
||||
FXInfo ioFlXFndrInfo; /* PBGetCatInfo() (HFS only) */
|
||||
} ASFinderInfo; /* ASFinderInfo */
|
||||
|
||||
typedef struct ASMacInfo /* entry ID 10, Macintosh file information */
|
||||
{
|
||||
UInt8 filler[3]; /* filler, currently all bits 0 */
|
||||
UInt8 ioFlAttrib; /* PBGetFileInfo() or PBGetCatInfo() */
|
||||
} ASMacInfo;
|
||||
|
||||
typedef struct ASFileDates /* entry ID 8, file dates info */
|
||||
{
|
||||
SInt32 create; /* file creation date/time */
|
||||
SInt32 modify; /* last modification date/time */
|
||||
SInt32 backup; /* last backup date/time */
|
||||
SInt32 access; /* last access date/time */
|
||||
} ASFileDates; /* ASFileDates */
|
||||
|
||||
/* entryID list */
|
||||
#define AS_DATA 1 /* data fork */
|
||||
#define AS_RESOURCE 2 /* resource fork */
|
||||
#define AS_REALNAME 3 /* File's name on home file system */
|
||||
#define AS_COMMENT 4 /* standard Mac comment */
|
||||
#define AS_ICONBW 5 /* Mac black & white icon */
|
||||
#define AS_ICONCOLOR 6 /* Mac color icon */
|
||||
/* 7 /* not used */
|
||||
#define AS_FILEDATES 8 /* file dates; create, modify, etc */
|
||||
#define AS_FINDERINFO 9 /* Mac Finder info & extended info */
|
||||
#define AS_MACINFO 10 /* Mac file info, attributes, etc */
|
||||
#define AS_PRODOSINFO 11 /* Pro-DOS file info, attrib., etc */
|
||||
#define AS_MSDOSINFO 12 /* MS-DOS file info, attributes, etc */
|
||||
#define AS_AFPNAME 13 /* Short name on AFP server */
|
||||
#define AS_AFPINFO 14 /* AFP file info, attrib., etc */
|
||||
|
||||
#define AS_AFPDIRID 15 /* AFP directory ID */
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*
|
||||
* Macros
|
||||
*----------------------------------------------------------------------*/
|
||||
#define MAC_ERR_CHECK(_funcCall) \
|
||||
err = _funcCall; \
|
||||
if (err!=noErr) \
|
||||
return err;
|
||||
|
||||
|
||||
|
||||
class nsAppleSingleDecoder
|
||||
{
|
||||
|
||||
public:
|
||||
nsAppleSingleDecoder(FSSpec *inSpec, FSSpec *outSpec);
|
||||
nsAppleSingleDecoder();
|
||||
~nsAppleSingleDecoder();
|
||||
|
||||
/**
|
||||
* Decode
|
||||
*
|
||||
* Takes an "in" FSSpec for the source file in AppleSingle
|
||||
* format to decode and write out to an "out" FSSpec.
|
||||
* This form is used when the Decode(void) method has already
|
||||
* been invoked once and this object is reused to decode
|
||||
* another AppleSingled file: useful in iteration to avoid
|
||||
* nsAppleSingleDecoder object instantiation per file.
|
||||
*
|
||||
* @param inSpec the AppleSingled file to decode
|
||||
* @param outSpec the destination file in which the decoded
|
||||
* data was written out (empty when passed in
|
||||
* and filled on return)
|
||||
* @return err a standard MacOS OSErr where noErr means OK
|
||||
*/
|
||||
OSErr Decode(FSSpec *inSpec, FSSpec *outSpec);
|
||||
|
||||
/**
|
||||
* Decode
|
||||
*
|
||||
* Decodes the AppleSingled file passed in to the constructor
|
||||
* and writes out the decoded data to the outSpec passed to the
|
||||
* constructor.
|
||||
*
|
||||
* @return err a standard MacOS OSErr where noErr = OK
|
||||
*/
|
||||
OSErr Decode();
|
||||
|
||||
/**
|
||||
* DecodeFolder
|
||||
*
|
||||
* Traverses arbitrarily nested subdirs decoding any files
|
||||
* in AppleSingle format and leaving other files alone.
|
||||
*
|
||||
* @param aFolder the folder whose contents to decode
|
||||
* @return err a standard MacOS err (dirNFErr if invalid dir, noErr = OK)
|
||||
*/
|
||||
OSErr DecodeFolder(FSSpec *aFolder);
|
||||
|
||||
/**
|
||||
* IsAppleSingleFile
|
||||
*
|
||||
* Checks the file header to see whether this is an AppleSingle
|
||||
* version 2 file by matching the magicNum field in the header.
|
||||
*
|
||||
* @param inSpec the file to check
|
||||
* @return bAppleSingle a Boolean where true indicates this is
|
||||
* in fact an AppleSingle file
|
||||
*/
|
||||
static Boolean IsAppleSingleFile(FSSpec *inSpec);
|
||||
|
||||
/**
|
||||
* String utilities to ensure building standalone
|
||||
* since Mozilla doesn't use PLStringFuncs.
|
||||
*/
|
||||
static StringPtr PLstrncpy(StringPtr dst, ConstStr255Param src, short max);
|
||||
static StringPtr PLstrncat(StringPtr dst, ConstStr255Param src, short max);
|
||||
static Boolean PLstrcmp(StringPtr str1, StringPtr str2);
|
||||
|
||||
/**
|
||||
* ltoa -- long to ascii
|
||||
*
|
||||
* Converts a long to a C string. We allocate
|
||||
* a string of the appropriate size and the caller
|
||||
* should assume ownership of the returned pointer.
|
||||
*/
|
||||
static char *ltoa(long n);
|
||||
|
||||
private:
|
||||
FSSpec *mInSpec;
|
||||
FSSpec *mOutSpec;
|
||||
short mInRefNum; // cache since it's used through the life of one Decode cycle
|
||||
Boolean mRenameReqd;
|
||||
|
||||
OSErr ProcessASEntry(ASEntry inEntry);
|
||||
OSErr ProcessDataFork(ASEntry inEntry);
|
||||
OSErr ProcessResourceFork(ASEntry inEntry);
|
||||
OSErr ProcessRealName(ASEntry inEntry);
|
||||
OSErr ProcessFileDates(ASEntry inEntry);
|
||||
OSErr ProcessFinderInfo(ASEntry inEntry);
|
||||
OSErr ProcessMacInfo(ASEntry inEntry);
|
||||
OSErr EntryToMacFile(ASEntry inEntry, UInt16 inTargetSpecRefNum);
|
||||
|
||||
OSErr FSMakeUnique(FSSpec *ioSpec);
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
OSErr DTSetAPPL(Str255 volName,short vRefNum,OSType creator,long applParID,Str255 applName);
|
||||
pascal void
|
||||
DecodeDirIterateFilter(const CInfoPBRec * const cpbPtr, Boolean *quitFlag, void *yourDataPtr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#pragma options align=reset
|
||||
|
||||
#endif /* _NS_APPLESINGLEDECODER_H_ */
|
||||
2543
mozilla/xpinstall/src/nsInstall.cpp
Normal file
2543
mozilla/xpinstall/src/nsInstall.cpp
Normal file
File diff suppressed because it is too large
Load Diff
323
mozilla/xpinstall/src/nsInstall.h
Normal file
323
mozilla/xpinstall/src/nsInstall.h
Normal file
@@ -0,0 +1,323 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __NS_INSTALL_H__
|
||||
#define __NS_INSTALL_H__
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsISupports.h"
|
||||
|
||||
#include "jsapi.h"
|
||||
|
||||
#include "plevent.h"
|
||||
|
||||
#include "nsString.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "nsVoidArray.h"
|
||||
#include "nsHashtable.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
#include "nsSoftwareUpdate.h"
|
||||
|
||||
#include "nsInstallObject.h"
|
||||
#include "nsInstallVersion.h"
|
||||
#include "nsInstallFolder.h"
|
||||
|
||||
#include "nsIXPINotifier.h"
|
||||
|
||||
#include "nsIStringBundle.h"
|
||||
#include "nsILocale.h"
|
||||
#include "nsIEventQueueService.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIPersistentProperties.h"
|
||||
#include "nsIEnumerator.h"
|
||||
#include "nsIZipReader.h"
|
||||
|
||||
class nsInstallInfo
|
||||
{
|
||||
public:
|
||||
|
||||
nsInstallInfo( nsIFileSpec* aFile,
|
||||
const PRUnichar* aURL,
|
||||
const PRUnichar* aArgs,
|
||||
long aFlags,
|
||||
nsIXPINotifier* aNotifier);
|
||||
|
||||
virtual ~nsInstallInfo();
|
||||
|
||||
nsresult GetLocalFile(nsFileSpec& aSpec);
|
||||
|
||||
void GetURL(nsString& aURL) { aURL = mURL; }
|
||||
|
||||
void GetArguments(nsString& aArgs) { aArgs = mArgs; }
|
||||
|
||||
long GetFlags() { return mFlags; }
|
||||
|
||||
nsIXPINotifier* GetNotifier() { return mNotifier; };
|
||||
|
||||
private:
|
||||
|
||||
nsresult mError;
|
||||
|
||||
long mFlags;
|
||||
nsString mURL;
|
||||
nsString mArgs;
|
||||
|
||||
nsCOMPtr<nsIFileSpec> mFile;
|
||||
nsCOMPtr<nsIXPINotifier> mNotifier;
|
||||
};
|
||||
|
||||
#ifdef XP_PC
|
||||
#define FILESEP '\\'
|
||||
#elif defined XP_MAC
|
||||
#define FILESEP ':'
|
||||
#elif defined XP_BEOS
|
||||
#define FILESEP '/'
|
||||
#else
|
||||
#define FILESEP '/'
|
||||
#endif
|
||||
|
||||
class nsInstall
|
||||
{
|
||||
friend class nsWinReg;
|
||||
friend class nsWinProfile;
|
||||
|
||||
public:
|
||||
|
||||
enum
|
||||
{
|
||||
BAD_PACKAGE_NAME = -200,
|
||||
UNEXPECTED_ERROR = -201,
|
||||
ACCESS_DENIED = -202,
|
||||
TOO_MANY_CERTIFICATES = -203,
|
||||
NO_INSTALL_SCRIPT = -204,
|
||||
NO_CERTIFICATE = -205,
|
||||
NO_MATCHING_CERTIFICATE = -206,
|
||||
CANT_READ_ARCHIVE = -207,
|
||||
INVALID_ARGUMENTS = -208,
|
||||
ILLEGAL_RELATIVE_PATH = -209,
|
||||
USER_CANCELLED = -210,
|
||||
INSTALL_NOT_STARTED = -211,
|
||||
SILENT_MODE_DENIED = -212,
|
||||
NO_SUCH_COMPONENT = -213,
|
||||
DOES_NOT_EXIST = -214,
|
||||
READ_ONLY = -215,
|
||||
IS_DIRECTORY = -216,
|
||||
NETWORK_FILE_IS_IN_USE = -217,
|
||||
APPLE_SINGLE_ERR = -218,
|
||||
INVALID_PATH_ERR = -219,
|
||||
PATCH_BAD_DIFF = -220,
|
||||
PATCH_BAD_CHECKSUM_TARGET = -221,
|
||||
PATCH_BAD_CHECKSUM_RESULT = -222,
|
||||
UNINSTALL_FAILED = -223,
|
||||
PACKAGE_FOLDER_NOT_SET = -224,
|
||||
EXTRACTION_FAILED = -225,
|
||||
FILENAME_ALREADY_USED = -226,
|
||||
ABORT_INSTALL = -227,
|
||||
DOWNLOAD_ERROR = -228,
|
||||
SCRIPT_ERROR = -229,
|
||||
|
||||
ALREADY_EXISTS = -230,
|
||||
IS_FILE = -231,
|
||||
SOURCE_DOES_NOT_EXIST = -232,
|
||||
SOURCE_IS_DIRECTORY = -233,
|
||||
SOURCE_IS_FILE = -234,
|
||||
INSUFFICIENT_DISK_SPACE = -235,
|
||||
FILENAME_TOO_LONG = -236,
|
||||
|
||||
OUT_OF_MEMORY = -299,
|
||||
|
||||
GESTALT_UNKNOWN_ERR = -5550,
|
||||
GESTALT_INVALID_ARGUMENT = -5551,
|
||||
|
||||
SUCCESS = 0,
|
||||
REBOOT_NEEDED = 999,
|
||||
|
||||
LIMITED_INSTALL = 0,
|
||||
FULL_INSTALL = 1,
|
||||
NO_STATUS_DLG = 2,
|
||||
NO_FINALIZE_DLG = 4,
|
||||
|
||||
INSTALL_FILE_UNEXPECTED_MSG_ID = 0,
|
||||
DETAILS_REPLACE_FILE_MSG_ID = 1,
|
||||
DETAILS_INSTALL_FILE_MSG_ID = 2
|
||||
};
|
||||
|
||||
|
||||
nsInstall(nsIZipReader * theJARFile);
|
||||
virtual ~nsInstall();
|
||||
|
||||
PRInt32 SetScriptObject(void* aScriptObject);
|
||||
|
||||
PRInt32 SaveWinRegPrototype(void* aScriptObject);
|
||||
PRInt32 SaveWinProfilePrototype(void* aScriptObject);
|
||||
|
||||
JSObject* RetrieveWinRegPrototype(void);
|
||||
JSObject* RetrieveWinProfilePrototype(void);
|
||||
|
||||
PRInt32 GetUserPackageName(nsString& aUserPackageName);
|
||||
PRInt32 GetRegPackageName(nsString& aRegPackageName);
|
||||
|
||||
PRInt32 AbortInstall(PRInt32 aErrorNumber);
|
||||
|
||||
PRInt32 AddDirectory(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsInstallFolder* aFolder, const nsString& aSubdir, PRInt32 aMode, PRInt32* aReturn);
|
||||
PRInt32 AddDirectory(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsInstallFolder* aFolder, const nsString& aSubdir, PRInt32* aReturn);
|
||||
PRInt32 AddDirectory(const nsString& aRegName, const nsString& aJarSource, nsInstallFolder* aFolder, const nsString& aSubdir, PRInt32* aReturn);
|
||||
PRInt32 AddDirectory(const nsString& aJarSource, PRInt32* aReturn);
|
||||
|
||||
PRInt32 AddSubcomponent(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsInstallFolder *aFolder, const nsString& aTargetName, PRInt32 aMode, PRInt32* aReturn);
|
||||
PRInt32 AddSubcomponent(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsInstallFolder *aFolder, const nsString& aTargetName, PRInt32* aReturn);
|
||||
PRInt32 AddSubcomponent(const nsString& aRegName, const nsString& aJarSource, nsInstallFolder *aFolder, const nsString& aTargetName, PRInt32* aReturn);
|
||||
PRInt32 AddSubcomponent(const nsString& aJarSource, PRInt32* aReturn);
|
||||
|
||||
PRInt32 DeleteComponent(const nsString& aRegistryName, PRInt32* aReturn);
|
||||
PRInt32 DeleteFile(nsInstallFolder* aFolder, const nsString& aRelativeFileName, PRInt32* aReturn);
|
||||
PRInt32 DiskSpaceAvailable(const nsString& aFolder, PRInt64* aReturn);
|
||||
PRInt32 Execute(const nsString& aJarSource, const nsString& aArgs, PRInt32* aReturn);
|
||||
PRInt32 Execute(const nsString& aJarSource, PRInt32* aReturn);
|
||||
PRInt32 FinalizeInstall(PRInt32* aReturn);
|
||||
PRInt32 Gestalt(const nsString& aSelector, PRInt32* aReturn);
|
||||
|
||||
PRInt32 GetComponentFolder(const nsString& aComponentName, const nsString& aSubdirectory, nsInstallFolder** aFolder);
|
||||
PRInt32 GetComponentFolder(const nsString& aComponentName, nsInstallFolder** aFolder);
|
||||
|
||||
PRInt32 GetFolder(nsInstallFolder& aTargetFolder, const nsString& aSubdirectory, nsInstallFolder** aFolder);
|
||||
PRInt32 GetFolder(const nsString& aTargetFolder, const nsString& aSubdirectory, nsInstallFolder** aFolder);
|
||||
PRInt32 GetFolder(const nsString& aTargetFolder, nsInstallFolder** aFolder);
|
||||
|
||||
PRInt32 GetLastError(PRInt32* aReturn);
|
||||
PRInt32 GetWinProfile(const nsString& aFolder, const nsString& aFile, JSContext* jscontext, JSClass* WinProfileClass, jsval* aReturn);
|
||||
PRInt32 GetWinRegistry(JSContext* jscontext, JSClass* WinRegClass, jsval* aReturn);
|
||||
PRInt32 LoadResources(JSContext* cx, const nsString& aBaseName, jsval* aReturn);
|
||||
PRInt32 Patch(const nsString& aRegName, const nsString& aVersion, const nsString& aJarSource, nsInstallFolder* aFolder, const nsString& aTargetName, PRInt32* aReturn);
|
||||
PRInt32 Patch(const nsString& aRegName, const nsString& aJarSource, nsInstallFolder* aFolder, const nsString& aTargetName, PRInt32* aReturn);
|
||||
PRInt32 ResetError();
|
||||
PRInt32 SetPackageFolder(nsInstallFolder& aFolder);
|
||||
PRInt32 StartInstall(const nsString& aUserPackageName, const nsString& aPackageName, const nsString& aVersion, PRInt32* aReturn);
|
||||
PRInt32 Uninstall(const nsString& aPackageName, PRInt32* aReturn);
|
||||
|
||||
PRInt32 FileOpDirCreate(nsInstallFolder& aTarget, PRInt32* aReturn);
|
||||
PRInt32 FileOpDirGetParent(nsInstallFolder& aTarget, nsFileSpec* aReturn);
|
||||
PRInt32 FileOpDirRemove(nsInstallFolder& aTarget, PRInt32 aFlags, PRInt32* aReturn);
|
||||
PRInt32 FileOpDirRename(nsInstallFolder& aSrc, nsString& aTarget, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileCopy(nsInstallFolder& aSrc, nsInstallFolder& aTarget, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileDelete(nsInstallFolder& aTarget, PRInt32 aFlags, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileExists(nsInstallFolder& aTarget, PRBool* aReturn);
|
||||
PRInt32 FileOpFileExecute(nsInstallFolder& aTarget, nsString& aParams, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileGetNativeVersion(nsInstallFolder& aTarget, nsString* aReturn);
|
||||
PRInt32 FileOpFileGetDiskSpaceAvailable(nsInstallFolder& aTarget, PRInt64* aReturn);
|
||||
PRInt32 FileOpFileGetModDate(nsInstallFolder& aTarget, nsFileSpec::TimeStamp* aReturn);
|
||||
PRInt32 FileOpFileGetSize(nsInstallFolder& aTarget, PRUint32* aReturn);
|
||||
PRInt32 FileOpFileIsDirectory(nsInstallFolder& aTarget, PRBool* aReturn);
|
||||
PRInt32 FileOpFileIsFile(nsInstallFolder& aTarget, PRBool* aReturn);
|
||||
PRInt32 FileOpFileModDateChanged(nsInstallFolder& aTarget, nsFileSpec::TimeStamp& aOldStamp, PRBool* aReturn);
|
||||
PRInt32 FileOpFileMove(nsInstallFolder& aSrc, nsInstallFolder& aTarget, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileRename(nsInstallFolder& aSrc, nsString& aTarget, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileWindowsShortcut(nsFileSpec& aTarget, nsFileSpec& aShortcutPath, nsString& aDescription, nsFileSpec& aWorkingPath, nsString& aParams, nsFileSpec& aIcon, PRInt32 aIconId, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileMacAlias(nsString& aSourcePath, nsString& aAliasPath, PRInt32* aReturn);
|
||||
PRInt32 FileOpFileUnixLink(nsInstallFolder& aTarget, PRInt32 aFlags, PRInt32* aReturn);
|
||||
|
||||
void LogComment(nsString& aComment);
|
||||
|
||||
PRInt32 ExtractFileFromJar(const nsString& aJarfile, nsFileSpec* aSuggestedName, nsFileSpec** aRealName);
|
||||
char* GetResourcedString(const nsString& aResName);
|
||||
void AddPatch(nsHashKey *aKey, nsFileSpec* fileName);
|
||||
void GetPatch(nsHashKey *aKey, nsFileSpec** fileName);
|
||||
|
||||
void GetJarFileLocation(nsString& aFile);
|
||||
void SetJarFileLocation(const nsFileSpec& aFile);
|
||||
|
||||
void GetInstallArguments(nsString& args);
|
||||
void SetInstallArguments(const nsString& args);
|
||||
|
||||
void GetInstallURL(nsString& url);
|
||||
void SetInstallURL(const nsString& url);
|
||||
|
||||
PRBool GetStatusSent() { return mStatusSent; }
|
||||
PRBool InInstallTransaction(void) { return mInstalledFiles != nsnull; }
|
||||
|
||||
PRInt32 Alert(nsString& string);
|
||||
PRInt32 Confirm(nsString& string, PRBool* aReturn);
|
||||
void InternalAbort(PRInt32 errcode);
|
||||
|
||||
PRInt32 SaveError(PRInt32 errcode);
|
||||
|
||||
private:
|
||||
JSObject* mScriptObject;
|
||||
|
||||
JSObject* mWinRegObject;
|
||||
JSObject* mWinProfileObject;
|
||||
|
||||
|
||||
nsFileSpec mJarFileLocation;
|
||||
nsIZipReader* mJarFileData;
|
||||
|
||||
nsString mInstallArguments;
|
||||
nsString mInstallURL;
|
||||
nsInstallFolder* mPackageFolder;
|
||||
|
||||
PRBool mUserCancelled;
|
||||
PRBool mStatusSent;
|
||||
|
||||
PRBool mUninstallPackage;
|
||||
PRBool mRegisterPackage;
|
||||
PRBool mStartInstallCompleted;
|
||||
|
||||
nsString mRegistryPackageName; /* Name of the package we are installing */
|
||||
nsString mUIName; /* User-readable package name */
|
||||
nsInstallVersion* mVersionInfo; /* Component version info */
|
||||
|
||||
nsVoidArray* mInstalledFiles;
|
||||
nsHashtable* mPatchList;
|
||||
|
||||
nsIXPINotifier *mNotifier;
|
||||
|
||||
nsCOMPtr<nsIStringBundle> mStringBundle;
|
||||
|
||||
PRInt32 mLastError;
|
||||
|
||||
void ParseFlags(int flags);
|
||||
PRInt32 SanityCheck(void);
|
||||
void GetTime(nsString &aString);
|
||||
|
||||
|
||||
PRInt32 GetQualifiedRegName(const nsString& name, nsString& qualifiedRegName );
|
||||
PRInt32 GetQualifiedPackageName( const nsString& name, nsString& qualifiedName );
|
||||
|
||||
void CurrentUserNode(nsString& userRegNode);
|
||||
PRBool BadRegName(const nsString& regName);
|
||||
|
||||
void CleanUp();
|
||||
|
||||
PRInt32 ExtractDirEntries(const nsString& directory, nsVoidArray *paths);
|
||||
|
||||
PRInt32 ScheduleForInstall(nsInstallObject* ob);
|
||||
|
||||
static void DeleteVector(nsVoidArray* vector);
|
||||
};
|
||||
|
||||
#endif
|
||||
291
mozilla/xpinstall/src/nsInstallDelete.cpp
Normal file
291
mozilla/xpinstall/src/nsInstallDelete.cpp
Normal file
@@ -0,0 +1,291 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "prmem.h"
|
||||
|
||||
#include "nsFileSpec.h"
|
||||
|
||||
#include "VerReg.h"
|
||||
#include "ScheduledTasks.h"
|
||||
#include "nsInstallDelete.h"
|
||||
#include "nsInstallResources.h"
|
||||
|
||||
#include "nsInstall.h"
|
||||
#include "nsIDOMInstallVersion.h"
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsInstallDelete);
|
||||
|
||||
nsInstallDelete::nsInstallDelete( nsInstall* inInstall,
|
||||
nsInstallFolder* folderSpec,
|
||||
const nsString& inPartialPath,
|
||||
PRInt32 *error)
|
||||
|
||||
: nsInstallObject(inInstall)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallDelete);
|
||||
|
||||
if ((folderSpec == nsnull) || (inInstall == nsnull))
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
mDeleteStatus = DELETE_FILE;
|
||||
mFinalFile = nsnull;
|
||||
mRegistryName = "";
|
||||
|
||||
nsFileSpec* tmp = folderSpec->GetFileSpec();
|
||||
if (!tmp)
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
mFinalFile = new nsFileSpec(*tmp);
|
||||
if (mFinalFile == nsnull)
|
||||
{
|
||||
*error = nsInstall::OUT_OF_MEMORY;
|
||||
return;
|
||||
}
|
||||
|
||||
*mFinalFile += inPartialPath;
|
||||
|
||||
*error = ProcessInstallDelete();
|
||||
}
|
||||
|
||||
nsInstallDelete::nsInstallDelete( nsInstall* inInstall,
|
||||
const nsString& inComponentName,
|
||||
PRInt32 *error)
|
||||
|
||||
: nsInstallObject(inInstall)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallDelete);
|
||||
|
||||
if (inInstall == NULL)
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
mDeleteStatus = DELETE_COMPONENT;
|
||||
mFinalFile = nsnull;
|
||||
mRegistryName = inComponentName;
|
||||
|
||||
*error = ProcessInstallDelete();
|
||||
}
|
||||
|
||||
|
||||
nsInstallDelete::~nsInstallDelete()
|
||||
{
|
||||
if (mFinalFile == nsnull)
|
||||
delete mFinalFile;
|
||||
|
||||
MOZ_COUNT_DTOR(nsInstallDelete);
|
||||
}
|
||||
|
||||
|
||||
PRInt32 nsInstallDelete::Prepare()
|
||||
{
|
||||
// no set-up necessary
|
||||
return nsInstall::SUCCESS;
|
||||
}
|
||||
|
||||
PRInt32 nsInstallDelete::Complete()
|
||||
{
|
||||
PRInt32 err = nsInstall::SUCCESS;
|
||||
|
||||
if (mInstall == NULL)
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
|
||||
if (mDeleteStatus == DELETE_COMPONENT)
|
||||
{
|
||||
char* temp = mRegistryName.ToNewCString();
|
||||
if (temp)
|
||||
{
|
||||
err = VR_Remove(temp);
|
||||
Recycle(temp);
|
||||
}
|
||||
}
|
||||
|
||||
if ((mDeleteStatus == DELETE_FILE) || (err == REGERR_OK))
|
||||
{
|
||||
err = NativeComplete();
|
||||
}
|
||||
else
|
||||
{
|
||||
err = nsInstall::UNEXPECTED_ERROR;
|
||||
}
|
||||
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void nsInstallDelete::Abort()
|
||||
{
|
||||
}
|
||||
|
||||
char* nsInstallDelete::toString()
|
||||
{
|
||||
char* buffer = new char[1024];
|
||||
char* rsrcVal = nsnull;
|
||||
|
||||
if (buffer == nsnull || !mInstall)
|
||||
return nsnull;
|
||||
|
||||
if (mDeleteStatus == DELETE_COMPONENT)
|
||||
{
|
||||
char* temp = mRegistryName.ToNewCString();
|
||||
rsrcVal = mInstall->GetResourcedString("DeleteComponent");
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, temp);
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
if (temp)
|
||||
Recycle(temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mFinalFile)
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("DeleteComponent");
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, mFinalFile->GetCString());
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
PRBool
|
||||
nsInstallDelete::CanUninstall()
|
||||
{
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsInstallDelete::RegisterPackageNode()
|
||||
{
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
|
||||
PRInt32 nsInstallDelete::ProcessInstallDelete()
|
||||
{
|
||||
PRInt32 err;
|
||||
|
||||
char* tempCString = nsnull;
|
||||
|
||||
if (mDeleteStatus == DELETE_COMPONENT)
|
||||
{
|
||||
/* Check if the component is in the registry */
|
||||
tempCString = mRegistryName.ToNewCString();
|
||||
|
||||
if (tempCString == nsnull)
|
||||
return nsInstall::OUT_OF_MEMORY;
|
||||
|
||||
err = VR_InRegistry( tempCString );
|
||||
|
||||
if (err != REGERR_OK)
|
||||
{
|
||||
return err;
|
||||
}
|
||||
else
|
||||
{
|
||||
char* tempRegistryString;
|
||||
|
||||
tempRegistryString = (char*)PR_Calloc(MAXREGPATHLEN, sizeof(char));
|
||||
|
||||
if (tempRegistryString == nsnull)
|
||||
return nsInstall::OUT_OF_MEMORY;
|
||||
|
||||
err = VR_GetPath( tempCString , MAXREGPATHLEN, tempRegistryString);
|
||||
|
||||
if (err == REGERR_OK)
|
||||
{
|
||||
if (mFinalFile)
|
||||
delete mFinalFile;
|
||||
|
||||
mFinalFile = new nsFileSpec(tempRegistryString);
|
||||
|
||||
if (mFinalFile == nsnull)
|
||||
return nsInstall::OUT_OF_MEMORY;
|
||||
|
||||
}
|
||||
|
||||
PR_FREEIF(tempRegistryString);
|
||||
}
|
||||
}
|
||||
|
||||
if(tempCString)
|
||||
Recycle(tempCString);
|
||||
|
||||
if (mFinalFile->Exists())
|
||||
{
|
||||
if (mFinalFile->IsFile())
|
||||
{
|
||||
err = nsInstall::SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
err = nsInstall::IS_DIRECTORY;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
err = nsInstall::DOES_NOT_EXIST;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
PRInt32 nsInstallDelete::NativeComplete()
|
||||
{
|
||||
NS_WARN_IF_FALSE(mFinalFile->Exists(),"nsInstallDelete::Complete -- file should exist!");
|
||||
if (mFinalFile->Exists())
|
||||
{
|
||||
if (mFinalFile->IsFile())
|
||||
{
|
||||
return DeleteFileNowOrSchedule(*mFinalFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_ASSERTION(0,"nsInstallDelete::Complete -- expected file was a directory!");
|
||||
return nsInstall::IS_DIRECTORY;
|
||||
}
|
||||
}
|
||||
|
||||
return nsInstall::DOES_NOT_EXIST;
|
||||
}
|
||||
|
||||
78
mozilla/xpinstall/src/nsInstallDelete.h
Normal file
78
mozilla/xpinstall/src/nsInstallDelete.h
Normal file
@@ -0,0 +1,78 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef nsInstallDelete_h__
|
||||
#define nsInstallDelete_h__
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#include "nsInstallObject.h"
|
||||
|
||||
#include "nsInstall.h"
|
||||
|
||||
#define DELETE_COMPONENT 1
|
||||
#define DELETE_FILE 2
|
||||
|
||||
class nsInstallDelete : public nsInstallObject
|
||||
{
|
||||
public:
|
||||
|
||||
nsInstallDelete( nsInstall* inInstall,
|
||||
nsInstallFolder* folderSpec,
|
||||
const nsString& inPartialPath,
|
||||
PRInt32 *error);
|
||||
|
||||
nsInstallDelete( nsInstall* inInstall,
|
||||
const nsString& ,
|
||||
PRInt32 *error);
|
||||
|
||||
virtual ~nsInstallDelete();
|
||||
|
||||
PRInt32 Prepare();
|
||||
PRInt32 Complete();
|
||||
void Abort();
|
||||
char* toString();
|
||||
|
||||
PRBool CanUninstall();
|
||||
PRBool RegisterPackageNode();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/* Private Fields */
|
||||
|
||||
nsFileSpec* mFinalFile;
|
||||
|
||||
nsString mRegistryName;
|
||||
PRInt32 mDeleteStatus;
|
||||
|
||||
PRInt32 ProcessInstallDelete();
|
||||
PRInt32 NativeComplete();
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsInstallDelete_h__ */
|
||||
159
mozilla/xpinstall/src/nsInstallExecute.cpp
Normal file
159
mozilla/xpinstall/src/nsInstallExecute.cpp
Normal file
@@ -0,0 +1,159 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "prmem.h"
|
||||
|
||||
#include "nsFileSpec.h"
|
||||
|
||||
#include "VerReg.h"
|
||||
#include "nsInstallExecute.h"
|
||||
#include "nsInstallResources.h"
|
||||
#include "ScheduledTasks.h"
|
||||
|
||||
#include "nsInstall.h"
|
||||
#include "nsIDOMInstallVersion.h"
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsInstallExecute);
|
||||
|
||||
nsInstallExecute:: nsInstallExecute( nsInstall* inInstall,
|
||||
const nsString& inJarLocation,
|
||||
const nsString& inArgs,
|
||||
PRInt32 *error)
|
||||
|
||||
: nsInstallObject(inInstall)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallExecute);
|
||||
|
||||
if ((inInstall == nsnull) || (inJarLocation.Equals("")) )
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
mJarLocation = inJarLocation;
|
||||
mArgs = inArgs;
|
||||
mExecutableFile = nsnull;
|
||||
|
||||
}
|
||||
|
||||
|
||||
nsInstallExecute::~nsInstallExecute()
|
||||
{
|
||||
if (mExecutableFile)
|
||||
delete mExecutableFile;
|
||||
|
||||
MOZ_COUNT_DTOR(nsInstallExecute);
|
||||
}
|
||||
|
||||
|
||||
|
||||
PRInt32 nsInstallExecute::Prepare()
|
||||
{
|
||||
if (mInstall == NULL || mJarLocation.Equals(""))
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
|
||||
return mInstall->ExtractFileFromJar(mJarLocation, nsnull, &mExecutableFile);
|
||||
}
|
||||
|
||||
PRInt32 nsInstallExecute::Complete()
|
||||
{
|
||||
if (mExecutableFile == nsnull)
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
|
||||
nsFileSpec app( *mExecutableFile);
|
||||
|
||||
if (!app.Exists())
|
||||
{
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
}
|
||||
|
||||
PRInt32 result = app.Execute( mArgs );
|
||||
|
||||
DeleteFileNowOrSchedule( app );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void nsInstallExecute::Abort()
|
||||
{
|
||||
/* Get the names */
|
||||
if (mExecutableFile == nsnull)
|
||||
return;
|
||||
|
||||
DeleteFileNowOrSchedule(*mExecutableFile);
|
||||
}
|
||||
|
||||
char* nsInstallExecute::toString()
|
||||
{
|
||||
char* buffer = new char[1024];
|
||||
char* rsrcVal = nsnull;
|
||||
|
||||
if (buffer == nsnull || !mInstall)
|
||||
return nsnull;
|
||||
|
||||
// if the FileSpec is NULL, just us the in jar file name.
|
||||
|
||||
if (mExecutableFile == nsnull)
|
||||
{
|
||||
char *tempString = mJarLocation.ToNewCString();
|
||||
rsrcVal = mInstall->GetResourcedString("Execute");
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, tempString);
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
|
||||
if (tempString)
|
||||
Recycle(tempString);
|
||||
}
|
||||
else
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("Execute");
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, mExecutableFile->GetCString());
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
PRBool
|
||||
nsInstallExecute::CanUninstall()
|
||||
{
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsInstallExecute::RegisterPackageNode()
|
||||
{
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
73
mozilla/xpinstall/src/nsInstallExecute.h
Normal file
73
mozilla/xpinstall/src/nsInstallExecute.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef nsInstallExecute_h__
|
||||
#define nsInstallExecute_h__
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#include "nsInstallObject.h"
|
||||
|
||||
#include "nsInstall.h"
|
||||
#include "nsIDOMInstallVersion.h"
|
||||
|
||||
|
||||
class nsInstallExecute : public nsInstallObject
|
||||
{
|
||||
public:
|
||||
|
||||
nsInstallExecute( nsInstall* inInstall,
|
||||
const nsString& inJarLocation,
|
||||
const nsString& inArgs,
|
||||
PRInt32 *error);
|
||||
|
||||
|
||||
virtual ~nsInstallExecute();
|
||||
|
||||
PRInt32 Prepare();
|
||||
PRInt32 Complete();
|
||||
void Abort();
|
||||
char* toString();
|
||||
|
||||
PRBool CanUninstall();
|
||||
PRBool RegisterPackageNode();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
nsString mJarLocation; // Location in the JAR
|
||||
nsString mArgs; // command line arguments
|
||||
|
||||
nsFileSpec *mExecutableFile; // temporary file location
|
||||
|
||||
|
||||
PRInt32 NativeComplete(void);
|
||||
void NativeAbort(void);
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsInstallExecute_h__ */
|
||||
452
mozilla/xpinstall/src/nsInstallFile.cpp
Normal file
452
mozilla/xpinstall/src/nsInstallFile.cpp
Normal file
@@ -0,0 +1,452 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
#include "prprf.h"
|
||||
#include "nsInstallFile.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "VerReg.h"
|
||||
#include "ScheduledTasks.h"
|
||||
#include "nsInstall.h"
|
||||
#include "nsIDOMInstallVersion.h"
|
||||
#include "nsInstallResources.h"
|
||||
|
||||
/* Public Methods */
|
||||
|
||||
/* Constructor
|
||||
inInstall - softUpdate object we belong to
|
||||
inComponentName - full path of the registry component
|
||||
inVInfo - full version info
|
||||
inJarLocation - location inside the JAR file
|
||||
inFinalFileSpec - final location on disk
|
||||
*/
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsInstallFile);
|
||||
|
||||
nsInstallFile::nsInstallFile(nsInstall* inInstall,
|
||||
const nsString& inComponentName,
|
||||
const nsString& inVInfo,
|
||||
const nsString& inJarLocation,
|
||||
nsInstallFolder *folderSpec,
|
||||
const nsString& inPartialPath,
|
||||
PRInt32 mode,
|
||||
PRInt32 *error)
|
||||
: nsInstallObject(inInstall),
|
||||
mVersionInfo(nsnull),
|
||||
mJarLocation(nsnull),
|
||||
mExtractedFile(nsnull),
|
||||
mFinalFile(nsnull),
|
||||
mVersionRegistryName(nsnull),
|
||||
mReplaceFile(PR_FALSE),
|
||||
mChildFile(PR_TRUE),
|
||||
mUpgradeFile(PR_FALSE),
|
||||
mSkipInstall(PR_FALSE),
|
||||
mMode(mode)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallFile);
|
||||
|
||||
if ((folderSpec == nsnull) || (inInstall == NULL))
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
*error = nsInstall::SUCCESS;
|
||||
|
||||
/* Check for existence of the newer version */
|
||||
#if 0 // XXX need to re-implement force mode in the opposite sense
|
||||
|
||||
char* qualifiedRegNameString = inComponentName.ToNewCString();
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// we always install if forceInstall is true, or the new file's
|
||||
// version is null, or the file doesn't previously exist.
|
||||
//
|
||||
// IFF it's not force, AND the new file has a version, AND it's been
|
||||
// previously installed, THEN we have to do the version comparing foo.
|
||||
// --------------------------------------------------------------------
|
||||
if ( !(mode & INSTALL_NO_COMPARE ) && (inVInfo != "") &&
|
||||
( VR_ValidateComponent( qualifiedRegNameString ) == 0 ) )
|
||||
{
|
||||
nsInstallVersion *newVersion = new nsInstallVersion();
|
||||
|
||||
if (newVersion == nsnull)
|
||||
{
|
||||
Recycle(qualifiedRegNameString);
|
||||
*error = nsInstall::OUT_OF_MEMORY;
|
||||
return;
|
||||
}
|
||||
|
||||
newVersion->Init(inVInfo);
|
||||
|
||||
VERSION versionStruct;
|
||||
|
||||
VR_GetVersion( qualifiedRegNameString, &versionStruct );
|
||||
|
||||
nsInstallVersion* oldVersion = new nsInstallVersion();
|
||||
|
||||
if (oldVersion == nsnull)
|
||||
{
|
||||
Recycle(qualifiedRegNameString);
|
||||
delete oldVersion;
|
||||
*error = nsInstall::OUT_OF_MEMORY;
|
||||
return;
|
||||
}
|
||||
|
||||
oldVersion->Init(versionStruct.major,
|
||||
versionStruct.minor,
|
||||
versionStruct.release,
|
||||
versionStruct.build);
|
||||
|
||||
PRInt32 areTheyEqual;
|
||||
newVersion->CompareTo(oldVersion, &areTheyEqual);
|
||||
|
||||
delete oldVersion;
|
||||
delete newVersion;
|
||||
|
||||
if ( areTheyEqual < 0 )
|
||||
{
|
||||
// the file to be installed is OLDER than what is on disk.
|
||||
// Don't install it.
|
||||
mSkipInstall = PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
Recycle(qualifiedRegNameString);
|
||||
#endif
|
||||
|
||||
nsFileSpec* tmp = folderSpec->GetFileSpec();
|
||||
if (!tmp)
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
mFinalFile = new nsFileSpec(*tmp);
|
||||
if (mFinalFile == nsnull)
|
||||
{
|
||||
*error = nsInstall::OUT_OF_MEMORY;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( mFinalFile->Exists() )
|
||||
{
|
||||
// is there a file with the same name as the proposed folder?
|
||||
if ( mFinalFile->IsFile() )
|
||||
{
|
||||
*error = nsInstall::FILENAME_ALREADY_USED;
|
||||
return;
|
||||
}
|
||||
// else this directory already exists, so do nothing
|
||||
}
|
||||
else
|
||||
{
|
||||
/* the nsFileSpecMac.cpp operator += requires "this" (the nsFileSpec)
|
||||
* to be an existing dir
|
||||
*/
|
||||
int dirPermissions = 0755; // std default for UNIX, ignored otherwise
|
||||
mFinalFile->CreateDir(dirPermissions);
|
||||
}
|
||||
|
||||
*mFinalFile += inPartialPath;
|
||||
|
||||
mReplaceFile = mFinalFile->Exists();
|
||||
|
||||
if (mReplaceFile == PR_FALSE)
|
||||
{
|
||||
/* although it appears that we are creating the dir _again_ it is necessary
|
||||
* when inPartialPath has arbitrary levels of nested dirs before the leaf
|
||||
*/
|
||||
nsFileSpec parent;
|
||||
mFinalFile->GetParent(parent);
|
||||
nsFileSpec makeDirs(parent.GetCString(), PR_TRUE);
|
||||
}
|
||||
|
||||
mVersionRegistryName = new nsString(inComponentName);
|
||||
mJarLocation = new nsString(inJarLocation);
|
||||
mVersionInfo = new nsString(inVInfo);
|
||||
|
||||
if (mVersionRegistryName == nsnull ||
|
||||
mJarLocation == nsnull ||
|
||||
mVersionInfo == nsnull )
|
||||
{
|
||||
*error = nsInstall::OUT_OF_MEMORY;
|
||||
return;
|
||||
}
|
||||
|
||||
nsString regPackageName;
|
||||
mInstall->GetRegPackageName(regPackageName);
|
||||
|
||||
// determine Child status
|
||||
if ( regPackageName.IsEmpty() )
|
||||
{
|
||||
// in the "current communicator package" absolute pathnames (start
|
||||
// with slash) indicate shared files -- all others are children
|
||||
mChildFile = ( mVersionRegistryName->CharAt(0) != '/' );
|
||||
}
|
||||
else
|
||||
{
|
||||
mChildFile = mVersionRegistryName->Equals( regPackageName,
|
||||
PR_FALSE,
|
||||
regPackageName.Length() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nsInstallFile::~nsInstallFile()
|
||||
{
|
||||
if (mVersionRegistryName)
|
||||
delete mVersionRegistryName;
|
||||
|
||||
if (mJarLocation)
|
||||
delete mJarLocation;
|
||||
|
||||
if (mExtractedFile)
|
||||
delete mExtractedFile;
|
||||
|
||||
if (mFinalFile)
|
||||
delete mFinalFile;
|
||||
|
||||
if (mVersionInfo)
|
||||
delete mVersionInfo;
|
||||
|
||||
MOZ_COUNT_DTOR(nsInstallFile);
|
||||
}
|
||||
|
||||
/* Prepare
|
||||
* Extracts file out of the JAR archive
|
||||
*/
|
||||
PRInt32 nsInstallFile::Prepare()
|
||||
{
|
||||
if (mSkipInstall)
|
||||
return nsInstall::SUCCESS;
|
||||
|
||||
if (mInstall == nsnull || mFinalFile == nsnull || mJarLocation == nsnull )
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
|
||||
return mInstall->ExtractFileFromJar(*mJarLocation, mFinalFile, &mExtractedFile);
|
||||
}
|
||||
|
||||
/* Complete
|
||||
* Completes the install:
|
||||
* - move the downloaded file to the final location
|
||||
* - updates the registry
|
||||
*/
|
||||
PRInt32 nsInstallFile::Complete()
|
||||
{
|
||||
PRInt32 err;
|
||||
|
||||
if (mInstall == nsnull || mVersionRegistryName == nsnull || mFinalFile == nsnull )
|
||||
{
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
}
|
||||
|
||||
if (mSkipInstall)
|
||||
return nsInstall::SUCCESS;
|
||||
|
||||
err = CompleteFileMove();
|
||||
|
||||
if ( 0 == err || nsInstall::REBOOT_NEEDED == err )
|
||||
{
|
||||
// XXX Don't register individual files for now -- crucial performance
|
||||
// speed up on the Mac, and we'll switch uninstall schemes after beta
|
||||
|
||||
// RegisterInVersionRegistry();
|
||||
}
|
||||
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
void nsInstallFile::Abort()
|
||||
{
|
||||
if (mExtractedFile != nsnull)
|
||||
mExtractedFile->Delete(PR_FALSE);
|
||||
}
|
||||
|
||||
#define RESBUFSIZE 1024
|
||||
char* nsInstallFile::toString()
|
||||
{
|
||||
char* buffer = new char[RESBUFSIZE];
|
||||
char* rsrcVal = nsnull;
|
||||
const char* fname = nsnull;
|
||||
|
||||
if (buffer == nsnull || !mInstall)
|
||||
return nsnull;
|
||||
else
|
||||
buffer[0] = '\0';
|
||||
|
||||
if (mReplaceFile)
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("ReplaceFile");
|
||||
}
|
||||
else if (mSkipInstall)
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("SkipFile");
|
||||
}
|
||||
else
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("InstallFile");
|
||||
}
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
if (mFinalFile)
|
||||
fname = mFinalFile->GetCString();
|
||||
|
||||
PR_snprintf( buffer, RESBUFSIZE, rsrcVal, fname );
|
||||
|
||||
Recycle(rsrcVal);
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
PRInt32 nsInstallFile::CompleteFileMove()
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (mExtractedFile == nsnull)
|
||||
{
|
||||
return nsInstall::UNEXPECTED_ERROR;
|
||||
}
|
||||
|
||||
if ( *mExtractedFile == *mFinalFile )
|
||||
{
|
||||
/* No need to rename, they are the same */
|
||||
result = nsInstall::SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = ReplaceFileNowOrSchedule(*mExtractedFile, *mFinalFile );
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsInstallFile::RegisterInVersionRegistry()
|
||||
{
|
||||
int refCount;
|
||||
nsString regPackageName;
|
||||
mInstall->GetRegPackageName(regPackageName);
|
||||
|
||||
|
||||
// Register file and log for Uninstall
|
||||
|
||||
if (!mChildFile)
|
||||
{
|
||||
int found;
|
||||
if (!regPackageName.IsEmpty())
|
||||
{
|
||||
found = VR_UninstallFileExistsInList( (char*)(const char*)nsAutoCString(regPackageName) ,
|
||||
(char*)(const char*)nsAutoCString(*mVersionRegistryName));
|
||||
}
|
||||
else
|
||||
{
|
||||
found = VR_UninstallFileExistsInList( "", (char*)(const char*)nsAutoCString(*mVersionRegistryName) );
|
||||
}
|
||||
|
||||
if (found != REGERR_OK)
|
||||
mUpgradeFile = PR_FALSE;
|
||||
else
|
||||
mUpgradeFile = PR_TRUE;
|
||||
}
|
||||
else if (REGERR_OK == VR_InRegistry( (char*)(const char*)nsAutoCString(*mVersionRegistryName)))
|
||||
{
|
||||
mUpgradeFile = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
mUpgradeFile = PR_FALSE;
|
||||
}
|
||||
|
||||
if ( REGERR_OK != VR_GetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), &refCount ))
|
||||
{
|
||||
refCount = 0;
|
||||
}
|
||||
|
||||
VR_Install( (char*)(const char*)nsAutoCString(*mVersionRegistryName),
|
||||
(char*)(const char*)mFinalFile->GetNativePathCString(), // DO NOT CHANGE THIS.
|
||||
(char*)(const char*)nsAutoCString(*mVersionInfo),
|
||||
PR_FALSE );
|
||||
|
||||
if (mUpgradeFile)
|
||||
{
|
||||
if (refCount == 0)
|
||||
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), 1 );
|
||||
else
|
||||
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), refCount ); //FIX?? what should the ref count be/
|
||||
}
|
||||
else
|
||||
{
|
||||
if (refCount != 0)
|
||||
{
|
||||
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), refCount + 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mReplaceFile)
|
||||
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), 2 );
|
||||
else
|
||||
VR_SetRefCount( (char*)(const char*)nsAutoCString(*mVersionRegistryName), 1 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !mChildFile && !mUpgradeFile )
|
||||
{
|
||||
if (!regPackageName.IsEmpty())
|
||||
{
|
||||
VR_UninstallAddFileToList( (char*)(const char*)nsAutoCString(regPackageName),
|
||||
(char*)(const char*)nsAutoCString(*mVersionRegistryName));
|
||||
}
|
||||
else
|
||||
{
|
||||
VR_UninstallAddFileToList( "", (char*)(const char*)nsAutoCString(*mVersionRegistryName) );
|
||||
}
|
||||
}
|
||||
|
||||
return nsInstall::SUCCESS;
|
||||
}
|
||||
|
||||
/* CanUninstall
|
||||
* InstallFile() installs files which can be uninstalled,
|
||||
* hence this function returns true.
|
||||
*/
|
||||
PRBool
|
||||
nsInstallFile::CanUninstall()
|
||||
{
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
/* RegisterPackageNode
|
||||
* InstallFile() installs files which need to be registered,
|
||||
* hence this function returns true.
|
||||
*/
|
||||
PRBool
|
||||
nsInstallFile::RegisterPackageNode()
|
||||
{
|
||||
return PR_TRUE;
|
||||
}
|
||||
105
mozilla/xpinstall/src/nsInstallFile.h
Normal file
105
mozilla/xpinstall/src/nsInstallFile.h
Normal file
@@ -0,0 +1,105 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef nsInstallFile_h__
|
||||
#define nsInstallFile_h__
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#include "nsInstallObject.h"
|
||||
|
||||
#include "nsInstall.h"
|
||||
#include "nsInstallVersion.h"
|
||||
|
||||
|
||||
/* Global defines for file handling mode bitfield values */
|
||||
#define INSTALL_NO_COMPARE 0x1
|
||||
#define INSTALL_IF_NEWER 0x2
|
||||
#define INSTALL_IF_EQUAL_OR_NEWER 0x4
|
||||
|
||||
|
||||
class nsInstallFile : public nsInstallObject
|
||||
{
|
||||
public:
|
||||
|
||||
/*************************************************************
|
||||
* Public Methods
|
||||
*
|
||||
* Constructor
|
||||
* inSoftUpdate - softUpdate object we belong to
|
||||
* inComponentName - full path of the registry component
|
||||
* inVInfo - full version info
|
||||
* inJarLocation - location inside the JAR file
|
||||
* inFinalFileSpec - final location on disk
|
||||
*************************************************************/
|
||||
nsInstallFile( nsInstall* inInstall,
|
||||
const nsString& inVRName,
|
||||
const nsString& inVInfo,
|
||||
const nsString& inJarLocation,
|
||||
nsInstallFolder *folderSpec,
|
||||
const nsString& inPartialPath,
|
||||
PRInt32 mode,
|
||||
PRInt32 *error);
|
||||
|
||||
virtual ~nsInstallFile();
|
||||
|
||||
PRInt32 Prepare();
|
||||
PRInt32 Complete();
|
||||
void Abort();
|
||||
char* toString();
|
||||
|
||||
PRBool CanUninstall();
|
||||
PRBool RegisterPackageNode();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/* Private Fields */
|
||||
nsString* mVersionInfo; /* Version info for this file*/
|
||||
|
||||
nsString* mJarLocation; /* Location in the JAR */
|
||||
nsFileSpec* mExtractedFile; /* temporary file location */
|
||||
nsFileSpec* mFinalFile; /* final file destination */
|
||||
|
||||
nsString* mVersionRegistryName; /* full version path */
|
||||
|
||||
PRBool mForceInstall; /* whether install is forced */
|
||||
PRBool mReplaceFile; /* whether file exists */
|
||||
PRBool mChildFile; /* whether file is a child */
|
||||
PRBool mUpgradeFile; /* whether file is an upgrade */
|
||||
PRBool mSkipInstall; /* if true don't install this file */
|
||||
|
||||
PRInt32 mMode; /* an integer used like a bitfield to control *
|
||||
* how a file is installed or registered */
|
||||
|
||||
PRInt32 CompleteFileMove();
|
||||
PRInt32 RegisterInVersionRegistry();
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsInstallFile_h__ */
|
||||
42
mozilla/xpinstall/src/nsInstallFileOpEnums.h
Normal file
42
mozilla/xpinstall/src/nsInstallFileOpEnums.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/* -*- 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.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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#ifndef nsInstallFileOpEnums_h__
|
||||
#define nsInstallFileOpEnums_h__
|
||||
|
||||
typedef enum nsInstallFileOpEnums {
|
||||
NS_FOP_DIR_CREATE = 0,
|
||||
NS_FOP_DIR_REMOVE = 1,
|
||||
NS_FOP_DIR_RENAME = 2,
|
||||
NS_FOP_FILE_COPY = 3,
|
||||
NS_FOP_FILE_DELETE = 4,
|
||||
NS_FOP_FILE_EXECUTE = 5,
|
||||
NS_FOP_FILE_MOVE = 6,
|
||||
NS_FOP_FILE_RENAME = 7,
|
||||
NS_FOP_WIN_SHORTCUT = 8,
|
||||
NS_FOP_MAC_ALIAS = 9,
|
||||
NS_FOP_UNIX_LINK = 10,
|
||||
NS_FOP_FILE_SET_STAT = 11
|
||||
|
||||
} nsInstallFileOpEnums;
|
||||
|
||||
#endif /* nsInstallFileOpEnums_h__ */
|
||||
1048
mozilla/xpinstall/src/nsInstallFileOpItem.cpp
Normal file
1048
mozilla/xpinstall/src/nsInstallFileOpItem.cpp
Normal file
File diff suppressed because it is too large
Load Diff
156
mozilla/xpinstall/src/nsInstallFileOpItem.h
Normal file
156
mozilla/xpinstall/src/nsInstallFileOpItem.h
Normal file
@@ -0,0 +1,156 @@
|
||||
/* -*- 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.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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#ifndef nsInstallFileOpItem_h__
|
||||
#define nsInstallFileOpItem_h__
|
||||
|
||||
#include "prtypes.h"
|
||||
|
||||
#include "nsFileSpec.h"
|
||||
#include "nsSoftwareUpdate.h"
|
||||
#include "nsInstallObject.h"
|
||||
#include "nsInstall.h"
|
||||
|
||||
class nsInstallFileOpItem : public nsInstallObject
|
||||
{
|
||||
public:
|
||||
/* Public Fields */
|
||||
enum
|
||||
{
|
||||
ACTION_NONE = -401,
|
||||
ACTION_SUCCESS = -402,
|
||||
ACTION_FAILED = -403
|
||||
};
|
||||
|
||||
|
||||
/* Public Methods */
|
||||
// used by:
|
||||
// FileOpFileDelete()
|
||||
nsInstallFileOpItem(nsInstall* installObj,
|
||||
PRInt32 aCommand,
|
||||
nsFileSpec& aTarget,
|
||||
PRInt32 aFlags,
|
||||
PRInt32* aReturn);
|
||||
|
||||
// used by:
|
||||
// FileOpDirRemove()
|
||||
// FileOpFileCopy()
|
||||
// FileOpFileMove()
|
||||
// FileMacAlias()
|
||||
nsInstallFileOpItem(nsInstall* installObj,
|
||||
PRInt32 aCommand,
|
||||
nsFileSpec& aSrc,
|
||||
nsFileSpec& aTarget,
|
||||
PRInt32* aReturn);
|
||||
|
||||
// used by:
|
||||
// FileOpDirCreate()
|
||||
nsInstallFileOpItem(nsInstall* aInstallObj,
|
||||
PRInt32 aCommand,
|
||||
nsFileSpec& aTarget,
|
||||
PRInt32* aReturn);
|
||||
|
||||
// used by:
|
||||
// FileOpDirRename()
|
||||
// FileOpFileExecute()
|
||||
// FileOpFileRename()
|
||||
nsInstallFileOpItem(nsInstall* aInstallObj,
|
||||
PRInt32 aCommand,
|
||||
nsFileSpec& a1,
|
||||
nsString& a2,
|
||||
PRInt32* aReturn);
|
||||
|
||||
// used by:
|
||||
// WindowsShortcut()
|
||||
nsInstallFileOpItem(nsInstall* aInstallObj,
|
||||
PRInt32 aCommand,
|
||||
nsFileSpec& aTarget,
|
||||
nsFileSpec& aShortcutPath,
|
||||
nsString& aDescription,
|
||||
nsFileSpec& aWorkingPath,
|
||||
nsString& aParams,
|
||||
nsFileSpec& aIcon,
|
||||
PRInt32 aIconId,
|
||||
PRInt32* aReturn);
|
||||
|
||||
virtual ~nsInstallFileOpItem();
|
||||
|
||||
PRInt32 Prepare(void);
|
||||
PRInt32 Complete();
|
||||
char* toString();
|
||||
void Abort();
|
||||
|
||||
/* should these be protected? */
|
||||
PRBool CanUninstall();
|
||||
PRBool RegisterPackageNode();
|
||||
|
||||
private:
|
||||
|
||||
/* Private Fields */
|
||||
|
||||
nsInstall* mIObj; // initiating Install object
|
||||
nsFileSpec* mSrc;
|
||||
nsFileSpec* mTarget;
|
||||
nsFileSpec* mShortcutPath;
|
||||
nsFileSpec* mWorkingPath;
|
||||
nsFileSpec* mIcon;
|
||||
nsString* mDescription;
|
||||
nsString* mStrTarget;
|
||||
nsString* mParams;
|
||||
long mFStat;
|
||||
PRInt32 mFlags;
|
||||
PRInt32 mIconId;
|
||||
PRInt32 mCommand;
|
||||
PRInt32 mAction;
|
||||
|
||||
/* Private Methods */
|
||||
|
||||
PRInt32 NativeFileOpDirCreatePrepare();
|
||||
PRInt32 NativeFileOpDirCreateAbort();
|
||||
PRInt32 NativeFileOpDirRemovePrepare();
|
||||
PRInt32 NativeFileOpDirRemoveComplete();
|
||||
PRInt32 NativeFileOpDirRenamePrepare();
|
||||
PRInt32 NativeFileOpDirRenameComplete();
|
||||
PRInt32 NativeFileOpDirRenameAbort();
|
||||
PRInt32 NativeFileOpFileCopyPrepare();
|
||||
PRInt32 NativeFileOpFileCopyComplete();
|
||||
PRInt32 NativeFileOpFileCopyAbort();
|
||||
PRInt32 NativeFileOpFileDeletePrepare();
|
||||
PRInt32 NativeFileOpFileDeleteComplete(nsFileSpec *aTarget);
|
||||
PRInt32 NativeFileOpFileExecutePrepare();
|
||||
PRInt32 NativeFileOpFileExecuteComplete();
|
||||
PRInt32 NativeFileOpFileMovePrepare();
|
||||
PRInt32 NativeFileOpFileMoveComplete();
|
||||
PRInt32 NativeFileOpFileMoveAbort();
|
||||
PRInt32 NativeFileOpFileRenamePrepare();
|
||||
PRInt32 NativeFileOpFileRenameComplete();
|
||||
PRInt32 NativeFileOpFileRenameAbort();
|
||||
PRInt32 NativeFileOpWindowsShortcutComplete();
|
||||
PRInt32 NativeFileOpWindowsShortcutAbort();
|
||||
PRInt32 NativeFileOpMacAliasComplete();
|
||||
PRInt32 NativeFileOpMacAliasAbort();
|
||||
PRInt32 NativeFileOpUnixLink();
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsInstallFileOpItem_h__ */
|
||||
|
||||
467
mozilla/xpinstall/src/nsInstallFolder.cpp
Normal file
467
mozilla/xpinstall/src/nsInstallFolder.cpp
Normal file
@@ -0,0 +1,467 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
#include "nsInstall.h"
|
||||
#include "nsInstallFolder.h"
|
||||
|
||||
#include "nscore.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsRepository.h"
|
||||
|
||||
#include "nsString.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "nsIFileSpec.h"
|
||||
#include "nsSpecialSystemDirectory.h"
|
||||
|
||||
#include "nsFileLocations.h"
|
||||
#include "nsIFileLocator.h"
|
||||
|
||||
struct DirectoryTable
|
||||
{
|
||||
char * directoryName; /* The formal directory name */
|
||||
PRInt32 folderEnum; /* Directory ID */
|
||||
};
|
||||
|
||||
struct DirectoryTable DirectoryTable[] =
|
||||
{
|
||||
{"Plugins", 100 },
|
||||
{"Program", 101 },
|
||||
{"Communicator", 102 },
|
||||
{"User Pick", 103 },
|
||||
{"Temporary", 104 },
|
||||
{"Installed", 105 },
|
||||
{"Current User", 106 },
|
||||
{"Preferences", 107 },
|
||||
{"OS Drive", 108 },
|
||||
{"file:///", 109 },
|
||||
|
||||
{"Components", 110 },
|
||||
{"Chrome", 111 },
|
||||
|
||||
{"Win System", 200 },
|
||||
{"Windows", 201 },
|
||||
|
||||
{"Mac System", 300 },
|
||||
{"Mac Desktop", 301 },
|
||||
{"Mac Trash", 302 },
|
||||
{"Mac Startup", 303 },
|
||||
{"Mac Shutdown", 304 },
|
||||
{"Mac Apple Menu", 305 },
|
||||
{"Mac Control Panel", 306 },
|
||||
{"Mac Extension", 307 },
|
||||
{"Mac Fonts", 308 },
|
||||
{"Mac Preferences", 309 },
|
||||
{"Mac Documents", 310 },
|
||||
|
||||
{"Unix Local", 400 },
|
||||
{"Unix Lib", 401 },
|
||||
|
||||
{"", -1 }
|
||||
};
|
||||
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsInstallFolder);
|
||||
|
||||
nsInstallFolder::nsInstallFolder(const nsString& aFolderID)
|
||||
{
|
||||
nsInstallFolder( aFolderID, "" );
|
||||
}
|
||||
|
||||
nsInstallFolder::nsInstallFolder(const nsString& aFolderID, const nsString& aRelativePath)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallFolder);
|
||||
|
||||
mFileSpec = nsnull;
|
||||
|
||||
/*
|
||||
aFolderID can be either a Folder enum in which case we merely pass it
|
||||
to SetDirectoryPath, or it can be a Directory. If it is the later, it
|
||||
must already exist and of course be a directory not a file.
|
||||
*/
|
||||
|
||||
SetDirectoryPath( aFolderID, aRelativePath );
|
||||
|
||||
// check to see if that worked
|
||||
if ( !mFileSpec )
|
||||
{
|
||||
// it didn't, so aFolderID is not one of the magic strings.
|
||||
// maybe it's already a pathname? If so it had better be a directory
|
||||
// if it already exists...
|
||||
nsFileSpec dirCheck(aFolderID);
|
||||
if ( (dirCheck.Error() == NS_OK) &&
|
||||
( dirCheck.IsDirectory() || !dirCheck.Exists() ) )
|
||||
{
|
||||
mFileSpec = new nsFileSpec( dirCheck );
|
||||
|
||||
if (mFileSpec && aRelativePath.Length() > 0 )
|
||||
{
|
||||
// we've got a subdirectory to tack on
|
||||
nsString morePath(aRelativePath);
|
||||
|
||||
if ( morePath.Last() != '/' || morePath.Last() != '\\' )
|
||||
morePath += '/';
|
||||
|
||||
*mFileSpec += morePath;
|
||||
}
|
||||
|
||||
// make sure that the directory is created.
|
||||
// XXX: **why** are we creating these? they might not be used!
|
||||
nsFileSpec(mFileSpec->GetCString(), PR_TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nsInstallFolder::nsInstallFolder(nsInstallFolder& inFolder, const nsString& subString)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallFolder);
|
||||
|
||||
mFileSpec = new nsFileSpec();
|
||||
if (mFileSpec != nsnull)
|
||||
{
|
||||
*mFileSpec = *inFolder.mFileSpec;
|
||||
|
||||
if (!subString.IsEmpty())
|
||||
*mFileSpec += subString;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nsInstallFolder::~nsInstallFolder()
|
||||
{
|
||||
if (mFileSpec != nsnull)
|
||||
delete mFileSpec;
|
||||
|
||||
MOZ_COUNT_DTOR(nsInstallFolder);
|
||||
}
|
||||
|
||||
void
|
||||
nsInstallFolder::GetDirectoryPath(nsString& aDirectoryPath)
|
||||
{
|
||||
aDirectoryPath = "";
|
||||
|
||||
if (mFileSpec != nsnull)
|
||||
{
|
||||
// We want the a NATIVE path.
|
||||
aDirectoryPath.Assign(mFileSpec->GetCString());
|
||||
|
||||
if (mFileSpec->IsDirectory())
|
||||
{
|
||||
if (aDirectoryPath.Last() != FILESEP)
|
||||
aDirectoryPath.Append(FILESEP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsInstallFolder::SetDirectoryPath(const nsString& aFolderID, const nsString& aRelativePath)
|
||||
{
|
||||
if ( aFolderID.EqualsIgnoreCase("User Pick") )
|
||||
{
|
||||
PickDefaultDirectory();
|
||||
return;
|
||||
}
|
||||
else if ( aFolderID.EqualsIgnoreCase("Installed") )
|
||||
{
|
||||
// XXX block from users or remove "Installed"
|
||||
// XXX the filespec creation will fail due to unix slashes on Mac
|
||||
mFileSpec = new nsFileSpec(aRelativePath, PR_TRUE); // creates the directories to the relative path.
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
PRInt32 folderDirSpecID = MapNameToEnum(aFolderID);
|
||||
|
||||
switch (folderDirSpecID)
|
||||
{
|
||||
case 100: /////////////////////////////////////////////////////////// Plugins
|
||||
if (!nsSoftwareUpdate::GetProgramDirectory())
|
||||
{
|
||||
SetAppShellDirectory(nsSpecialFileSpec::App_PluginsDirectory );
|
||||
}
|
||||
else
|
||||
{
|
||||
mFileSpec = new nsFileSpec();
|
||||
if ( !mFileSpec )
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
else
|
||||
rv = nsSoftwareUpdate::GetProgramDirectory()->GetFileSpec(mFileSpec);
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
#ifdef XP_MAC
|
||||
*mFileSpec += "Plugins";
|
||||
#else
|
||||
*mFileSpec += "plugins";
|
||||
#endif
|
||||
}
|
||||
else
|
||||
mFileSpec = nsnull;
|
||||
}
|
||||
break;
|
||||
|
||||
case 101: /////////////////////////////////////////////////////////// Program
|
||||
case 102: /////////////////////////////////////////////////////////// Communicator
|
||||
if (!nsSoftwareUpdate::GetProgramDirectory())
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::OS_CurrentProcessDirectory ));
|
||||
else
|
||||
{
|
||||
mFileSpec = new nsFileSpec();
|
||||
if ( !mFileSpec )
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
else
|
||||
rv = nsSoftwareUpdate::GetProgramDirectory()->GetFileSpec(mFileSpec);
|
||||
|
||||
if (!NS_SUCCEEDED(rv))
|
||||
mFileSpec = nsnull;
|
||||
}
|
||||
break;
|
||||
|
||||
case 103: /////////////////////////////////////////////////////////// User Pick
|
||||
// we should never be here.
|
||||
mFileSpec = nsnull;
|
||||
break;
|
||||
|
||||
case 104: /////////////////////////////////////////////////////////// Temporary
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::OS_TemporaryDirectory ));
|
||||
break;
|
||||
|
||||
case 105: /////////////////////////////////////////////////////////// Installed
|
||||
// we should never be here.
|
||||
mFileSpec = nsnull;
|
||||
break;
|
||||
|
||||
case 106: /////////////////////////////////////////////////////////// Current User
|
||||
SetAppShellDirectory(nsSpecialFileSpec::App_UserProfileDirectory50 );
|
||||
break;
|
||||
|
||||
case 107: /////////////////////////////////////////////////////////// Preferences
|
||||
SetAppShellDirectory(nsSpecialFileSpec::App_PrefsDirectory50 );
|
||||
break;
|
||||
|
||||
case 108: /////////////////////////////////////////////////////////// OS Drive
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::OS_DriveDirectory ));
|
||||
break;
|
||||
|
||||
case 109: /////////////////////////////////////////////////////////// File URL
|
||||
{
|
||||
if (aRelativePath.IsEmpty())
|
||||
{
|
||||
mFileSpec = nsnull;
|
||||
return;
|
||||
}
|
||||
|
||||
nsString tempFileURLString = aFolderID;
|
||||
tempFileURLString += aRelativePath;
|
||||
mFileSpec = new nsFileSpec( nsFileURL(tempFileURLString) );
|
||||
|
||||
// file:// is a special case where it returns and does not
|
||||
// go to the standard relative path code below. This is
|
||||
// so that nsFile(Spec|Path) will work properly. (ie. Passing
|
||||
// just "file://" to the nsFileSpec && nsFileURL is wrong).
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 110: /////////////////////////////////////////////////////////// Components
|
||||
if (!nsSoftwareUpdate::GetProgramDirectory())
|
||||
SetAppShellDirectory(nsSpecialFileSpec::App_ComponentsDirectory );
|
||||
else
|
||||
{
|
||||
mFileSpec = new nsFileSpec();
|
||||
if ( !mFileSpec )
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
else
|
||||
rv = nsSoftwareUpdate::GetProgramDirectory()->GetFileSpec(mFileSpec);
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
#ifdef XP_MAC
|
||||
*mFileSpec += "Components";
|
||||
#else
|
||||
*mFileSpec += "components";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 111: /////////////////////////////////////////////////////////// Chrome
|
||||
if (!nsSoftwareUpdate::GetProgramDirectory())
|
||||
SetAppShellDirectory(nsSpecialFileSpec::App_ChromeDirectory );
|
||||
else
|
||||
{
|
||||
mFileSpec = new nsFileSpec();
|
||||
if ( !mFileSpec )
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
else
|
||||
rv = nsSoftwareUpdate::GetProgramDirectory()->GetFileSpec(mFileSpec);
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
#ifdef XP_MAC
|
||||
*mFileSpec += "Chrome";
|
||||
#else
|
||||
*mFileSpec += "chrome";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 200: /////////////////////////////////////////////////////////// Win System
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Win_SystemDirectory ));
|
||||
break;
|
||||
|
||||
case 201: /////////////////////////////////////////////////////////// Windows
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Win_WindowsDirectory ));
|
||||
break;
|
||||
|
||||
case 300: /////////////////////////////////////////////////////////// Mac System
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_SystemDirectory ));
|
||||
break;
|
||||
|
||||
case 301: /////////////////////////////////////////////////////////// Mac Desktop
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_DesktopDirectory ));
|
||||
break;
|
||||
|
||||
case 302: /////////////////////////////////////////////////////////// Mac Trash
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_TrashDirectory ));
|
||||
break;
|
||||
|
||||
case 303: /////////////////////////////////////////////////////////// Mac Startup
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_StartupDirectory ));
|
||||
break;
|
||||
|
||||
case 304: /////////////////////////////////////////////////////////// Mac Shutdown
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_ShutdownDirectory ));
|
||||
break;
|
||||
|
||||
case 305: /////////////////////////////////////////////////////////// Mac Apple Menu
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_AppleMenuDirectory ));
|
||||
break;
|
||||
|
||||
case 306: /////////////////////////////////////////////////////////// Mac Control Panel
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_ControlPanelDirectory ));
|
||||
break;
|
||||
|
||||
case 307: /////////////////////////////////////////////////////////// Mac Extension
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_ExtensionDirectory ));
|
||||
break;
|
||||
|
||||
case 308: /////////////////////////////////////////////////////////// Mac Fonts
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_FontsDirectory ));
|
||||
break;
|
||||
|
||||
case 309: /////////////////////////////////////////////////////////// Mac Preferences
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_PreferencesDirectory ));
|
||||
break;
|
||||
|
||||
case 310: /////////////////////////////////////////////////////////// Mac Documents
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Mac_DocumentsDirectory ));
|
||||
break;
|
||||
|
||||
case 400: /////////////////////////////////////////////////////////// Unix Local
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Unix_LocalDirectory ));
|
||||
break;
|
||||
|
||||
case 401: /////////////////////////////////////////////////////////// Unix Lib
|
||||
mFileSpec = new nsFileSpec( nsSpecialSystemDirectory( nsSpecialSystemDirectory::Unix_LibDirectory ));
|
||||
break;
|
||||
|
||||
|
||||
case -1:
|
||||
default:
|
||||
mFileSpec = nsnull;
|
||||
return;
|
||||
}
|
||||
|
||||
if (aRelativePath.Length() > 0 && mFileSpec)
|
||||
{
|
||||
nsString tempPath(aRelativePath);
|
||||
|
||||
if (aRelativePath.Last() != '/' || aRelativePath.Last() != '\\')
|
||||
tempPath += '/';
|
||||
|
||||
*mFileSpec += tempPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void nsInstallFolder::PickDefaultDirectory()
|
||||
{
|
||||
//FIX: Need to put up a dialog here and set mFileSpec
|
||||
return;
|
||||
}
|
||||
|
||||
/* MapNameToEnum
|
||||
* maps name from the directory table to its enum */
|
||||
PRInt32
|
||||
nsInstallFolder::MapNameToEnum(const nsString& name)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if ( name.Equals(""))
|
||||
return -1;
|
||||
|
||||
while ( DirectoryTable[i].directoryName[0] != 0 )
|
||||
{
|
||||
if ( name.EqualsIgnoreCase(DirectoryTable[i].directoryName) )
|
||||
return DirectoryTable[i].folderEnum;
|
||||
i++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
nsInstallFolder::SetAppShellDirectory(PRUint32 value)
|
||||
{
|
||||
nsIFileSpec* fs = NS_LocateFileOrDirectory(value);
|
||||
if ( fs )
|
||||
{
|
||||
mFileSpec = new nsFileSpec();
|
||||
fs->GetFileSpec(mFileSpec);
|
||||
NS_RELEASE(fs);
|
||||
}
|
||||
}
|
||||
|
||||
nsFileSpec*
|
||||
nsInstallFolder::GetFileSpec()
|
||||
{
|
||||
if (mFileSpec == nsnull)
|
||||
return nsnull;
|
||||
return mFileSpec;
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsInstallFolder::ToString(nsAutoString* outString)
|
||||
{
|
||||
//XXX: May need to fix. Native charset paths will be converted into Unicode when the get to JS
|
||||
// This will appear to work on Latin-1 charsets but won't work on Mac or other charsets.
|
||||
|
||||
*outString = mFileSpec->GetCString();
|
||||
return NS_OK;
|
||||
}
|
||||
61
mozilla/xpinstall/src/nsInstallFolder.h
Normal file
61
mozilla/xpinstall/src/nsInstallFolder.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __NS_INSTALLFOLDER_H__
|
||||
#define __NS_INSTALLFOLDER_H__
|
||||
|
||||
#include "nscore.h"
|
||||
#include "prtypes.h"
|
||||
|
||||
#include "nsString.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "nsSpecialSystemDirectory.h"
|
||||
|
||||
class nsInstallFolder
|
||||
{
|
||||
public:
|
||||
|
||||
nsInstallFolder(const nsString& aFolderID);
|
||||
nsInstallFolder(nsInstallFolder& inFolder, const nsString& subString);
|
||||
nsInstallFolder(const nsString& aFolderID, const nsString& aRelativePath);
|
||||
virtual ~nsInstallFolder();
|
||||
|
||||
void GetDirectoryPath(nsString& aDirectoryPath);
|
||||
nsFileSpec* GetFileSpec();
|
||||
PRInt32 ToString(nsAutoString* outString);
|
||||
|
||||
private:
|
||||
|
||||
nsFileSpec* mFileSpec;
|
||||
|
||||
void SetDirectoryPath(const nsString& aFolderID, const nsString& aRelativePath);
|
||||
void PickDefaultDirectory();
|
||||
PRInt32 MapNameToEnum(const nsString& name);
|
||||
void SetAppShellDirectory(PRUint32 value);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
57
mozilla/xpinstall/src/nsInstallObject.h
Normal file
57
mozilla/xpinstall/src/nsInstallObject.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/* -*- 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.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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#ifndef nsInstallObject_h__
|
||||
#define nsInstallObject_h__
|
||||
|
||||
#include "prtypes.h"
|
||||
|
||||
class nsInstall;
|
||||
|
||||
class nsInstallObject
|
||||
{
|
||||
public:
|
||||
/* Public Methods */
|
||||
nsInstallObject(nsInstall* inInstall) {mInstall = inInstall; }
|
||||
virtual ~nsInstallObject() {}
|
||||
|
||||
/* Override with your set-up action */
|
||||
virtual PRInt32 Prepare() = 0;
|
||||
|
||||
/* Override with your Completion action */
|
||||
virtual PRInt32 Complete() = 0;
|
||||
|
||||
/* Override with an explanatory string for the progress dialog */
|
||||
virtual char* toString() = 0;
|
||||
|
||||
/* Override with your clean-up function */
|
||||
virtual void Abort() = 0;
|
||||
|
||||
/* should these be protected? */
|
||||
virtual PRBool CanUninstall() = 0;
|
||||
virtual PRBool RegisterPackageNode() = 0;
|
||||
|
||||
protected:
|
||||
nsInstall* mInstall;
|
||||
};
|
||||
|
||||
#endif /* nsInstallObject_h__ */
|
||||
1253
mozilla/xpinstall/src/nsInstallPatch.cpp
Normal file
1253
mozilla/xpinstall/src/nsInstallPatch.cpp
Normal file
File diff suppressed because it is too large
Load Diff
83
mozilla/xpinstall/src/nsInstallPatch.h
Normal file
83
mozilla/xpinstall/src/nsInstallPatch.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/* -*- 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.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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#ifndef nsInstallPatch_h__
|
||||
#define nsInstallPatch_h__
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#include "nsInstallObject.h"
|
||||
|
||||
#include "nsInstall.h"
|
||||
#include "nsInstallFolder.h"
|
||||
#include "nsInstallVersion.h"
|
||||
|
||||
|
||||
class nsInstallPatch : public nsInstallObject
|
||||
{
|
||||
public:
|
||||
|
||||
nsInstallPatch( nsInstall* inInstall,
|
||||
const nsString& inVRName,
|
||||
const nsString& inVInfo,
|
||||
const nsString& inJarLocation,
|
||||
nsInstallFolder* folderSpec,
|
||||
const nsString& inPartialPath,
|
||||
PRInt32 *error);
|
||||
|
||||
nsInstallPatch( nsInstall* inInstall,
|
||||
const nsString& inVRName,
|
||||
const nsString& inVInfo,
|
||||
const nsString& inJarLocation,
|
||||
PRInt32 *error);
|
||||
|
||||
virtual ~nsInstallPatch();
|
||||
|
||||
PRInt32 Prepare();
|
||||
PRInt32 Complete();
|
||||
void Abort();
|
||||
char* toString();
|
||||
|
||||
PRBool CanUninstall();
|
||||
PRBool RegisterPackageNode();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
|
||||
nsInstallVersion *mVersionInfo;
|
||||
|
||||
nsFileSpec *mTargetFile;
|
||||
nsFileSpec *mPatchFile;
|
||||
nsFileSpec *mPatchedFile;
|
||||
|
||||
nsString *mJarLocation;
|
||||
nsString *mRegistryName;
|
||||
|
||||
|
||||
|
||||
PRInt32 NativePatch(const nsFileSpec &sourceFile, const nsFileSpec &patchfile, nsFileSpec **newFile);
|
||||
void* HashFilePath(const nsFilePath& aPath);
|
||||
};
|
||||
|
||||
#endif /* nsInstallPatch_h__ */
|
||||
364
mozilla/xpinstall/src/nsInstallProgressDialog.cpp
Normal file
364
mozilla/xpinstall/src/nsInstallProgressDialog.cpp
Normal file
@@ -0,0 +1,364 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
* Pierre Phaneuf <pp@ludusdesign.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "nsIXPINotifier.h"
|
||||
#include "nsInstallProgressDialog.h"
|
||||
|
||||
#include "nsIAppShellComponentImpl.h"
|
||||
|
||||
|
||||
#include "nsIDOMWindow.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIDocumentViewer.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsIContentViewer.h"
|
||||
#include "nsIDOMElement.h"
|
||||
#include "nsNetUtil.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsIWebShell.h"
|
||||
#include "nsIWebShellWindow.h"
|
||||
#include "nsPIXPIManagerCallbacks.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID( kAppShellServiceCID, NS_APPSHELL_SERVICE_CID );
|
||||
|
||||
static NS_DEFINE_CID(kDialogParamBlockCID, NS_DialogParamBlock_CID);
|
||||
|
||||
nsInstallProgressDialog::nsInstallProgressDialog(nsPIXPIManagerCallbacks *aManager)
|
||||
: mManager(aManager)
|
||||
{
|
||||
NS_INIT_ISUPPORTS();
|
||||
}
|
||||
|
||||
nsInstallProgressDialog::~nsInstallProgressDialog()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
NS_IMPL_ADDREF( nsInstallProgressDialog );
|
||||
NS_IMPL_RELEASE( nsInstallProgressDialog );
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::QueryInterface(REFNSIID aIID,void** aInstancePtr)
|
||||
{
|
||||
if (aInstancePtr == NULL) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aInstancePtr = NULL;
|
||||
|
||||
if (aIID.Equals(NS_GET_IID(nsIXPINotifier))) {
|
||||
*aInstancePtr = (void*) ((nsIXPINotifier*)this);
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(NS_GET_IID(nsIXPIProgressDlg))) {
|
||||
*aInstancePtr = (void*) ((nsIXPIProgressDlg*)this);
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aInstancePtr = (void*) (nsISupports*)((nsIXPINotifier*)this);
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::BeforeJavascriptEvaluation(const PRUnichar *URL)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::AfterJavascriptEvaluation(const PRUnichar *URL)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::InstallStarted(const PRUnichar *URL, const PRUnichar *UIPackageName)
|
||||
{
|
||||
return SetHeading( UIPackageName );
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::ItemScheduled(const PRUnichar *message)
|
||||
{
|
||||
return SetActionText( message );
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::FinalizeProgress(const PRUnichar *message, PRInt32 itemNum, PRInt32 totNum)
|
||||
{
|
||||
|
||||
nsresult rv = SetActionText( message );
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = SetProgress( itemNum, totNum, 'n' );
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::FinalStatus(const PRUnichar *URL, PRInt32 status)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::LogComment(const PRUnichar* comment)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::Open(nsIDialogParamBlock* ioParamBlock)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
// Now do the stuff to create a window and pass the JS args to it.
|
||||
NS_WITH_SERVICE(nsIAppShellService, appShell, kAppShellServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED( rv ) )
|
||||
{
|
||||
nsCOMPtr<nsIDOMWindow> hiddenWindow;
|
||||
JSContext* jsContext;
|
||||
rv = appShell->GetHiddenWindowAndJSContext( getter_AddRefs(hiddenWindow), &jsContext);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
nsCOMPtr<nsPIXPIManagerCallbacks> mgr = do_QueryInterface(mManager);
|
||||
|
||||
void* stackPtr;
|
||||
jsval *argv = JS_PushArguments( jsContext,
|
||||
&stackPtr,
|
||||
"sss%ip%ip",
|
||||
"chrome://xpinstall/content/xpistatus.xul",
|
||||
"_blank",
|
||||
"chrome",
|
||||
(const nsIID*)&NS_GET_IID(nsIDialogParamBlock),
|
||||
(nsISupports*)ioParamBlock,
|
||||
(const nsIID*)&NS_GET_IID(nsPIXPIManagerCallbacks),
|
||||
(nsISupports*)mgr
|
||||
);
|
||||
if (argv)
|
||||
{
|
||||
rv = hiddenWindow->OpenDialog( jsContext,
|
||||
argv,
|
||||
5,
|
||||
getter_AddRefs( mWindow ));
|
||||
}
|
||||
|
||||
JS_PopArguments( jsContext, stackPtr);
|
||||
}
|
||||
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::Close()
|
||||
{
|
||||
mWindow->Close();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::SetTitle(const PRUnichar * aTitle)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::SetHeading(const PRUnichar * aHeading)
|
||||
{
|
||||
return setDlgAttribute( "dialog.uiPackageName", "value", nsString(aHeading) );
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::SetActionText(const PRUnichar * aActionText)
|
||||
{
|
||||
const PRInt32 maxChars = 50;
|
||||
|
||||
nsString theMessage(aActionText);
|
||||
PRInt32 len = theMessage.Length();
|
||||
if (len > maxChars)
|
||||
{
|
||||
PRInt32 offset = (len/2) - ((len - maxChars)/2);
|
||||
PRInt32 count = (len - maxChars);
|
||||
theMessage.Cut(offset, count);
|
||||
theMessage.Insert(nsString("..."), offset);
|
||||
}
|
||||
|
||||
return setDlgAttribute( "dialog.currentAction", "value", theMessage );
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::SetProgress(PRInt32 aValue, PRInt32 aMax, char mode)
|
||||
{
|
||||
char buf[16];
|
||||
static char modeFlag = 'n';
|
||||
nsresult rv;
|
||||
static PRInt32 previousMax;
|
||||
|
||||
//First check to see if the max value changed so we don't
|
||||
//have to send a max value across the proxy every time.
|
||||
if ( aMax != previousMax)
|
||||
{
|
||||
previousMax = aMax;
|
||||
|
||||
PR_snprintf( buf, sizeof buf, "%lu", aMax );
|
||||
rv = setDlgAttribute( "dialog.progress", "max", buf );
|
||||
}
|
||||
|
||||
//I use this modeFlag business so I don't have to send
|
||||
//progressmeter mode information across the proxy every time.
|
||||
if ( mode != modeFlag )
|
||||
{
|
||||
modeFlag = mode;
|
||||
if ( modeFlag == 'n' )
|
||||
rv = setDlgAttribute( "dialog.progress", "mode", "normal");
|
||||
else
|
||||
rv = setDlgAttribute( "dialog.progress", "mode", "undetermined");
|
||||
}
|
||||
|
||||
if ( NS_SUCCEEDED(rv))
|
||||
{
|
||||
if (aMax != 0)
|
||||
PR_snprintf( buf, sizeof buf, "%lu", 100 * aValue/aMax );
|
||||
else
|
||||
PR_snprintf( buf, sizeof buf, "%lu", 0 );
|
||||
|
||||
rv = setDlgAttribute( "dialog.progress", "value", buf );
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::StartInstallPhase()
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
// don't care if this fails
|
||||
setDlgAttribute("dialog.cancel", "disabled", nsString("true"));
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallProgressDialog::GetCancelStatus(PRBool *_retval)
|
||||
{
|
||||
*_retval = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Utility to set element attribute.
|
||||
nsresult nsInstallProgressDialog::setDlgAttribute( const char *id,
|
||||
const char *name,
|
||||
const nsString &value )
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (!mDocument)
|
||||
{
|
||||
nsCOMPtr<nsIDOMDocument> doc;
|
||||
rv = mWindow->GetDocument( getter_AddRefs(doc) );
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
mDocument = do_QueryInterface(doc,&rv);
|
||||
}
|
||||
NS_WARN_IF_FALSE(rv == NS_OK,"couldn't get nsIDOMXULDocument from nsXPIProgressDlg");
|
||||
}
|
||||
|
||||
if ( mDocument ) {
|
||||
// Find specified element.
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mDocument->GetElementById( id, getter_AddRefs( elem ) );
|
||||
if ( elem ) {
|
||||
// Set the text attribute.
|
||||
rv = elem->SetAttribute( name, value );
|
||||
if ( NS_SUCCEEDED( rv ) ) {
|
||||
} else {
|
||||
DEBUG_PRINTF( PR_STDOUT, "%s %d: SetAttribute failed, rv=0x%X\n",
|
||||
__FILE__, (int)__LINE__, (int)rv );
|
||||
}
|
||||
} else {
|
||||
DEBUG_PRINTF( PR_STDOUT, "%s %d: GetElementById failed, rv=0x%X\n",
|
||||
__FILE__, (int)__LINE__, (int)rv );
|
||||
}
|
||||
} else {
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Utility to get element attribute.
|
||||
nsresult nsInstallProgressDialog::getDlgAttribute( const char *id,
|
||||
const char *name,
|
||||
nsString &value )
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (!mDocument)
|
||||
{
|
||||
nsCOMPtr<nsIDOMDocument> doc;
|
||||
rv = mWindow->GetDocument( getter_AddRefs(doc) );
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
mDocument = do_QueryInterface(doc,&rv);
|
||||
}
|
||||
NS_WARN_IF_FALSE(rv == NS_OK,"couldn't get nsIDOMXULDocument from nsXPIProgressDlg");
|
||||
}
|
||||
|
||||
if ( mDocument ) {
|
||||
// Find specified element.
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mDocument->GetElementById( id, getter_AddRefs( elem ) );
|
||||
if ( elem ) {
|
||||
// Set the text attribute.
|
||||
rv = elem->GetAttribute( name, value );
|
||||
if ( NS_SUCCEEDED( rv ) ) {
|
||||
} else {
|
||||
DEBUG_PRINTF( PR_STDOUT, "%s %d: GetAttribute failed, rv=0x%X\n",
|
||||
__FILE__, (int)__LINE__, (int)rv );
|
||||
}
|
||||
} else {
|
||||
DEBUG_PRINTF( PR_STDOUT, "%s %d: GetElementById failed, rv=0x%X\n",
|
||||
__FILE__, (int)__LINE__, (int)rv );
|
||||
}
|
||||
} else {
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
72
mozilla/xpinstall/src/nsInstallProgressDialog.h
Normal file
72
mozilla/xpinstall/src/nsInstallProgressDialog.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
#ifndef __nsInstallProgressDialog_h__
|
||||
#define __nsInstallProgressDialog_h__
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsIXPINotifier.h"
|
||||
#include "nsIXPIProgressDlg.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsISupportsUtils.h"
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
#include "nsIWebShell.h"
|
||||
#include "nsIWebShellWindow.h"
|
||||
#include "nsPIXPIManagerCallbacks.h"
|
||||
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIDOMWindow.h"
|
||||
#include "nsIDOMDocument.h"
|
||||
#include "nsIDOMXULDocument.h"
|
||||
|
||||
|
||||
class nsInstallProgressDialog : public nsIXPINotifier,
|
||||
public nsIXPIProgressDlg
|
||||
{
|
||||
public:
|
||||
|
||||
nsInstallProgressDialog(nsPIXPIManagerCallbacks *aManager);
|
||||
virtual ~nsInstallProgressDialog();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// implement nsIXPINotifier
|
||||
NS_DECL_NSIXPINOTIFIER
|
||||
|
||||
// implement nsIXPIProgressDlg
|
||||
NS_DECL_NSIXPIPROGRESSDLG
|
||||
|
||||
// void SetWindow(nsISupports* aWindow);
|
||||
|
||||
protected:
|
||||
nsresult setDlgAttribute(const char *id, const char *name, const nsString &value);
|
||||
nsresult getDlgAttribute(const char *id, const char *name, nsString &value);
|
||||
|
||||
private:
|
||||
nsPIXPIManagerCallbacks* mManager;
|
||||
nsCOMPtr<nsIDOMXULDocument> mDocument; // Should this be a weak reference?
|
||||
nsCOMPtr<nsIDOMWindow> mWindow; // Should this be a weak reference?
|
||||
};
|
||||
#endif
|
||||
83
mozilla/xpinstall/src/nsInstallResources.cpp
Normal file
83
mozilla/xpinstall/src/nsInstallResources.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "nscore.h"
|
||||
#include "nsInstallResources.h"
|
||||
|
||||
static nsXPIResourceTableItem XPIResTable[] =
|
||||
{
|
||||
/*---------------------------------------------------------------------*
|
||||
* Install Actions
|
||||
*---------------------------------------------------------------------*/
|
||||
{ "InstallFile", "Installing: %s" },
|
||||
{ "ReplaceFile", "Replacing: %s" },
|
||||
{ "SkipFile", "Skipping: %s" },
|
||||
{ "DeleteFile", "Deleting file: %s" },
|
||||
{ "DeleteComponent", "Deleting component: %s" },
|
||||
{ "Execute", "Executing: %s" },
|
||||
{ "ExecuteWithArgs", "Executing: %s with argument: %s" },
|
||||
{ "Patch", "Patching: %s" },
|
||||
{ "Uninstall", "Uninstalling: %s" },
|
||||
|
||||
// XXX FileOp*() action strings
|
||||
// XXX WinReg and WinProfile action strings
|
||||
|
||||
/*---------------------------------------------------------------------*
|
||||
* Dialog Messages
|
||||
*---------------------------------------------------------------------*/
|
||||
{ "FinishingInstallMsg", "Finishing install... please wait." },
|
||||
|
||||
/*---------------------------------------------------------------------*
|
||||
* Miscellaneous
|
||||
*---------------------------------------------------------------------*/
|
||||
{ "ERROR", "ERROR" },
|
||||
|
||||
{ NS_XPI_EOT, "" }
|
||||
};
|
||||
|
||||
char*
|
||||
nsInstallResources::GetDefaultVal(const char* aResName)
|
||||
{
|
||||
char *currResName = XPIResTable[0].resName;
|
||||
char *currResVal = nsnull;
|
||||
PRInt32 idx, len = 0;
|
||||
|
||||
for (idx = 0; 0 != strcmp(currResName, NS_XPI_EOT); idx++)
|
||||
{
|
||||
currResName = XPIResTable[idx].resName;
|
||||
len = strlen(currResName);
|
||||
|
||||
if (0 == strncmp(currResName, aResName, len))
|
||||
{
|
||||
currResVal = XPIResTable[idx].defaultString;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return currResVal;
|
||||
}
|
||||
|
||||
48
mozilla/xpinstall/src/nsInstallResources.h
Normal file
48
mozilla/xpinstall/src/nsInstallResources.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
* Samir Gehani <sgehani@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __NS_INSTALLRESOURCES_H__
|
||||
#define __NS_INSTALLRESOURCES_H__
|
||||
|
||||
#define NS_XPI_EOT "___END_OF_TABLE___"
|
||||
|
||||
typedef struct _nsXPIResourceTableItem
|
||||
{
|
||||
char *resName;
|
||||
char *defaultString;
|
||||
} nsXPIResourceTableItem;
|
||||
|
||||
|
||||
class nsInstallResources
|
||||
{
|
||||
public:
|
||||
|
||||
static char* GetDefaultVal(const char* aResName);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
489
mozilla/xpinstall/src/nsInstallTrigger.cpp
Normal file
489
mozilla/xpinstall/src/nsInstallTrigger.cpp
Normal file
@@ -0,0 +1,489 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#include "nsSoftwareUpdate.h"
|
||||
#include "nsXPInstallManager.h"
|
||||
#include "nsInstallTrigger.h"
|
||||
#include "nsInstallVersion.h"
|
||||
#include "nsIDOMInstallTriggerGlobal.h"
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsIFactory.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsIScriptGlobalObject.h"
|
||||
|
||||
#include "nsIPref.h"
|
||||
|
||||
#include "nsRepository.h"
|
||||
#include "nsIServiceManager.h"
|
||||
|
||||
#include "nsSpecialSystemDirectory.h"
|
||||
|
||||
#include "VerReg.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
||||
|
||||
static NS_DEFINE_IID(kIInstallTrigger_IID, NS_IDOMINSTALLTRIGGERGLOBAL_IID);
|
||||
static NS_DEFINE_IID(kIInstallTrigger_CID, NS_SoftwareUpdateInstallTrigger_CID);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
nsInstallTrigger::nsInstallTrigger()
|
||||
{
|
||||
mScriptObject = nsnull;
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsInstallTrigger::~nsInstallTrigger()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::QueryInterface(REFNSIID aIID,void** aInstancePtr)
|
||||
{
|
||||
if (aInstancePtr == NULL)
|
||||
{
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aInstancePtr = NULL;
|
||||
|
||||
if ( aIID.Equals(kIScriptObjectOwnerIID))
|
||||
{
|
||||
*aInstancePtr = (void*) ((nsIScriptObjectOwner*)this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
else if ( aIID.Equals(kIInstallTrigger_IID) )
|
||||
{
|
||||
*aInstancePtr = (void*) ((nsIDOMInstallTriggerGlobal*)this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
else if ( aIID.Equals(kISupportsIID) )
|
||||
{
|
||||
*aInstancePtr = (void*)(nsISupports*)(nsIScriptObjectOwner*)this;
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsInstallTrigger)
|
||||
NS_IMPL_RELEASE(nsInstallTrigger)
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aScriptObject, "null arg");
|
||||
nsresult res = NS_OK;
|
||||
|
||||
if (nsnull == mScriptObject)
|
||||
{
|
||||
nsIScriptGlobalObject *global = aContext->GetGlobalObject();
|
||||
|
||||
res = NS_NewScriptInstallTriggerGlobal( aContext,
|
||||
(nsISupports *)(nsIDOMInstallTriggerGlobal*)this,
|
||||
(nsISupports *)global,
|
||||
&mScriptObject);
|
||||
NS_IF_RELEASE(global);
|
||||
|
||||
}
|
||||
|
||||
|
||||
*aScriptObject = mScriptObject;
|
||||
return res;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::SetScriptObject(void *aScriptObject)
|
||||
{
|
||||
mScriptObject = aScriptObject;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static NS_DEFINE_IID(kPrefsIID, NS_IPREF_IID);
|
||||
static NS_DEFINE_IID(kPrefsCID, NS_PREF_CID);
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::UpdateEnabled(PRBool* aReturn)
|
||||
{
|
||||
nsIPref * prefs;
|
||||
|
||||
nsresult rv = nsServiceManager::GetService(kPrefsCID,
|
||||
kPrefsIID,
|
||||
(nsISupports**) &prefs);
|
||||
|
||||
|
||||
if ( NS_SUCCEEDED(rv) )
|
||||
{
|
||||
rv = prefs->GetBoolPref( (const char*) XPINSTALL_ENABLE_PREF, aReturn);
|
||||
|
||||
if (NS_FAILED(rv))
|
||||
{
|
||||
*aReturn = PR_FALSE;
|
||||
}
|
||||
|
||||
NS_RELEASE(prefs);
|
||||
}
|
||||
else
|
||||
{
|
||||
*aReturn = PR_FALSE; /* no prefs manager. set to false */
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::Install(nsXPITriggerInfo* aTrigger, PRBool* aReturn)
|
||||
{
|
||||
nsresult rv;
|
||||
*aReturn = PR_FALSE;
|
||||
|
||||
PRBool enabled;
|
||||
UpdateEnabled(&enabled);
|
||||
if (!enabled)
|
||||
{
|
||||
delete aTrigger;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsXPInstallManager *mgr = new nsXPInstallManager();
|
||||
if (mgr)
|
||||
{
|
||||
// The Install manager will delete itself when done
|
||||
rv = mgr->InitManager( aTrigger );
|
||||
if (NS_SUCCEEDED(rv))
|
||||
*aReturn = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
delete aTrigger;
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::StartSoftwareUpdate(const nsString& aURL, PRInt32 aFlags, PRBool* aReturn)
|
||||
{
|
||||
PRBool enabled;
|
||||
nsresult rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
*aReturn = PR_FALSE;
|
||||
|
||||
UpdateEnabled(&enabled);
|
||||
if (!enabled)
|
||||
return NS_OK;
|
||||
|
||||
// The Install manager will delete itself when done, once we've called
|
||||
// InitManager. Before then **WE** must delete it
|
||||
nsXPInstallManager *mgr = new nsXPInstallManager();
|
||||
if (mgr)
|
||||
{
|
||||
nsXPITriggerInfo* trigger = new nsXPITriggerInfo();
|
||||
if ( trigger )
|
||||
{
|
||||
nsXPITriggerItem* item = new nsXPITriggerItem(0,aURL.GetUnicode());
|
||||
if (item)
|
||||
{
|
||||
trigger->Add( item );
|
||||
// The Install manager will delete itself when done
|
||||
rv = mgr->InitManager( trigger );
|
||||
*aReturn = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
delete trigger;
|
||||
delete mgr;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
delete mgr;
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn)
|
||||
{
|
||||
nsInstallVersion inVersion;
|
||||
inVersion.Init(aVersion);
|
||||
return ConditionalSoftwareUpdate(aURL, aRegName, aDiffLevel, &inVersion, aMode, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn)
|
||||
{
|
||||
PRBool needJar = PR_FALSE;
|
||||
|
||||
PRBool enabled;
|
||||
|
||||
UpdateEnabled(&enabled);
|
||||
if (!enabled)
|
||||
return NS_OK;
|
||||
|
||||
if (aURL.IsEmpty() || aVersion == nsnull)
|
||||
{
|
||||
needJar = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
char * regNameCString = aRegName.ToNewCString();
|
||||
|
||||
REGERR status = VR_ValidateComponent( regNameCString );
|
||||
|
||||
if ( status == REGERR_NOFIND || status == REGERR_NOFILE )
|
||||
{
|
||||
// either component is not in the registry or it's a file
|
||||
// node and the physical file is missing
|
||||
needJar = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
VERSION oldVersion;
|
||||
PRInt32 diffValue;
|
||||
|
||||
status = VR_GetVersion( regNameCString, &oldVersion );
|
||||
nsInstallVersion oldInstallVersion;
|
||||
|
||||
oldInstallVersion.Init(oldVersion.major,
|
||||
oldVersion.minor,
|
||||
oldVersion.release,
|
||||
oldVersion.build);
|
||||
|
||||
|
||||
if ( status != REGERR_OK )
|
||||
needJar = PR_TRUE;
|
||||
else if ( aDiffLevel < 0 )
|
||||
{
|
||||
aVersion->CompareTo(&oldInstallVersion, &diffValue);
|
||||
needJar = (diffValue <= aDiffLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
aVersion->CompareTo(&oldInstallVersion, &diffValue);
|
||||
needJar = (diffValue >= aDiffLevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (needJar)
|
||||
return StartSoftwareUpdate(aURL, aMode, aReturn);
|
||||
else
|
||||
*aReturn = 0;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn)
|
||||
{
|
||||
return ConditionalSoftwareUpdate(aURL, aRegName, BLD_DIFF, aVersion, aMode, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn)
|
||||
{
|
||||
nsInstallVersion inVersion;
|
||||
inVersion.Init(aVersion);
|
||||
return ConditionalSoftwareUpdate(aURL, aRegName, BLD_DIFF, &inVersion, aMode, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn)
|
||||
{
|
||||
nsInstallVersion inVersion;
|
||||
inVersion.Init(aVersion);;
|
||||
return ConditionalSoftwareUpdate(aURL, aRegName, BLD_DIFF, &inVersion, 0, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn)
|
||||
{
|
||||
return ConditionalSoftwareUpdate(aURL, aRegName, BLD_DIFF, aVersion, 0, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::CompareVersion(const nsString& aRegName, PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn)
|
||||
{
|
||||
nsInstallVersion inVersion;
|
||||
inVersion.Init(aMajor, aMinor, aRelease, aBuild);
|
||||
|
||||
return CompareVersion(aRegName, &inVersion, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::CompareVersion(const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn)
|
||||
{
|
||||
nsInstallVersion inVersion;
|
||||
inVersion.Init(aVersion);
|
||||
|
||||
return CompareVersion(aRegName, &inVersion, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::CompareVersion(const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn)
|
||||
{
|
||||
*aReturn = EQUAL; // assume failure.
|
||||
|
||||
PRBool enabled;
|
||||
|
||||
UpdateEnabled(&enabled);
|
||||
if (!enabled)
|
||||
return NS_OK;
|
||||
|
||||
VERSION cVersion;
|
||||
char* tempCString;
|
||||
REGERR status;
|
||||
nsInstallVersion regNameVersion;
|
||||
|
||||
tempCString = aRegName.ToNewCString();
|
||||
|
||||
status = VR_GetVersion( tempCString, &cVersion );
|
||||
|
||||
/* if we got the version */
|
||||
if ( status == REGERR_OK )
|
||||
{
|
||||
if ( VR_ValidateComponent( tempCString ) == REGERR_NOFILE )
|
||||
{
|
||||
regNameVersion.Init(0,0,0,0);
|
||||
}
|
||||
else
|
||||
{
|
||||
regNameVersion.Init(cVersion.major,
|
||||
cVersion.minor,
|
||||
cVersion.release,
|
||||
cVersion.build);
|
||||
}
|
||||
}
|
||||
else
|
||||
regNameVersion.Init(0,0,0,0);
|
||||
|
||||
regNameVersion.CompareTo( aVersion, aReturn );
|
||||
|
||||
if (tempCString)
|
||||
Recycle(tempCString);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallTrigger::GetVersion(const nsString& component, nsString& version)
|
||||
{
|
||||
PRBool enabled;
|
||||
|
||||
UpdateEnabled(&enabled);
|
||||
if (!enabled)
|
||||
return NS_OK;
|
||||
|
||||
VERSION cVersion;
|
||||
char* tempCString;
|
||||
REGERR status;
|
||||
|
||||
tempCString = component.ToNewCString();
|
||||
|
||||
status = VR_GetVersion( tempCString, &cVersion );
|
||||
|
||||
version.Truncate();
|
||||
|
||||
/* if we got the version */
|
||||
if ( status == REGERR_OK && VR_ValidateComponent( tempCString ) == REGERR_OK)
|
||||
{
|
||||
nsInstallVersion regNameVersion;
|
||||
|
||||
regNameVersion.Init(cVersion.major,
|
||||
cVersion.minor,
|
||||
cVersion.release,
|
||||
cVersion.build);
|
||||
|
||||
regNameVersion.ToString(version);
|
||||
}
|
||||
|
||||
if (tempCString)
|
||||
Recycle(tempCString);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// this will take a nsIURI, and create a temporary file. If it is local, we just us it.
|
||||
|
||||
void
|
||||
nsInstallTrigger::CreateTempFileFromURL(const nsString& aURL, nsString& tempFileString)
|
||||
{
|
||||
// Checking to see if the url is local
|
||||
|
||||
if ( aURL.EqualsIgnoreCase("file:/", 6) )
|
||||
{
|
||||
tempFileString.Assign( nsNSPRPath(nsFileURL(aURL)) );
|
||||
}
|
||||
else
|
||||
{
|
||||
nsSpecialSystemDirectory tempFile(nsSpecialSystemDirectory::OS_TemporaryDirectory);
|
||||
|
||||
PRInt32 result = aURL.RFindChar('/');
|
||||
if (result != -1)
|
||||
{
|
||||
nsString jarName;
|
||||
|
||||
aURL.Right(jarName, (aURL.Length() - result) );
|
||||
|
||||
PRInt32 argOffset = jarName.RFindChar('?');
|
||||
|
||||
if (argOffset != -1)
|
||||
{
|
||||
// we need to remove ? and everything after it
|
||||
jarName.Truncate(argOffset);
|
||||
}
|
||||
|
||||
|
||||
tempFile += jarName;
|
||||
}
|
||||
else
|
||||
{
|
||||
tempFile += "xpinstall.jar";
|
||||
}
|
||||
|
||||
tempFile.MakeUnique();
|
||||
|
||||
tempFileString.Assign( nsNSPRPath( nsFilePath(tempFile) ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
55
mozilla/xpinstall/src/nsInstallTrigger.h
Normal file
55
mozilla/xpinstall/src/nsInstallTrigger.h
Normal file
@@ -0,0 +1,55 @@
|
||||
#ifndef __NS_INSTALLTRIGGER_H__
|
||||
#define __NS_INSTALLTRIGGER_H__
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsString.h"
|
||||
#include "nsIFactory.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsIScriptObjectOwner.h"
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsHashtable.h"
|
||||
|
||||
#include "nsIDOMInstallTriggerGlobal.h"
|
||||
#include "nsSoftwareUpdate.h"
|
||||
#include "nsXPITriggerInfo.h"
|
||||
|
||||
|
||||
|
||||
|
||||
class nsInstallTrigger: public nsIScriptObjectOwner, public nsIDOMInstallTriggerGlobal
|
||||
{
|
||||
public:
|
||||
static const nsIID& IID() { static nsIID iid = NS_SoftwareUpdateInstallTrigger_CID; return iid; }
|
||||
|
||||
nsInstallTrigger();
|
||||
virtual ~nsInstallTrigger();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject);
|
||||
NS_IMETHOD SetScriptObject(void* aScriptObject);
|
||||
|
||||
NS_IMETHOD UpdateEnabled(PRBool* aReturn);
|
||||
NS_IMETHOD Install(nsXPITriggerInfo *aInfo, PRBool* aReturn);
|
||||
NS_IMETHOD StartSoftwareUpdate(const nsString& aURL, PRInt32 aFlags, PRInt32* aReturn);
|
||||
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn);
|
||||
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, PRInt32 aDiffLevel, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn);
|
||||
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32 aMode, PRInt32* aReturn);
|
||||
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32 aMode, PRInt32* aReturn);
|
||||
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn);
|
||||
NS_IMETHOD ConditionalSoftwareUpdate(const nsString& aURL, const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn);
|
||||
NS_IMETHOD CompareVersion(const nsString& aRegName, PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn);
|
||||
NS_IMETHOD CompareVersion(const nsString& aRegName, const nsString& aVersion, PRInt32* aReturn);
|
||||
NS_IMETHOD CompareVersion(const nsString& aRegName, nsIDOMInstallVersion* aVersion, PRInt32* aReturn);
|
||||
NS_IMETHOD GetVersion(const nsString& component, nsString& version);
|
||||
|
||||
|
||||
private:
|
||||
void *mScriptObject;
|
||||
void CreateTempFileFromURL(const nsString& aURL, nsString& tempFileString);
|
||||
|
||||
};
|
||||
|
||||
#define NS_INSTALLTRIGGERCOMPONENT_PROGID NS_IXPINSTALLCOMPONENT_PROGID "/installtrigger"
|
||||
#endif
|
||||
216
mozilla/xpinstall/src/nsInstallUninstall.cpp
Normal file
216
mozilla/xpinstall/src/nsInstallUninstall.cpp
Normal file
@@ -0,0 +1,216 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
#include "nsInstall.h"
|
||||
#include "nsInstallUninstall.h"
|
||||
#include "nsInstallResources.h"
|
||||
#include "VerReg.h"
|
||||
#include "prmem.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "ScheduledTasks.h"
|
||||
|
||||
extern "C" NS_EXPORT PRInt32 SU_Uninstall(char *regPackageName);
|
||||
REGERR su_UninstallProcessItem(char *component_path);
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsInstallUninstall);
|
||||
|
||||
nsInstallUninstall::nsInstallUninstall( nsInstall* inInstall,
|
||||
const nsString& regName,
|
||||
PRInt32 *error)
|
||||
|
||||
: nsInstallObject(inInstall)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallUninstall);
|
||||
|
||||
if (regName.Equals(""))
|
||||
{
|
||||
*error = nsInstall::INVALID_ARGUMENTS;
|
||||
return;
|
||||
}
|
||||
|
||||
mRegName.Assign(regName);
|
||||
|
||||
char* userName = (char*)PR_Malloc(MAXREGPATHLEN);
|
||||
PRInt32 err = VR_GetUninstallUserName( (char*) (const char*) nsAutoCString(regName),
|
||||
userName,
|
||||
MAXREGPATHLEN );
|
||||
|
||||
mUIName.Assign(userName);
|
||||
|
||||
if (err != REGERR_OK)
|
||||
{
|
||||
*error = nsInstall::NO_SUCH_COMPONENT;
|
||||
}
|
||||
|
||||
PR_FREEIF(userName);
|
||||
|
||||
}
|
||||
|
||||
nsInstallUninstall::~nsInstallUninstall()
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsInstallUninstall);
|
||||
}
|
||||
|
||||
|
||||
PRInt32 nsInstallUninstall::Prepare()
|
||||
{
|
||||
// no set-up necessary
|
||||
return nsInstall::SUCCESS;
|
||||
}
|
||||
|
||||
PRInt32 nsInstallUninstall::Complete()
|
||||
{
|
||||
PRInt32 err = nsInstall::SUCCESS;
|
||||
|
||||
if (mInstall == NULL)
|
||||
return nsInstall::INVALID_ARGUMENTS;
|
||||
|
||||
err = SU_Uninstall( (char*)(const char*) nsAutoCString(mRegName) );
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void nsInstallUninstall::Abort()
|
||||
{
|
||||
}
|
||||
|
||||
char* nsInstallUninstall::toString()
|
||||
{
|
||||
char* buffer = new char[1024];
|
||||
char* rsrcVal = nsnull;
|
||||
|
||||
if (buffer == nsnull || !mInstall)
|
||||
return buffer;
|
||||
|
||||
char* temp = mUIName.ToNewCString();
|
||||
|
||||
if (temp)
|
||||
{
|
||||
rsrcVal = mInstall->GetResourcedString("Uninstall");
|
||||
|
||||
if (rsrcVal)
|
||||
{
|
||||
sprintf( buffer, rsrcVal, temp);
|
||||
nsCRT::free(rsrcVal);
|
||||
}
|
||||
}
|
||||
|
||||
if (temp)
|
||||
Recycle(temp);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
PRBool
|
||||
nsInstallUninstall::CanUninstall()
|
||||
{
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsInstallUninstall::RegisterPackageNode()
|
||||
{
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
extern "C" NS_EXPORT PRInt32 SU_Uninstall(char *regPackageName)
|
||||
{
|
||||
REGERR status = REGERR_FAIL;
|
||||
char pathbuf[MAXREGPATHLEN+1] = {0};
|
||||
char sharedfilebuf[MAXREGPATHLEN+1] = {0};
|
||||
REGENUM state = 0;
|
||||
int32 length;
|
||||
int32 err;
|
||||
|
||||
if (regPackageName == NULL)
|
||||
return REGERR_PARAM;
|
||||
|
||||
if (pathbuf == NULL)
|
||||
return REGERR_PARAM;
|
||||
|
||||
/* Get next path from Registry */
|
||||
status = VR_Enum( regPackageName, &state, pathbuf, MAXREGPATHLEN );
|
||||
|
||||
/* if we got a good path */
|
||||
while (status == REGERR_OK)
|
||||
{
|
||||
char component_path[2*MAXREGPATHLEN+1] = {0};
|
||||
strcat(component_path, regPackageName);
|
||||
length = strlen(regPackageName);
|
||||
if (component_path[length - 1] != '/')
|
||||
strcat(component_path, "/");
|
||||
strcat(component_path, pathbuf);
|
||||
err = su_UninstallProcessItem(component_path);
|
||||
status = VR_Enum( regPackageName, &state, pathbuf, MAXREGPATHLEN );
|
||||
}
|
||||
|
||||
err = VR_Remove(regPackageName);
|
||||
// there is a problem here. It looks like if the file is refcounted, we still blow away the reg key
|
||||
// FIX!
|
||||
state = 0;
|
||||
status = VR_UninstallEnumSharedFiles( regPackageName, &state, sharedfilebuf, MAXREGPATHLEN );
|
||||
while (status == REGERR_OK)
|
||||
{
|
||||
err = su_UninstallProcessItem(sharedfilebuf);
|
||||
err = VR_UninstallDeleteFileFromList(regPackageName, sharedfilebuf);
|
||||
status = VR_UninstallEnumSharedFiles( regPackageName, &state, sharedfilebuf, MAXREGPATHLEN );
|
||||
}
|
||||
|
||||
err = VR_UninstallDeleteSharedFilesKey(regPackageName);
|
||||
err = VR_UninstallDestroy(regPackageName);
|
||||
return err;
|
||||
}
|
||||
|
||||
REGERR su_UninstallProcessItem(char *component_path)
|
||||
{
|
||||
int refcount;
|
||||
int err;
|
||||
char filepath[MAXREGPATHLEN];
|
||||
|
||||
err = VR_GetPath(component_path, sizeof(filepath), filepath);
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
err = VR_GetRefCount(component_path, &refcount);
|
||||
if ( err == REGERR_OK )
|
||||
{
|
||||
--refcount;
|
||||
if (refcount > 0)
|
||||
err = VR_SetRefCount(component_path, refcount);
|
||||
else
|
||||
{
|
||||
err = VR_Remove(component_path);
|
||||
DeleteFileNowOrSchedule(nsFileSpec(filepath));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* delete node and file */
|
||||
err = VR_Remove(component_path);
|
||||
DeleteFileNowOrSchedule(nsFileSpec(filepath));
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
63
mozilla/xpinstall/src/nsInstallUninstall.h
Normal file
63
mozilla/xpinstall/src/nsInstallUninstall.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/* -*- 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.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 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Daniel Veditz <dveditz@netscape.com>
|
||||
* Douglas Turner <dougt@netscape.com>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef nsInstallUninstall_h__
|
||||
#define nsInstallUninstall_h__
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsString.h"
|
||||
#include "nsInstallObject.h"
|
||||
#include "nsInstall.h"
|
||||
|
||||
class nsInstallUninstall : public nsInstallObject
|
||||
{
|
||||
public:
|
||||
|
||||
nsInstallUninstall( nsInstall* inInstall,
|
||||
const nsString& regName,
|
||||
PRInt32 *error);
|
||||
|
||||
|
||||
virtual ~nsInstallUninstall();
|
||||
|
||||
PRInt32 Prepare();
|
||||
PRInt32 Complete();
|
||||
void Abort();
|
||||
char* toString();
|
||||
|
||||
PRBool CanUninstall();
|
||||
PRBool RegisterPackageNode();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
nsString mRegName; // Registry name of package
|
||||
nsString mUIName; // User name of package
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsInstallUninstall_h__ */
|
||||
341
mozilla/xpinstall/src/nsInstallVersion.cpp
Normal file
341
mozilla/xpinstall/src/nsInstallVersion.cpp
Normal file
@@ -0,0 +1,341 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#include "nsSoftwareUpdate.h"
|
||||
|
||||
#include "nsInstallVersion.h"
|
||||
#include "nsIDOMInstallVersion.h"
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsIFactory.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsIScriptGlobalObject.h"
|
||||
|
||||
#include "prprf.h"
|
||||
#include "prmem.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID);
|
||||
|
||||
static NS_DEFINE_IID(kIInstallVersion_IID, NS_IDOMINSTALLVERSION_IID);
|
||||
|
||||
|
||||
nsInstallVersion::nsInstallVersion()
|
||||
{
|
||||
mScriptObject = nsnull;
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsInstallVersion::~nsInstallVersion()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::QueryInterface(REFNSIID aIID,void** aInstancePtr)
|
||||
{
|
||||
if (aInstancePtr == NULL)
|
||||
{
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aInstancePtr = NULL;
|
||||
|
||||
if ( aIID.Equals(kIScriptObjectOwnerIID))
|
||||
{
|
||||
*aInstancePtr = (void*) ((nsIScriptObjectOwner*)this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
else if ( aIID.Equals(kIInstallVersion_IID) )
|
||||
{
|
||||
*aInstancePtr = (void*) ((nsIDOMInstallVersion*)this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
else if ( aIID.Equals(kISupportsIID) )
|
||||
{
|
||||
*aInstancePtr = (void*)(nsISupports*)(nsIScriptObjectOwner*)this;
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(nsInstallVersion)
|
||||
NS_IMPL_RELEASE(nsInstallVersion)
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aScriptObject, "null arg");
|
||||
nsresult res = NS_OK;
|
||||
|
||||
if (nsnull == mScriptObject)
|
||||
{
|
||||
res = NS_NewScriptInstallVersion(aContext,
|
||||
(nsISupports *)(nsIDOMInstallVersion*)this,
|
||||
nsnull,
|
||||
&mScriptObject);
|
||||
}
|
||||
|
||||
|
||||
*aScriptObject = mScriptObject;
|
||||
return res;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::SetScriptObject(void *aScriptObject)
|
||||
{
|
||||
mScriptObject = aScriptObject;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// this will go away when our constructors can have parameters.
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::Init(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild)
|
||||
{
|
||||
major = aMajor;
|
||||
minor = aMinor;
|
||||
release = aRelease;
|
||||
build = aBuild;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::Init(const nsString& version)
|
||||
{
|
||||
PRInt32 errorCode;
|
||||
PRInt32 aMajor, aMinor, aRelease, aBuild;
|
||||
|
||||
major = minor = release = build = 0;
|
||||
|
||||
errorCode = nsInstallVersion::StringToVersionNumbers(version, &aMajor, &aMinor, &aRelease, &aBuild);
|
||||
if (NS_SUCCEEDED(errorCode))
|
||||
{
|
||||
Init(aMajor, aMinor, aRelease, aBuild);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::GetMajor(PRInt32* aMajor)
|
||||
{
|
||||
*aMajor = major;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::SetMajor(PRInt32 aMajor)
|
||||
{
|
||||
major = aMajor;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::GetMinor(PRInt32* aMinor)
|
||||
{
|
||||
*aMinor = minor;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::SetMinor(PRInt32 aMinor)
|
||||
{
|
||||
minor = aMinor;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::GetRelease(PRInt32* aRelease)
|
||||
{
|
||||
*aRelease = release;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::SetRelease(PRInt32 aRelease)
|
||||
{
|
||||
release = aRelease;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::GetBuild(PRInt32* aBuild)
|
||||
{
|
||||
*aBuild = build;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::SetBuild(PRInt32 aBuild)
|
||||
{
|
||||
build = aBuild;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::CompareTo(nsIDOMInstallVersion* aVersion, PRInt32* aReturn)
|
||||
{
|
||||
PRInt32 aMajor, aMinor, aRelease, aBuild;
|
||||
|
||||
aVersion->GetMajor(&aMajor);
|
||||
aVersion->GetMinor(&aMinor);
|
||||
aVersion->GetRelease(&aRelease);
|
||||
aVersion->GetBuild(&aBuild);
|
||||
|
||||
CompareTo(aMajor, aMinor, aRelease, aBuild, aReturn);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::CompareTo(const nsString& aString, PRInt32* aReturn)
|
||||
{
|
||||
nsInstallVersion inVersion;
|
||||
inVersion.Init(aString);
|
||||
|
||||
return CompareTo(&inVersion, aReturn);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::CompareTo(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn)
|
||||
{
|
||||
int diff;
|
||||
|
||||
if ( major == aMajor )
|
||||
{
|
||||
if ( minor == aMinor )
|
||||
{
|
||||
if ( release == aRelease )
|
||||
{
|
||||
if ( build == aBuild )
|
||||
diff = EQUAL;
|
||||
else if ( build > aBuild )
|
||||
diff = BLD_DIFF;
|
||||
else
|
||||
diff = BLD_DIFF_MINUS;
|
||||
}
|
||||
else if ( release > aRelease )
|
||||
diff = REL_DIFF;
|
||||
else
|
||||
diff = REL_DIFF_MINUS;
|
||||
}
|
||||
else if ( minor > aMinor )
|
||||
diff = MINOR_DIFF;
|
||||
else
|
||||
diff = MINOR_DIFF_MINUS;
|
||||
}
|
||||
else if ( major > aMajor )
|
||||
diff = MAJOR_DIFF;
|
||||
else
|
||||
diff = MAJOR_DIFF_MINUS;
|
||||
|
||||
*aReturn = diff;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInstallVersion::ToString(nsString& aReturn)
|
||||
{
|
||||
char *result=NULL;
|
||||
result = PR_sprintf_append(result, "%d.%d.%d.%d", major, minor, release, build);
|
||||
|
||||
aReturn.Assign(result);
|
||||
|
||||
PR_FREEIF(result);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsInstallVersion::StringToVersionNumbers(const nsString& version, PRInt32 *aMajor, PRInt32 *aMinor, PRInt32 *aRelease, PRInt32 *aBuild)
|
||||
{
|
||||
PRInt32 errorCode;
|
||||
|
||||
int dot = version.FindChar('.', PR_FALSE,0);
|
||||
|
||||
if ( dot == -1 )
|
||||
{
|
||||
*aMajor = version.ToInteger(&errorCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
nsString majorStr;
|
||||
version.Mid(majorStr, 0, dot);
|
||||
*aMajor = majorStr.ToInteger(&errorCode);
|
||||
|
||||
int prev = dot+1;
|
||||
dot = version.FindChar('.',PR_FALSE,prev);
|
||||
if ( dot == -1 )
|
||||
{
|
||||
nsString minorStr;
|
||||
version.Mid(minorStr, prev, version.Length() - prev);
|
||||
*aMinor = minorStr.ToInteger(&errorCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
nsString minorStr;
|
||||
version.Mid(minorStr, prev, dot - prev);
|
||||
*aMinor = minorStr.ToInteger(&errorCode);
|
||||
|
||||
prev = dot+1;
|
||||
dot = version.FindChar('.',PR_FALSE,prev);
|
||||
if ( dot == -1 )
|
||||
{
|
||||
nsString releaseStr;
|
||||
version.Mid(releaseStr, prev, version.Length() - prev);
|
||||
*aRelease = releaseStr.ToInteger(&errorCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
nsString releaseStr;
|
||||
version.Mid(releaseStr, prev, dot - prev);
|
||||
*aRelease = releaseStr.ToInteger(&errorCode);
|
||||
|
||||
prev = dot+1;
|
||||
if ( version.Length() > dot )
|
||||
{
|
||||
nsString buildStr;
|
||||
version.Mid(buildStr, prev, version.Length() - prev);
|
||||
*aBuild = buildStr.ToInteger(&errorCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
60
mozilla/xpinstall/src/nsInstallVersion.h
Normal file
60
mozilla/xpinstall/src/nsInstallVersion.h
Normal file
@@ -0,0 +1,60 @@
|
||||
#ifndef __NS_INSTALLVERSION_H__
|
||||
#define __NS_INSTALLVERSION_H__
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsString.h"
|
||||
#include "nsIFactory.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsIScriptObjectOwner.h"
|
||||
|
||||
#include "nsIDOMInstallVersion.h"
|
||||
#include "nsSoftwareUpdate.h"
|
||||
|
||||
#include "prtypes.h"
|
||||
|
||||
class nsInstallVersion: public nsIScriptObjectOwner, public nsIDOMInstallVersion
|
||||
{
|
||||
public:
|
||||
static const nsIID& IID() { static nsIID iid = NS_SoftwareUpdateInstallVersion_CID; return iid; }
|
||||
|
||||
nsInstallVersion();
|
||||
virtual ~nsInstallVersion();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject);
|
||||
NS_IMETHOD SetScriptObject(void* aScriptObject);
|
||||
|
||||
NS_IMETHOD Init(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild);
|
||||
NS_IMETHOD Init(const nsString& aVersionString);
|
||||
|
||||
NS_IMETHOD GetMajor(PRInt32* aMajor);
|
||||
NS_IMETHOD SetMajor(PRInt32 aMajor);
|
||||
|
||||
NS_IMETHOD GetMinor(PRInt32* aMinor);
|
||||
NS_IMETHOD SetMinor(PRInt32 aMinor);
|
||||
|
||||
NS_IMETHOD GetRelease(PRInt32* aRelease);
|
||||
NS_IMETHOD SetRelease(PRInt32 aRelease);
|
||||
|
||||
NS_IMETHOD GetBuild(PRInt32* aBuild);
|
||||
NS_IMETHOD SetBuild(PRInt32 aBuild);
|
||||
|
||||
NS_IMETHOD ToString(nsString& aReturn);
|
||||
NS_IMETHOD CompareTo(nsIDOMInstallVersion* aVersion, PRInt32* aReturn);
|
||||
NS_IMETHOD CompareTo(const nsString& aString, PRInt32* aReturn);
|
||||
NS_IMETHOD CompareTo(PRInt32 aMajor, PRInt32 aMinor, PRInt32 aRelease, PRInt32 aBuild, PRInt32* aReturn);
|
||||
|
||||
static nsresult StringToVersionNumbers(const nsString& version, PRInt32 *aMajor, PRInt32 *aMinor, PRInt32 *aRelease, PRInt32 *aBuild);
|
||||
|
||||
private:
|
||||
void *mScriptObject;
|
||||
PRInt32 major;
|
||||
PRInt32 minor;
|
||||
PRInt32 release;
|
||||
PRInt32 build;
|
||||
};
|
||||
|
||||
|
||||
#define NS_INSTALLVERSIONCOMPONENT_PROGID NS_IXPINSTALLCOMPONENT_PROGID "/installversion"
|
||||
#endif
|
||||
1352
mozilla/xpinstall/src/nsJSFile.cpp
Normal file
1352
mozilla/xpinstall/src/nsJSFile.cpp
Normal file
File diff suppressed because it is too large
Load Diff
93
mozilla/xpinstall/src/nsJSFile.h
Normal file
93
mozilla/xpinstall/src/nsJSFile.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* 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.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#ifndef __NS_JSFILE_H__
|
||||
#define __NS_JSFILE_H__
|
||||
|
||||
#include "jsapi.h"
|
||||
#include "nsJSUtils.h"
|
||||
#include "nscore.h"
|
||||
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpDirCreate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpDirGetParent(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpDirRemove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpDirRename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileCopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileDelete(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileExists(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileExecute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileGetNativeVersion(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileGetDiskSpaceAvailable(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileGetModDate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileGetSize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileIsDirectory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileIsFile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileModDateChanged(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileMove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileRename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileWindowsShortcut(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileMacAlias(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
JSBool PR_CALLBACK
|
||||
InstallFileOpFileUnixLink(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
|
||||
PRInt32 InitXPFileOpObjectPrototype(JSContext *jscontext, JSObject *global, JSObject **fileOpObjectPrototype);
|
||||
|
||||
#endif
|
||||
150
mozilla/xpinstall/src/nsJSFileSpecObj.cpp
Normal file
150
mozilla/xpinstall/src/nsJSFileSpecObj.cpp
Normal file
@@ -0,0 +1,150 @@
|
||||
/* -*- Mode: C++; tab-width: 2; 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 "jsapi.h"
|
||||
#include "nsJSUtils.h"
|
||||
#include "nscore.h"
|
||||
#include "nsIScriptContext.h"
|
||||
|
||||
#include "nsString.h"
|
||||
#include "nsInstall.h"
|
||||
#include "nsJSFileSpecObj.h"
|
||||
|
||||
extern void ConvertJSValToStr(nsString& aString,
|
||||
JSContext* aContext,
|
||||
jsval aValue);
|
||||
|
||||
extern void ConvertStrToJSVal(const nsString& aProp,
|
||||
JSContext* aContext,
|
||||
jsval* aReturn);
|
||||
|
||||
extern PRBool ConvertJSValToBool(PRBool* aProp,
|
||||
JSContext* aContext,
|
||||
jsval aValue);
|
||||
|
||||
extern PRBool ConvertJSValToObj(nsISupports** aSupports,
|
||||
REFNSIID aIID,
|
||||
const nsString& aTypeName,
|
||||
JSContext* aContext,
|
||||
jsval aValue);
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************/
|
||||
// Native methods for FileSpecObj functions
|
||||
|
||||
/*
|
||||
* Native method fso_ToString
|
||||
*/
|
||||
PR_STATIC_CALLBACK(JSBool)
|
||||
fso_ToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
{
|
||||
|
||||
nsInstallFolder *nativeThis = (nsInstallFolder*)JS_GetPrivate(cx, obj);
|
||||
nsAutoString stringReturned;
|
||||
|
||||
*rval = JSVAL_NULL;
|
||||
|
||||
// If there's no private data, this must be the prototype, so ignore
|
||||
if(nsnull == nativeThis)
|
||||
{
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
if(NS_OK != nativeThis->ToString(&stringReturned))
|
||||
return JS_FALSE;
|
||||
nsJSUtils::nsConvertStringToJSVal(stringReturned, cx, rval);
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Native method fso_AppendString
|
||||
*/
|
||||
PR_STATIC_CALLBACK(JSBool)
|
||||
fso_AppendPath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
{
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FileSpecObj destructor
|
||||
*/
|
||||
static void PR_CALLBACK FileSpecObjectCleanup(JSContext *cx, JSObject *obj)
|
||||
{
|
||||
nsInstallFolder *nativeThis = (nsInstallFolder*)JS_GetPrivate(cx, obj);
|
||||
if (nativeThis != nsnull)
|
||||
delete nativeThis;
|
||||
}
|
||||
|
||||
/***********************************************************************/
|
||||
//
|
||||
// class for FileObj
|
||||
//
|
||||
JSClass FileSpecObjectClass = {
|
||||
"FileSpecObject",
|
||||
JSCLASS_HAS_PRIVATE,
|
||||
JS_PropertyStub,
|
||||
JS_PropertyStub,
|
||||
JS_PropertyStub,
|
||||
JS_PropertyStub,
|
||||
JS_EnumerateStub,
|
||||
JS_ResolveStub,
|
||||
JS_ConvertStub,
|
||||
FileSpecObjectCleanup
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// FileObj class methods
|
||||
//
|
||||
static JSFunctionSpec fileSpecObjMethods[] =
|
||||
{
|
||||
{"appendPath", fso_AppendPath, 1},
|
||||
{"toString", fso_ToString, 0},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
||||
PRInt32 InitFileSpecObjectPrototype(JSContext *jscontext,
|
||||
JSObject *global,
|
||||
JSObject **fileSpecObjectPrototype)
|
||||
{
|
||||
*fileSpecObjectPrototype = JS_InitClass( jscontext, // context
|
||||
global, // global object
|
||||
nsnull, // parent proto
|
||||
&FileSpecObjectClass, // JSClass
|
||||
nsnull, // JSNative ctor
|
||||
0, // ctor args
|
||||
nsnull, // proto props
|
||||
fileSpecObjMethods,// proto funcs
|
||||
nsnull, // ctor props (static)
|
||||
nsnull); // ctor funcs (static)
|
||||
|
||||
if (nsnull == *fileSpecObjectPrototype)
|
||||
{
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user