include/sfx2/classificationhelper.hxx | 39 +++++++++++++ include/sfx2/sfx.hrc | 1 sfx2/Library_sfx.mk | 1 sfx2/source/view/classificationhelper.cxx | 87 ++++++++++++++++++++++++++++++ sfx2/source/view/view.src | 5 + sfx2/source/view/viewfrm.cxx | 15 +++++ 6 files changed, 148 insertions(+)
New commits: commit 291a10ec557a765a4d3090330964fd1cb7a82f6b Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Feb 17 09:15:50 2016 +0100 sfx2 classification infobar: improve message Change-Id: If8fe5b145014055639a9a2eadd8fded7ebf7c2b3 diff --git a/include/sfx2/sfx.hrc b/include/sfx2/sfx.hrc index 582ad1e..a0d1ae3 100644 --- a/include/sfx2/sfx.hrc +++ b/include/sfx2/sfx.hrc @@ -153,6 +153,7 @@ #define STR_READONLY_DOCUMENT (RID_SFX_START+128) #define STR_PASSWD_MIN_LEN1 (RID_SFX_START+129) #define STR_MODULENOTINSTALLED (RID_SFX_START+130) +#define STR_CLASSIFIED_DOCUMENT (RID_SFX_START+131) #define STR_ACCTITLE_PRODUCTIVITYTOOLS (RID_SFX_START+157) #define SFX_THUMBNAIL_TEXT (RID_SFX_START+158) diff --git a/sfx2/source/view/view.src b/sfx2/source/view/view.src index 1cb6c13..26dbbbd 100644 --- a/sfx2/source/view/view.src +++ b/sfx2/source/view/view.src @@ -91,6 +91,11 @@ String STR_READONLY_DOCUMENT Text [ en-US ] = "This document is open in read-only mode." ; }; +String STR_CLASSIFIED_DOCUMENT +{ + Text [ en-US ] = "The classification label of this document is %1." ; +}; + PushButton BT_CHECKOUT { Pos = MAP_APPFONT( 0 , 0 ); diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx index 55b525d..0585085 100644 --- a/sfx2/source/view/viewfrm.cxx +++ b/sfx2/source/view/viewfrm.cxx @@ -1351,7 +1351,11 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) OUString aBACName = aHelper.GetBACName(); OUString aImpactLevel = aHelper.GetImpactLevel(); if (!aBACName.isEmpty() && !aImpactLevel.isEmpty()) - AppendInfoBar("classification", aBACName); + { + OUString aMessage = SfxResId(STR_CLASSIFIED_DOCUMENT); + aMessage = aMessage.replaceFirst("%1", aBACName); + AppendInfoBar("classification", aMessage); + } } break; commit 823e8d658759ba5ea3c63b20dbe9ffd79f2f5c23 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Feb 17 09:14:06 2016 +0100 sfx2: add initial classification infobar Change-Id: Idd4b886e246cb41d3a3b871eeb368c0620b110ae diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx index 5eb776a..55b525d 100644 --- a/sfx2/source/view/viewfrm.cxx +++ b/sfx2/source/view/viewfrm.cxx @@ -21,6 +21,7 @@ #include <osl/file.hxx> #include <sfx2/infobar.hxx> #include <sfx2/viewfrm.hxx> +#include <sfx2/classificationhelper.hxx> #include <com/sun/star/document/MacroExecMode.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/frame/DispatchRecorder.hpp> @@ -1343,6 +1344,16 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) } } + if (SfxClassificationHelper::IsClassified(*xObjSh.get())) + { + // Document has BAILS properties, display an infobar accordingly. + SfxClassificationHelper aHelper(*xObjSh.get()); + OUString aBACName = aHelper.GetBACName(); + OUString aImpactLevel = aHelper.GetImpactLevel(); + if (!aBACName.isEmpty() && !aImpactLevel.isEmpty()) + AppendInfoBar("classification", aBACName); + } + break; } commit 89b928d43a5db1ad3bf761cdb24013c6bcf32e8b Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Feb 17 09:13:42 2016 +0100 sfx2: introduce initial SfxClassificationHelper A document's metadata has predefinied keys like title, and has user-defined ones as well. The BAILS specification at <http://www.tscp.org/wp-content/uploads/2013/08/TSCP_BAILSv1.pdf> describes a mechanism to use the generic user-defined key-value pairs to embed classification-related (read: is it public? is it internal only? etc) information in a standard way. One approach in handling these in LO would be to let code here and there parse these user-defined key-value pairs again and again. An other one would be to handle these as first-class properties, even if the majority of the users would never need them. A middle between the above two approaches is this class: all these properties are still just user-defined properties, but if the document has them, then all related code is supposed to be implemented in this central class. Change-Id: Ib0297a5e91779b330c310a153f1a1628759dd028 diff --git a/include/sfx2/classificationhelper.hxx b/include/sfx2/classificationhelper.hxx new file mode 100644 index 0000000..8662742 --- /dev/null +++ b/include/sfx2/classificationhelper.hxx @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_SFX2_CLASSIFICATIONHELPER_HXX +#define INCLUDED_SFX2_CLASSIFICATIONHELPER_HXX + +#include <memory> + +#include <rtl/ustring.hxx> +#include <sfx2/dllapi.h> + +class SfxObjectShell; + +/// Shared code to handle Business Authorization Identification and Labeling Scheme (BAILS) properties. +class SFX2_DLLPUBLIC SfxClassificationHelper +{ + struct Impl; + std::unique_ptr<Impl> m_pImpl; + +public: + /// Does the document have any BAILS properties? + static bool IsClassified(SfxObjectShell& rObjectShell); + + SfxClassificationHelper(SfxObjectShell& rObjectShell); + ~SfxClassificationHelper(); + OUString GetBACName(); + /// Impact level is a string, as the scale can be integer-based, but can be also low/high. + OUString GetImpactLevel(); +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk index 2440cdc..418a836 100644 --- a/sfx2/Library_sfx.mk +++ b/sfx2/Library_sfx.mk @@ -290,6 +290,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\ sfx2/source/styles/StyleManager \ sfx2/source/toolbox/imgmgr \ sfx2/source/toolbox/tbxitem \ + sfx2/source/view/classificationhelper \ sfx2/source/view/frame \ sfx2/source/view/frame2 \ sfx2/source/view/frmload \ diff --git a/sfx2/source/view/classificationhelper.cxx b/sfx2/source/view/classificationhelper.cxx new file mode 100644 index 0000000..c4e2245 --- /dev/null +++ b/sfx2/source/view/classificationhelper.cxx @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <sfx2/classificationhelper.hxx> + +#include <map> + +#include <com/sun/star/beans/XPropertyContainer.hpp> +#include <com/sun/star/document/XDocumentProperties.hpp> + +#include <sfx2/objsh.hxx> +#include <o3tl/make_unique.hxx> + +using namespace com::sun::star; + +/// Implementation details of SfxClassificationHelper. +struct SfxClassificationHelper::Impl +{ + std::map<OUString, OUString> m_aLabels; +}; + +bool SfxClassificationHelper::IsClassified(SfxObjectShell& rObjectShell) +{ + uno::Reference<document::XDocumentProperties> xDocumentProperties = rObjectShell.getDocProperties(); + uno::Reference<beans::XPropertyContainer> xPropertyContainer = xDocumentProperties->getUserDefinedProperties(); + if (!xPropertyContainer.is()) + return false; + + uno::Reference<beans::XPropertySet> xPropertySet(xPropertyContainer, uno::UNO_QUERY); + uno::Sequence<beans::Property> aProperties = xPropertySet->getPropertySetInfo()->getProperties(); + for (const beans::Property& rProperty : aProperties) + { + if (rProperty.Name.startsWith("urn:bails:")) + return true; + } + + return false; +} + +SfxClassificationHelper::SfxClassificationHelper(SfxObjectShell& rObjectShell) + : m_pImpl(o3tl::make_unique<Impl>()) +{ + uno::Reference<document::XDocumentProperties> xDocumentProperties = rObjectShell.getDocProperties(); + uno::Reference<beans::XPropertyContainer> xPropertyContainer = xDocumentProperties->getUserDefinedProperties(); + if (!xPropertyContainer.is()) + return; + + uno::Reference<beans::XPropertySet> xPropertySet(xPropertyContainer, uno::UNO_QUERY); + uno::Sequence<beans::Property> aProperties = xPropertySet->getPropertySetInfo()->getProperties(); + for (const beans::Property& rProperty : aProperties) + { + uno::Any aAny = xPropertySet->getPropertyValue(rProperty.Name); + OUString aValue; + if (aAny >>= aValue) + m_pImpl->m_aLabels[rProperty.Name] = aValue; + } +} + +SfxClassificationHelper::~SfxClassificationHelper() +{ +} + +OUString SfxClassificationHelper::GetBACName() +{ + std::map<OUString, OUString>::iterator it = m_pImpl->m_aLabels.find("urn:bails:IntellectualProperty:BusinessAuthorizationCategory:Name"); + if (it != m_pImpl->m_aLabels.end()) + return it->second; + + return OUString(); +} + +OUString SfxClassificationHelper::GetImpactLevel() +{ + std::map<OUString, OUString>::iterator it = m_pImpl->m_aLabels.find("urn:bails:IntellectualProperty:Impact:Level:Confidentiality"); + if (it != m_pImpl->m_aLabels.end()) + return it->second; + + return OUString(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits