summaryrefslogtreecommitdiff
path: root/writerperfect
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2014-01-16 13:22:26 +0100
committerDavid Tardon <dtardon@redhat.com>2014-01-16 16:40:00 +0100
commit04a9214fbf6da2ec9fa36fca4bb949d8f712c982 (patch)
treeb1cc8527ae497fa5eddddfd081ab60a461123123 /writerperfect
parent28619201e92aea86a938dd57ed7f79c22d14d89c (diff)
css::packages::Packages is a wrong choice
Change-Id: I7d27e7f320633c176fb9fb0a5f64e891fff6c4d7
Diffstat (limited to 'writerperfect')
-rw-r--r--writerperfect/source/common/WPXSvStream.cxx90
1 files changed, 38 insertions, 52 deletions
diff --git a/writerperfect/source/common/WPXSvStream.cxx b/writerperfect/source/common/WPXSvStream.cxx
index 0084ec3039d6..6bb14d289151 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 &)
{