[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / plugins / get_infos.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 /**
16 * lecture du fichier de configuration d'un plugin
17 *
18 * @staticvar string $filecache
19 * @staticvar array $cache
20 * @param string|array|bool $plug
21 * @param bool $reload
22 * @param string $dir
23 * @return array
24 */
25 function plugins_get_infos_dist($plug=false, $reload=false, $dir = _DIR_PLUGINS, $clean_old=false){
26 static $cache='';
27 static $filecache = '';
28
29 if ($cache===''){
30 $filecache = _DIR_TMP."plugin_xml_cache.gz";
31 if (is_file($filecache)){
32 lire_fichier($filecache, $contenu);
33 $cache = unserialize($contenu);
34 }
35 if (!is_array($cache)) $cache = array();
36 }
37
38 if (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')
39 $reload = true;
40
41 if ($plug===false) {
42 ecrire_fichier($filecache, serialize($cache));
43 return $cache;
44 }
45 elseif (is_string($plug)) {
46 $res = plugins_get_infos_un($plug, $reload, $dir, $cache);
47 }
48 elseif (is_array($plug)) {
49 $res = false;
50 if (!$reload) $reload = -1;
51 foreach($plug as $nom)
52 $res |= plugins_get_infos_un($nom, $reload, $dir, $cache);
53 // Nettoyer le cache des vieux plugins qui ne sont plus la
54 if ($clean_old and count($cache[$dir])) {
55 foreach (array_keys($cache[$dir]) as $p) {
56 if (!in_array($p,$plug)) {
57 unset($cache[$dir][$p]);
58 }
59 }
60 }
61 }
62 if ($res) {
63 ecrire_fichier($filecache, serialize($cache));
64 }
65 if (!isset($cache[$dir])) {
66 return array();
67 }
68 return is_string($plug) ? $cache[$dir][$plug] : $cache[$dir];
69 }
70
71
72 function plugins_get_infos_un($plug, $reload, $dir, &$cache)
73 {
74 if (!is_readable($file = "$dir$plug/" . ($desc = "paquet") . ".xml")) {
75 if (!is_readable($file = "$dir$plug/" . ($desc = "plugin") . ".xml"))
76 return false;
77 }
78
79 if (($time = intval(@filemtime($file))) < 0) return false;
80 $md5 = md5_file($file);
81
82 $pcache = isset($cache[$dir][$plug])
83 ? $cache[$dir][$plug] : array('filemtime' => 0, 'md5_file' => '');
84
85 // si le cache est valide
86 if ((intval($reload) <= 0)
87 AND ($time > 0)
88 AND ($time <= $pcache['filemtime'])
89 AND $md5==$pcache['md5_file'])
90 return false;
91
92 // si on arrive pas a lire le fichier, se contenter du cache
93 if (!($texte = spip_file_get_contents($file))) {
94 return false;
95 }
96
97 $f = charger_fonction('infos_' . $desc, 'plugins');
98 $ret = $f($texte, $plug, $dir);
99 $ret['filemtime'] = $time;
100 $ret['md5_file'] = $md5;
101 $diff = ($ret != $pcache);
102
103 if ($diff) {
104 $cache[$dir][$plug] = $ret;
105 # echo count($cache[$dir]), $dir,$plug, " $reloadc<br>";
106 }
107 return $diff;
108 }
109 ?>