static void infinoted_directory_sync_remove_session(InfinotedDirectorySync* dsync, InfinotedDirectorySyncSession* sess) { InfTextBuffer* buffer; if(sess->timeout != NULL) { infinoted_directory_sync_session_save(dsync, sess); infinoted_directory_sync_session_stop(dsync, sess); } buffer = INF_TEXT_BUFFER( inf_session_get_buffer(infd_session_proxy_get_session(sess->proxy)) ); inf_signal_handlers_disconnect_by_func( G_OBJECT(buffer), G_CALLBACK(infinoted_directory_sync_buffer_text_inserted_cb), sess ); inf_signal_handlers_disconnect_by_func( G_OBJECT(buffer), G_CALLBACK(infinoted_directory_sync_buffer_text_erased_cb), sess ); dsync->sessions = g_slist_remove(dsync->sessions, sess); g_free(sess->path); g_slice_free(InfinotedDirectorySyncSession, sess); }
static void infinoted_autosave_add_session(InfinotedAutosave* autosave, InfdDirectoryIter* iter) { InfinotedAutosaveSession* session; InfdSessionProxy* proxy; InfBuffer* buffer; g_assert(infinoted_autosave_find_session(autosave, iter) == NULL); session = g_slice_new(InfinotedAutosaveSession); session->autosave = autosave; session->iter = *iter; proxy = infd_directory_iter_peek_session(autosave->directory, iter); g_assert(proxy != NULL); session->proxy = proxy; session->timeout_handle = NULL; autosave->sessions = g_slist_prepend(autosave->sessions, session); buffer = inf_session_get_buffer(infd_session_proxy_get_session(proxy)); g_signal_connect( G_OBJECT(buffer), "notify::modified", G_CALLBACK(infinoted_autosave_buffer_notify_modified_cb), session ); if(inf_buffer_get_modified(buffer) == TRUE) { infinoted_autosave_session_start(autosave, session); } }
static void infinoted_directory_sync_directory_remove_session_cb(InfdDirectory* directory, InfdDirectoryIter* iter, InfdSessionProxy* proxy, gpointer user_data) { InfinotedDirectorySync* dsync; InfinotedDirectorySyncSession* session; /* Ignore if this is not a text session */ if(INF_TEXT_IS_SESSION(infd_session_proxy_get_session(proxy))) { dsync = (InfinotedDirectorySync*)user_data; session = infinoted_directory_sync_find_session(dsync, iter); g_assert(session != NULL && session->proxy == proxy); infinoted_directory_sync_remove_session(dsync, session); } }
static void infinoted_autosave_buffer_notify_modified_cb(GObject* object, GParamSpec* pspec, gpointer user_data) { InfinotedAutosaveSession* session; InfBuffer* buffer; session = (InfinotedAutosaveSession*)user_data; buffer = inf_session_get_buffer( infd_session_proxy_get_session(session->proxy) ); if(inf_buffer_get_modified(buffer) == TRUE) { if(session->timeout_handle == NULL) infinoted_autosave_session_start(session->autosave, session); } else { if(session->timeout_handle != NULL) infinoted_autosave_session_stop(session->autosave, session); } }
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_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_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 ); }