mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-19 20:20:22 +08:00
fix bug #56631
This commit is contained in:
@ -45,7 +45,7 @@ namespace DocFileFormat
|
||||
{
|
||||
DocumentMapping::DocumentMapping(ConversionContext* context, IMapping* caller) : _skipRuns(0), _lastValidPapx(NULL), _lastValidSepx(NULL),
|
||||
AbstractOpenXmlMapping( new XMLTools::CStringXmlWriter() ), _sectionNr(0), _footnoteNr(0),
|
||||
_endnoteNr(0), _commentNr(1), _caller(caller)
|
||||
_endnoteNr(0), _commentNr(1), _caller(caller), _permissionNr(1)
|
||||
{
|
||||
m_document = NULL;
|
||||
m_context = context;
|
||||
@ -296,12 +296,10 @@ namespace DocFileFormat
|
||||
fcChpxEnd = fcEnd;
|
||||
}
|
||||
|
||||
//read the chars that are formatted via this CHPX
|
||||
std::vector<wchar_t>* chpxChars = m_document->GetChars(fcChpxStart, fcChpxEnd, cp);
|
||||
|
||||
//search for bookmarks in the chars
|
||||
std::vector<int> annot = searchAnnot(chpxChars, cp);
|
||||
if (!annot.empty())
|
||||
std::vector<int> annot = searchAnnotation(chpxChars, cp);
|
||||
if (false == annot.empty())
|
||||
{
|
||||
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &annot);
|
||||
if (runs)
|
||||
@ -319,11 +317,9 @@ namespace DocFileFormat
|
||||
}
|
||||
else
|
||||
{
|
||||
//search for bookmarks in the chars
|
||||
std::vector<int> bookmarks = searchBookmarks(chpxChars, cp);
|
||||
|
||||
//if there are bookmarks in this run, split the run into several runs
|
||||
if (!bookmarks.empty())
|
||||
if (false == bookmarks.empty())
|
||||
{
|
||||
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &bookmarks);
|
||||
if (runs)
|
||||
@ -341,7 +337,28 @@ namespace DocFileFormat
|
||||
}
|
||||
else
|
||||
{
|
||||
cp = writeRun(chpxChars, *cpeIter, cp);
|
||||
std::vector<int> permissions = searchPermission(chpxChars, cp);
|
||||
|
||||
if (false == permissions.empty())
|
||||
{
|
||||
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &permissions);
|
||||
if (runs)
|
||||
{
|
||||
for (std::list<std::vector<wchar_t> >::iterator iter = runs->begin(); iter != runs->end(); ++iter)
|
||||
{
|
||||
if (writePermissions(cp))
|
||||
{
|
||||
cp = writeRun(&(*iter), *cpeIter, cp);
|
||||
}
|
||||
}
|
||||
|
||||
RELEASEOBJECT(runs);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cp = writeRun(chpxChars, *cpeIter, cp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1086,11 +1103,11 @@ namespace DocFileFormat
|
||||
}
|
||||
else
|
||||
{
|
||||
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(atrdPre10->m_BookmarkId);
|
||||
if (pFind == m_document->mapCommentsBookmarks.end())
|
||||
std::map<int, int>::iterator pFind = m_document->mapAnnotBookmarks.find(atrdPre10->m_BookmarkId);
|
||||
if (pFind == m_document->mapAnnotBookmarks.end())
|
||||
{
|
||||
atrdPre10->m_CommentId = _commentNr++;
|
||||
m_document->mapCommentsBookmarks.insert(std::make_pair(atrdPre10->m_BookmarkId, atrdPre10->m_CommentId));
|
||||
m_document->mapAnnotBookmarks.insert(std::make_pair(atrdPre10->m_BookmarkId, atrdPre10->m_CommentId));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1211,8 +1228,7 @@ namespace DocFileFormat
|
||||
|
||||
return ret;
|
||||
}
|
||||
// Searches for bookmarks in the list of characters.
|
||||
std::vector<int> DocumentMapping::searchAnnot(std::vector<wchar_t>* chars, int initialCp)
|
||||
std::vector<int> DocumentMapping::searchAnnotation(std::vector<wchar_t>* chars, int initialCp)
|
||||
{
|
||||
std::vector<int> ret;
|
||||
|
||||
@ -1235,7 +1251,27 @@ namespace DocFileFormat
|
||||
|
||||
return ret;
|
||||
}
|
||||
std::vector<int> DocumentMapping::searchPermission(std::vector<wchar_t>* chars, int initialCp)
|
||||
{
|
||||
std::vector<int> ret;
|
||||
|
||||
if (m_document->BookmarkProtStartPlex->IsValid())
|
||||
{
|
||||
int cp = initialCp;
|
||||
|
||||
size_t count = chars->size();
|
||||
|
||||
for (size_t i = 0; i < count; ++i)
|
||||
{
|
||||
if ((m_document->BookmarkProtStartPlex->IsCpExists(cp)) || (m_document->BookmarkProtEndPlex->IsCpExists(cp)))
|
||||
{
|
||||
ret.push_back(i);
|
||||
}
|
||||
++cp;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
ParagraphPropertyExceptions* DocumentMapping::findValidPapx(int fc)
|
||||
{
|
||||
ParagraphPropertyExceptions* ret = NULL;
|
||||
@ -1841,16 +1877,15 @@ namespace DocFileFormat
|
||||
bool DocumentMapping::writeBookmarks(int cp)
|
||||
{
|
||||
bool result = true;
|
||||
int count = (int)m_document->BookmarkStartEndCPs.size();
|
||||
|
||||
for (int b = 0; b < count; ++b)
|
||||
for (size_t b = 0; b < m_document->BookmarkStartEndCPs.size(); ++b)
|
||||
{
|
||||
if (m_document->BookmarkStartEndCPs[b].first == cp)
|
||||
if (m_document->BookmarkStartEndCPs[b].start == cp)
|
||||
{
|
||||
result = writeBookmarkStart(b);
|
||||
}
|
||||
|
||||
if (m_document->BookmarkStartEndCPs[b].second == cp)
|
||||
if (m_document->BookmarkStartEndCPs[b].end == cp)
|
||||
{
|
||||
result = writeBookmarkEnd(b);
|
||||
}
|
||||
@ -1867,11 +1902,11 @@ namespace DocFileFormat
|
||||
if (m_document->AnnotStartEndCPs[i].start == cp)
|
||||
{
|
||||
int index = -1;
|
||||
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
|
||||
if (pFind == m_document->mapCommentsBookmarks.end())
|
||||
std::map<int, int>::iterator pFind = m_document->mapAnnotBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
|
||||
if (pFind == m_document->mapAnnotBookmarks.end())
|
||||
{
|
||||
index = _commentNr++;
|
||||
m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
|
||||
m_document->mapAnnotBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
|
||||
}
|
||||
else index = pFind->second;
|
||||
|
||||
@ -1881,11 +1916,11 @@ namespace DocFileFormat
|
||||
if (m_document->AnnotStartEndCPs[i].end == cp)
|
||||
{
|
||||
int index = -1;
|
||||
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
|
||||
if (pFind == m_document->mapCommentsBookmarks.end())
|
||||
std::map<int, int>::iterator pFind = m_document->mapAnnotBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
|
||||
if (pFind == m_document->mapAnnotBookmarks.end())
|
||||
{
|
||||
index = _commentNr++;
|
||||
m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
|
||||
m_document->mapAnnotBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
|
||||
}
|
||||
else index = pFind->second;
|
||||
|
||||
@ -1895,10 +1930,45 @@ namespace DocFileFormat
|
||||
|
||||
return result;
|
||||
}
|
||||
bool DocumentMapping::writePermissions(int cp)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
for (size_t i = 0; i < m_document->BookmarkProtStartEndCPs.size(); i++)
|
||||
{
|
||||
if (m_document->BookmarkProtStartEndCPs[i].start == cp)
|
||||
{
|
||||
int index = -1;
|
||||
std::map<int, int>::iterator pFind = m_document->mapProtBookmarks.find(m_document->BookmarkProtStartEndCPs[i].bookmarkId);
|
||||
if (pFind == m_document->mapProtBookmarks.end())
|
||||
{
|
||||
index = _permissionNr++;
|
||||
m_document->mapProtBookmarks.insert(std::make_pair(m_document->BookmarkProtStartEndCPs[i].bookmarkId, index));
|
||||
}
|
||||
else index = pFind->second;
|
||||
|
||||
result = writePermissionStart(index, i);
|
||||
}
|
||||
|
||||
if (m_document->BookmarkProtStartEndCPs[i].end == cp)
|
||||
{
|
||||
int index = -1;
|
||||
std::map<int, int>::iterator pFind = m_document->mapProtBookmarks.find(m_document->BookmarkProtStartEndCPs[i].bookmarkId);
|
||||
if (pFind == m_document->mapProtBookmarks.end())
|
||||
{
|
||||
index = _permissionNr++;
|
||||
m_document->mapProtBookmarks.insert(std::make_pair(m_document->BookmarkProtStartEndCPs[i].bookmarkId, index));
|
||||
}
|
||||
else index = pFind->second;
|
||||
|
||||
result = writePermissionEnd(index);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
bool DocumentMapping::writeBookmarkStart(short id)
|
||||
{
|
||||
// write bookmark start
|
||||
|
||||
WideString* bookmarkName = static_cast<WideString*>(m_document->BookmarkNames->operator [](id));
|
||||
|
||||
if ((bookmarkName != NULL) && (*bookmarkName != L"_PictureBullets"))
|
||||
@ -1912,7 +1982,6 @@ namespace DocFileFormat
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1936,25 +2005,64 @@ namespace DocFileFormat
|
||||
bool DocumentMapping::writeAnnotationStart(short id)
|
||||
{
|
||||
XMLTools::XMLElement bookmarkElem(L"w:commentRangeStart");
|
||||
|
||||
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
|
||||
|
||||
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DocumentMapping::writeAnnotationEnd(short id)
|
||||
{
|
||||
XMLTools::XMLElement bookmarkElem( L"w:commentRangeEnd" );
|
||||
|
||||
bookmarkElem.AppendAttribute( L"w:id", FormatUtils::IntToWideString( id ));
|
||||
|
||||
m_pXmlWriter->WriteString( bookmarkElem.GetXMLString());
|
||||
XMLTools::XMLElement bookmarkElem(L"w:commentRangeEnd");
|
||||
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
|
||||
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
|
||||
|
||||
return true;
|
||||
}
|
||||
bool DocumentMapping::writePermissionStart(short id, size_t index)
|
||||
{
|
||||
XMLTools::XMLElement bookmarkElem(L"w:permStart");
|
||||
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
|
||||
|
||||
ProtInfoBookmark *prot = static_cast<ProtInfoBookmark*>(m_document->BkmkProt->operator[](index));
|
||||
BookmarkFirst *prot_base = static_cast<BookmarkFirst*>(m_document->BookmarkProtStartPlex->GetStruct(index));
|
||||
|
||||
if (prot_base && prot_base->fCol)
|
||||
{
|
||||
bookmarkElem.AppendAttribute(L"w:colFirst", FormatUtils::IntToWideString(prot_base->itcFirst));
|
||||
bookmarkElem.AppendAttribute(L"w:colLast", FormatUtils::IntToWideString(prot_base->itcLim - 1));
|
||||
}
|
||||
if (prot && (prot->uidSel == 0 || prot->uidSel > 0xfff0))
|
||||
{
|
||||
switch (prot->uidSel)
|
||||
{
|
||||
case 0xFFFF: bookmarkElem.AppendAttribute(L"w:edGrp", L"everyone");
|
||||
case 0xFFFE: bookmarkElem.AppendAttribute(L"w:edGrp", L"administrators");
|
||||
case 0xFFFD: bookmarkElem.AppendAttribute(L"w:edGrp", L"contributors");
|
||||
case 0xFFFC: bookmarkElem.AppendAttribute(L"w:edGrp", L"owners");
|
||||
case 0xFFFB: bookmarkElem.AppendAttribute(L"w:edGrp", L"editors");
|
||||
case 0xFFFA: bookmarkElem.AppendAttribute(L"w:edGrp", L"current");
|
||||
case 0x0000: bookmarkElem.AppendAttribute(L"w:edGrp", L"none");
|
||||
}
|
||||
}
|
||||
if (prot && (prot->uidSel > 0 && prot->uidSel < 0xfff0))
|
||||
{
|
||||
WideString* user = static_cast<WideString*>(m_document->BkmkProtUser->operator[](prot->uidSel - 1));
|
||||
|
||||
if (user && false == user->empty())
|
||||
bookmarkElem.AppendAttribute(L"w:ed", *user);
|
||||
}
|
||||
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
|
||||
|
||||
return true;
|
||||
}
|
||||
bool DocumentMapping::writePermissionEnd(short id)
|
||||
{
|
||||
XMLTools::XMLElement bookmarkElem(L"w:permEnd");
|
||||
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
|
||||
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
|
||||
|
||||
return true;
|
||||
}
|
||||
// Checks if the CHPX is special
|
||||
bool DocumentMapping::isSpecial(CharacterPropertyExceptions* chpx)
|
||||
{
|
||||
if (!chpx) return false;
|
||||
|
||||
Reference in New Issue
Block a user