/* * Copyright 2008 Evenflow, Inc. * * dropbox-client.c * Implements connection handling and C interface for interfacing with the Dropbox daemon. * * This file is part of caja-dropbox. * * caja-dropbox is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * caja-dropbox is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with caja-dropbox. If not, see . * */ #include #include "g-util.h" #include "dropbox-command-client.h" #include "caja-dropbox-hooks.h" #include "dropbox-client.h" static void hook_on_connect(DropboxClient *dc) { dc->hook_connect_called = TRUE; if (dc->command_connect_called) { debug("client connection"); g_hook_list_invoke(&(dc->onconnect_hooklist), FALSE); /* reset flags */ dc->hook_connect_called = dc->command_connect_called = FALSE; } } static void command_on_connect(DropboxClient *dc) { dc->command_connect_called = TRUE; if (dc->hook_connect_called) { debug("client connection"); g_hook_list_invoke(&(dc->onconnect_hooklist), FALSE); /* reset flags */ dc->hook_connect_called = dc->command_connect_called = FALSE; } } static void command_on_disconnect(DropboxClient *dc) { dc->command_disconnect_called = TRUE; if (dc->hook_disconnect_called) { debug("client disconnect"); g_hook_list_invoke(&(dc->ondisconnect_hooklist), FALSE); /* reset flags */ dc->hook_disconnect_called = dc->command_disconnect_called = FALSE; } else { caja_dropbox_hooks_force_reconnect(&(dc->hookserv)); } } static void hook_on_disconnect(DropboxClient *dc) { dc->hook_disconnect_called = TRUE; if (dc->command_disconnect_called) { debug("client disconnect"); g_hook_list_invoke(&(dc->ondisconnect_hooklist), FALSE); /* reset flags */ dc->hook_disconnect_called = dc->command_disconnect_called = FALSE; } else { dropbox_command_client_force_reconnect(&(dc->dcc)); } } gboolean dropbox_client_is_connected(DropboxClient *dc) { return (dropbox_command_client_is_connected(&(dc->dcc)) && caja_dropbox_hooks_is_connected(&(dc->hookserv))); } void dropbox_client_force_reconnect(DropboxClient *dc) { if (dropbox_client_is_connected(dc) == TRUE) { debug("forcing client to reconnect"); dropbox_command_client_force_reconnect(&(dc->dcc)); caja_dropbox_hooks_force_reconnect(&(dc->hookserv)); } } /* should only be called once on initialization */ void dropbox_client_setup(DropboxClient *dc) { caja_dropbox_hooks_setup(&(dc->hookserv)); dropbox_command_client_setup(&(dc->dcc)); g_hook_list_init(&(dc->ondisconnect_hooklist), sizeof(GHook)); g_hook_list_init(&(dc->onconnect_hooklist), sizeof(GHook)); dc->hook_disconnect_called = dc->command_disconnect_called = FALSE; dc->hook_connect_called = dc->command_connect_called = FALSE; caja_dropbox_hooks_add_on_connect_hook(&(dc->hookserv), (DropboxHookClientConnectHook) hook_on_connect, dc); dropbox_command_client_add_on_connect_hook(&(dc->dcc), (DropboxCommandClientConnectHook) command_on_connect, dc); caja_dropbox_hooks_add_on_disconnect_hook(&(dc->hookserv), (DropboxHookClientConnectHook) hook_on_disconnect, dc); dropbox_command_client_add_on_disconnect_hook(&(dc->dcc), (DropboxCommandClientConnectHook) command_on_disconnect, dc); } /* not thread safe */ void dropbox_client_add_on_disconnect_hook(DropboxClient *dc, DropboxClientConnectHook dhcch, gpointer ud) { GHook *newhook; newhook = g_hook_alloc(&(dc->ondisconnect_hooklist)); newhook->func = dhcch; newhook->data = ud; g_hook_append(&(dc->ondisconnect_hooklist), newhook); } /* not thread safe */ void dropbox_client_add_on_connect_hook(DropboxClient *dc, DropboxClientConnectHook dhcch, gpointer ud) { GHook *newhook; newhook = g_hook_alloc(&(dc->onconnect_hooklist)); newhook->func = dhcch; newhook->data = ud; g_hook_append(&(dc->onconnect_hooklist), newhook); } /* not thread safe */ void dropbox_client_add_connection_attempt_hook(DropboxClient *dc, DropboxClientConnectionAttemptHook dhcch, gpointer ud) { debug("shouldn't be here..."); dropbox_command_client_add_connection_attempt_hook(&(dc->dcc), dhcch, ud); } /* should only be called once on initialization */ void dropbox_client_start(DropboxClient *dc) { debug("starting connections"); caja_dropbox_hooks_start(&(dc->hookserv)); dropbox_command_client_start(&(dc->dcc)); }