summaryrefslogtreecommitdiffstats
path: root/hwpfilter/source/hwpfile.h
diff options
context:
space:
mode:
Diffstat (limited to 'hwpfilter/source/hwpfile.h')
-rw-r--r--hwpfilter/source/hwpfile.h332
1 files changed, 332 insertions, 0 deletions
diff --git a/hwpfilter/source/hwpfile.h b/hwpfilter/source/hwpfile.h
new file mode 100644
index 000000000..72d22a5ae
--- /dev/null
+++ b/hwpfilter/source/hwpfile.h
@@ -0,0 +1,332 @@
+/* -*- 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);
+/**
+ * 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: */