mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Merge branch 'hotfix/v9.0.4' into feature/libheif
This commit is contained in:
@ -195,7 +195,7 @@
|
||||
},
|
||||
{
|
||||
"folder": "../../../../PdfFile/SrcWriter/",
|
||||
"files": ["AcroForm.cpp", "Annotation.cpp", "Catalog.cpp", "Destination.cpp", "Document.cpp", "Encrypt.cpp", "EncryptDictionary.cpp", "Field.cpp", "Font.cpp", "Font14.cpp", "FontCidTT.cpp", "FontTT.cpp", "FontTTWriter.cpp", "GState.cpp", "Image.cpp", "Info.cpp", "Metadata.cpp", "Objects.cpp", "Outline.cpp", "Pages.cpp", "Pattern.cpp", "ResourcesDictionary.cpp", "Shading.cpp", "States.cpp", "Streams.cpp", "Utils.cpp"]
|
||||
"files": ["AcroForm.cpp", "Annotation.cpp", "Catalog.cpp", "Destination.cpp", "Document.cpp", "Encrypt.cpp", "EncryptDictionary.cpp", "Field.cpp", "Font.cpp", "Font14.cpp", "FontCidTT.cpp", "FontOTWriter.cpp", "FontTT.cpp", "FontTTWriter.cpp", "GState.cpp", "Image.cpp", "Info.cpp", "Metadata.cpp", "Objects.cpp", "Outline.cpp", "Pages.cpp", "Pattern.cpp", "ResourcesDictionary.cpp", "Shading.cpp", "States.cpp", "Streams.cpp", "Utils.cpp"]
|
||||
},
|
||||
{
|
||||
"folder": "../../../../PdfFile/Resources/",
|
||||
|
||||
@ -717,6 +717,7 @@ SOURCES += \
|
||||
$$PDF_ROOT_DIR/SrcWriter/FontCidTT.cpp \
|
||||
$$PDF_ROOT_DIR/SrcWriter/FontTT.cpp \
|
||||
$$PDF_ROOT_DIR/SrcWriter/FontTTWriter.cpp \
|
||||
$$PDF_ROOT_DIR/SrcWriter/FontOTWriter.cpp \
|
||||
$$PDF_ROOT_DIR/SrcWriter/GState.cpp \
|
||||
$$PDF_ROOT_DIR/SrcWriter/Image.cpp \
|
||||
$$PDF_ROOT_DIR/SrcWriter/Info.cpp \
|
||||
|
||||
@ -40,7 +40,7 @@ var UpdateFontsSource = {
|
||||
function CFile()
|
||||
{
|
||||
this.nativeFile = 0;
|
||||
this.stream = [];
|
||||
this.stream = -1;
|
||||
this.stream_size = 0;
|
||||
this.type = -1;
|
||||
this.pages = [];
|
||||
@ -128,17 +128,17 @@ CFile.prototype["close"] = function()
|
||||
this.pages = [];
|
||||
this.info = null;
|
||||
this.StartID = null;
|
||||
for (let i = 0; i < this.stream.length; i++)
|
||||
this._free(this.stream[i]);
|
||||
this.stream = [];
|
||||
if (this.stream > 0)
|
||||
this._free(this.stream);
|
||||
this.stream = -1;
|
||||
self.drawingFile = null;
|
||||
};
|
||||
|
||||
CFile.prototype["getFileBinary"] = function()
|
||||
{
|
||||
if (this.stream.length == 0)
|
||||
if (0 >= this.stream)
|
||||
return "";
|
||||
return new Uint8Array(Module["HEAP8"].buffer, this.stream[0], this.stream_size);
|
||||
return new Uint8Array(Module["HEAP8"].buffer, this.stream, this.stream_size);
|
||||
};
|
||||
|
||||
CFile.prototype["isNeedPassword"] = function()
|
||||
@ -1566,8 +1566,13 @@ CFile.prototype["readAnnotationsInfoFromBinary"] = function(AnnotInfo)
|
||||
CFile.prototype["scanPage"] = function(page, mode)
|
||||
{
|
||||
let ptr = this._scanPage(page, mode);
|
||||
let reader = ptr.getReader();
|
||||
if (mode == 2) {
|
||||
data = ptr.getMemory(true);
|
||||
ptr.free();
|
||||
return data;
|
||||
}
|
||||
|
||||
let reader = ptr.getReader();
|
||||
if (!reader) return [];
|
||||
|
||||
let shapesCount = reader.readInt();
|
||||
|
||||
@ -101,9 +101,8 @@ CFile.prototype._openFile = function(buffer, password)
|
||||
{
|
||||
let data = new Uint8Array(buffer);
|
||||
this.stream_size = data.length;
|
||||
let stream = Module["_malloc"](this.stream_size);
|
||||
Module["HEAP8"].set(data, stream);
|
||||
this.stream.push(stream);
|
||||
this.stream = Module["_malloc"](this.stream_size);
|
||||
Module["HEAP8"].set(data, this.stream);
|
||||
}
|
||||
|
||||
let passwordPtr = 0;
|
||||
@ -114,7 +113,7 @@ CFile.prototype._openFile = function(buffer, password)
|
||||
Module["HEAP8"].set(passwordBuf, passwordPtr);
|
||||
}
|
||||
|
||||
this.nativeFile = Module["_Open"](this.stream[0], this.stream_size, passwordPtr);
|
||||
this.nativeFile = Module["_Open"](this.stream, this.stream_size, passwordPtr);
|
||||
|
||||
if (passwordPtr)
|
||||
Module["_free"](passwordPtr);
|
||||
@ -128,7 +127,7 @@ CFile.prototype._closeFile = function()
|
||||
|
||||
CFile.prototype._getType = function()
|
||||
{
|
||||
return Module["_GetType"](this.stream[0], this.stream_size);
|
||||
return Module["_GetType"](this.nativeFile);
|
||||
};
|
||||
|
||||
CFile.prototype._getError = function()
|
||||
@ -180,10 +179,7 @@ CFile.prototype._MergePages = function(buffer, maxID, prefixForm)
|
||||
}
|
||||
|
||||
let bRes = Module["_MergePages"](this.nativeFile, stream2, data.length, maxID, prefixPtr);
|
||||
if (bRes == 1)
|
||||
this.stream.push(stream2);
|
||||
else
|
||||
Module["_free"](stream2);
|
||||
stream2 = 0; // Success or not, stream2 is either taken or freed
|
||||
|
||||
if (prefixPtr)
|
||||
Module["_free"](prefixPtr);
|
||||
@ -193,13 +189,7 @@ CFile.prototype._MergePages = function(buffer, maxID, prefixForm)
|
||||
|
||||
CFile.prototype._UndoMergePages = function()
|
||||
{
|
||||
let bRes = Module["_UnmergePages"](this.nativeFile);
|
||||
if (bRes == 1)
|
||||
{
|
||||
let str = this.stream.pop();
|
||||
Module["_free"](str);
|
||||
}
|
||||
return bRes == 1;
|
||||
return Module["_UnmergePages"](this.nativeFile) == 1;
|
||||
};
|
||||
|
||||
// FONTS
|
||||
|
||||
@ -68,25 +68,6 @@ WASM_EXPORT int IsFontBinaryExist(char* path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
WASM_EXPORT int GetType(BYTE* data, LONG size)
|
||||
{
|
||||
// 0 - PDF
|
||||
// 1 - DJVU
|
||||
// 2 - XPS
|
||||
LONG nHeaderSearchSize = 1024;
|
||||
LONG nSize = size < nHeaderSearchSize ? size : nHeaderSearchSize;
|
||||
char* pData = (char*)data;
|
||||
for (int i = 0; i < nSize - 5; ++i)
|
||||
{
|
||||
int nPDF = strncmp(&pData[i], "%PDF-", 5);
|
||||
if (!nPDF)
|
||||
return 0;
|
||||
}
|
||||
if ( (8 <= size) && (0x41 == data[0] && 0x54 == data[1] && 0x26 == data[2] && 0x54 == data[3] &&
|
||||
0x46 == data[4] && 0x4f == data[5] && 0x52 == data[6] && 0x4d == data[7]))
|
||||
return 1;
|
||||
return 2;
|
||||
}
|
||||
WASM_EXPORT CDrawingFile* Open(BYTE* data, LONG size, const char* password)
|
||||
{
|
||||
if (!g_applicationFonts)
|
||||
@ -102,6 +83,13 @@ WASM_EXPORT CDrawingFile* Open(BYTE* data, LONG size, const char* password)
|
||||
pFile->OpenFile(data, size, sPassword);
|
||||
return pFile;
|
||||
}
|
||||
WASM_EXPORT int GetType(CDrawingFile* pFile)
|
||||
{
|
||||
// 0 - PDF
|
||||
// 1 - DJVU
|
||||
// 2 - XPS
|
||||
return pFile->GetType();
|
||||
}
|
||||
WASM_EXPORT int GetErrorCode(CDrawingFile* pFile)
|
||||
{
|
||||
if (!pFile)
|
||||
@ -111,6 +99,7 @@ WASM_EXPORT int GetErrorCode(CDrawingFile* pFile)
|
||||
WASM_EXPORT void Close(CDrawingFile* pFile)
|
||||
{
|
||||
delete pFile;
|
||||
g_applicationFonts->GetStreams()->Clear();
|
||||
NSFonts::NSApplicationFontStream::SetGlobalMemoryStorage(NULL);
|
||||
}
|
||||
WASM_EXPORT BYTE* GetInfo(CDrawingFile* pFile)
|
||||
|
||||
@ -1022,9 +1022,9 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
}
|
||||
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
|
||||
// SPLIT & MERGE
|
||||
BYTE* pSplitPages = NULL;
|
||||
BYTE* pFileMerge = NULL;
|
||||
if (false)
|
||||
{
|
||||
int nBufferLen = NULL;
|
||||
@ -1036,12 +1036,19 @@ int main(int argc, char* argv[])
|
||||
BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen);
|
||||
int nLength = READ_INT(pSplitPages);
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split1.pdf"))
|
||||
oFile.WriteFile(pSplitPages + 4, nLength - 4);
|
||||
oFile.CloseFile();
|
||||
if (nLength > 4)
|
||||
{
|
||||
NSFile::CFileBinary oFile;
|
||||
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split1.pdf"))
|
||||
oFile.WriteFile(pSplitPages + 4, nLength - 4);
|
||||
oFile.CloseFile();
|
||||
|
||||
MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge1");
|
||||
BYTE* pMallocData = (BYTE*)malloc(nLength - 4);
|
||||
memcpy(pMallocData, pSplitPages + 4, nLength - 4);
|
||||
|
||||
MergePages(pGrFile, pMallocData, nLength - 4, 0, "merge1");
|
||||
}
|
||||
RELEASEARRAYOBJECTS(pSplitPages);
|
||||
}
|
||||
RELEASEARRAYOBJECTS(pBuffer);
|
||||
|
||||
@ -1051,12 +1058,19 @@ int main(int argc, char* argv[])
|
||||
BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen);
|
||||
int nLength = READ_INT(pSplitPages);
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split2.pdf"))
|
||||
oFile.WriteFile(pSplitPages + 4, nLength - 4);
|
||||
oFile.CloseFile();
|
||||
if (nLength > 4)
|
||||
{
|
||||
NSFile::CFileBinary oFile;
|
||||
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split2.pdf"))
|
||||
oFile.WriteFile(pSplitPages + 4, nLength - 4);
|
||||
oFile.CloseFile();
|
||||
|
||||
MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge2");
|
||||
BYTE* pMallocData = (BYTE*)malloc(nLength - 4);
|
||||
memcpy(pMallocData, pSplitPages + 4, nLength - 4);
|
||||
|
||||
MergePages(pGrFile, pMallocData, nLength - 4, 0, "merge2");
|
||||
}
|
||||
RELEASEARRAYOBJECTS(pSplitPages);
|
||||
}
|
||||
RELEASEARRAYOBJECTS(pBuffer);
|
||||
}
|
||||
@ -2053,10 +2067,6 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
|
||||
Close(pGrFile);
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
RELEASEARRAYOBJECTS(pSplitPages);
|
||||
RELEASEARRAYOBJECTS(pFileMerge);
|
||||
RELEASEARRAYOBJECTS(pCMapData);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2,8 +2,11 @@
|
||||
#define _WASM_SERIALIZE_H
|
||||
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
#include "../../../../../common/File.h"
|
||||
|
||||
#define CLEAR_STACK(stack) while (!(stack).empty()) (stack).pop()
|
||||
|
||||
namespace NSWasm
|
||||
{
|
||||
class CData
|
||||
@ -15,6 +18,8 @@ namespace NSWasm
|
||||
BYTE* m_pDataCur;
|
||||
size_t m_lSizeCur;
|
||||
|
||||
std::stack<size_t> m_lStack;
|
||||
|
||||
public:
|
||||
CData()
|
||||
{
|
||||
@ -24,10 +29,70 @@ namespace NSWasm
|
||||
m_pDataCur = m_pData;
|
||||
m_lSizeCur = m_lSize;
|
||||
}
|
||||
CData(const CData& other)
|
||||
{
|
||||
m_lSize = other.m_lSize;
|
||||
m_lSizeCur = other.m_lSizeCur;
|
||||
|
||||
m_pData = (BYTE*)malloc(m_lSize * sizeof(BYTE));
|
||||
memcpy(m_pData, other.m_pData, other.m_lSizeCur * sizeof(BYTE));
|
||||
m_pDataCur = m_pData + m_lSizeCur;
|
||||
|
||||
m_lStack = other.m_lStack;
|
||||
}
|
||||
CData(CData&& other)
|
||||
{
|
||||
m_lSize = other.m_lSize;
|
||||
m_lSizeCur = other.m_lSizeCur;
|
||||
|
||||
m_pData = other.m_pData;
|
||||
m_pDataCur = other.m_pDataCur;
|
||||
|
||||
m_lStack = std::move(other.m_lStack);
|
||||
|
||||
other.ClearWithoutAttack();
|
||||
}
|
||||
virtual ~CData()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
CData& operator= (const CData& other)
|
||||
{
|
||||
if (this == &other)
|
||||
return *this;
|
||||
|
||||
Clear();
|
||||
|
||||
m_lSize = other.m_lSize;
|
||||
m_lSizeCur = other.m_lSizeCur;
|
||||
|
||||
m_pData = (BYTE*)malloc(m_lSize * sizeof(BYTE));
|
||||
memcpy(m_pData, other.m_pData, other.m_lSizeCur * sizeof(BYTE));
|
||||
m_pDataCur = m_pData + m_lSizeCur;
|
||||
|
||||
m_lStack = other.m_lStack;
|
||||
|
||||
return *this;
|
||||
}
|
||||
CData& operator= (CData&& other)
|
||||
{
|
||||
if (this == &other)
|
||||
return *this;
|
||||
|
||||
Clear();
|
||||
|
||||
m_lSize = other.m_lSize;
|
||||
m_lSizeCur = other.m_lSizeCur;
|
||||
|
||||
m_pData = other.m_pData;
|
||||
m_pDataCur = other.m_pDataCur;
|
||||
|
||||
other.ClearWithoutAttack();
|
||||
|
||||
m_lStack = std::move(other.m_lStack);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline void AddSize(size_t nSize)
|
||||
{
|
||||
@ -68,6 +133,20 @@ namespace NSWasm
|
||||
}
|
||||
|
||||
public:
|
||||
void StartRecord(BYTE type)
|
||||
{
|
||||
AddSize(5); // sizeof (BYTE + unsigned int)
|
||||
WriteBYTE(type);
|
||||
AddInt(0);
|
||||
m_lStack.push(m_lSizeCur);
|
||||
}
|
||||
void EndRecord()
|
||||
{
|
||||
size_t start = m_lStack.top();
|
||||
unsigned int len = m_lSizeCur - start;
|
||||
memcpy(m_pData + start - 4, &len, sizeof(unsigned int));
|
||||
m_lStack.pop();
|
||||
}
|
||||
void AddInt(unsigned int value)
|
||||
{
|
||||
AddSize(4);
|
||||
@ -75,6 +154,13 @@ namespace NSWasm
|
||||
m_pDataCur += 4;
|
||||
m_lSizeCur += 4;
|
||||
}
|
||||
void AddSInt(int value)
|
||||
{
|
||||
AddSize(4);
|
||||
memcpy(m_pDataCur, &value, sizeof(int));
|
||||
m_pDataCur += 4;
|
||||
m_lSizeCur += 4;
|
||||
}
|
||||
void AddInt(unsigned int value, size_t pos)
|
||||
{
|
||||
if (pos < m_lSizeCur)
|
||||
@ -93,6 +179,10 @@ namespace NSWasm
|
||||
m_pDataCur += sizeof(BYTE);
|
||||
m_lSizeCur += sizeof(BYTE);
|
||||
}
|
||||
void WriteBool(bool value)
|
||||
{
|
||||
WriteBYTE(value ? 1 : 0);
|
||||
}
|
||||
void WriteDouble(double value)
|
||||
{
|
||||
int nV = value * 10000;
|
||||
@ -151,6 +241,37 @@ namespace NSWasm
|
||||
WriteString(pDataUtf8, (unsigned int)lDataUtf8);
|
||||
RELEASEARRAYOBJECTS(pDataUtf8);
|
||||
}
|
||||
void WriteStringUtf16(const std::wstring& sStr, const bool& isBytes = false)
|
||||
{
|
||||
unsigned int size = static_cast<unsigned int>(sStr.length());
|
||||
|
||||
int len = 0;
|
||||
size_t posLen = m_lSizeCur;
|
||||
|
||||
// len reserve
|
||||
AddInt(0);
|
||||
|
||||
if (sizeof(wchar_t) == 4)
|
||||
{
|
||||
AddSize(4 * size + 2/*'\0'*/);
|
||||
NSFile::CUtf8Converter::GetUtf16StringFromUnicode_4bytes(sStr.c_str(), (LONG)size, m_pDataCur, len, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t bufferLen = 2 * size;
|
||||
AddSize(bufferLen);
|
||||
len = (int)(bufferLen);
|
||||
memcpy(m_pDataCur, sStr.c_str(), bufferLen);
|
||||
}
|
||||
|
||||
m_pDataCur += static_cast<unsigned int>(len);
|
||||
m_lSizeCur += static_cast<unsigned int>(len);
|
||||
|
||||
if (!isBytes)
|
||||
len /= 2;
|
||||
|
||||
AddInt((unsigned int)len, posLen);
|
||||
}
|
||||
void Write(BYTE* value, unsigned int len)
|
||||
{
|
||||
if (!value || len == 0)
|
||||
@ -165,6 +286,13 @@ namespace NSWasm
|
||||
return m_pData;
|
||||
}
|
||||
|
||||
BYTE* MoveBuffer()
|
||||
{
|
||||
BYTE* pData = m_pData;
|
||||
ClearWithoutAttack();
|
||||
return pData;
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
if (m_pData)
|
||||
@ -175,6 +303,8 @@ namespace NSWasm
|
||||
|
||||
m_pDataCur = m_pData;
|
||||
m_lSizeCur = 0;
|
||||
|
||||
CLEAR_STACK(m_lStack);
|
||||
}
|
||||
void ClearWithoutAttack()
|
||||
{
|
||||
@ -183,11 +313,15 @@ namespace NSWasm
|
||||
|
||||
m_pDataCur = m_pData;
|
||||
m_lSizeCur = 0;
|
||||
|
||||
CLEAR_STACK(m_lStack);
|
||||
}
|
||||
void ClearNoAttack()
|
||||
{
|
||||
m_pDataCur = m_pData;
|
||||
m_lSizeCur = 0;
|
||||
|
||||
CLEAR_STACK(m_lStack);
|
||||
}
|
||||
unsigned int GetSize()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user