abi_widget_save returns false

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

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:05:52 2007

This archive was generated by hypermail 2.1.8 : Tue Mar 13 2007 - 06:05:53 CET