LCOV - code coverage report
Current view: top level - hwpfilter/source - hwpfile.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 197 362 54.4 %
Date: 2015-06-13 12:38:46 Functions: 31 50 62.0 %
Legend: Lines: hit not hit

          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 <stdio.h>
      23             : #include <stdlib.h>
      24             : #include <string.h>
      25             : #include <errno.h>
      26             : #include "hwplib.h"
      27             : #include "hwpfile.h"
      28             : #include "hiodev.h"
      29             : #include "hfont.h"
      30             : #include "hstyle.h"
      31             : #include "hbox.h"
      32             : #include "hpara.h"
      33             : #include "htags.h"
      34             : #include "hcode.h"
      35             : #include "hstream.hxx"
      36             : 
      37             : #include <osl/diagnose.h>
      38             : 
      39             : HWPFile *HWPFile::cur_doc = 0;
      40             : static int ccount = 0;
      41             : static int pcount = 0;
      42             : static int datecodecount = 0;
      43             : 
      44          86 : HWPFile::HWPFile()
      45             :     : version(HWP_V30)
      46             :     , compressed(false)
      47             :     , encrypted(false)
      48             :     , linenumber(0)
      49             :     , info_block_len(0)
      50             :     , error_code(HWP_NoError)
      51             :     , oledata(0)
      52             :     , m_nCurrentPage(1)
      53             :     , m_nMaxSettedPage(0)
      54             :     , hiodev(0)
      55          86 :     , currenthyper(0)
      56             : {
      57          86 :     SetCurrentDoc(this);
      58          86 : }
      59             : 
      60         172 : HWPFile::~HWPFile()
      61             : {
      62          86 :     delete oledata;
      63          86 :     delete hiodev;
      64             : 
      65          86 :     std::list < ColumnInfo* >::iterator it_column = columnlist.begin();
      66          87 :     for (; it_column != columnlist.end(); ++it_column)
      67           1 :         delete *it_column;
      68             : 
      69          86 :     std::list < HWPPara* >::iterator it = plist.begin();
      70          88 :     for (; it != plist.end(); ++it)
      71           2 :         delete *it;
      72             : 
      73          86 :     std::list < Table* >::iterator tbl = tables.begin();
      74          86 :     for (; tbl != tables.end(); ++tbl)
      75           0 :         delete *tbl;
      76             : 
      77          86 :     std::list < HyperText* >::iterator hyp = hyperlist.begin();
      78          86 :     for (; hyp != hyperlist.end(); ++hyp)
      79             :     {
      80           0 :         delete *hyp;
      81             :     }
      82          86 : }
      83             : 
      84           2 : int HWPFile::ReadHwpFile(HStream * stream)
      85             : {
      86           2 :     if (Open(stream) != HWP_NoError)
      87           1 :         return State();
      88           1 :     InfoRead();
      89           1 :     FontRead();
      90           1 :     StyleRead();
      91           1 :     AddColumnInfo();
      92           1 :     ParaListRead();
      93           1 :     TagsRead();
      94             : 
      95           1 :     return State();
      96             : }
      97             : 
      98          86 : int detect_hwp_version(const char *str)
      99             : {
     100          86 :     if (memcmp(V20SIGNATURE, str, HWPIDLen) == 0)
     101           0 :         return HWP_V20;
     102          86 :     else if (memcmp(V21SIGNATURE, str, HWPIDLen) == 0)
     103           0 :         return HWP_V21;
     104          86 :     else if (memcmp(V30SIGNATURE, str, HWPIDLen) == 0)
     105           1 :         return HWP_V30;
     106          85 :     return 0;
     107             : }
     108             : 
     109             : // HIODev wrapper
     110             : 
     111           2 : int HWPFile::Open(HStream * stream)
     112             : {
     113           2 :     HStreamIODev *hstreamio = new HStreamIODev(stream);
     114             : 
     115           2 :     if (!hstreamio->open())
     116             :     {
     117           0 :         delete hstreamio;
     118             : 
     119           0 :         return SetState(HWP_EMPTY_FILE);
     120             :     }
     121             : 
     122           2 :     HIODev *pPrev = SetIODevice(hstreamio);
     123           2 :     delete pPrev;
     124             : 
     125             :     char idstr[HWPIDLen];
     126             : 
     127           4 :     if (ReadBlock(idstr, HWPIDLen) <= 0
     128           2 :         || HWP_V30 != (version = detect_hwp_version(idstr)))
     129             :     {
     130           1 :         return SetState(HWP_UNSUPPORTED_VERSION);
     131             :     }
     132           1 :     return HWP_NoError;
     133             : }
     134             : 
     135           1 : int HWPFile::SetState(int errcode)
     136             : {
     137           1 :     error_code = errcode;
     138           1 :     return error_code;
     139             : }
     140             : 
     141           0 : bool HWPFile::Read1b(unsigned char &out)
     142             : {
     143           0 :     return hiodev && hiodev->read1b(out);
     144             : }
     145             : 
     146           0 : bool HWPFile::Read1b(char &out)
     147             : {
     148             :     unsigned char tmp8;
     149           0 :     if (!Read1b(tmp8))
     150           0 :         return false;
     151           0 :     out = tmp8;
     152           0 :     return true;
     153             : }
     154             : 
     155         768 : bool HWPFile::Read2b(unsigned short &out)
     156             : {
     157         768 :     return hiodev && hiodev->read2b(out);
     158             : }
     159             : 
     160           2 : bool HWPFile::Read4b(unsigned int &out)
     161             : {
     162           2 :     return hiodev && hiodev->read4b(out);
     163             : }
     164             : 
     165           1 : bool HWPFile::Read4b(int &out)
     166             : {
     167             :     unsigned int tmp32;
     168           1 :     if (!Read4b(tmp32))
     169           0 :         return false;
     170           1 :     out = tmp32;
     171           1 :     return true;
     172             : }
     173             : 
     174        1411 : int HWPFile::Read1b(void *ptr, size_t nmemb)
     175             : {
     176        1411 :     return hiodev ? hiodev->read1b(ptr, nmemb) : 0;
     177             : }
     178             : 
     179          32 : int HWPFile::Read2b(void *ptr, size_t nmemb)
     180             : {
     181          32 :     return hiodev ? hiodev->read2b(ptr, nmemb) : 0;
     182             : }
     183             : 
     184             : 
     185           3 : int HWPFile::Read4b(void *ptr, size_t nmemb)
     186             : {
     187           3 :     return hiodev ? hiodev->read4b(ptr, nmemb) : 0;
     188             : }
     189             : 
     190             : 
     191         717 : size_t HWPFile::ReadBlock(void *ptr, size_t size)
     192             : {
     193         717 :     return hiodev ? hiodev->readBlock(ptr, size) : 0;
     194             : }
     195             : 
     196             : 
     197           0 : size_t HWPFile::SkipBlock(size_t size)
     198             : {
     199           0 :     return hiodev ? hiodev->skipBlock(size) : 0;
     200             : }
     201             : 
     202             : 
     203           1 : bool HWPFile::SetCompressed(bool flag)
     204             : {
     205           1 :     return hiodev && hiodev->setCompressed(flag);
     206             : }
     207             : 
     208             : 
     209           2 : HIODev *HWPFile::SetIODevice(HIODev * new_hiodev)
     210             : {
     211           2 :     HIODev *old_hiodev = hiodev;
     212             : 
     213           2 :     hiodev = new_hiodev;
     214             : 
     215           2 :     return old_hiodev;
     216             : }
     217             : 
     218             : 
     219             : // end of HIODev wrapper
     220             : 
     221           1 : bool HWPFile::InfoRead()
     222             : {
     223           1 :     return _hwpInfo.Read(*this);
     224             : }
     225             : 
     226             : 
     227           1 : bool HWPFile::FontRead()
     228             : {
     229           1 :     return _hwpFont.Read(*this);
     230             : }
     231             : 
     232             : 
     233           1 : bool HWPFile::StyleRead()
     234             : {
     235           1 :     return _hwpStyle.Read(*this);
     236             : }
     237             : 
     238             : 
     239           1 : bool HWPFile::ParaListRead()
     240             : {
     241           1 :     return ReadParaList(plist);
     242             : }
     243             : 
     244           1 : bool HWPFile::ReadParaList(std::list < HWPPara* > &aplist, unsigned char flag)
     245             : {
     246           1 :     HWPPara *spNode = new HWPPara;
     247             :      unsigned char tmp_etcflag;
     248           1 :      unsigned char prev_etcflag = 0;
     249           4 :     while (spNode->Read(*this, flag))
     250             :     {
     251           2 :          if( !(spNode->etcflag & 0x04) ){
     252           2 :           tmp_etcflag = spNode->etcflag;
     253           2 :           spNode->etcflag = prev_etcflag;
     254           2 :           prev_etcflag = tmp_etcflag;
     255             :          }
     256           2 :         if (spNode->nch && spNode->reuse_shape)
     257             :         {
     258           0 :             if (!aplist.empty()){
     259           0 :                      spNode->pshape = aplist.back()->pshape;
     260             :                 }
     261             :                 else{
     262           0 :                      spNode->nch = 0;
     263           0 :                      spNode->reuse_shape = 0;
     264             :                 }
     265             :         }
     266           2 :           spNode->pshape.pagebreak = spNode->etcflag;
     267           2 :           if( spNode->nch )
     268           2 :                 AddParaShape( &spNode->pshape );
     269             : 
     270           2 :         if (!aplist.empty())
     271           1 :             aplist.back()->SetNext(spNode);
     272           2 :         aplist.push_back(spNode);
     273           2 :         spNode = new HWPPara;
     274             :     }
     275           1 :     delete spNode;
     276             : 
     277           1 :     return true;
     278             : }
     279             : 
     280           1 : void HWPFile::TagsRead()
     281             : {
     282             :     while (true)
     283             :     {
     284             :         uint tag;
     285           1 :         if (!Read4b(tag))
     286           1 :             return;
     287             :         int size;
     288           1 :         if (!Read4b(size))
     289           0 :             return;
     290           1 :         if (size <= 0 && tag > 0){
     291           0 :             continue;
     292             :           }
     293             : 
     294           1 :         if (tag == FILETAG_END_OF_COMPRESSED ||
     295           0 :             tag == FILETAG_END_OF_UNCOMPRESSED)
     296           1 :             return;
     297           0 :         switch (tag)
     298             :         {
     299             :             case FILETAG_EMBEDDED_PICTURE:
     300             :             {
     301           0 :                 EmPicture *emb = new EmPicture(size);
     302             : 
     303           0 :                 if (emb->Read(*this))
     304           0 :                     emblist.push_back(emb);
     305             :                 else
     306           0 :                     delete emb;
     307             :             }
     308           0 :             break;
     309             :             case FILETAG_OLE_OBJECT:
     310           0 :                 if (oledata)
     311           0 :                     delete oledata;
     312           0 :                 oledata = new OlePicture(size);
     313           0 :                 oledata->Read(*this);
     314           0 :                 break;
     315             :             case FILETAG_HYPERTEXT:
     316             :             {
     317           0 :                 if( (size % 617) != 0 )
     318           0 :                     SkipBlock( size );
     319             :                 else
     320             :                 {
     321           0 :                     for( int i = 0 ; i < size/617 ; i++)
     322             :                     {
     323           0 :                         HyperText *hypert = new HyperText;
     324           0 :                         hypert->Read(*this);
     325           0 :                         hyperlist.push_back(hypert);
     326             :                     }
     327             :                 }
     328           0 :                 break;
     329             :             }
     330             :                 case 6:
     331             :                 {
     332           0 :                      ReadBlock(_hwpInfo.back_info.reserved1, 8);
     333           0 :                      if (!Read4b(_hwpInfo.back_info.luminance))
     334           0 :                         return;
     335           0 :                      if (!Read4b(_hwpInfo.back_info.contrast))
     336           0 :                         return;
     337           0 :                      if (!Read1b(_hwpInfo.back_info.effect))
     338           0 :                         return;
     339           0 :                      ReadBlock(_hwpInfo.back_info.reserved2, 7);
     340           0 :                      ReadBlock(_hwpInfo.back_info.filename, 260);
     341           0 :                      ReadBlock(_hwpInfo.back_info.color, 3);
     342             :                      unsigned short nFlag;
     343           0 :                      if (!Read2b(nFlag))
     344           0 :                         return;
     345           0 :                      _hwpInfo.back_info.flag = nFlag >> 8 ;
     346             :                      int nRange;
     347           0 :                      if (!Read4b(nRange))
     348           0 :                         return;
     349           0 :                      _hwpInfo.back_info.range = nRange >> 24;
     350           0 :                      ReadBlock(_hwpInfo.back_info.reserved3, 27);
     351           0 :                      if (!Read4b(_hwpInfo.back_info.size))
     352           0 :                         return;
     353             : 
     354           0 :                      _hwpInfo.back_info.data = new char[(unsigned int)_hwpInfo.back_info.size];
     355           0 :                      ReadBlock(_hwpInfo.back_info.data, _hwpInfo.back_info.size);
     356             : 
     357           0 :                      if( _hwpInfo.back_info.size > 0 )
     358           0 :                           _hwpInfo.back_info.type = 2;
     359           0 :                      else if( _hwpInfo.back_info.filename[0] )
     360           0 :                           _hwpInfo.back_info.type = 1;
     361             :                      else
     362           0 :                           _hwpInfo.back_info.type = 0;
     363             : 
     364             : 
     365           0 :                      _hwpInfo.back_info.isset = true;
     366             : 
     367           0 :                      break;
     368             :                 }
     369             :             case FILETAG_PRESENTATION:
     370             :             case FILETAG_PREVIEW_IMAGE:
     371             :             case FILETAG_PREVIEW_TEXT:
     372             :             default:
     373           0 :                 SkipBlock(size);
     374             :         }
     375           0 :     }
     376             : }
     377             : 
     378             : 
     379           1 : ColumnDef *HWPFile::GetColumnDef(int num)
     380             : {
     381           1 :     std::list<ColumnInfo*>::iterator it = columnlist.begin();
     382             : 
     383           1 :     for(int i = 0; it != columnlist.end() ; ++it, i++){
     384           1 :         if( i == num )
     385           1 :           break;
     386             :     }
     387             : 
     388           1 :     if( it != columnlist.end() )
     389           1 :         return (*it)->coldef;
     390             :     else
     391           0 :         return 0;
     392             : }
     393             : /* @return 인덱스는 1부터 시작한다. */
     394           1 : int HWPFile::GetPageMasterNum(int page)
     395             : {
     396           1 :     std::list<ColumnInfo*>::iterator it = columnlist.begin();
     397             :     int i;
     398             : 
     399           2 :     for( i = 1 ; it != columnlist.end() ; ++it, i++){
     400           1 :         ColumnInfo *now = *it;
     401           1 :         if( page < now->start_page )
     402           0 :             return i-1;
     403             :     }
     404           1 :     return i-1;
     405             : }
     406             : 
     407           0 : HyperText *HWPFile::GetHyperText()
     408             : {
     409           0 :     std::list<HyperText*>::iterator it = hyperlist.begin();
     410             : 
     411           0 :     for( int i = 0; it != hyperlist.end(); ++it, i++ ){
     412           0 :         if( i == currenthyper )
     413           0 :           break;
     414             :     }
     415             : 
     416           0 :     currenthyper++;
     417           0 :     return it != hyperlist.end() ? *it : NULL;
     418             : }
     419             : 
     420           0 : EmPicture *HWPFile::GetEmPicture(Picture * pic)
     421             : {
     422           0 :     char *name = pic->picinfo.picembed.embname;
     423             : 
     424           0 :     name[0] = 'H';
     425           0 :     name[1] = 'W';
     426           0 :     name[2] = 'P';
     427             : 
     428           0 :     std::list < EmPicture* >::iterator it = emblist.begin();
     429           0 :     for (; it != emblist.end(); ++it)
     430           0 :         if (strcmp(name, (*it)->name) == 0)
     431           0 :             return *it;
     432           0 :     return 0;
     433             : }
     434             : 
     435           0 : EmPicture *HWPFile::GetEmPictureByName(char * name)
     436             : {
     437           0 :     name[0] = 'H';
     438           0 :     name[1] = 'W';
     439           0 :     name[2] = 'P';
     440             : 
     441           0 :     std::list < EmPicture* >::iterator it = emblist.begin();
     442           0 :     for (; it != emblist.end(); ++it)
     443           0 :         if (strcmp(name, (*it)->name) == 0)
     444           0 :             return *it;
     445           0 :     return 0;
     446             : }
     447             : 
     448             : 
     449           0 : void HWPFile::AddBox(FBox * box)
     450             : {
     451             : // LATER if we don't use box->next(),
     452             : // AddBox() and GetBoxHead() are useless;
     453           0 :     if (!blist.empty())
     454             :     {
     455           0 :         box->prev = blist.back();
     456           0 :         box->prev->next = box;
     457             :     }
     458             :     else
     459           0 :         box->prev = 0;
     460           0 :     blist.push_back(box);
     461           0 : }
     462             : 
     463             : 
     464           2 : ParaShape *HWPFile::getParaShape(int index)
     465             : {
     466           2 :     std::list<ParaShape*>::iterator it = pslist.begin();
     467             : 
     468           2 :     for( int i = 0; it != pslist.end(); ++it, i++ ){
     469           2 :         if( i == index )
     470           2 :           break;
     471             :     }
     472             : 
     473           2 :     return it != pslist.end() ? *it : NULL;
     474             : }
     475             : 
     476             : 
     477           4 : CharShape *HWPFile::getCharShape(int index)
     478             : {
     479           4 :     std::list<CharShape*>::iterator it = cslist.begin();
     480             : 
     481           4 :     for( int i = 0; it != cslist.end(); ++it, i++ ){
     482           4 :         if( i == index )
     483           4 :           break;
     484             :     }
     485             : 
     486           4 :     return it != cslist.end() ? *it : 0;
     487             : }
     488             : 
     489             : 
     490           0 : FBoxStyle *HWPFile::getFBoxStyle(int index)
     491             : {
     492           0 :     std::list<FBoxStyle*>::iterator it = fbslist.begin();
     493             : 
     494           0 :     for( int i = 0; it != fbslist.end(); ++it, i++ ){
     495           0 :         if( i == index )
     496           0 :           break;
     497             :     }
     498             : 
     499           0 :     return it != fbslist.end() ? *it : 0;
     500             : }
     501             : 
     502           0 : DateCode *HWPFile::getDateCode(int index)
     503             : {
     504           0 :     std::list<DateCode*>::iterator it = datecodes.begin();
     505             : 
     506           0 :     for( int i = 0; it != datecodes.end(); ++it, i++ ){
     507           0 :         if( i == index )
     508           0 :           break;
     509             :     }
     510             : 
     511           0 :     return it != datecodes.end() ? *it : NULL;
     512             : }
     513             : 
     514           0 : HeaderFooter *HWPFile::getHeaderFooter(int index)
     515             : {
     516           0 :     std::list<HeaderFooter*>::iterator it = headerfooters.begin();
     517             : 
     518           0 :     for( int i = 0; it != headerfooters.end(); ++it, i++ ){
     519           0 :         if( i == index )
     520           0 :           break;
     521             :     }
     522             : 
     523           0 :     return it != headerfooters.end() ? *it : NULL;
     524             : }
     525             : 
     526           0 : ShowPageNum *HWPFile::getPageNumber(int index)
     527             : {
     528           0 :     std::list<ShowPageNum*>::iterator it = pagenumbers.begin();
     529             : 
     530           0 :     for( int i = 0; it != pagenumbers.end(); ++it, i++ ){
     531           0 :         if( i == index )
     532           0 :           break;
     533             :     }
     534             : 
     535           0 :     return it != pagenumbers.end() ? *it : NULL;
     536             : 
     537             : }
     538             : 
     539           0 : Table *HWPFile::getTable(int index)
     540             : {
     541           0 :     std::list<Table*>::iterator it = tables.begin();
     542             : 
     543           0 :     for( int i = 0; it != tables.end(); ++it, i++ ){
     544           0 :         if( i == index )
     545           0 :           break;
     546             :     }
     547             : 
     548           0 :     return it != tables.end() ? *it : NULL;
     549             : }
     550             : 
     551           2 : void HWPFile::AddParaShape(ParaShape * pshape)
     552             : {
     553           2 :     int nscount = 0;
     554          68 :     for(int j = 0 ; j < MAXTABS-1 ; j++)
     555             :     {
     556          68 :           if( j > 0 && pshape->tabs[j].position == 0 )
     557           2 :                 break;
     558          66 :           if( pshape->tabs[0].position == 0 ){
     559         132 :                 if( pshape->tabs[j].type || pshape->tabs[j].dot_continue ||
     560          66 :                      (pshape->tabs[j].position != 1000 *j) )
     561           0 :                           nscount = j;
     562             :           }
     563             :           else{
     564           0 :                 if( pshape->tabs[j].type || pshape->tabs[j].dot_continue ||
     565           0 :                      (pshape->tabs[j].position != 1000 * (j + 1)) )
     566           0 :                           nscount = j;
     567             :           }
     568             :     }
     569           2 :     if( nscount )
     570           0 :         pshape->tabs[MAXTABS-1].type = sal::static_int_cast<char>(nscount);
     571           2 :      int value = compareParaShape(pshape);
     572           2 :     if( value == 0 || nscount )
     573             :     {
     574           1 :         pshape->index = ++pcount;
     575           1 :         pslist.push_back(pshape);
     576             :     }
     577             :     else
     578           1 :         pshape->index = value;
     579           2 : }
     580             : 
     581             : 
     582           4 : void HWPFile::AddCharShape(CharShape * cshape)
     583             : {
     584           4 :     int value = compareCharShape(cshape);
     585           4 :     if( value == 0 )
     586             :     {
     587           1 :         cshape->index = ++ccount;
     588           1 :         cslist.push_back(cshape);
     589             :     }
     590             :     else
     591           3 :         cshape->index = value;
     592           4 : }
     593             : 
     594           1 : void HWPFile::AddColumnInfo()
     595             : {
     596           1 :     ColumnInfo *cinfo = new ColumnInfo(m_nCurrentPage);
     597           1 :     columnlist.push_back(cinfo);
     598           1 :     setMaxSettedPage();
     599           1 : }
     600             : 
     601           0 : void HWPFile::SetColumnDef(ColumnDef *coldef)
     602             : {
     603           0 :     ColumnInfo *cinfo = columnlist.back();
     604           0 :     if( cinfo->bIsSet )
     605           0 :         return;
     606           0 :     cinfo->coldef = coldef;
     607           0 :     cinfo->bIsSet = true;
     608             : }
     609             : 
     610           0 : void HWPFile::AddDateFormat(DateCode * hbox)
     611             : {
     612           0 :     hbox->key = sal::static_int_cast<char>(++datecodecount);
     613           0 :     datecodes.push_back(hbox);
     614           0 : }
     615             : 
     616           0 : void HWPFile::AddPageNumber(ShowPageNum * hbox)
     617             : {
     618           0 :     pagenumbers.push_back(hbox);
     619           0 : }
     620             : 
     621           0 : void HWPFile::AddHeaderFooter(HeaderFooter * hbox)
     622             : {
     623           0 :     headerfooters.push_back(hbox);
     624           0 : }
     625             : 
     626           0 : void HWPFile::AddTable(Table * hbox)
     627             : {
     628           0 :     tables.push_back(hbox);
     629           0 : }
     630             : 
     631           0 : void HWPFile::AddFBoxStyle(FBoxStyle * fbstyle)
     632             : {
     633           0 :     fbslist.push_back(fbstyle);
     634           0 : }
     635             : 
     636           4 : int HWPFile::compareCharShape(CharShape *shape)
     637             : {
     638           4 :     int count = cslist.size();
     639           4 :     if( count > 0 )
     640             :     {
     641           3 :         for(int i = 0; i< count; i++)
     642             :         {
     643           3 :             CharShape *cshape = getCharShape(i);
     644             : 
     645           6 :             if( shape->size == cshape->size &&
     646           6 :                 shape->font[0] == cshape->font[0] &&
     647           6 :                 shape->ratio[0] == cshape->ratio[0] &&
     648           6 :                 shape->space[0] == cshape->space[0] &&
     649           6 :                 shape->color[1] == cshape->color[1] &&
     650           6 :                 shape->color[0] == cshape->color[0] &&
     651           6 :                 shape->shade == cshape->shade &&
     652           3 :                 shape->attr == cshape->attr )
     653             :             {
     654           3 :                 return cshape->index;
     655             :             }
     656             :         }
     657             :     }
     658           1 :     return 0;
     659             : }
     660             : 
     661             : 
     662           2 : int HWPFile::compareParaShape(ParaShape *shape)
     663             : {
     664           2 :     int count = pslist.size();
     665           2 :     if( count > 0 )
     666             :     {
     667           1 :         for(int i = 0; i< count; i++)
     668             :         {
     669           1 :             ParaShape *pshape = getParaShape(i);
     670           2 :             if( shape->left_margin == pshape->left_margin &&
     671           2 :                 shape->right_margin == pshape->right_margin &&
     672           2 :                 shape->pspacing_prev == pshape->pspacing_prev &&
     673           2 :                 shape->pspacing_next == pshape->pspacing_next &&
     674           2 :                 shape->indent == pshape->indent &&
     675           2 :                 shape->lspacing == pshape->lspacing &&
     676           2 :                 shape->arrange_type == pshape->arrange_type &&
     677           2 :                 shape->outline == pshape->outline  &&
     678           1 :                      shape->pagebreak == pshape->pagebreak)
     679             :             {
     680           2 :                     if( shape->cshape && pshape->cshape &&
     681           2 :                          shape->cshape->size == pshape->cshape->size &&
     682           2 :                          shape->cshape->font[0] == pshape->cshape->font[0] &&
     683           2 :                          shape->cshape->ratio[0] == pshape->cshape->ratio[0] &&
     684           2 :                          shape->cshape->space[0] == pshape->cshape->space[0] &&
     685           2 :                          shape->cshape->color[1] == pshape->cshape->color[1] &&
     686           2 :                          shape->cshape->color[0] == pshape->cshape->color[0] &&
     687           2 :                          shape->cshape->shade == pshape->cshape->shade &&
     688           1 :                          shape->cshape->attr == pshape->cshape->attr )
     689             :                     {
     690           1 :                          return pshape->index;
     691             :                     }
     692             :             }
     693             :         }
     694             :     }
     695           1 :     return 0;
     696             : }
     697             : 
     698             : 
     699           0 : HWPFile *GetCurrentDoc()
     700             : {
     701           0 :     return HWPFile::cur_doc;
     702             : }
     703             : 
     704             : 
     705          86 : HWPFile *SetCurrentDoc(HWPFile * hwpfp)
     706             : {
     707          86 :     HWPFile *org = HWPFile::cur_doc;
     708             : 
     709          86 :     HWPFile::cur_doc = hwpfp;
     710          86 :     return org;
     711             : }
     712             : 
     713             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11