Files
copydev-imposing-tool/acrobat-plugin/src/Imposition-08-MiseAJour.js
Jules Dubois 08b7cb1a51 fix: retirer avecPrivileges des addMenu au chargement
app.beginPriv/endPriv ne fonctionne pas au top-level d'un
folder-level script (pas de contexte d'evenement). L'exception
etait avalee silencieusement, empechant la creation des menus.
Appel direct de addSubMenu/addMenuItem, autorise au chargement.

Fichiers modifies: Core, Licence, UI, MiseAJour.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-23 23:28:01 +02:00

225 lines
8.9 KiB
JavaScript
Executable File

// Imposition-08-MiseAJour.js
// ---------------------------------------------------------------------------
// Suite d'imposition professionnelle - Folder-Level Script pour Adobe Acrobat Pro
// Module 8 : Verification et installation des mises a jour, depuis le menu
// Acrobat lui-meme (pas besoin de relancer un installeur externe pour les
// mises a jour ulterieures ; l'installeur externe ne sert plus qu'au tout
// premier deploiement).
//
// Depend de Imposition-00-Core.js et Imposition-00b-Licence.js (reutilise
// CDImp.Licence._lireFluxReponse pour lire les reponses Net.HTTP).
//
// AVERTISSEMENTS TECHNIQUES - a tester dans Acrobat Pro reel :
// - Le parametre cFile de Net.HTTP.request() (telechargement direct vers
// un fichier disque) est suppose exister par analogie avec d'autres
// usages documentes du Network Object, mais n'a pas pu etre verifie ici.
// Si indisponible, ecrire le fichier autrement (ex: lire le flux comme
// pour la licence, puis l'ecrire avec un mecanisme de fichier - a
// determiner selon les API reellement exposees par votre version
// d'Acrobat).
// - L'enumeration des dossiers Acrobat installes evite volontairement
// l'objet `Enumerator` (specifique a JScript/WSH, probablement absent du
// moteur JS d'Acrobat) : on teste une liste de noms de version connus
// via FolderExists() plutot que d'enumerer dynamiquement le contenu du
// dossier %APPDATA%\Adobe\Acrobat. Completer CONFIG.versionsConnues si
// une version recente n'y figure pas.
// ---------------------------------------------------------------------------
if (typeof CDImp === "undefined") {
throw new Error("Imposition-08-MiseAJour.js : CDImp.Core doit etre charge avant ce fichier.");
}
CDImp.MiseAJour = CDImp.MiseAJour || {};
CDImp.MiseAJour.CONFIG = {
urlBaseRaw: "https://git.copydev.fr/jules/copydev-imposing-tool/raw/branch/master/acrobat-plugin/",
fichierVersion: "version.txt",
dossierSrc: "src/",
fichiers: [
"Imposition-00-Core.js",
"Imposition-00b-Licence.js",
"Imposition-01-UI.js",
"Imposition-02-Livret.js",
"Imposition-03-NUp.js",
"Imposition-04-Decoupe.js",
"Imposition-05-Marges.js",
"Imposition-06-Reperes.js",
"Imposition-07-Auto.js",
"Imposition-08-MiseAJour.js"
],
versionsConnues: ["DC", "2024", "2023", "2022", "2021", "2020", "11.0"]
};
// -----------------------------------------------------------------------
// Comparaison de versions "x.y.z"
// -----------------------------------------------------------------------
/**
* @returns {Number} 1 si b > a, -1 si b < a, 0 si egales
*/
CDImp.MiseAJour._comparerVersions = function (a, b) {
var pa = String(a).split(".").map(Number);
var pb = String(b).split(".").map(Number);
var n = Math.max(pa.length, pb.length);
for (var i = 0; i < n; i++) {
var va = pa[i] || 0;
var vb = pb[i] || 0;
if (vb > va) { return 1; }
if (vb < va) { return -1; }
}
return 0;
};
// -----------------------------------------------------------------------
// Detection des dossiers JavaScripts d'Acrobat installes
// -----------------------------------------------------------------------
CDImp.MiseAJour._trouverDossiersJavaScripts = function () {
var dossiers = [];
try {
var shell = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var racine = shell.ExpandEnvironmentStrings("%APPDATA%") + "\\Adobe\\Acrobat";
for (var i = 0; i < CDImp.MiseAJour.CONFIG.versionsConnues.length; i++) {
var dossierVersion = racine + "\\" + CDImp.MiseAJour.CONFIG.versionsConnues[i];
if (fso.FolderExists(dossierVersion)) {
var dossierJS = dossierVersion + "\\JavaScripts";
if (!fso.FolderExists(dossierJS)) {
fso.CreateFolder(dossierJS);
}
dossiers.push(dossierJS);
}
}
} catch (e) {
// ActiveXObject indisponible : on ne peut pas detecter les dossiers
// automatiquement (cas hors Windows, ou scripts non-privilegies).
}
return dossiers;
};
// -----------------------------------------------------------------------
// Requete HTTP GET -> texte (reutilise la lecture de flux de Licence.js)
// -----------------------------------------------------------------------
CDImp.MiseAJour._telechargerTexte = function (url) {
var resultat = { erreur: null, texte: null };
try {
Net.HTTP.request({
cVerb: "GET",
cURL: url,
oHandler: {
response: function (msgStream, status) {
if (status && status >= 400) {
resultat.erreur = "HTTP " + status;
} else {
resultat.texte = CDImp.Licence._lireFluxReponse(msgStream);
}
},
error: function (msg, err) {
resultat.erreur = (err || msg || "Erreur reseau inconnue").toString();
}
},
bAsync: false
});
} catch (e) {
resultat.erreur = e.toString();
}
return resultat;
};
/**
* Telecharge url directement vers le fichier cheminDest (ecrase si present).
*/
CDImp.MiseAJour._telechargerVersFichier = function (url, cheminDest) {
var resultat = { erreur: null };
try {
Net.HTTP.request({
cVerb: "GET",
cURL: url,
cFile: cheminDest,
oHandler: {
response: function (msgStream, status) {
if (status && status >= 400) {
resultat.erreur = "HTTP " + status;
}
},
error: function (msg, err) {
resultat.erreur = (err || msg || "Erreur reseau inconnue").toString();
}
},
bAsync: false
});
} catch (e) {
resultat.erreur = e.toString();
}
return resultat;
};
// -----------------------------------------------------------------------
// Point d'entree : verifie puis propose d'installer la mise a jour
// -----------------------------------------------------------------------
CDImp.MiseAJour.verifier = function () {
var reponse = CDImp.MiseAJour._telechargerTexte(
CDImp.MiseAJour.CONFIG.urlBaseRaw + CDImp.MiseAJour.CONFIG.fichierVersion);
if (reponse.erreur || !reponse.texte) {
CDImp.Util.erreur("Impossible de verifier les mises a jour (reseau indisponible ou serveur inaccessible) :\n" + (reponse.erreur || ""));
return;
}
var versionDistante = reponse.texte.replace(/[\r\n\s]+/g, "");
var comparaison = CDImp.MiseAJour._comparerVersions(CDImp.VERSION, versionDistante);
if (comparaison <= 0) {
CDImp.Util.info("Vous avez deja la derniere version (v" + CDImp.VERSION + ").");
return;
}
var confirmer = app.alert({
cMsg: "Une mise a jour est disponible : v" + versionDistante + " (vous avez v" + CDImp.VERSION + ").\nInstaller maintenant ?",
cTitle: "Mise a jour disponible",
nIcon: 2, // question
nType: 2 // Oui/Non
});
if (confirmer !== 4) { // 4 = "Oui" pour nType 2 dans Acrobat JS
return;
}
var dossiers = CDImp.MiseAJour._trouverDossiersJavaScripts();
if (dossiers.length === 0) {
CDImp.Util.erreur("Aucun dossier JavaScripts d'Acrobat detecte automatiquement.\nMise a jour annulee : utilisez l'installeur externe si besoin.");
return;
}
var erreurs = [];
CDImp.Util.avecPrivileges(function () {
for (var d = 0; d < dossiers.length; d++) {
for (var f = 0; f < CDImp.MiseAJour.CONFIG.fichiers.length; f++) {
var nomFichier = CDImp.MiseAJour.CONFIG.fichiers[f];
var url = CDImp.MiseAJour.CONFIG.urlBaseRaw + CDImp.MiseAJour.CONFIG.dossierSrc + nomFichier;
var cheminDest = dossiers[d] + "\\" + nomFichier;
var resultatTelechargement = CDImp.MiseAJour._telechargerVersFichier(url, cheminDest);
if (resultatTelechargement.erreur) {
erreurs.push(nomFichier + " (" + dossiers[d] + ") : " + resultatTelechargement.erreur);
}
}
}
});
if (erreurs.length > 0) {
CDImp.Util.erreur("Mise a jour partielle, erreurs sur " + erreurs.length + " fichier(s) :\n" + erreurs.join("\n"));
} else {
CDImp.Util.info("Mise a jour vers v" + versionDistante + " installee avec succes.\nRedemarrez Acrobat Pro pour l'appliquer.");
}
};
// -----------------------------------------------------------------------
// Entree de menu "Verifier les mises a jour..."
// -----------------------------------------------------------------------
try {
app.addMenuItem({
cName: "CDImpVerifierMAJ",
cParent: "ImpositionPro",
cExec: "CDImp.MiseAJour.verifier();",
nPos: 2
});
} catch (e) {}