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
cd_message ("%s (%s)", __func__, cBaseURI);
254
/// gerer cas d'une URL d'une icone du bureau (x-nautilus-desktop://blablabla sous Gnome)...
257
if (*cBaseURI == '/')
258
cFullURI = g_filename_to_uri (cBaseURI, NULL, NULL);
260
cFullURI = g_strdup (cBaseURI);
261
cd_message (" -> cFullURI : %s", cFullURI);
265
*cName = g_path_get_basename (cFullURI);
267
/*KURL url(cFullURI);
268
QString icon = KMimeType::iconForURL(url);
269
**cIconName = g_strdup (icon.toUtf8().constData());
271
gchar *cFileName = g_filename_from_uri (cBaseURI, NULL, NULL);
272
*bIsDirectory = g_file_test (cFileName);
281
GError *erreur = NULL;
282
GFile *pFile = g_file_new_for_uri (cFullURI);
284
const gchar *cQuery = G_FILE_ATTRIBUTE_STANDARD_TYPE","
285
G_FILE_ATTRIBUTE_STANDARD_SIZE","
286
G_FILE_ATTRIBUTE_TIME_MODIFIED","
287
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
288
G_FILE_ATTRIBUTE_STANDARD_NAME","
289
G_FILE_ATTRIBUTE_STANDARD_ICON","
290
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
291
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
292
GFileInfo *pFileInfo = g_file_query_info (pFile,
294
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
297
//g_object_unref (pFile);
300
cd_warning ("gnome_integration : %s", erreur->message);
301
g_error_free (erreur);
306
const gchar *cFileName = g_file_info_get_name (pFileInfo);
307
const gchar *cMimeType = g_file_info_get_content_type (pFileInfo);
308
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
310
if (iSortType == CAIRO_DOCK_FM_SORT_BY_DATE)
313
g_file_info_get_modification_time (pFileInfo, &t);
316
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_SIZE)
317
*fOrder = g_file_info_get_size (pFileInfo);
318
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_TYPE)
319
*fOrder = (cMimeType != NULL ? *((int *) cMimeType) : 0);
323
*bIsDirectory = (iFileType == G_FILE_TYPE_DIRECTORY);
324
cd_message (" => '%s' (mime:%s ; bIsDirectory:%d)", cFileName, cMimeType, *bIsDirectory);
326
if (iFileType == G_FILE_TYPE_MOUNTABLE)
331
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
332
cd_message (" cTargetURI:%s", cTargetURI);
333
GMount *pMount = NULL;
334
if (cTargetURI != NULL)
336
GFile *file = g_file_new_for_uri (cTargetURI);
337
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
338
//g_object_unref (file);
342
*cName = g_mount_get_name (pMount);
343
cd_message ("un GMount existe (%s)",* cName);
347
gchar *cMountName = g_strdup (cFileName);
348
gchar *str = strrchr (cMountName, '.'); // on vire l'extension ".volume" ou ".drive".
352
if (strcmp (str+1, "link") == 0) // pour les liens, on prend le nom du lien.
354
if (strcmp (cMountName, "root") == 0) // on remplace 'root' par un nom plus parlant, sinon on prendra le nom du lien.
356
*cName = g_strdup ("/");
359
else if (strcmp (str+1, "drive") == 0) // on cherche un nom plus parlant si possible.
361
gchar *cVolumeName = _cd_find_volume_name_from_drive_name (cMountName);
362
if (cVolumeName != NULL)
364
*cName = cVolumeName;
371
//g_free (cMountName);
374
*cName = g_strdup (cFileName);
379
*cName = g_strdup (cFileName);
383
if (cMimeType != NULL && strncmp (cMimeType, "image", 5) == 0)
385
gchar *cHostname = NULL;
386
GError *erreur = NULL;
387
gchar *cFilePath = g_filename_from_uri (cBaseURI, &cHostname, &erreur);
390
g_error_free (erreur);
392
else if (cHostname == NULL || strcmp (cHostname, "localhost") == 0) // on ne recupere la vignette que sur les fichiers locaux.
394
*cIconName = g_strdup (cFilePath);
395
cairo_dock_remove_html_spaces (*cIconName);
397
//g_free (cHostname);
399
if (*cIconName == NULL)
401
GIcon *pSystemIcon = g_file_info_get_icon (pFileInfo);
402
if (pSystemIcon != NULL)
404
*cIconName = _cd_get_icon_path (pSystemIcon);
407
cd_message ("cIconName : %s", *cIconName);
409
//*iVolumeID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE);
410
//cd_message ("ID : %d\n", *iVolumeID);
411
//g_object_unref (pFileInfo);
414
static Icon *_cd_get_icon_for_volume (GVolume *pVolume, GMount *pMount)
416
Icon *pNewIcon = NULL;
421
pMount = g_volume_get_mount (pVolume);
422
else if (pMount == NULL)
425
if (pMount != NULL) // ce volume est monte.
427
pNewIcon = g_new0 (Icon, 1);
428
pNewIcon->cName = g_mount_get_name (pMount);
430
pRootDir = g_mount_get_root (pMount);
431
pNewIcon->cCommand = g_file_get_uri (pRootDir);
432
//g_object_unref (pRootDir);
434
pIcon = g_mount_get_icon (pMount);
435
pNewIcon->cFileName = _cd_get_icon_path (pIcon);
436
//g_object_unref (pIcon);
438
//g_object_unref (pMount);
440
else // ce volume est demonte, on le montre quand meme (l'automount peut etre off).
442
pNewIcon = g_new0 (Icon, 1);
443
pNewIcon->cName = g_volume_get_name (pVolume);
445
pIcon = g_volume_get_icon (pVolume);
446
pNewIcon->cFileName = _cd_get_icon_path (pIcon);
447
//g_object_unref (pIcon);
449
pNewIcon->cCommand = g_strdup (pNewIcon->cName);
451
pNewIcon->iVolumeID = 1;
452
pNewIcon->cBaseURI = g_strdup (pNewIcon->cCommand);
453
cd_message (" => %s", pNewIcon->cCommand);
457
GList *vfs_backend_list_volumes (void)
459
GVolumeMonitor *pVolumeMonitor = g_volume_monitor_get ();
460
GList *pIconsList = NULL;
463
//\___________________ On chope les disques connectes (lecteur de CD/disquette/etc) et on liste leurs volumes.
464
GList *pDrivesList = g_volume_monitor_get_connected_drives (pVolumeMonitor);
465
GList *pAssociatedVolumes;
469
for (dl = pDrivesList; dl != NULL; dl = dl->next)
472
cd_message ("drive '%s'", g_drive_get_name (pDrive));
474
pAssociatedVolumes = g_drive_get_volumes (pDrive);
475
if (pAssociatedVolumes != NULL)
477
for (av = pAssociatedVolumes; av != NULL; av = av->next)
480
cd_message (" + volume '%s'", g_volume_get_name (pVolume));
481
pNewIcon = _cd_get_icon_for_volume (pVolume, NULL);
482
if (pNewIcon != NULL)
483
pIconsList = g_list_prepend (pIconsList, pNewIcon);
484
//g_object_unref (pVolume);
486
g_list_free (pAssociatedVolumes);
488
else // le disque n'a aucun volume montable
490
cd_message (" le disque n'a aucun volume montable");
491
/*if (g_drive_is_media_removable (pDrive) && ! g_drive_is_media_check_automatic (pDrive))
493
g_drive_get_icon (pDrive);
494
g_drive_get_name (pDrive);
497
//g_object_unref (pDrive);
499
g_list_free (pDrivesList);
501
//\___________________ On chope les volumes qui ne sont pas associes a un disque.
502
GList *pVolumesList = g_volume_monitor_get_volumes (pVolumeMonitor);
504
for (v = pVolumesList; v != NULL; v = v->next)
507
cd_message ("volume '%s'", g_volume_get_name (pVolume));
508
pDrive = g_volume_get_drive (pVolume);
509
if (pDrive != NULL) // on l'a deja liste dans la 1ere boucle.
511
cd_message (" drive '%s' est deja liste", g_drive_get_name (pDrive));
512
//g_object_unref (pDrive);
516
cd_message (" + volume '%s'\n", g_volume_get_name (pVolume));
517
if (pNewIcon != NULL)
518
pNewIcon = _cd_get_icon_for_volume (pVolume, NULL);
519
pIconsList = g_list_prepend (pIconsList, pNewIcon);
521
//g_object_unref (pVolume);
523
g_list_free (pVolumesList);
525
//\___________________ On chope les points de montage qui n'ont pas de volumes. (montage de mtab, ftp, etc)
526
GList *pMountsList = g_volume_monitor_get_mounts (pVolumeMonitor);
529
for (m = pMountsList; m != NULL; m = m->next)
532
cd_message ("mount '%s'", g_mount_get_name (pMount));
533
pVolume = g_mount_get_volume (pMount);
534
if (pVolume != NULL) // on l'a deja liste precedemment.
536
cd_message ("volume '%s' est deja liste", g_volume_get_name (pVolume));
537
//g_object_unref (pVolume);
541
cd_message ("+ volume '%s'", g_volume_get_name (pVolume));
542
if (pNewIcon != NULL)
543
pNewIcon = _cd_get_icon_for_volume (NULL, pMount);
544
pIconsList = g_list_prepend (pIconsList, pNewIcon);
546
//g_object_unref (pMount);
548
g_list_free (pMountsList);
553
GList *vfs_backend_list_directory (const gchar *cBaseURI, CairoDockFMSortType iSortType, int iNewIconsType, gboolean bListHiddenFiles, gchar **cFullURI)
555
g_return_val_if_fail (cBaseURI != NULL, NULL);
556
cd_message ("%s (%s)", __func__, cBaseURI);
559
gboolean bAddHome = FALSE;
560
if (strcmp (cBaseURI, CAIRO_DOCK_FM_VFS_ROOT) == 0)
562
cURI = g_strdup ("computer://");
565
///return vfs_backend_list_volumes ();
566
//vfs_backend_list_volumes ();
568
else if (strcmp (cBaseURI, CAIRO_DOCK_FM_NETWORK) == 0)
569
cURI = g_strdup ("network://");
571
cURI = (*cBaseURI == '/' ? g_strconcat ("file://", cBaseURI, NULL) : g_strdup (cBaseURI));
574
GFile *pFile = g_file_new_for_uri (cURI);
575
GError *erreur = NULL;
576
const gchar *cAttributes = G_FILE_ATTRIBUTE_STANDARD_TYPE","
577
G_FILE_ATTRIBUTE_STANDARD_SIZE","
578
G_FILE_ATTRIBUTE_TIME_MODIFIED","
579
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
580
G_FILE_ATTRIBUTE_STANDARD_NAME","
581
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN","
582
G_FILE_ATTRIBUTE_STANDARD_ICON","
583
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
584
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
585
GFileEnumerator *pFileEnum = g_file_enumerate_children (pFile,
587
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
590
//g_object_unref (pFile);
593
cd_warning ("gnome_integration : %s", erreur->message);
594
g_error_free (erreur);
599
GList *pIconList = NULL;
601
GFileInfo *pFileInfo;
604
pFileInfo = g_file_enumerator_next_file (pFileEnum, NULL, &erreur);
607
cd_warning ("gnome_integration : %s", erreur->message);
608
g_error_free (erreur);
612
if (pFileInfo == NULL)
615
gboolean bIsHidden = g_file_info_get_is_hidden (pFileInfo);
616
if (bListHiddenFiles || ! bIsHidden)
618
GFileType iFileType = g_file_info_get_file_type (pFileInfo);
619
GIcon *pFileIcon = g_file_info_get_icon (pFileInfo);
620
if (pFileIcon == NULL)
622
cd_message ("AUCUNE ICONE");
625
const gchar *cFileName = g_file_info_get_name (pFileInfo);
626
const gchar *cMimeType = g_file_info_get_content_type (pFileInfo);
629
icon = g_new0 (Icon, 1);
630
icon->iType = iNewIconsType;
631
icon->cBaseURI = g_strconcat (*cFullURI, "/", cFileName, NULL);
632
cd_message ("+ %s (mime:%s)", icon->cBaseURI, cMimeType);
634
if (iFileType == G_FILE_TYPE_MOUNTABLE)
636
const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
637
cd_message (" c'est un point de montage correspondant a %s", cTargetURI);
639
GMount *pMount = NULL;
640
if (cTargetURI != NULL)
642
icon->cCommand = g_strdup (cTargetURI);
643
GFile *file = g_file_new_for_uri (cTargetURI);
644
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
645
//g_object_unref (file);
649
cName = g_mount_get_name (pMount);
650
cd_message ("un GMount existe (%s)", cName);
652
GVolume *volume = g_mount_get_volume (pMount);
654
cd_message (" volume associe : %s", g_volume_get_name (volume));
655
GDrive *drive = g_mount_get_drive (pMount);
657
cd_message (" disque associe : %s", g_drive_get_name (drive));
659
///pFileIcon = g_mount_get_icon (pMount);
663
cName = g_strdup (cFileName);
664
gchar *str = strrchr (cName, '.'); // on vire l'extension ".volume" ou ".drive".
668
if (strcmp (str+1, "link") == 0)
670
if (strcmp (cName, "root") == 0)
673
cName = g_strdup ("/");
676
else if (strcmp (str+1, "drive") == 0) // on cherche un nom plus parlant si possible.
678
gchar *cVolumeName = _cd_find_volume_name_from_drive_name (cName);
679
if (cVolumeName != NULL)
682
g_free (cVolumeName);
683
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.
684
/**if (strcmp (cVolumeName, "discard") == 0)
687
cName = cVolumeName;*/
693
cd_message ("le nom de ce volume est : %s", cName);
696
cName = g_strdup (cFileName);
698
if (icon->cCommand == NULL)
699
icon->cCommand = g_strdup (icon->cBaseURI);
701
icon->cFileName = NULL;
702
if (cMimeType != NULL && strncmp (cMimeType, "image", 5) == 0)
704
gchar *cHostname = NULL;
705
gchar *cFilePath = g_filename_from_uri (icon->cBaseURI, &cHostname, &erreur);
708
g_error_free (erreur);
711
else if (cHostname == NULL || strcmp (cHostname, "localhost") == 0) // on ne recupere la vignette que sur les fichiers locaux.
713
icon->cFileName = g_strdup (cFilePath);
714
cairo_dock_remove_html_spaces (icon->cFileName);
719
if (icon->cFileName == NULL)
721
icon->cFileName = _cd_get_icon_path (pFileIcon);
722
cd_message ("icon->cFileName : %s", icon->cFileName);
725
if (iSortType == CAIRO_DOCK_FM_SORT_BY_SIZE)
726
icon->fOrder = g_file_info_get_size (pFileInfo);
727
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_DATE)
730
g_file_info_get_modification_time (pFileInfo, &t);
731
icon->fOrder = t.tv_sec;
733
else if (iSortType == CAIRO_DOCK_FM_SORT_BY_TYPE)
734
icon->fOrder = (cMimeType != NULL ? *((int *) cMimeType) : 0);
735
if (icon->fOrder == 0) // un peu moyen mais mieux que rien non ?
736
icon->fOrder = iOrder;
737
pIconList = g_list_insert_sorted (pIconList,
739
(GCompareFunc) cairo_dock_compare_icons_order);
740
//g_list_prepend (pIconList, icon);
743
} while (TRUE); // 'g_file_enumerator_close' est appelee lors du dernier 'g_file_enumerator_next_file'.
745
if (bAddHome && pIconList != NULL)
747
icon = g_new0 (Icon, 1);
748
icon->iType = iNewIconsType;
749
icon->cBaseURI = g_strdup_printf ("file://%s", "/home");
750
icon->cCommand = g_strdup ("/home");
751
//icon->cCommand = g_strdup (icon->cBaseURI);
753
icon->cName = g_strdup ("home");
754
Icon *pRootIcon = cairo_dock_get_icon_with_name (pIconList, "/");
755
if (pRootIcon == NULL)
757
pRootIcon = cairo_dock_get_first_icon (pIconList);
758
g_print ("domage ! (%s:%s)\n", pRootIcon->cCommand, pRootIcon->cName);
760
icon->cFileName = g_strdup (pRootIcon->cFileName);
761
icon->fOrder = iOrder++;
762
pIconList = g_list_insert_sorted (pIconList,
764
(GCompareFunc) cairo_dock_compare_icons_order);
767
if (iSortType == CAIRO_DOCK_FM_SORT_BY_NAME)
768
pIconList = cairo_dock_sort_icons_by_name (pIconList);
770
pIconList = cairo_dock_sort_icons_by_order (pIconList);
777
static gchar *_cd_find_target_uri (const gchar *cBaseURI)
779
GError *erreur = NULL;
780
GFile *pFile = g_file_new_for_uri (cBaseURI);
781
GFileInfo *pFileInfo = g_file_query_info (pFile,
782
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI,
783
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
786
g_object_unref (pFile);
789
cd_warning ("gnome-integration : %s", erreur->message);
790
g_error_free (erreur);
793
gchar *cTargetURI = g_strdup (g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI));
794
g_object_unref (pFileInfo);
797
void vfs_backend_launch_uri (const gchar *cURI)
799
g_return_if_fail (cURI != NULL);
801
g_print ("%s (%s)", __func__, cURI);
802
gchar *cCommand = g_strdup_printf ("kfmclient exec \"%s\"", cURI);
803
cairo_dock_launch_command (cCommand);
811
GMount *_cd_find_mount_from_uri (const gchar *cURI, gchar **cTargetURI)
813
cd_message ("%s (%s)", __func__, cURI);
814
gchar *_cTargetURI = _cd_find_target_uri (cURI);
816
GMount *pMount = NULL;
817
if (_cTargetURI != NULL)
819
cd_message (" pointe sur %s", _cTargetURI);
820
GFile *file = g_file_new_for_uri (_cTargetURI);
821
pMount = g_file_find_enclosing_mount (file, NULL, NULL);
822
g_object_unref (file);
824
if (cTargetURI != NULL)
825
*cTargetURI = _cTargetURI;
827
g_free (_cTargetURI);
831
gchar *vfs_backend_is_mounted (const gchar *cURI, gboolean *bIsMounted)
833
cd_message ("%s (%s)", __func__, cURI);
834
gchar *cTargetURI = NULL;
835
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
836
cd_message (" cTargetURI : %s", cTargetURI);
841
if (cTargetURI != NULL && strcmp (cTargetURI, "file:///") == 0) // cas particulier ?
849
static gchar * _cd_find_drive_name_from_URI (const gchar *cURI)
851
g_return_val_if_fail (cURI != NULL, NULL);
852
if (strncmp (cURI, "computer:///", 12) == 0)
854
gchar *cDriveName = g_strdup (cURI+12);
855
gchar *str = strrchr (cDriveName, '.');
858
if (strcmp (str+1, "drive") == 0)
863
str = strchr (cDriveName, '\\');
875
gboolean vfs_backend_can_eject (const gchar *cURI)
877
cd_message ("%s (%s)", __func__, cURI);
878
gchar *cDriveName = _cd_find_drive_name_from_URI (cURI);
879
if (cDriveName == NULL)
882
gboolean bCanEject = _cd_find_can_eject_from_drive_name (cDriveName);
883
//g_free (cDriveName);
886
gboolean vfs_backend_eject_drive (const gchar *cURI)
888
cd_message ("%s (%s)", __func__, cURI);
889
gchar *cDriveName = _cd_find_drive_name_from_URI (cURI);
890
GDrive *pDrive = _cd_find_drive_from_name (cDriveName);
893
g_drive_eject (pDrive,
894
G_MOUNT_UNMOUNT_NONE,
899
//g_object_unref (pDrive);
900
//g_free (cDriveName);
905
static void _vfs_backend_mount_callback (gpointer pObject, GAsyncResult *res, gpointer *data)
906
//static void _vfs_backend_mount_callback (gboolean succeeded, char *error, char *detailed_error, gpointer *data)
908
cd_message ("%s (%d)", __func__, GPOINTER_TO_INT (data[1]));
910
CairoDockFMMountCallback pCallback = data[0];
912
GError *erreur = NULL;
914
if (GPOINTER_TO_INT (data[1]) == 1)
915
bSuccess = (g_file_mount_mountable_finish (G_FILE (pObject), res, &erreur) != NULL);
916
//bSuccess = (g_volume_mount_finish (G_VOLUME (pObject), res, &erreur));
917
else if (GPOINTER_TO_INT (data[1]) == 0)
918
bSuccess = g_mount_unmount_finish (G_MOUNT (pObject), res, &erreur);
920
bSuccess = g_mount_eject_finish (G_MOUNT (pObject), res, &erreur);
923
cd_warning ("gnome-integration : %s", erreur->message);
924
g_error_free (erreur);
927
cd_message ("(un)mount fini -> %d", bSuccess);
928
pCallback (GPOINTER_TO_INT (data[1]) == 1, bSuccess, data[2], data[3], data[4]);
930
//g_object_unref (pObject);
934
void vfs_backend_mount (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
936
g_return_if_fail (iVolumeID > 0);
937
cd_message ("%s (%s)", __func__, cURI);
939
/*gchar *cTargetURI = NULL;
940
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
941
cd_message (" %x / %s\n", pMount, cTargetURI);
942
GVolume *pVolume = g_mount_get_volume (pMount);
943
gpointer *data2 = g_new (gpointer, 5);
944
data2[0] = pCallback;
945
data2[1] = GINT_TO_POINTER (1);
946
data2[2] = g_path_get_basename (cURI);
949
g_volume_mount (pVolume,
953
(GAsyncReadyCallback) _vfs_backend_mount_callback,
955
gchar *cTargetURI = _cd_find_target_uri (cURI);
956
GFile *pFile = g_file_new_for_uri (cURI);
958
gpointer *data2 = g_new (gpointer, 5);
959
data2[0] = pCallback;
960
data2[1] = GINT_TO_POINTER (1);
961
data2[2] = g_path_get_basename (cTargetURI);
963
data2[4] = pContainer;
964
g_file_mount_mountable (pFile,
968
(GAsyncReadyCallback) _vfs_backend_mount_callback,
973
void vfs_backend_unmount (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
975
g_return_if_fail (cURI != NULL);
976
cd_message ("%s (%s)", __func__, cURI);
978
gchar *cTargetURI = NULL;
979
GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI);
980
if (pMount == NULL || ! G_IS_MOUNT (pMount))
985
if ( ! g_mount_can_unmount (pMount))
988
gboolean bCanEject = g_mount_can_eject (pMount);
989
gboolean bCanUnmount = g_mount_can_unmount (pMount);
990
cd_message ("eject:%d / unmount:%d\n", bCanEject, bCanUnmount);
991
if (! bCanEject && ! bCanUnmount)
994
gpointer *data2 = g_new (gpointer, 5);
995
data2[0] = pCallback;
996
data2[1] = GINT_TO_POINTER (bCanEject ? 2 : 0);
997
data2[2] = g_mount_get_name (pMount);
999
data2[4] = pContainer;
1001
g_mount_eject (pMount,
1002
G_MOUNT_UNMOUNT_NONE,
1004
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1007
g_mount_unmount (pMount,
1008
G_MOUNT_UNMOUNT_NONE ,
1010
(GAsyncReadyCallback) _vfs_backend_mount_callback,
1015
static void _on_monitor_changed (GFileMonitor *monitor,
1018
GFileMonitorEvent event_type,
1021
CairoDockFMMonitorCallback pCallback = data[0];
1022
gpointer user_data = data[1];
1023
cd_message ("%s (%d , data : %x)", __func__, event_type, user_data);
1025
CairoDockFMEventType iEventType;
1028
case G_FILE_MONITOR_EVENT_CHANGED :
1029
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT :
1030
//case G_FILE_MONITOR_EVENT_UNMOUNTED : // pertinent ?...
1031
iEventType = CAIRO_DOCK_FILE_MODIFIED;
1032
cd_message ("modification d'un fichier");
1035
case G_FILE_MONITOR_EVENT_DELETED :
1036
iEventType = CAIRO_DOCK_FILE_DELETED;
1037
cd_message ("effacement d'un fichier");
1040
case G_FILE_MONITOR_EVENT_CREATED :
1041
iEventType = CAIRO_DOCK_FILE_CREATED;
1042
cd_message ("creation d'un fichier");
1048
gchar *cURI = g_file_get_uri (file);
1049
cd_message (" c'est le fichier %s", cURI);
1050
gchar *cPath = NULL;
1051
if (strncmp (cURI, "computer://", 11) == 0)
1053
if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
1058
memcpy (cURI+4, "file", 4);
1059
cPath = g_filename_from_uri (cURI+4, NULL, NULL);
1060
cd_debug(" (path:%s)", cPath);
1062
cURI = g_strdup_printf ("computer://%s", cPath);
1063
cd_message ("son URI complete est : %s", cURI);
1066
pCallback (iEventType, cURI, user_data);
1071
void vfs_backend_add_monitor (const gchar *cURI, gboolean bDirectory, CairoDockFMMonitorCallback pCallback, gpointer user_data)
1073
g_return_if_fail (cURI != NULL);
1074
GError *erreur = NULL;
1075
GFileMonitor *pMonitor;
1076
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1078
pMonitor = g_file_monitor_directory (pFile,
1079
G_FILE_MONITOR_WATCH_MOUNTS,
1083
pMonitor = g_file_monitor_file (pFile,
1084
G_FILE_MONITOR_WATCH_MOUNTS,
1087
//g_object_unref (pFile);
1090
cd_warning ("gnome-integration : couldn't add monitor on '%s' (%d) [%s]", cURI, bDirectory, erreur->message);
1091
g_error_free (erreur);
1095
gpointer *data = g_new0 (gpointer, 3);
1096
data[0] = pCallback;
1097
data[1] = user_data;
1099
g_signal_connect (G_OBJECT (pMonitor), "changed", G_CALLBACK (_on_monitor_changed), data);
1101
g_hash_table_insert (s_hMonitorHandleTable, g_strdup (cURI), data);
1102
cd_message (">>> moniteur ajoute sur %s (%x)", cURI, user_data);
1105
void vfs_backend_remove_monitor (const gchar *cURI)
1109
cd_message (">>> moniteur supprime sur %s", cURI);
1110
g_hash_table_remove (s_hMonitorHandleTable, cURI);
1116
gboolean vfs_backend_delete_file (const gchar *cURI)
1118
g_return_val_if_fail (cURI != NULL, FALSE);
1119
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1121
GError *erreur = NULL;
1122
gboolean bSuccess = g_file_trash (pFile, NULL, &erreur);
1125
cd_warning ("gnome-integration : %s", erreur->message);
1126
g_error_free (erreur);
1128
g_object_unref (pFile);
1132
gboolean vfs_backend_rename_file (const gchar *cOldURI, const gchar *cNewName)
1134
g_return_val_if_fail (cOldURI != NULL, FALSE);
1135
GFile *pOldFile = (*cOldURI == '/' ? g_file_new_for_path (cOldURI) : g_file_new_for_uri (cOldURI));
1136
GError *erreur = NULL;
1137
GFile *pNewFile = g_file_set_display_name (pOldFile, cNewName, NULL, &erreur);
1140
cd_warning ("gnome-integration : %s", erreur->message);
1141
g_error_free (erreur);
1143
gboolean bSuccess = (pNewFile != NULL);
1144
if (pNewFile != NULL)
1145
g_object_unref (pNewFile);
1146
g_object_unref (pOldFile);
1150
gboolean vfs_backend_move_file (const gchar *cURI, const gchar *cDirectoryURI)
1152
g_return_val_if_fail (cURI != NULL, FALSE);
1153
cd_message (" %s -> %s", cURI, cDirectoryURI);
1154
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1156
gchar *cFileName = g_file_get_basename (pFile);
1157
gchar *cNewFileURI = g_strconcat (cDirectoryURI, "/", cFileName, NULL); // un peu moyen mais bon...
1158
GFile *pDestinationFile = (*cNewFileURI == '/' ? g_file_new_for_path (cNewFileURI) : g_file_new_for_uri (cNewFileURI));
1159
g_free (cNewFileURI);
1162
GError *erreur = NULL;
1163
gboolean bSuccess = g_file_move (pFile,
1165
G_FILE_COPY_NOFOLLOW_SYMLINKS,
1167
NULL, // GFileProgressCallback
1172
cd_warning ("gnome-integration : %s", erreur->message);
1173
g_error_free (erreur);
1175
g_object_unref (pFile);
1176
g_object_unref (pDestinationFile);
1180
void vfs_backend_get_file_properties (const gchar *cURI, guint64 *iSize, time_t *iLastModificationTime, gchar **cMimeType, int *iUID, int *iGID, int *iPermissionsMask)
1182
g_return_if_fail (cURI != NULL);
1183
GFile *pFile = (*cURI == '/' ? g_file_new_for_path (cURI) : g_file_new_for_uri (cURI));
1184
GError *erreur = NULL;
1185
const gchar *cQuery = G_FILE_ATTRIBUTE_STANDARD_SIZE","
1186
G_FILE_ATTRIBUTE_TIME_MODIFIED","
1187
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
1188
G_FILE_ATTRIBUTE_UNIX_UID","
1189
G_FILE_ATTRIBUTE_UNIX_GID","
1190
G_FILE_ATTRIBUTE_ACCESS_CAN_READ","
1191
G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE","
1192
G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE;
1193
GFileInfo *pFileInfo = g_file_query_info (pFile,
1195
G_FILE_QUERY_INFO_NONE, /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
1200
cd_warning ("gnome-integration : couldn't get file properties for '%s' [%s]", cURI, erreur->message);
1201
g_error_free (erreur);
1204
*iSize = g_file_info_get_attribute_uint64 (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_SIZE);
1205
*iLastModificationTime = (time_t) g_file_info_get_attribute_uint64 (pFileInfo, G_FILE_ATTRIBUTE_TIME_MODIFIED);
1206
*cMimeType = g_file_info_get_attribute_as_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
1207
*iUID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_UNIX_UID);
1208
*iGID = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_UNIX_GID);
1209
int r = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_READ);
1210
int w = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE);
1211
int x = g_file_info_get_attribute_uint32 (pFileInfo, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE);
1212
*iPermissionsMask = r * 8 * 8 + w * 8 + x;
1214
g_object_unref (pFileInfo);
1215
g_object_unref (pFile);
1219
gchar *vfs_backend_get_trash_path (const gchar *cNearURI, gchar **cFileInfoPath)
1221
gchar *cPath = NULL;
1222
/*GFile *pFile = g_file_new_for_uri ("trash://");
1223
gchar *cPath = g_file_get_path (pFile);
1224
g_object_unref (pFile);*/
1225
const gchar *xdgPath = g_getenv ("XDG_DATA_HOME");
1226
if (xdgPath != NULL)
1228
cPath = g_strdup_printf ("%s/Trash/files", xdgPath);
1229
if (cFileInfoPath != NULL)
1230
*cFileInfoPath = g_strdup_printf ("%s/Trash/info", xdgPath);
1234
cPath = g_strdup_printf ("%s/.local/share/Trash/files", g_getenv ("HOME"));
1235
if (cFileInfoPath != NULL)
1236
*cFileInfoPath = g_strdup_printf ("%s/.local/share/Trash/info", g_getenv ("HOME"));
1241
gchar *vfs_backend_get_desktop_path (void)
1243
GFile *pFile = g_file_new_for_uri ("desktop://");
1244
gchar *cPath = g_file_get_path (pFile);
1245
g_object_unref (pFile);
1247
cPath = g_strdup_printf ("%s/Desktop", g_getenv ("HOME"));