diff options
author | Hans de Goede <hdegoede@redhat.com> | 2013-04-05 15:08:44 +0200 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2013-04-09 11:54:25 +0200 |
commit | 71cf03fdcc82335c355be766c8765cf2a15e3e68 (patch) | |
tree | feccfc168c88822a78c588a9c9aa9944f31dfb49 /src | |
parent | 9ac104389bd8002c269e738e178498f3c1110d30 (diff) | |
download | vd_agent-71cf03fdcc82335c355be766c8765cf2a15e3e68.tar.gz vd_agent-71cf03fdcc82335c355be766c8765cf2a15e3e68.tar.xz vd_agent-71cf03fdcc82335c355be766c8765cf2a15e3e68.zip |
vdagent: Open file xfer save dir on file xfer completion
When not saving to the Desktop we need a way for the user to discover where
we've saved the file. This patch makes the session agent call xdg-open on
the file xfer save dir when a file xfer has completed in this case.
This is configurable from the cmdline by passing "-o 0" or "-o 1"
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/vdagent-file-xfers.c | 18 | ||||
-rw-r--r-- | src/vdagent-file-xfers.h | 3 | ||||
-rw-r--r-- | src/vdagent.c | 17 |
3 files changed, 32 insertions, 6 deletions
diff --git a/src/vdagent-file-xfers.c b/src/vdagent-file-xfers.c index 1396e0a..8242a27 100644 --- a/src/vdagent-file-xfers.c +++ b/src/vdagent-file-xfers.c @@ -43,6 +43,7 @@ struct vdagent_file_xfers { GHashTable *xfers; struct udscs_connection *vdagentd; char *save_dir; + int open_save_dir; int debug; }; @@ -52,6 +53,8 @@ typedef struct AgentFileXferTask { uint64_t read_bytes; char *file_name; uint64_t file_size; + int file_xfer_nr; + int file_xfer_total; int debug; } AgentFileXferTask; @@ -75,7 +78,8 @@ static void vdagent_file_xfer_task_free(gpointer data) } struct vdagent_file_xfers *vdagent_file_xfers_create( - struct udscs_connection *vdagentd, const char *save_dir, int debug) + struct udscs_connection *vdagentd, const char *save_dir, + int open_save_dir, int debug) { struct vdagent_file_xfers *xfers; @@ -84,6 +88,7 @@ struct vdagent_file_xfers *vdagent_file_xfers_create( NULL, vdagent_file_xfer_task_free); xfers->vdagentd = vdagentd; xfers->save_dir = g_strdup(save_dir); + xfers->open_save_dir = open_save_dir; xfers->debug = debug; return xfers; @@ -141,6 +146,11 @@ static AgentFileXferTask *vdagent_parse_start_msg( error->message); goto error; } + /* These are set for xfers which are part of a multi-file xfer */ + task->file_xfer_nr = g_key_file_get_integer( + keyfile, "vdagent-file-xfer", "file-xfer-nr", NULL); + task->file_xfer_total = g_key_file_get_integer( + keyfile, "vdagent-file-xfer", "file-xfer-total", NULL); g_key_file_free(keyfile); return task; @@ -270,6 +280,12 @@ void vdagent_file_xfers_data(struct vdagent_file_xfers *xfers, task->id, task->file_name); close(task->file_fd); task->file_fd = -1; + if (xfers->open_save_dir && + task->file_xfer_nr == task->file_xfer_total) { + char buf[PATH_MAX]; + snprintf(buf, PATH_MAX, "xdg-open '%s'&", xfers->save_dir); + status = system(buf); + } status = VD_AGENT_FILE_XFER_STATUS_SUCCESS; } else { syslog(LOG_ERR, "file-xfer: error received too much data"); diff --git a/src/vdagent-file-xfers.h b/src/vdagent-file-xfers.h index 81b7592..20783eb 100644 --- a/src/vdagent-file-xfers.h +++ b/src/vdagent-file-xfers.h @@ -27,7 +27,8 @@ struct vdagent_file_xfers; struct vdagent_file_xfers *vdagent_file_xfers_create( - struct udscs_connection *vdagentd, const char *save_dir, int debug); + struct udscs_connection *vdagentd, const char *save_dir, + int open_save_dir, int debug); void vdagent_file_xfers_destroy(struct vdagent_file_xfers *xfer); void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers, diff --git a/src/vdagent.c b/src/vdagent.c index d2ba23e..aca500e 100644 --- a/src/vdagent.c +++ b/src/vdagent.c @@ -45,6 +45,7 @@ static const char *portdev = "/dev/virtio-ports/com.redhat.spice.0"; static int debug = 0; static const char *fx_dir = NULL; +static int fx_open_dir = -1; static struct vdagent_x11 *x11 = NULL; static struct vdagent_file_xfers *vdagent_file_xfers = NULL; static struct udscs_connection *client = NULL; @@ -103,7 +104,8 @@ void daemon_read_complete(struct udscs_connection **connp, break; case VDAGENTD_CLIENT_DISCONNECTED: vdagent_file_xfers_destroy(vdagent_file_xfers); - vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir, debug); + vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir, + fx_open_dir, debug); break; default: syslog(LOG_ERR, "Unknown message from vdagentd type: %d, ignoring", @@ -135,7 +137,8 @@ static void usage(FILE *fp) " -d log debug messages\n" " -s <port> set virtio serial port [%s]\n" " -x don't daemonize\n" - " -f <dir|xdg-desktop|xdg-download> file xfer save dir\n", + " -f <dir|xdg-desktop|xdg-download> file xfer save dir\n" + " -o <0:1> open dir on file xfer completion\n", portdev); } @@ -179,7 +182,7 @@ int main(int argc, char *argv[]) struct sigaction act; for (;;) { - if (-1 == (c = getopt(argc, argv, "-dxhys:f:"))) + if (-1 == (c = getopt(argc, argv, "-dxhys:f:o:"))) break; switch (c) { case 'd': @@ -200,6 +203,9 @@ int main(int argc, char *argv[]) case 'f': fx_dir = optarg; break; + case 'o': + fx_open_dir = atoi(optarg); + break; default: usage(stderr); return 1; @@ -249,6 +255,8 @@ reconnect: else fx_dir = "xdg-download"; } + if (fx_open_dir == -1) + fx_open_dir = !vdagent_x11_has_icons_on_desktop(x11); if (!strcmp(fx_dir, "xdg-desktop")) fx_dir = g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP); else if (!strcmp(fx_dir, "xdg-download")) @@ -258,7 +266,8 @@ reconnect: "warning could not get file xfer save dir, using cwd"); fx_dir = "."; } - vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir, debug); + vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir, + fx_open_dir, debug); while (client && !quit) { FD_ZERO(&readfds); |