Started polymorphism of Gnumeric
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 13 Jan 2013 12:08:58 +0000 (13:08 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 16 Feb 2013 14:03:08 +0000 (15:03 +0100)
src/data/gnumeric-reader.c
src/data/gnumeric-reader.h
src/data/spreadsheet-reader.h
src/language/data-io/get-data.c
src/ui/gui/page-sheet-spec.c

index cfdd45424d455481ecbd671777b7c4ef28eca8f9..9bb961a45980f8f2fe75587f3957c02a8990be44 100644 (file)
@@ -95,9 +95,6 @@ struct gnumeric_reader
 
   enum reader_state state;
 
-  /* The total number of sheets in the "workbook" */
-  int sheet_total ;
-
   int row;
   int col;
   int min_col;
@@ -157,7 +154,7 @@ process_node (struct gnumeric_reader *r)
          XML_READER_TYPE_ELEMENT  == r->node_type)
        {
          r->state = STATE_SHEET_COUNT;
-         r->sheet_total = 0;
+         r->spreadsheet.sheets = 0;
        }
       break;
 
@@ -165,7 +162,7 @@ process_node (struct gnumeric_reader *r)
       if (0 == xmlStrcasecmp (name, _xml("gnm:SheetName")) &&
          XML_READER_TYPE_ELEMENT  == r->node_type)
        {
-         r->sheet_total++;
+         r->spreadsheet.sheets++;
        }
       else if (0 == xmlStrcasecmp (name, _xml("gnm:SheetNameIndex")) &&
          XML_READER_TYPE_END_ELEMENT  == r->node_type)
@@ -327,7 +324,7 @@ gnumeric_probe (const char *filename)
   r = xzalloc (sizeof *r);
   
   r->xtr = xtr;
-  r->sheet_total = -1;
+  r->spreadsheet.sheets = -1;
   r->state = STATE_PRE_INIT;
 
 
@@ -350,18 +347,17 @@ gnumeric_probe (const char *filename)
     }
     
   r->spreadsheet.type = SPREADSHEET_GNUMERIC;
-  r->spreadsheet.sheets = r->sheet_total;
-  r->spreadsheet.make_reader = NULL;
-  
   
   return &r->spreadsheet;
 }
 
+
 struct casereader *
-gnumeric_open_reader (const struct spreadsheet_read_info *gri, 
-                     struct spreadsheet_read_options *opts,
-                     struct dictionary **dict)
+gnumeric_make_reader (struct spreadsheet *spreadsheet,
+                     const struct spreadsheet_read_info *gri, 
+                     struct spreadsheet_read_options *opts)
 {
+  struct gnumeric_reader *r = NULL;
   unsigned long int vstart = 0;
   int ret;
   casenumber n_cases = CASENUMBER_MAX;
@@ -369,14 +365,6 @@ gnumeric_open_reader (const struct spreadsheet_read_info *gri,
   struct var_spec *var_spec = NULL;
   int n_var_specs = 0;
 
-  struct spreadsheet * spreadsheet = NULL;
-  struct gnumeric_reader *r = NULL;
-
-  spreadsheet = gnumeric_probe (gri->file_name);
-
-  if (spreadsheet == NULL)
-    goto error;
-
   r = (struct gnumeric_reader *) (spreadsheet);
 
   if ( opts->cell_range )
@@ -508,7 +496,7 @@ gnumeric_open_reader (const struct spreadsheet_read_info *gri,
     if ( enc == NULL)
       goto error;
     /* Create the dictionary and populate it */
-    *dict = r->dict = dict_create (CHAR_CAST (const char *, enc));
+    spreadsheet->dict = r->dict = dict_create (CHAR_CAST (const char *, enc));
   }
 
   for (i = 0 ; i < n_var_specs ; ++i )
@@ -587,8 +575,8 @@ gnumeric_open_reader (const struct spreadsheet_read_info *gri,
     }
 
   free (var_spec);
-  dict_destroy (*dict);
-  *dict = NULL;
+  dict_destroy (spreadsheet->dict);
+  spreadsheet->dict = NULL;
 
   gnm_file_casereader_destroy (NULL, r);
 
index 529670e35cfefed38db13d1edb7e1a0803693b33..b21ddfd558b001d4fdd0dee43fc4712f6d5255dc 100644 (file)
@@ -27,9 +27,9 @@ struct spreadsheet_read_options;
 
 struct spreadsheet *gnumeric_probe (const char *filename);
 
-struct casereader * gnumeric_open_reader (const struct spreadsheet_read_info *, 
-                                         struct spreadsheet_read_options *,
-                                         struct dictionary **);
+struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet,
+                                         const struct spreadsheet_read_info *gri, 
+                                         struct spreadsheet_read_options *opts);
 
 
 #endif
index d25aaf32f6a11c11760c20fd97ace5d64b820662..3fbbde1d21f605242ad1117b64345a155764c7e5 100644 (file)
@@ -62,8 +62,6 @@ struct spreadsheet
 {
   enum spreadsheet_type type;
 
-  struct casereader * (*make_reader) (struct spreadsheet *);
-
   /* The total number of sheets in the "workbook" */
   int sheets;
 
index 8f75272e2d0648c246734ce63d50e87715e9247e..723a16c8d1361cfe0d4fe832d2cc469a9b0b07c7 100644 (file)
@@ -86,9 +86,15 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds)
        goto error;
 
       if ( 0 == strncasecmp (tok, "GNM", 3))
-       reader = gnumeric_open_reader (&sri, &opts, &dict);
+       {
+         struct spreadsheet *spreadsheet = gnumeric_probe (sri.file_name);
+         reader = gnumeric_make_reader (spreadsheet, &sri, &opts);
+         dict = spreadsheet->dict;
+       }
       else if (0 == strncasecmp (tok, "ODS", 3))
-       reader = ods_open_reader (&sri, &opts, &dict);
+       {
+         reader = ods_open_reader (&sri, &opts, &dict);
+       }
 
       if (reader)
        {
index 8f8bb381cc2b75e76ed4098f2da90323b96fd8e4..f87bce21f6cb6afc8cc1546aba0451a404aba452 100644 (file)
@@ -151,7 +151,10 @@ post_sheet_spec_page (struct import_assistant *ia)
       creader = ods_open_reader (&ssp->sri, &ssp->opts, &dict);
       break;
     case FTYPE_GNUMERIC:
-      creader = gnumeric_open_reader (&ssp->sri, &ssp->opts, &dict);
+      {
+       creader = gnumeric_make_reader (ssp->spreadsheet, &ssp->sri, &ssp->opts);
+       dict = ssp->spreadsheet->dict;
+      }
       break;
     default:
       g_assert_not_reached ();