Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "precompile.h"
21 :
22 : #include <comphelper/newarray.hxx>
23 :
24 : #include <list>
25 :
26 : #include "hwpfile.h"
27 : #include "hbox.h"
28 : #include "hpara.h"
29 : #include "drawing.h"
30 : #include "htags.h"
31 : #include "hcode.h"
32 :
33 : static short fboxnum = 1;
34 : static int zindex = 1;
35 : static int lnnumber = 0;
36 :
37 35 : bool HBox::Read(HWPFile & )
38 : {
39 : // already read
40 35 : return true;
41 : }
42 :
43 :
44 : // skip block
45 :
46 0 : bool SkipData::Read(HWPFile & hwpf)
47 : {
48 0 : hwpf.Read4b(&data_block_len, 1);
49 0 : hwpf.Read2b(&dummy, 1);
50 :
51 0 : if (!(IS_SP_SKIP_BLOCK(hh) && (hh == dummy))){
52 0 : return hwpf.SetState(HWP_InvalidFileFormat);
53 : }
54 :
55 0 : data_block = new char[data_block_len];
56 :
57 0 : return hwpf.Read1b(data_block, data_block_len);
58 : }
59 :
60 :
61 : // Field code(5)
62 0 : bool FieldCode::Read(HWPFile & hwpf)
63 : {
64 : uint size;
65 : hchar dummy;
66 : uint len1; /* hchar타입의 문자열 테이터 #1의 길이 */
67 : uint len2; /* hchar타입의 문자열 테이터 #2의 길이 */
68 : uint len3; /* hchar타입의 문자열 테이터 #3의 길이 */
69 : uint binlen; /* 임의 형식의 바이너리 데이타 길이 */
70 :
71 0 : hwpf.Read4b(&size, 1);
72 0 : hwpf.Read2b(&dummy, 1);
73 0 : hwpf.Read1b(&type, 2);
74 0 : hwpf.Read4b(reserved1, 1);
75 0 : hwpf.Read2b(&location_info, 1);
76 0 : hwpf.Read1b(reserved2, 22);
77 0 : hwpf.Read4b(&len1, 1);
78 0 : hwpf.Read4b(&len2, 1);
79 0 : hwpf.Read4b(&len3, 1);
80 0 : hwpf.Read4b(&binlen, 1);
81 :
82 0 : uint const len1_ = ((len1 > 1024) ? 1024 : len1) / sizeof(hchar);
83 0 : uint const len2_ = ((len2 > 1024) ? 1024 : len2) / sizeof(hchar);
84 0 : uint const len3_ = ((len3 > 1024) ? 1024 : len3) / sizeof(hchar);
85 :
86 0 : str1 = new hchar[len1_ ? len1_ : 1];
87 0 : str2 = new hchar[len2_ ? len2_ : 1];
88 0 : str3 = new hchar[len3_ ? len3_ : 1];
89 0 : bin = new char[binlen];
90 :
91 0 : hwpf.Read2b(str1, len1_);
92 0 : hwpf.SkipBlock(len1 - (len1_ * sizeof(hchar)));
93 0 : str1[len1_ ? (len1_ - 1) : 0] = 0;
94 0 : hwpf.Read2b(str2, len2_);
95 0 : hwpf.SkipBlock(len2 - (len2_ * sizeof(hchar)));
96 0 : str2[len2_ ? (len2_ - 1) : 0] = 0;
97 0 : hwpf.Read2b(str3, len3_);
98 0 : hwpf.SkipBlock(len3 - (len3_ * sizeof(hchar)));
99 0 : str3[len3_ ? (len3_ - 1) : 0] = 0;
100 :
101 0 : hwpf.ReadBlock(bin, binlen);
102 :
103 0 : if( type[0] == 3 && type[1] == 2 ){ /* 만든날짜로서 포맷을 생성해야 한다. */
104 0 : DateCode *pDate = new DateCode;
105 0 : for (int i = 0 ; i < static_cast<int>(len3_); i++) {
106 0 : if(str3[i] == 0 ) break;
107 0 : if( i >= DATE_SIZE ) break;
108 0 : pDate->format[i] = str3[i];
109 : }
110 0 : hwpf.AddDateFormat(pDate);
111 0 : m_pDate = pDate;
112 : }
113 :
114 0 : return true;
115 : }
116 :
117 : // book mark(6)
118 0 : bool Bookmark::Read(HWPFile & hwpf)
119 : {
120 : long len;
121 :
122 0 : hwpf.Read4b(&len, 1);
123 0 : if (!hwpf.Read2b(dummy))
124 0 : return false;
125 :
126 0 : if (!(len == 34))// 2 * (BMK_COMMENT_LEN + 1) + 2
127 : {
128 0 : return hwpf.SetState(HWP_InvalidFileFormat);
129 : }
130 0 : if (!(hh == dummy && dummy == CH_BOOKMARK)){
131 0 : return hwpf.SetState(HWP_InvalidFileFormat);
132 : }
133 :
134 0 : hwpf.Read2b(id, BMK_COMMENT_LEN + 1);
135 0 : hwpf.Read2b(&type, 1);
136 0 : return true;
137 : }
138 :
139 : // date format(7)
140 0 : bool DateFormat::Read(HWPFile & hwpf)
141 : {
142 0 : hwpf.Read2b(format, DATE_SIZE);
143 0 : if (!hwpf.Read2b(dummy))
144 0 : return false;
145 0 : if (!(hh == dummy && CH_DATE_FORM == dummy)){
146 0 : return hwpf.SetState(HWP_InvalidFileFormat);
147 : }
148 0 : return true;
149 : }
150 :
151 : // date code(8)
152 0 : bool DateCode::Read(HWPFile & hwpf)
153 : {
154 0 : hwpf.Read2b(format, DATE_SIZE);
155 0 : hwpf.Read2b(date, 6);
156 0 : if (!hwpf.Read2b(dummy))
157 0 : return false;
158 0 : if (!(hh == dummy && CH_DATE_CODE == dummy)){
159 0 : return hwpf.SetState(HWP_InvalidFileFormat);
160 : }
161 0 : hwpf.AddDateFormat(this);
162 0 : return true;
163 : }
164 :
165 : // tab(9)
166 0 : bool Tab::Read(HWPFile & hwpf)
167 : {
168 : unsigned short tmp16;
169 0 : if (!hwpf.Read2b(tmp16))
170 0 : return false;
171 0 : width = tmp16;
172 0 : if (!hwpf.Read2b(leader))
173 0 : return false;
174 0 : if (!hwpf.Read2b(dummy))
175 0 : return false;
176 0 : if (!(hh == dummy && CH_TAB == dummy)){
177 0 : return hwpf.SetState(HWP_InvalidFileFormat);
178 : }
179 0 : return true;
180 : }
181 :
182 : // tbox(10) TABLE BOX MATH BUTTON HYPERTEXT
183 0 : static void UpdateBBox(FBox * fbox)
184 : {
185 0 : fbox->boundsy = fbox->pgy;
186 0 : fbox->boundey = fbox->pgy + fbox->ys - 1;
187 0 : }
188 :
189 0 : void Cell::Read(HWPFile & hwpf)
190 : {
191 0 : hwpf.Read2b(&p, 1);
192 0 : hwpf.Read2b(&color, 1);
193 0 : hwpf.Read2b(&x, 1);
194 0 : hwpf.Read2b(&y, 1);
195 0 : hwpf.Read2b(&w, 1);
196 0 : hwpf.Read2b(&h, 1);
197 0 : hwpf.Read2b(&txthigh, 1);
198 0 : hwpf.Read2b(&cellhigh, 1);
199 :
200 0 : hwpf.Read1b(&flag, 1);
201 0 : hwpf.Read1b(&changed, 1);
202 0 : hwpf.Read1b(&used, 1);
203 0 : hwpf.Read1b(&ver_align, 1);
204 0 : hwpf.Read1b(linetype, 4);
205 0 : hwpf.Read1b(&shade, 1);
206 0 : hwpf.Read1b(&diagonal, 1);
207 0 : hwpf.Read1b(&protect, 1);
208 0 : }
209 :
210 :
211 0 : bool TxtBox::Read(HWPFile & hwpf)
212 : {
213 : int ii, ncell;
214 :
215 0 : hwpf.Read2b(reserved, 2);
216 0 : hwpf.Read2b(&dummy, 1);
217 :
218 0 : if (!(hh == dummy && CH_TEXT_BOX == dummy)){
219 0 : return hwpf.SetState(HWP_InvalidFileFormat);
220 : }
221 0 : hwpf.AddBox(this);
222 0 : hwpf.Read2b(&style.cap_len, 1);
223 0 : hwpf.Read2b(&dummy1, 1);
224 0 : hwpf.Read2b(&next, 1);
225 0 : hwpf.Read2b(&dummy2, 1);
226 :
227 0 : style.boxnum = fboxnum++;
228 0 : zorder = zindex++;
229 0 : hwpf.Read1b(&style.anchor_type, 1);
230 0 : hwpf.Read1b(&style.txtflow, 1);
231 0 : hwpf.Read2b(&style.xpos, 1);
232 0 : hwpf.Read2b(&style.ypos, 1);
233 0 : hwpf.Read2b(&option, 1);
234 0 : hwpf.Read2b(&ctrl_ch, 1);
235 0 : hwpf.Read2b(style.margin, 12);
236 0 : hwpf.AddFBoxStyle(&style);
237 0 : hwpf.Read2b(&box_xs, 1);
238 0 : hwpf.Read2b(&box_ys, 1);
239 0 : hwpf.Read2b(&cap_xs, 1);
240 0 : hwpf.Read2b(&cap_ys, 1);
241 0 : hwpf.Read2b(&style.cap_len, 1);
242 0 : hwpf.Read2b(&xs, 1);
243 0 : hwpf.Read2b(&ys, 1);
244 0 : hwpf.Read2b(&cap_margin, 1);
245 0 : hwpf.Read1b(&xpos_type, 1);
246 0 : hwpf.Read1b(&ypos_type, 1);
247 0 : hwpf.Read1b(&smart_linesp, 1);
248 0 : hwpf.Read1b(&reserved1, 1);
249 0 : hwpf.Read2b(&pgx, 1);
250 0 : hwpf.Read2b(&pgy, 1);
251 0 : hwpf.Read2b(&pgno, 1);
252 0 : if( ( pgno +1 ) != hwpf.getCurrentPage() )
253 0 : pgno = sal::static_int_cast<short>(hwpf.getCurrentPage() -1) ;
254 :
255 0 : hwpf.Read2b(&showpg, 1);
256 0 : hwpf.Read2b(&cap_pos, 1);
257 0 : hwpf.Read2b(&num, 1);
258 0 : hwpf.Read2b(&dummy3, 1);
259 0 : hwpf.Read2b(&baseline, 1);
260 0 : hwpf.Read2b(&type, 1);
261 0 : hwpf.Read2b(&nCell, 1);
262 0 : hwpf.Read2b(&protect, 1);
263 0 : switch (type)
264 : {
265 : case 0: //table
266 0 : style.boxtype = 'T';
267 0 : break;
268 : case 1: // text-box
269 0 : style.boxtype = 'X';
270 0 : break;
271 : case 2: // equation
272 0 : style.boxtype = 'E';
273 0 : break;
274 : case 3: // button
275 0 : style.boxtype = 'B';
276 0 : break;
277 : default: // other
278 0 : style.boxtype = 'O';
279 0 : break;
280 : }
281 :
282 0 : UpdateBBox(this);
283 :
284 0 : ncell = NCell();
285 0 : if (!(ncell > 0)){
286 0 : return hwpf.SetState(HWP_InvalidFileFormat);
287 : }
288 :
289 0 : cell = ::comphelper::newArray_null<Cell>(ncell);
290 0 : if (!cell) {
291 0 : return hwpf.SetState(HWP_InvalidFileFormat);
292 : }
293 0 : for (ii = 0; ii < ncell; ii++)
294 : {
295 0 : cell[ii].Read(hwpf);
296 0 : cell[ii].key = sal::static_int_cast<unsigned char>(ii);
297 : }
298 0 : if (ncell == 1)
299 0 : style.cell = &cell[0];
300 0 : plists = ::comphelper::newArray_null< std::list< HWPPara* > >(ncell);
301 0 : if (!plists) {
302 0 : return hwpf.SetState(HWP_InvalidFileFormat);
303 : }
304 0 : for (ii = 0; ii < ncell; ii++)
305 0 : hwpf.ReadParaList(plists[ii]);
306 : // caption
307 0 : hwpf.ReadParaList(caption);
308 :
309 0 : if( type == 0 ){ // if table?
310 0 : TCell* *pArr = ::comphelper::newArray_null<TCell *>(ncell);
311 0 : if (!pArr) {
312 0 : return hwpf.SetState(HWP_InvalidFileFormat);
313 : }
314 0 : Table *tbl = new Table;
315 0 : for( ii = 0 ; ii < ncell; ii++)
316 : {
317 0 : tbl->columns.insert(cell[ii].x);
318 0 : tbl->columns.insert(cell[ii].x + cell[ii].w);
319 0 : tbl->rows.insert(cell[ii].y);
320 0 : tbl->rows.insert(cell[ii].y + cell[ii].h);
321 : }
322 0 : for( ii = 0 ; ii < ncell; ii++)
323 : {
324 0 : TCell *tcell = new TCell;
325 0 : tcell->nColumnIndex = tbl->columns.getIndex(cell[ii].x);
326 0 : tcell->nColumnSpan = tbl->columns.getIndex(cell[ii].x + cell[ii].w) -
327 0 : tcell->nColumnIndex;
328 0 : tcell->nRowIndex = tbl->rows.getIndex(cell[ii].y);
329 0 : tcell->nRowSpan = tbl->rows.getIndex(cell[ii].y + cell[ii].h) -
330 0 : tcell->nRowIndex;
331 0 : tcell->pCell = &cell[ii];
332 0 : pArr[ii] = tcell;
333 : }
334 : TCell *tmp;
335 : // Sort by row and column
336 0 : for( ii = 0 ; ii < ncell - 1; ii++ ){
337 0 : for( int jj = ii ; jj < ncell ; jj++){
338 0 : if( pArr[ii]->nRowIndex > pArr[jj]->nRowIndex ){
339 0 : tmp = pArr[ii];
340 0 : pArr[ii] = pArr[jj];
341 0 : pArr[jj] = tmp;
342 : }
343 : }
344 0 : for( int kk = ii ; kk > 0 ; kk--){
345 0 : if( ( pArr[kk]->nRowIndex == pArr[kk-1]->nRowIndex ) &&
346 0 : (pArr[kk]->nColumnIndex < pArr[kk-1]->nColumnIndex )){
347 0 : tmp = pArr[kk];
348 0 : pArr[kk] = pArr[kk-1];
349 0 : pArr[kk-1] = tmp;
350 : }
351 : }
352 : }
353 0 : for( ii = 0 ; ii < ncell ; ii++ ){
354 0 : tbl->cells.push_back(pArr[ii]);
355 : }
356 0 : tbl->box = this;
357 0 : hwpf.AddTable(tbl);
358 0 : m_pTable = tbl;
359 0 : delete[] pArr;
360 : }
361 : else
362 0 : m_pTable = 0L;
363 :
364 0 : return !hwpf.State();
365 : }
366 :
367 :
368 : // picture(11)
369 0 : bool Picture::Read(HWPFile & hwpf)
370 : {
371 0 : hwpf.Read2b(reserved, 2);
372 0 : hwpf.Read2b(&dummy, 1);
373 :
374 0 : if (!(hh == dummy && CH_PICTURE == dummy)){
375 0 : return hwpf.SetState(HWP_InvalidFileFormat);
376 : }
377 0 : hwpf.AddBox(this);
378 :
379 0 : hwpf.Read4b(&follow_block_size, 1);
380 0 : hwpf.Read2b(&dummy1, 1); /* 예약 4바이트 */
381 0 : hwpf.Read2b(&dummy2, 1);
382 :
383 0 : style.boxnum = fboxnum++;
384 0 : zorder = zindex++;
385 0 : hwpf.Read1b(&style.anchor_type, 1); /* 기준위치 */
386 0 : hwpf.Read1b(&style.txtflow, 1); /* 그림피함. 0-2(자리차지,투명,어울림) */
387 0 : hwpf.Read2b(&style.xpos, 1); /* 가로위치 : 1 왼쪽, 2오른쪽, 3 가운데, 이외 = 임의 */
388 0 : hwpf.Read2b(&style.ypos, 1); /* 세로위치 : 1 위, 2 아래, 3 가운데, 이외 임의 */
389 0 : hwpf.Read2b(&option, 1); /* 기타옵션 : 테두리,그림반전,등. bit로 저장. */
390 0 : hwpf.Read2b(&ctrl_ch, 1); /* 항상 11 */
391 0 : hwpf.Read2b(style.margin, 12); /* 여백 : [0-2][] out/in/셀,[][0-3] 왼/오른/위/아래 여백 */
392 0 : hwpf.Read2b(&box_xs, 1); /* 박스크기 가로 */
393 0 : hwpf.Read2b(&box_ys, 1); /* 세로 */
394 0 : hwpf.Read2b(&cap_xs, 1); /* 캡션 크기 가로 */
395 0 : hwpf.Read2b(&cap_ys, 1); /* 세로 */
396 0 : hwpf.Read2b(&style.cap_len, 1); /* 길이 */
397 0 : hwpf.Read2b(&xs, 1); /* 전체 크기(박스 크기 + 캡션 + 여백) 가로 */
398 0 : hwpf.Read2b(&ys, 1); /* 세로 */
399 0 : hwpf.Read2b(&cap_margin, 1); /* 캡션 여백 */
400 0 : hwpf.Read1b(&xpos_type, 1);
401 0 : hwpf.Read1b(&ypos_type, 1);
402 0 : hwpf.Read1b(&smart_linesp, 1); /* 줄간격 보호 : 0 미보호, 1 보호 */
403 0 : hwpf.Read1b(&reserved1, 1);
404 0 : hwpf.Read2b(&pgx, 1); /* 실제 계산된 박스 가로 */
405 0 : hwpf.Read2b(&pgy, 1); /* 세로 */
406 0 : hwpf.Read2b(&pgno, 1); /* 페이지 숫자 : 0부터 시작 */
407 0 : hwpf.Read2b(&showpg, 1); /* 박스보여줌 */
408 0 : hwpf.Read2b(&cap_pos, 1); /* 캡션위치 0 - 7 메뉴순서. */
409 0 : hwpf.Read2b(&num, 1); /* 박스번호 0부터 시작해서 매긴일련번호 */
410 :
411 0 : hwpf.Read1b(&pictype, 1); /* 그림종류 */
412 :
413 : unsigned short tmp16;
414 0 : if (!hwpf.Read2b(tmp16)) /* 그림에서 실제 표시를 시작할 위치 가로 */
415 0 : return false;
416 0 : skip[0] = tmp16;
417 0 : if (!hwpf.Read2b(tmp16)) /* 세로 */
418 0 : return false;
419 0 : skip[1] = tmp16;
420 0 : if (!hwpf.Read2b(tmp16)) /* 확대비율 : 0 고정, 이외 퍼센트 단위 가로 */
421 0 : return false;
422 0 : scale[0] = tmp16;
423 0 : if (!hwpf.Read2b(tmp16)) /* 세로 */
424 0 : return false;
425 0 : scale[1] = tmp16;
426 :
427 0 : hwpf.Read1b(picinfo.picun.path, 256); /* 그림파일 이름 : 종류가 Drawing이 아닐때. */
428 0 : hwpf.Read1b(reserved3, 9); /* 밝기/명암/그림효과 등 */
429 :
430 0 : UpdateBBox(this);
431 0 : if( pictype != PICTYPE_DRAW )
432 0 : style.cell = reserved3;
433 :
434 0 : if (follow_block_size != 0)
435 : {
436 0 : follow = new unsigned char[follow_block_size];
437 :
438 0 : hwpf.Read1b(follow, follow_block_size);
439 0 : if (pictype == PICTYPE_DRAW)
440 : {
441 0 : hmem = new HMemIODev(reinterpret_cast<char *>(follow), follow_block_size);
442 0 : LoadDrawingObjectBlock(this);
443 0 : style.cell = picinfo.picdraw.hdo;
444 0 : delete hmem;
445 :
446 0 : hmem = 0;
447 : }
448 : else
449 : {
450 0 : if ((follow[3] << 24 | follow[2] << 16 | follow[1] << 8 | follow[0]) == 0x269)
451 : {
452 0 : ishyper = true;
453 : }
454 : }
455 : }
456 :
457 0 : if( pictype != 3 )
458 0 : style.boxtype = 'G';
459 : else
460 0 : style.boxtype = 'D';
461 0 : hwpf.AddFBoxStyle(&style);
462 :
463 : // cation
464 0 : hwpf.ReadParaList(caption);
465 :
466 0 : return !hwpf.State();
467 : }
468 :
469 : // line(15)
470 0 : Line::Line()
471 : : FBox(CH_LINE)
472 : , dummy(0)
473 : , sx(0)
474 : , sy(0)
475 : , ex(0)
476 : , ey(0)
477 : , width(0)
478 : , shade(0)
479 0 : , color(0)
480 : {
481 0 : }
482 :
483 0 : bool Line::Read(HWPFile & hwpf)
484 : {
485 0 : hwpf.Read2b(reserved, 2);
486 0 : hwpf.Read2b(&dummy, 1);
487 :
488 0 : if (!(hh == dummy && CH_LINE == dummy)){
489 0 : return hwpf.SetState(HWP_InvalidFileFormat);
490 : }
491 0 : hwpf.AddBox(this);
492 :
493 0 : style.boxnum = fboxnum++;
494 0 : zorder = zindex++;
495 0 : style.boxtype = 'L';
496 0 : hwpf.Read1b(&reserved2, 8);
497 0 : hwpf.Read1b(&style.anchor_type, 1);
498 0 : hwpf.Read1b(&style.txtflow, 1);
499 0 : hwpf.Read2b(&style.xpos, 1);
500 0 : hwpf.Read2b(&style.ypos, 1);
501 0 : hwpf.Read2b(&option, 1);
502 0 : hwpf.Read2b(&ctrl_ch, 1);
503 0 : hwpf.Read2b(style.margin, 12);
504 0 : hwpf.AddFBoxStyle(&style);
505 0 : hwpf.Read2b(&box_xs, 1);
506 0 : hwpf.Read2b(&box_ys, 1);
507 0 : hwpf.Read2b(&cap_xs, 1);
508 0 : hwpf.Read2b(&cap_ys, 1);
509 0 : hwpf.Read2b(&style.cap_len, 1);
510 0 : hwpf.Read2b(&xs, 1);
511 0 : hwpf.Read2b(&ys, 1);
512 0 : lnnumber = style.boxnum;
513 0 : hwpf.linenumber = 1;
514 0 : hwpf.Read2b(&boundsy, 1);
515 0 : hwpf.Read2b(&boundey, 1);
516 0 : hwpf.Read1b(&boundx, 1);
517 0 : hwpf.Read1b(&draw, 1);
518 :
519 0 : hwpf.Read2b(&pgx, 1);
520 0 : hwpf.Read2b(&pgy, 1);
521 0 : hwpf.Read2b(&pgno, 1);
522 0 : hwpf.Read2b(&showpg, 1);
523 :
524 0 : hwpf.Read2b(&sx, 1);
525 0 : hwpf.Read2b(&sy, 1);
526 0 : hwpf.Read2b(&ex, 1);
527 0 : hwpf.Read2b(&sy, 1);
528 0 : hwpf.Read2b(&width, 1);
529 0 : hwpf.Read2b(&shade, 1);
530 0 : hwpf.Read2b(&color, 1);
531 0 : style.xpos = width;
532 :
533 0 : return !hwpf.State();
534 : }
535 :
536 : // hidden(15)
537 0 : Hidden::Hidden()
538 : : HBox(CH_HIDDEN)
539 0 : , dummy(0)
540 : {
541 0 : }
542 :
543 0 : bool Hidden::Read(HWPFile & hwpf)
544 : {
545 0 : hwpf.Read2b(reserved, 2);
546 0 : hwpf.Read2b(&dummy, 1);
547 0 : if (!(hh == dummy && CH_HIDDEN == dummy)){
548 0 : return hwpf.SetState(HWP_InvalidFileFormat);
549 : }
550 :
551 0 : hwpf.Read1b(info, 8);
552 0 : hwpf.ReadParaList(plist);
553 :
554 0 : return !hwpf.State();
555 : }
556 :
557 : // header/footer(16)
558 0 : HeaderFooter::HeaderFooter()
559 : : HBox(CH_HEADER_FOOTER)
560 : , dummy(0)
561 : , type(0)
562 : , where(0)
563 : , linenumber(0)
564 0 : , m_nPageNumber(0)
565 : {
566 0 : }
567 :
568 0 : bool HeaderFooter::Read(HWPFile & hwpf)
569 : {
570 0 : hwpf.Read2b(reserved, 2);
571 0 : hwpf.Read2b(&dummy, 1);
572 0 : if (!(hh == dummy && CH_HEADER_FOOTER == dummy)){
573 0 : return hwpf.SetState(HWP_InvalidFileFormat);
574 : }
575 :
576 0 : hwpf.Read1b(info, 8);
577 0 : hwpf.Read1b(&type, 1);
578 0 : hwpf.Read1b(&where, 1);
579 0 : lnnumber = 0;
580 0 : hwpf.ReadParaList(plist, CH_HEADER_FOOTER);
581 0 : linenumber = sal::static_int_cast<unsigned char>(lnnumber);
582 0 : m_nPageNumber = hwpf.getCurrentPage();
583 0 : hwpf.setMaxSettedPage();
584 0 : hwpf.AddHeaderFooter(this);
585 :
586 0 : return !hwpf.State();
587 : }
588 :
589 :
590 : // footnote(17)
591 0 : Footnote::Footnote()
592 : : HBox(CH_FOOTNOTE)
593 : , dummy(0)
594 : , number(0)
595 : , type(0)
596 0 : , width(0)
597 : {
598 0 : }
599 :
600 0 : bool Footnote::Read(HWPFile & hwpf)
601 : {
602 0 : hwpf.Read2b(reserved, 2);
603 0 : hwpf.Read2b(&dummy, 1);
604 0 : if (!(hh == dummy && CH_FOOTNOTE == dummy)){
605 0 : return hwpf.SetState(HWP_InvalidFileFormat);
606 : }
607 :
608 0 : hwpf.Read1b(info, 8);
609 0 : hwpf.Read2b(&number, 1);
610 0 : hwpf.Read2b(&type, 1);
611 : unsigned short tmp16;
612 0 : if (!hwpf.Read2b(tmp16))
613 0 : return false;
614 0 : width = tmp16;
615 0 : hwpf.ReadParaList(plist, CH_FOOTNOTE);
616 :
617 0 : return !hwpf.State();
618 : }
619 :
620 : // auto number(18)
621 0 : AutoNum::AutoNum()
622 : : HBox(CH_AUTO_NUM)
623 : , type(0)
624 : , number(0)
625 0 : , dummy(0)
626 : {
627 0 : }
628 :
629 0 : bool AutoNum::Read(HWPFile & hwpf)
630 : {
631 0 : hwpf.Read2b(&type, 1);
632 0 : hwpf.Read2b(&number, 1);
633 0 : hwpf.Read2b(&dummy, 1);
634 :
635 0 : if (!(hh == dummy)){
636 0 : return hwpf.SetState(HWP_InvalidFileFormat);
637 : }
638 0 : return !hwpf.State();
639 : }
640 :
641 :
642 : // new number(19)
643 0 : NewNum::NewNum()
644 : : HBox(CH_NEW_NUM)
645 : , type(0)
646 : , number(0)
647 0 : , dummy(0)
648 : {
649 0 : }
650 :
651 :
652 0 : bool NewNum::Read(HWPFile & hwpf)
653 : {
654 0 : hwpf.Read2b(&type, 1);
655 0 : hwpf.Read2b(&number, 1);
656 0 : hwpf.Read2b(&dummy, 1);
657 :
658 0 : if (!(hh == dummy)){
659 0 : return hwpf.SetState(HWP_InvalidFileFormat);
660 : }
661 0 : return !hwpf.State();
662 : }
663 :
664 : // show page number (20)
665 0 : ShowPageNum::ShowPageNum()
666 : : HBox(CH_SHOW_PAGE_NUM)
667 : , where(0)
668 : , m_nPageNumber(0)
669 : , shape(0)
670 0 : , dummy(0)
671 : {
672 0 : }
673 :
674 0 : bool ShowPageNum::Read(HWPFile & hwpf)
675 : {
676 0 : hwpf.Read2b(&where, 1);
677 0 : hwpf.Read2b(&shape, 1);
678 0 : hwpf.Read2b(&dummy, 1);
679 :
680 0 : if (!(hh == dummy)){
681 0 : return hwpf.SetState(HWP_InvalidFileFormat);
682 : }
683 0 : m_nPageNumber = hwpf.getCurrentPage();
684 0 : hwpf.setMaxSettedPage();
685 0 : hwpf.AddPageNumber(this);
686 0 : return !hwpf.State();
687 : }
688 :
689 : /* 홀수쪽시작/감추기 (21) */
690 0 : PageNumCtrl::PageNumCtrl()
691 : : HBox(CH_PAGE_NUM_CTRL)
692 : , kind(0)
693 : , what(0)
694 0 : , dummy(0)
695 : {
696 0 : }
697 :
698 0 : bool PageNumCtrl::Read(HWPFile & hwpf)
699 : {
700 0 : hwpf.Read2b(&kind, 1);
701 0 : hwpf.Read2b(&what, 1);
702 0 : hwpf.Read2b(&dummy, 1);
703 :
704 0 : if (!(hh == dummy)){
705 0 : return hwpf.SetState(HWP_InvalidFileFormat);
706 : }
707 0 : return !hwpf.State();
708 : }
709 :
710 : // mail merge(22)
711 0 : MailMerge::MailMerge()
712 : : HBox(CH_MAIL_MERGE)
713 0 : , dummy(0)
714 : {
715 0 : memset(field_name, 0, sizeof(field_name));
716 0 : }
717 :
718 0 : bool MailMerge::Read(HWPFile & hwpf)
719 : {
720 0 : hwpf.Read1b(field_name, 20);
721 0 : hwpf.Read2b(&dummy, 1);
722 :
723 0 : if (!(hh == dummy)){
724 0 : return hwpf.SetState(HWP_InvalidFileFormat);
725 : }
726 0 : return !hwpf.State();
727 : }
728 :
729 : // char compositon(23)
730 0 : Compose::Compose()
731 : : HBox(CH_COMPOSE)
732 0 : , dummy(0)
733 : {
734 0 : }
735 :
736 0 : bool Compose::Read(HWPFile & hwpf)
737 : {
738 0 : hwpf.Read2b(compose, 3);
739 0 : hwpf.Read2b(&dummy, 1);
740 :
741 0 : if (!(hh == dummy)){
742 0 : return hwpf.SetState(HWP_InvalidFileFormat);
743 : }
744 0 : return !hwpf.State();
745 : }
746 :
747 : // hyphen(24)
748 0 : Hyphen::Hyphen()
749 : : HBox(CH_HYPHEN)
750 : , width(0)
751 0 : , dummy(0)
752 : {
753 0 : }
754 :
755 0 : bool Hyphen::Read(HWPFile & hwpf)
756 : {
757 0 : hwpf.Read2b(&width, 1);
758 0 : hwpf.Read2b(&dummy, 1);
759 :
760 0 : if (!(hh == dummy)){
761 0 : return hwpf.SetState(HWP_InvalidFileFormat);
762 : }
763 0 : return !hwpf.State();
764 : }
765 :
766 :
767 : // toc mark(25)
768 0 : TocMark::TocMark()
769 : : HBox(CH_TOC_MARK)
770 : , kind(0)
771 0 : , dummy(0)
772 : {
773 0 : }
774 :
775 :
776 0 : bool TocMark::Read(HWPFile & hwpf)
777 : {
778 0 : hwpf.Read2b(&kind, 1);
779 0 : hwpf.Read2b(&dummy, 1);
780 :
781 0 : if (!(hh == dummy)){
782 0 : return hwpf.SetState(HWP_InvalidFileFormat);
783 : }
784 0 : return !hwpf.State();
785 : }
786 :
787 : // index mark(26)
788 0 : IndexMark::IndexMark()
789 : : HBox(CH_INDEX_MARK)
790 : , pgno(0)
791 0 : , dummy(0)
792 : {
793 0 : memset(keyword1, 0, sizeof(keyword1));
794 0 : memset(keyword2, 0, sizeof(keyword2));
795 0 : }
796 :
797 0 : bool IndexMark::Read(HWPFile & hwpf)
798 : {
799 0 : hwpf.Read2b(&keyword1, 60);
800 0 : hwpf.Read2b(&keyword2, 60);
801 0 : hwpf.Read2b(&pgno, 1);
802 0 : hwpf.Read2b(&dummy, 1);
803 :
804 0 : if (!(hh == dummy)){
805 0 : return hwpf.SetState(HWP_InvalidFileFormat);
806 : }
807 0 : return !hwpf.State();
808 : }
809 :
810 : // outline(28)
811 0 : Outline::Outline()
812 : : HBox(CH_OUTLINE)
813 : , kind(0)
814 : , shape(0)
815 : , level(0)
816 0 : , dummy(0)
817 : {
818 0 : }
819 :
820 0 : bool Outline::Read(HWPFile & hwpf)
821 : {
822 0 : hwpf.Read2b(&kind, 1);
823 0 : hwpf.Read1b(&shape, 1);
824 0 : hwpf.Read1b(&level, 1);
825 0 : hwpf.Read2b(number, 7);
826 0 : hwpf.Read2b(user_shape, 7);
827 0 : hwpf.Read2b(deco, 14);
828 0 : hwpf.Read2b(&dummy, 1);
829 :
830 0 : if (!(hh == dummy)){
831 0 : return hwpf.SetState(HWP_InvalidFileFormat);
832 : }
833 0 : return !hwpf.State();
834 : }
835 :
836 :
837 : /* 묶음 빈칸(30) */
838 0 : KeepSpace::KeepSpace()
839 : : HBox(CH_KEEP_SPACE)
840 0 : , dummy(0)
841 : {
842 0 : }
843 :
844 :
845 0 : bool KeepSpace::Read(HWPFile & hwpf)
846 : {
847 0 : hwpf.Read2b(&dummy, 1);
848 :
849 0 : if (!(hh == dummy)){
850 0 : return hwpf.SetState(HWP_InvalidFileFormat);
851 : }
852 0 : return !hwpf.State();
853 : }
854 :
855 :
856 : /* 고정폭 빈칸(31) */
857 0 : FixedSpace::FixedSpace()
858 : : HBox(CH_FIXED_SPACE)
859 0 : , dummy(0)
860 : {
861 0 : }
862 :
863 :
864 0 : bool FixedSpace::Read(HWPFile & hwpf)
865 : {
866 0 : hwpf.Read2b(&dummy, 1);
867 :
868 0 : if (!(hh == dummy)){
869 0 : return hwpf.SetState(HWP_InvalidFileFormat);
870 : }
871 0 : return !hwpf.State();
872 : }
873 :
874 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|