/**
 * Chargement du formulaire de gestion des plugins
 *
 * @uses  svp_actualiser_paquets_locaux()
 * @param string $voir
 *     Statut des plugins que l'on souhaite voir : actif, inactif, tous
 * @param string $verrouille
 *     Types de plugins que l'on souhaite voir :
 *     - 'non' : les plugins utilisateurs
 *     - 'oui' : les plugins verrouillés (plugins-dist)
 *     - 'tous' : les deux !
 * @param string|int $id_paquet
 *     Identifiant du paquet dont on veut obtenir une description complète
 *     lors de l'affichage du formulaire
 * @param string $redirect
 *     URL de redirection après les traitements
 * @return array
 *     Environnement du formulaire
 **/
function formulaires_admin_plugin_charger_dist($voir = 'actif', $verrouille = 'non', $id_paquet = '', $redirect = '')
{
    $valeurs = array();
    // actualiser la liste des paquets locaux systematiquement
    include_spip('inc/svp_depoter_local');
    // sans forcer tout le recalcul en base, mais en récupérant les erreurs XML
    $valeurs['_erreurs_xml'] = array();
    svp_actualiser_paquets_locaux(false, $valeurs['_erreurs_xml']);
    $valeurs['actif'] = 'oui';
    if ($voir == 'inactif') {
        $valeurs['actif'] = 'non';
    }
    if ($voir == 'tous') {
        $valeurs['actif'] = '';
    }
    $valeurs['constante'] = array('_DIR_PLUGINS', '_DIR_PLUGINS_SUPPL');
    if ($verrouille == 'oui') {
        $valeurs['constante'] = array('_DIR_PLUGINS_DIST');
    }
    if ($verrouille == 'tous') {
        $valeurs['constante'] = array();
    }
    $valeurs['verrouille'] = $verrouille;
    $valeurs['id_paquet'] = $id_paquet;
    $valeurs['actions'] = array();
    $valeurs['ids_paquet'] = _request('ids_paquet');
    $valeurs['afficher_incompatibles'] = _request('afficher_incompatibles');
    $valeurs['_todo'] = _request('_todo');
    $valeurs['_notices'] = _request('_notices');
    $valeurs['_libelles_actions'] = _request('_libelles_actions');
    return $valeurs;
}
/**
 * Action effectuant 1 action dans la liste des actions à réaliser
 * sur les plugins.
 *
 * Cette action sera relancée tant qu'il reste des actions à faire
 */
function action_actionner_dist()
{
    // droits
    include_spip('inc/autoriser');
    if (!autoriser('configurer', '_plugins')) {
        include_spip('inc/minipres');
        echo minipres();
        exit;
    }
    include_spip('inc/svp_actionner');
    include_spip('inc/headers');
    $actionneur = new Actionneur();
    $actionneur->get_actions();
    if ($actionneur->one_action()) {
        // si SVP a été enlevé des actifs, on redirige sur la fin...
        // sinon cette page d'action/actionner devient introuvable.
        // dans ce cas précis, les autres actions prévues venant après la desactivation de SVP
        // ne pourront être traitees... SVP n'étant plus là !
        if ($actionneur->tester_si_svp_desactive()) {
            $url = _request('redirect');
        } else {
            $url = generer_action_auteur('actionner', '', _request('redirect'));
        }
        // en mode pas à pas, on affiche un bilan entre chaque action
        // et on demande a l'utilistateur de cliquer pour realiser
        // l'action suivante.
        include_spip('inc/config');
        if (lire_config('svp/mode_pas_a_pas') == 'oui') {
            include_spip('inc/minipres');
            $pres = $actionneur->presenter_actions();
            $btn = "<a href='{$url}'>[ Action Suivante ]</a>";
            $styles = "\n\t\t\t\t<style type='text/css'>\n\t\t\t\t#minipres #actionner .fail {color:#c30000;}\n\t\t\t\t#minipres #actionner ul {margin-left: 0.5em;}\n\t\t\t\t#minipres #actionner li {list-style-type:square; margin-left: 0.5em;}\n\t\t\t\t</style>";
            echo minipres(_T('svp:installation_en_cours'), $pres . '<br /><br />' . $btn . $styles);
            die;
        }
        redirige_par_entete(str_replace('&amp;', '&', $url));
    }
    foreach ($actionneur->done as $done) {
        if ($done['todo'] == 'on') {
            if ($voir = session_get('svp_admin_plugin_voir') and $voir == 'inactif') {
                session_set('svp_admin_plugin_voir', 'actif');
            }
            break;
        }
    }
    include_spip('inc/svp_depoter_local');
    svp_actualiser_paquets_locaux();
    if (!_request('redirect')) {
        $GLOBALS['redirect'] = generer_url_ecrire('admin_plugin');
    } else {
        $GLOBALS['redirect'] = str_replace('&amp;', '&', _request('redirect'));
    }
}
/**
 * Ajout d'un dépot et de son contenu (paquets, plugins) dans la base de données
 *
 * Si une erreur survient (syntaxe XML incorrecte, pas de plugin dans le dépot),
 * son texte est placé dans le paramètre $erreur
 * 
 * @param string $url
 *     URL du fichier XML de description du dépot
 * @param string $erreur
 *     Texte d'un éventuel message d'erreur
 * @return bool
 *     true si le dépot est ajouté correctement, false sinon
 */
function svp_ajouter_depot($url, &$erreur = '')
{
    include_spip('inc/distant');
    // On considere que l'url a deja ete validee (correcte et nouveau depot)
    $url = trim($url);
    // Ajout du depot dans la table spip_depots. Les compteurs de paquets et de plugins
    // sont mis a jour apres le traitement des paquets
    // on recupère le XML
    $fichier_xml = copie_locale($url, 'modif');
    if (!$fichier_xml) {
        $erreur = _T('svp:message_nok_xml_non_recupere', array('fichier' => $url));
        return false;
    }
    $fichier_xml = _DIR_RACINE . $fichier_xml;
    // Lire les donnees d'un depot de paquets
    $infos = svp_phraser_depot($fichier_xml);
    if (!$infos) {
        $erreur = _T('svp:message_nok_xml_non_conforme', array('fichier' => $url));
        return false;
    }
    $titre = filtrer_entites($infos['depot']['titre']);
    $champs = array('titre' => $titre, 'descriptif' => filtrer_entites($infos['depot']['descriptif']), 'type' => $infos['depot']['type'], 'url_serveur' => $infos['depot']['url_serveur'], 'url_brouteur' => $infos['depot']['url_brouteur'], 'url_archives' => $infos['depot']['url_archives'], 'url_commits' => $infos['depot']['url_commits'], 'xml_paquets' => $url, 'sha_paquets' => sha1_file($fichier_xml), 'nbr_paquets' => 0, 'nbr_plugins' => 0, 'nbr_autres' => 0);
    // verifier avant l'insertion que le depot n'existe pas deja
    // car la recuperation pouvant etre longue on risque le probleme en cas de concurrence
    if (sql_countsel('spip_depots', 'xml_paquets=' . sql_quote($url))) {
        $erreur = _T('svp:message_nok_depot_deja_ajoute', array('url' => $url));
        return false;
    } elseif (!($id_depot = sql_insertq('spip_depots', $champs))) {
        $erreur = _T('svp:message_nok_sql_insert_depot', array('objet' => "{$titre} ({$url})"));
        return false;
    }
    // Ajout des paquets dans spip_paquets et actualisation des plugins dans spip_plugins
    $ok = svp_actualiser_paquets($id_depot, $infos['paquets'], $nb_paquets, $nb_plugins, $nb_autres);
    if (!$ok or $nb_paquets == 0) {
        // Si une erreur s'est produite, on supprime le depot deja insere
        sql_delete('spip_depots', 'id_depot=' . sql_quote($id_depot));
        if (!$ok) {
            $erreur = _T('svp:message_nok_xml_non_conforme', array('fichier' => $url));
        } else {
            $erreur = _T('svp:message_nok_aucun_paquet_ajoute', array('url' => $url));
        }
        return false;
    }
    // On met à jour le nombre de paquets et de plugins du depot maintenant !
    sql_updateq('spip_depots', array('nbr_paquets' => $nb_paquets, 'nbr_plugins' => $nb_plugins, 'nbr_autres' => $nb_autres), 'id_depot=' . sql_quote($id_depot));
    // On vide les paquets locaux pour mettre a jour leurs donnees relatives au depot
    // comme les mises a jour disponibles
    include_spip('inc/svp_depoter_local');
    svp_actualiser_paquets_locaux(true);
    return true;
}