You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.5 KiB
156 lines
3.5 KiB
/* |
|
* Xournal++ |
|
* |
|
* Loads an .xoj / .xopp document |
|
* |
|
* @author Xournal++ Team |
|
* https://github.com/xournalpp/xournalpp |
|
* |
|
* @license GNU GPLv2 or later |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include "model/Document.h" |
|
#include "model/Image.h" |
|
#include "model/Stroke.h" |
|
#include "model/TexImage.h" |
|
#include "model/Text.h" |
|
|
|
#include <XournalType.h> |
|
|
|
#include <regex> |
|
|
|
#include <zlib.h> |
|
#include <zip.h> |
|
|
|
enum ParserPosition |
|
{ |
|
PARSER_POS_NOT_STARTED = 1, // Waiting for opening <xounal> tag |
|
PARSER_POS_STARTED, // Waiting for Metainfo or contents like <page> |
|
PARSER_POS_IN_PAGE, // Starting page tag read |
|
PARSER_POS_IN_LAYER, // Starting layer tag read |
|
PARSER_POS_IN_STROKE, // Starting layer tag read |
|
PARSER_POS_IN_TEXT, // Starting text tag read |
|
PARSER_POS_IN_IMAGE, // Starting image tag read |
|
PARSER_POS_IN_TEXIMAGE, // Starting latex tag read |
|
|
|
PASER_POS_FINISHED // Document is parsed |
|
}; |
|
|
|
class LoadHandler |
|
{ |
|
public: |
|
LoadHandler(); |
|
virtual ~LoadHandler(); |
|
|
|
public: |
|
Document* loadDocument(string filename); |
|
|
|
string getLastError(); |
|
bool isAttachedPdfMissing(); |
|
string getMissingPdfFilename(); |
|
|
|
void removePdfBackground(); |
|
void setPdfReplacement(string filename, bool attachToDocument); |
|
|
|
private: |
|
void parseStart(); |
|
void parseContents(); |
|
void parsePage(); |
|
void parseLayer(); |
|
void parseAudio(); |
|
|
|
void parseStroke(); |
|
void parseText(); |
|
void parseImage(); |
|
void parseTexImage(); |
|
|
|
private: |
|
void initAttributes(); |
|
|
|
string readLine(); |
|
zip_int64_t readContentFile(char* buffer, zip_uint64_t len); |
|
bool closeFile(); |
|
bool openFile(string filename); |
|
bool parseXml(); |
|
|
|
static void parserText(GMarkupParseContext* context, const gchar* text, gsize text_len, gpointer userdata, |
|
GError** error); |
|
static void parserEndElement(GMarkupParseContext* context, const gchar* element_name, gpointer userdata, |
|
GError** error); |
|
static void parserStartElement(GMarkupParseContext* context, const gchar* element_name, |
|
const gchar** attribute_names, const gchar** attribute_values, |
|
gpointer userdata, GError** error); |
|
|
|
const char* getAttrib(const char* name, bool optional = false); |
|
double getAttribDouble(const char* name); |
|
int getAttribInt(const char* name); |
|
|
|
void parseBgSolid(); |
|
void parseBgPixmap(); |
|
void parseBgPdf(); |
|
void parseAttachment(); |
|
|
|
void readImage(const gchar* base64string, gsize base64stringLen); |
|
void readTexImage(const gchar* base64string, gsize base64stringLen); |
|
|
|
private: |
|
string parseBase64(const gchar* base64, gsize lenght); |
|
bool readZipAttachment(string filename, gpointer& data, gsize& length); |
|
string getTempFileForPath(string filename); |
|
|
|
private: |
|
XOJ_TYPE_ATTRIB; |
|
|
|
string lastError; |
|
string pdfMissing; |
|
bool attachedPdfMissing; |
|
|
|
bool removePdfBackgroundFlag; |
|
string pdfReplacementFilename; |
|
bool pdfReplacementAttach; |
|
|
|
string filename; |
|
|
|
bool pdfFilenameParsed; |
|
|
|
ParserPosition pos; |
|
|
|
string creator; |
|
int fileVersion; |
|
int minimalFileVersion; |
|
|
|
zip_t* zipFp; |
|
zip_file_t* zipContentFile; |
|
gzFile gzFp; |
|
bool isGzFile = false; |
|
|
|
vector<double> pressureBuffer; |
|
|
|
PageRef page; |
|
Layer* layer; |
|
Stroke* stroke; |
|
Text* text; |
|
Image* image; |
|
TexImage* teximage; |
|
GHashTable* audioFiles = nullptr; |
|
|
|
const char* endRootTag = "xournal"; |
|
|
|
string xournalFilename; |
|
|
|
GError* error; |
|
const gchar** attributeNames; |
|
const gchar** attributeValues; |
|
const gchar* elementName; |
|
|
|
int loadedTimeStamp; |
|
string loadedFilename; |
|
|
|
DocumentHandler dHanlder; |
|
Document doc; |
|
|
|
friend class LoadHandlerHelper; |
|
}; |
|
|
|
|