2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
25
#include "applet-gvfs.h"
27
static GHashTable *s_hMonitorHandleTable = NULL;
30
static void _vfs_backend_free_monitor_data (gpointer *data)
34
GFileMonitor *pHandle = data[2];
35
g_file_monitor_cancel (pHandle); // le GFileMonitor est-il libere lors du g_file_monitor_cancel () ?
40
gboolean init_vfs_backend (void)
42
if (s_hMonitorHandleTable != NULL)
43
g_hash_table_destroy (s_hMonitorHandleTable);
45
s_hMonitorHandleTable = g_hash_table_new_full (g_str_hash,
48
(GDestroyNotify) _vfs_backend_free_monitor_data);
50
GVfs *vfs = g_vfs_get_default ();
51
return (vfs != NULL && g_vfs_is_active (vfs)); // utile ?
54
void stop_vfs_backend (void)
56
if (s_hMonitorHandleTable != NULL)
58
g_hash_table_destroy (s_hMonitorHandleTable);
59
s_hMonitorHandleTable = NULL;
64
static gchar *_cd_get_icon_path (GIcon *pIcon, const gchar *cTargetURI) // cTargetURI est l'URI que represente l'icone, pour les cas ou l'icone est contenue dans le repertoire lui-meme (CD ou DVD de jeux notamment)
66
//g_print ("%s ()\n", __func__);
67
gchar *cIconPath = NULL;
68
if (G_IS_THEMED_ICON (pIcon))
70
const gchar * const *cFileNames = g_themed_icon_get_names (G_THEMED_ICON (pIcon));
71
//cd_message ("icones possibles : %s\n", g_strjoinv (":", (gchar **) cFileNames));
73
for (i = 0; cFileNames[i] != NULL && cIconPath == NULL; i ++)
75
//g_print (" une icone possible est : %s\n", cFileNames[i]);
76
cIconPath = cairo_dock_search_icon_s_path (cFileNames[i]);
77
//g_print (" chemin trouve : %s\n", cIconPath);
80
else if (G_IS_FILE_ICON (pIcon))
82
GFile *pFile = g_file_icon_get_file (G_FILE_ICON (pIcon));
83
cIconPath = g_file_get_basename (pFile);
84
//g_print (" file_icon => %s\n", cIconPath);
86
if (cTargetURI && cIconPath && g_str_has_suffix (cIconPath, ".ico")) // cas des montages de CD ou d'iso
88
gchar *tmp = cIconPath;
89
cIconPath = g_strdup_printf ("%s/%s", cTargetURI, tmp);
91
if (strncmp (cIconPath, "file://", 7) == 0)
94
cIconPath = g_filename_from_uri (tmp, NULL, NULL);
103
static void _cd_find_mount_from_volume_name (const gchar *cVolumeName, GMount **pFoundMount, gchar **cURI, gchar **cIconName)
105
g_return_if_fail (cVolumeName != NULL);
106
cd_message ("%s (%s)", __func__, cVolumeName);
107
GFile *pFile = g_file_new_for_uri ("computer://");
108
GError *erreur = NULL;
109
const gchar *cAttributes = G_FILE_ATTRIBUTE_STANDARD_TYPE","
110
G_FILE_ATTRIBUTE_STANDARD_NAME","
111
G_FILE_ATTRIBUTE_STANDARD_ICON","
112
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
113
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
114
GFileEnumerator *pFileEnum = g_file_enumerate_children (pFile,
116
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
119
//g_object_unref (pFile);
122
cd_warning ("gnome_integration : %s", erreur->message);
123
g_error_free (erreur);
127
GList *pIconList = NULL;
129
GFileInfo *pFileInfo;
132
pFileInfo = g_file_enumerator_next_file (pFileEnum, NULL, &erreur);
135
cd_warning ("gnome_integration : %s", erreur->message);
136
g_error_free (erreur);
141
if (pFileInfo == NULL)
143
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
144
if (iFileType == G_FILE_TYPE_MOUNTABLE)
146
const gchar *cFileName = g_file_info_get_name (pFileInfo);
147
cd_message (" test de %s...", cFileName);
148
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
150
GMount *pMount = NULL;
151
if (cTargetURI != NULL)
153
GFile *file = g_file_new_for_uri (cTargetURI);
154
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
155
//g_object_unref (file);
159
gchar *cName = g_mount_get_name (pMount);
160
cd_message (" mount : %s", cName);
161
if (cName != NULL && strcmp (cName, cVolumeName) == 0)
163
cd_message ("TROUVE");
164
*pFoundMount = pMount;
165
*cURI = g_strconcat ("computer:///", cFileName, NULL);
166
GIcon *pSystemIcon = g_mount_get_icon (pMount);
167
*cIconName = _cd_get_icon_path (pSystemIcon, NULL);
176
//g_object_unref (pFileEnum);
179
static GDrive *_cd_find_drive_from_name (const gchar *cName)
181
g_return_val_if_fail (cName != NULL, NULL);
182
cd_message ("%s (%s)", __func__, cName);
183
GVolumeMonitor *pVolumeMonitor = g_volume_monitor_get ();
184
GDrive *pFoundDrive = NULL;
186
//\___________________ On chope les disques connectes (lecteur de CD/disquette/etc) et on liste leurs volumes.
187
GList *pDrivesList = g_volume_monitor_get_connected_drives (pVolumeMonitor);
191
for (dl = pDrivesList; dl != NULL; dl = dl->next)
194
if (pFoundDrive == NULL)
196
cDriveName = g_drive_get_name (pDrive);
197
cd_message (" drive '%s'", cDriveName);
198
if (cDriveName != NULL && strcmp (cDriveName, cName) == 0)
199
pFoundDrive = pDrive;
201
g_object_unref (pDrive);
202
//g_free (cDriveName);
205
g_object_unref (pDrive);
207
g_list_free (pDrivesList);
210
static gchar *_cd_find_volume_name_from_drive_name (const gchar *cName)
212
g_return_val_if_fail (cName != NULL, NULL);
213
cd_message ("%s (%s)", __func__, cName);
214
GDrive *pDrive = _cd_find_drive_from_name (cName);
215
g_return_val_if_fail (pDrive != NULL, NULL);
217
gchar *cVolumeName = NULL;
218
GList *pAssociatedVolumes = g_drive_get_volumes (pDrive);
219
if (pAssociatedVolumes != NULL)
223
if (pAssociatedVolumes->next != NULL)
225
cd_message ("ce disque contient plus d'un volume, on garde le nom du disque plutot que de selectionner le nom d'un volume");
226
cd_message ("Pour info, la liste des volumes disponibles sur ce disque est :");
227
for (av = pAssociatedVolumes; av != NULL; av = av->next)
230
cd_message (" - %s", g_volume_get_name (pVolume));
231
/*if (cVolumeName == NULL)
232
cVolumeName = g_volume_get_name (pVolume);
234
cd_warning ("gnome-integration : this drive (%s) has more than 1 volume but we only consider the first one (%s), ignoring %s", cName, cVolumeName, g_volume_get_name (pVolume));*/
235
g_object_unref (pVolume);
240
return g_strdup ("discard");
241
pVolume = pAssociatedVolumes->data;
242
cVolumeName = g_volume_get_name (pVolume);
243
g_object_unref (pVolume);
244
cd_message ("ce disque contient 1 seul volume (%s), on prend son nom", cVolumeName);
246
g_list_free (pAssociatedVolumes);
248
//g_object_unref (pDrive);
251
static gboolean _cd_find_can_eject_from_drive_name (const gchar *cName)
253
cd_debug ("%s (%s)", __func__, cName);
254
GDrive *pDrive = _cd_find_drive_from_name (cName);
255
g_return_val_if_fail (pDrive != NULL, FALSE);
257
gboolean bCanEject = g_drive_can_eject (pDrive);
258
//g_object_unref (pDrive);
262
void vfs_backend_get_file_info (const gchar *cBaseURI, gchar **cName, gchar **cURI, gchar **cIconName, gboolean *bIsDirectory, int *iVolumeID, double *fOrder, CairoDockFMSortType iSortType)
264
g_return_if_fail (cBaseURI != NULL);
265
GError *erreur = NULL;
266
cd_message ("%s (%s)", __func__, cBaseURI);
269
if (strncmp (cBaseURI, "x-nautilus-desktop://", 21) == 0)
271
gchar *cNautilusFile = g_strdup (cBaseURI+14);
272
memcpy (cNautilusFile, "file", 4);
273
if (g_str_has_suffix (cBaseURI, ".volume"))
275
cNautilusFile[strlen(cNautilusFile)-7] = '\0';
277
else if (g_str_has_suffix (cBaseURI, ".drive"))
279
cNautilusFile[strlen(cNautilusFile)-6] = '\0';
281
cFullURI = g_filename_from_uri (cNautilusFile, NULL, &erreur);
284
cd_warning ("gnome_integration : %s", erreur->message);
285
g_error_free (erreur);
288
gchar *cVolumeName = cFullURI + 1; // on saute le '/'.
289
cd_message ("cVolumeName : %s", cVolumeName);
291
GMount *pMount = NULL;
292
_cd_find_mount_from_volume_name (cVolumeName, &pMount, cURI, cIconName);
293
g_return_if_fail (pMount != NULL);
295
*cName = g_strdup (cVolumeName);
296
*bIsDirectory = TRUE;
299
//g_object_unref (pMount);
302
//g_free (cNautilusFile);
307
if (*cBaseURI == '/')
308
cFullURI = g_filename_to_uri (cBaseURI, NULL, NULL);
310
cFullURI = g_strdup (cBaseURI);
311
if (*cBaseURI == ':' || *cFullURI == ':') // cas bizarre au demontage d'un signet ftp quand celui-ci n'est pas accessible plantage dans dbus).
313
cd_warning ("invalid URI (%s ; %s), skip it", cBaseURI, cFullURI);
321
cd_message (" -> cFullURI : %s", cFullURI);
323
GFile *pFile = g_file_new_for_uri (cFullURI);
325
const gchar *cQuery = G_FILE_ATTRIBUTE_STANDARD_TYPE","
326
G_FILE_ATTRIBUTE_STANDARD_SIZE","
327
G_FILE_ATTRIBUTE_TIME_MODIFIED","
328
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
329
G_FILE_ATTRIBUTE_STANDARD_NAME","
330
G_FILE_ATTRIBUTE_STANDARD_ICON","
331
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
332
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
333
GFileInfo *pFileInfo = g_file_query_info (pFile,
335
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
338
//g_object_unref (pFile);
341
cd_warning ("gnome_integration : %s", erreur->message);
342
g_error_free (erreur);
347
const gchar *cFileName = g_file_info_get_name (pFileInfo);
348
const gchar *cMimeType = g_file_info_get_content_type (pFileInfo);
349
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
351
if (iSortType == CAIRO_DOCK_FM_SORT_BY_DATE)
354
g_file_info_get_modification_time (pFileInfo, &t);
357
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_SIZE)
358
*fOrder = g_file_info_get_size (pFileInfo);
359
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_TYPE)
360
*fOrder = (cMimeType != NULL ? *((int *) cMimeType) : 0);
364
*bIsDirectory = (iFileType == G_FILE_TYPE_DIRECTORY);
365
cd_message (" => '%s' (mime:%s ; bIsDirectory:%d)", cFileName, cMimeType, *bIsDirectory);
367
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
368
if (iFileType == G_FILE_TYPE_MOUNTABLE)
373
cd_message (" cTargetURI:%s", cTargetURI);
374
GMount *pMount = NULL;
375
if (cTargetURI != NULL)
377
GFile *file = g_file_new_for_uri (cTargetURI);
378
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
379
//g_object_unref (file);
383
*cName = g_mount_get_name (pMount);
384
cd_message ("un GMount existe (%s)",* cName);
388
gchar *cMountName = g_strdup (cFileName);
389
gchar *str = strrchr (cMountName, '.'); // on vire l'extension ".volume" ou ".drive".
393
if (strcmp (str+1, "link") == 0) // pour les liens, on prend le nom du lien.
395
if (strcmp (cMountName, "root") == 0) // on remplace 'root' par un nom plus parlant, sinon on prendra le nom du lien.
397
*cName = g_strdup ("/");
400
else if (strcmp (str+1, "drive") == 0) // on cherche un nom plus parlant si possible.
402
gchar *cVolumeName = _cd_find_volume_name_from_drive_name (cMountName);
403
if (cVolumeName != NULL)
405
*cName = cVolumeName;
412
//g_free (cMountName);
415
*cName = g_strdup (cFileName);
420
*cName = g_strdup (cFileName);
424
if (cMimeType != NULL && strncmp (cMimeType, "image", 5) == 0)
426
gchar *cHostname = NULL;
427
GError *erreur = NULL;
428
gchar *cFilePath = g_filename_from_uri (cBaseURI, &cHostname, &erreur);
431
g_error_free (erreur);
433
else if (cHostname == NULL || strcmp (cHostname, "localhost") == 0) // on ne recupere la vignette que sur les fichiers locaux.
435
*cIconName = g_strdup (cFilePath);
436
cairo_dock_remove_html_spaces (*cIconName);
438
//g_free (cHostname);
440
if (*cIconName == NULL)
442
GIcon *pSystemIcon = g_file_info_get_icon (pFileInfo);
443
if (pSystemIcon != NULL)
445
*cIconName = _cd_get_icon_path (pSystemIcon, cTargetURI ? cTargetURI : *cURI);
448
cd_message ("cIconName : %s", *cIconName);
450
//*iVolumeID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE);
451
//cd_message ("ID : %d\n", *iVolumeID);
452
g_object_unref (pFileInfo);
455
static Icon *_cd_get_icon_for_volume (GVolume *pVolume, GMount *pMount)
457
Icon *pNewIcon = NULL;
462
pMount = g_volume_get_mount (pVolume);
463
else if (pMount == NULL)
466
if (pMount != NULL) // ce volume est monte.
468
pNewIcon = g_new0 (Icon, 1);
469
pNewIcon->cName = g_mount_get_name (pMount);
471
pRootDir = g_mount_get_root (pMount);
472
pNewIcon->cCommand = g_file_get_uri (pRootDir);
473
//g_object_unref (pRootDir);
475
pIcon = g_mount_get_icon (pMount);
476
pNewIcon->cFileName = _cd_get_icon_path (pIcon, NULL);
477
//g_object_unref (pIcon);
479
//g_object_unref (pMount);
481
else // ce volume est demonte, on le montre quand meme (l'automount peut etre off).
483
pNewIcon = g_new0 (Icon, 1);
484
pNewIcon->cName = g_volume_get_name (pVolume);
486
pIcon = g_volume_get_icon (pVolume);
487
pNewIcon->cFileName = _cd_get_icon_path (pIcon, NULL);
488
//g_object_unref (pIcon);
490
pNewIcon->cCommand = g_strdup (pNewIcon->cName);
492
pNewIcon->iVolumeID = 1;
493
pNewIcon->cBaseURI = g_strdup (pNewIcon->cCommand);
494
cd_message (" => %s", pNewIcon->cCommand);
498
GList *vfs_backend_list_volumes (void)
500
GVolumeMonitor *pVolumeMonitor = g_volume_monitor_get ();
501
GList *pIconsList = NULL;
504
//\___________________ On chope les disques connectes (lecteur de CD/disquette/etc) et on liste leurs volumes.
505
GList *pDrivesList = g_volume_monitor_get_connected_drives (pVolumeMonitor);
506
GList *pAssociatedVolumes;
510
for (dl = pDrivesList; dl != NULL; dl = dl->next)
513
cd_message ("drive '%s'", g_drive_get_name (pDrive));
515
pAssociatedVolumes = g_drive_get_volumes (pDrive);
516
if (pAssociatedVolumes != NULL)
518
for (av = pAssociatedVolumes; av != NULL; av = av->next)
521
cd_message (" + volume '%s'", g_volume_get_name (pVolume));
522
pNewIcon = _cd_get_icon_for_volume (pVolume, NULL);
523
if (pNewIcon != NULL)
524
pIconsList = g_list_prepend (pIconsList, pNewIcon);
525
//g_object_unref (pVolume);
527
g_list_free (pAssociatedVolumes);
529
else // le disque n'a aucun volume montable
531
cd_message (" le disque n'a aucun volume montable");
532
/*if (g_drive_is_media_removable (pDrive) && ! g_drive_is_media_check_automatic (pDrive))
534
g_drive_get_icon (pDrive);
535
g_drive_get_name (pDrive);
538
//g_object_unref (pDrive);
540
g_list_free (pDrivesList);
542
//\___________________ On chope les volumes qui ne sont pas associes a un disque.
543
GList *pVolumesList = g_volume_monitor_get_volumes (pVolumeMonitor);
545
for (v = pVolumesList; v != NULL; v = v->next)
548
cd_message ("volume '%s'", g_volume_get_name (pVolume));
549
pDrive = g_volume_get_drive (pVolume);
550
if (pDrive != NULL) // on l'a deja liste dans la 1ere boucle.
552
cd_message (" drive '%s' est deja liste", g_drive_get_name (pDrive));
553
//g_object_unref (pDrive);
557
cd_message (" + volume '%s'\n", g_volume_get_name (pVolume));
558
if (pNewIcon != NULL)
559
pNewIcon = _cd_get_icon_for_volume (pVolume, NULL);
560
pIconsList = g_list_prepend (pIconsList, pNewIcon);
562
//g_object_unref (pVolume);
564
g_list_free (pVolumesList);
566
//\___________________ On chope les points de montage qui n'ont pas de volumes. (montage de mtab, ftp, etc)
567
GList *pMountsList = g_volume_monitor_get_mounts (pVolumeMonitor);
570
for (m = pMountsList; m != NULL; m = m->next)
573
cd_message ("mount '%s'", g_mount_get_name (pMount));
574
pVolume = g_mount_get_volume (pMount);
575
if (pVolume != NULL) // on l'a deja liste precedemment.
577
cd_message ("volume '%s' est deja liste", g_volume_get_name (pVolume));
578
//g_object_unref (pVolume);
582
cd_message ("+ volume '%s'", g_volume_get_name (pVolume));
583
if (pNewIcon != NULL)
584
pNewIcon = _cd_get_icon_for_volume (NULL, pMount);
585
pIconsList = g_list_prepend (pIconsList, pNewIcon);
587
//g_object_unref (pMount);
589
g_list_free (pMountsList);
594
GList *vfs_backend_list_directory (const gchar *cBaseURI, CairoDockFMSortType iSortType, int iNewIconsType, gboolean bListHiddenFiles, gchar **cFullURI)
596
g_return_val_if_fail (cBaseURI != NULL, NULL);
597
cd_message ("%s (%s)", __func__, cBaseURI);
600
gboolean bAddHome = FALSE;
601
if (strcmp (cBaseURI, CAIRO_DOCK_FM_VFS_ROOT) == 0)
603
cURI = g_strdup ("computer://");
606
///return vfs_backend_list_volumes ();
607
//vfs_backend_list_volumes ();
609
else if (strcmp (cBaseURI, CAIRO_DOCK_FM_NETWORK) == 0)
610
cURI = g_strdup ("network://");
612
cURI = (*cBaseURI == '/' ? g_strconcat ("file://", cBaseURI, NULL) : g_strdup (cBaseURI));
615
GFile *pFile = g_file_new_for_uri (cURI);
616
GError *erreur = NULL;
617
const gchar *cAttributes = G_FILE_ATTRIBUTE_STANDARD_TYPE","
618
G_FILE_ATTRIBUTE_STANDARD_SIZE","
619
G_FILE_ATTRIBUTE_TIME_MODIFIED","
620
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
621
G_FILE_ATTRIBUTE_STANDARD_NAME","
622
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN","
623
G_FILE_ATTRIBUTE_STANDARD_ICON","
624
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
625
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
626
GFileEnumerator *pFileEnum = g_file_enumerate_children (pFile,
628
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
631
//g_object_unref (pFile);
634
cd_warning ("gnome_integration : %s", erreur->message);
635
g_error_free (erreur);
640
GList *pIconList = NULL;
642
GFileInfo *pFileInfo;
645
pFileInfo = g_file_enumerator_next_file (pFileEnum, NULL, &erreur);
648
cd_warning ("gnome_integration : %s", erreur->message);
649
g_error_free (erreur);
653
if (pFileInfo == NULL)
656
gboolean bIsHidden = g_file_info_get_is_hidden (pFileInfo);
657
if (bListHiddenFiles || ! bIsHidden)
659
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
660
GIcon *pFileIcon = g_file_info_get_icon (pFileInfo);
661
if (pFileIcon == NULL)
663
cd_message ("AUCUNE ICONE");
666
const gchar *cFileName = g_file_info_get_name (pFileInfo);
667
const gchar *cMimeType = g_file_info_get_content_type (pFileInfo);
670
icon = g_new0 (Icon, 1);
671
icon->iType = iNewIconsType;
672
icon->cBaseURI = g_strconcat (*cFullURI, "/", cFileName, NULL);
673
cd_message ("+ %s (mime:%s)", icon->cBaseURI, cMimeType);
675
if (iFileType == G_FILE_TYPE_MOUNTABLE)
677
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
678
cd_message (" c'est un point de montage correspondant a %s", cTargetURI);
680
GMount *pMount = NULL;
681
if (cTargetURI != NULL)
683
icon->cCommand = g_strdup (cTargetURI);
684
GFile *file = g_file_new_for_uri (cTargetURI);
685
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
686
//g_object_unref (file);
690
cName = g_mount_get_name (pMount);
691
cd_message ("un GMount existe (%s)", cName);
693
GVolume *volume = g_mount_get_volume (pMount);
695
cd_message (" volume associe : %s", g_volume_get_name (volume));
696
GDrive *drive = g_mount_get_drive (pMount);
698
cd_message (" disque associe : %s", g_drive_get_name (drive));
700
///pFileIcon = g_mount_get_icon (pMount);
704
cName = g_strdup (cFileName);
705
gchar *str = strrchr (cName, '.'); // on vire l'extension ".volume" ou ".drive".
709
if (strcmp (str+1, "link") == 0)
711
if (strcmp (cName, "root") == 0)
714
cName = g_strdup ("/");
717
else if (strcmp (str+1, "drive") == 0) // on cherche un nom plus parlant si possible.
719
gchar *cVolumeName = _cd_find_volume_name_from_drive_name (cName);
720
if (cVolumeName != NULL)
723
g_free (cVolumeName);
724
continue; /// apparemment il n'est plus necessaire d'afficher les .drives qui ont 1 (ou plusieurs ?) volumes, car ces derniers sont dans la liste, donc ca fait redondant.
725
/**if (strcmp (cVolumeName, "discard") == 0)
728
cName = cVolumeName;*/
734
cd_message ("le nom de ce volume est : %s", cName);
737
cName = g_strdup (cFileName);
739
if (icon->cCommand == NULL)
740
icon->cCommand = g_strdup (icon->cBaseURI);
742
icon->cFileName = NULL;
743
if (cMimeType != NULL && strncmp (cMimeType, "image", 5) == 0)
745
gchar *cHostname = NULL;
746
gchar *cFilePath = g_filename_from_uri (icon->cBaseURI, &cHostname, &erreur);
749
g_error_free (erreur);
752
else if (cHostname == NULL || strcmp (cHostname, "localhost") == 0) // on ne recupere la vignette que sur les fichiers locaux.
754
icon->cFileName = g_strdup (cFilePath);
755
cairo_dock_remove_html_spaces (icon->cFileName);
760
if (icon->cFileName == NULL)
762
icon->cFileName = _cd_get_icon_path (pFileIcon, icon->cCommand);
763
//g_print ("icon->cFileName : %s\n", icon->cFileName);
766
if (iSortType == CAIRO_DOCK_FM_SORT_BY_SIZE)
767
icon->fOrder = g_file_info_get_size (pFileInfo);
768
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_DATE)
771
g_file_info_get_modification_time (pFileInfo, &t);
772
icon->fOrder = t.tv_sec;
774
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_TYPE)
775
icon->fOrder = (cMimeType != NULL ? *((int *) cMimeType) : 0);
776
if (icon->fOrder == 0) // un peu moyen mais mieux que rien non ?
777
icon->fOrder = iOrder;
778
pIconList = g_list_insert_sorted (pIconList,
780
(GCompareFunc) cairo_dock_compare_icons_order);
781
cd_debug (" + %s (%s)", icon->cName, icon->cFileName);
784
} while (TRUE); // 'g_file_enumerator_close' est appelee lors du dernier 'g_file_enumerator_next_file'.
786
if (bAddHome && pIconList != NULL)
788
icon = g_new0 (Icon, 1);
789
icon->iType = iNewIconsType;
790
icon->cBaseURI = g_strdup_printf ("file://%s", "/home");
791
icon->cCommand = g_strdup ("/home");
792
//icon->cCommand = g_strdup (icon->cBaseURI);
794
icon->cName = g_strdup ("home");
795
Icon *pRootIcon = cairo_dock_get_icon_with_name (pIconList, "/");
796
if (pRootIcon == NULL)
798
pRootIcon = cairo_dock_get_first_icon (pIconList);
799
g_print ("domage ! (%s:%s)\n", pRootIcon->cCommand, pRootIcon->cName);
801
icon->cFileName = g_strdup (pRootIcon->cFileName);
802
icon->fOrder = iOrder++;
803
pIconList = g_list_insert_sorted (pIconList,
805
(GCompareFunc) cairo_dock_compare_icons_order);
808
if (iSortType == CAIRO_DOCK_FM_SORT_BY_NAME)
809
pIconList = cairo_dock_sort_icons_by_name (pIconList);
811
pIconList = cairo_dock_sort_icons_by_order (pIconList);
818
static gchar *_cd_find_target_uri (const gchar *cBaseURI)
820
GError *erreur = NULL;
821
GFile *pFile = g_file_new_for_uri (cBaseURI);
822
GFileInfo *pFileInfo = g_file_query_info (pFile,
823
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI,
824
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
827
g_object_unref (pFile);
830
cd_warning ("gnome-integration (%s) : %s", cBaseURI, erreur->message);
831
g_error_free (erreur);
834
gchar *cTargetURI = g_strdup (g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI));
835
g_object_unref (pFileInfo);
838
void vfs_backend_launch_uri (const gchar *cURI)
840
g_return_if_fail (cURI != NULL);
841
GError *erreur = NULL;
842
gchar *cFullURI = (*cURI == '/' ? g_strconcat ("file://", cURI, NULL) : g_strdup (cURI));
843
cd_message ("%s (%s)", __func__, cFullURI);
845
gchar *cTargetURI = _cd_find_target_uri (cFullURI);
846
gboolean bSuccess = g_app_info_launch_default_for_uri (cTargetURI != NULL ? cTargetURI : cFullURI,
853
cd_warning ("gnome_integration : couldn't launch '%s' [%s]", cURI, erreur->message);
854
g_error_free (erreur);
858
GMount *_cd_find_mount_from_uri (const gchar *cURI, gchar **cTargetURI)
860
cd_message ("%s (%s)", __func__, cURI);
861
gchar *_cTargetURI = _cd_find_target_uri (cURI);
863
GMount *pMount = NULL;
864
if (_cTargetURI != NULL)
866
cd_message (" pointe sur %s", _cTargetURI);
867
GFile *file = g_file_new_for_uri (_cTargetURI);
868
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
869
g_object_unref (file);
871
if (cTargetURI != NULL)
872
*cTargetURI = _cTargetURI;
874
g_free (_cTargetURI);
878
gchar *vfs_backend_is_mounted (const gchar *cURI, gboolean *bIsMounted)
880
cd_message ("%s (%s)", __func__, cURI);
881
gchar *cTargetURI = NULL;
882
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
883
cd_message (" cTargetURI : %s", cTargetURI);
888
if (cTargetURI != NULL && strcmp (cTargetURI, "file:///") == 0) // cas particulier ?
896
static gchar * _cd_find_drive_name_from_URI (const gchar *cURI)
898
g_return_val_if_fail (cURI != NULL, NULL);
899
if (strncmp (cURI, "computer:///", 12) == 0)
901
gchar *cDriveName = g_strdup (cURI+12);
902
gchar *str = strrchr (cDriveName, '.');
905
if (strcmp (str+1, "drive") == 0)
910
str = strchr (cDriveName, '\\');
922
gboolean vfs_backend_can_eject (const gchar *cURI)
924
cd_message ("%s (%s)", __func__, cURI);
925
gchar *cDriveName = _cd_find_drive_name_from_URI (cURI);
926
if (cDriveName == NULL)
929
gboolean bCanEject = _cd_find_can_eject_from_drive_name (cDriveName);
930
//g_free (cDriveName);
933
gboolean vfs_backend_eject_drive (const gchar *cURI)
935
cd_message ("%s (%s)", __func__, cURI);
936
gchar *cDriveName = _cd_find_drive_name_from_URI (cURI);
937
GDrive *pDrive = _cd_find_drive_from_name (cDriveName);
940
g_drive_eject (pDrive,
941
G_MOUNT_UNMOUNT_NONE,
946
//g_object_unref (pDrive);
947
//g_free (cDriveName);
952
static void _vfs_backend_mount_callback (gpointer pObject, GAsyncResult *res, gpointer *data)
953
//static void _vfs_backend_mount_callback (gboolean succeeded, char *error, char *detailed_error, gpointer *data)
955
cd_message ("%s (%d)", __func__, GPOINTER_TO_INT (data[1]));
957
CairoDockFMMountCallback pCallback = data[0];
959
GError *erreur = NULL;
961
if (GPOINTER_TO_INT (data[1]) == 1)
962
bSuccess = (g_file_mount_mountable_finish (G_FILE (pObject), res, &erreur) != NULL);
963
//bSuccess = (g_volume_mount_finish (G_VOLUME (pObject), res, &erreur));
964
else if (GPOINTER_TO_INT (data[1]) == 0)
965
bSuccess = g_mount_unmount_finish (G_MOUNT (pObject), res, &erreur);
967
bSuccess = g_mount_eject_finish (G_MOUNT (pObject), res, &erreur);
970
cd_warning ("gnome-integration : %s", erreur->message);
971
g_error_free (erreur);
974
cd_message ("(un)mount fini -> %d", bSuccess);
975
pCallback (GPOINTER_TO_INT (data[1]) == 1, bSuccess, data[2], data[3], data[4]);
977
//g_object_unref (pObject);
981
void vfs_backend_mount (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
983
g_return_if_fail (iVolumeID > 0);
984
cd_message ("%s (%s)", __func__, cURI);
986
/*gchar *cTargetURI = NULL;
987
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
988
cd_message (" %x / %s\n", pMount, cTargetURI);
989
GVolume *pVolume = g_mount_get_volume (pMount);
990
gpointer *data2 = g_new (gpointer, 5);
991
data2[0] = pCallback;
992
data2[1] = GINT_TO_POINTER (1);
993
data2[2] = g_path_get_basename (cURI);
996
g_volume_mount (pVolume,
1000
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1002
gchar *cTargetURI = _cd_find_target_uri (cURI);
1003
GFile *pFile = g_file_new_for_uri (cURI);
1005
gpointer *data2 = g_new (gpointer, 5);
1006
data2[0] = pCallback;
1007
data2[1] = GINT_TO_POINTER (1);
1008
data2[2] = g_path_get_basename (cTargetURI);
1010
data2[4] = pContainer;
1011
g_file_mount_mountable (pFile,
1015
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1017
g_free (cTargetURI);
1020
void vfs_backend_unmount (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
1022
g_return_if_fail (cURI != NULL);
1023
cd_message ("%s (%s)", __func__, cURI);
1025
gchar *cTargetURI = NULL;
1026
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
1027
if (pMount == NULL || ! G_IS_MOUNT (pMount))
1032
if ( ! g_mount_can_unmount (pMount))
1035
gboolean bCanEject = g_mount_can_eject (pMount);
1036
gboolean bCanUnmount = g_mount_can_unmount (pMount);
1037
cd_message ("eject:%d / unmount:%d\n", bCanEject, bCanUnmount);
1038
if (! bCanEject && ! bCanUnmount)
1041
gpointer *data2 = g_new (gpointer, 5);
1042
data2[0] = pCallback;
1043
data2[1] = GINT_TO_POINTER (bCanEject ? 2 : 0);
1044
data2[2] = g_mount_get_name (pMount);
1046
data2[4] = pContainer;
1048
g_mount_eject (pMount,
1049
G_MOUNT_UNMOUNT_NONE,
1051
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1054
g_mount_unmount (pMount,
1055
G_MOUNT_UNMOUNT_NONE ,
1057
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1062
static void _on_monitor_changed (GFileMonitor *monitor,
1065
GFileMonitorEvent event_type,
1068
CairoDockFMMonitorCallback pCallback = data[0];
1069
gpointer user_data = data[1];
1070
cd_message ("%s (%d , data : %x)", __func__, event_type, user_data);
1072
CairoDockFMEventType iEventType;
1075
case G_FILE_MONITOR_EVENT_CHANGED :
1076
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT :
1077
//case G_FILE_MONITOR_EVENT_UNMOUNTED : // pertinent ?...
1078
iEventType = CAIRO_DOCK_FILE_MODIFIED;
1079
cd_message ("modification d'un fichier");
1082
case G_FILE_MONITOR_EVENT_DELETED :
1083
iEventType = CAIRO_DOCK_FILE_DELETED;
1084
cd_message ("effacement d'un fichier");
1087
case G_FILE_MONITOR_EVENT_CREATED :
1088
iEventType = CAIRO_DOCK_FILE_CREATED;
1089
cd_message ("creation d'un fichier");
1095
gchar *cURI = g_file_get_uri (file);
1096
cd_message (" c'est le fichier %s", cURI);
1097
gchar *cPath = NULL;
1098
if (strncmp (cURI, "computer://", 11) == 0)
1100
if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
1105
memcpy (cURI+4, "file", 4);
1106
cPath = g_filename_from_uri (cURI+4, NULL, NULL);
1107
cd_debug(" (path:%s)", cPath);
1109
cURI = g_strdup_printf ("computer://%s", cPath);
1110
cd_message ("son URI complete est : %s", cURI);
1113
pCallback (iEventType, cURI, user_data);
1118
void vfs_backend_add_monitor (const gchar *cURI, gboolean bDirectory, CairoDockFMMonitorCallback pCallback, gpointer user_data)
1120
g_return_if_fail (cURI != NULL);
1121
GError *erreur = NULL;
1122
GFileMonitor *pMonitor;
1123
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1125
pMonitor = g_file_monitor_directory (pFile,
1126
G_FILE_MONITOR_WATCH_MOUNTS,
1130
pMonitor = g_file_monitor_file (pFile,
1131
G_FILE_MONITOR_WATCH_MOUNTS,
1134
//g_object_unref (pFile);
1137
cd_warning ("gnome-integration : couldn't add monitor on '%s' (%d) [%s]", cURI, bDirectory, erreur->message);
1138
g_error_free (erreur);
1142
gpointer *data = g_new0 (gpointer, 3);
1143
data[0] = pCallback;
1144
data[1] = user_data;
1146
g_signal_connect (G_OBJECT (pMonitor), "changed", G_CALLBACK (_on_monitor_changed), data);
1148
g_hash_table_insert (s_hMonitorHandleTable, g_strdup (cURI), data);
1149
cd_message (">>> moniteur ajoute sur %s (%x)", cURI, user_data);
1152
void vfs_backend_remove_monitor (const gchar *cURI)
1156
cd_message (">>> moniteur supprime sur %s", cURI);
1157
g_hash_table_remove (s_hMonitorHandleTable, cURI);
1163
gboolean vfs_backend_delete_file (const gchar *cURI)
1165
g_return_val_if_fail (cURI != NULL, FALSE);
1166
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1168
GError *erreur = NULL;
1169
gboolean bSuccess = g_file_trash (pFile, NULL, &erreur);
1172
cd_warning ("gnome-integration : %s", erreur->message);
1173
g_error_free (erreur);
1175
g_object_unref (pFile);
1179
gboolean vfs_backend_rename_file (const gchar *cOldURI, const gchar *cNewName)
1181
g_return_val_if_fail (cOldURI != NULL, FALSE);
1182
GFile *pOldFile = (*cOldURI == '/' ? g_file_new_for_path (cOldURI) : g_file_new_for_uri (cOldURI));
1183
GError *erreur = NULL;
1184
GFile *pNewFile = g_file_set_display_name (pOldFile, cNewName, NULL, &erreur);
1187
cd_warning ("gnome-integration : %s", erreur->message);
1188
g_error_free (erreur);
1190
gboolean bSuccess = (pNewFile != NULL);
1191
if (pNewFile != NULL)
1192
g_object_unref (pNewFile);
1193
g_object_unref (pOldFile);
1197
gboolean vfs_backend_move_file (const gchar *cURI, const gchar *cDirectoryURI)
1199
g_return_val_if_fail (cURI != NULL, FALSE);
1200
cd_message (" %s -> %s", cURI, cDirectoryURI);
1201
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1203
gchar *cFileName = g_file_get_basename (pFile);
1204
gchar *cNewFileURI = g_strconcat (cDirectoryURI, "/", cFileName, NULL); // un peu moyen mais bon...
1205
GFile *pDestinationFile = (*cNewFileURI == '/' ? g_file_new_for_path (cNewFileURI) : g_file_new_for_uri (cNewFileURI));
1206
g_free (cNewFileURI);
1209
GError *erreur = NULL;
1210
gboolean bSuccess = g_file_move (pFile,
1212
G_FILE_COPY_NOFOLLOW_SYMLINKS,
1214
NULL, // GFileProgressCallback
1219
cd_warning ("gnome-integration : %s", erreur->message);
1220
g_error_free (erreur);
1222
g_object_unref (pFile);
1223
g_object_unref (pDestinationFile);
1227
void vfs_backend_get_file_properties (const gchar *cURI, guint64 *iSize, time_t *iLastModificationTime, gchar **cMimeType, int *iUID, int *iGID, int *iPermissionsMask)
1229
g_return_if_fail (cURI != NULL);
1230
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1231
GError *erreur = NULL;
1232
const gchar *cQuery = G_FILE_ATTRIBUTE_STANDARD_SIZE","
1233
G_FILE_ATTRIBUTE_TIME_MODIFIED","
1234
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
1235
G_FILE_ATTRIBUTE_UNIX_UID","
1236
G_FILE_ATTRIBUTE_UNIX_GID","
1237
G_FILE_ATTRIBUTE_ACCESS_CAN_READ","
1238
G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE","
1239
G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE;
1240
GFileInfo *pFileInfo = g_file_query_info (pFile,
1242
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
1247
cd_warning ("gnome-integration : couldn't get file properties for '%s' [%s]", cURI, erreur->message);
1248
g_error_free (erreur);
1251
*iSize = g_file_info_get_attribute_uint64 (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_SIZE);
1252
*iLastModificationTime = (time_t) g_file_info_get_attribute_uint64 (pFileInfo, G_FILE_ATTRIBUTE_TIME_MODIFIED);
1253
*cMimeType = g_file_info_get_attribute_as_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
1254
*iUID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_UNIX_UID);
1255
*iGID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_UNIX_GID);
1256
int r = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_READ);
1257
int w = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE);
1258
int x = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE);
1259
*iPermissionsMask = r * 8 * 8 + w * 8 + x;
1261
g_object_unref (pFileInfo);
1262
g_object_unref (pFile);
1266
gchar *vfs_backend_get_trash_path (const gchar *cNearURI, gchar **cFileInfoPath)
1268
gchar *cPath = NULL;
1269
/*GFile *pFile = g_file_new_for_uri ("trash://");
1270
gchar *cPath = g_file_get_path (pFile);
1271
g_object_unref (pFile);*/
1272
const gchar *xdgPath = g_getenv ("XDG_DATA_HOME");
1273
if (xdgPath != NULL)
1275
cPath = g_strdup_printf ("%s/Trash/files", xdgPath);
1276
if (cFileInfoPath != NULL)
1277
*cFileInfoPath = g_strdup_printf ("%s/Trash/info", xdgPath);
1281
cPath = g_strdup_printf ("%s/.local/share/Trash/files", g_getenv ("HOME"));
1282
if (cFileInfoPath != NULL)
1283
*cFileInfoPath = g_strdup_printf ("%s/.local/share/Trash/info", g_getenv ("HOME"));
1288
gchar *vfs_backend_get_desktop_path (void)
1290
GFile *pFile = g_file_new_for_uri ("desktop://");
1291
gchar *cPath = g_file_get_path (pFile);
1292
g_object_unref (pFile);