1 /* wvWare
2  * Copyright (C) Caolan McNamara, Dom Lachowicz, and others
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17  * 02111-1307, USA.
18  */
19 
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23 
24 #include <sys/types.h>
25 #include <string.h>
26 #include <stdio.h>
27 #include "wv.h"
28 
29 void
wvGetCOPTS(COPTS * item,wvStream * fd)30 wvGetCOPTS (COPTS * item, wvStream * fd)
31 {
32     U16 temp16;
33     temp16 = read_16ubit (fd);
34 
35     item->fNoTabForInd = temp16 & 0x0001;
36     item->fNoSpaceRaiseLower = (temp16 & 0x0002) >> 1;
37     item->fSuppressSpbfAfterPageBreak = (temp16 & 0x0004) >> 2;
38     item->fWrapTrailSpaces = (temp16 & 0x0008) >> 3;
39     item->fMapPrintTextColor = (temp16 & 0x0010) >> 4;
40     item->fNoColumnBalance = (temp16 & 0x0020) >> 5;
41     item->fConvMailMergeEsc = (temp16 & 0x0040) >> 6;
42     item->fSuppressTopSpacing = (temp16 & 0x0080) >> 7;
43     item->fOrigWordTableRules = (temp16 & 0x0100) >> 8;
44     item->fTransparentMetafiles = (temp16 & 0x0200) >> 9;
45     item->fShowBreaksInFrames = (temp16 & 0x0400) >> 10;
46     item->fSwapBordersFacingPgs = (temp16 & 0x800) >> 11;
47     item->reserved = (temp16 & 0xf000) >> 12;
48 }
49 
50 
51 void
wvInitCOPTS(COPTS * item)52 wvInitCOPTS (COPTS * item)
53 {
54     item->fNoTabForInd = 0;
55     item->fNoSpaceRaiseLower = 0;
56     item->fSuppressSpbfAfterPageBreak = 0;
57     item->fWrapTrailSpaces = 0;
58     item->fMapPrintTextColor = 0;
59     item->fNoColumnBalance = 0;
60     item->fConvMailMergeEsc = 0;
61     item->fSuppressTopSpacing = 0;
62     item->fOrigWordTableRules = 0;
63     item->fTransparentMetafiles = 0;
64     item->fShowBreaksInFrames = 0;
65     item->fSwapBordersFacingPgs = 0;
66     item->reserved = 0;
67 }
68 
69 
70 void
wvGetDOP(wvVersion ver,DOP * dop,U32 fcDop,U32 lcbDop,wvStream * fd)71 wvGetDOP (wvVersion ver, DOP * dop, U32 fcDop, U32 lcbDop, wvStream * fd)
72 {
73     U16 temp16;
74     U32 temp32;
75     int i;
76 
77     if (ver != WORD8)
78 	wvInitDOP (dop);
79 
80     if (lcbDop <= 0)
81 	return;
82     wvStream_goto (fd, fcDop);
83 
84     temp16 = read_16ubit (fd);
85 
86     dop->fFacingPages = temp16 & 0x0001;
87     dop->fWidowControl = (temp16 & 0x0002) >> 1;
88     dop->fPMHMainDoc = (temp16 & 0x0004) >> 2;
89     dop->grfSuppression = (temp16 & 0x18) >> 3;
90     dop->fpc = (temp16 & 0x0060) >> 5;
91     wvTrace (("fpc is %d\n", dop->fpc));
92     dop->reserved1 = (temp16 & 0x0080) >> 7;
93     dop->grpfIhdt = (temp16 & 0xFF00) >> 8;
94 
95     temp16 = read_16ubit (fd);
96 
97     if (ver == WORD2)
98       {
99 	  dop->fFtnRestart = temp16 & 0x0001;
100 	  dop->nFtn = (temp16 & 0xFFFE) >> 1;
101       }
102     else
103       {
104 	  dop->rncFtn = temp16 & 0x0003;
105 	  dop->nFtn = (temp16 & 0xFFFC) >> 2;
106       }
107     temp16 = read_16ubit (fd);
108 
109     if (ver == WORD2)
110       {
111 	  dop->irmBar = temp16 & 0x00FF;
112 	  dop->irmProps = temp16 & 0x8F00 >> 8;
113       }
114     else
115       {
116 	  dop->fOutlineDirtySave = temp16 & 0x0001;
117 	  dop->reserved2 = (temp16 & 0x00FE) >> 1;
118 
119 	  dop->fOnlyMacPics = (temp16 & 0x0100) >> 8;
120 	  dop->fOnlyWinPics = (temp16 & 0x0200) >> 9;
121 	  dop->fLabelDoc = (temp16 & 0x0400) >> 10;
122 	  dop->fHyphCapitals = (temp16 & 0x0800) >> 11;
123 	  dop->fAutoHyphen = (temp16 & 0x1000) >> 12;
124 	  dop->fFormNoFields = (temp16 & 0x2000) >> 13;
125 	  dop->fLinkStyles = (temp16 & 0x4000) >> 14;
126       }
127 
128     dop->fRevMarking = (temp16 & 0x8000) >> 15;
129 
130     temp16 = read_16ubit (fd);
131 
132     dop->fBackup = temp16 & 0x0001;
133     dop->fExactCWords = (temp16 & 0x0002) >> 1;
134     dop->fPagHidden = (temp16 & 0x0004) >> 2;
135     dop->fPagResults = (temp16 & 0x0008) >> 3;
136     dop->fLockAtn = (temp16 & 0x0010) >> 4;
137     dop->fMirrorMargins = (temp16 & 0x0020) >> 5;
138 
139     if (ver == WORD2)
140       {
141 	  dop->fKeepFileFormat = (temp16 & 0x0040) >> 6;
142       }
143     else
144       {
145 	  dop->reserved3 = (temp16 & 0x0040) >> 6;
146       }
147     dop->fDfltTrueType = (temp16 & 0x0080) >> 7;
148     dop->fPagSuppressTopSpacing = (temp16 & 0x0100) >> 8;
149 
150     if (ver == WORD2)
151       {
152 	  dop->fRTLAlignment = (temp16 & 0x0200) >> 9;
153       }
154     else
155       {
156 	  dop->fProtEnabled = (temp16 & 0x0200) >> 9;
157       }
158 
159     /* (Nameless in W2) */
160     dop->fDispFormFldSel = (temp16 & 0x0400) >> 10;
161     dop->fRMView = (temp16 & 0x0800) >> 11;
162     dop->fRMPrint = (temp16 & 0x1000) >> 12;
163     dop->reserved4 = (temp16 & 0x2000) >> 13;
164     dop->fLockRev = (temp16 & 0x4000) >> 14;
165     dop->fEmbedFonts = (temp16 & 0x8000) >> 15;
166 
167     if (ver == WORD2)
168       {
169 	  temp16 = read_16ubit (fd);
170 	  /* nameless to (temp16&0xFE00)>>8 */
171 	  dop->fSpares = read_16ubit (fd);
172 
173       }
174 
175 
176     /*
177        not used in word 8 as far as i know, but are in previous word's
178        not in word 2 either
179      */
180     if (ver > WORD2)
181 	wvGetCOPTS (&dop->copts, fd);
182 
183     dop->dxaTab = read_16ubit (fd);
184 
185     if (ver == WORD2)
186 	dop->ftcDefaultBi = read_16ubit (fd);
187 
188     dop->wSpare = read_16ubit (fd);
189     dop->dxaHotZ = read_16ubit (fd);
190 
191     if (ver > WORD2)
192 	dop->cConsecHypLim = read_16ubit (fd);
193 
194     dop->wSpare2 = read_16ubit (fd);
195     if (ver == WORD2)
196 	dop->wSpare3 = read_16ubit (fd);
197 
198     wvGetDTTM (&dop->dttmCreated, fd);
199     wvGetDTTM (&dop->dttmRevised, fd);
200     wvGetDTTM (&dop->dttmLastPrint, fd);
201 
202     dop->nRevision = read_16ubit (fd);
203     dop->tmEdited = read_32ubit (fd);
204     dop->cWords = read_32ubit (fd);
205     dop->cCh = read_32ubit (fd);
206     dop->cPg = read_16ubit (fd);
207 
208     if (ver == WORD2)
209       {
210 	  dop->rgwSpareDocSum[1] = read_16ubit (fd);
211 	  dop->rgwSpareDocSum[2] = read_16ubit (fd);
212 	  return;		/* No more for Word 2 */
213       }
214     else
215       {
216 	  dop->cParas = read_32ubit (fd);
217       }
218 
219     temp16 = read_16ubit (fd);
220 
221     dop->rncEdn = temp16 & 0x0003;
222     dop->nEdn = (temp16 & 0xFFFC) >> 2;
223 
224     temp16 = read_16ubit (fd);
225 
226     dop->epc = temp16 & 0x0003;
227     dop->nfcFtnRef = (temp16 & 0x003C) >> 2;
228     dop->nfcEdnRef = (temp16 & 0x03C0) >> 6;
229     dop->fPrintFormData = (temp16 & 0x0400) >> 10;
230     dop->fSaveFormData = (temp16 & 0x0800) >> 11;
231     dop->fShadeFormData = (temp16 & 0x1000) >> 12;
232     dop->reserved6 = (temp16 & 0x6000) >> 13;
233     dop->fWCFtnEdn = (temp16 & 0x8000) >> 15;
234 
235     dop->cLines = read_32ubit (fd);
236     dop->cWordsFtnEnd = read_32ubit (fd);
237     dop->cChFtnEdn = read_32ubit (fd);
238     dop->cPgFtnEdn = read_16ubit (fd);
239     dop->cParasFtnEdn = read_32ubit (fd);
240     dop->cLinesFtnEdn = read_32ubit (fd);
241     dop->lKeyProtDoc = read_32ubit (fd);
242 
243 
244     temp16 = read_16ubit (fd);
245 
246     dop->wvkSaved = temp16 & 0x0007;
247     dop->wScaleSaved = (temp16 & 0x0FF8) >> 3;
248     dop->zkSaved = (temp16 & 0x3000) >> 12;
249     dop->fRotateFontW6 = (temp16 & 0x4000) >> 14;
250     dop->iGutterPos = (temp16 & 0x8000) >> 15;
251 
252     if (ver == WORD6)
253       {
254 	  dop->fNoTabForInd = dop->copts.fNoTabForInd;
255 	  dop->fNoSpaceRaiseLower = dop->copts.fNoSpaceRaiseLower;
256 	  dop->fSuppressSpbfAfterPageBreak =
257 	      dop->copts.fSuppressSpbfAfterPageBreak;
258 	  dop->fWrapTrailSpaces = dop->copts.fWrapTrailSpaces;
259 	  dop->fMapPrintTextColor = dop->copts.fMapPrintTextColor;
260 	  dop->fNoColumnBalance = dop->copts.fNoColumnBalance;
261 	  dop->fConvMailMergeEsc = dop->copts.fConvMailMergeEsc;
262 	  dop->fSuppressTopSpacing = dop->copts.fSuppressTopSpacing;
263 	  dop->fOrigWordTableRules = dop->copts.fOrigWordTableRules;
264 	  dop->fTransparentMetafiles = dop->copts.fTransparentMetafiles;
265 	  dop->fShowBreaksInFrames = dop->copts.fShowBreaksInFrames;
266 	  dop->fSwapBordersFacingPgs = dop->copts.fSwapBordersFacingPgs;
267 	  return;
268       }
269 
270 
271 
272     temp32 = read_32ubit (fd);
273 
274     dop->fNoTabForInd = temp32 & 0x00000001;
275     dop->fNoSpaceRaiseLower = (temp32 & 0x00000002) >> 1;
276     dop->fSuppressSpbfAfterPageBreak = (temp32 & 0x00000004) >> 2;
277     dop->fWrapTrailSpaces = (temp32 & 0x00000008) >> 3;
278     dop->fMapPrintTextColor = (temp32 & 0x00000010) >> 4;
279     dop->fNoColumnBalance = (temp32 & 0x00000020) >> 5;
280     dop->fConvMailMergeEsc = (temp32 & 0x00000040) >> 6;
281     dop->fSuppressTopSpacing = (temp32 & 0x00000080) >> 7;
282     dop->fOrigWordTableRules = (temp32 & 0x00000100) >> 8;
283     dop->fTransparentMetafiles = (temp32 & 0x00000200) >> 9;
284     dop->fShowBreaksInFrames = (temp32 & 0x00000400) >> 10;
285     dop->fSwapBordersFacingPgs = (temp32 & 0x00000800) >> 11;
286     dop->reserved7 = (temp32 & 0x0000F000) >> 12;
287     dop->fSuppressTopSpacingMac5 = (temp32 & 0x00010000) >> 16;
288     dop->fTruncDxaExpand = (temp32 & 0x00020000) >> 17;
289     dop->fPrintBodyBeforeHdr = (temp32 & 0x00040000) >> 18;
290     dop->fNoLeading = (temp32 & 0x00080000) >> 19;
291     dop->reserved8 = (temp32 & 0x00100000) >> 20;
292     dop->fMWSmallCaps = (temp32 & 0x00200000) >> 21;
293     dop->reserved9 = (temp32 & 0xFFC00000) >> 22;
294 
295     if (ver == WORD7)
296 	return;
297 
298     dop->adt = read_16ubit (fd);
299     wvGetDOPTYPOGRAPHY (&dop->doptypography, fd);
300     wvGetDOGRID (&dop->dogrid, fd);
301 
302     temp16 = read_16ubit (fd);
303 
304     dop->reserved10 = temp16 & 0x0001;
305     dop->lvl = (temp16 & 0x001E) >> 1;
306     dop->fGramAllDone = (temp16 & 0x0020) >> 5;
307     dop->fGramAllClean = (temp16 & 0x0040) >> 6;
308     dop->fSubsetFonts = (temp16 & 0x0080) >> 7;
309     dop->fHideLastVersion = (temp16 & 0x0100) >> 8;
310     dop->fHtmlDoc = (temp16 & 0x0200) >> 9;
311     dop->reserved11 = (temp16 & 0x0400) >> 10;
312     dop->fSnapBorder = (temp16 & 0x0800) >> 11;
313     dop->fIncludeHeader = (temp16 & 0x1000) >> 12;
314     dop->fIncludeFooter = (temp16 & 0x2000) >> 13;
315     dop->fForcePageSizePag = (temp16 & 0x4000) >> 14;
316     dop->fMinFontSizePag = (temp16 & 0x8000) >> 15;
317 
318     temp16 = read_16ubit (fd);
319 
320     dop->fHaveVersions = temp16 & 0x0001;
321     dop->fAutoVersion = (temp16 & 0x0002) >> 1;
322     dop->reserved11 = (temp16 & 0xFFFC) >> 2;
323 
324     wvGetASUMYI (&dop->asumyi, fd);
325 
326     dop->cChWS = read_32ubit (fd);
327     dop->cChWSFtnEdn = read_32ubit (fd);
328     dop->grfDocEvents = read_32ubit (fd);
329 
330     temp32 = read_32ubit (fd);
331 
332     dop->fVirusPrompted = temp32 & 0x00000001;
333     dop->fVirusLoadSafe = (temp32 & 0x00000002) >> 1;
334     dop->KeyVirusSession30 = (temp32 & 0xFFFFFFFC) >> 2;
335 
336     for (i = 0; i < 30; i++)
337 	dop->Spare[i] = read_8ubit (fd);
338 
339     dop->reserved12 = read_32ubit (fd);
340     dop->reserved13 = read_32ubit (fd);
341     dop->cDBC = read_32ubit (fd);
342     dop->cDBCFtnEdn = read_32ubit (fd);
343     dop->reserved14 = read_32ubit (fd);
344     dop->new_nfcFtnRef = read_16ubit (fd);
345     dop->new_nfcEdnRef = read_16ubit (fd);
346     dop->hpsZoonFontPag = read_16ubit (fd);
347     dop->dywDispPag = read_16ubit (fd);
348 
349     /*
350        if ((dop->fLockAtn) || (dop->fLockRev))
351        wvError(("doc protection key is %x\n",dop->lKeyProtDoc));
352      */
353 }
354 
355 void
wvInitDOP(DOP * dop)356 wvInitDOP (DOP * dop)
357 {
358     int i;
359     dop->fFacingPages = 0;
360     dop->fWidowControl = 0;
361     dop->fPMHMainDoc = 0;
362     dop->grfSuppression = 0;
363     dop->fpc = 0;
364     dop->reserved1 = 0;
365     dop->grpfIhdt = 0;
366     dop->rncFtn = 0;
367     dop->fFtnRestart = 0;
368     dop->nFtn = 0;
369     dop->irmBar = 0;
370     dop->irmProps = 0;
371     dop->fOutlineDirtySave = 0;
372     dop->reserved2 = 0;
373     dop->fOnlyMacPics = 0;
374     dop->fOnlyWinPics = 0;
375     dop->fLabelDoc = 0;
376     dop->fHyphCapitals = 0;
377     dop->fAutoHyphen = 0;
378     dop->fFormNoFields = 0;
379     dop->fLinkStyles = 0;
380     dop->fRevMarking = 0;
381     dop->fBackup = 0;
382     dop->fExactCWords = 0;
383     dop->fPagHidden = 0;
384     dop->fPagResults = 0;
385     dop->fLockAtn = 0;
386     dop->fMirrorMargins = 0;
387     dop->fKeepFileFormat = 0;
388     dop->reserved3 = 0;
389     dop->fDfltTrueType = 0;
390     dop->fPagSuppressTopSpacing = 0;
391     dop->fRTLAlignment = 0;
392     dop->fSpares = 0;
393     dop->fProtEnabled = 0;
394     dop->fDispFormFldSel = 0;
395     dop->fRMView = 0;
396     dop->fRMPrint = 0;
397     dop->reserved4 = 0;
398     dop->fLockRev = 0;
399     dop->fEmbedFonts = 0;
400     wvInitCOPTS (&dop->copts);
401     dop->dxaTab = 0;
402     dop->ftcDefaultBi = 0;
403     dop->wSpare = 0;
404     dop->dxaHotZ = 0;
405     dop->cConsecHypLim = 0;
406     dop->wSpare2 = 0;
407     wvInitDTTM (&dop->dttmCreated);
408     wvInitDTTM (&dop->dttmRevised);
409     wvInitDTTM (&dop->dttmLastPrint);
410     dop->nRevision = 0;
411     dop->tmEdited = 0;
412     dop->cWords = 0;
413     dop->cCh = 0;
414     dop->cPg = 0;
415     dop->cParas = 0;
416     dop->rgwSpareDocSum[1] = 0;
417     dop->rgwSpareDocSum[2] = 0;
418     dop->rncEdn = 0;
419     dop->nEdn = 0;
420     dop->epc = 0;
421     dop->nfcFtnRef = 0;
422     dop->nfcEdnRef = 0;
423     dop->fPrintFormData = 0;
424     dop->fSaveFormData = 0;
425     dop->fShadeFormData = 0;
426     dop->reserved6 = 0;
427     dop->fWCFtnEdn = 0;
428     dop->cLines = 0;
429     dop->cWordsFtnEnd = 0;
430     dop->cChFtnEdn = 0;
431     dop->cPgFtnEdn = 0;
432     dop->cParasFtnEdn = 0;
433     dop->cLinesFtnEdn = 0;
434     dop->lKeyProtDoc = 0;
435     dop->wvkSaved = 0;
436     dop->wScaleSaved = 0;
437     dop->zkSaved = 0;
438     dop->fRotateFontW6 = 0;
439     dop->iGutterPos = 0;
440     dop->fNoTabForInd = 0;
441     dop->fNoSpaceRaiseLower = 0;
442     dop->fSuppressSpbfAfterPageBreak = 0;
443     dop->fWrapTrailSpaces = 0;
444     dop->fMapPrintTextColor = 0;
445     dop->fNoColumnBalance = 0;
446     dop->fConvMailMergeEsc = 0;
447     dop->fSuppressTopSpacing = 0;
448     dop->fOrigWordTableRules = 0;
449     dop->fTransparentMetafiles = 0;
450     dop->fShowBreaksInFrames = 0;
451     dop->fSwapBordersFacingPgs = 0;
452     dop->reserved7 = 0;
453     dop->fSuppressTopSpacingMac5 = 0;
454     dop->fTruncDxaExpand = 0;
455     dop->fPrintBodyBeforeHdr = 0;
456     dop->fNoLeading = 0;
457     dop->reserved8 = 0;
458     dop->fMWSmallCaps = 0;
459     dop->reserved9 = 0;
460     dop->adt = 0;
461     wvInitDOPTYPOGRAPHY (&dop->doptypography);
462     wvInitDOGRID (&dop->dogrid);
463     dop->reserved10 = 0;
464     dop->lvl = 0;
465     dop->fGramAllDone = 0;
466     dop->fGramAllClean = 0;
467     dop->fSubsetFonts = 0;
468     dop->fHideLastVersion = 0;
469     dop->fHtmlDoc = 0;
470     dop->reserved11 = 0;
471     dop->fSnapBorder = 0;
472     dop->fIncludeHeader = 0;
473     dop->fIncludeFooter = 0;
474     dop->fForcePageSizePag = 0;
475     dop->fMinFontSizePag = 0;
476     dop->fHaveVersions = 0;
477     dop->fAutoVersion = 0;
478     dop->reserved11 = 0;
479     wvInitASUMYI (&dop->asumyi);
480     dop->cChWS = 0;
481     dop->cChWSFtnEdn = 0;
482     dop->grfDocEvents = 0;
483     dop->fVirusPrompted = 0;
484     dop->fVirusLoadSafe = 0;
485     dop->KeyVirusSession30 = 0;
486     for (i = 0; i < 30; i++)
487 	dop->Spare[i] = 0;
488     dop->reserved12 = 0;
489     dop->reserved13 = 0;
490     dop->cDBC = 0;
491     dop->cDBCFtnEdn = 0;
492     dop->reserved14 = 0;
493     dop->new_nfcFtnRef = 0;
494     dop->new_nfcEdnRef = 0;
495     dop->hpsZoonFontPag = 0;
496     dop->dywDispPag = 0;
497 }
498