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

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