1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2
/* computer-method.c - The
4
Copyright (C) 2003 Red Hat, Inc
6
The Gnome Library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Library General Public License as
8
published by the Free Software Foundation; either version 2 of the
9
License, or (at your option) any later version.
11
The Gnome Library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Library General Public License for more details.
16
You should have received a copy of the GNU Library General Public
17
License along with the Gnome Library; see the file COPYING.LIB. If not,
18
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
Boston, MA 02111-1307, USA.
22
Alexander Larsson <alexl@redhat.com>
30
#include <libgnomevfs/gnome-vfs-i18n.h>
31
#include <libgnomevfs/gnome-vfs-module-shared.h>
32
#include <libgnomevfs/gnome-vfs-module.h>
33
#include <libgnomevfs/gnome-vfs-volume-monitor.h>
34
#include <libgnomevfs/gnome-vfs-utils.h>
35
#include <libgnomevfs/gnome-vfs-monitor-private.h>
46
char *file_name; /* Not encoded */
47
ComputerFileType type;
49
GnomeVFSVolume *volume;
61
GnomeVFSMonitorType type;
65
static ComputerDir *root_dir = NULL;
67
G_LOCK_DEFINE_STATIC (root_dir);
70
computer_file_new (ComputerFileType type)
74
file = g_new0 (ComputerFile, 1);
81
computer_file_free (ComputerFile *file)
84
ComputerMonitor *monitor;
86
if (file->type == COMPUTER_VOLUME) {
87
gnome_vfs_volume_unref (file->volume);
89
if (file->type == COMPUTER_DRIVE) {
90
gnome_vfs_drive_unref (file->drive);
93
for (l = file->file_monitors; l != NULL; l = l->next) {
97
g_list_free (file->file_monitors);
103
computer_file_get_uri (ComputerFile *file) {
107
uri = gnome_vfs_uri_new ("computer:///");
110
uri = gnome_vfs_uri_append_file_name (uri, file->file_name);
111
gnome_vfs_uri_unref (tmp);
118
computer_file_add (ComputerDir *dir, ComputerFile *file)
120
ComputerMonitor *monitor;
124
dir->files = g_list_prepend (dir->files, file);
126
uri = computer_file_get_uri (file);
127
for (l = dir->dir_monitors; l != NULL; l = l->next) {
129
gnome_vfs_monitor_callback ((GnomeVFSMethodHandle *)monitor,
131
GNOME_VFS_MONITOR_EVENT_CREATED);
133
gnome_vfs_uri_unref (uri);
137
computer_file_remove (ComputerDir *dir, ComputerFile *file)
139
ComputerMonitor *monitor;
143
dir->files = g_list_remove (dir->files, file);
145
uri = computer_file_get_uri (file);
146
for (l = dir->dir_monitors; l != NULL; l = l->next) {
148
gnome_vfs_monitor_callback ((GnomeVFSMethodHandle *)monitor,
150
GNOME_VFS_MONITOR_EVENT_DELETED);
152
for (l = file->file_monitors; l != NULL; l = l->next) {
154
gnome_vfs_monitor_callback ((GnomeVFSMethodHandle *)monitor,
156
GNOME_VFS_MONITOR_EVENT_DELETED);
158
gnome_vfs_uri_unref (uri);
160
computer_file_free (file);
164
computer_file_changed (ComputerDir *dir, ComputerFile *file)
166
ComputerMonitor *monitor;
170
uri = computer_file_get_uri (file);
171
for (l = dir->dir_monitors; l != NULL; l = l->next) {
173
gnome_vfs_monitor_callback ((GnomeVFSMethodHandle *)monitor,
175
GNOME_VFS_MONITOR_EVENT_CHANGED);
177
for (l = file->file_monitors; l != NULL; l = l->next) {
179
gnome_vfs_monitor_callback ((GnomeVFSMethodHandle *)monitor,
181
GNOME_VFS_MONITOR_EVENT_CHANGED);
183
gnome_vfs_uri_unref (uri);
186
static ComputerFile *
187
get_volume_file (ComputerDir *dir, GnomeVFSVolume *volume)
192
for (l = dir->files; l != NULL; l = l->next) {
194
if (file->type == COMPUTER_VOLUME &&
195
file->volume == volume) {
202
static ComputerFile *
203
get_drive_file (ComputerDir *dir, GnomeVFSDrive *drive)
208
for (l = dir->files; l != NULL; l = l->next) {
210
if (file->type == COMPUTER_DRIVE &&
211
file->drive == drive) {
218
static ComputerFile *
219
get_file (ComputerDir *dir, char *name)
228
for (l = dir->files; l != NULL; l = l->next) {
230
if (strcmp (file->file_name, name) == 0) {
238
build_file_name (char *name, char *extension)
243
escaped = gnome_vfs_escape_string (name);
244
ret = g_strconcat (escaped, extension, NULL);
251
volume_mounted (GnomeVFSVolumeMonitor *volume_monitor,
252
GnomeVFSVolume *volume,
256
GnomeVFSDrive *drive;
260
if (gnome_vfs_volume_is_user_visible (volume)) {
261
drive = gnome_vfs_volume_get_drive (volume);
263
file = computer_file_new (COMPUTER_VOLUME);
264
name = gnome_vfs_volume_get_display_name (volume);
265
file->file_name = build_file_name (name, ".volume");
267
file->volume = gnome_vfs_volume_ref (volume);
268
computer_file_add (dir, file);
270
file = get_drive_file (dir, drive);
272
computer_file_changed (dir, file);
275
gnome_vfs_drive_unref (drive);
281
volume_unmounted (GnomeVFSVolumeMonitor *volume_monitor,
282
GnomeVFSVolume *volume,
286
GnomeVFSDrive *drive;
289
drive = gnome_vfs_volume_get_drive (volume);
291
file = get_drive_file (dir, drive);
293
computer_file_changed (dir, file);
295
gnome_vfs_drive_unref (drive);
298
file = get_volume_file (dir, volume);
300
computer_file_remove (dir, file);
306
drive_connected (GnomeVFSVolumeMonitor *volume_monitor,
307
GnomeVFSDrive *drive,
314
if (gnome_vfs_drive_is_user_visible (drive)) {
315
file = computer_file_new (COMPUTER_DRIVE);
316
name = gnome_vfs_drive_get_display_name (drive);
317
file->file_name = build_file_name (name, ".drive");
319
file->drive = gnome_vfs_drive_ref (drive);
320
computer_file_add (dir, file);
326
drive_disconnected (GnomeVFSVolumeMonitor *volume_monitor,
327
GnomeVFSDrive *drive,
333
file = get_drive_file (dir, drive);
335
computer_file_remove (dir, file);
341
fill_root (ComputerDir *dir)
343
GnomeVFSVolumeMonitor *monitor;
344
GnomeVFSVolume *volume;
345
GnomeVFSDrive *drive;
346
GList *volumes, *drives, *l;
350
monitor = gnome_vfs_get_volume_monitor ();
353
/* Don't want home in computer:// */
354
file = computer_file_new (COMPUTER_HOME_LINK);
355
file->file_name = g_strdup ("Home.desktop");
356
computer_file_add (dir, file);
359
file = computer_file_new (COMPUTER_ROOT_LINK);
360
file->file_name = g_strdup ("Filesystem.desktop");
361
computer_file_add (dir, file);
363
file = computer_file_new (COMPUTER_NETWORK_LINK);
364
file->file_name = g_strdup ("Network.desktop");
365
computer_file_add (dir, file);
367
volumes = gnome_vfs_volume_monitor_get_mounted_volumes (monitor);
368
drives = gnome_vfs_volume_monitor_get_connected_drives (monitor);
370
for (l = drives; l != NULL; l = l->next) {
372
if (gnome_vfs_drive_is_user_visible (drive)) {
373
file = computer_file_new (COMPUTER_DRIVE);
374
name = gnome_vfs_drive_get_display_name (drive);
375
file->file_name = build_file_name (name, ".drive");
377
file->drive = gnome_vfs_drive_ref (drive);
378
computer_file_add (dir, file);
382
for (l = volumes; l != NULL; l = l->next) {
384
if (gnome_vfs_volume_is_user_visible (volume)) {
385
drive = gnome_vfs_volume_get_drive (volume);
387
file = computer_file_new (COMPUTER_VOLUME);
388
name = gnome_vfs_volume_get_display_name (volume);
389
file->file_name = build_file_name (name, ".volume");
391
file->volume = gnome_vfs_volume_ref (volume);
392
computer_file_add (dir, file);
394
gnome_vfs_drive_unref (drive);
398
g_list_foreach (drives, (GFunc) gnome_vfs_drive_unref, NULL);
399
g_list_foreach (volumes, (GFunc) gnome_vfs_volume_unref, NULL);
400
g_list_free (drives);
401
g_list_free (volumes);
403
g_signal_connect (monitor, "volume_mounted",
404
G_CALLBACK (volume_mounted), dir);
405
g_signal_connect (monitor, "volume_unmounted",
406
G_CALLBACK (volume_unmounted), dir);
407
g_signal_connect (monitor, "drive_connected",
408
G_CALLBACK (drive_connected), dir);
409
g_signal_connect (monitor, "drive_disconnected",
410
G_CALLBACK (drive_disconnected), dir);
418
if (root_dir == NULL) {
419
root_dir = g_new0 (ComputerDir, 1);
420
fill_root (root_dir);
435
file_handle_new (char *data)
438
result = g_new (FileHandle, 1);
441
result->len = strlen (data);
448
file_handle_destroy (FileHandle *handle)
450
g_free (handle->data);
455
get_data_for_volume (GnomeVFSVolume *volume)
462
uri = gnome_vfs_volume_get_activation_uri (volume);
463
name = gnome_vfs_volume_get_display_name (volume);
464
icon = gnome_vfs_volume_get_icon (volume);
465
data = g_strdup_printf ("[Desktop Entry]\n"
471
"X-Gnome-Volume=%ld",
475
gnome_vfs_volume_get_id (volume));
485
get_data_for_drive (GnomeVFSDrive *drive)
494
volume_list = gnome_vfs_drive_get_mounted_volumes (drive);
495
if (volume_list != NULL) {
496
GnomeVFSVolume *volume;
497
volume = GNOME_VFS_VOLUME (volume_list->data);
499
uri = gnome_vfs_volume_get_activation_uri (volume);
500
tmp1 = gnome_vfs_drive_get_display_name (drive);
501
tmp2 = gnome_vfs_volume_get_display_name (volume);
502
if (strcmp (tmp1, tmp2) != 0) {
503
name = g_strconcat (tmp1, ": ", tmp2, NULL);
505
name = g_strdup (tmp1);
509
icon = gnome_vfs_volume_get_icon (volume);
510
gnome_vfs_volume_unref (volume);
512
uri = gnome_vfs_drive_get_activation_uri (drive);
513
name = gnome_vfs_drive_get_display_name (drive);
514
icon = gnome_vfs_drive_get_icon (drive);
516
data = g_strdup_printf ("[Desktop Entry]\n"
526
gnome_vfs_drive_get_id (drive));
535
get_data_for_network (void)
539
data = g_strdup_printf ("[Desktop Entry]\n"
543
"Icon=gnome-fs-network\n"
551
get_data_for_home (void)
556
uri = gnome_vfs_get_uri_from_local_path (g_get_home_dir ());
557
data = g_strdup_printf ("[Desktop Entry]\n"
561
"Icon=gnome-fs-home\n"
571
get_data_for_root (void)
575
data = g_strdup_printf ("[Desktop Entry]\n"
579
"Icon=gnome-dev-harddisk\n"
586
static GnomeVFSResult
587
do_open (GnomeVFSMethod *method,
588
GnomeVFSMethodHandle **method_handle,
590
GnomeVFSOpenMode mode,
591
GnomeVFSContext *context)
593
FileHandle *file_handle;
599
_GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
600
_GNOME_VFS_METHOD_PARAM_CHECK (uri != NULL);
602
if (mode & GNOME_VFS_OPEN_WRITE) {
603
return GNOME_VFS_ERROR_NOT_PERMITTED;
606
if (strcmp (uri->text, "/") == 0) {
607
return GNOME_VFS_ERROR_NOT_PERMITTED;
614
name = gnome_vfs_uri_extract_short_name (uri);
615
file = get_file (dir, name);
620
return GNOME_VFS_ERROR_NOT_FOUND;
624
switch (file->type) {
625
case COMPUTER_HOME_LINK:
626
data = get_data_for_home ();
628
case COMPUTER_ROOT_LINK:
629
data = get_data_for_root ();
631
case COMPUTER_NETWORK_LINK:
632
data = get_data_for_network ();
635
data = get_data_for_drive (file->drive);
637
case COMPUTER_VOLUME:
638
data = get_data_for_volume (file->volume);
644
file_handle = file_handle_new (data);
646
*method_handle = (GnomeVFSMethodHandle *) file_handle;
651
static GnomeVFSResult
652
do_create (GnomeVFSMethod *method,
653
GnomeVFSMethodHandle **method_handle,
655
GnomeVFSOpenMode mode,
658
GnomeVFSContext *context)
660
return GNOME_VFS_ERROR_NOT_PERMITTED;
663
static GnomeVFSResult
664
do_close (GnomeVFSMethod *method,
665
GnomeVFSMethodHandle *method_handle,
666
GnomeVFSContext *context)
668
FileHandle *file_handle;
670
g_return_val_if_fail (method_handle != NULL, GNOME_VFS_ERROR_INTERNAL);
672
file_handle = (FileHandle *) method_handle;
674
file_handle_destroy (file_handle);
679
static GnomeVFSResult
680
do_read (GnomeVFSMethod *method,
681
GnomeVFSMethodHandle *method_handle,
683
GnomeVFSFileSize num_bytes,
684
GnomeVFSFileSize *bytes_read,
685
GnomeVFSContext *context)
687
FileHandle *file_handle;
690
g_return_val_if_fail (method_handle != NULL, GNOME_VFS_ERROR_INTERNAL);
692
file_handle = (FileHandle *) method_handle;
695
if (file_handle->pos >= file_handle->len) {
696
return GNOME_VFS_ERROR_EOF;
699
read_len = MIN (num_bytes, file_handle->len - file_handle->pos);
701
memcpy (buffer, file_handle->data + file_handle->pos, read_len);
702
*bytes_read = read_len;
703
file_handle->pos += read_len;
709
static GnomeVFSResult
710
do_write (GnomeVFSMethod *method,
711
GnomeVFSMethodHandle *method_handle,
712
gconstpointer buffer,
713
GnomeVFSFileSize num_bytes,
714
GnomeVFSFileSize *bytes_written,
715
GnomeVFSContext *context)
717
return GNOME_VFS_ERROR_NOT_PERMITTED;
721
static GnomeVFSResult
722
do_seek (GnomeVFSMethod *method,
723
GnomeVFSMethodHandle *method_handle,
724
GnomeVFSSeekPosition whence,
725
GnomeVFSFileOffset offset,
726
GnomeVFSContext *context)
728
FileHandle *file_handle;
730
file_handle = (FileHandle *) method_handle;
733
case GNOME_VFS_SEEK_START:
734
file_handle->pos = offset;
736
case GNOME_VFS_SEEK_CURRENT:
737
file_handle->pos += offset;
739
case GNOME_VFS_SEEK_END:
740
file_handle->pos = file_handle->len + offset;
744
if (file_handle->pos < 0) {
745
file_handle->pos = 0;
748
if (file_handle->pos > file_handle->len) {
749
file_handle->pos = file_handle->len;
755
static GnomeVFSResult
756
do_tell (GnomeVFSMethod *method,
757
GnomeVFSMethodHandle *method_handle,
758
GnomeVFSFileOffset *offset_return)
760
FileHandle *file_handle;
762
file_handle = (FileHandle *) method_handle;
764
*offset_return = file_handle->pos;
769
static GnomeVFSResult
770
do_truncate_handle (GnomeVFSMethod *method,
771
GnomeVFSMethodHandle *method_handle,
772
GnomeVFSFileSize where,
773
GnomeVFSContext *context)
775
return GNOME_VFS_ERROR_NOT_PERMITTED;
778
static GnomeVFSResult
779
do_truncate (GnomeVFSMethod *method,
781
GnomeVFSFileSize where,
782
GnomeVFSContext *context)
784
return GNOME_VFS_ERROR_NOT_PERMITTED;
788
GnomeVFSFileInfoOptions options;
792
static DirectoryHandle *
793
directory_handle_new (GnomeVFSFileInfoOptions options)
795
DirectoryHandle *result;
797
result = g_new (DirectoryHandle, 1);
798
result->options = options;
799
result->entries = NULL;
805
directory_handle_destroy (DirectoryHandle *dir_handle)
807
g_list_foreach (dir_handle->entries, (GFunc)g_free, NULL);
808
g_list_free (dir_handle->entries);
812
static GnomeVFSResult
813
do_open_directory (GnomeVFSMethod *method,
814
GnomeVFSMethodHandle **method_handle,
816
GnomeVFSFileInfoOptions options,
817
GnomeVFSContext *context)
819
DirectoryHandle *dir_handle;
824
dir_handle = directory_handle_new (options);
829
for (l = dir->files; l != NULL; l = l->next) {
831
dir_handle->entries = g_list_prepend (dir_handle->entries,
832
g_strdup (file->file_name));
836
*method_handle = (GnomeVFSMethodHandle *) dir_handle;
841
static GnomeVFSResult
842
do_close_directory (GnomeVFSMethod *method,
843
GnomeVFSMethodHandle *method_handle,
844
GnomeVFSContext *context)
846
DirectoryHandle *dir_handle;
848
dir_handle = (DirectoryHandle *) method_handle;
850
directory_handle_destroy (dir_handle);
855
static GnomeVFSResult
856
do_read_directory (GnomeVFSMethod *method,
857
GnomeVFSMethodHandle *method_handle,
858
GnomeVFSFileInfo *file_info,
859
GnomeVFSContext *context)
861
DirectoryHandle *handle;
864
handle = (DirectoryHandle *) method_handle;
866
if (handle->entries == NULL) {
867
return GNOME_VFS_ERROR_EOF;
870
entry = handle->entries;
871
handle->entries = g_list_remove_link (handle->entries, entry);
873
file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_NONE;
874
file_info->name = g_strdup (entry->data);
875
g_free (entry->data);
876
g_list_free_1 (entry);
878
file_info->mime_type = g_strdup ("application/x-desktop");
879
file_info->type = GNOME_VFS_FILE_TYPE_REGULAR;
880
file_info->valid_fields |=
881
GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE |
882
GNOME_VFS_FILE_INFO_FIELDS_TYPE;
884
file_info->permissions =
885
GNOME_VFS_PERM_USER_READ |
886
GNOME_VFS_PERM_OTHER_READ |
887
GNOME_VFS_PERM_GROUP_READ;
888
file_info->valid_fields |= GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
893
static GnomeVFSResult
894
do_get_file_info (GnomeVFSMethod *method,
896
GnomeVFSFileInfo *file_info,
897
GnomeVFSFileInfoOptions options,
898
GnomeVFSContext *context)
900
file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_NONE;
902
if (strcmp (uri->text, "/") == 0) {
903
file_info->name = g_strdup ("/");
905
file_info->mime_type = g_strdup ("x-directory/normal");
906
file_info->type = GNOME_VFS_FILE_TYPE_DIRECTORY;
907
file_info->valid_fields |=
908
GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE |
909
GNOME_VFS_FILE_INFO_FIELDS_TYPE;
911
file_info->name = gnome_vfs_uri_extract_short_name (uri);
913
file_info->mime_type = g_strdup ("application/x-desktop");
914
file_info->type = GNOME_VFS_FILE_TYPE_REGULAR;
915
file_info->valid_fields |=
916
GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE |
917
GNOME_VFS_FILE_INFO_FIELDS_TYPE;
919
file_info->permissions =
920
GNOME_VFS_PERM_USER_READ |
921
GNOME_VFS_PERM_OTHER_READ |
922
GNOME_VFS_PERM_GROUP_READ;
923
file_info->valid_fields |= GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
928
static GnomeVFSResult
929
do_get_file_info_from_handle (GnomeVFSMethod *method,
930
GnomeVFSMethodHandle *method_handle,
931
GnomeVFSFileInfo *file_info,
932
GnomeVFSFileInfoOptions options,
933
GnomeVFSContext *context)
935
FileHandle *file_handle;
937
file_handle = (FileHandle *) method_handle;
939
file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_NONE;
941
file_info->mime_type = g_strdup ("application/x-desktop");
942
file_info->size = file_handle->len;
943
file_info->type = GNOME_VFS_FILE_TYPE_REGULAR;
944
file_info->valid_fields |=
945
GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE |
946
GNOME_VFS_FILE_INFO_FIELDS_SIZE |
947
GNOME_VFS_FILE_INFO_FIELDS_TYPE;
953
do_is_local (GnomeVFSMethod *method,
954
const GnomeVFSURI *uri)
960
static GnomeVFSResult
961
do_make_directory (GnomeVFSMethod *method,
964
GnomeVFSContext *context)
966
return GNOME_VFS_ERROR_NOT_PERMITTED;
969
static GnomeVFSResult
970
do_remove_directory (GnomeVFSMethod *method,
972
GnomeVFSContext *context)
974
return GNOME_VFS_ERROR_NOT_PERMITTED;
978
static GnomeVFSResult
979
do_find_directory (GnomeVFSMethod *method,
980
GnomeVFSURI *near_uri,
981
GnomeVFSFindDirectoryKind kind,
982
GnomeVFSURI **result_uri,
983
gboolean create_if_needed,
984
gboolean find_if_needed,
986
GnomeVFSContext *context)
988
return GNOME_VFS_ERROR_NOT_SUPPORTED;
991
static GnomeVFSResult
992
do_move (GnomeVFSMethod *method,
993
GnomeVFSURI *old_uri,
994
GnomeVFSURI *new_uri,
995
gboolean force_replace,
996
GnomeVFSContext *context)
998
return GNOME_VFS_ERROR_NOT_PERMITTED;
1001
static GnomeVFSResult
1002
do_unlink (GnomeVFSMethod *method,
1004
GnomeVFSContext *context)
1006
return GNOME_VFS_ERROR_NOT_PERMITTED;
1009
static GnomeVFSResult
1010
do_create_symbolic_link (GnomeVFSMethod *method,
1012
const char *target_reference,
1013
GnomeVFSContext *context)
1015
return GNOME_VFS_ERROR_NOT_PERMITTED;
1018
/* When checking whether two locations are on the same file system, we are
1019
doing this to determine whether we can recursively move or do other
1020
sorts of transfers. When a symbolic link is the "source", its
1021
location is the location of the link file, because we want to
1022
know about transferring the link, whereas for symbolic links that
1023
are "targets", we use the location of the object being pointed to,
1024
because that is where we will be moving/copying to. */
1025
static GnomeVFSResult
1026
do_check_same_fs (GnomeVFSMethod *method,
1027
GnomeVFSURI *source_uri,
1028
GnomeVFSURI *target_uri,
1029
gboolean *same_fs_return,
1030
GnomeVFSContext *context)
1035
static GnomeVFSResult
1036
do_set_file_info (GnomeVFSMethod *method,
1038
const GnomeVFSFileInfo *info,
1039
GnomeVFSSetFileInfoMask mask,
1040
GnomeVFSContext *context)
1042
return GNOME_VFS_ERROR_NOT_PERMITTED;
1045
static GnomeVFSResult
1046
do_monitor_add (GnomeVFSMethod *method,
1047
GnomeVFSMethodHandle **method_handle_return,
1049
GnomeVFSMonitorType monitor_type)
1052
ComputerMonitor *monitor;
1055
if (strcmp (uri->text, "/") == 0) {
1058
monitor = g_new0 (ComputerMonitor, 1);
1059
monitor->type = GNOME_VFS_MONITOR_DIRECTORY;
1062
dir->dir_monitors = g_list_prepend (dir->dir_monitors, monitor);
1063
G_UNLOCK (root_dir);
1065
if (monitor_type != GNOME_VFS_MONITOR_FILE) {
1066
return GNOME_VFS_ERROR_NOT_SUPPORTED;
1071
monitor = g_new0 (ComputerMonitor, 1);
1072
monitor->type = GNOME_VFS_MONITOR_FILE;
1075
name = gnome_vfs_uri_extract_short_name (uri);
1076
monitor->file = get_file (dir, name);
1079
if (monitor->file != NULL) {
1080
monitor->file->file_monitors = g_list_prepend (monitor->file->file_monitors,
1083
G_UNLOCK (root_dir);
1087
*method_handle_return = (GnomeVFSMethodHandle *)monitor;
1089
return GNOME_VFS_OK;
1092
static GnomeVFSResult
1093
do_monitor_cancel (GnomeVFSMethod *method,
1094
GnomeVFSMethodHandle *method_handle)
1097
ComputerMonitor *monitor;
1103
monitor = (ComputerMonitor *) method_handle;
1104
if (monitor->type == GNOME_VFS_MONITOR_DIRECTORY) {
1105
dir->dir_monitors = g_list_remove (dir->dir_monitors, monitor);
1107
file = monitor->file;
1109
file->file_monitors = g_list_remove (file->file_monitors,
1113
G_UNLOCK (root_dir);
1117
return GNOME_VFS_OK;
1120
static GnomeVFSResult
1121
do_file_control (GnomeVFSMethod *method,
1122
GnomeVFSMethodHandle *method_handle,
1123
const char *operation,
1124
gpointer operation_data,
1125
GnomeVFSContext *context)
1127
return GNOME_VFS_ERROR_NOT_SUPPORTED;
1130
static GnomeVFSMethod method = {
1131
sizeof (GnomeVFSMethod),
1144
do_get_file_info_from_handle,
1147
do_remove_directory,
1154
do_create_symbolic_link,
1161
vfs_module_init (const char *method_name, const char *args)
1167
vfs_module_shutdown (GnomeVFSMethod *method)