271 lines
8.6 KiB
JavaScript
271 lines
8.6 KiB
JavaScript
// CA.ZipAssociation.js
|
|
//
|
|
// Store and Reset file associations for .zip files, as necessary, when
|
|
// DotNetZip is being installed and uninstalled, respectively. This
|
|
// script defines custom actions that are invoked as part of the MSI.
|
|
//
|
|
// Copyright (c) 2011 Dino Chiesa.
|
|
// All rights reserved.
|
|
//
|
|
// This code module is part of DotNetZip, a zipfile class library.
|
|
//
|
|
// ------------------------------------------------------------------
|
|
//
|
|
// This code, like all of DotNetZip, is licensed under the Microsoft
|
|
// Public License. See the file License.txt for the license details.
|
|
// More info on: http://dotnetzip.codeplex.com
|
|
//
|
|
// Created: Thu, 14 Jul 2011 17:31
|
|
// Last saved: <2011-July-16 18:01:37>
|
|
//
|
|
|
|
|
|
/************************************************/
|
|
/* Message level */
|
|
/************************************************/
|
|
var msiMessageLevel = {
|
|
FatalExit : 0x00000000,
|
|
Error : 0x01000000,
|
|
Warning : 0x02000000,
|
|
User : 0x03000000,
|
|
Info : 0x04000000,
|
|
ActionStart : 0x08000000,
|
|
Progress : 0x0A000000,
|
|
ActionData : 0x09000000
|
|
};
|
|
|
|
|
|
/************************************************/
|
|
/* Button styles */
|
|
/************************************************/
|
|
var msiButtonType = {
|
|
Ok : 0,
|
|
OkCancel : 1,
|
|
AbortRetryIgnore : 2,
|
|
YesNoCancel : 3,
|
|
YesNo : 4,
|
|
RetryCancel : 5
|
|
};
|
|
|
|
|
|
/************************************************/
|
|
/* Default button */
|
|
/************************************************/
|
|
var msiDefaultButton = {
|
|
First : 0x000,
|
|
Second : 0x100,
|
|
Third : 0x200
|
|
};
|
|
|
|
/************************************************/
|
|
/* Return values */
|
|
/************************************************/
|
|
var msiMessageStatus = {
|
|
Error : -1,
|
|
None : 0,
|
|
Ok : 1,
|
|
Cancel : 2,
|
|
Abort : 3,
|
|
Retry : 4,
|
|
Ignore : 5,
|
|
Yes : 6,
|
|
No : 7
|
|
};
|
|
|
|
|
|
var DotNetZipAssocId = "DotNetZip.zip.1";
|
|
var regPathZipAssoc = "HKEY_LOCAL_MACHINE\\SOFTWARE\\CLASSES\\.zip\\";
|
|
var regPathDnzPrior = "HKEY_CURRENT_USER\\SOFTWARE\\Dino Chiesa\\DotNetZip Tools v1.9\\PriorZipAssociation";
|
|
var verbose = true;
|
|
|
|
function DisplayMessageBox(message, options) {
|
|
if (options === null) {
|
|
options = msiMessageLevel.User + msiButtonType.Ok + msiDefaultButton.First;
|
|
}
|
|
|
|
if (typeof(Session) === undefined) {
|
|
WScript.Echo(message);
|
|
if ((options & 0xF) == 1) {
|
|
// ask: cancel?
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
var record = Session.Installer.CreateRecord(1);
|
|
record.StringData(0) = "[1]";
|
|
record.StringData(1) = message;
|
|
|
|
return Session.Message(options, record);
|
|
}
|
|
|
|
|
|
function DisplayUserDiagnostic(message){
|
|
if (!verbose) return 0;
|
|
|
|
if (typeof(Session) === undefined) {
|
|
WScript.Echo(message);
|
|
return 0;
|
|
}
|
|
|
|
var options = msiMessageLevel.User + msiButtonType.Ok + msiDefaultButton.First;
|
|
var record = Session.Installer.CreateRecord(1);
|
|
record.StringData(0) = "[1]";
|
|
record.StringData(1) = message;
|
|
|
|
return Session.Message(options, record);
|
|
}
|
|
|
|
function LogMessage(msg) {
|
|
var record = Session.Installer.CreateRecord(0);
|
|
record.StringData(0) = "CustomAction: " + msg;
|
|
Session.Message(msiMessageLevel.Info, record);
|
|
}
|
|
|
|
|
|
function mytrace(arg){
|
|
if (verbose == false) return;
|
|
// This just causes a regRead to be logged.
|
|
// Then in PerfMon or RegMon, you can use it as a "trace"
|
|
try {
|
|
var junkTest = WSHShell.RegRead(regValue2 + arg);
|
|
}
|
|
catch (e2b) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
function RestoreZipAssocInRegistry_CA() {
|
|
// restore the app association for zip files, if possible.
|
|
var WSHShell = new ActiveXObject("WScript.Shell");
|
|
var priorAssociation = null;
|
|
var phase = "";
|
|
var currentAssociation;
|
|
var stillInstalled;
|
|
var parkingLot = "__DeleteThis";
|
|
|
|
try {
|
|
currentAssociation = WSHShell.RegRead(regPathZipAssoc);
|
|
LogMessage("Current assoc for .zip: " + currentAssociation);
|
|
|
|
if (currentAssociation == DotNetZipAssocId)
|
|
phase = "1";
|
|
else if (currentAssociation == "")
|
|
phase = "2";
|
|
|
|
LogMessage("phase " + phase);
|
|
|
|
if (phase == "1" || phase=="2") {
|
|
if (phase=="1")
|
|
priorAssociation= WSHShell.RegRead(regPathDnzPrior);
|
|
else
|
|
priorAssociation= WSHShell.RegRead(regPathZipAssoc + parkingLot);
|
|
|
|
LogMessage("prior assoc for .zip: " + priorAssociation);
|
|
if (priorAssociation != "") {
|
|
mytrace("A"+phase);
|
|
try {
|
|
mytrace("B"+phase);
|
|
stillInstalled = WSHShell.RegRead(regPathZipAssoc + "OpenWithProgIds\\" + priorAssociation);
|
|
// the value will be the empty string
|
|
LogMessage("the prior app is still installed.");
|
|
mytrace("C");
|
|
if (phase=="1")
|
|
WSHShell.RegWrite(regPathZipAssoc + parkingLot, priorAssociation );
|
|
else {
|
|
WSHShell.RegWrite(regPathZipAssoc, priorAssociation );
|
|
WSHShell.RegDelete(regPathZipAssoc + parkingLot);
|
|
}
|
|
}
|
|
catch (e2a) {
|
|
mytrace("F");
|
|
LogMessage("the prior app is NOT still installed.");
|
|
WSHShell.RegWrite(regPathZipAssoc, "CompressedFolder");
|
|
}
|
|
}
|
|
else {
|
|
mytrace("G");
|
|
LogMessage("the prior assoc is empty?");
|
|
WSHShell.RegWrite(regPathZipAssoc, "CompressedFolder");
|
|
}
|
|
}
|
|
else {
|
|
LogMessage("the associated app has changed.");
|
|
// The association has been changed since install of DotNetZip.
|
|
// We won't try to reset it.
|
|
}
|
|
}
|
|
catch (e1) {
|
|
LogMessage("there is no associated app.");
|
|
WSHShell.RegWrite(regPathZipAssoc, "CompressedFolder");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
function PreserveZipAssocInRegistry_CA() {
|
|
// get and store the existing association for zip files, if any
|
|
LogMessage("Hello from PreserveZipAssocInRegistry_CA()");
|
|
var WSHShell = new ActiveXObject("WScript.Shell");
|
|
var wantZipAssociation = Session.Property("WANT_ZIP_ASSOCIATIONS");
|
|
LogMessage("wantZipAssociation = " + wantZipAssociation);
|
|
|
|
if (wantZipAssociation == "1") {
|
|
try {
|
|
var association = WSHShell.RegRead(regPathZipAssoc);
|
|
if (association != "") {
|
|
LogMessage("PreserveFileAssoc: Current assoc for .zip: " + association);
|
|
if (association != DotNetZipAssocId) {
|
|
LogMessage("PreserveFileAssoc: it is NOT DotNetZip.");
|
|
// there is an association, and it is not DotNetZip
|
|
WSHShell.RegWrite(regPathDnzPrior, association);
|
|
}
|
|
else {
|
|
LogMessage("PreserveFileAssoc: it is DotNetZip.");
|
|
// the existing association is for DotNetZip
|
|
try {
|
|
var priorAssoc = WSHShell.RegRead(regPathDnzPrior);
|
|
if (priorAssoc == "" || priorAssoc == DotNetZipAssocId) {
|
|
LogMessage("PreserveFileAssoc: defaulting (0)");
|
|
WSHShell.RegWrite(regPathDnzPrior, "CompressedFolder");
|
|
}
|
|
else {
|
|
// there already is a stored prior association.
|
|
// don't change it.
|
|
}
|
|
}
|
|
catch (e1a) {
|
|
LogMessage("PreserveFileAssoc: exception: " + e1a.message);
|
|
LogMessage("PreserveFileAssoc: defaulting (1)");
|
|
WSHShell.RegWrite(regPathDnzPrior, "CompressedFolder");
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// there is no default association for .zip files
|
|
WSHShell.RegWrite(regPathDnzPrior, "CompressedFolder");
|
|
}
|
|
}
|
|
catch (e1) {
|
|
// the key doesn't exist (no app for .zip files at all)
|
|
WSHShell.RegWrite(regPathDnzPrior, "CompressedFolder");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// var parameters = Session.Property("CustomActionData").split("|");
|
|
// var targetDir = parameters[0];
|
|
// var checkBoxState = parameters[1];
|
|
|
|
// DisplayDiagnostic("Checkbox state; " + checkBoxState);
|
|
//
|
|
// PreserveFileAssociation();
|
|
// DeleteSelf();
|
|
//
|
|
//
|
|
// RestoreRegistry();
|