diff options
author | Bastien Nocera <hadess@hadess.net> | 2010-11-12 19:42:41 +0000 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2010-12-17 11:36:32 +0000 |
commit | 073715e62f7618a78f1ca07663cd734bbd545fa6 (patch) | |
tree | fd529e7f28092880dc738ab2f5a83e32f4753d22 /monitor/afc | |
parent | 61bf3e52be2b646f27ba5b129a8239549e1afcf1 (diff) | |
download | gvfs-073715e62f7618a78f1ca07663cd734bbd545fa6.tar.gz |
AFC: Add ability to mount the house-arrest service
https://bugzilla.gnome.org/show_bug.cgi?id=636133
Diffstat (limited to 'monitor/afc')
-rw-r--r-- | monitor/afc/afcvolume.c | 47 | ||||
-rw-r--r-- | monitor/afc/afcvolume.h | 5 | ||||
-rw-r--r-- | monitor/afc/afcvolumemonitor.c | 14 | ||||
-rw-r--r-- | monitor/afc/afcvolumemonitordaemon.c | 9 |
4 files changed, 65 insertions, 10 deletions
diff --git a/monitor/afc/afcvolume.c b/monitor/afc/afcvolume.c index 0784716a..3669b27c 100644 --- a/monitor/afc/afcvolume.c +++ b/monitor/afc/afcvolume.c @@ -8,6 +8,7 @@ #include <string.h> #include <glib.h> #include <gio/gio.h> +#include <glib/gi18n.h> #include <libimobiledevice/libimobiledevice.h> #include <libimobiledevice/lockdown.h> @@ -20,6 +21,7 @@ struct _GVfsAfcVolume { GVolumeMonitor *monitor; char *uuid; + char *service; char *name; char *icon; @@ -39,6 +41,7 @@ g_vfs_afc_volume_finalize (GObject *object) self = G_VFS_AFC_VOLUME(object); g_free (self->uuid); + g_free (self->service); g_free (self->name); g_free (self->icon); @@ -86,17 +89,43 @@ _g_vfs_afc_volume_update_metadata (GVfsAfcVolume *self) if (err != IDEVICE_E_SUCCESS) return 0; - if (lockdownd_client_new (dev, &lockdown_cli, "gvfs-afc-volume-monitor") != LOCKDOWN_E_SUCCESS) + if (self->service != NULL) { - idevice_free (dev); - return 0; + guint16 port; + + if (lockdownd_client_new_with_handshake (dev, &lockdown_cli, "gvfs-afc-volume-monitor") != LOCKDOWN_E_SUCCESS) + { + idevice_free (dev); + return 0; + } + if (lockdownd_start_service(lockdown_cli, "com.apple.mobile.house_arrest", &port) != LOCKDOWN_E_SUCCESS) + { + idevice_free (dev); + return 0; + } + } + else + { + if (lockdownd_client_new (dev, &lockdown_cli, "gvfs-afc-volume-monitor") != LOCKDOWN_E_SUCCESS) + { + idevice_free (dev); + return 0; + } } /* try to use pretty device name */ if (lockdownd_get_device_name (lockdown_cli, &display_name) == LOCKDOWN_E_SUCCESS) { g_free (self->name); - self->name = display_name; + if (g_strcmp0 (self->service, HOUSE_ARREST_SERVICE_PORT) == 0) + { + /* translators: + * This is "Documents on foo" where foo is the device name, eg.: + * Documents on Alan Smithee's iPhone */ + self->name = g_strdup_printf (_("Documents on %s"), display_name); + } + else + self->name = display_name; } value = NULL; @@ -127,7 +156,8 @@ _g_vfs_afc_volume_update_metadata (GVfsAfcVolume *self) GVfsAfcVolume * g_vfs_afc_volume_new (GVolumeMonitor *monitor, - const char *uuid) + const char *uuid, + const char *service) { GVfsAfcVolume *self; GFile *root; @@ -136,8 +166,13 @@ g_vfs_afc_volume_new (GVolumeMonitor *monitor, self = G_VFS_AFC_VOLUME(g_object_new (G_VFS_TYPE_AFC_VOLUME, NULL)); self->monitor = monitor; self->uuid = g_strdup (uuid); + self->service = g_strdup (service); + + if (service == NULL) + uri = g_strdup_printf ("afc://%s", self->uuid); + else + uri = g_strdup_printf ("afc://%s:%s", self->uuid, service); - uri = g_strdup_printf ("afc://%s", self->uuid); root = g_file_new_for_uri (uri); g_free (uri); diff --git a/monitor/afc/afcvolume.h b/monitor/afc/afcvolume.h index de24cd54..ba0aa3b2 100644 --- a/monitor/afc/afcvolume.h +++ b/monitor/afc/afcvolume.h @@ -21,6 +21,8 @@ G_BEGIN_DECLS #define G_VFS_IS_AFC_VOLUME_CLASS(k) ((G_TYPE_CHECK_CLASS_TYPE((k), G_VFS_TYPE_AFC_VOLUME)) #define G_VFS_AFC_VOLUME_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), G_VFS_TYPE_AFC_VOLUME, GVfsAfcVolumeClass)) +#define HOUSE_ARREST_SERVICE_PORT "3" + typedef struct _GVfsAfcVolume GVfsAfcVolume; typedef struct _GVfsAfcVolumeClass GVfsAfcVolumeClass; @@ -31,7 +33,8 @@ struct _GVfsAfcVolumeClass { GType g_vfs_afc_volume_get_type (void) G_GNUC_CONST; GVfsAfcVolume *g_vfs_afc_volume_new (GVolumeMonitor *monitor, - const char *uuid); + const char *uuid, + const char *service); gboolean g_vfs_afc_volume_has_uuid (GVfsAfcVolume *volume, const char *uuid); diff --git a/monitor/afc/afcvolumemonitor.c b/monitor/afc/afcvolumemonitor.c index d10e862b..dfc3fa55 100644 --- a/monitor/afc/afcvolumemonitor.c +++ b/monitor/afc/afcvolumemonitor.c @@ -29,7 +29,15 @@ g_vfs_afc_monitor_create_volume (GVfsAfcVolumeMonitor *self, g_print ("creating volume for device uuid '%s'\n", uuid); - volume = g_vfs_afc_volume_new (G_VOLUME_MONITOR (self), uuid); + volume = g_vfs_afc_volume_new (G_VOLUME_MONITOR (self), uuid, NULL); + if (volume != NULL) + { + self->volumes = g_list_prepend (self->volumes, volume); + g_signal_emit_by_name (self, "volume-added", volume); + } + + /* The house arrest service */ + volume = g_vfs_afc_volume_new (G_VOLUME_MONITOR (self), uuid, HOUSE_ARREST_SERVICE_PORT); if (volume != NULL) { self->volumes = g_list_prepend (self->volumes, volume); @@ -60,12 +68,14 @@ g_vfs_afc_monitor_remove_volume (GVfsAfcVolumeMonitor *self, GVfsAfcVolume *volume = NULL; volume = find_volume_by_uuid (self, uuid); - if (volume != NULL) + while (volume != NULL) { g_print ("removing volume for device uuid '%s'\n", uuid); self->volumes = g_list_remove (self->volumes, volume); g_signal_emit_by_name (self, "volume-removed", volume); g_object_unref (volume); + + volume = find_volume_by_uuid (self, uuid); } } diff --git a/monitor/afc/afcvolumemonitordaemon.c b/monitor/afc/afcvolumemonitordaemon.c index 9c24a34c..474a6088 100644 --- a/monitor/afc/afcvolumemonitordaemon.c +++ b/monitor/afc/afcvolumemonitordaemon.c @@ -8,9 +8,10 @@ #include <config.h> #include <glib.h> -#include <glib/gi18n-lib.h> +#include <glib/gi18n.h> #include <gmodule.h> #include <gio/gio.h> +#include <locale.h> #include <gvfsproxyvolumemonitordaemon.h> @@ -19,6 +20,12 @@ int main (int argc, char *argv[]) { + setlocale (LC_ALL, ""); + + bindtextdomain (GETTEXT_PACKAGE, GVFS_LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + g_vfs_proxy_volume_monitor_daemon_init (); return g_vfs_proxy_volume_monitor_daemon_main (argc, argv, |