/* ***********************IMPORTANT *********************************************
 *  Copyright (C) 2004-2007 Thierry Lagarde <tlagarde@users.sourceforge.net>
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License.
 *
 *
 *                      ********************
 *
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *
 *                      ********************
 *
 *
 * You are highly encouraged to send your changes to <tlagarde@users.sourceforge.net>
 * for possible incorporation into the main distribution.
 * By sending these changes to <tlagarde@users.sourceforge.net>,
 * it is assumed that you are offering <tlagarde@users.sourceforge.net>
 * the unlimited, non-exclusive right to reuse, modify, and relicense the code.
 *
 *
 *                      ********************
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **************************************************************************************/
#ifdef         __SAMBA_ENABLE

#include <libsmbclient.h>
#include <gtk/gtk.h>
#include <dirent.h>
#include "Module_Samba.h"
#include "Debug.h"
#include "Interface/Samba_Connect_Interface.h"
#include "Interface/Root_Interface.h"
#include "Interface/Copie_Fichier_Interface.h"
#include "Interface/Menu_Samba_Interface.h"
#include "Reseau.h"
#include "Objet.h"
#include "Image.h"
#include "main.h"
#include "Animation.h"
#include "Gconf.h"
#include "Execute.h"
#include "Modules.h"
#include "Declaration_Constante.h"
#include "Macro.h"

extern struct Struct_Modele_Objet Liste_Modele_Objet[];

#define NB_FICHIER_EXTENSION 23
struct Struct_Type_Fichier_Default {
	gchar    *extension;
	gchar    *Fichier_Icone;
	GdkPixbuf *icone;
	gint      Id_Gconf;
	gchar    *Path_Exe;
} Type_Fichier_Default[] = {
	{
	".sxc", PATH_ICONE "Modes/File_Sharing/004_spreadsheet_document.png", NULL, CHAR_EXTENSION_SXC, NULL}, {
	".sxd", PATH_ICONE "Modes/File_Sharing/006_drawing_document.png", NULL, CHAR_EXTENSION_SXD, NULL}, {
	".sxi", PATH_ICONE "Modes/File_Sharing/008_presentation_document.png", NULL, CHAR_EXTENSION_SXI, NULL}, {
	".sxw", PATH_ICONE "Modes/File_Sharing/soffice.png", NULL, CHAR_EXTENSION_SXW, NULL}, {
	".png", PATH_ICONE "Modes/File_Sharing/gimp.png", NULL, CHAR_EXTENSION_PNG, NULL}, {
	".jpg", PATH_ICONE "Modes/File_Sharing/gimp.png", NULL, CHAR_EXTENSION_JPG, NULL}, {
	".xpm", PATH_ICONE "Modes/File_Sharing/gimp.png", NULL, CHAR_EXTENSION_XPM, NULL}, {
	".rpm", PATH_ICONE "Modes/File_Sharing/kpackage.png", NULL, CHAR_EXTENSION_RPM, NULL}, {
	".deb", PATH_ICONE "Modes/File_Sharing/kpackage.png", NULL, CHAR_EXTENSION_DEB, NULL}, {
	".mp3", PATH_ICONE "Modes/File_Sharing/mime_audio.png", NULL, CHAR_EXTENSION_MP3, NULL}, {
	".ogg", PATH_ICONE "Modes/File_Sharing/mime_audio.png", NULL, CHAR_EXTENSION_OGG, NULL}, {
	".wav", PATH_ICONE "Modes/File_Sharing/mime_audio.png", NULL, CHAR_EXTENSION_WAV, NULL}, {
	".html", PATH_ICONE "Modes/File_Sharing/mozilla_doc.png", NULL, CHAR_EXTENSION_HTML, NULL}, {
	".pdf", PATH_ICONE "Modes/File_Sharing/pdf.png", NULL, CHAR_EXTENSION_PDF, NULL}, {
	"readme", PATH_ICONE "Modes/File_Sharing/readme.png", NULL, CHAR_EXTENSION_README, NULL}, {
	".conf", PATH_ICONE "Modes/File_Sharing/readme.png", NULL, CHAR_EXTENSION_CONF, NULL}, {
	".c", PATH_ICONE "Modes/File_Sharing/source_c.png", NULL, CHAR_EXTENSION_C, NULL}, {
	".h", PATH_ICONE "Modes/File_Sharing/source_h.png", NULL, CHAR_EXTENSION_H, NULL}, {
	".tar", PATH_ICONE"Modes/File_Sharing/tar.png", NULL, CHAR_EXTENSION_TAR, NULL}, {
	".bz2", PATH_ICONE "Modes/File_Sharing/tar.png", NULL, CHAR_EXTENSION_BZ2, NULL}, {
	".gz", PATH_ICONE "Modes/File_Sharing/tar.png", NULL, CHAR_EXTENSION_GZ, NULL}, {
	".txt", PATH_ICONE"Modes/File_Sharing/txt.png", NULL, CHAR_EXTENSION_TXT, NULL}, {
	".avi", PATH_ICONE "Modes/File_Sharing/video.png", NULL, CHAR_EXTENSION_AVI, NULL}, {
	".doc", PATH_ICONE "Modes/File_Sharing/wordprocessing.png", NULL, CHAR_EXTENSION_DOC, NULL}, {
	".ogm", PATH_ICONE "Modes/File_Sharing/video.png", NULL, CHAR_EXTENSION_OGM, NULL}, {
NULL, NULL, NULL, 0, NULL}};


void Rafraichir_Samba (gpointer * pointer)
{
	Efface_Toute_Objet_Liste (Reseau_Selectionner, LISTE_MODULE);
	Affiche_Liste_Partage_Samba (Equipement_Selectionner->Chemin_Samba_En_Cours);
}


void Affiche_Menu_Samba (gpointer * pointer, GdkEventButton * bev)
{
	gtk_menu_popup (GTK_MENU (Menu_Samba), NULL, NULL, NULL, NULL, bev->button, bev->time);
}


void Init_Liste_Partage_Monter (void)
{
	Partage_Monter = NULL;
}


void Monte_Partage (gchar * Nom_Equipement, gchar * Nom_Partage)
{
	struct struct_Partage_Monter *Partage = NULL;
	int       i, Nb_Objet_Liste;
	pid_t     pid_fils;

	ERROR_if (Nom_Equipement == NULL);
	ERROR_if (Nom_Partage == NULL);

	Nb_Objet_Liste = g_list_length (Partage_Monter);
	for (i = 0; i < Nb_Objet_Liste; i++) {
		Partage = g_list_nth_data (Partage_Monter, i);
		if ((strcmp (Partage->Nom_Equipement, Nom_Equipement) == 0) && (strcmp (Partage->Nom_Partage, Nom_Partage) == 0)) {
			return;
		}
	}

	MALLOC (Partage, sizeof (struct struct_Partage_Monter));
	Partage->Nom_Equipement = g_strdup_printf ("%s", Nom_Equipement);
	Partage->Nom_Partage = g_strdup_printf ("%s", Nom_Partage);

	G_LIST_APPEND (Partage_Monter, Partage);

	pid_fils = fork ();
	if (pid_fils == 0) {
		gchar     Chemin_Partage[255];
		gchar     Tmp[255];

		sprintf (Chemin_Partage, "%s/.autoscan-network/Mount/", Info_User->pw_dir);
		mkdir (Chemin_Partage, 0755);//if (mkdir (Chemin_Partage, 0755) != 0)
		mkdir (Equipement_Selectionner->Partage_En_Cours, 0755);//if (mkdir (Equipement_Selectionner->Partage_En_Cours, 0755) != 0)
		if ((strlen (Equipement_Selectionner->User_Smb) != 0) && (strlen (Equipement_Selectionner->Password_Smb) != 0))
			sprintf (Tmp, "smbmount 
		else
			sprintf (Tmp, "smbmount 
		if (system (Tmp) < 0)
			debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Montage [%s/%s]", Nom_Equipement, Nom_Partage);
		_exit (0);
	}
}


void Demonte_Tout_Partage (void)
{
	struct struct_Partage_Monter *Partage = NULL;
	gint      Nb_Objet_Liste;
	gchar    *Command = NULL;

	Nb_Objet_Liste = g_list_length (Partage_Monter);
	Log_free(Donnee_Cle_Main,g_strdup_printf("Demontage tout (%d)******************\n", Nb_Objet_Liste));
	if (Nb_Objet_Liste != 0) {
		while ((Partage = g_list_nth_data (Partage_Monter, 0)) != NULL) {
			Log_free(Donnee_Cle_Main,g_strdup_printf(" Montage [%s]/[%s]\n", Partage->Nom_Equipement, Partage->Nom_Partage));
			Command = g_strdup_printf ("smbumount '%s/.autoscan-network/Mount/%s_%s/'", Info_User->pw_dir, Partage->Nom_Equipement, Partage->Nom_Partage);
			Log_free(Donnee_Cle_Main,g_strdup_printf( " Commande [%s]\n", Command));
			if (system (Command) < 0)
				Log_free(Donnee_Cle_Main,g_strdup_printf("  Erreur Demontage : [%s]\n", Command));
			else
				Log_free(Donnee_Cle_Main,g_strdup_printf( "  Demontage : OK : [%s]\n", Command));
			G_LIST_REMOVE (Partage_Monter, Partage);
			MYFREE (Command);
		}
	}
	Log_free(Donnee_Cle_Main,g_strdup_printf( "Demontage termine *****************\n"));
	if (g_list_length (Partage_Monter) != 0)
		Log_free(Donnee_Cle_Main,g_strdup_printf("Demonte_Tout_Partage n'a pas supprimé toute la liste\n"));
}


void Copie_Icone_Partage (gpointer * pointeur)
{
	struct Struct_Modele_Objet *Objet = (struct Struct_Modele_Objet *) pointeur;
	gint      i;

	ERROR_if (pointeur == NULL);
	for (i = 0; i < NB_FICHIER_EXTENSION; i++) {
		if ((strlen (Type_Fichier_Default[i].extension) < strlen (Objet->Chaine_Attacher))
			&& (strcmp (Objet->Chaine_Attacher + strlen (Objet->Chaine_Attacher) - strlen (Type_Fichier_Default[i].extension), Type_Fichier_Default[i].extension) == 0)) {
			Objet->icone = Type_Fichier_Default[i].icone;
			Objet->icone_griser = Type_Fichier_Default[i].icone;
			return;
		}
	}
	Objet->icone = Liste_Modele_Objet[FICHIER_PARTAGER].icone;
	Objet->icone_griser = Liste_Modele_Objet[FICHIER_PARTAGER].icone_griser;
}


void Chargement_Icone_Et_Extension_Samba (void)
{
	gint      i;

	for (i = 0; i < NB_FICHIER_EXTENSION; i++) {
		if (Type_Fichier_Default[i].icone == NULL)
			Type_Fichier_Default[i].icone = Chargement_Image (Type_Fichier_Default[i].Fichier_Icone, COULEUR);
		Type_Fichier_Default[i].Path_Exe = Lecture_Gconf_Char (Type_Fichier_Default[i].Id_Gconf);
	}
}


void Double_Clic_Fichier (gpointer * pointer)
{
#define DEBUT_CHAINE "file:"
	struct Struct_Modele_Objet *Objet = (struct Struct_Modele_Objet *) pointer;
	gchar    *Fichier_Source = NULL;
	gint      i;

	ERROR_if (pointer == NULL);
	ERROR_if (Objet->Chaine_Attacher == NULL);
	i = 0;
	while (i < NB_FICHIER_EXTENSION) {
		if (strncmp (Type_Fichier_Default[i].extension, Objet->Chaine_Attacher + (strlen (Objet->Chaine_Attacher) - strlen (Type_Fichier_Default[i].extension)), strlen (Type_Fichier_Default[i].extension)) == 0) {
		
			if (strlen(Type_Fichier_Default[i].Path_Exe)==0)
				return;
			if (strncmp (Objet->Chaine_Attacher, DEBUT_CHAINE, strlen (DEBUT_CHAINE)) == 0)
				Fichier_Source = Objet->Chaine_Attacher + strlen (DEBUT_CHAINE);
			else
				Fichier_Source = Objet->Chaine_Attacher;
			Fichier_Source = g_strdup_printf ("'%s'", Fichier_Source);
			Execute_Programme_Externe (Type_Fichier_Default[i].Path_Exe, Fichier_Source, Equipement_Selectionner);
			MYFREE (Fichier_Source);
			return;
		}
		i++;
	}
}


gboolean Creer_Fichier_Samba (gchar * fichier)
{
	gint      fd;

	ERROR_if (fichier == NULL);
	if ((fd = smbc_open (fichier, O_RDWR | O_CREAT, 0666)) < 0) {
		debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Creating file: %s: %s", fichier, strerror (errno));
		return FALSE;
	}
	if (smbc_close (fd) < 0) {
		debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Closing file: %s: %s", fichier, strerror (errno));
		return FALSE;
	}
	return TRUE;
}


gboolean Renommer_Samba (gchar * file, gchar * file2)
{
	ERROR_if (file == NULL);
	ERROR_if (file2 == NULL);
	if (smbc_rename (file, file2) < 0) {
		debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Renaming file: %s to %s: %s", file, file2, strerror (errno));
		return FALSE;
	}
	debug_printf (INTERFACE, D_INFO, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Renamed file %s to %s", file, file2);
	return TRUE;
}


gboolean Creer_Repertoire_Samba (gchar * Chemin_Nouveau_Repertoire)
{
	ERROR_if (Chemin_Nouveau_Repertoire == NULL);
	if (smbc_mkdir (Chemin_Nouveau_Repertoire, 0666) < 0) {
		debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Error making directory: %s  %s", Chemin_Nouveau_Repertoire, strerror (errno));
		return FALSE;
	}
	return TRUE;
}


gboolean Supprimer_Fichier_Samba (gchar * fichier)
{
	GtkWidget *Win_Supprime = NULL;

	Win_Supprime = gtk_message_dialog_new (GTK_WINDOW (window_root), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Delete ?");
	switch (gtk_dialog_run (GTK_DIALOG (Win_Supprime))) {
	    case GTK_RESPONSE_YES:
		    ERROR_if (fichier == NULL);
		    if (smbc_unlink (fichier) < 0) {
			    debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Deleting file: %s: %s\n", fichier, strerror (errno));
			    gtk_widget_destroy (Win_Supprime);
				return FALSE;
		    }
			gtk_widget_destroy (Win_Supprime);
			return TRUE;
		    break;
	}
	gtk_widget_destroy (Win_Supprime);
	return FALSE;
}


gboolean Supprimer_Repertoire_Samba (gchar * repertoire)
{
	ERROR_if (repertoire == NULL);
	if (smbc_rmdir (repertoire) < 0) {
		debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Deleting folder: %s: %s\n", repertoire, strerror (errno));
		return FALSE;
	}
	return TRUE;
}



gint Copie_Fichier (gchar * Source, gchar * Destination)
{
	struct dirent *entree = NULL;
	struct stat status;
	DIR      *dir = NULL;
	gchar    *Texte_Fichier_Source = NULL, *Texte_Repertoire_Destination = NULL, *Fichier_Source = NULL, *Fichier_Destination = NULL;
	gchar     buffer[100000];
	gint      fd, Nb_Octet_Lu, fsource;

	ERROR_if (Source == NULL);
	ERROR_if (Destination == NULL);
	Texte_Fichier_Source = g_strdup_printf ("Source : %s", Source);
	gtk_label_set_text (GTK_LABEL (label_Copie_Fichier_Source), Texte_Fichier_Source);
	MYFREE (Texte_Fichier_Source);
	Texte_Repertoire_Destination = g_strdup_printf ("Destination : %s", Destination);
	gtk_label_set_text (GTK_LABEL (label_Copie_Fichier_Destination), Texte_Repertoire_Destination);
	MYFREE (Texte_Repertoire_Destination);

	refresh ();
	stat (Source, &status);
	if (S_ISREG (status.st_mode)) {
		if ((fsource = open (Source, O_RDONLY)) < 0) {
			debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Ouverture du fichier source pour copie %s to %S : %s", Source, Destination, strerror (errno));
			return ERREUR;
		}
		if ((fd = smbc_open (Destination, O_RDWR | O_CREAT, 0666)) < 0) {
			debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Creating file: %s: %s", Destination, strerror (errno));
			close (fsource);
			return ERREUR;
		}
		while ((Nb_Octet_Lu = read (fsource, buffer, sizeof (buffer))) != 0) {
			if (Nb_Octet_Lu < 0) {
				debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "read file: %s: %s", Source, strerror (errno));
				break;
			}
			if (Annulation_Copie_Fichier)
				break;
		
			refresh ();
			if (smbc_write (fd, buffer, Nb_Octet_Lu) < 0) {
				debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "writing file: %s: %s", Destination, strerror (errno));
				break;
			}
		}
		if (close (fsource) < 0) {
			debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Closing file: %s: %s", Destination, strerror (errno));
			smbc_close (fd);
			return ERREUR;
		}
		if (smbc_close (fd) < 0) {
			debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Closing file: %s: %s", Destination, strerror (errno));
			return ERREUR;
		}
		return FICHIER;
	}
	if (S_ISDIR (status.st_mode)) {
		Creer_Repertoire_Samba (Destination);
		dir = opendir (Source);
		if (dir != NULL) {
			while ((entree = readdir (dir)) != NULL) {
				if ((strcmp (entree->d_name, ".") != 0) && (strcmp (entree->d_name, ".."))) {
					Fichier_Source = g_strdup_printf ("%s/%s", Source, entree->d_name);
					Fichier_Destination = g_strdup_printf ("%s/%s", Destination, entree->d_name);
					Copie_Fichier (Fichier_Source, Fichier_Destination);
					MYFREE (Fichier_Source);
					MYFREE (Fichier_Destination);
					if (Annulation_Copie_Fichier)
						break;
				
					refresh ();
				}
			}
			closedir (dir);
		}
		return REPERTOIRE;
	}
	debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Copie prob");
	return ERREUR;
}


void Copie_Fichier_Samba (gchar * Source, gchar * Repertoire_Destination)
{
#define DEBUT_CHAINE "file:"
	struct Struct_Modele_Objet *Objet = NULL;
	gchar    *Fichier_Source = NULL, *Fichier = NULL, *Fichier_Destination = NULL, *Repertoire_Courant = NULL, *Donnee_Attacher = NULL;
	gint      Info_Retour;

	ERROR_if (Source == NULL);
	ERROR_if (Repertoire_Destination == NULL);
	if (strncmp (Source, DEBUT_CHAINE, strlen (DEBUT_CHAINE)) == 0)
		Fichier_Source = Source + strlen (DEBUT_CHAINE);
	else
		Fichier_Source = Source;
	Fichier = rindex (Source, '/') + 1;
	Fichier_Destination = g_strdup_printf ("%s/%s", Equipement_Selectionner->Chemin_Samba_En_Cours, Fichier);
	Info_Retour = Copie_Fichier (Fichier_Source, Fichier_Destination);
	switch (Info_Retour) {
	    case FICHIER:
		    MYFREE (Fichier_Destination);
		    Repertoire_Courant = index (index (index (Equipement_Selectionner->Chemin_Samba_En_Cours, '/') + 1, '/') + 1, '/') + 1;
		    if ((Repertoire_Courant = index (Repertoire_Courant, '/')) == NULL)
			    Repertoire_Courant = "";
		    else
			    Repertoire_Courant++;
		    if (strlen (Repertoire_Courant) == 0)
			    Donnee_Attacher = g_strdup_printf ("%s%s", Equipement_Selectionner->Partage_En_Cours, Fichier);
		    else
			    Donnee_Attacher = g_strdup_printf ("%s%s/%s", Equipement_Selectionner->Partage_En_Cours, Repertoire_Courant, Fichier);
		    Ajouter_Nouvelle_Objet (FICHIER_PARTAGER, Fichier, NULL, Donnee_Attacher, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
		    break;
	    case REPERTOIRE:
		   
		    Objet = Ajouter_Nouvelle_Objet (PARTAGE_REPERTOIRE, Fichier, NULL, Fichier_Destination, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
		    Force_Objet_Repertoire_Liste (Objet, ID_Reseau_En_Cours);
		    break;
	    default:
		    MYFREE (Fichier_Destination);
		    debug_printf (INTERFACE, D_WARN, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Error file: %d: %s", Info_Retour, Fichier_Destination);
	}
}


void Creation_Fichier_Samba (void)
{
	struct Struct_Modele_Objet *Objet = NULL;
	GtkTreeViewColumn *column = NULL;
	GtkTreePath *path = NULL;
	GtkTreeModel *model = NULL;
	gchar    *Chemin_Nouveau_Fichier = NULL, *Donnee_Attacher = NULL;

	Chemin_Nouveau_Fichier = g_strdup_printf ("%s/New file.txt", Equipement_Selectionner->Chemin_Samba_En_Cours);
	if (Creer_Fichier_Samba (Chemin_Nouveau_Fichier)) {
		Donnee_Attacher = g_strdup_printf ("%sNew file.txt", Equipement_Selectionner->Partage_En_Cours);
		Objet = Ajouter_Nouvelle_Objet (FICHIER_PARTAGER, "New file.txt", NULL, Donnee_Attacher, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
		model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview_Modules));
		column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview_Modules), 0);
		path = gtk_tree_model_get_path (model, &Objet->ID_Arbre_Ligne);
		gtk_tree_view_set_cursor (GTK_TREE_VIEW (treeview_Modules), path, column, FALSE);
		gtk_tree_path_free (path);
	}
	MYFREE (Chemin_Nouveau_Fichier);
}


void Destruction_Fichier_Samba (struct Struct_Modele_Objet *Objet)
{
	gchar    *Ancien_Nom_Fichier = NULL, *Ancien_Chemin_Fichier = NULL;

	ERROR_if (Objet == NULL);
	ERROR_if (Objet->Chaine_Attacher == NULL);
	Ancien_Nom_Fichier = rindex (Objet->Chaine_Attacher, '/') + 1;
	Ancien_Chemin_Fichier = g_strdup_printf ("%s/%s", Equipement_Selectionner->Chemin_Samba_En_Cours, Ancien_Nom_Fichier);
	if (Supprimer_Fichier_Samba (Ancien_Chemin_Fichier)) {
		Supprime_Objet_Liste (Objet, Reseau_Selectionner);
		gtk_widget_set_sensitive (button_Refresh, FALSE);
	}
	MYFREE (Ancien_Chemin_Fichier);
}


void Termine_Renommer_Nom_Fichier_Samba (gpointer * pointer, gchar * Nouveau_Nom)
{
	struct Struct_Modele_Objet *Objet = (struct Struct_Modele_Objet *) pointer;
	gchar    *Ancien_Nom_Fichier = NULL, *Ancien_Chemin_Fichier = NULL, *Nouveau_Chemin_Fichier = NULL;

	ERROR_if (pointer == NULL);
	ERROR_if (Nouveau_Nom == NULL);
	ERROR_if (Objet->Chaine_Attacher == NULL);
	Ancien_Nom_Fichier = rindex (Objet->Chaine_Attacher, '/') + 1;
	Ancien_Chemin_Fichier = g_strdup_printf ("%s/%s", Equipement_Selectionner->Chemin_Samba_En_Cours, Ancien_Nom_Fichier);
	Nouveau_Chemin_Fichier = g_strdup_printf ("%s/%s", Equipement_Selectionner->Chemin_Samba_En_Cours, Nouveau_Nom);
	if (Renommer_Samba (Ancien_Chemin_Fichier, Nouveau_Chemin_Fichier)) {
	
		ERROR_if (Objet->Chaine_Attacher == NULL);
		MYFREE (Objet->Chaine_Attacher);
		Objet->Chaine_Attacher = g_strdup_printf ("%s%s", Equipement_Selectionner->Partage_En_Cours, Nouveau_Nom);
		Copie_Icone_Partage (pointer);
	}
	MYFREE (Ancien_Chemin_Fichier);
	MYFREE (Nouveau_Chemin_Fichier);
}


void Termine_Renommer_Nom_Repertoire_Samba (gpointer * pointer, gchar * Nouveau_Nom)
{
	struct Struct_Modele_Objet *Objet = (struct Struct_Modele_Objet *) pointer;
	gchar    *Ancien_Nom_Repertoire = NULL, *Ancien_Chemin_Repertoire = NULL, *Nouveau_Chemin_Repertoire = NULL;

	ERROR_if (pointer == NULL);
	ERROR_if (Nouveau_Nom == NULL);
	ERROR_if (Objet->Chaine_Attacher == NULL);
	Ancien_Nom_Repertoire = rindex (Objet->Chaine_Attacher, '/') + 1;
	Ancien_Chemin_Repertoire = g_strdup_printf ("%s/%s", Equipement_Selectionner->Chemin_Samba_En_Cours, Ancien_Nom_Repertoire);
	Nouveau_Chemin_Repertoire = g_strdup_printf ("%s/%s", Equipement_Selectionner->Chemin_Samba_En_Cours, Nouveau_Nom);
	if (Renommer_Samba (Ancien_Chemin_Repertoire, Nouveau_Chemin_Repertoire)) {
	
		ERROR_if (Objet->Chaine_Attacher == NULL);
		MYFREE (Objet->Chaine_Attacher);
		Objet->Chaine_Attacher = Nouveau_Chemin_Repertoire;
	}
	else
		MYFREE (Nouveau_Chemin_Repertoire);
	MYFREE (Ancien_Chemin_Repertoire);
}


void Creation_Repertoire_Samba (void)
{
	struct Struct_Modele_Objet *Objet = NULL;
	GtkTreeViewColumn *column = NULL;
	GtkTreePath *path = NULL;
	GtkTreeModel *model = NULL;
	gchar    *Chemin_Nouveau_Repertoire = NULL;

	Chemin_Nouveau_Repertoire = g_strdup_printf ("%s/New folder", Equipement_Selectionner->Chemin_Samba_En_Cours);
	if (Creer_Repertoire_Samba (Chemin_Nouveau_Repertoire)) {
		Objet = Ajouter_Nouvelle_Objet (PARTAGE_REPERTOIRE, "New folder", NULL, Chemin_Nouveau_Repertoire, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
		Force_Objet_Repertoire_Liste (Objet, ID_Reseau_En_Cours);
		model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview_Modules));
		column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview_Modules), 0);
		path = gtk_tree_model_get_path (model, &Objet->ID_Arbre_Ligne);
		gtk_tree_view_set_cursor (GTK_TREE_VIEW (treeview_Modules), path, column, FALSE);
		gtk_tree_path_free (path);
	}
	else
		MYFREE (Chemin_Nouveau_Repertoire);
}



void Destruction_Repertoire_Samba (struct Struct_Modele_Objet *Objet)
{
	gchar    *Ancien_Nom_Repertoire = NULL, *Ancien_Chemin_Repertoire = NULL;

	ERROR_if (Objet == NULL);
	ERROR_if (Objet->Chaine_Attacher == NULL);
	Ancien_Nom_Repertoire = rindex (Objet->Chaine_Attacher, '/') + 1;
	Ancien_Chemin_Repertoire = g_strdup_printf ("%s/%s", Equipement_Selectionner->Chemin_Samba_En_Cours, Ancien_Nom_Repertoire);
	if (Supprimer_Repertoire_Samba (Ancien_Chemin_Repertoire)) {
		Supprime_Objet_Liste (Objet, Reseau_Selectionner);
		gtk_widget_set_sensitive (button_Refresh, FALSE);
	}
	MYFREE (Ancien_Chemin_Repertoire);
}


void Double_Clic_Partage (gpointer * pointer)
{
	struct Struct_Modele_Objet *Objet = (struct Struct_Modele_Objet *) pointer;
	gchar    *Partage = NULL;

	ERROR_if (pointer == NULL);
	ERROR_if (Objet->Chaine_Attacher == NULL);
	debug_printf (INTERFACE, D_INFO, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Partage:  [%s]", Objet->Chaine_Attacher);
	if (Equipement_Selectionner->Chemin_Samba_En_Cours != NULL)
		MYFREE (Equipement_Selectionner->Chemin_Samba_En_Cours);
	Equipement_Selectionner->Chemin_Samba_En_Cours = g_strdup (Objet->Chaine_Attacher);
	Efface_Toute_Objet_Liste (Reseau_Selectionner, LISTE_MODULE);
	Partage = index (index (index (Equipement_Selectionner->Chemin_Samba_En_Cours, '/') + 1, '/') + 1, '/') + 1;
	Partage[strlen (Partage) - 1] = 0;
	if (Equipement_Selectionner->Partage_En_Cours != NULL)
		MYFREE (Equipement_Selectionner->Partage_En_Cours);
	Equipement_Selectionner->Partage_En_Cours = g_strdup_printf ("%s/.autoscan-network/Mount/%s_%s/", Info_User->pw_dir, Equipement_Selectionner->Smb.HostName, Partage);
	debug_printf (INTERFACE, D_INFO, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Partage:  [%s]", Equipement_Selectionner->Partage_En_Cours);
	if (Affiche_Liste_Partage_Samba (Equipement_Selectionner->Chemin_Samba_En_Cours))
		Monte_Partage (Equipement_Selectionner->Smb.HostName, Partage);
}


void Double_Clic_Repertoire (gpointer * pointer)
{
	struct Struct_Modele_Objet *Objet = (struct Struct_Modele_Objet *) pointer;

	ERROR_if (pointer == NULL);
	ERROR_if (Objet->Chaine_Attacher == NULL);
	if (Equipement_Selectionner->Chemin_Samba_En_Cours != NULL)
		MYFREE (Equipement_Selectionner->Chemin_Samba_En_Cours);
	Equipement_Selectionner->Chemin_Samba_En_Cours = g_strdup (Objet->Chaine_Attacher);
	Efface_Toute_Objet_Liste (Reseau_Selectionner, LISTE_MODULE);
	Affiche_Liste_Partage_Samba (Equipement_Selectionner->Chemin_Samba_En_Cours);
}


static void auth_fn (const char *server, const char *share, char *workgroup, int wgmaxlen, char *username, int unmaxlen, char *password, int pwmaxlen)
{
	if (Equipement_Selectionner->User_Smb != NULL)
		strcpy (username, Equipement_Selectionner->User_Smb);
	if (Equipement_Selectionner->Password_Smb != NULL)
		strcpy (password, Equipement_Selectionner->Password_Smb);
}


gboolean Affiche_Liste_Partage_Samba (gchar * Chemin_Partage)
{
	struct Struct_Modele_Objet *Objet = NULL;
	struct smbc_dirent *dirp = NULL;
	gchar    *Donnee_Attacher = NULL, *Repertoire_Courant = NULL;
	gchar     dirbuf[512];
	int       dh, err;

	ERROR_if (Chemin_Partage == NULL);
	debug_printf (INTERFACE, D_INFO, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Afficher Samba : [%s]", Chemin_Partage);
	if ((dh = smbc_opendir (Chemin_Partage)) < 0) {
		debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Could not list workgroups: [%s]: [%s]", Chemin_Partage, strerror (errno));
		return FALSE;
	}
	Initialisation_Partage_Fichier_Smb_Browser();
	while ((err = smbc_getdents (dh, (struct smbc_dirent *) dirbuf, sizeof (dirbuf))) != 0) {
		if (err < 0) {
			debug_printf (INTERFACE, D_WARN_USER, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Could not read directory for [%s] : [%s]", Chemin_Partage, strerror (errno));
			return FALSE;
		}
		dirp = (struct smbc_dirent *) dirbuf;
		while (err > 0) {
			int       dirlen = dirp->dirlen;

			switch (dirp->smbc_type) {
			    case SMBC_WORKGROUP:
				    
				    break;
			    case SMBC_SERVER:
				    
				    break;
			    case SMBC_FILE_SHARE:
				    Donnee_Attacher = g_strdup_printf ("%s/%s/", Chemin_Partage, dirp->name);
				    Objet = Ajouter_Nouvelle_Objet (PARTAGE, dirp->name, NULL, Donnee_Attacher, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
				    break;
			    case SMBC_PRINTER_SHARE:
				    
				    break;
			    case SMBC_COMMS_SHARE:
				    
				    break;
			    case SMBC_IPC_SHARE:
				    
				    break;
			    case SMBC_DIR:
				    if (strcmp (dirp->name, "..") != 0) {
					    if (strcmp (dirp->name, ".") == 0) {
						    Donnee_Attacher = g_strdup (Chemin_Partage);
						    Donnee_Attacher[rindex (rindex (Donnee_Attacher, '/') - 1, '/') - Donnee_Attacher] = 0;
						    Objet = Ajouter_Nouvelle_Objet (PARTAGE_REPERTOIRE_SUPERIEUR, dirp->name, NULL, Donnee_Attacher, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
						    Force_Objet_Repertoire_Liste (Objet, ID_Reseau_En_Cours);
					    }
					    else {
						    Donnee_Attacher = g_strdup_printf ("%s/%s", Chemin_Partage, dirp->name);
						    Objet = Ajouter_Nouvelle_Objet (PARTAGE_REPERTOIRE, dirp->name, NULL, Donnee_Attacher, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
						    Force_Objet_Repertoire_Liste (Objet, ID_Reseau_En_Cours);
					    }
				    }
				    break;
			    case SMBC_FILE:
				    debug_printf (INTERFACE, D_INFO, __FILE__, __PRETTY_FUNCTION__, __LINE__, "FILE");
				    Repertoire_Courant = index (index (index (Equipement_Selectionner->Chemin_Samba_En_Cours, '/') + 1, '/') + 1, '/') + 1;
				    if ((Repertoire_Courant = index (Repertoire_Courant, '/')) == NULL)
					    Repertoire_Courant = "";
				    else
					    Repertoire_Courant++;
				    if (strlen (Repertoire_Courant) == 0)
					    Donnee_Attacher = g_strdup_printf ("%s%s", Equipement_Selectionner->Partage_En_Cours, dirp->name);
				    else
					    Donnee_Attacher = g_strdup_printf ("%s%s/%s", Equipement_Selectionner->Partage_En_Cours, Repertoire_Courant, dirp->name);
				    Objet = Ajouter_Nouvelle_Objet (FICHIER_PARTAGER, dirp->name, NULL, Donnee_Attacher, PERE_RACINE, NULL, PERE_RACINE,PERE_RACINE, PERE_RACINE, PERE_RACINE, ID_Reseau_En_Cours, LISTE_MODULE);
				    break;
			    case SMBC_LINK:
				    break;
			    default:
				    debug_printf (INTERFACE, D_INFO, __FILE__, __PRETTY_FUNCTION__, __LINE__, "Inconnu (%d)", dirp->smbc_type);
			}
			dirp = (char *) ((char *) dirp + dirlen);
			err -= dirlen;
		}
	}
	smbc_closedir (dh);
	return TRUE;
}



void Connection_Samba(void){
	gchar    *Smb = NULL;
	

	if (Equipement_Selectionner->User_Smb != NULL)
		MYFREE (Equipement_Selectionner->User_Smb);
	if (Equipement_Selectionner->Password_Smb != NULL)
		MYFREE (Equipement_Selectionner->Password_Smb);
	Equipement_Selectionner->User_Smb = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry_Samba_Connect_User)));
	Equipement_Selectionner->Password_Smb = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry_Samba_Connect_Password)));

	Smb = g_strdup_printf ("smb://%s", Equipement_Selectionner->Adresse_Ip_Char);
	Affiche_Liste_Partage_Samba (Smb);
	MYFREE (Smb);
}

void Initialisation_Module_Samba (void)
{
	if (smbc_init (auth_fn, 0) < 0)
		debug_printf (INTERFACE, D_ERRO, __FILE__, __PRETTY_FUNCTION__, __LINE__, "smbc_init returned %s (%i)\nDo you have a ~/.smb/smb.conf file?", strerror (errno), errno);
	Chargement_Icone_Et_Extension_Samba ();
}



#else


#include "Module_Samba.h"

void Initialisation_Module_Samba (void)
{
	Double_Clic_Partage=NULL; 
	Termine_Renommer_Nom_Repertoire_Samba=NULL;
	Double_Clic_Repertoire=NULL;
	Affiche_Menu_Samba=NULL;
	Rafraichir_Samba=NULL;
	Copie_Icone_Partage=NULL;
	Termine_Renommer_Nom_Fichier_Samba=NULL;
	Double_Clic_Fichier=NULL;
}

#endif
