static void infinoted_plugin_document_stream_text_inserted_cb(InfTextBuffer* buffer, guint pos, InfTextChunk* chunk, InfUser* user, gpointer user_data) { InfinotedPluginDocumentStreamStream* stream; guint32 comm; guint32 pos32; gsize bytes; guint32 bytes32; gpointer text; gboolean alive; stream = (InfinotedPluginDocumentStreamStream*)user_data; text = inf_text_chunk_get_text(chunk, &bytes); comm = 3; /* INSERT */ pos32 = (guint32)pos; bytes32 = (guint32)bytes; alive = infinoted_plugin_document_stream_send(stream, &comm, 4); if(alive) alive = infinoted_plugin_document_stream_send(stream, &pos32, 4); if(alive) alive = infinoted_plugin_document_stream_send(stream, &bytes32, 4); if(alive) alive = infinoted_plugin_document_stream_send(stream, text, bytes); g_free(text); }
static gboolean inf_text_default_delete_operation_text_match( InfTextDefaultDeleteOperation* operation, InfTextBuffer* buffer) { InfTextDefaultDeleteOperationPrivate* priv; InfTextChunk* chunk; gchar* first; gchar* second; gsize first_len; gsize second_len; int result; priv = INF_TEXT_DEFAULT_DELETE_OPERATION_PRIVATE(operation); /* TODO: inf_text_chunk_cmp_substring */ chunk = inf_text_buffer_get_slice( buffer, priv->position, inf_text_chunk_get_length(priv->chunk) ); first = inf_text_chunk_get_text(priv->chunk, &first_len); second = inf_text_chunk_get_text(chunk, &second_len); inf_text_chunk_free(chunk); /* TODO: Owners must match, too */ if(first_len == second_len) result = memcmp(first, second, first_len); else result = 1; /* != 0 */ g_free(second); g_free(first); return result == 0; }
static void inf_test_text_recover_text_erased_cb(InfTextBuffer* buffer, guint pos, InfTextChunk* chunk, InfUser* user, gpointer user_data) { InfAdoptedOperation* operation; guint len; InfTextChunk* print_chunk; gsize print_bytes; gpointer print_text; /* If the document has substantial content and this deletes most of it, * then print out the document here. */ len = inf_text_chunk_get_length(chunk); if(inf_text_buffer_get_length(buffer) + len >= 50) { if(len >= (inf_text_buffer_get_length(buffer) + len)*75/100) { if(*(int*)user_data == 0) { print_chunk = inf_text_buffer_get_slice( buffer, 0, inf_text_buffer_get_length(buffer) ); inf_text_chunk_insert_chunk(print_chunk, pos, chunk); print_text = inf_text_chunk_get_text(print_chunk, &print_bytes); inf_text_chunk_free(print_chunk); printf("%.*s\n", (int)print_bytes, (gchar*)print_text); g_free(print_text); } --*(int*)user_data; } } g_object_unref(buffer); }
static void inf_test_util_print_buffer(InfTextBuffer* buffer) { InfTextChunk* chunk; gchar* text; gsize bytes; chunk = inf_text_buffer_get_slice( buffer, 0, inf_text_buffer_get_length(buffer) ); text = inf_text_chunk_get_text(chunk, &bytes); inf_text_chunk_free(chunk); printf("%.*s\n", (int)bytes, text); g_free(text); }
static gboolean check_buffer(InfTextBuffer* buffer, const gchar* check_text, const gchar* buffer_name) { InfTextChunk* chunk; gpointer text; gsize len; gboolean result; chunk = inf_text_buffer_get_slice( buffer, 0, inf_text_buffer_get_length(buffer) ); text = inf_text_chunk_get_text(chunk, &len); inf_text_chunk_free(chunk); if(strlen(check_text) != len || strncmp(check_text, text, len) != 0) { printf( "%s Buffer has text \"%.*s\" but should have \"%s\"\n", buffer_name, (int)len, (gchar*)text, check_text ); result = FALSE; } else { result = TRUE; } g_free(text); return result; }
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); } }