package X ;

use strict ;

require Exporter ;
use vars qw(@EXPORT_OK) ;
@EXPORT_OK = qw ($gladexml) ;
use vars qw($gladexml) ;

use Gtk2 '-init' ;
use Gtk2::GladeXML ;

# On crée l'arbre xml complet. Attention, toutes les fenêtres déclarées
# visibles dans le menu Propriétés->commun->visible, seront affichées
# quand on lancera "Gtk2->main".
$gladexml = Gtk2::GladeXML->new('xsshfs.glade' ) ;
# On initialise les variables du module rappels.
rappels::init () ;
# On connecte les fonctions de rappels de l'arbre xml
# à leurs définitions qui sont contenues dans le module rappels.
$gladexml->signal_autoconnect_from_package('rappels' ) ;

1 ;

package rappels ;

use strict ;
use vars qw($gladexml $C_fichier_sav $C_default_combo_set_text $C_debug) ;
# $gladexml est donc la variable qui fera référence à l'arbre xml
# de l'application.
# On initialise la valeur de la variable quand l'arbre est créé
# dans le module principale

############
# Programme principal
############

sub init {
	# Constante globale
	$C_debug = 0;
	$C_fichier_sav = "$ENV{HOME}/.xsshfs";
	$C_default_combo_set_text = "Sélectionner";
	# Démarage de l'interface graphique
	$gladexml = $X::gladexml ;
	# Valeur d'environement par default pour les nouvelle connexion
	my $user_default=$gladexml->get_widget('user')->set_text($ENV{ USER});;
	# Actualiser les donner dans la fenêtre
	&actualiser_connexion_sav_combo;
	&actualiser_deconnexion_combo;
}

############
# Fonction déclanché par clique bouton
############

# Pour quitter l'application ou boite de dialog
sub on_window1_delete_event{
	debug("Fenêtre fermmer : on quitte");
	Gtk2->main_quit ;
}
sub on_bouton_quitter_clicked{
	debug("Bouton quitter cliquer : on quitte");
	Gtk2->main_quit ;
}
sub on_bouton_fermer_erreur_clicked{
	my $Erreur_Dialog = $gladexml->get_widget('Erreur_Dialog')->hide;
}
sub fermeture_nom_sav{
	my $Erreur_Dialog = $gladexml->get_widget('Nom_Sav_Dialog')->hide;
}
# Nouveau montage
sub on_bouton_monter_new_clicked {
	debug("Nouveau montage");
	# On récupÃ¨re les données du formulaire
	my $data_user = $gladexml->get_widget('user')->get_text();
	my $data_host = $gladexml->get_widget('host')->get_text();
	my $data_dir = $gladexml->get_widget('dir')->get_text();
	my $data_mountpoint = $gladexml->get_widget('mountpoint')->get_text();
	my $data_port = $gladexml->get_widget('port')->get_text();
	my $data_key = $gladexml->get_widget('key')->get_text();
	my $check_sav = $gladexml->get_widget('Sauvegarde_Check_Bouton' ) ;
	# Vérification si au moin le hosts Ã  été renseigné
	if ($data_host eq "")
	{
		Erreur_Dialog("Erreur : \n\t- L'adresse du serveur est obligatoire")
	} else 
	{
		# Demande d'enregistrement
		if ( $check_sav->get_active )
		{
			$gladexml->get_widget('Sav_Nom')->set_text("$data_user\@$data_host");
			my $Nom_Sav_Dialog = $gladexml->get_widget('Nom_Sav_Dialog')->run;
		}
		mount_sshfs($data_user, $data_host, $data_dir, $data_mountpoint, $data_port, $data_key);
	}
}
# Montage d'une connexion enregistrée
sub on_bouton_monter_sav_clicked {
	debug("Montage d'une connexion enregistrée");
	my $nom_connexion_enregistree = $gladexml->get_widget('connexion_sav_combo')->entry->get_text();
	if ($nom_connexion_enregistree ne $C_default_combo_set_text && $nom_connexion_enregistree ne "")
	{
		# Exploration du fichiers de sauvegarde
		open (FICSAV_R, "$C_fichier_sav");		
		while (<FICSAV_R>) {
			my @data_sav = split ("#", $_);
			#print "comparaison de $data_sav[0] eq $nom_connexion_enregistree \n";
			if ($data_sav[0] eq $nom_connexion_enregistree)
			{
				mount_sshfs($data_sav[1], $data_sav[2], $data_sav[3], $data_sav[4], $data_sav[5], $data_sav[6]);
			}
		}
		close(FICSAV_R);
	}
}
# Démontage
sub on_bouton_demonter_clicked {
	debug("Démontage un réperoire sshfs");
	my $a_deconnecter = $gladexml->get_widget('deconnexion_combo')->entry->get_text();
	if ($a_deconnecter ne $C_default_combo_set_text && $a_deconnecter ne "")
	{
		umount_sshfs($a_deconnecter);
	}
}
# Effacer une connexion enregistrée
sub on_button_effacer_connexion_enregistree_clicked {
	debug("Effacer connexion enregistrée");
	my $nom_connexion_enregistree = $gladexml->get_widget('connexion_sav_combo')->entry->get_text();
	if ($nom_connexion_enregistree ne $C_default_combo_set_text)
	{
		rename $C_fichier_sav, "$C_fichier_sav.back";
		# Lecture du fichier de sauvegarde back
		open (FICSAV_R, "$C_fichier_sav.back");		
		open (FICSAV_W, ">> $C_fichier_sav");
		while (<FICSAV_R>) {
			my ($var_nom_sav) = split ("#", $_);
			if ($var_nom_sav ne $nom_connexion_enregistree)
			{
				print FICSAV_W $_;
			}
		}
		close(FICSAV_W);
		close(FICSAV_R);
		unlink "$C_fichier_sav.back";
		&actualiser_connexion_sav_combo;
	}
}
sub on_bouton_actualiser_deconnexion_clicked {
	&actualiser_deconnexion_combo;
}
sub on_bouton_ouvrir_clicked {
	debug("Ouverture d'un répertoire");
	my $a_ouvrir = $gladexml->get_widget('deconnexion_combo')->entry->get_text();
	if ($a_ouvrir ne $C_default_combo_set_text && $a_ouvrir ne "")
	{
		# Ouverture gestionnaire fichiers
		my $ouvrir_dossier_fin = $gladexml->get_widget('Ouvrir_browser');
		if( $ouvrir_dossier_fin->get_active ) {
			my $PATH_XDG = "/usr/bin" ;
			if ( -f "$PATH_XDG/xdg-open" ) { system("xdg-open $a_ouvrir");}
		}
	}
}
############
# Fonction / Action du programme
############

# Fonction debug pour la prog 
sub debug {
	# 1 = Activer / 0 = Désactivé
	my $msg_debug=shift;
	if ($C_debug == 1)
	{
		print "Debug : $msg_debug\n";
	}
}
# Actualise la combobox de sauvegarde
sub actualiser_connexion_sav_combo{
	debug("Actualisation de la combo de sauvegarde");
	my (@liste_sav);
	my $nb_item = 0;
	# Si le fichier de sauvegarde existe
	if (-e $C_fichier_sav)
	{
		# Lecture du fichier de sauvegarde
		open (FICSAV, $C_fichier_sav);		
		while (<FICSAV>) {
			my ($var_add_sav) = split ("#", $_);
			@liste_sav = (@liste_sav, $var_add_sav);
			$nb_item = ($nb_item + 1);
		}
		close(FICSAV);
	}
	if ($nb_item eq 0)
	{
		$gladexml->get_widget("connexion_sav_combo")->set_popdown_strings("");
		$gladexml->get_widget("connexion_sav_combo")->entry->set_text("");
	}
	else 
	{
		$gladexml->get_widget("connexion_sav_combo")->set_popdown_strings(@liste_sav);
		$gladexml->get_widget("connexion_sav_combo")->entry->set_text($C_default_combo_set_text);    
	}
}
# Actualise la deconnexion combo
sub actualiser_deconnexion_combo {
	debug("Actualisation de la combo de déconnexion");
	my @liste_deco;
	my $nb_item = 0;
	open (FICMTAB, "/etc/mtab");		
	while (<FICMTAB>) {
		# Sélection des mount monté par l'utilisateur courant et étant du sshfs
		if (index($_, "sshfs") && index($_, "$ENV{USER}") ne -1 && index($_, ".gvfs") eq -1)
		{
			my @var_add_deco = split (" ", $_);
			@liste_deco = (@liste_deco, $var_add_deco[1]);
			$nb_item = ($nb_item + 1);
		}
	}
	close(FICMTAB);
	# Pour palier au BUG de l'actualisation quand il ne reste plus qu'une valeur on désactive le combo si elle est vide
	if ($nb_item eq 0)
	{
		$gladexml->get_widget("deconnexion_combo")->set_popdown_strings("");
		$gladexml->get_widget("deconnexion_combo")->entry->set_text("");
	}
	else 
	{
		$gladexml->get_widget("deconnexion_combo")->set_popdown_strings(@liste_deco);
		$gladexml->get_widget("deconnexion_combo")->entry->set_text($C_default_combo_set_text);    
	}
}
# Complétation automatique du champ mountpoint suivant user & host
sub on_host_or_user_changed {
	my $data_user = $gladexml->get_widget('user')->get_text();
	my $data_host = $gladexml->get_widget('host')->get_text();
	if ($data_user ne "" & $data_host ne "")
	{
		my $mountpoint_complet = "$ENV{HOME}/$data_user\@$data_host";
		$gladexml->get_widget('mountpoint')->set_text($mountpoint_complet);
	} else {
		$gladexml->get_widget('mountpoint')->set_text("");
	}
}
# Enregistrement de la connexion
sub Enregistrer_connexion {
	debug("Enregistrement de la connexion...");
	my $data_nom_sav = $gladexml->get_widget('Sav_Nom')->get_text();
	my $data_user = $gladexml->get_widget('user')->get_text();
	my $data_host = $gladexml->get_widget('host')->get_text();
	my $data_dir = $gladexml->get_widget('dir')->get_text();
	my $data_mountpoint = $gladexml->get_widget('mountpoint')->get_text();
	my $data_port = $gladexml->get_widget('port')->get_text();
	my $data_key = $gladexml->get_widget('key')->get_text();
	# Vérification de la non existance de la connexion
	my $erreur_sav_existe = 0;
	open (FICSAV, $C_fichier_sav);		
	while (<FICSAV>) {
		my ($var_nom_sav) = split ("#", $_);
		if ($var_nom_sav eq $data_nom_sav)
		{
			$erreur_sav_existe = 1;
		}
	}
	close(FICSAV);
	if ($erreur_sav_existe == 1)
	{
		Erreur_Dialog("Impossible d'enregistrer : \n\t-Ce nom de sauvegarde existe!");
		&fermeture_nom_sav;
		my $Nom_Sav_Dialog = $gladexml->get_widget('Nom_Sav_Dialog')->run;
	} else {
		# Enregistrement de la connexion
		open(FICSAV_W, ">> $C_fichier_sav");
		print FICSAV_W "$data_nom_sav#$data_user#$data_host#$data_dir#$data_mountpoint#$data_port#$data_key#\n";
		close(FICSAV_W);
		&fermeture_nom_sav;
		&actualiser_connexion_sav_combo;
	}
}
# Mount 
sub mount_sshfs {
	debug("Montage !");
	my ($data_user, $data_host, $data_dir, $data_mountpoint, $data_port, $data_key) = @_;
	my $options = "";
	# Vérification des datas
	if ($data_user eq "")
	{
		$data_user=$ENV{ USER};
	}
	if ($data_mountpoint eq "")
	{
		$data_mountpoint="$ENV{HOME}/$data_user\@$data_host";
	}
	if ($data_port eq "")
	{
		$data_port="22";
	}
	if ($data_key ne "")
	{
		$options = "-o IdentityFile=$data_key";
	}

	# Si le répertoire n'existe pas on le crée
	if (! -d $data_mountpoint)
	{
		mkdir $data_mountpoint;
	}
	system("sshfs $options $data_user\@$data_host:$data_dir $data_mountpoint -p $data_port 2> /tmp/xsshfs-sortie");
	if ($? != 0) {
		open (TMPSORTIE, "/tmp/xsshfs-sortie");
		undef $/;
		my $retour_cmd = <TMPSORTIE>;
		close(TMPSORTIE);
		Erreur_Dialog("Une erreur c'est produite", "$retour_cmd");
	} else {
		&nettoyer_fomulaire;
		&actualiser_deconnexion_combo;
		# Ouverture gestionnaire fichiers
		my $ouvrir_dossier_fin = $gladexml->get_widget('Ouvrir_browser');
		if( $ouvrir_dossier_fin->get_active ) {
			my $PATH_XDG = "/usr/bin" ;
			if ( -f "$PATH_XDG/xdg-open" ) { system("xdg-open $data_mountpoint");}
		}
	}
	unlink "/tmp/xsshfs-sortie";
}
# Démontage
sub umount_sshfs {
	debug("Démontage !");
	my ($a_demonter) = @_;
	system("fusermount -u $a_demonter 2> /tmp/xsshfs-sortie");
	if ($? != 0) {
		open (TMPSORTIE, "/tmp/xsshfs-sortie");
		undef $/;
		my $retour_cmd = <TMPSORTIE>;
		close(TMPSORTIE);
		Erreur_Dialog("Une erreur c'est produite", "$retour_cmd");
	} else {
		&actualiser_deconnexion_combo;
		rmdir $a_demonter;
	}
	unlink "/tmp/xsshfs-sortie";
}
# Vide le formulaire graphique
sub nettoyer_fomulaire {
	$gladexml->get_widget('user')->set_text($ENV{ USER});
	$gladexml->get_widget('host')->set_text("");
	$gladexml->get_widget('dir')->set_text("");
	$gladexml->get_widget('mountpoint')->set_text("");
	$gladexml->get_widget('port')->set_text("22");
	$gladexml->get_widget('key')->set_text("");
}
# Affiche les boite de dialog d'erreur
sub Erreur_Dialog{
	debug("Affichage de la boite de dialog d'erreur");
	my $msg_erreur = shift;
	my $detail_erreur = shift;
	$gladexml->get_widget('Erreur_Label')->set_text($msg_erreur);
	if ($detail_erreur eq "")
	{
		$gladexml->get_widget('erreur_text')->set_text("Aucun détail");
	} else {
		$gladexml->get_widget('erreur_text')->set_text($detail_erreur);
	}
	my $Erreur_Dialog = $gladexml->get_widget('Erreur_Dialog')->run;
}
1 ; 

