static void inf_adopted_session_schedule_noop_timer(InfAdoptedSession* session) { InfAdoptedSessionPrivate* priv; time_t current; time_t sched; priv = INF_ADOPTED_SESSION_PRIVATE(session); if(priv->noop_timeout != NULL) { inf_io_remove_timeout(priv->io, priv->noop_timeout); priv->noop_timeout = NULL; } if(priv->next_noop_user != NULL) { current = time(NULL); sched = priv->next_noop_user->noop_time + INF_ADOPTED_SESSION_NOOP_INTERVAL; if(sched >= current) sched -= current; else sched = 0; priv->noop_timeout = inf_io_add_timeout( priv->io, sched * 1000, inf_adopted_session_noop_timeout_func, session, NULL ); } }
static void inf_adopted_session_dispose(GObject* object) { InfAdoptedSession* session; InfAdoptedSessionPrivate* priv; InfUserTable* user_table; session = INF_ADOPTED_SESSION(object); priv = INF_ADOPTED_SESSION_PRIVATE(session); user_table = inf_session_get_user_table(INF_SESSION(session)); inf_signal_handlers_disconnect_by_func( G_OBJECT(user_table), G_CALLBACK(inf_adopted_session_add_local_user_cb), session ); inf_signal_handlers_disconnect_by_func( G_OBJECT(user_table), G_CALLBACK(inf_adopted_session_remove_local_user_cb), session ); if(priv->noop_timeout != NULL) { inf_io_remove_timeout(priv->io, priv->noop_timeout); priv->noop_timeout = NULL; } /* This calls the close vfunc if the session is running, in which we * free the local users. */ G_OBJECT_CLASS(parent_class)->dispose(object); g_assert(priv->local_users == NULL); if(priv->algorithm != NULL) { inf_signal_handlers_disconnect_by_func( G_OBJECT(priv->algorithm), G_CALLBACK(inf_adopted_session_execute_request_cb), session ); g_object_unref(G_OBJECT(priv->algorithm)); priv->algorithm = NULL; } if(priv->io != NULL) { g_object_unref(G_OBJECT(priv->io)); priv->io = NULL; } }
static void infinoted_directory_sync_session_stop(InfinotedDirectorySync* dsync, InfinotedDirectorySyncSession* session) { InfIo* io; io = infd_directory_get_io(dsync->directory); g_assert(session->timeout != NULL); inf_io_remove_timeout(io, session->timeout); session->timeout = NULL; }
static void infinoted_autosave_session_stop(InfinotedAutosave* autosave, InfinotedAutosaveSession* session) { InfIo* io; io = infd_directory_get_io(autosave->directory); g_assert(session->timeout_handle != NULL); inf_io_remove_timeout(io, session->timeout_handle); session->timeout_handle = NULL; }
static void infinoted_plugin_autosave_stop(InfinotedPluginAutosaveSessionInfo* info) { InfIo* io; io = infd_directory_get_io( infinoted_plugin_manager_get_directory(info->plugin->manager) ); g_assert(info->timeout != NULL); inf_io_remove_timeout(io, info->timeout); info->timeout = NULL; }
static void infinoted_directory_sync_session_save(InfinotedDirectorySync* dsync, InfinotedDirectorySyncSession* session) { InfdDirectoryIter* iter; GError* error; InfBuffer* buffer; InfTextChunk* chunk; gchar* content; gsize bytes; iter = &session->iter; error = NULL; if(session->timeout != NULL) { inf_io_remove_timeout( infd_directory_get_io(dsync->directory), session->timeout ); session->timeout = NULL; } buffer = inf_session_get_buffer( infd_session_proxy_get_session(session->proxy) ); error = NULL; if(!infinoted_util_create_dirname(session->path, &error)) { g_warning(_("Failed to create directory for path \"%s\": %s\n\n"), session->path, error->message); g_error_free(error); } else { /* TODO: Use the iterator API here, which should be less expensive */ chunk = inf_text_buffer_get_slice( INF_TEXT_BUFFER(buffer), 0, inf_text_buffer_get_length(INF_TEXT_BUFFER(buffer)) ); content = inf_text_chunk_get_text(chunk, &bytes); inf_text_chunk_free(chunk); if(!g_file_set_contents(session->path, content, bytes, &error)) { g_warning( _("Failed to write session for path \"%s\": %s\n\n" "Will retry in %u seconds."), session->path, error->message, dsync->sync_interval ); g_error_free(error); infinoted_directory_sync_session_start(session->dsync, session); } g_free(content); } }
static void infinoted_plugin_autosave_save(InfinotedPluginAutosaveSessionInfo* info) { InfdDirectory* directory; InfBrowserIter* iter; GError* error; gchar* path; InfSession* session; InfBuffer* buffer; gchar* root_directory; gchar* argv[4]; directory = infinoted_plugin_manager_get_directory(info->plugin->manager); iter = &info->iter; error = NULL; if(info->timeout != NULL) { inf_io_remove_timeout(infd_directory_get_io(directory), info->timeout); info->timeout = NULL; } g_object_get(G_OBJECT(info->proxy), "session", &session, NULL); buffer = inf_session_get_buffer(session); inf_signal_handlers_block_by_func( G_OBJECT(buffer), G_CALLBACK(infinoted_plugin_autosave_buffer_notify_modified_cb), info ); if(infd_directory_iter_save_session(directory, iter, &error) == FALSE) { path = inf_browser_get_path(INF_BROWSER(directory), iter); infinoted_log_warning( infinoted_plugin_manager_get_log(info->plugin->manager), _("Failed to auto-save session \"%s\": %s\n\n" "Will retry in %u seconds."), path, error->message, info->plugin->interval ); g_free(path); g_error_free(error); error = NULL; infinoted_plugin_autosave_start(info); } else { /* TODO: Remove this as soon as directory itself unsets modified flag * on session_write */ inf_buffer_set_modified(INF_BUFFER(buffer), FALSE); if(info->plugin->hook != NULL) { path = inf_browser_get_path(INF_BROWSER(directory), iter); g_object_get( G_OBJECT(infd_directory_get_storage(directory)), "root-directory", &root_directory, NULL ); argv[0] = info->plugin->hook; argv[1] = root_directory; argv[2] = path; argv[3] = NULL; if(!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error)) { infinoted_log_warning( infinoted_plugin_manager_get_log(info->plugin->manager), _("Could not execute autosave hook: \"%s\""), error->message ); g_error_free(error); error = NULL; } g_free(path); g_free(root_directory); } } inf_signal_handlers_unblock_by_func( G_OBJECT(buffer), G_CALLBACK(infinoted_plugin_autosave_buffer_notify_modified_cb), info ); g_object_unref(session); }
static void infinoted_autosave_session_save(InfinotedAutosave* autosave, InfinotedAutosaveSession* session) { InfdDirectory* directory; InfdDirectoryIter* iter; GError* error; gchar* path; InfBuffer* buffer; directory = autosave->directory; iter = &session->iter; error = NULL; if(session->timeout_handle != NULL) { inf_io_remove_timeout( infd_directory_get_io(directory), session->timeout_handle ); session->timeout_handle = NULL; } buffer = inf_session_get_buffer( infd_session_proxy_get_session(session->proxy) ); g_signal_handlers_block_by_func( G_OBJECT(buffer), G_CALLBACK(infinoted_autosave_buffer_notify_modified_cb), session ); if(infd_directory_iter_save_session(directory, iter, &error) == FALSE) { path = infd_directory_iter_get_path(directory, iter); g_warning( _("Failed to auto-save session \"%s\": %s\n\n" "Will retry in %u seconds."), path, error->message, session->autosave->autosave_interval ); g_free(path); g_error_free(error); infinoted_autosave_session_start(session->autosave, session); } else { /* TODO: Remove this as soon as directory itself unsets modified flag * on session_write */ inf_buffer_set_modified(INF_BUFFER(buffer), FALSE); } g_signal_handlers_unblock_by_func( G_OBJECT(buffer), G_CALLBACK(infinoted_autosave_buffer_notify_modified_cb), session ); }