/[public]/psiconv/trunk/lib/psiconv/parse_driver.c
ViewVC logotype

Annotation of /psiconv/trunk/lib/psiconv/parse_driver.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 95 - (hide annotations)
Wed Jan 17 12:04:12 2001 UTC (23 years, 2 months ago) by frodo
File MIME type: text/plain
File size: 28628 byte(s)
(Frodo) A little more sheet work. Added a Sheet Workbook section, though
        nothing is really put into it yet.

1 frodo 2 /*
2     parse_driver.c - Part of psiconv, a PSION 5 file formats converter
3 frodo 63 Copyright (c) 1999, 2000 Frodo Looijaard <frodol@dds.nl>
4 frodo 2
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9    
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     GNU General Public License for more details.
14    
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     */
19    
20     #include "config.h"
21 frodo 71 #include "compat.h"
22    
23 frodo 2 #include <stdlib.h>
24    
25     #include "parse.h"
26     #include "parse_routines.h"
27    
28 frodo 18 psiconv_file_type_t psiconv_file_type(psiconv_buffer buf,int *length,
29     psiconv_header_section *result)
30 frodo 2 {
31     psiconv_header_section header;
32     psiconv_file_type_t res;
33 frodo 18 int leng;
34 frodo 2
35 frodo 64 if ((psiconv_parse_header_section(buf,0,0,&leng,&header)))
36     return psiconv_unknown_file;
37 frodo 2 res = header->file;
38 frodo 18 if (result)
39     *result = header;
40     else
41     psiconv_free_header_section(header);
42     if (length)
43     *length = leng;
44 frodo 2 return res;
45     }
46    
47     int psiconv_parse(const psiconv_buffer buf,psiconv_file *result)
48     {
49     int res=0;
50     int lev=0;
51     int off=0;
52 frodo 18 int leng;
53 frodo 2
54 frodo 64 if (!((*result) = malloc(sizeof(**result))))
55     goto ERROR1;
56 frodo 2
57 frodo 18 (*result)->type = psiconv_file_type(buf,&leng,NULL);
58 frodo 2 if ((*result)->type == psiconv_unknown_file) {
59     psiconv_warn(lev+1,off,"Unknown file type: can't parse!");
60     (*result)->file = NULL;
61     } else if ((*result)->type == psiconv_word_file)
62 frodo 18 res = psiconv_parse_word_file(buf,lev+2,leng,
63 frodo 2 (psiconv_word_f *)(&((*result)->file)));
64     else if ((*result)->type == psiconv_texted_file)
65 frodo 18 res = psiconv_parse_texted_file(buf,lev+2,leng,
66 frodo 2 (psiconv_texted_f *)(&((*result)->file)));
67 frodo 12 else if ((*result)->type == psiconv_mbm_file)
68 frodo 18 res = psiconv_parse_mbm_file(buf,lev+2,leng,
69 frodo 12 (psiconv_mbm_f *)(&((*result)->file)));
70 frodo 24 else if ((*result)->type == psiconv_sketch_file)
71     res = psiconv_parse_sketch_file(buf,lev+2,leng,
72     (psiconv_sketch_f *)(&((*result)->file)));
73 frodo 41 else if ((*result)->type == psiconv_clipart_file)
74     res = psiconv_parse_clipart_file(buf,lev+2,leng,
75     (psiconv_clipart_f *)(&((*result)->file)));
76 frodo 94 else if ((*result)->type == psiconv_sheet_file)
77     res = psiconv_parse_sheet_file(buf,lev+2,leng,
78     (psiconv_sheet_f *)(&((*result)->file)));
79 frodo 2 else {
80     psiconv_warn(lev+1,off,"Can't parse this file yet!");
81     (*result)->file = NULL;
82     }
83 frodo 64 if (res)
84     goto ERROR2;
85     return 0;
86 frodo 2
87 frodo 64 ERROR2:
88     free(*result);
89     ERROR1:
90     psiconv_warn(lev+1,off,"Reading of Psion File failed");
91     if (res == 0)
92     return -PSICONV_E_NOMEM;
93     else
94     return res;
95 frodo 2 }
96    
97 frodo 41 int psiconv_parse_clipart_file(const psiconv_buffer buf,int lev,
98     psiconv_u32 off, psiconv_clipart_f *result)
99     {
100 frodo 42 int res=0;
101 frodo 43 int i;
102     psiconv_jumptable_section table;
103     psiconv_clipart_section clipart;
104     psiconv_u32 *entry;
105    
106     psiconv_progress(lev+1,off,"Going to read a clipart file");
107 frodo 64 if (!((*result) = malloc(sizeof(**result))))
108     goto ERROR1;
109 frodo 43
110     psiconv_progress(lev+2,off,"Going to read the MBM jumptable");
111 frodo 64 if ((res = psiconv_parse_jumptable_section(buf,lev+2,off, NULL,&table)))
112     goto ERROR2;
113 frodo 43
114     psiconv_progress(lev+2,off,"Going to read the clipart sections");
115 frodo 64 if (!((*result)->sections = psiconv_list_new(sizeof(*clipart))))
116     goto ERROR3;
117 frodo 43 for (i = 0; i < psiconv_list_length(table); i ++) {
118 frodo 64 if (!(entry = psiconv_list_get(table,i)))
119     goto ERROR4;
120 frodo 43 psiconv_progress(lev+3,off,"Going to read clipart section %i",i);
121 frodo 66 if ((res = psiconv_parse_clipart_section(buf,lev+3,*entry,NULL,&clipart)))
122 frodo 64 goto ERROR4;
123 frodo 66 if ((res = psiconv_list_add((*result)->sections,clipart)))
124 frodo 64 goto ERROR5;
125 frodo 43 }
126    
127     psiconv_free_jumptable_section(table);
128     psiconv_progress(lev+1,off,"End of clipart file");
129     return res;
130 frodo 64 ERROR5:
131     psiconv_free_clipart_section(clipart);
132     ERROR4:
133     for (i = 0; i < psiconv_list_length((*result)->sections); i++) {
134     if (!(clipart = psiconv_list_get((*result)->sections,i))) {
135     psiconv_warn(lev+1,off,"Massive memory corruption");
136     goto ERROR3;
137     }
138     psiconv_free_clipart_section(clipart);
139     }
140     psiconv_list_free((*result)->sections);
141     ERROR3:
142     psiconv_free_jumptable_section(table);
143     ERROR2:
144     free(*result);
145     ERROR1:
146     psiconv_warn(lev+1,off,"Reading of Clipart File failed");
147     if (res == 0)
148     return -PSICONV_E_NOMEM;
149     else
150     return res;
151 frodo 41 }
152    
153 frodo 12 int psiconv_parse_mbm_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
154     psiconv_mbm_f *result)
155     {
156     int res=0;
157     int i;
158 frodo 42 psiconv_jumptable_section table;
159 frodo 12 psiconv_paint_data_section paint;
160     psiconv_u32 *entry;
161 frodo 18 psiconv_u32 sto;
162 frodo 12
163     psiconv_progress(lev+1,off,"Going to read a mbm file");
164 frodo 64 if (!(*result = malloc(sizeof(**result))))
165     goto ERROR1;
166 frodo 12
167 frodo 18 psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable");
168 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
169     if (res)
170     goto ERROR2;
171 frodo 18 psiconv_debug(lev+2,off,"Offset: %08x",sto);
172 frodo 12
173     psiconv_progress(lev+2,off,"Going to read the MBM jumptable");
174 frodo 64 if ((res = psiconv_parse_jumptable_section(buf,lev+2,sto, NULL,&table)))
175     goto ERROR2;
176 frodo 12
177 frodo 13 psiconv_progress(lev+2,off,"Going to read the picture sections");
178 frodo 64 if (!((*result)->sections = psiconv_list_new(sizeof(*paint))))
179     goto ERROR3;
180 frodo 12 for (i = 0; i < psiconv_list_length(table); i ++) {
181 frodo 64 if (!(entry = psiconv_list_get(table,i)))
182     goto ERROR4;
183 frodo 13 psiconv_progress(lev+3,off,"Going to read picture section %i",i);
184 frodo 64 if ((res = psiconv_parse_paint_data_section(buf,lev+3,*entry,NULL,
185     0,&paint)))
186     goto ERROR4;
187     if ((res = psiconv_list_add((*result)->sections,paint)))
188     goto ERROR5;
189 frodo 12 }
190    
191 frodo 42 psiconv_free_jumptable_section(table);
192 frodo 12 psiconv_progress(lev+1,off,"End of mbm file");
193 frodo 64 return 0;
194     ERROR5:
195     psiconv_free_paint_data_section(paint);
196     ERROR4:
197     for (i = 0; i < psiconv_list_length((*result)->sections); i++) {
198     if (!(paint = psiconv_list_get((*result)->sections,i))) {
199     psiconv_warn(lev+1,off,"Massive memory corruption");
200     goto ERROR3;
201     }
202     psiconv_free_paint_data_section(paint);
203     }
204     psiconv_list_free((*result)->sections);
205     ERROR3:
206     psiconv_free_jumptable_section(table);
207     ERROR2:
208     free(*result);
209     ERROR1:
210     psiconv_warn(lev+1,off,"Reading of MBM File failed");
211     if (res == 0)
212     return -PSICONV_E_NOMEM;
213     else
214     return res;
215 frodo 12 }
216    
217 frodo 24 int psiconv_parse_sketch_file(const psiconv_buffer buf,int lev,
218     psiconv_u32 off,
219     psiconv_sketch_f *result)
220     {
221     psiconv_section_table_section table;
222     psiconv_application_id_section appl_id;
223     psiconv_u32 applid_sec = 0;
224     psiconv_u32 sketch_sec = 0;
225     psiconv_u32 sto;
226     psiconv_section_table_entry entry;
227     int i;
228     int res=0;
229     char *temp_str;
230    
231     psiconv_progress(lev+1,off,"Going to read a sketch file");
232 frodo 64 if (!(*result = malloc(sizeof(**result))))
233     goto ERROR1;
234 frodo 24
235     psiconv_progress(lev+2,off,
236     "Going to read the offset of the section table section");
237 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
238     if (res)
239     goto ERROR2;
240 frodo 24 psiconv_debug(lev+2,off,"Offset: %08x",sto);
241    
242     psiconv_progress(lev+2,sto, "Going to read the section table section");
243 frodo 64 if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
244     goto ERROR2;
245 frodo 24
246     for (i = 0; i < psiconv_list_length(table); i ++) {
247     psiconv_progress(lev+2,sto, "Going to read entry %d",i);
248 frodo 64 if (!(entry = psiconv_list_get(table,i)))
249     goto ERROR3;
250 frodo 24 if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
251     applid_sec = entry->offset;
252     psiconv_debug(lev+3,sto,
253     "Found the Application ID section at %08x",applid_sec);
254     } else if (entry->id == PSICONV_ID_SKETCH_SECTION) {
255     sketch_sec = entry->offset;
256     psiconv_debug(lev+3,sto,
257     "Found the Sketch section at %08x",sketch_sec);
258     } else {
259     psiconv_warn(lev+3,sto,
260 frodo 64 "Found unknown section in the Section Table (ignoring)");
261 frodo 24 psiconv_debug(lev+3,sto,
262     "Section ID %08x, offset %08x",entry->id,entry->offset);
263     }
264     }
265    
266     psiconv_progress(lev+2,sto, "Looking for the Application ID section");
267     if (! applid_sec) {
268 frodo 64 psiconv_warn(lev+2,sto,
269     "Application ID section not found in the section table");
270     res = -PSICONV_E_PARSE;
271     goto ERROR3;
272 frodo 24 } else {
273     psiconv_debug(lev+2,sto,
274     "Application ID section at offset %08x",applid_sec);
275 frodo 64 if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
276     &appl_id)))
277     goto ERROR3;
278 frodo 24 }
279     if ((appl_id->id != PSICONV_ID_SKETCH) ||
280     strcmp(appl_id->name,"Paint.app")) {
281     psiconv_warn(lev+2,applid_sec,
282     "Application ID section contains unexpected data");
283     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
284     PSICONV_ID_SKETCH,appl_id->id);
285 frodo 64 if (!(temp_str = psiconv_make_printable(appl_id->name)))
286     goto ERROR4;
287 frodo 24 psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
288     "Paint.app",temp_str);
289     free(temp_str);
290 frodo 64 res = -PSICONV_E_PARSE;
291     goto ERROR4;
292 frodo 24 }
293    
294     psiconv_progress(lev+2,sto, "Looking for the Sketch section");
295     if (! sketch_sec) {
296     psiconv_warn(lev+2,sto,
297     "Sketch section not found in the section table");
298     } else {
299     psiconv_debug(lev+2,sto,
300     "Sketch section at offset %08x",applid_sec);
301 frodo 64 if ((res = psiconv_parse_sketch_section(buf,lev+2,sketch_sec,NULL,0,
302     &(*result)->sketch_sec)))
303     goto ERROR4;
304 frodo 24 }
305    
306     psiconv_free_application_id_section(appl_id);
307     psiconv_free_section_table_section(table);
308    
309     psiconv_progress(lev+1,off,"End of word file");
310     return res;
311 frodo 64
312     ERROR4:
313     psiconv_free_application_id_section(appl_id);
314     ERROR3:
315     free(table);
316     ERROR2:
317     free(*result);
318     ERROR1:
319     psiconv_warn(lev+1,off,"Reading of Scketch File failed");
320     if (res == 0)
321     return -PSICONV_E_NOMEM;
322     else
323     return res;
324 frodo 24 }
325    
326    
327 frodo 18 int psiconv_parse_texted_file(const psiconv_buffer buf,int lev,
328     psiconv_u32 off,
329 frodo 2 psiconv_texted_f *result)
330     {
331     int res=0;
332     psiconv_section_table_section table;
333     psiconv_application_id_section appl_id;
334     char *temp_str;
335     psiconv_character_layout base_char;
336     psiconv_paragraph_layout base_para;
337     psiconv_u32 page_sec = 0;
338     psiconv_u32 texted_sec = 0;
339     psiconv_u32 applid_sec = 0;
340 frodo 18 psiconv_u32 sto;
341 frodo 2 psiconv_section_table_entry entry;
342     int i;
343    
344     psiconv_progress(lev+1,off,"Going to read a texted file");
345 frodo 64 if (!(*result = malloc(sizeof(**result))))
346     goto ERROR1;
347 frodo 2
348 frodo 24 psiconv_progress(lev+2,off,
349     "Going to read the offset of the section table section");
350 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
351     if (res)
352     goto ERROR2;
353 frodo 18 psiconv_debug(lev+2,off,"Offset: %08x",sto);
354 frodo 2
355 frodo 18 psiconv_progress(lev+2,sto, "Going to read the section table section");
356 frodo 64 if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
357     goto ERROR2;
358 frodo 2
359     for (i = 0; i < psiconv_list_length(table); i ++) {
360 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
361 frodo 64 if (!(entry = psiconv_list_get(table,i)))
362     goto ERROR3;
363 frodo 2 if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
364     applid_sec = entry->offset;
365 frodo 18 psiconv_debug(lev+3,sto,
366 frodo 2 "Found the Application ID section at %08x",applid_sec);
367     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
368     page_sec = entry->offset;
369 frodo 18 psiconv_debug(lev+3,sto,
370 frodo 2 "Found the Page Layout section at %08x",page_sec);
371     } else if (entry->id == PSICONV_ID_TEXTED) {
372     texted_sec = entry->offset;
373 frodo 18 psiconv_debug(lev+3,sto,
374 frodo 2 "Found the TextEd section at %08x",texted_sec);
375     } else {
376 frodo 18 psiconv_warn(lev+3,sto,
377 frodo 64 "Found unknown section in the Section Table (ignoring)");
378 frodo 18 psiconv_debug(lev+3,sto,
379 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
380     }
381     }
382    
383 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
384 frodo 2 if (! applid_sec) {
385 frodo 18 psiconv_warn(lev+2,sto,
386 frodo 2 "Application ID section not found in the section table");
387 frodo 64 res = -PSICONV_E_PARSE;
388     goto ERROR3;
389 frodo 2 } else {
390 frodo 18 psiconv_debug(lev+2,sto,
391 frodo 2 "Application ID section at offset %08x",applid_sec);
392 frodo 64 if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
393     &appl_id)))
394     goto ERROR3;
395 frodo 2 }
396     if ((appl_id->id != PSICONV_ID_TEXTED) ||
397     strcmp(appl_id->name,"TextEd.app")) {
398     psiconv_warn(lev+2,applid_sec,
399     "Application ID section contains unexpected data");
400     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
401     PSICONV_ID_TEXTED,appl_id->id);
402 frodo 64 if (!(temp_str = psiconv_make_printable(appl_id->name)))
403     goto ERROR4;
404 frodo 2 psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
405 frodo 24 "TextEd.app",temp_str);
406 frodo 2 free(temp_str);
407 frodo 64 res = -PSICONV_E_PARSE;
408     goto ERROR4;
409 frodo 2 }
410    
411 frodo 18 psiconv_progress(lev+2,sto,
412 frodo 2 "Looking for the Page layout section");
413     if (! page_sec) {
414 frodo 18 psiconv_warn(lev+2,sto,
415 frodo 2 "Page layout section not found in the section table");
416 frodo 64 res = -PSICONV_E_PARSE;
417     goto ERROR4;
418 frodo 2 } else {
419 frodo 18 psiconv_debug(lev+2,sto,
420 frodo 2 "Page layout section at offset %08x",page_sec);
421 frodo 64 if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
422     &(*result)->page_sec)))
423     goto ERROR4;
424 frodo 2 }
425    
426 frodo 64 if (!(base_char = psiconv_basic_character_layout()))
427     goto ERROR5;
428     if (!(base_para = psiconv_basic_paragraph_layout()))
429     goto ERROR6;
430 frodo 2
431 frodo 18 psiconv_progress(lev+2,sto,
432 frodo 2 "Looking for the TextEd section");
433     if (! texted_sec) {
434 frodo 18 psiconv_warn(lev+2,sto,
435 frodo 2 "TextEd section not found in the section table");
436 frodo 64 res = -PSICONV_E_PARSE;
437     goto ERROR7;
438 frodo 2 } else {
439 frodo 18 psiconv_debug(lev+2,sto, "TextEd section at offset %08x",texted_sec);
440 frodo 64 if ((res = psiconv_parse_texted_section(buf,lev+2,texted_sec,NULL,
441 frodo 2 &(*result)->texted_sec,
442 frodo 64 base_char,base_para)))
443     goto ERROR7;
444 frodo 2 }
445     psiconv_free_character_layout(base_char);
446     psiconv_free_paragraph_layout(base_para);
447    
448     psiconv_free_application_id_section(appl_id);
449     psiconv_free_section_table_section(table);
450    
451 frodo 64 psiconv_progress(lev+1,off,"End of TextEd file");
452     return 0;
453    
454     ERROR7:
455     psiconv_free_paragraph_layout(base_para);
456     ERROR6:
457     psiconv_free_character_layout(base_char);
458     ERROR5:
459     psiconv_free_page_layout_section((*result)->page_sec);
460     ERROR4:
461     psiconv_free_application_id_section(appl_id);
462     ERROR3:
463     psiconv_free_section_table_section(table);
464     ERROR2:
465     free(*result);
466     ERROR1:
467     psiconv_warn(lev+1,off,"Reading of TextEd File failed");
468     if (res == 0)
469     return -PSICONV_E_NOMEM;
470     else
471     return res;
472 frodo 2 }
473    
474     int psiconv_parse_word_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
475     psiconv_word_f *result)
476     {
477     int res=0;
478     psiconv_section_table_section table;
479     psiconv_application_id_section appl_id;
480     char *temp_str;
481     psiconv_u32 pwd_sec = 0;
482     psiconv_u32 status_sec = 0;
483     psiconv_u32 styles_sec = 0;
484     psiconv_u32 page_sec = 0;
485     psiconv_u32 text_sec = 0;
486     psiconv_u32 layout_sec = 0;
487     psiconv_u32 applid_sec = 0;
488     psiconv_section_table_entry entry;
489 frodo 18 psiconv_u32 sto;
490 frodo 2 int i;
491    
492     psiconv_progress(lev+1,off,"Going to read a word file");
493 frodo 64 if (!(*result = malloc(sizeof(**result))))
494     goto ERROR1;
495 frodo 2
496 frodo 24 psiconv_progress(lev+2,off,
497     "Going to read the offset of the section table section");
498 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
499     if (res)
500     goto ERROR2;
501 frodo 18 psiconv_debug(lev+2,off,"Offset: %08x",sto);
502 frodo 2
503 frodo 18 psiconv_progress(lev+2,sto,
504 frodo 2 "Going to read the section table section");
505 frodo 64 if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
506     goto ERROR2;
507 frodo 2
508     for (i = 0; i < psiconv_list_length(table); i ++) {
509 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
510 frodo 64 if (!(entry = psiconv_list_get(table,i)))
511     goto ERROR3;
512 frodo 2 if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
513     applid_sec = entry->offset;
514 frodo 18 psiconv_debug(lev+3,sto,
515 frodo 2 "Found the Application ID section at %08x",applid_sec);
516     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
517     page_sec = entry->offset;
518 frodo 18 psiconv_debug(lev+3,sto,
519 frodo 2 "Found the Page Layout section at %08x",page_sec);
520     } else if (entry->id == PSICONV_ID_TEXT_SECTION) {
521     text_sec = entry->offset;
522 frodo 18 psiconv_debug(lev+3,sto, "Found the Text section at %08x",text_sec);
523 frodo 2 } else if (entry->id == PSICONV_ID_PASSWORD_SECTION) {
524     pwd_sec = entry->offset;
525 frodo 18 psiconv_debug(lev+3,sto,
526 frodo 2 "Found the Password section at %08x",pwd_sec);
527 frodo 18 psiconv_warn(lev+3,sto,
528 frodo 2 "Password section found - can't read encrypted data");
529 frodo 64 res = -PSICONV_E_PARSE;
530     goto ERROR3;
531 frodo 2 } else if (entry->id == PSICONV_ID_WORD_STATUS_SECTION) {
532     status_sec = entry->offset;
533 frodo 18 psiconv_debug(lev+3,sto,
534 frodo 2 "Found the Word Status section at %08x",status_sec);
535     } else if (entry->id == PSICONV_ID_WORD_STYLES_SECTION) {
536     styles_sec = entry->offset;
537 frodo 18 psiconv_debug(lev+3,sto,
538 frodo 2 "Found the Word Styles section at %08x",styles_sec);
539     } else if (entry->id == PSICONV_ID_LAYOUT_SECTION) {
540     layout_sec = entry->offset;
541 frodo 18 psiconv_debug(lev+3,sto,
542 frodo 2 "Found the Layout section at %08x",layout_sec);
543     } else {
544 frodo 18 psiconv_warn(lev+3,sto,
545 frodo 64 "Found unknown section in the Section Table (ignoring)");
546 frodo 18 psiconv_debug(lev+3,sto,
547 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
548     }
549     }
550    
551    
552 frodo 18 psiconv_progress(lev+2,sto,
553 frodo 2 "Looking for the Status section");
554     if (!status_sec) {
555 frodo 18 psiconv_warn(lev+2,sto, "Status section not found in the section table");
556 frodo 64 res = -PSICONV_E_PARSE;
557     goto ERROR3;
558 frodo 2 } else {
559 frodo 18 psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec);
560 frodo 64 if ((res = psiconv_parse_word_status_section(buf,lev+2,status_sec,NULL,
561     &((*result)->status_sec))))
562     goto ERROR3;
563 frodo 2 }
564    
565 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
566 frodo 2 if (! applid_sec) {
567 frodo 18 psiconv_warn(lev+2,sto,
568 frodo 2 "Application ID section not found in the section table");
569 frodo 64 res = -PSICONV_E_PARSE;
570     goto ERROR4;
571 frodo 2 } else {
572 frodo 18 psiconv_debug(lev+2,sto,
573 frodo 2 "Application ID section at offset %08x",applid_sec);
574 frodo 64 if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
575     &appl_id)))
576     goto ERROR4;
577 frodo 2 }
578     if ((appl_id->id != PSICONV_ID_WORD) ||
579     strcmp(appl_id->name,"Word.app")) {
580     psiconv_warn(lev+2,applid_sec,
581     "Application ID section contains unexpected data");
582     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
583     PSICONV_ID_WORD,appl_id->id);
584 frodo 64 if (!(temp_str = psiconv_make_printable(appl_id->name)))
585     goto ERROR5;
586 frodo 2 psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
587 frodo 24 "Word.app",temp_str);
588 frodo 2 free(temp_str);
589 frodo 64 res = -PSICONV_E_PARSE;
590     goto ERROR5;
591 frodo 2 }
592    
593 frodo 18 psiconv_progress(lev+2,sto,
594 frodo 2 "Looking for the Page layout section");
595     if (! page_sec) {
596 frodo 18 psiconv_warn(lev+2,sto,
597 frodo 2 "Page layout section not found in the section table");
598 frodo 64 res = -PSICONV_E_PARSE;
599     goto ERROR5;
600 frodo 2 } else {
601 frodo 18 psiconv_debug(lev+2,sto,
602 frodo 2 "Page layout section at offset %08x",page_sec);
603 frodo 64 if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
604     &(*result)->page_sec)))
605     goto ERROR5;
606 frodo 2 }
607    
608 frodo 18 psiconv_progress(lev+2,sto,
609 frodo 2 "Looking for the Word Style section");
610     if (!styles_sec) {
611 frodo 18 psiconv_warn(lev+2,sto,
612 frodo 2 "Word styles section not found in the section table");
613 frodo 64 res = -PSICONV_E_PARSE;
614     goto ERROR6;
615 frodo 2 } else {
616 frodo 18 psiconv_debug(lev+2,sto,
617 frodo 2 "Word styles section at offset %08x",styles_sec);
618 frodo 64 if ((res = psiconv_parse_word_styles_section(buf,lev+2,styles_sec,NULL,
619     &(*result)->styles_sec)))
620     goto ERROR6;
621 frodo 2 }
622    
623 frodo 18 psiconv_progress(lev+2,sto,
624 frodo 2 "Looking for the Text section");
625     if (!text_sec) {
626 frodo 18 psiconv_warn(lev+2,sto, "Text section not found in the section table");
627 frodo 64 res = -PSICONV_E_PARSE;
628     goto ERROR7;
629 frodo 2 } else {
630 frodo 18 psiconv_debug(lev+2,sto,
631 frodo 2 "Text section at offset %08x",text_sec);
632 frodo 64 if ((res = psiconv_parse_text_section(buf,lev+2,text_sec,NULL,
633     &(*result)->paragraphs)))
634     goto ERROR7;
635 frodo 2 }
636    
637 frodo 64 psiconv_progress(lev+2,sto, "Looking for the Layout section");
638     if (!layout_sec) {
639     psiconv_debug(lev+2,sto, "No layout section today");
640     } else {
641 frodo 18 psiconv_debug(lev+2,sto,
642 frodo 64 "Layout section at offset %08x",layout_sec);
643     if ((res = psiconv_parse_styled_layout_section(buf,lev+2,layout_sec,NULL,
644     (*result)->paragraphs,
645     (*result)->styles_sec)))
646     goto ERROR8;
647     }
648 frodo 2
649     psiconv_free_application_id_section(appl_id);
650     psiconv_free_section_table_section(table);
651    
652     psiconv_progress(lev+1,off,"End of word file");
653 frodo 70 return 0;
654 frodo 64
655    
656     ERROR8:
657     psiconv_free_text_and_layout((*result)->paragraphs);
658     ERROR7:
659     psiconv_free_word_styles_section((*result)->styles_sec);
660     ERROR6:
661     psiconv_free_page_layout_section((*result)->page_sec);
662     ERROR5:
663     psiconv_free_application_id_section(appl_id);
664     ERROR4:
665     psiconv_free_word_status_section((*result)->status_sec);
666     ERROR3:
667     psiconv_free_section_table_section(table);
668     ERROR2:
669     free(*result);
670     ERROR1:
671     psiconv_warn(lev+1,off,"Reading of Word File failed");
672     if (res == 0)
673     return -PSICONV_E_NOMEM;
674     else
675     return res;
676 frodo 2 }
677 frodo 94
678     int psiconv_parse_sheet_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
679     psiconv_sheet_f *result)
680     {
681     int res=0;
682     psiconv_section_table_section table;
683     psiconv_application_id_section appl_id;
684     char *temp_str;
685     psiconv_u32 pwd_sec = 0;
686     psiconv_u32 status_sec = 0;
687     psiconv_u32 page_sec = 0;
688     psiconv_u32 applid_sec = 0;
689 frodo 95 psiconv_u32 workbook_sec = 0;
690 frodo 94 psiconv_section_table_entry entry;
691     psiconv_u32 sto;
692     int i;
693    
694     psiconv_progress(lev+1,off,"Going to read a sheet file");
695     if (!(*result = malloc(sizeof(**result))))
696     goto ERROR1;
697    
698     psiconv_progress(lev+2,off,
699     "Going to read the offset of the section table section");
700     sto = psiconv_read_u32(buf,lev+2,off,&res);
701     if (res)
702     goto ERROR2;
703     psiconv_debug(lev+2,off,"Offset: %08x",sto);
704    
705     psiconv_progress(lev+2,sto,
706     "Going to read the section table section");
707     if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
708     goto ERROR2;
709    
710     for (i = 0; i < psiconv_list_length(table); i ++) {
711     psiconv_progress(lev+2,sto, "Going to read entry %d",i);
712     if (!(entry = psiconv_list_get(table,i)))
713     goto ERROR3;
714     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
715     applid_sec = entry->offset;
716     psiconv_debug(lev+3,sto,
717     "Found the Application ID section at %08x",applid_sec);
718     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
719     page_sec = entry->offset;
720     psiconv_debug(lev+3,sto,
721     "Found the Page Layout section at %08x",page_sec);
722     } else if (entry->id == PSICONV_ID_PASSWORD_SECTION) {
723     pwd_sec = entry->offset;
724     psiconv_debug(lev+3,sto,
725     "Found the Password section at %08x",pwd_sec);
726     psiconv_warn(lev+3,sto,
727     "Password section found - can't read encrypted data");
728     res = -PSICONV_E_PARSE;
729     goto ERROR3;
730 frodo 95 } else if (entry->id == PSICONV_ID_SHEET_WORKBOOK_SECTION) {
731     workbook_sec = entry->offset;
732     psiconv_debug(lev+3,sto,
733     "Found the Sheet Workbook section at %08x",workbook_sec);
734 frodo 94 } else if (entry->id == PSICONV_ID_SHEET_STATUS_SECTION) {
735     status_sec = entry->offset;
736     psiconv_debug(lev+3,sto,
737     "Found the Sheet Status section at %08x",status_sec);
738     } else {
739     psiconv_warn(lev+3,sto,
740     "Found unknown section in the Section Table (ignoring)");
741     psiconv_debug(lev+3,sto,
742     "Section ID %08x, offset %08x",entry->id,entry->offset);
743     }
744     }
745    
746    
747     psiconv_progress(lev+2,sto,
748     "Looking for the Status section");
749     if (!status_sec) {
750     psiconv_warn(lev+2,sto, "Status section not found in the section table");
751     res = -PSICONV_E_PARSE;
752     goto ERROR3;
753     } else {
754     psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec);
755     if ((res = psiconv_parse_sheet_status_section(buf,lev+2,status_sec,NULL,
756     &((*result)->status_sec))))
757     goto ERROR3;
758     }
759    
760     psiconv_progress(lev+2,sto, "Looking for the Application ID section");
761     if (! applid_sec) {
762     psiconv_warn(lev+2,sto,
763     "Application ID section not found in the section table");
764     res = -PSICONV_E_PARSE;
765     goto ERROR4;
766     } else {
767     psiconv_debug(lev+2,sto,
768     "Application ID section at offset %08x",applid_sec);
769     if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
770     &appl_id)))
771     goto ERROR4;
772     }
773     if ((appl_id->id != PSICONV_ID_SHEET) ||
774     strcmp(appl_id->name,"Sheet.app")) {
775     psiconv_warn(lev+2,applid_sec,
776     "Application ID section contains unexpected data");
777     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
778     PSICONV_ID_SHEET,appl_id->id);
779     if (!(temp_str = psiconv_make_printable(appl_id->name)))
780     goto ERROR5;
781     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
782 frodo 95 "Sheet.app",temp_str);
783 frodo 94 free(temp_str);
784     res = -PSICONV_E_PARSE;
785     goto ERROR5;
786     }
787    
788     psiconv_progress(lev+2,sto,
789     "Looking for the Page layout section");
790     if (! page_sec) {
791     psiconv_warn(lev+2,sto,
792     "Page layout section not found in the section table");
793     res = -PSICONV_E_PARSE;
794     goto ERROR5;
795     } else {
796     psiconv_debug(lev+2,sto,
797     "Page layout section at offset %08x",page_sec);
798     if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
799     &(*result)->page_sec)))
800     goto ERROR5;
801     }
802    
803 frodo 95 psiconv_progress(lev+2,sto,
804     "Looking for the Sheet Workbook section");
805     if (! workbook_sec) {
806     psiconv_warn(lev+2,sto,
807     "Sheet workbook section not found in the section table");
808     res = -PSICONV_E_PARSE;
809     goto ERROR6;
810     } else {
811     psiconv_debug(lev+2,sto,
812     "Sheet workbook section at offset %08x",page_sec);
813     if ((res = psiconv_parse_sheet_workbook_section(buf,lev+2,workbook_sec,NULL,
814     &(*result)->workbook_sec)))
815     goto ERROR6;
816     }
817    
818 frodo 94 psiconv_free_application_id_section(appl_id);
819     psiconv_free_section_table_section(table);
820    
821     psiconv_progress(lev+1,off,"End of Sheet file");
822     return 0;
823    
824 frodo 95 ERROR6:
825     psiconv_free_page_layout_section((*result)->page_sec);
826 frodo 94 ERROR5:
827     psiconv_free_application_id_section(appl_id);
828     ERROR4:
829     psiconv_free_sheet_status_section((*result)->status_sec);
830     ERROR3:
831     psiconv_free_section_table_section(table);
832     ERROR2:
833     free(*result);
834     ERROR1:
835     psiconv_warn(lev+1,off,"Reading of Sheet File failed");
836     if (res == 0)
837     return -PSICONV_E_NOMEM;
838     else
839     return res;
840     }

frodo@frodo.looijaard.name
ViewVC Help
Powered by ViewVC 1.1.26