static void infinoted_directory_sync_directory_add_session_cb(InfdDirectory* directory, InfdDirectoryIter* iter, InfdSessionProxy* proxy, gpointer user_data) { InfinotedDirectorySync* dsync; GError* error; gchar* path; dsync = (InfinotedDirectorySync*)user_data; error = NULL; if(!infinoted_directory_sync_add_session(dsync, iter, &error)) { path = infd_directory_iter_get_path(directory, iter); infinoted_util_log_warning( _("Failed to synchronize session \"%s\" to disk: %s"), path, error->message ); g_free(path); g_error_free(error); } }
static void infinoted_directory_sync_walk_directory(InfinotedDirectorySync* dsync, InfdDirectoryIter* iter) { InfdDirectoryIter child; InfdSessionProxy* session; GError* error; gchar* path; if(infd_directory_iter_get_node_type(dsync->directory, iter) == INFD_STORAGE_NODE_SUBDIRECTORY) { if(infd_directory_iter_get_explored(dsync->directory, iter) == TRUE) { /* Errors can't happen as the directory is already explored */ child = *iter; if(infd_directory_iter_get_child(dsync->directory, &child, NULL)) { do { infinoted_directory_sync_walk_directory(dsync, &child); } while(infd_directory_iter_get_next(dsync->directory, &child)); } } } else { session = infd_directory_iter_peek_session(dsync->directory, iter); if(session != NULL) { error = NULL; if(!infinoted_directory_sync_add_session(dsync, iter, &error)) { path = infd_directory_iter_get_path(dsync->directory, iter); infinoted_util_log_warning( _("Failed to synchronize session \"%s\" to disk: %s"), path, error->message ); g_free(path); g_error_free(error); } } } }
static gboolean infinoted_directory_sync_add_session(InfinotedDirectorySync* dsync, InfdDirectoryIter* iter, GError** error) { InfinotedDirectorySyncSession* session; InfdSessionProxy* proxy; InfBuffer* buffer; gchar* iter_path; #ifdef G_OS_WIN32 gchar* pos; #endif gchar* full_path; gchar* converted; g_assert(infinoted_directory_sync_find_session(dsync, iter) == NULL); proxy = infd_directory_iter_peek_session(dsync->directory, iter); g_assert(proxy != NULL); /* Ignore if this is not a text session */ if(!INF_TEXT_IS_SESSION(infd_session_proxy_get_session(proxy))) return TRUE; iter_path = infd_directory_iter_get_path(dsync->directory, iter); #ifdef G_OS_WIN32 for(pos = iter_path; *pos != '\0'; ++pos) { if(*pos == '\\') { g_set_error( error, infinoted_directory_sync_error_quark(), INFINOTED_DIRECTORY_SYNC_ERROR_INVALID_PATH, _("Node \"%s\" contains invalid characters"), iter_path ); g_free(iter_path); return FALSE; } else if(*pos == '/') { *pos = '\\'; } } #endif full_path = g_build_filename(dsync->sync_directory, iter_path+1, NULL); g_free(iter_path); converted = g_filename_from_utf8(full_path, -1, NULL, NULL, error); g_free(full_path); if(!converted) return FALSE; session = g_slice_new(InfinotedDirectorySyncSession); session->dsync = dsync; session->iter = *iter; session->proxy = proxy; session->timeout = NULL; session->path = converted; dsync->sessions = g_slist_prepend(dsync->sessions, session); buffer = inf_session_get_buffer(infd_session_proxy_get_session(proxy)); g_signal_connect( G_OBJECT(buffer), "text-inserted", G_CALLBACK(infinoted_directory_sync_buffer_text_inserted_cb), session ); g_signal_connect( G_OBJECT(buffer), "text-erased", G_CALLBACK(infinoted_directory_sync_buffer_text_erased_cb), session ); infinoted_directory_sync_session_save(dsync, session); return TRUE; }
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 ); }