Re: abi_widget_save returns false

From: Teus Benschop <teus_at_teusbenschop.nl>
Date: Tue Mar 13 2007 - 06:33:08 CET

Hi Martin,

Here is the filename it wants to save to:

Saving file
Saving document to file '/home/teus/documents/dev/bibledit-abi/test.abw'
1
2
3
/home/teus/documents/dev/bibledit-abi/test.abw
writeFile1
writeFile2
writeFile3
writeFile4
0

Here are the permissions of that file:

teus@asus:~$ ls -l /home/teus/documents/dev/bibledit-abi/test.abw
-rw-r--r-- 1 teus teus 6627 2007-03-13 06:25
/home/teus/documents/dev/bibledit-abi/test.abw

Changing the permissions of that file to 777 makes no difference. It
still fails after "writeFile4".

That bit in the code makes me wonder anyway, in the process of saving,
it also calls function openFile, see below:

    g_print ("writeFile4\n");
    if (!(m_fp = openFile(szFilename)))
        return m_bCancelled ? UT_SAVE_CANCELLED : UT_IE_COULDNOTWRITE;

    m_bOwnsFp = true;

    g_print ("writeFile5\n");

Help is appreciated.

Thanks!

Teus.

msevior@physics.unimelb.edu.au wrote:
>
> Hi Teus,
> Can you print out the filename you're trying to write to? My first
> guess is that this filename is somehow invalid. The filename must
> be the full pathname, so if your filename is "test.abw" it will
> attempt to write it to: "/test.abw" which most likely write
> protected.
>
> Cheers
>
> Martin
>
>
>> Hi,
>>
>> I am trying to use libabiword in our application Bibledit, but I am
>> running into a problem I don't know how to solve. Most likely I am doing
>> something wrong, only I can't figure out exactly where the problem is.
>>
>> There is a small application, code follows below, to test libabiword. I
>> try to save the document in the editor by calling function
>>
>> gboolean abi_widget_save (AbiWidget *w, const char *fname)
>>
>> But this function returns false after being called.
>>
>> I can see that it actually calls UT_Error IE_Exp::writeFile(const char *
>> szFilename) in file ie_exp.cpp, but it fails within that function.
>>
>> Here is that function:
>>
>> UT_Error IE_Exp::writeFile(const char * szFilename)
>> {
>> g_print (szFilename);
>> g_print ("\n");
>> g_print ("writeFile1\n");
>> UT_return_val_if_fail(m_pDocument, UT_IE_COULDNOTWRITE);
>> g_print ("writeFile2\n");
>> UT_return_val_if_fail(szFilename && *szFilename, UT_IE_COULDNOTWRITE);
>> g_print ("writeFile3\n");
>>
>> m_bCancelled = false;
>>
>> g_print ("writeFile4\n");
>> if (!(m_fp = openFile(szFilename)))
>> return m_bCancelled ? UT_SAVE_CANCELLED : UT_IE_COULDNOTWRITE;
>>
>> m_bOwnsFp = true;
>>
>> g_print ("writeFile5\n");
>> UT_Error error = _writeDocument();
>> g_print ("writeFile6\n");
>>
>> if (UT_OK == error)
>> _closeFile();
>> else
>> _abortFile();
>>
>> // Note: we let our caller worry about resetting the dirty bit
>> // Note: on the document and possibly updating the filename.
>>
>> return error;
>> }
>>
>>
>> It has been tagged with some debug messages to see where it fails. Here
>> is the output:
>> writeFile1
>> writeFile2
>> writeFile3
>> writeFile4
>> It fails after writeFile4.
>>
>> Any help here is greatly appreciated.
>>
>> I am attaching the source code of the testing application too, sorry for
>> the long message.
>>
>> Thanks!
>>
>> Teus.
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <libabiword.h>
>> #include <abiwidget.h>
>> #include <gdk/gdkkeysyms.h>
>> #include "be.h"
>>
>> #include <exception> // Standard exception class
>> #include <stdexcept> // logic_error and runtime_error
>> #include <iostream>
>> #include <cstdlib>
>> #include <string>
>> #include <fstream>
>> #include <vector>
>> #include <set>
>> #include <sstream>
>> #include <unistd.h>
>> #include <sys/types.h>
>> #include <sys/stat.h>
>> #include <fcntl.h>
>> #include <map>
>>
>>
>> using namespace std;
>>
>>
>> static void on_button1_activate (GtkButton *button, gpointer user_data)
>> {
>> abi_widget_invoke (ABI_WIDGET (abi), "insFootnote");
>> }
>>
>>
>> // The style name has another useful feature: one can see if we are in a
>> footnote or an endnote.
>> static void style_name_signal (AbiWidget * widget,
>> const char * value,
>> gpointer user_data)
>> {
>> gtk_label_set_text (GTK_LABEL (label1), value);
>> }
>>
>>
>> static void can_undo_signal (AbiWidget * widget,
>> gboolean value,
>> gpointer user_data)
>> {
>> gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (togglebutton1), value);
>> }
>>
>>
>> static void can_redo_signal (AbiWidget * widget,
>> gboolean value,
>> gpointer user_data)
>> {
>> gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (togglebutton2), value);
>> }
>>
>>
>> static void boolean_signal (AbiWidget * widget,
>> gboolean value,
>> gpointer user_data)
>> {
>> g_print ("Boolean signal '%s': %d\n", (char *)user_data, value);
>> }
>>
>>
>> /*
>> static void string_signal (AbiWidget * widget,
>> const char * value,
>> gpointer user_data)
>> {
>> g_print ("String signal '%s': %s\n", (char *)user_data, value);
>> }
>> */
>>
>> static void double_signal (AbiWidget * widget,
>> double value,
>> gpointer user_data)
>> {
>> g_print ("Double signal '%s': %f\n", (char *)user_data, value);
>> }
>>
>>
>> static gboolean on_key_press_event (GtkWidget * widget, GdkEventKey *
>> event, gpointer user_data)
>> {
>> // Handle control pressed.
>> guint modifiers = gtk_accelerator_get_default_mod_mask ();
>> if ((event->state & modifiers) == GDK_CONTROL_MASK) {
>> switch (event->keyval) {
>> case GDK_O: // Disable Ctrl-O: Open file
>> case GDK_o:
>> case GDK_S: // Disable Ctrl-S: Save file
>> case GDK_s:
>> return TRUE;
>> break;
>> default:
>> break;
>> }
>> }
>> return FALSE;
>> }
>>
>>
>> static void on_buttonsave_clicked (GtkButton *button, gpointer user_data)
>> {
>> g_print ("Saving file\n");
>> cout << abi_widget_save (ABI_WIDGET (abi),
>> "/home/teus/documents/dev/bibledit-abi/test.abw") << endl;
>> //cout << abi_widget_save_with_type (ABI_WIDGET (abi),
>> "/home/teus/documents/dev/bibledit-abi/test.abw", ".abw" ) << endl;
>> }
>>
>>
>> int main(int argc, char ** argv)
>> {
>>
>> gtk_init (&argc, &argv);
>>
>> window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
>> gtk_widget_set_usize(GTK_WIDGET(window), 640, 640);
>>
>> vbox1 = gtk_vbox_new (FALSE, 0);
>> gtk_widget_show (vbox1);
>> gtk_container_add (GTK_CONTAINER (window), vbox1);
>>
>> hbox2 = gtk_hbox_new (FALSE, 0);
>> gtk_widget_show (hbox2);
>> gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 0);
>>
>> button1 = gtk_button_new_with_mnemonic ("test");
>> gtk_widget_show (button1);
>> gtk_box_pack_start (GTK_BOX (hbox2), button1, FALSE, FALSE, 0);
>>
>> buttonsave = gtk_button_new_with_mnemonic ("save");
>> gtk_widget_show (buttonsave);
>> gtk_box_pack_start (GTK_BOX (hbox2), buttonsave, FALSE, FALSE, 0);
>>
>> label1 = gtk_label_new ("");
>> gtk_widget_show (label1);
>> gtk_box_pack_start (GTK_BOX (vbox1), label1, FALSE, FALSE, 0);
>>
>> hbox1 = gtk_hbox_new (FALSE, 0);
>> gtk_widget_show (hbox1);
>> gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
>>
>> togglebutton1 = gtk_toggle_button_new_with_mnemonic ("can undo");
>> gtk_widget_show (togglebutton1);
>> gtk_box_pack_start (GTK_BOX (hbox1), togglebutton1, FALSE, FALSE, 0);
>>
>> togglebutton2 = gtk_toggle_button_new_with_mnemonic ("can redo");
>> gtk_widget_show (togglebutton2);
>> gtk_box_pack_start (GTK_BOX (hbox1), togglebutton2, FALSE, FALSE, 0);
>>
>> /* Initialize libabiword */
>>
>> libabiword_init(argc, (const char **)argv);
>> abi = abi_widget_new ();
>> /* The key press event must be connected at this stage, else the
>> widget absorbs every event */
>> g_signal_connect (G_OBJECT (abi), "key_press_event", G_CALLBACK
>> (on_key_press_event), NULL);
>> gtk_box_pack_start (GTK_BOX (vbox1), abi, TRUE, TRUE, 0);
>> gtk_widget_show_all (window);
>> abi_widget_view_normal_layout (ABI_WIDGET (abi));
>>
>> g_signal_connect ((gpointer) button1, "clicked", G_CALLBACK
>> (on_button1_activate), NULL);
>> g_signal_connect ((gpointer) buttonsave, "clicked", G_CALLBACK
>> (on_buttonsave_clicked), NULL);
>>
>> g_signal_connect (G_OBJECT (abi), "bold", G_CALLBACK (boolean_signal),
>> NULL);
>> g_signal_connect (G_OBJECT (abi), "italic", G_CALLBACK
>> (boolean_signal), NULL);
>> g_signal_connect (G_OBJECT (abi), "underline", G_CALLBACK
>> (boolean_signal), NULL);
>> g_signal_connect (G_OBJECT (abi), "can-undo", G_CALLBACK
>> (can_undo_signal), NULL);
>> g_signal_connect (G_OBJECT (abi), "can-redo", G_CALLBACK
>> (can_redo_signal), NULL);
>> g_signal_connect (G_OBJECT (abi), "font-size", G_CALLBACK
>> (double_signal), NULL);
>> //g_signal_connect (G_OBJECT (abi), "font-family", G_CALLBACK
>> (string_signal), "font-family");
>> g_signal_connect (G_OBJECT (abi), "is-dirty", G_CALLBACK
>> (boolean_signal), NULL);
>> g_signal_connect (G_OBJECT (abi), "style-name", G_CALLBACK
>> (style_name_signal), NULL);
>>
>> g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK
>> (gtk_main_quit), NULL);
>> g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK
>> (gtk_main_quit), NULL);
>>
>> abi_widget_load_file (ABI_WIDGET (abi),
>> "/home/teus/documents/dev/bibledit-abi/test.abw");
>>
>> gtk_widget_grab_focus (abi);
>>
>> gtk_main ();
>>
>> /* Close libabiword */
>>
>> libabiword_shutdown ();
>> return 0;
>> }
>>
>>
>>
>>
>>
>
>
>
>
>
>
Received on Tue Mar 13 06:32:23 2007

This archive was generated by hypermail 2.1.8 : Tue Mar 13 2007 - 06:32:23 CET