mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 14:00:32 +08:00
335 lines
9.3 KiB
C++
335 lines
9.3 KiB
C++
//
|
|
// Created by danya on 23.06.2021.
|
|
//
|
|
|
|
#include "Adaptors.h"
|
|
|
|
void GlobalParamsAdaptor::SetFontManager(NSFonts::IFontManager *pFontManager)
|
|
{
|
|
m_pFontManager = pFontManager;
|
|
}
|
|
|
|
bool operator==(const Ref &a, const Ref &b)
|
|
{
|
|
return a.gen == b.gen && a.num == b.gen;
|
|
}
|
|
|
|
bool operator<(const Ref &a, const Ref &b)
|
|
{
|
|
if (a.num < b.num)
|
|
return true;
|
|
else if (a.num == b.num)
|
|
return a.gen < b.gen;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
bool operator<=(const Ref &a, const Ref &b)
|
|
{
|
|
return (a < b) || (a == b);
|
|
}
|
|
|
|
bool operator>=(const Ref &a, const Ref &b)
|
|
{
|
|
return !(a < b);
|
|
}
|
|
|
|
bool operator>(const Ref &a, const Ref &b)
|
|
{
|
|
return !(a <= b);
|
|
}
|
|
|
|
namespace NSStrings
|
|
{
|
|
GString *CreateString(const std::wstring &str)
|
|
{
|
|
std::string sUtf8 = U_TO_UTF8(str);
|
|
return new GString(sUtf8.c_str(), sUtf8.length());
|
|
}
|
|
|
|
GString *CreateString(const std::string &str)
|
|
{
|
|
return new GString(str.c_str(), str.length());
|
|
}
|
|
|
|
std::wstring GetString(GString *str)
|
|
{
|
|
return NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE *) str->getCString(), (LONG) str->getLength());
|
|
}
|
|
|
|
std::string GetStringA(GString *str)
|
|
{
|
|
return std::string(str->getCString(), str->getLength());
|
|
}
|
|
}
|
|
|
|
|
|
void XMLConverter::XRefToXml(XRef &xref, std::wstring &wsXml, bool bParseStreams)
|
|
{
|
|
for (int nNum = 0; nNum < xref.getSize(); ++nNum)
|
|
{
|
|
XRefEntry *pEntry = xref.getEntry(nNum);
|
|
if (xrefEntryFree != pEntry->type)
|
|
{
|
|
|
|
Object oTemp;
|
|
xref.fetch(nNum, 0/*pEntry->nGen*/, &oTemp);
|
|
|
|
if (oTemp.isDict() || oTemp.isStream())
|
|
{
|
|
if (xrefEntryCompressed == pEntry->type)
|
|
wsXml +=
|
|
L"<Obj num=\"" + std::to_wstring(nNum) + L"\" gen=\"" + std::to_wstring(0/*pEntry->nGen*/) +
|
|
L"\" compressed=\"true\">";
|
|
else
|
|
wsXml +=
|
|
L"<Obj num=\"" + std::to_wstring(nNum) + L"\" gen=\"" + std::to_wstring(0/*pEntry->nGen*/) +
|
|
L"\">";
|
|
|
|
if (oTemp.isDict())
|
|
{
|
|
ObjectToXml(&oTemp, wsXml);
|
|
} else if (oTemp.isStream())
|
|
{
|
|
Dict *pStreamDict = oTemp.streamGetDict();
|
|
StreamDictToXml(pStreamDict, wsXml);
|
|
wsXml += L"<Stream>";
|
|
|
|
if (bParseStreams)
|
|
{
|
|
std::wstring wsTemp;
|
|
Stream *pStream = oTemp.getStream();
|
|
pStream->reset();
|
|
|
|
Object oFilter;
|
|
pStreamDict->lookup("Filter", &oFilter);
|
|
if (oFilter.isNull() || oFilter.isName("FlateDecode"))
|
|
{
|
|
int nChar;
|
|
while (EOF != (nChar = pStream->getChar()))
|
|
{
|
|
char sTemp[1] = {(char) nChar};
|
|
|
|
switch (sTemp[0])
|
|
{
|
|
case '\"':
|
|
wsTemp += L""";
|
|
break;
|
|
case '&':
|
|
wsTemp += L"&";
|
|
break;
|
|
case '<':
|
|
wsTemp += L"<";
|
|
break;
|
|
case '>':
|
|
wsTemp += L">";
|
|
break;
|
|
default:
|
|
AppendStringToXml(wsTemp, std::string(sTemp));
|
|
}
|
|
}
|
|
} else
|
|
{
|
|
wsXml += L"BinaryData";
|
|
}
|
|
|
|
wsXml += wsTemp;
|
|
}
|
|
|
|
wsXml += L"</Stream>";
|
|
}
|
|
|
|
wsXml += L"</Obj>";
|
|
}
|
|
|
|
oTemp.free();
|
|
}
|
|
}
|
|
}
|
|
|
|
void XMLConverter::ObjectToXml(Object *obj, std::wstring &wsXml)
|
|
{
|
|
Object oTemp;
|
|
|
|
switch (obj->getType())
|
|
{
|
|
case objBool:
|
|
wsXml += obj->getBool() ? L"true" : L"false";
|
|
break;
|
|
case objInt:
|
|
wsXml += std::to_wstring(obj->getInt());
|
|
break;
|
|
case objReal:
|
|
wsXml += std::to_wstring(obj->getReal());
|
|
break;
|
|
case objString:
|
|
wsXml += L"(";
|
|
AppendStringToXml(wsXml, obj->getString()->getCString());
|
|
wsXml += L")";
|
|
break;
|
|
case objName:
|
|
wsXml += L"/";
|
|
AppendStringToXml(wsXml, obj->getName());
|
|
break;
|
|
case objNull:
|
|
wsXml += L"null";
|
|
break;
|
|
case objArray:
|
|
wsXml += L"[";
|
|
for (int nIndex = 0; nIndex < obj->arrayGetLength(); ++nIndex)
|
|
{
|
|
if (nIndex > 0)
|
|
wsXml += L" ";
|
|
|
|
obj->arrayGet(nIndex, &oTemp);
|
|
ObjectToXml(&oTemp, wsXml);
|
|
oTemp.free();
|
|
}
|
|
wsXml += L"]";
|
|
break;
|
|
case objDict:
|
|
for (int nIndex = 0; nIndex < obj->dictGetLength(); ++nIndex)
|
|
{
|
|
char *sKey = obj->dictGetKey(nIndex);
|
|
wsXml += L"<";
|
|
AppendStringToXml(wsXml, sKey);
|
|
wsXml += L">";
|
|
obj->dictGetVal(nIndex, &oTemp);
|
|
ObjectToXml(&oTemp, wsXml);
|
|
oTemp.free();
|
|
wsXml += L"</";
|
|
AppendStringToXml(wsXml, sKey);
|
|
wsXml += L">";
|
|
}
|
|
break;
|
|
case objStream:
|
|
wsXml += L"<stream/>";
|
|
// TODO: Запись стрима
|
|
break;
|
|
case objRef:
|
|
wsXml += std::to_wstring(obj->getRefNum());
|
|
wsXml += L" ";
|
|
wsXml += std::to_wstring(obj->getRefGen());
|
|
wsXml += L" R";
|
|
break;
|
|
case objCmd:
|
|
AppendStringToXml(wsXml, obj->getCmd());
|
|
break;
|
|
case objError:
|
|
wsXml += L"error";
|
|
break;
|
|
case objEOF:
|
|
wsXml += L"EOF";
|
|
break;
|
|
case objNone:
|
|
wsXml += L"none";
|
|
break;
|
|
}
|
|
}
|
|
|
|
void XMLConverter::PageToXml(Object *obj, std::wstring &wsXml)
|
|
{
|
|
Object oTemp;
|
|
|
|
wsXml += L" type=\"";
|
|
switch (obj->getType())
|
|
{
|
|
case objBool:
|
|
wsXml += L"Bool\" num=\"";
|
|
wsXml += obj->getBool() ? L"true" : L"false";
|
|
wsXml += L"\">";
|
|
break;
|
|
case objInt:
|
|
wsXml += L"Int\" num=\"";
|
|
wsXml += std::to_wstring(obj->getInt());
|
|
wsXml += L"\">";
|
|
break;
|
|
case objReal:
|
|
wsXml += L"Real\" num=\"";
|
|
wsXml += std::to_wstring(obj->getReal());
|
|
wsXml += L"\">";
|
|
break;
|
|
case objString:
|
|
wsXml += L"String\" num=\"";
|
|
AppendStringToXml(wsXml, obj->getString()->getCString());
|
|
wsXml += L"\">";
|
|
break;
|
|
case objName:
|
|
wsXml += L"Name\" num=\"";
|
|
AppendStringToXml(wsXml, obj->getName());
|
|
wsXml += L"\">";
|
|
break;
|
|
case objNull:
|
|
wsXml += L"Null\">";
|
|
break;
|
|
case objArray:
|
|
wsXml += L"Array\">";
|
|
for (int nIndex = 0; nIndex < obj->arrayGetLength(); ++nIndex)
|
|
{
|
|
wsXml += L"<item";
|
|
obj->arrayGetNF(nIndex, &oTemp);
|
|
PageToXml(&oTemp, wsXml);
|
|
oTemp.free();
|
|
wsXml += L"</item>";
|
|
}
|
|
break;
|
|
case objDict:
|
|
wsXml += L"Dict\">";
|
|
for (int nIndex = 0; nIndex < obj->dictGetLength(); ++nIndex)
|
|
{
|
|
char *sKey = obj->dictGetKey(nIndex);
|
|
wsXml += L"<";
|
|
AppendStringToXml(wsXml, sKey);
|
|
obj->dictGetValNF(nIndex, &oTemp);
|
|
PageToXml(&oTemp, wsXml);
|
|
oTemp.free();
|
|
wsXml += L"</";
|
|
AppendStringToXml(wsXml, sKey);
|
|
wsXml += L">";
|
|
}
|
|
break;
|
|
case objStream:
|
|
wsXml += L"Stream\">";
|
|
break;
|
|
case objRef:
|
|
wsXml += L"Ref\" gen=\"";
|
|
wsXml += std::to_wstring(obj->getRefGen());
|
|
wsXml += L"\" num=\"";
|
|
wsXml += std::to_wstring(obj->getRefNum());
|
|
wsXml += L"\">";
|
|
break;
|
|
case objCmd:
|
|
wsXml += L"Cmd\" num=\"";
|
|
AppendStringToXml(wsXml, obj->getCmd());
|
|
wsXml += L"\">";
|
|
break;
|
|
case objError:
|
|
wsXml += L"Error\">";
|
|
break;
|
|
case objEOF:
|
|
wsXml += L"EOF\">";
|
|
break;
|
|
case objNone:
|
|
wsXml += L"None\">";
|
|
break;
|
|
}
|
|
}
|
|
|
|
void XMLConverter::StreamDictToXml(Dict *dict, std::wstring &wsXml)
|
|
{
|
|
Object oTemp;
|
|
for (int nIndex = 0; nIndex < dict->getLength(); ++nIndex)
|
|
{
|
|
char *sKey = dict->getKey(nIndex);
|
|
wsXml += L"<";
|
|
AppendStringToXml(wsXml, sKey);
|
|
wsXml += L">";
|
|
dict->getVal(nIndex, &oTemp);
|
|
ObjectToXml(&oTemp, wsXml);
|
|
oTemp.free();
|
|
wsXml += L"</";
|
|
AppendStringToXml(wsXml, sKey);
|
|
wsXml += L">";
|
|
}
|
|
}
|