diff options
author | Serge Krot <Serge.Krot@cib.de> | 2017-10-09 12:15:05 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2017-10-10 19:35:28 +0200 |
commit | f5c266695a4a88da7db971a21915e2bbf758d48e (patch) | |
tree | b11516ba17e51898a66152e4e75eb2ff34244ef3 /sw | |
parent | 9c4d690b73b30aa144828935ad4e87eb13442d0c (diff) |
tdf#66398 Parse and output permissions for DOCX using bookmarks
Change-Id: Id08998ae775c5f383edc4bf0410d16f88c70dfd6
Reviewed-on: https://gerrit.libreoffice.org/43275
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 206 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.hxx | 15 |
2 files changed, 185 insertions, 36 deletions
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 3d7d8b53957e..e2e000c00bc0 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1235,8 +1235,13 @@ void DocxAttributeOutput::EndRun() // if there is some redlining in the document, output it StartRedline( m_pRedlineData ); - DoWriteBookmarks( ); - DoWriteAnnotationMarks( ); + // XML_r node should be surrounded with bookmark-begin and bookmark-end nodes if it has bookmarks. + // The same is applied for permission ranges. + // But due to unit test "testFdo85542" let's output bookmark-begin with bookmark-end. + DoWriteBookmarksStart(); + DoWriteBookmarksEnd(); + DoWritePermissionsStart(); + DoWriteAnnotationMarks(); if( m_closeHyperlinkInThisRun && m_startedHyperlink && !m_hyperLinkAnchor.isEmpty() && m_hyperLinkAnchor.startsWith("_Toc")) { @@ -1312,6 +1317,9 @@ void DocxAttributeOutput::EndRun() m_pSerializer->mergeTopMarks(Tag_StartRun_1); + // XML_r node should be surrounded with permission-begin and permission-end nodes if it has permission. + DoWritePermissionsEnd(); + for (std::vector<const SwOLENode*>::iterator it = m_aPostponedMaths.begin(); it != m_aPostponedMaths.end(); ++it) WritePostponedMath(*it); m_aPostponedMaths.clear(); @@ -1371,41 +1379,159 @@ void DocxAttributeOutput::EndRun() } } -void DocxAttributeOutput::DoWriteBookmarks() +void DocxAttributeOutput::DoWriteBookmarkTagStart(const OUString & bookmarkName) +{ + const OString rId = OString::number(m_nNextBookmarkId); + const OString rName = OUStringToOString(BookmarkToWord(bookmarkName), RTL_TEXTENCODING_UTF8).getStr(); + + m_pSerializer->singleElementNS(XML_w, XML_bookmarkStart, + FSNS(XML_w, XML_id), rId.getStr(), + FSNS(XML_w, XML_name), rName.getStr(), + FSEND); +} + +void DocxAttributeOutput::DoWriteBookmarkTagEnd(const OUString & bookmarkName) { - // Write the start bookmarks - for ( const auto & it : m_rBookmarksStart ) + const auto nameToIdIter = m_rOpenedBookmarksIds.find(bookmarkName); + if (nameToIdIter != m_rOpenedBookmarksIds.end()) { - OString rName = OUStringToOString( BookmarkToWord( it ), RTL_TEXTENCODING_UTF8 ).getStr(); + const sal_Int32 nId = nameToIdIter->second; + const OString rId = OString::number(nId); + + m_pSerializer->singleElementNS(XML_w, XML_bookmarkEnd, + FSNS(XML_w, XML_id), rId.getStr(), + FSEND); + } +} +/// Write the start bookmarks +void DocxAttributeOutput::DoWriteBookmarksStart() +{ + for (const OUString & bookmarkName : m_rBookmarksStart) + { // Output the bookmark - const sal_Int32 nId = m_nNextBookmarkId++; - m_rOpenedBookmarksIds[it] = nId; - m_pSerializer->singleElementNS( XML_w, XML_bookmarkStart, - FSNS( XML_w, XML_id ), OString::number( nId ).getStr( ), - FSNS( XML_w, XML_name ), rName.getStr(), - FSEND ); - m_sLastOpenedBookmark = rName; + DoWriteBookmarkTagStart(bookmarkName); + + m_rOpenedBookmarksIds[bookmarkName] = m_nNextBookmarkId; + m_sLastOpenedBookmark = OUStringToOString(BookmarkToWord(bookmarkName), RTL_TEXTENCODING_UTF8).getStr(); + m_nNextBookmarkId++; } m_rBookmarksStart.clear(); +} - // export the end bookmarks - for ( const auto & it : m_rBookmarksEnd ) +/// export the end bookmarks +void DocxAttributeOutput::DoWriteBookmarksEnd() +{ + for (const OUString & bookmarkName : m_rBookmarksEnd) { // Get the id of the bookmark - auto pPos = m_rOpenedBookmarksIds.find(it); - if ( pPos != m_rOpenedBookmarksIds.end() ) + auto pPos = m_rOpenedBookmarksIds.find(bookmarkName); + if (pPos != m_rOpenedBookmarksIds.end()) { - const sal_Int32 nId = ( *pPos ).second; - m_pSerializer->singleElementNS( XML_w, XML_bookmarkEnd, - FSNS( XML_w, XML_id ), OString::number( nId ).getStr(), - FSEND ); - m_rOpenedBookmarksIds.erase( it ); + // Output the bookmark + DoWriteBookmarkTagEnd(bookmarkName); + + m_rOpenedBookmarksIds.erase(bookmarkName); } } m_rBookmarksEnd.clear(); } +// For construction of the special bookmark name template for permissions: +// see, PermInsertPosition::createBookmarkName() +// +// Syntax: +// - "permission-for-user:<permission-id>:<permission-user-name>" +// - "permission-for-group:<permission-id>:<permission-group-name>" +// +void DocxAttributeOutput::DoWritePermissionTagStart(const OUString & permission) +{ + OUString permissionIdAndName; + + if (permission.startsWith("permission-for-group:", &permissionIdAndName)) + { + const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); + const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); + const OUString permissionName = permissionIdAndName.copy(sparatorIndex + 1); + + const OString rId = OUStringToOString(BookmarkToWord(permissionId), RTL_TEXTENCODING_UTF8).getStr(); + const OString rName = OUStringToOString(BookmarkToWord(permissionName), RTL_TEXTENCODING_UTF8).getStr(); + + m_pSerializer->singleElementNS(XML_w, XML_permStart, + FSNS(XML_w, XML_id), rId.getStr(), + FSNS(XML_w, XML_edGrp), rName.getStr(), + FSEND); + } + else // if (permission.startsWith("permission-for-user:", &permissionIdAndName)) + { + const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); + const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); + const OUString permissionName = permissionIdAndName.copy(sparatorIndex + 1); + + const OString rId = OUStringToOString(BookmarkToWord(permissionId), RTL_TEXTENCODING_UTF8).getStr(); + const OString rName = OUStringToOString(BookmarkToWord(permissionName), RTL_TEXTENCODING_UTF8).getStr(); + + m_pSerializer->singleElementNS(XML_w, XML_permStart, + FSNS(XML_w, XML_id), rId.getStr(), + FSNS(XML_w, XML_ed), rName.getStr(), + FSEND); + } +} + + +// For construction of the special bookmark name template for permissions: +// see, PermInsertPosition::createBookmarkName() +// +// Syntax: +// - "permission-for-user:<permission-id>:<permission-user-name>" +// - "permission-for-group:<permission-id>:<permission-group-name>" +// +void DocxAttributeOutput::DoWritePermissionTagEnd(const OUString & permission) +{ + OUString permissionIdAndName; + + if (permission.startsWith("permission-for-group:", &permissionIdAndName)) + { + const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); + const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); + const OString rId = OUStringToOString(BookmarkToWord(permissionId), RTL_TEXTENCODING_UTF8).getStr(); + + m_pSerializer->singleElementNS(XML_w, XML_permEnd, + FSNS(XML_w, XML_id), rId.getStr(), + FSEND); + } + else // if (permission.startsWith("permission-for-user:", &permissionIdAndName)) + { + const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); + const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); + const OString rId = OUStringToOString(BookmarkToWord(permissionId), RTL_TEXTENCODING_UTF8).getStr(); + + m_pSerializer->singleElementNS(XML_w, XML_permEnd, + FSNS(XML_w, XML_id), rId.getStr(), + FSEND); + } +} + +/// Write the start permissions +void DocxAttributeOutput::DoWritePermissionsStart() +{ + for (const OUString & permission : m_rPermissionsStart) + { + DoWritePermissionTagStart(permission); + } + m_rPermissionsStart.clear(); +} + +/// export the end permissions +void DocxAttributeOutput::DoWritePermissionsEnd() +{ + for (const OUString & permission : m_rPermissionsEnd) + { + DoWritePermissionTagEnd(permission); + } + m_rPermissionsEnd.clear(); +} + void DocxAttributeOutput::DoWriteAnnotationMarks() { // Write the start annotation marks @@ -1629,10 +1755,7 @@ void DocxAttributeOutput::EndField_Impl( FieldInfos& rInfos ) OUString aBkmName( m_sFieldBkm ); if ( !aBkmName.isEmpty() ) { - m_pSerializer->singleElementNS( XML_w, XML_bookmarkStart, - FSNS( XML_w, XML_id ), OString::number( m_nNextBookmarkId ).getStr( ), - FSNS( XML_w, XML_name ), OUStringToOString( aBkmName, RTL_TEXTENCODING_UTF8 ).getStr( ), - FSEND ); + DoWriteBookmarkTagEnd(aBkmName); } if (rInfos.pField ) // For hyperlinks and TOX @@ -1658,9 +1781,7 @@ void DocxAttributeOutput::EndField_Impl( FieldInfos& rInfos ) // Write the bookmark end if any if ( !aBkmName.isEmpty() ) { - m_pSerializer->singleElementNS( XML_w, XML_bookmarkEnd, - FSNS( XML_w, XML_id ), OString::number( m_nNextBookmarkId ).getStr( ), - FSEND ); + DoWriteBookmarkTagEnd(aBkmName); m_nNextBookmarkId++; } @@ -6980,18 +7101,33 @@ void DocxAttributeOutput::WriteFormData_Impl( const ::sw::mark::IFieldmark& rFie m_Fields.begin()->pFieldmark = &rFieldmark; } -void DocxAttributeOutput::WriteBookmarks_Impl( std::vector< OUString >& rStarts, - std::vector< OUString >& rEnds ) +void DocxAttributeOutput::WriteBookmarks_Impl( std::vector< OUString >& rStarts, std::vector< OUString >& rEnds ) { - for ( const auto & it : rStarts ) + for ( const OUString & name : rStarts ) { - m_rBookmarksStart.push_back( it ); + if (name.startsWith("permission-for-group:") || + name.startsWith("permission-for-user:")) + { + m_rPermissionsStart.push_back(name); + } + else + { + m_rBookmarksStart.push_back(name); + } } rStarts.clear(); - for ( const auto & it : rEnds ) + for ( const OUString & name : rEnds ) { - m_rBookmarksEnd.push_back( it ); + if (name.startsWith("permission-for-group:") || + name.startsWith("permission-for-user:")) + { + m_rPermissionsEnd.push_back(name); + } + else + { + m_rBookmarksEnd.push_back(name); + } } rEnds.clear(); } diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index 65334bc07a50..3fdfd95cd312 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -695,7 +695,16 @@ protected: private: - void DoWriteBookmarks( ); + void DoWriteBookmarkTagStart(const OUString & bookmarkName); + void DoWriteBookmarkTagEnd(const OUString & bookmarkName); + void DoWriteBookmarksStart(); + void DoWriteBookmarksEnd(); + + void DoWritePermissionTagStart(const OUString & permission); + void DoWritePermissionTagEnd(const OUString & permission); + void DoWritePermissionsStart(); + void DoWritePermissionsEnd(); + void DoWriteAnnotationMarks( ); void WritePostponedGraphic(); void WritePostponedMath(const SwOLENode* pObject); @@ -776,6 +785,10 @@ private: std::vector<OUString> m_rBookmarksStart; std::vector<OUString> m_rBookmarksEnd; + /// Permissions to output + std::vector<OUString> m_rPermissionsStart; + std::vector<OUString> m_rPermissionsEnd; + /// Annotation marks to output std::vector<OString> m_rAnnotationMarksStart; std::vector<OString> m_rAnnotationMarksEnd; |