Show errors on reading badly formed gnumeric files
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 16 Feb 2013 14:09:35 +0000 (15:09 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 16 Feb 2013 14:09:35 +0000 (15:09 +0100)
src/data/gnumeric-reader.c
src/data/gnumeric-reader.h
src/data/ods-reader.c
src/data/ods-reader.h
src/data/spreadsheet-reader.c
src/language/data-io/get-data.c
src/ui/gui/page-assistant.c
src/ui/gui/page-file.c
src/ui/gui/sheet-test.c

index 07b88163398f7df9a4b6aa7380b5fe6f0e607369..201ef599a16f7466fd589caa6340b75b46c97a4a 100644 (file)
@@ -433,8 +433,20 @@ gnumeric_destroy (struct spreadsheet *s)
 }
 
 
+static void
+gnumeric_error_handler (void *ctx, const char *mesg,
+                       UNUSED xmlParserSeverities sev, xmlTextReaderLocatorPtr loc)
+{
+  struct gnumeric_reader *r = ctx;
+       
+  msg (MW, _("There was a problem whilst reading the Gnumeric file `%s' (near line %d): `%s'"),
+       r->spreadsheet.file_name,
+       xmlTextReaderLocatorLineNumber (loc),
+       mesg);
+}
+
 static struct gnumeric_reader *
-gnumeric_reopen (struct gnumeric_reader *r, const char *filename)
+gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_errors)
 {  
   int ret;
 
@@ -454,9 +466,11 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename)
   if (NULL == gz)
     return NULL;
 
+
   xtr = xmlReaderForIO ((xmlInputReadCallback) gzread,
-                           (xmlInputCloseCallback) gzclose, gz,
-                          NULL, NULL, 0);
+                       (xmlInputCloseCallback) gzclose, gz,
+                       NULL, NULL,
+                       show_errors ? 0 : (XML_PARSE_NOERROR | XML_PARSE_NOWARNING) );
 
   if (xtr == NULL)
     {
@@ -470,6 +484,9 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename)
       r->spreadsheet.n_sheets = -1;
       r->spreadsheet.file_name = filename;
     }
+  
+  if (show_errors) 
+    xmlTextReaderSetErrorHandler (xtr, gnumeric_error_handler, r);
 
   r->target_sheet = NULL;
   r->target_sheet_index = -1;
@@ -503,9 +520,9 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename)
 
 
 struct spreadsheet *
-gnumeric_probe (const char *filename)
+gnumeric_probe (const char *filename, bool report_errors)
 {
-  struct gnumeric_reader *r = gnumeric_reopen (NULL, filename);
+  struct gnumeric_reader *r = gnumeric_reopen (NULL, filename, report_errors);
 
   return &r->spreadsheet;
 }
@@ -527,7 +544,7 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet,
   r = (struct gnumeric_reader *) (spreadsheet);
 
   if (r->row != -1)
-    r = gnumeric_reopen (r, NULL);
+    r = gnumeric_reopen (r, NULL, true);
 
   if ( opts->cell_range )
     {
index 8c7518f808037b92b69f64d7eca0934546bb9764..a2aaabf7bce612b65b852d62ffd418963a82a635 100644 (file)
@@ -24,7 +24,7 @@ struct dictionary;
 struct spreadsheet_read_info;
 struct spreadsheet_read_options;
 
-struct spreadsheet *gnumeric_probe (const char *filename);
+struct spreadsheet *gnumeric_probe (const char *filename, bool report_errors);
 
 const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n);
 
index d6ed43e8f64257db79ad48bd7fbc0ad451bfb523..dd19898c539ce569271600056ddba5db6058c985 100644 (file)
@@ -368,7 +368,7 @@ get_sheet_count (struct zip_reader *zreader)
   return -1;
 }
 
-struct spreadsheet *ods_probe (const char *filename)
+struct spreadsheet *ods_probe (const char *filename, bool report_errors)
 {
   struct ods_reader *r;
   struct string errs;
index 18eb65bc90f279ff0565bcd5c2f3dec447fe3d51..f068aa39d7b2eae68e73ac671213ccc5f5111074 100644 (file)
@@ -23,7 +23,7 @@ struct spreadsheet_read_info;
 struct spreadsheet_read_options;
 
 
-struct spreadsheet *ods_probe (const char *filename);
+struct spreadsheet *ods_probe (const char *filename, bool report_errors);
 
 struct casereader * ods_make_reader (struct spreadsheet *spreadsheet, 
                                     const struct spreadsheet_read_info *gri,
index b010999c1f55701a2036a8d52632fd3da08a9a9f..29e84e63402dbba49222ba5594ad27d9cd640262 100644 (file)
@@ -32,7 +32,7 @@ spreadsheet_open (const char *filename)
 {
   struct spreadsheet *ss = NULL;
 
-  ss = gnumeric_probe (filename);
+  ss = gnumeric_probe (filename, true);
   
   return ss;
 }
index 7b1d2882a2c9a26646783f67464f1a5bfba5620b..f12261a10f117db4328d105b428296ab1db01a83 100644 (file)
@@ -88,13 +88,13 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds)
 
       if ( 0 == strncasecmp (tok, "GNM", 3))
        {
-         struct spreadsheet *spreadsheet = gnumeric_probe (filename);
+         struct spreadsheet *spreadsheet = gnumeric_probe (filename, true);
          reader = gnumeric_make_reader (spreadsheet, &sri, &opts);
          dict = spreadsheet->dict;
        }
       else if (0 == strncasecmp (tok, "ODS", 3))
        {
-         struct spreadsheet *spreadsheet = ods_probe (filename);
+         struct spreadsheet *spreadsheet = ods_probe (filename, true);
          reader = ods_make_reader (spreadsheet, &sri, &opts);
          dict = spreadsheet->dict;
        }
index b0b616e2654ac47f448a7b6ade3fc7d9ee5d8c75..f1c95f71fd249ddfeec615176f8e9eee384fa486 100644 (file)
@@ -180,16 +180,12 @@ on_prepare (GtkAssistant *assistant, GtkWidget *page,
   else
     gtk_widget_grab_focus (assistant->forward);
 
-
-
-
 #if 0
   gtk_widget_show (ia->asst.reset_button);
   if (page == ia->formats->page)
     gtk_widget_show (ia->asst.paste_button);
   else
     gtk_widget_hide (ia->asst.paste_button);
-
 #endif
 }
 
index a781fcad2edddde6f7226d1773b9d51476a2ee4b..0e0a496de60c5579d6b4c31784ccb916a043f40f 100644 (file)
@@ -99,12 +99,12 @@ init_file (struct import_assistant *ia, GtkWindow *parent_window)
   printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet);
 
   if (ia->spreadsheet == NULL)
-    ia->spreadsheet = gnumeric_probe (file->file_name);
+    ia->spreadsheet = gnumeric_probe (file->file_name, false);
 
   printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet);
 
   if (ia->spreadsheet == NULL)
-    ia->spreadsheet = ods_probe (file->file_name);
+    ia->spreadsheet = ods_probe (file->file_name, false);
 
   printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet);
   
index 8f38e90f061a89e08a3bfde3bbaab649727c5407..dc903eb7e97a37d250efb2264fb8c7008f673019 100644 (file)
@@ -80,7 +80,7 @@ main (int argc, char *argv[] )
   if ( argc < 2)
     g_error ("Usage: prog file\n");
 
-  sp = gnumeric_probe (argv[1]);
+  sp = gnumeric_probe (argv[1], true);
   
   if (sp == NULL)
     {