[Libreoffice-commits] core.git: 3 commits - package/inc package/source writerperfect/source

David Tardon dtardon at redhat.com
Thu Jan 16 07:40:43 PST 2014


 package/inc/ZipPackage.hxx                  |   14 ----
 package/inc/zipfileaccess.hxx               |    1 
 package/source/zippackage/ZipPackage.cxx    |   25 -------
 package/source/zippackage/zipfileaccess.cxx |    4 -
 writerperfect/source/common/WPXSvStream.cxx |   90 +++++++++++-----------------
 5 files changed, 44 insertions(+), 90 deletions(-)

New commits:
commit c20db8735e3f30cf61940e8c1da739efcb00ae22
Author: David Tardon <dtardon at redhat.com>
Date:   Thu Jan 16 16:37:57 2014 +0100

    Revert "impl. enumeration for ZipPackage"
    
    This reverts commit 5b2cca80eeb2c8ee210820cc8ed95e5d69214807.
    Also reverts commit 86a5053df0d755d10121d65c533f3d327340a0fd.

diff --git a/package/inc/ZipPackage.hxx b/package/inc/ZipPackage.hxx
index 1a0bb30..3631799 100644
--- a/package/inc/ZipPackage.hxx
+++ b/package/inc/ZipPackage.hxx
@@ -19,9 +19,8 @@
 #ifndef _ZIP_PACKAGE_HXX
 #define _ZIP_PACKAGE_HXX
 
-#include <cppuhelper/implbase8.hxx>
+#include <cppuhelper/implbase7.hxx>
 #include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/container/XEnumerationAccess.hpp>
 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
 #include <com/sun/star/util/XChangesBatch.hpp>
@@ -64,13 +63,12 @@ enum InitialisationMode
     e_IMode_XStream
 };
 
-class ZipPackage : public cppu::WeakImplHelper8
+class ZipPackage : public cppu::WeakImplHelper7
                     <
                        com::sun::star::lang::XInitialization,
                        com::sun::star::lang::XSingleServiceFactory,
                        com::sun::star::lang::XUnoTunnel,
                        com::sun::star::lang::XServiceInfo,
-                       com::sun::star::container::XEnumerationAccess,
                        com::sun::star::container::XHierarchicalNameAccess,
                        com::sun::star::util::XChangesBatch,
                        com::sun::star::beans::XPropertySet
@@ -143,14 +141,6 @@ public:
     // XInitialization
     virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
         throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
-    // XEnumerationAccess
-    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration()
-        throw(::com::sun::star::uno::RuntimeException);
-    // XElementType
-    virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
-        throw(::com::sun::star::uno::RuntimeException);
-    virtual sal_Bool SAL_CALL hasElements()
-        throw(::com::sun::star::uno::RuntimeException);
     // XHierarchicalNameAccess
     virtual ::com::sun::star::uno::Any SAL_CALL getByHierarchicalName( const OUString& aName )
         throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
diff --git a/package/source/zippackage/ZipPackage.cxx b/package/source/zippackage/ZipPackage.cxx
index bf0e026..f20b1f0 100644
--- a/package/source/zippackage/ZipPackage.cxx
+++ b/package/source/zippackage/ZipPackage.cxx
@@ -66,7 +66,6 @@
 #include <osl/time.h>
 #include "com/sun/star/io/XAsyncOutputMonitor.hpp"
 
-#include <cassert>
 #include <cstring>
 #include <memory>
 #include <vector>
@@ -778,30 +777,6 @@ void SAL_CALL ZipPackage::initialize( const uno::Sequence< Any >& aArguments )
     }
 }
 
-::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL ZipPackage::createEnumeration()
-        throw( RuntimeException )
-{
-    assert(m_pRootFolder);
-
-    return m_pRootFolder->createEnumeration();
-}
-
-::com::sun::star::uno::Type SAL_CALL ZipPackage::getElementType()
-        throw( RuntimeException )
-{
-    assert(m_pRootFolder);
-
-    return m_pRootFolder->getElementType();
-}
-
-sal_Bool SAL_CALL ZipPackage::hasElements()
-        throw( RuntimeException )
-{
-    assert(m_pRootFolder);
-
-    return m_pRootFolder->hasElements();
-}
-
 Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName )
         throw( NoSuchElementException, RuntimeException )
 {
commit 04a9214fbf6da2ec9fa36fca4bb949d8f712c982
Author: David Tardon <dtardon at redhat.com>
Date:   Thu Jan 16 13:22:26 2014 +0100

    css::packages::Packages is a wrong choice
    
    Change-Id: I7d27e7f320633c176fb9fb0a5f64e891fff6c4d7

diff --git a/writerperfect/source/common/WPXSvStream.cxx b/writerperfect/source/common/WPXSvStream.cxx
index 0084ec3..6bb14d2 100644
--- a/writerperfect/source/common/WPXSvStream.cxx
+++ b/writerperfect/source/common/WPXSvStream.cxx
@@ -9,13 +9,11 @@
 
 #include "WPXSvStream.hxx"
 
-#include <com/sun/star/container/XEnumerationAccess.hpp>
-#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
-#include <com/sun/star/container/XNamed.hpp>
-#include <com/sun/star/io/XActiveDataSink.hpp>
+#include <com/sun/star/packages/zip/XZipFileAccess2.hpp>
 #include <com/sun/star/uno/Any.hxx>
 
 #include <comphelper/processfactory.hxx>
+#include <comphelper/seekableinput.hxx>
 
 #include <rtl/string.hxx>
 #include <tools/stream.hxx>
@@ -263,8 +261,6 @@ struct ZipStreamData
     rtl::OString aName;
 };
 
-typedef boost::unordered_map<rtl::OUString, Reference<XInputStream>, rtl::OUStringHash> ZipStorageMap_t;
-
 /** Representation of a Zip storage.
   *
   * This is quite similar to OLEStorageImpl, except that we do not need
@@ -272,7 +268,7 @@ typedef boost::unordered_map<rtl::OUString, Reference<XInputStream>, rtl::OUStri
   */
 struct ZipStorageImpl
 {
-    ZipStorageImpl(const Reference<container::XHierarchicalNameAccess> &rxRoot);
+    ZipStorageImpl(const Reference<container::XNameAccess> &rxContainer);
 
     /** Initialize for access.
       *
@@ -286,12 +282,12 @@ struct ZipStorageImpl
     Reference<XInputStream> getStream(std::size_t nId);
 
 private:
-    void traverse(const Reference<container::XEnumeration> &rxEnum, const rtl::OUString &rPath);
+    void traverse(const Reference<container::XNameAccess> &rxEnum);
 
     Reference<XInputStream> createStream(const rtl::OUString &rPath);
 
 public:
-    Reference<container::XHierarchicalNameAccess> mxRoot; //< root of the Zip
+    Reference<container::XNameAccess> mxContainer; //< root of the Zip
     ::std::vector< ZipStreamData > maStreams; //< list of streams and their names
     NameMap_t maNameMap; //< map of stream names to indexes (into @c maStreams)
     bool mbInitialized;
@@ -303,21 +299,18 @@ ZipStreamData::ZipStreamData(const rtl::OString &rName)
 {
 }
 
-ZipStorageImpl::ZipStorageImpl(const Reference<container::XHierarchicalNameAccess> &rxRoot)
-    : mxRoot(rxRoot)
+ZipStorageImpl::ZipStorageImpl(const Reference<container::XNameAccess> &rxContainer)
+    : mxContainer(rxContainer)
     , maStreams()
     , maNameMap()
     , mbInitialized(false)
 {
-    assert(mxRoot.is());
+    assert(mxContainer.is());
 }
 
 void ZipStorageImpl::initialize()
 {
-    const Reference<container::XEnumerationAccess> xEnum(mxRoot, UNO_QUERY);
-
-    if (xEnum.is())
-        traverse(xEnum->createEnumeration(), "");
+    traverse(mxContainer);
 
     mbInitialized = true;
 }
@@ -346,39 +339,18 @@ Reference<XInputStream> ZipStorageImpl::getStream(const std::size_t nId)
     return maStreams[nId].xStream;
 }
 
-void ZipStorageImpl::traverse(const Reference<container::XEnumeration> &rxEnum, const rtl::OUString &rPath)
+void ZipStorageImpl::traverse(const Reference<container::XNameAccess> &rxContainer)
 {
-    while (rxEnum->hasMoreElements())
-    {
-        Any aItem;
-        try
-        {
-            aItem = rxEnum->nextElement();
-        }
-        catch (const Exception &)
-        {
-            continue;
-        }
-
-        const Reference<container::XNamed> xNamed(aItem, UNO_QUERY);
-        const Reference<XActiveDataSink> xSink(aItem, UNO_QUERY);
-        const Reference<container::XEnumerationAccess> xEnum(aItem, UNO_QUERY);
+    const Sequence<rtl::OUString> lNames = rxContainer->getElementNames();
 
-        if (xSink.is() && xNamed.is())
-        {
-            maStreams.push_back(ZipStreamData(rtl::OUStringToOString(xNamed->getName(), RTL_TEXTENCODING_UTF8)));
-            maNameMap[concatPath(rPath, xNamed->getName())] = maStreams.size() - 1;
-        }
-        else if (xEnum.is() && xNamed.is())
-        {
-            const rtl::OUString aPath = concatPath(rPath, xNamed->getName());
+    maStreams.reserve(lNames.getLength());
 
-            // deep-first traversal
-            traverse(xEnum->createEnumeration(), aPath);
-        }
-        else
+    for (sal_Int32 n = 0; n < lNames.getLength(); ++n)
+    {
+        if (!lNames[n].endsWithAsciiL("/", 1)) // skip dirs
         {
-            assert(0);
+            maStreams.push_back(ZipStreamData(rtl::OUStringToOString(lNames[n], RTL_TEXTENCODING_UTF8)));
+            maNameMap[lNames[n]] = maStreams.size() - 1;
         }
     }
 }
@@ -389,8 +361,13 @@ Reference<XInputStream> ZipStorageImpl::createStream(const rtl::OUString &rPath)
 
     try
     {
-        const Reference<XActiveDataSink> xSink(mxRoot->getByHierarchicalName(rPath), UNO_QUERY_THROW);
-        xStream.set(xSink->getInputStream(), UNO_QUERY_THROW);
+        const Reference<XInputStream> xInputStream(mxContainer->getByName(rPath), UNO_QUERY_THROW);
+        const Reference<XSeekable> xSeekable(xInputStream, UNO_QUERY);
+
+        if (xSeekable.is())
+            xStream = xInputStream;
+        else
+            xStream.set(new comphelper::OSeekableInputWrapper(xInputStream, comphelper::getProcessComponentContext()));
     }
     catch (const Exception &)
     {
@@ -431,6 +408,7 @@ private:
     void ensureZipIsInitialized();
 
     WPXInputStream *createWPXStream(const SotStorageStreamRef &rxStorage);
+    WPXInputStream *createWPXStream(const Reference<XInputStream> &rxStream);
 
 private:
     ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > mxStream;
@@ -673,7 +651,7 @@ WPXInputStream *WPXSvInputStreamImpl::getSubStreamByName(const char *const name)
 
         try
         {
-            return new WPXSvInputStream(mpZipStorage->getStream(aName));
+            return createWPXStream(mpZipStorage->getStream(aName));
         }
         catch (const Exception &)
         {
@@ -713,7 +691,7 @@ WPXInputStream *WPXSvInputStreamImpl::getSubStreamById(const unsigned id)
 
         try
         {
-            return new WPXSvInputStream(mpZipStorage->getStream(id));
+            return createWPXStream(mpZipStorage->getStream(id));
         }
         catch (const Exception &)
         {
@@ -743,6 +721,14 @@ WPXInputStream *WPXSvInputStreamImpl::createWPXStream(const SotStorageStreamRef
         return 0;
 }
 
+WPXInputStream *WPXSvInputStreamImpl::createWPXStream(const Reference<XInputStream> &rxStream)
+{
+    if (rxStream.is())
+        return new WPXSvInputStream( rxStream );
+    else
+        return 0;
+}
+
 bool WPXSvInputStreamImpl::isOLE()
 {
     if (!mbCheckedOLE)
@@ -771,10 +757,10 @@ bool WPXSvInputStreamImpl::isZip()
             aArgs[0] <<= mxStream;
 
             const Reference<XComponentContext> xContext(comphelper::getProcessComponentContext(), UNO_QUERY_THROW);
-            const Reference<container::XHierarchicalNameAccess> xZipStorage(
-                    xContext->getServiceManager()->createInstanceWithArgumentsAndContext("com.sun.star.packages.Package", aArgs, xContext),
+            const Reference<packages::zip::XZipFileAccess2> xZip(
+                    xContext->getServiceManager()->createInstanceWithArgumentsAndContext("com.sun.star.packages.zip.ZipFileAccess", aArgs, xContext),
                     UNO_QUERY_THROW);
-            mpZipStorage.reset(new ZipStorageImpl(xZipStorage));
+            mpZipStorage.reset(new ZipStorageImpl(xZip));
         }
         catch (const Exception &)
         {
commit 28619201e92aea86a938dd57ed7f79c22d14d89c
Author: David Tardon <dtardon at redhat.com>
Date:   Thu Jan 16 16:15:10 2014 +0100

    do not close input, unless it was us who opened it
    
    Change-Id: I6ffedd1e64e48b4fc4bd6f5eb63e96b49f1a8508

diff --git a/package/inc/zipfileaccess.hxx b/package/inc/zipfileaccess.hxx
index 59d2acc..6b1c1cdc 100644
--- a/package/inc/zipfileaccess.hxx
+++ b/package/inc/zipfileaccess.hxx
@@ -51,6 +51,7 @@ class OZipFileAccess : public ::cppu::WeakImplHelper4<
     ::cppu::OInterfaceContainerHelper* m_pListenersContainer;
 
     sal_Bool m_bDisposed;
+    bool m_bOwnContent;
 
 public:
     OZipFileAccess( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext );
diff --git a/package/source/zippackage/zipfileaccess.cxx b/package/source/zippackage/zipfileaccess.cxx
index 17c5cf2..3139c10 100644
--- a/package/source/zippackage/zipfileaccess.cxx
+++ b/package/source/zippackage/zipfileaccess.cxx
@@ -43,6 +43,7 @@ OZipFileAccess::OZipFileAccess( const uno::Reference< uno::XComponentContext >&
 , m_pZipFile( NULL )
 , m_pListenersContainer( NULL )
 , m_bDisposed( sal_False )
+, m_bOwnContent( false )
 {
     if ( !rxContext.is() )
         throw uno::RuntimeException(OSL_LOG_PREFIX, uno::Reference< uno::XInterface >() );
@@ -188,6 +189,7 @@ void SAL_CALL OZipFileAccess::initialize( const uno::Sequence< uno::Any >& aArgu
         if ( aContent.openStream ( xSink ) )
         {
             m_xContentStream = xSink->getInputStream();
+            m_bOwnContent = true;
             xSeekable = uno::Reference< io::XSeekable >( m_xContentStream, uno::UNO_QUERY );
         }
     }
@@ -385,7 +387,7 @@ void SAL_CALL OZipFileAccess::dispose()
         m_pZipFile = NULL;
     }
 
-    if ( m_xContentStream.is() )
+    if ( m_xContentStream.is() && m_bOwnContent )
         try {
             m_xContentStream->closeInput();
         } catch( uno::Exception& )


More information about the Libreoffice-commits mailing list