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-vfs.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));
55
void stop_vfs_backend (void)
57
if (s_hMonitorHandleTable != NULL)
59
g_hash_table_destroy (s_hMonitorHandleTable);
60
s_hMonitorHandleTable = NULL;
65
static gchar *_cd_get_icon_path (GIcon *pIcon)
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
//cd_message (" une icone possible est : %s\n", cFileNames[i]);
76
cIconPath = cairo_dock_search_icon_s_path (cFileNames[i]);
77
//cd_message (" 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
//cd_message (" file_icon => %s\n", cIconPath);
90
static void _cd_find_mount_from_volume_name (const gchar *cVolumeName, GMount **pFoundMount, gchar **cURI, gchar **cIconName)
92
g_return_if_fail (cVolumeName != NULL);
93
cd_message ("%s (%s)", __func__, cVolumeName);
94
GFile *pFile = g_file_new_for_uri ("computer://");
95
GError *erreur = NULL;
96
const gchar *cAttributes = G_FILE_ATTRIBUTE_STANDARD_TYPE","
97
G_FILE_ATTRIBUTE_STANDARD_NAME","
98
G_FILE_ATTRIBUTE_STANDARD_ICON","
99
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
100
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
101
GFileEnumerator *pFileEnum = g_file_enumerate_children (pFile,
103
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
106
//g_object_unref (pFile);
109
cd_warning ("gnome_integration : %s", erreur->message);
110
g_error_free (erreur);
114
GList *pIconList = NULL;
116
GFileInfo *pFileInfo;
119
pFileInfo = g_file_enumerator_next_file (pFileEnum, NULL, &erreur);
122
cd_warning ("gnome_integration : %s", erreur->message);
123
g_error_free (erreur);
128
if (pFileInfo == NULL)
130
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
131
if (iFileType == G_FILE_TYPE_MOUNTABLE)
133
const gchar *cFileName = g_file_info_get_name (pFileInfo);
134
cd_message (" test de %s...", cFileName);
135
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
137
GMount *pMount = NULL;
138
if (cTargetURI != NULL)
140
GFile *file = g_file_new_for_uri (cTargetURI);
141
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
142
//g_object_unref (file);
146
gchar *cName = g_mount_get_name (pMount);
147
cd_message (" mount : %s", cName);
148
if (cName != NULL && strcmp (cName, cVolumeName) == 0)
150
cd_message ("TROUVE");
151
*pFoundMount = pMount;
152
*cURI = g_strconcat ("computer:///", cFileName, NULL);
153
GIcon *pSystemIcon = g_mount_get_icon (pMount);
154
*cIconName = _cd_get_icon_path (pSystemIcon);
163
//g_object_unref (pFileEnum);
166
static GDrive *_cd_find_drive_from_name (const gchar *cName)
168
g_return_val_if_fail (cName != NULL, NULL);
169
cd_message ("%s (%s)", __func__, cName);
170
GVolumeMonitor *pVolumeMonitor = g_volume_monitor_get ();
171
GDrive *pFoundDrive = NULL;
173
//\___________________ On chope les disques connectes (lecteur de CD/disquette/etc) et on liste leurs volumes.
174
GList *pDrivesList = g_volume_monitor_get_connected_drives (pVolumeMonitor);
178
for (dl = pDrivesList; dl != NULL; dl = dl->next)
181
if (pFoundDrive == NULL)
183
cDriveName = g_drive_get_name (pDrive);
184
cd_message (" drive '%s'", cDriveName);
185
if (cDriveName != NULL && strcmp (cDriveName, cName) == 0)
186
pFoundDrive = pDrive;
188
g_object_unref (pDrive);
189
//g_free (cDriveName);
192
g_object_unref (pDrive);
194
g_list_free (pDrivesList);
197
static gchar *_cd_find_volume_name_from_drive_name (const gchar *cName)
199
g_return_val_if_fail (cName != NULL, NULL);
200
cd_message ("%s (%s)", __func__, cName);
201
GDrive *pDrive = _cd_find_drive_from_name (cName);
202
g_return_val_if_fail (pDrive != NULL, NULL);
204
gchar *cVolumeName = NULL;
205
GList *pAssociatedVolumes = g_drive_get_volumes (pDrive);
206
if (pAssociatedVolumes != NULL)
210
if (pAssociatedVolumes->next != NULL)
212
cd_message ("ce disque contient plus d'un volume, on garde le nom du disque plutot que de selectionner le nom d'un volume");
213
cd_message ("Pour info, la liste des volumes disponibles sur ce disque est :");
214
for (av = pAssociatedVolumes; av != NULL; av = av->next)
217
cd_message (" - %s", g_volume_get_name (pVolume));
218
/*if (cVolumeName == NULL)
219
cVolumeName = g_volume_get_name (pVolume);
221
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));*/
222
g_object_unref (pVolume);
227
return g_strdup ("discard");
228
pVolume = pAssociatedVolumes->data;
229
cVolumeName = g_volume_get_name (pVolume);
230
g_object_unref (pVolume);
231
cd_message ("ce disque contient 1 seul volume (%s), on prend son nom", cVolumeName);
233
g_list_free (pAssociatedVolumes);
235
//g_object_unref (pDrive);
238
static gboolean _cd_find_can_eject_from_drive_name (const gchar *cName)
240
cd_debug ("%s (%s)", __func__, cName);
241
GDrive *pDrive = _cd_find_drive_from_name (cName);
242
g_return_val_if_fail (pDrive != NULL, FALSE);
244
gboolean bCanEject = g_drive_can_eject (pDrive);
245
//g_object_unref (pDrive);
249
void vfs_backend_get_file_info (const gchar *cBaseURI, gchar **cName, gchar **cURI, gchar **cIconName, gboolean *bIsDirectory, int *iVolumeID, double *fOrder, CairoDockFMSortType iSortType)
251
g_return_if_fail (cBaseURI != NULL);
252
GError *erreur = NULL;
253
cd_message ("%s (%s)", __func__, cBaseURI);
256
if (strncmp (cBaseURI, "x-nautilus-desktop://", 21) == 0)
258
gchar *cNautilusFile = g_strdup (cBaseURI+14);
259
memcpy (cNautilusFile, "file", 4);
260
if (g_str_has_suffix (cBaseURI, ".volume"))
262
cNautilusFile[strlen(cNautilusFile)-7] = '\0';
264
else if (g_str_has_suffix (cBaseURI, ".drive"))
266
cNautilusFile[strlen(cNautilusFile)-6] = '\0';
268
cFullURI = g_filename_from_uri (cNautilusFile, NULL, &erreur);
271
cd_warning ("gnome_integration : %s", erreur->message);
272
g_error_free (erreur);
275
gchar *cVolumeName = cFullURI + 1; // on saute le '/'.
276
cd_message ("cVolumeName : %s", cVolumeName);
278
GMount *pMount = NULL;
279
_cd_find_mount_from_volume_name (cVolumeName, &pMount, cURI, cIconName);
280
g_return_if_fail (pMount != NULL);
282
*cName = g_strdup (cVolumeName);
283
*bIsDirectory = TRUE;
286
//g_object_unref (pMount);
289
//g_free (cNautilusFile);
294
if (*cBaseURI == '/')
295
cFullURI = g_filename_to_uri (cBaseURI, NULL, NULL);
297
cFullURI = g_strdup (cBaseURI);
299
cd_message (" -> cFullURI : %s", cFullURI);
301
GFile *pFile = g_file_new_for_uri (cFullURI);
303
const gchar *cQuery = G_FILE_ATTRIBUTE_STANDARD_TYPE","
304
G_FILE_ATTRIBUTE_STANDARD_SIZE","
305
G_FILE_ATTRIBUTE_TIME_MODIFIED","
306
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
307
G_FILE_ATTRIBUTE_STANDARD_NAME","
308
G_FILE_ATTRIBUTE_STANDARD_ICON","
309
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
310
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
311
GFileInfo *pFileInfo = g_file_query_info (pFile,
313
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
316
//g_object_unref (pFile);
319
cd_warning ("gnome_integration : %s", erreur->message);
320
g_error_free (erreur);
325
const gchar *cFileName = g_file_info_get_name (pFileInfo);
326
const gchar *cMimeType = g_file_info_get_content_type (pFileInfo);
327
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
329
if (iSortType == CAIRO_DOCK_FM_SORT_BY_DATE)
332
g_file_info_get_modification_time (pFileInfo, &t);
335
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_SIZE)
336
*fOrder = g_file_info_get_size (pFileInfo);
337
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_TYPE)
338
*fOrder = (cMimeType != NULL ? *((int *) cMimeType) : 0);
342
*bIsDirectory = (iFileType == G_FILE_TYPE_DIRECTORY);
343
cd_message (" => '%s' (mime:%s ; bIsDirectory:%d)", cFileName, cMimeType, *bIsDirectory);
345
if (iFileType == G_FILE_TYPE_MOUNTABLE)
350
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
351
cd_message (" cTargetURI:%s", cTargetURI);
352
GMount *pMount = NULL;
353
if (cTargetURI != NULL)
355
GFile *file = g_file_new_for_uri (cTargetURI);
356
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
357
//g_object_unref (file);
361
*cName = g_mount_get_name (pMount);
362
cd_message ("un GMount existe (%s)",* cName);
366
gchar *cMountName = g_strdup (cFileName);
367
gchar *str = strrchr (cMountName, '.'); // on vire l'extension ".volume" ou ".drive".
371
if (strcmp (str+1, "link") == 0) // pour les liens, on prend le nom du lien.
373
if (strcmp (cMountName, "root") == 0) // on remplace 'root' par un nom plus parlant, sinon on prendra le nom du lien.
375
*cName = g_strdup ("/");
378
else if (strcmp (str+1, "drive") == 0) // on cherche un nom plus parlant si possible.
380
gchar *cVolumeName = _cd_find_volume_name_from_drive_name (cMountName);
381
if (cVolumeName != NULL)
383
*cName = cVolumeName;
390
//g_free (cMountName);
393
*cName = g_strdup (cFileName);
398
*cName = g_strdup (cFileName);
402
if (cMimeType != NULL && strncmp (cMimeType, "image", 5) == 0)
404
gchar *cHostname = NULL;
405
GError *erreur = NULL;
406
gchar *cFilePath = g_filename_from_uri (cBaseURI, &cHostname, &erreur);
409
g_error_free (erreur);
411
else if (cHostname == NULL || strcmp (cHostname, "localhost") == 0) // on ne recupere la vignette que sur les fichiers locaux.
413
*cIconName = g_strdup (cFilePath);
414
cairo_dock_remove_html_spaces (*cIconName);
416
//g_free (cHostname);
418
if (*cIconName == NULL)
420
GIcon *pSystemIcon = g_file_info_get_icon (pFileInfo);
421
if (pSystemIcon != NULL)
423
*cIconName = _cd_get_icon_path (pSystemIcon);
426
cd_message ("cIconName : %s", *cIconName);
428
//*iVolumeID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE);
429
//cd_message ("ID : %d\n", *iVolumeID);
430
//g_object_unref (pFileInfo);
433
static Icon *_cd_get_icon_for_volume (GVolume *pVolume, GMount *pMount)
435
Icon *pNewIcon = NULL;
440
pMount = g_volume_get_mount (pVolume);
441
else if (pMount == NULL)
444
if (pMount != NULL) // ce volume est monte.
446
pNewIcon = g_new0 (Icon, 1);
447
pNewIcon->cName = g_mount_get_name (pMount);
449
pRootDir = g_mount_get_root (pMount);
450
pNewIcon->cCommand = g_file_get_uri (pRootDir);
451
//g_object_unref (pRootDir);
453
pIcon = g_mount_get_icon (pMount);
454
pNewIcon->cFileName = _cd_get_icon_path (pIcon);
455
//g_object_unref (pIcon);
457
//g_object_unref (pMount);
459
else // ce volume est demonte, on le montre quand meme (l'automount peut etre off).
461
pNewIcon = g_new0 (Icon, 1);
462
pNewIcon->cName = g_volume_get_name (pVolume);
464
pIcon = g_volume_get_icon (pVolume);
465
pNewIcon->cFileName = _cd_get_icon_path (pIcon);
466
//g_object_unref (pIcon);
468
pNewIcon->cCommand = g_strdup (pNewIcon->cName);
470
pNewIcon->iVolumeID = 1;
471
pNewIcon->cBaseURI = g_strdup (pNewIcon->cCommand);
472
cd_message (" => %s", pNewIcon->cCommand);
476
GList *vfs_backend_list_volumes (void)
478
GVolumeMonitor *pVolumeMonitor = g_volume_monitor_get ();
479
GList *pIconsList = NULL;
482
//\___________________ On chope les disques connectes (lecteur de CD/disquette/etc) et on liste leurs volumes.
483
GList *pDrivesList = g_volume_monitor_get_connected_drives (pVolumeMonitor);
484
GList *pAssociatedVolumes;
488
for (dl = pDrivesList; dl != NULL; dl = dl->next)
491
cd_message ("drive '%s'", g_drive_get_name (pDrive));
493
pAssociatedVolumes = g_drive_get_volumes (pDrive);
494
if (pAssociatedVolumes != NULL)
496
for (av = pAssociatedVolumes; av != NULL; av = av->next)
499
cd_message (" + volume '%s'", g_volume_get_name (pVolume));
500
pNewIcon = _cd_get_icon_for_volume (pVolume, NULL);
501
if (pNewIcon != NULL)
502
pIconsList = g_list_prepend (pIconsList, pNewIcon);
503
//g_object_unref (pVolume);
505
g_list_free (pAssociatedVolumes);
507
else // le disque n'a aucun volume montable
509
cd_message (" le disque n'a aucun volume montable");
510
/*if (g_drive_is_media_removable (pDrive) && ! g_drive_is_media_check_automatic (pDrive))
512
g_drive_get_icon (pDrive);
513
g_drive_get_name (pDrive);
516
//g_object_unref (pDrive);
518
g_list_free (pDrivesList);
520
//\___________________ On chope les volumes qui ne sont pas associes a un disque.
521
GList *pVolumesList = g_volume_monitor_get_volumes (pVolumeMonitor);
523
for (v = pVolumesList; v != NULL; v = v->next)
526
cd_message ("volume '%s'", g_volume_get_name (pVolume));
527
pDrive = g_volume_get_drive (pVolume);
528
if (pDrive != NULL) // on l'a deja liste dans la 1ere boucle.
530
cd_message (" drive '%s' est deja liste", g_drive_get_name (pDrive));
531
//g_object_unref (pDrive);
535
cd_message (" + volume '%s'\n", g_volume_get_name (pVolume));
536
if (pNewIcon != NULL)
537
pNewIcon = _cd_get_icon_for_volume (pVolume, NULL);
538
pIconsList = g_list_prepend (pIconsList, pNewIcon);
540
//g_object_unref (pVolume);
542
g_list_free (pVolumesList);
544
//\___________________ On chope les points de montage qui n'ont pas de volumes. (montage de mtab, ftp, etc)
545
GList *pMountsList = g_volume_monitor_get_mounts (pVolumeMonitor);
548
for (m = pMountsList; m != NULL; m = m->next)
551
cd_message ("mount '%s'", g_mount_get_name (pMount));
552
pVolume = g_mount_get_volume (pMount);
553
if (pVolume != NULL) // on l'a deja liste precedemment.
555
cd_message ("volume '%s' est deja liste", g_volume_get_name (pVolume));
556
//g_object_unref (pVolume);
560
cd_message ("+ volume '%s'", g_volume_get_name (pVolume));
561
if (pNewIcon != NULL)
562
pNewIcon = _cd_get_icon_for_volume (NULL, pMount);
563
pIconsList = g_list_prepend (pIconsList, pNewIcon);
565
//g_object_unref (pMount);
567
g_list_free (pMountsList);
572
GList *vfs_backend_list_directory (const gchar *cBaseURI, CairoDockFMSortType iSortType, int iNewIconsType, gboolean bListHiddenFiles, gchar **cFullURI)
574
g_return_val_if_fail (cBaseURI != NULL, NULL);
575
cd_message ("%s (%s)", __func__, cBaseURI);
578
gboolean bAddHome = FALSE;
579
if (strcmp (cBaseURI, CAIRO_DOCK_FM_VFS_ROOT) == 0)
581
cURI = g_strdup ("computer://");
584
///return vfs_backend_list_volumes ();
585
//vfs_backend_list_volumes ();
587
else if (strcmp (cBaseURI, CAIRO_DOCK_FM_NETWORK) == 0)
588
cURI = g_strdup ("network://");
590
cURI = (*cBaseURI == '/' ? g_strconcat ("file://", cBaseURI, NULL) : g_strdup (cBaseURI));
593
GFile *pFile = g_file_new_for_uri (cURI);
594
GError *erreur = NULL;
595
const gchar *cAttributes = G_FILE_ATTRIBUTE_STANDARD_TYPE","
596
G_FILE_ATTRIBUTE_STANDARD_SIZE","
597
G_FILE_ATTRIBUTE_TIME_MODIFIED","
598
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
599
G_FILE_ATTRIBUTE_STANDARD_NAME","
600
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN","
601
G_FILE_ATTRIBUTE_STANDARD_ICON","
602
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
603
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
604
GFileEnumerator *pFileEnum = g_file_enumerate_children (pFile,
606
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
609
//g_object_unref (pFile);
612
cd_warning ("gnome_integration : %s", erreur->message);
613
g_error_free (erreur);
618
GList *pIconList = NULL;
620
GFileInfo *pFileInfo;
623
pFileInfo = g_file_enumerator_next_file (pFileEnum, NULL, &erreur);
626
cd_warning ("gnome_integration : %s", erreur->message);
627
g_error_free (erreur);
631
if (pFileInfo == NULL)
634
gboolean bIsHidden = g_file_info_get_is_hidden (pFileInfo);
635
if (bListHiddenFiles || ! bIsHidden)
637
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
638
GIcon *pFileIcon = g_file_info_get_icon (pFileInfo);
639
if (pFileIcon == NULL)
641
cd_message ("AUCUNE ICONE");
644
const gchar *cFileName = g_file_info_get_name (pFileInfo);
645
const gchar *cMimeType = g_file_info_get_content_type (pFileInfo);
648
icon = g_new0 (Icon, 1);
649
icon->iType = iNewIconsType;
650
icon->cBaseURI = g_strconcat (*cFullURI, "/", cFileName, NULL);
651
cd_message ("+ %s (mime:%s)", icon->cBaseURI, cMimeType);
653
if (iFileType == G_FILE_TYPE_MOUNTABLE)
655
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
656
cd_message (" c'est un point de montage correspondant a %s", cTargetURI);
658
GMount *pMount = NULL;
659
if (cTargetURI != NULL)
661
icon->cCommand = g_strdup (cTargetURI);
662
GFile *file = g_file_new_for_uri (cTargetURI);
663
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
664
//g_object_unref (file);
668
cName = g_mount_get_name (pMount);
669
cd_message ("un GMount existe (%s)", cName);
671
GVolume *volume = g_mount_get_volume (pMount);
673
cd_message (" volume associe : %s", g_volume_get_name (volume));
674
GDrive *drive = g_mount_get_drive (pMount);
676
cd_message (" disque associe : %s", g_drive_get_name (drive));
678
///pFileIcon = g_mount_get_icon (pMount);
682
cName = g_strdup (cFileName);
683
gchar *str = strrchr (cName, '.'); // on vire l'extension ".volume" ou ".drive".
687
if (strcmp (str+1, "link") == 0)
689
if (strcmp (cName, "root") == 0)
692
cName = g_strdup ("/");
695
else if (strcmp (str+1, "drive") == 0) // on cherche un nom plus parlant si possible.
697
gchar *cVolumeName = _cd_find_volume_name_from_drive_name (cName);
698
if (cVolumeName != NULL)
701
g_free (cVolumeName);
702
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.
703
/**if (strcmp (cVolumeName, "discard") == 0)
706
cName = cVolumeName;*/
712
cd_message ("le nom de ce volume est : %s", cName);
715
cName = g_strdup (cFileName);
717
if (icon->cCommand == NULL)
718
icon->cCommand = g_strdup (icon->cBaseURI);
720
icon->cFileName = NULL;
721
if (cMimeType != NULL && strncmp (cMimeType, "image", 5) == 0)
723
gchar *cHostname = NULL;
724
gchar *cFilePath = g_filename_from_uri (icon->cBaseURI, &cHostname, &erreur);
727
g_error_free (erreur);
730
else if (cHostname == NULL || strcmp (cHostname, "localhost") == 0) // on ne recupere la vignette que sur les fichiers locaux.
732
icon->cFileName = g_strdup (cFilePath);
733
cairo_dock_remove_html_spaces (icon->cFileName);
738
if (icon->cFileName == NULL)
740
icon->cFileName = _cd_get_icon_path (pFileIcon);
741
cd_message ("icon->cFileName : %s", icon->cFileName);
744
if (iSortType == CAIRO_DOCK_FM_SORT_BY_SIZE)
745
icon->fOrder = g_file_info_get_size (pFileInfo);
746
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_DATE)
749
g_file_info_get_modification_time (pFileInfo, &t);
750
icon->fOrder = t.tv_sec;
752
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_TYPE)
753
icon->fOrder = (cMimeType != NULL ? *((int *) cMimeType) : 0);
754
if (icon->fOrder == 0) // un peu moyen mais mieux que rien non ?
755
icon->fOrder = iOrder;
756
pIconList = g_list_insert_sorted (pIconList,
758
(GCompareFunc) cairo_dock_compare_icons_order);
759
//g_list_prepend (pIconList, icon);
762
} while (TRUE); // 'g_file_enumerator_close' est appelee lors du dernier 'g_file_enumerator_next_file'.
764
if (bAddHome && pIconList != NULL)
766
icon = g_new0 (Icon, 1);
767
icon->iType = iNewIconsType;
768
icon->cBaseURI = g_strdup_printf ("file://%s", "/home");
769
icon->cCommand = g_strdup ("/home");
770
//icon->cCommand = g_strdup (icon->cBaseURI);
772
icon->cName = g_strdup ("home");
773
Icon *pRootIcon = cairo_dock_get_icon_with_name (pIconList, "/");
774
if (pRootIcon == NULL)
776
pRootIcon = cairo_dock_get_first_icon (pIconList);
777
g_print ("domage ! (%s:%s)\n", pRootIcon->cCommand, pRootIcon->cName);
779
icon->cFileName = g_strdup (pRootIcon->cFileName);
780
icon->fOrder = iOrder++;
781
pIconList = g_list_insert_sorted (pIconList,
783
(GCompareFunc) cairo_dock_compare_icons_order);
786
if (iSortType == CAIRO_DOCK_FM_SORT_BY_NAME)
787
pIconList = cairo_dock_sort_icons_by_name (pIconList);
789
pIconList = cairo_dock_sort_icons_by_order (pIconList);
796
static gchar *_cd_find_target_uri (const gchar *cBaseURI)
798
GError *erreur = NULL;
799
GFile *pFile = g_file_new_for_uri (cBaseURI);
800
GFileInfo *pFileInfo = g_file_query_info (pFile,
801
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI,
802
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
805
g_object_unref (pFile);
808
cd_warning ("gnome-integration : %s", erreur->message);
809
g_error_free (erreur);
812
gchar *cTargetURI = g_strdup (g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI));
813
g_object_unref (pFileInfo);
816
void vfs_backend_launch_uri (const gchar *cURI)
818
g_return_if_fail (cURI != NULL);
819
GError *erreur = NULL;
820
gchar *cFullURI = (*cURI == '/' ? g_strconcat ("file://", cURI, NULL) : g_strdup (cURI));
821
cd_message ("%s (%s)", __func__, cFullURI);
823
gchar *cTargetURI = _cd_find_target_uri (cFullURI);
824
gboolean bSuccess = g_app_info_launch_default_for_uri (cTargetURI != NULL ? cTargetURI : cFullURI,
831
cd_warning ("gnome_integration : couldn't launch '%s' [%s]", cURI, erreur->message);
832
g_error_free (erreur);
836
GMount *_cd_find_mount_from_uri (const gchar *cURI, gchar **cTargetURI)
838
cd_message ("%s (%s)", __func__, cURI);
839
gchar *_cTargetURI = _cd_find_target_uri (cURI);
841
GMount *pMount = NULL;
842
if (_cTargetURI != NULL)
844
cd_message (" pointe sur %s", _cTargetURI);
845
GFile *file = g_file_new_for_uri (_cTargetURI);
846
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
847
g_object_unref (file);
849
if (cTargetURI != NULL)
850
*cTargetURI = _cTargetURI;
852
g_free (_cTargetURI);
856
gchar *vfs_backend_is_mounted (const gchar *cURI, gboolean *bIsMounted)
858
cd_message ("%s (%s)", __func__, cURI);
859
gchar *cTargetURI = NULL;
860
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
861
cd_message (" cTargetURI : %s", cTargetURI);
866
if (cTargetURI != NULL && strcmp (cTargetURI, "file:///") == 0) // cas particulier ?
874
static gchar * _cd_find_drive_name_from_URI (const gchar *cURI)
876
g_return_val_if_fail (cURI != NULL, NULL);
877
if (strncmp (cURI, "computer:///", 12) == 0)
879
gchar *cDriveName = g_strdup (cURI+12);
880
gchar *str = strrchr (cDriveName, '.');
883
if (strcmp (str+1, "drive") == 0)
888
str = strchr (cDriveName, '\\');
900
gboolean vfs_backend_can_eject (const gchar *cURI)
902
cd_message ("%s (%s)", __func__, cURI);
903
gchar *cDriveName = _cd_find_drive_name_from_URI (cURI);
904
if (cDriveName == NULL)
907
gboolean bCanEject = _cd_find_can_eject_from_drive_name (cDriveName);
908
//g_free (cDriveName);
911
gboolean vfs_backend_eject_drive (const gchar *cURI)
913
cd_message ("%s (%s)", __func__, cURI);
914
gchar *cDriveName = _cd_find_drive_name_from_URI (cURI);
915
GDrive *pDrive = _cd_find_drive_from_name (cDriveName);
918
g_drive_eject (pDrive,
919
G_MOUNT_UNMOUNT_NONE,
924
//g_object_unref (pDrive);
925
//g_free (cDriveName);
930
static void _vfs_backend_mount_callback (gpointer pObject, GAsyncResult *res, gpointer *data)
931
//static void _vfs_backend_mount_callback (gboolean succeeded, char *error, char *detailed_error, gpointer *data)
933
cd_message ("%s (%d)", __func__, GPOINTER_TO_INT (data[1]));
935
CairoDockFMMountCallback pCallback = data[0];
937
GError *erreur = NULL;
939
if (GPOINTER_TO_INT (data[1]) == 1)
940
bSuccess = (g_file_mount_mountable_finish (G_FILE (pObject), res, &erreur) != NULL);
941
//bSuccess = (g_volume_mount_finish (G_VOLUME (pObject), res, &erreur));
942
else if (GPOINTER_TO_INT (data[1]) == 0)
943
bSuccess = g_mount_unmount_finish (G_MOUNT (pObject), res, &erreur);
945
bSuccess = g_mount_eject_finish (G_MOUNT (pObject), res, &erreur);
948
cd_warning ("gnome-integration : %s", erreur->message);
949
g_error_free (erreur);
952
cd_message ("(un)mount fini -> %d", bSuccess);
953
pCallback (GPOINTER_TO_INT (data[1]) == 1, bSuccess, data[2], data[3], data[4]);
955
//g_object_unref (pObject);
959
void vfs_backend_mount (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
961
g_return_if_fail (iVolumeID > 0);
962
cd_message ("%s (%s)", __func__, cURI);
964
/*gchar *cTargetURI = NULL;
965
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
966
cd_message (" %x / %s\n", pMount, cTargetURI);
967
GVolume *pVolume = g_mount_get_volume (pMount);
968
gpointer *data2 = g_new (gpointer, 5);
969
data2[0] = pCallback;
970
data2[1] = GINT_TO_POINTER (1);
971
data2[2] = g_path_get_basename (cURI);
974
g_volume_mount (pVolume,
978
(GAsyncReadyCallback) _vfs_backend_mount_callback,
980
gchar *cTargetURI = _cd_find_target_uri (cURI);
981
GFile *pFile = g_file_new_for_uri (cURI);
983
gpointer *data2 = g_new (gpointer, 5);
984
data2[0] = pCallback;
985
data2[1] = GINT_TO_POINTER (1);
986
data2[2] = g_path_get_basename (cTargetURI);
988
data2[4] = pContainer;
989
g_file_mount_mountable (pFile,
993
(GAsyncReadyCallback) _vfs_backend_mount_callback,
998
void vfs_backend_unmount (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
1000
g_return_if_fail (cURI != NULL);
1001
cd_message ("%s (%s)", __func__, cURI);
1003
gchar *cTargetURI = NULL;
1004
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
1005
if (pMount == NULL || ! G_IS_MOUNT (pMount))
1010
if ( ! g_mount_can_unmount (pMount))
1013
gboolean bCanEject = g_mount_can_eject (pMount);
1014
gboolean bCanUnmount = g_mount_can_unmount (pMount);
1015
cd_message ("eject:%d / unmount:%d\n", bCanEject, bCanUnmount);
1016
if (! bCanEject && ! bCanUnmount)
1019
gpointer *data2 = g_new (gpointer, 5);
1020
data2[0] = pCallback;
1021
data2[1] = GINT_TO_POINTER (bCanEject ? 2 : 0);
1022
data2[2] = g_mount_get_name (pMount);
1024
data2[4] = pContainer;
1026
g_mount_eject (pMount,
1027
G_MOUNT_UNMOUNT_NONE,
1029
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1032
g_mount_unmount (pMount,
1033
G_MOUNT_UNMOUNT_NONE ,
1035
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1040
static void _on_monitor_changed (GFileMonitor *monitor,
1043
GFileMonitorEvent event_type,
1046
CairoDockFMMonitorCallback pCallback = data[0];
1047
gpointer user_data = data[1];
1048
cd_message ("%s (%d , data : %x)", __func__, event_type, user_data);
1050
CairoDockFMEventType iEventType;
1053
case G_FILE_MONITOR_EVENT_CHANGED :
1054
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT :
1055
//case G_FILE_MONITOR_EVENT_UNMOUNTED : // pertinent ?...
1056
iEventType = CAIRO_DOCK_FILE_MODIFIED;
1057
cd_message ("modification d'un fichier");
1060
case G_FILE_MONITOR_EVENT_DELETED :
1061
iEventType = CAIRO_DOCK_FILE_DELETED;
1062
cd_message ("effacement d'un fichier");
1065
case G_FILE_MONITOR_EVENT_CREATED :
1066
iEventType = CAIRO_DOCK_FILE_CREATED;
1067
cd_message ("creation d'un fichier");
1073
gchar *cURI = g_file_get_uri (file);
1074
cd_message (" c'est le fichier %s", cURI);
1075
gchar *cPath = NULL;
1076
if (strncmp (cURI, "computer://", 11) == 0)
1078
if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
1083
memcpy (cURI+4, "file", 4);
1084
cPath = g_filename_from_uri (cURI+4, NULL, NULL);
1085
cd_debug(" (path:%s)", cPath);
1087
cURI = g_strdup_printf ("computer://%s", cPath);
1088
cd_message ("son URI complete est : %s", cURI);
1091
pCallback (iEventType, cURI, user_data);
1096
void vfs_backend_add_monitor (const gchar *cURI, gboolean bDirectory, CairoDockFMMonitorCallback pCallback, gpointer user_data)
1098
g_return_if_fail (cURI != NULL);
1099
GError *erreur = NULL;
1100
GFileMonitor *pMonitor;
1101
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1103
pMonitor = g_file_monitor_directory (pFile,
1104
G_FILE_MONITOR_WATCH_MOUNTS,
1108
pMonitor = g_file_monitor_file (pFile,
1109
G_FILE_MONITOR_WATCH_MOUNTS,
1112
//g_object_unref (pFile);
1115
cd_warning ("gnome-integration : couldn't add monitor on '%s' (%d) [%s]", cURI, bDirectory, erreur->message);
1116
g_error_free (erreur);
1120
gpointer *data = g_new0 (gpointer, 3);
1121
data[0] = pCallback;
1122
data[1] = user_data;
1124
g_signal_connect (G_OBJECT (pMonitor), "changed", G_CALLBACK (_on_monitor_changed), data);
1126
g_hash_table_insert (s_hMonitorHandleTable, g_strdup (cURI), data);
1127
cd_message (">>> moniteur ajoute sur %s (%x)", cURI, user_data);
1130
void vfs_backend_remove_monitor (const gchar *cURI)
1134
cd_message (">>> moniteur supprime sur %s", cURI);
1135
g_hash_table_remove (s_hMonitorHandleTable, cURI);
1141
gboolean vfs_backend_delete_file (const gchar *cURI)
1143
g_return_val_if_fail (cURI != NULL, FALSE);
1144
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1146
GError *erreur = NULL;
1147
gboolean bSuccess = g_file_trash (pFile, NULL, &erreur);
1150
cd_warning ("gnome-integration : %s", erreur->message);
1151
g_error_free (erreur);
1153
g_object_unref (pFile);
1157
gboolean vfs_backend_rename_file (const gchar *cOldURI, const gchar *cNewName)
1159
g_return_val_if_fail (cOldURI != NULL, FALSE);
1160
GFile *pOldFile = (*cOldURI == '/' ? g_file_new_for_path (cOldURI) : g_file_new_for_uri (cOldURI));
1161
GError *erreur = NULL;
1162
GFile *pNewFile = g_file_set_display_name (pOldFile, cNewName, NULL, &erreur);
1165
cd_warning ("gnome-integration : %s", erreur->message);
1166
g_error_free (erreur);
1168
gboolean bSuccess = (pNewFile != NULL);
1169
if (pNewFile != NULL)
1170
g_object_unref (pNewFile);
1171
g_object_unref (pOldFile);
1175
gboolean vfs_backend_move_file (const gchar *cURI, const gchar *cDirectoryURI)
1177
g_return_val_if_fail (cURI != NULL, FALSE);
1178
cd_message (" %s -> %s", cURI, cDirectoryURI);
1179
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1181
gchar *cFileName = g_file_get_basename (pFile);
1182
gchar *cNewFileURI = g_strconcat (cDirectoryURI, "/", cFileName, NULL); // un peu moyen mais bon...
1183
GFile *pDestinationFile = (*cNewFileURI == '/' ? g_file_new_for_path (cNewFileURI) : g_file_new_for_uri (cNewFileURI));
1184
g_free (cNewFileURI);
1187
GError *erreur = NULL;
1188
gboolean bSuccess = g_file_move (pFile,
1190
G_FILE_COPY_NOFOLLOW_SYMLINKS,
1192
NULL, // GFileProgressCallback
1197
cd_warning ("gnome-integration : %s", erreur->message);
1198
g_error_free (erreur);
1200
g_object_unref (pFile);
1201
g_object_unref (pDestinationFile);
1205
void vfs_backend_get_file_properties (const gchar *cURI, guint64 *iSize, time_t *iLastModificationTime, gchar **cMimeType, int *iUID, int *iGID, int *iPermissionsMask)
1207
g_return_if_fail (cURI != NULL);
1208
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1209
GError *erreur = NULL;
1210
const gchar *cQuery = G_FILE_ATTRIBUTE_STANDARD_SIZE","
1211
G_FILE_ATTRIBUTE_TIME_MODIFIED","
1212
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
1213
G_FILE_ATTRIBUTE_UNIX_UID","
1214
G_FILE_ATTRIBUTE_UNIX_GID","
1215
G_FILE_ATTRIBUTE_ACCESS_CAN_READ","
1216
G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE","
1217
G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE;
1218
GFileInfo *pFileInfo = g_file_query_info (pFile,
1220
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
1225
cd_warning ("gnome-integration : couldn't get file properties for '%s' [%s]", cURI, erreur->message);
1226
g_error_free (erreur);
1229
*iSize = g_file_info_get_attribute_uint64 (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_SIZE);
1230
*iLastModificationTime = (time_t) g_file_info_get_attribute_uint64 (pFileInfo, G_FILE_ATTRIBUTE_TIME_MODIFIED);
1231
*cMimeType = g_file_info_get_attribute_as_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
1232
*iUID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_UNIX_UID);
1233
*iGID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_UNIX_GID);
1234
int r = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_READ);
1235
int w = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE);
1236
int x = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE);
1237
*iPermissionsMask = r * 8 * 8 + w * 8 + x;
1239
g_object_unref (pFileInfo);
1240
g_object_unref (pFile);
1244
gchar *vfs_backend_get_trash_path (const gchar *cNearURI, gchar **cFileInfoPath)
1246
gchar *cPath = NULL;
1247
/*GFile *pFile = g_file_new_for_uri ("trash://");
1248
gchar *cPath = g_file_get_path (pFile);
1249
g_object_unref (pFile);*/
1250
const gchar *xdgPath = g_getenv ("XDG_DATA_HOME");
1251
if (xdgPath != NULL)
1253
cPath = g_strdup_printf ("%s/Trash/files", xdgPath);
1254
if (cFileInfoPath != NULL)
1255
*cFileInfoPath = g_strdup_printf ("%s/Trash/info", xdgPath);
1259
cPath = g_strdup_printf ("%s/.local/share/Trash/files", g_getenv ("HOME"));
1260
if (cFileInfoPath != NULL)
1261
*cFileInfoPath = g_strdup_printf ("%s/.local/share/Trash/info", g_getenv ("HOME"));
1266
gchar *vfs_backend_get_desktop_path (void)
1268
GFile *pFile = g_file_new_for_uri ("desktop://");
1269
gchar *cPath = g_file_get_path (pFile);
1270
g_object_unref (pFile);
1272
cPath = g_strdup_printf ("%s/Desktop", g_getenv ("HOME"));