Re: abi_widget_save returns false

From: <msevior_at_physics.unimelb.edu.au>
Date: Tue Mar 13 2007 - 06:15:04 CET

>

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:14:41 2007

This archive was generated by hypermail 2.1.8 : Tue Mar 13 2007 - 06:14:41 CET