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>
225 lines
8.9 KiB
JavaScript
Executable File
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) {}
|