summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-05-21 22:26:05 +0200
committerCaolán McNamara <caolanm@redhat.com>2014-05-22 10:23:42 -0500
commit9d2b0fd3424eaf8a685728aa7788e1148159714d (patch)
tree3bcf0d24931ab408dc9c32eed6f96a51ce130a80 /basic
parentadfd7805bc61ff4ec56f6570fc516ff3aad74a28 (diff)
fdo#68983: basic: if the library is not loaded fully, copy source storage
Also fixes fdo#42899 and fdo#67685 in a different way; the previous fix for fdo#42899 caused the problem with password-protected libraries for which the password is not known: only the binary representation of the BAISC module was stored, not the source code; by simply copying from the source storage the problem can be avoided. It would be possible to ask for the password when storing, but that would not work when non-interactive (called via API). An alternative fix would be to pass in the SfxObjectShell::IsSetModifyEnabled() flag and actually reset the BASIC library's modify flag correctly, but that requires adding a parameter to XStorageBasedLibraryContainer::storeLibrariesToStorage(). (regression from af34774d260a68fc02cd78ba90dd8d4afaf1a2a4 ) (cherry picked from commit 5246fa262450f686674850c53df666422f441c86) Conflicts: basic/source/inc/namecont.hxx basic/source/inc/scriptcont.hxx basic/source/uno/namecont.cxx sw/CppunitTest_sw_macros_test.mk sw: use xsec_xmlsec.windows on WNT (cherry picked from commit 3e69b7bcd3e4a9cb1a29360c905e7fba96365999) Change-Id: I4701401f35171139fc2fe8d225d13d4e533091a0 Reviewed-on: https://gerrit.libreoffice.org/9437 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'basic')
-rw-r--r--basic/source/inc/namecont.hxx4
-rw-r--r--basic/source/inc/scriptcont.hxx1
-rw-r--r--basic/source/uno/namecont.cxx17
-rw-r--r--basic/source/uno/scriptcont.cxx6
4 files changed, 23 insertions, 5 deletions
diff --git a/basic/source/inc/namecont.hxx b/basic/source/inc/namecont.hxx
index 0568a9814631..6a04d9dd4a5c 100644
--- a/basic/source/inc/namecont.hxx
+++ b/basic/source/inc/namecont.hxx
@@ -582,7 +582,9 @@ private:
sal_Bool mbReadOnlyLink;
sal_Bool mbPreload;
+protected:
sal_Bool mbPasswordProtected;
+private:
sal_Bool mbPasswordVerified;
bool mbDoc50Password;
OUString maPassword;
@@ -702,6 +704,8 @@ public:
}
protected:
+ virtual bool isLoadedStorable();
+
virtual bool SAL_CALL isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const = 0;
};
diff --git a/basic/source/inc/scriptcont.hxx b/basic/source/inc/scriptcont.hxx
index 357c66336b6e..d9abeb529061 100644
--- a/basic/source/inc/scriptcont.hxx
+++ b/basic/source/inc/scriptcont.hxx
@@ -154,6 +154,7 @@ class SfxScriptLibrary : public SfxLibrary, public SfxScriptLibrary_BASE
const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler );
virtual void storeResourcesToStorage( const ::com::sun::star::uno::Reference
< ::com::sun::star::embed::XStorage >& xStorage );
+ virtual bool isLoadedStorable() SAL_OVERRIDE;
public:
SfxScriptLibrary
diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx
index 20e2bb39cb4c..28efa643f767 100644
--- a/basic/source/uno/namecont.cxx
+++ b/basic/source/uno/namecont.cxx
@@ -1920,8 +1920,6 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto
if( pImplLib->implIsModified() || bComplete )
{
-// For the moment don't copy storage (as an optimisation )
-// but instead always write to storage from memory.
// Testing pImplLib->implIsModified() is not reliable,
// IMHO the value of pImplLib->implIsModified() should
// reflect whether the library ( in-memory ) model
@@ -1932,9 +1930,14 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto
// temp storage when saving ( and later sets the root storage of the
// library container ) and similar madness in dbaccess means some surgery
// is required to make it possible to successfully use this optimisation
-#if 0
+// It would be possible to do the implSetModified() call below only
+// conditionally, but that would require an additional boolean to be
+// passed in via the XStorageBasedDocument::storeLibrariesToStorage()...
+// fdo#68983: If there's a password and the password is not known, only
+// copying the storage works!
// Can we simply copy the storage?
- if( !mbOldInfoFormat && !pImplLib->implIsModified() && !mbOasis2OOoFormat && xSourceLibrariesStor.is() )
+ if (!mbOldInfoFormat && !pImplLib->isLoadedStorable() &&
+ !mbOasis2OOoFormat && xSourceLibrariesStor.is())
{
try
{
@@ -1947,7 +1950,6 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto
}
}
else
-#endif
{
uno::Reference< embed::XStorage > xLibraryStor;
if( bStorage )
@@ -3051,6 +3053,11 @@ SfxLibrary::SfxLibrary( ModifiableHelper& _rModifiable, const Type& aType,
{
}
+bool SfxLibrary::isLoadedStorable()
+{
+ return mbLoaded && (!mbPasswordProtected || mbPasswordVerified);
+}
+
void SfxLibrary::implSetModified( sal_Bool _bIsModified )
{
if ( mbIsModified == _bIsModified )
diff --git a/basic/source/uno/scriptcont.cxx b/basic/source/uno/scriptcont.cxx
index e8c92cff7183..e1f0c9da45f5 100644
--- a/basic/source/uno/scriptcont.cxx
+++ b/basic/source/uno/scriptcont.cxx
@@ -1259,6 +1259,12 @@ SfxScriptLibrary::SfxScriptLibrary( ModifiableHelper& _rModifiable,
{
}
+bool SfxScriptLibrary::isLoadedStorable()
+{
+ // note: mbLoadedSource can only be true for password-protected lib!
+ return SfxLibrary::isLoadedStorable() && (!mbPasswordProtected || mbLoadedSource);
+}
+
// Provide modify state including resources
sal_Bool SfxScriptLibrary::isModified( void )
{