From bd8cdbe7fa4e042ec5333bdcbe29061ee44c1913 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Mon, 18 Jul 2011 11:39:22 +0200 Subject: [PATCH] Aggiunto il test per SolipaOOO.\n\nCorrezioni e aggiustamenti. --- .gitignore | 1 + src/ooo.c | 57 +++++++++++++++++++++++++++++++++--------- tests/Makefile.am | 3 +++ tests/ooo.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++ tests/ooo.odt | Bin 0 -> 10956 bytes 5 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 tests/ooo.c create mode 100644 tests/ooo.odt diff --git a/.gitignore b/.gitignore index d0b2e54..18d6412 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ tests/allegato tests/mail tests/mail_get_addresses_from_string tests/mailui +tests/ooo tests/progresswindow tests/utils tests/utils_codfisc_piva diff --git a/src/ooo.c b/src/ooo.c index 2379a6f..53f3237 100644 --- a/src/ooo.c +++ b/src/ooo.c @@ -101,7 +101,15 @@ SolipaOOO /* TODO controllare i valori */ priv->ooo_path = g_strdup (ooo_path); - priv->ooo_soffice = g_strdup (ooo_soffice); + + if (ooo_soffice == NULL) + { + priv->ooo_soffice = g_strdup ("soffice"); + } + else + { + priv->ooo_soffice = g_strdup (ooo_soffice); + } solipa_ooo_apri_openoffice (solipa_ooo); @@ -119,14 +127,25 @@ solipa_ooo_apri_documento (SolipaOOO *ooo, const gchar *filename) void solipa_ooo_string_replace (SolipaOOO *ooo, const gchar *search, const gchar *replace) { + gchar *_search; + gchar *_replace; + + _search = g_strdup (search); + _replace = g_strdup (replace); + + _search = g_strjoinv ("\\\"", g_strsplit (_search, "\"", -1)); + _replace = g_strjoinv ("\\\"", g_strsplit (_replace, "\"", -1)); + /* TODO controllare se SearchDescriptor esiste o no */ - PyRun_SimpleString (g_strdup_printf ("search = document.createSearchDescriptor()\n" + PyRun_SimpleString ("search = document.createSearchDescriptor()\n"); + + PyRun_SimpleString (g_strdup_printf ( "search.SearchString = u\"%s\"\n" "found = document.findFirst(search)\n" "found.String = string.replace(found.String, u\"%s\", u\"%s\")\n", - search, - search, - replace)); + _search, + _search, + _replace)); } /* PRIVATE */ @@ -253,32 +272,36 @@ solipa_ooo_apri_openoffice (SolipaOOO *ooo) /* chiudo le eventuali sessioni di openoffice attive */ #ifdef G_OS_WIN32 - pipa = popen ("taskkill /T /F /IM soffice.bin", "r"); + pipa = popen (g_strdup_printf ("taskkill /T /F /IM %s.bin", priv->ooo_soffice), "r"); #else - pipa = popen ("killall soffice.bin", "r"); + pipa = popen (g_strdup_printf ("killall %s.bin", priv->ooo_soffice), "r"); #endif pclose (pipa); /* apro openoffice in ascolto */ +#ifdef G_OS_WIN32 + gchar *curdir = g_get_current_dir (); chdir (g_build_filename (priv->ooo_path, "program", NULL)); -#ifdef G_OS_WIN32 pipa = popen (g_strconcat ("\"", priv->ooo_soffice, " -accept=\"socket,host=localhost,port=8100;urp;\" -no-restore -invisible\"", NULL), "r"); + + chdir (curdir); + g_free (curdir); + #else + pipa = popen (g_strconcat ("\"", priv->ooo_soffice, "\" -accept=\"socket,host=localhost,port=8100;urp;\" -no-restore -invisible", NULL), "r"); -#endif - chdir (curdir); - g_free (curdir); +#endif while (gtk_events_pending ()) { @@ -290,6 +313,8 @@ solipa_ooo_apri_openoffice (SolipaOOO *ooo) m_main = PyImport_AddModule ("__main__"); dict = PyModule_GetDict (m_main); +#ifdef G_OS_WIN32 + ooo_path = g_strjoinv ("\\\\", g_strsplit (priv->ooo_path, "\\", -1)); PyRun_SimpleString (g_strdup_printf ( "import os\n" @@ -303,6 +328,9 @@ solipa_ooo_apri_openoffice (SolipaOOO *ooo) ooo_path, g_strjoinv ("%20", g_strsplit (g_strjoinv ("/", g_strsplit (priv->ooo_path, "\\", -1)), " ", -1))) ); + +#endif + PyRun_SimpleString ("import uno\n" "import string\n" "local = uno.getComponentContext()\n" @@ -314,6 +342,7 @@ solipa_ooo_apri_openoffice (SolipaOOO *ooo) gtk_main_iteration (); } + g_usleep (5000000); do { PyRun_SimpleString ("context = resolver.resolve(\"uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext\")\n"); @@ -326,9 +355,13 @@ solipa_ooo_apri_openoffice (SolipaOOO *ooo) obj = PyDict_GetItemString (dict, "context"); if (obj != NULL || priv->dialog_response) break; + g_usleep (1000000); } while (TRUE); gtk_widget_destroy (dialog); - if (priv->dialog_response) return FALSE; + if (priv->dialog_response) + { + return FALSE; + } obj = PyDict_GetItemString (dict, "context"); if (obj == NULL) diff --git a/tests/Makefile.am b/tests/Makefile.am index fe29ea6..4dccda1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -9,10 +9,13 @@ LIBS = $(SOLIPA_LIBS) \ LDADD = $(top_builddir)/src/libsolipa.la +ooo_LDADD = $(top_builddir)/src/libsolipaooo.la + noinst_PROGRAMS = allegato \ mail \ mail_get_addresses_from_string \ mailui \ + ooo \ progresswindow \ utils \ utils_codfisc_piva \ diff --git a/tests/ooo.c b/tests/ooo.c new file mode 100644 index 0000000..4c78d35 --- /dev/null +++ b/tests/ooo.c @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2011 Andrea Zagli + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +GtkWidget *w; + +SolipaOOO *ooo; + +gboolean +on_w_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + return FALSE; +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *infobar; + + gtk_init (&argc, &argv); + + w = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (w, "delete-event", G_CALLBACK (on_w_delete_event), NULL); + g_signal_connect (w, "destroy", gtk_main_quit, NULL); + + gtk_widget_show (w); + + ooo = solipa_ooo_new (GTK_WINDOW (w), + NULL, + NULL); + + if (ooo == NULL) + { + g_error ("Unable to create SolipaOOO."); + } + + solipa_ooo_apri_documento (ooo, argv[1]); + + solipa_ooo_string_replace (ooo, "{prg::replace}", "\"blah blah blah\""); + + gtk_main (); + + return 0; +} diff --git a/tests/ooo.odt b/tests/ooo.odt new file mode 100644 index 0000000000000000000000000000000000000000..05fc6d2d7e55d3a8ae4f1abe159df303dc974852 GIT binary patch literal 10956 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 literal 0 HcmV?d00001 -- 2.49.0