46eb2fa586
...now that it is gone from libc++ 16 trunk since
<aeecef08c3
>
"[libc++] Remove default definition of std::char_traits", causing
> In file included from hwpfilter/source/formula.cxx:20:
> In file included from hwpfilter/source/formula.h:23:
> In file included from workdir/UnoApiHeadersTarget/offapi/normal/com/sun/star/xml/sax/XDocumentHandler.hpp:6:
> In file included from workdir/UnoApiHeadersTarget/offapi/normal/com/sun/star/xml/sax/XDocumentHandler.hdl:6:
> In file included from workdir/UnoApiHeadersTarget/udkapi/normal/com/sun/star/uno/XInterface.hdl:6:
> In file included from include/com/sun/star/uno/Any.h:30:
> In file included from include/rtl/ustring.hxx:34:
> In file included from ~/llvm/inst/bin/../include/c++/v1/ostream:170:
> In file included from ~/llvm/inst/bin/../include/c++/v1/bitset:131:
> ~/llvm/inst/bin/../include/c++/v1/string:676:46: error: implicit instantiation of undefined template 'std::char_traits<unsigned short>'
> static_assert(( is_same<_CharT, typename traits_type::char_type>::value),
> ^
> hwpfilter/source/hwplib.h:47:10: note: in instantiation of template class 'std::basic_string<unsigned short>' requested here
> if (s.length() > o3tl::make_unsigned(std::numeric_limits<sal_Int32>::max())) {
> ^
> ~/llvm/inst/bin/../include/c++/v1/__fwd/string.h:22:29: note: template is declared here
> struct _LIBCPP_TEMPLATE_VIS char_traits;
> ^
Change-Id: Ied437a079cb66c8b49f9980ab29b59ec5e2097d3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143238
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
333 lines
9.6 KiB
C++
333 lines
9.6 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
|
|
// hwpfile.h
|
|
// (C) 1998 Mizi Research, All rights are reserved
|
|
|
|
|
|
#ifndef INCLUDED_HWPFILTER_SOURCE_HWPFILE_H
|
|
#define INCLUDED_HWPFILTER_SOURCE_HWPFILE_H
|
|
|
|
#include <algorithm>
|
|
#include <memory>
|
|
#include <vector>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <fcntl.h>
|
|
#include <sal/types.h>
|
|
#include "hwplib.h"
|
|
#include "hfont.h"
|
|
#include "hstyle.h"
|
|
#include "hpara.h"
|
|
|
|
#define HWPIDLen 30
|
|
#define V20SIGNATURE "HWP Document File V2.00 \032\1\2\3\4\5"
|
|
#define V21SIGNATURE "HWP Document File V2.10 \032\1\2\3\4\5"
|
|
#define V30SIGNATURE "HWP Document File V3.00 \032\1\2\3\4\5"
|
|
|
|
#define HWP_V20 20
|
|
#define HWP_V21 21
|
|
#define HWP_V30 30
|
|
|
|
int detect_hwp_version(const char *str);
|
|
|
|
struct FBox;
|
|
struct EmPicture;
|
|
struct HyperText;
|
|
struct FBoxStyle;
|
|
struct CellLine;
|
|
struct Cell;
|
|
struct OlePicture;
|
|
struct Picture;
|
|
struct HeaderFooter;
|
|
struct ShowPageNum;
|
|
struct DateCode;
|
|
struct Table;
|
|
|
|
class HIODev;
|
|
class HWPInfo;
|
|
class HWPFont;
|
|
class HWPStyle;
|
|
class HWPPara;
|
|
class HStream;
|
|
|
|
struct ColumnInfo{
|
|
int start_page;
|
|
bool bIsSet;
|
|
std::shared_ptr<ColumnDef> xColdef;
|
|
explicit ColumnInfo(int num){
|
|
start_page = num;
|
|
bIsSet = false;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* The HWPFile class is the main class of hwp for reading file
|
|
* information from stream
|
|
*
|
|
* The example is as below:
|
|
* <pre>
|
|
* HWPFile f;
|
|
* f.ReadHwpFile( stream );
|
|
* </pre>
|
|
*
|
|
* There are two way to read hwp information from stream, one is to read all at a time
|
|
* to use @ref ReadhwpFile() method like above example, other is to read partial information
|
|
* to use @ref Open(), @ref InfoRead(), @ref FontRead(), @ref StyleRead(), @ref ParaListRead(), @ref TagsRead(),
|
|
*
|
|
* @short HWP file management object
|
|
*/
|
|
class DLLEXPORT HWPFile
|
|
{
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
HWPFile();
|
|
~HWPFile();
|
|
|
|
public:
|
|
|
|
/**
|
|
* Opens HStream to use it.
|
|
* @returns 0 if success, otherwise error code
|
|
* @see State()
|
|
*/
|
|
int Open( std::unique_ptr<HStream> );
|
|
|
|
/**
|
|
* Say current state
|
|
* @returns 0 if normal, otherwise error code. If it's bigger than USER_ERROR_BIT, it is internally using error, otherwise it's system error which is able to get the message @ref strerror() method.
|
|
*/
|
|
int State( void ) const { return error_code;}
|
|
/**
|
|
* Sets the current state
|
|
*/
|
|
int SetState(int errcode);
|
|
/**
|
|
* Reads one byte from HIODev
|
|
*/
|
|
bool Read1b(unsigned char &out);
|
|
bool Read1b(char &out);
|
|
/**
|
|
* Reads two byte from HIODev
|
|
*/
|
|
bool Read2b(unsigned short &out);
|
|
bool Read2b(char16_t &out);
|
|
/**
|
|
* Reads four byte from HIODev
|
|
*/
|
|
bool Read4b(unsigned int &out);
|
|
bool Read4b(int &out);
|
|
/**
|
|
* Reads nmemb short type array from HIODev
|
|
*/
|
|
size_t Read2b(void *ptr, size_t nmemb);
|
|
|
|
/**
|
|
* Reads some bytes from HIODev not regarding endian's way
|
|
* @param size Amount for reading
|
|
*/
|
|
size_t ReadBlock( void *ptr, size_t size );
|
|
/**
|
|
* Skips some bytes from HIODev
|
|
*/
|
|
size_t SkipBlock( size_t size );
|
|
/**
|
|
* Reads main paragraph list
|
|
*/
|
|
void ReadParaList(std::vector<std::unique_ptr<HWPPara>> &aplist, unsigned char flag = 0);
|
|
void ReadParaList(std::vector<HWPPara*> &aplist);
|
|
/**
|
|
* Sets if the stream is compressed
|
|
*/
|
|
void SetCompressed( bool );
|
|
/**
|
|
* Sets current HIODev
|
|
*/
|
|
std::unique_ptr<HIODev> SetIODevice( std::unique_ptr<HIODev> hiodev );
|
|
|
|
/**
|
|
* Reads all information of hwp file from stream
|
|
*/
|
|
int ReadHwpFile( std::unique_ptr<HStream> );
|
|
/**
|
|
* Reads document information of hwp file from HIODev
|
|
*/
|
|
void InfoRead(void);
|
|
/**
|
|
* Reads font list of hwp file from HIODev
|
|
*/
|
|
void FontRead(void);
|
|
/**
|
|
* Reads style list of hwp file from HIODev
|
|
*/
|
|
void StyleRead(void);
|
|
/**
|
|
* Reads paragraph list of hwp file from HIODev
|
|
*/
|
|
void ParaListRead();
|
|
/* 그림 등의 추가 정보를 읽는다. */
|
|
/**
|
|
* Reads additional information like embedded image of hwp file from HIODev
|
|
*/
|
|
void TagsRead();
|
|
|
|
enum Paper
|
|
{
|
|
UserPaper = 0,
|
|
Col80Paper = 1,
|
|
Col132Paper = 2,
|
|
A4Paper = 3,
|
|
LetterPaper = 4,
|
|
B5Paper = 5,
|
|
B4Paper = 6,
|
|
LegalPaper = 7,
|
|
A3Paper = 8
|
|
};
|
|
|
|
void AddPage(){ m_nCurrentPage++;}
|
|
void AddColumnInfo();
|
|
void SetColumnDef(std::shared_ptr<ColumnDef> const &);
|
|
void AddParaShape(std::shared_ptr<ParaShape> const &);
|
|
void AddCharShape(std::shared_ptr<CharShape> const &);
|
|
void AddFBoxStyle(FBoxStyle *);
|
|
void AddDateFormat(DateCode *);
|
|
void AddHeaderFooter(HeaderFooter *);
|
|
void AddPageNumber(ShowPageNum *);
|
|
void AddTable(std::unique_ptr<Table>);
|
|
|
|
ColumnDef* GetColumnDef(int);
|
|
int GetPageMasterNum(int page);
|
|
|
|
int getCurrentPage() const{ return m_nCurrentPage;}
|
|
HWPInfo& GetHWPInfo(void) { return _hwpInfo; }
|
|
HWPFont& GetHWPFont(void) { return _hwpFont; }
|
|
HWPStyle& GetHWPStyle(void) { return _hwpStyle; }
|
|
HWPPara *GetFirstPara(void) { return !plist.empty() ? plist.front().get() : nullptr; }
|
|
|
|
EmPicture *GetEmPicture(Picture *pic);
|
|
EmPicture *GetEmPictureByName(char * name);
|
|
HyperText *GetHyperText();
|
|
ParaShape *getParaShape(int);
|
|
CharShape *getCharShape(int);
|
|
FBoxStyle *getFBoxStyle(int);
|
|
DateCode *getDateCode(int);
|
|
HeaderFooter *getHeaderFooter(int);
|
|
ShowPageNum *getPageNumber(int);
|
|
Table *getTable(int);
|
|
|
|
int getParaShapeCount() const{ return pslist.size(); }
|
|
int getCharShapeCount() const{ return cslist.size(); }
|
|
int getFBoxStyleCount() const{ return fbslist.size(); }
|
|
int getDateFormatCount() const{ return datecodes.size(); }
|
|
int getHeaderFooterCount() const{ return headerfooters.size(); }
|
|
int getPageNumberCount() const{ return pagenumbers.size(); }
|
|
int getTableCount() const{ return tables.size(); }
|
|
int getColumnCount() const{ return columnlist.size(); }
|
|
|
|
int getMaxSettedPage() const{ return m_nMaxSettedPage; }
|
|
void setMaxSettedPage(){ m_nMaxSettedPage = m_nCurrentPage; }
|
|
|
|
void push_hpara_type(unsigned char scflag) { element_import_stack.push_back(scflag); }
|
|
bool already_importing_type(unsigned char scflag) const
|
|
{
|
|
return std::find(element_import_stack.begin(), element_import_stack.end(), scflag) != element_import_stack.end();
|
|
}
|
|
void pop_hpara_type() { element_import_stack.pop_back(); }
|
|
|
|
void move_to_failed(std::unique_ptr<HWPPara> rPara);
|
|
|
|
private:
|
|
int compareCharShape(CharShape const *shape);
|
|
int compareParaShape(ParaShape const *shape);
|
|
|
|
public:
|
|
int version;
|
|
bool compressed;
|
|
bool encrypted;
|
|
unsigned char linenumber;
|
|
int info_block_len;
|
|
int error_code;
|
|
std::unique_ptr<OlePicture> oledata;
|
|
unsigned char scratch[SAL_MAX_UINT16];
|
|
int readdepth;
|
|
|
|
private:
|
|
/* hwp 파일 이름 */
|
|
int m_nCurrentPage;
|
|
int m_nMaxSettedPage;
|
|
std::unique_ptr<HIODev> hiodev;
|
|
// read hwp contents
|
|
HWPInfo _hwpInfo;
|
|
HWPFont _hwpFont;
|
|
HWPStyle _hwpStyle;
|
|
std::vector<std::unique_ptr<ColumnInfo>> columnlist;
|
|
// paragraph list
|
|
std::vector<std::unique_ptr<HWPPara>> plist;
|
|
// keep paragraph's that failed to load until
|
|
// import is complete to avoid dangling references
|
|
// elsewhere
|
|
std::vector<std::unique_ptr<HWPPara>> pfailedlist;
|
|
// embedded picture list(tag data)
|
|
std::vector<std::unique_ptr<EmPicture>> emblist;
|
|
std::vector<std::unique_ptr<HyperText>> hyperlist;
|
|
int currenthyper;
|
|
std::vector<std::shared_ptr<ParaShape>> pslist;
|
|
std::vector<std::shared_ptr<CharShape>> cslist;
|
|
std::vector<FBoxStyle*> fbslist;
|
|
std::vector<DateCode*> datecodes;
|
|
std::vector<HeaderFooter*> headerfooters;
|
|
std::vector<ShowPageNum*> pagenumbers;
|
|
std::vector<std::unique_ptr<Table>> tables;
|
|
//track the stack of HParas types we're currently importing
|
|
std::vector<unsigned char> element_import_stack;
|
|
|
|
// for global document handling
|
|
static HWPFile *cur_doc;
|
|
friend HWPFile *GetCurrentDoc(void);
|
|
friend HWPFile *SetCurrentDoc(HWPFile *);
|
|
};
|
|
|
|
class DLLEXPORT DepthGuard
|
|
{
|
|
private:
|
|
HWPFile& m_rFile;
|
|
public:
|
|
DepthGuard(HWPFile &rFile)
|
|
: m_rFile(rFile)
|
|
{
|
|
++m_rFile.readdepth;
|
|
}
|
|
bool toodeep() const
|
|
{
|
|
return m_rFile.readdepth == 512;
|
|
}
|
|
~DepthGuard()
|
|
{
|
|
--m_rFile.readdepth;
|
|
}
|
|
};
|
|
|
|
HWPFile *GetCurrentDoc(void);
|
|
HWPFile *SetCurrentDoc(HWPFile *hwpfp);
|
|
#endif // INCLUDED_HWPFILTER_SOURCE_HWPFILE_H
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|