1*dde7d3faSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*dde7d3faSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*dde7d3faSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*dde7d3faSAndrew Rist  * distributed with this work for additional information
6*dde7d3faSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*dde7d3faSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*dde7d3faSAndrew Rist  * "License"); you may not use this file except in compliance
9*dde7d3faSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*dde7d3faSAndrew Rist  *
11*dde7d3faSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*dde7d3faSAndrew Rist  *
13*dde7d3faSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*dde7d3faSAndrew Rist  * software distributed under the License is distributed on an
15*dde7d3faSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*dde7d3faSAndrew Rist  * KIND, either express or implied.  See the License for the
17*dde7d3faSAndrew Rist  * specific language governing permissions and limitations
18*dde7d3faSAndrew Rist  * under the License.
19*dde7d3faSAndrew Rist  *
20*dde7d3faSAndrew Rist  *************************************************************/
21*dde7d3faSAndrew Rist 
22*dde7d3faSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_comphelper.hxx"
26cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp>
27cdf0e10cSrcweir #include <com/sun/star/embed/XEncryptionProtectedSource2.hpp>
28cdf0e10cSrcweir #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
29cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
30cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
31cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp>
32cdf0e10cSrcweir #include <com/sun/star/beans/IllegalTypeException.hpp>
33cdf0e10cSrcweir #include <com/sun/star/xml/crypto/XDigestContext.hpp>
34cdf0e10cSrcweir #include <com/sun/star/xml/crypto/XDigestContextSupplier.hpp>
35cdf0e10cSrcweir #include <com/sun/star/xml/crypto/DigestID.hpp>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include <rtl/digest.h>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <ucbhelper/content.hxx>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <comphelper/fileformat.h>
42cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
43cdf0e10cSrcweir #include <comphelper/documentconstants.hxx>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #include <comphelper/storagehelper.hxx>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 
48cdf0e10cSrcweir using namespace ::com::sun::star;
49cdf0e10cSrcweir 
50cdf0e10cSrcweir namespace comphelper {
51cdf0e10cSrcweir 
52cdf0e10cSrcweir // ----------------------------------------------------------------------
53cdf0e10cSrcweir uno::Reference< lang::XSingleServiceFactory > OStorageHelper::GetStorageFactory(
54cdf0e10cSrcweir 							const uno::Reference< lang::XMultiServiceFactory >& xSF )
55cdf0e10cSrcweir 		throw ( uno::Exception )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir 	uno::Reference< lang::XMultiServiceFactory > xFactory = xSF.is() ? xSF : ::comphelper::getProcessServiceFactory();
58cdf0e10cSrcweir 	if ( !xFactory.is() )
59cdf0e10cSrcweir 		throw uno::RuntimeException();
60cdf0e10cSrcweir 
61cdf0e10cSrcweir 	uno::Reference < lang::XSingleServiceFactory > xStorageFactory(
62cdf0e10cSrcweir 					xFactory->createInstance ( ::rtl::OUString::createFromAscii( "com.sun.star.embed.StorageFactory" ) ),
63cdf0e10cSrcweir 					uno::UNO_QUERY );
64cdf0e10cSrcweir 
65cdf0e10cSrcweir 	if ( !xStorageFactory.is() )
66cdf0e10cSrcweir 		throw uno::RuntimeException();
67cdf0e10cSrcweir 
68cdf0e10cSrcweir 	return xStorageFactory;
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
71cdf0e10cSrcweir // ----------------------------------------------------------------------
72cdf0e10cSrcweir uno::Reference< lang::XSingleServiceFactory > OStorageHelper::GetFileSystemStorageFactory(
73cdf0e10cSrcweir 							const uno::Reference< lang::XMultiServiceFactory >& xSF )
74cdf0e10cSrcweir 		throw ( uno::Exception )
75cdf0e10cSrcweir {
76cdf0e10cSrcweir 	uno::Reference< lang::XMultiServiceFactory > xFactory = xSF.is() ? xSF : ::comphelper::getProcessServiceFactory();
77cdf0e10cSrcweir 	if ( !xFactory.is() )
78cdf0e10cSrcweir 		throw uno::RuntimeException();
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	uno::Reference < lang::XSingleServiceFactory > xStorageFactory(
81cdf0e10cSrcweir 					xFactory->createInstance ( ::rtl::OUString::createFromAscii( "com.sun.star.embed.FileSystemStorageFactory" ) ),
82cdf0e10cSrcweir 					uno::UNO_QUERY );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 	if ( !xStorageFactory.is() )
85cdf0e10cSrcweir 		throw uno::RuntimeException();
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 	return xStorageFactory;
88cdf0e10cSrcweir }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir // ----------------------------------------------------------------------
91cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetTemporaryStorage(
92cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory )
93cdf0e10cSrcweir 	throw ( uno::Exception )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage( GetStorageFactory( xFactory )->createInstance(),
96cdf0e10cSrcweir 													uno::UNO_QUERY );
97cdf0e10cSrcweir 	if ( !xTempStorage.is() )
98cdf0e10cSrcweir 		throw uno::RuntimeException();
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 	return xTempStorage;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir // ----------------------------------------------------------------------
104cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetStorageFromURL(
105cdf0e10cSrcweir 			const ::rtl::OUString& aURL,
106cdf0e10cSrcweir 			sal_Int32 nStorageMode,
107cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory )
108cdf0e10cSrcweir 	throw ( uno::Exception )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	uno::Sequence< uno::Any > aArgs( 2 );
111cdf0e10cSrcweir 	aArgs[0] <<= aURL;
112cdf0e10cSrcweir 	aArgs[1] <<= nStorageMode;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage( GetStorageFactory( xFactory )->createInstanceWithArguments( aArgs ),
115cdf0e10cSrcweir 													uno::UNO_QUERY );
116cdf0e10cSrcweir 	if ( !xTempStorage.is() )
117cdf0e10cSrcweir 		throw uno::RuntimeException();
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	return xTempStorage;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir // ----------------------------------------------------------------------
123cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetStorageFromURL2(
124cdf0e10cSrcweir 			const ::rtl::OUString& aURL,
125cdf0e10cSrcweir 			sal_Int32 nStorageMode,
126cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory )
127cdf0e10cSrcweir 	throw ( uno::Exception )
128cdf0e10cSrcweir {
129cdf0e10cSrcweir 	uno::Sequence< uno::Any > aArgs( 2 );
130cdf0e10cSrcweir 	aArgs[0] <<= aURL;
131cdf0e10cSrcweir 	aArgs[1] <<= nStorageMode;
132cdf0e10cSrcweir 
133cdf0e10cSrcweir     uno::Reference< lang::XSingleServiceFactory > xFact;
134cdf0e10cSrcweir     try {
135cdf0e10cSrcweir         ::ucbhelper::Content aCntnt( aURL,
136cdf0e10cSrcweir             uno::Reference< ::com::sun::star::ucb::XCommandEnvironment > () );
137cdf0e10cSrcweir         if (aCntnt.isDocument()) {
138cdf0e10cSrcweir             xFact = GetStorageFactory( xFactory );
139cdf0e10cSrcweir         } else {
140cdf0e10cSrcweir             xFact = GetFileSystemStorageFactory( xFactory );
141cdf0e10cSrcweir         }
142cdf0e10cSrcweir     } catch (uno::Exception &) { }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     if (!xFact.is()) throw uno::RuntimeException();
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage(
147cdf0e10cSrcweir         xFact->createInstanceWithArguments( aArgs ), uno::UNO_QUERY );
148cdf0e10cSrcweir 	if ( !xTempStorage.is() )
149cdf0e10cSrcweir 		throw uno::RuntimeException();
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 	return xTempStorage;
152cdf0e10cSrcweir }
153cdf0e10cSrcweir 
154cdf0e10cSrcweir // ----------------------------------------------------------------------
155cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetStorageFromInputStream(
156cdf0e10cSrcweir             const uno::Reference < io::XInputStream >& xStream,
157cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory )
158cdf0e10cSrcweir 		throw ( uno::Exception )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir 	uno::Sequence< uno::Any > aArgs( 2 );
161cdf0e10cSrcweir 	aArgs[0] <<= xStream;
162cdf0e10cSrcweir 	aArgs[1] <<= embed::ElementModes::READ;
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage( GetStorageFactory( xFactory )->createInstanceWithArguments( aArgs ),
165cdf0e10cSrcweir 													uno::UNO_QUERY );
166cdf0e10cSrcweir 	if ( !xTempStorage.is() )
167cdf0e10cSrcweir 		throw uno::RuntimeException();
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 	return xTempStorage;
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
172cdf0e10cSrcweir // ----------------------------------------------------------------------
173cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetStorageFromStream(
174cdf0e10cSrcweir             const uno::Reference < io::XStream >& xStream,
175cdf0e10cSrcweir 			sal_Int32 nStorageMode,
176cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory )
177cdf0e10cSrcweir 		throw ( uno::Exception )
178cdf0e10cSrcweir {
179cdf0e10cSrcweir 	uno::Sequence< uno::Any > aArgs( 2 );
180cdf0e10cSrcweir 	aArgs[0] <<= xStream;
181cdf0e10cSrcweir 	aArgs[1] <<= nStorageMode;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage( GetStorageFactory( xFactory )->createInstanceWithArguments( aArgs ),
184cdf0e10cSrcweir 													uno::UNO_QUERY );
185cdf0e10cSrcweir 	if ( !xTempStorage.is() )
186cdf0e10cSrcweir 		throw uno::RuntimeException();
187cdf0e10cSrcweir 
188cdf0e10cSrcweir 	return xTempStorage;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir // ----------------------------------------------------------------------
192cdf0e10cSrcweir void OStorageHelper::CopyInputToOutput(
193cdf0e10cSrcweir 			const uno::Reference< io::XInputStream >& xInput,
194cdf0e10cSrcweir 			const uno::Reference< io::XOutputStream >& xOutput )
195cdf0e10cSrcweir 	throw ( uno::Exception )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir 	static const sal_Int32 nConstBufferSize = 32000;
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 	sal_Int32 nRead;
200cdf0e10cSrcweir 	uno::Sequence < sal_Int8 > aSequence ( nConstBufferSize );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	do
203cdf0e10cSrcweir 	{
204cdf0e10cSrcweir 		nRead = xInput->readBytes ( aSequence, nConstBufferSize );
205cdf0e10cSrcweir 		if ( nRead < nConstBufferSize )
206cdf0e10cSrcweir 		{
207cdf0e10cSrcweir 			uno::Sequence < sal_Int8 > aTempBuf ( aSequence.getConstArray(), nRead );
208cdf0e10cSrcweir 			xOutput->writeBytes ( aTempBuf );
209cdf0e10cSrcweir 		}
210cdf0e10cSrcweir 		else
211cdf0e10cSrcweir 			xOutput->writeBytes ( aSequence );
212cdf0e10cSrcweir 	}
213cdf0e10cSrcweir 	while ( nRead == nConstBufferSize );
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir // ----------------------------------------------------------------------
217cdf0e10cSrcweir uno::Reference< io::XInputStream > OStorageHelper::GetInputStreamFromURL(
218cdf0e10cSrcweir 			const ::rtl::OUString& aURL,
219cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xSF )
220cdf0e10cSrcweir 	throw ( uno::Exception )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir 	uno::Reference< lang::XMultiServiceFactory > xFactory = xSF.is() ? xSF : ::comphelper::getProcessServiceFactory();
223cdf0e10cSrcweir 	if ( !xFactory.is() )
224cdf0e10cSrcweir 		throw uno::RuntimeException();
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 	uno::Reference < ::com::sun::star::ucb::XSimpleFileAccess > xTempAccess(
227cdf0e10cSrcweir 			xFactory->createInstance ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ),
228cdf0e10cSrcweir 			uno::UNO_QUERY );
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 	if ( !xTempAccess.is() )
231cdf0e10cSrcweir 		throw uno::RuntimeException();
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 	uno::Reference< io::XInputStream > xInputStream = xTempAccess->openFileRead( aURL );
234cdf0e10cSrcweir 	if ( !xInputStream.is() )
235cdf0e10cSrcweir 		throw uno::RuntimeException();
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 	return xInputStream;
238cdf0e10cSrcweir }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir // ----------------------------------------------------------------------
241cdf0e10cSrcweir void OStorageHelper::SetCommonStorageEncryptionData(
242cdf0e10cSrcweir 			const uno::Reference< embed::XStorage >& xStorage,
243cdf0e10cSrcweir 			const uno::Sequence< beans::NamedValue >& aEncryptionData )
244cdf0e10cSrcweir 	throw ( uno::Exception )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir 	uno::Reference< embed::XEncryptionProtectedSource2 > xEncrSet( xStorage, uno::UNO_QUERY );
247cdf0e10cSrcweir 	if ( !xEncrSet.is() )
248cdf0e10cSrcweir 		throw io::IOException(); // TODO
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 	xEncrSet->setEncryptionData( aEncryptionData );
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir // ----------------------------------------------------------------------
254cdf0e10cSrcweir sal_Int32 OStorageHelper::GetXStorageFormat(
255cdf0e10cSrcweir 			const uno::Reference< embed::XStorage >& xStorage )
256cdf0e10cSrcweir 		throw ( uno::Exception )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir 	uno::Reference< beans::XPropertySet > xStorProps( xStorage, uno::UNO_QUERY_THROW );
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 	::rtl::OUString aMediaType;
261cdf0e10cSrcweir 	xStorProps->getPropertyValue( ::rtl::OUString::createFromAscii( "MediaType" ) ) >>= aMediaType;
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 	sal_Int32 nResult = 0;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 	// TODO/LATER: the filter configuration could be used to detect it later, or batter a special service
266cdf0e10cSrcweir     if (
267cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_WRITER_ASCII       ) ||
268cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_WRITER_WEB_ASCII   ) ||
269cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_WRITER_GLOBAL_ASCII) ||
270cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_DRAW_ASCII         ) ||
271cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_IMPRESS_ASCII      ) ||
272cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_CALC_ASCII         ) ||
273cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_CHART_ASCII        ) ||
274cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_VND_SUN_XML_MATH_ASCII         )
275cdf0e10cSrcweir        )
276cdf0e10cSrcweir 	{
277cdf0e10cSrcweir 		nResult = SOFFICE_FILEFORMAT_60;
278cdf0e10cSrcweir 	}
279cdf0e10cSrcweir     else
280cdf0e10cSrcweir     if (
281cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_TEXT_ASCII        ) ||
282cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_TEXT_WEB_ASCII    ) ||
283cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_TEXT_GLOBAL_ASCII ) ||
284cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_DRAWING_ASCII     ) ||
285cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_ASCII) ||
286cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET_ASCII ) ||
287cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII       ) ||
288cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_ASCII     ) ||
289cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_DATABASE_ASCII    ) ||
290cdf0e10cSrcweir 		aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_REPORT_ASCII    ) ||
291cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_REPORT_CHART_ASCII    ) ||
292cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_TEXT_TEMPLATE_ASCII        ) ||
293cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_DRAWING_TEMPLATE_ASCII     ) ||
294cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_TEMPLATE_ASCII) ||
295cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET_TEMPLATE_ASCII ) ||
296cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_CHART_TEMPLATE_ASCII       ) ||
297cdf0e10cSrcweir         aMediaType.equalsIgnoreAsciiCaseAscii(MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_TEMPLATE_ASCII     )
298cdf0e10cSrcweir        )
299cdf0e10cSrcweir 	{
300cdf0e10cSrcweir 		nResult = SOFFICE_FILEFORMAT_8;
301cdf0e10cSrcweir 	}
302cdf0e10cSrcweir 	else
303cdf0e10cSrcweir 	{
304cdf0e10cSrcweir 		// the mediatype is not known
305cdf0e10cSrcweir 		throw beans::IllegalTypeException();
306cdf0e10cSrcweir 	}
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 	return nResult;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir // ----------------------------------------------------------------------
312cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetTemporaryStorageOfFormat(
313cdf0e10cSrcweir 			const ::rtl::OUString& aFormat,
314cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory )
315cdf0e10cSrcweir 	throw ( uno::Exception )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir 	uno::Reference< lang::XMultiServiceFactory > xFactoryToUse = xFactory.is() ? xFactory : ::comphelper::getProcessServiceFactory();
318cdf0e10cSrcweir 	if ( !xFactoryToUse.is() )
319cdf0e10cSrcweir 		throw uno::RuntimeException();
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 	uno::Reference< io::XStream > xTmpStream(
322cdf0e10cSrcweir 		xFactoryToUse->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ) ) ),
323cdf0e10cSrcweir 		uno::UNO_QUERY_THROW );
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 	return GetStorageOfFormatFromStream( aFormat, xTmpStream, embed::ElementModes::READWRITE, xFactoryToUse );
326cdf0e10cSrcweir }
327cdf0e10cSrcweir 
328cdf0e10cSrcweir // ----------------------------------------------------------------------
329cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetStorageOfFormatFromURL(
330cdf0e10cSrcweir 			const ::rtl::OUString& aFormat,
331cdf0e10cSrcweir 			const ::rtl::OUString& aURL,
332cdf0e10cSrcweir 			sal_Int32 nStorageMode,
333cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory,
334cdf0e10cSrcweir             sal_Bool bRepairStorage )
335cdf0e10cSrcweir 	throw ( uno::Exception )
336cdf0e10cSrcweir {
337cdf0e10cSrcweir 	uno::Sequence< beans::PropertyValue > aProps( 1 );
338cdf0e10cSrcweir 	aProps[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StorageFormat" ) );
339cdf0e10cSrcweir 	aProps[0].Value <<= aFormat;
340cdf0e10cSrcweir     if ( bRepairStorage )
341cdf0e10cSrcweir     {
342cdf0e10cSrcweir         aProps.realloc( 2 );
343cdf0e10cSrcweir         aProps[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RepairPackage" ) );
344cdf0e10cSrcweir         aProps[1].Value <<= bRepairStorage;
345cdf0e10cSrcweir     }
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 	uno::Sequence< uno::Any > aArgs( 3 );
348cdf0e10cSrcweir 	aArgs[0] <<= aURL;
349cdf0e10cSrcweir 	aArgs[1] <<= nStorageMode;
350cdf0e10cSrcweir 	aArgs[2] <<= aProps;
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage( GetStorageFactory( xFactory )->createInstanceWithArguments( aArgs ),
353cdf0e10cSrcweir 													uno::UNO_QUERY );
354cdf0e10cSrcweir 	if ( !xTempStorage.is() )
355cdf0e10cSrcweir 		throw uno::RuntimeException();
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 	return xTempStorage;
358cdf0e10cSrcweir }
359cdf0e10cSrcweir 
360cdf0e10cSrcweir // ----------------------------------------------------------------------
361cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetStorageOfFormatFromInputStream(
362cdf0e10cSrcweir 			const ::rtl::OUString& aFormat,
363cdf0e10cSrcweir             const uno::Reference < io::XInputStream >& xStream,
364cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory,
365cdf0e10cSrcweir             sal_Bool bRepairStorage )
366cdf0e10cSrcweir 		throw ( uno::Exception )
367cdf0e10cSrcweir {
368cdf0e10cSrcweir 	uno::Sequence< beans::PropertyValue > aProps( 1 );
369cdf0e10cSrcweir 	aProps[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StorageFormat" ) );
370cdf0e10cSrcweir 	aProps[0].Value <<= aFormat;
371cdf0e10cSrcweir     if ( bRepairStorage )
372cdf0e10cSrcweir     {
373cdf0e10cSrcweir         aProps.realloc( 2 );
374cdf0e10cSrcweir         aProps[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RepairPackage" ) );
375cdf0e10cSrcweir         aProps[1].Value <<= bRepairStorage;
376cdf0e10cSrcweir     }
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 	uno::Sequence< uno::Any > aArgs( 3 );
379cdf0e10cSrcweir 	aArgs[0] <<= xStream;
380cdf0e10cSrcweir 	aArgs[1] <<= embed::ElementModes::READ;
381cdf0e10cSrcweir 	aArgs[2] <<= aProps;
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage( GetStorageFactory( xFactory )->createInstanceWithArguments( aArgs ),
384cdf0e10cSrcweir 													uno::UNO_QUERY );
385cdf0e10cSrcweir 	if ( !xTempStorage.is() )
386cdf0e10cSrcweir 		throw uno::RuntimeException();
387cdf0e10cSrcweir 
388cdf0e10cSrcweir 	return xTempStorage;
389cdf0e10cSrcweir }
390cdf0e10cSrcweir 
391cdf0e10cSrcweir // ----------------------------------------------------------------------
392cdf0e10cSrcweir uno::Reference< embed::XStorage > OStorageHelper::GetStorageOfFormatFromStream(
393cdf0e10cSrcweir 			const ::rtl::OUString& aFormat,
394cdf0e10cSrcweir             const uno::Reference < io::XStream >& xStream,
395cdf0e10cSrcweir 			sal_Int32 nStorageMode,
396cdf0e10cSrcweir 			const uno::Reference< lang::XMultiServiceFactory >& xFactory,
397cdf0e10cSrcweir             sal_Bool bRepairStorage )
398cdf0e10cSrcweir 		throw ( uno::Exception )
399cdf0e10cSrcweir {
400cdf0e10cSrcweir 	uno::Sequence< beans::PropertyValue > aProps( 1 );
401cdf0e10cSrcweir 	aProps[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StorageFormat" ) );
402cdf0e10cSrcweir 	aProps[0].Value <<= aFormat;
403cdf0e10cSrcweir     if ( bRepairStorage )
404cdf0e10cSrcweir     {
405cdf0e10cSrcweir         aProps.realloc( 2 );
406cdf0e10cSrcweir         aProps[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RepairPackage" ) );
407cdf0e10cSrcweir         aProps[1].Value <<= bRepairStorage;
408cdf0e10cSrcweir     }
409cdf0e10cSrcweir 
410cdf0e10cSrcweir 	uno::Sequence< uno::Any > aArgs( 3 );
411cdf0e10cSrcweir 	aArgs[0] <<= xStream;
412cdf0e10cSrcweir 	aArgs[1] <<= nStorageMode;
413cdf0e10cSrcweir 	aArgs[2] <<= aProps;
414cdf0e10cSrcweir 
415cdf0e10cSrcweir 	uno::Reference< embed::XStorage > xTempStorage( GetStorageFactory( xFactory )->createInstanceWithArguments( aArgs ),
416cdf0e10cSrcweir 													uno::UNO_QUERY );
417cdf0e10cSrcweir 	if ( !xTempStorage.is() )
418cdf0e10cSrcweir 		throw uno::RuntimeException();
419cdf0e10cSrcweir 
420cdf0e10cSrcweir 	return xTempStorage;
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir // ----------------------------------------------------------------------
424cdf0e10cSrcweir uno::Sequence< beans::NamedValue > OStorageHelper::CreatePackageEncryptionData( const ::rtl::OUString& aPassword, const uno::Reference< lang::XMultiServiceFactory >& xSF )
425cdf0e10cSrcweir {
426cdf0e10cSrcweir     // TODO/LATER: Should not the method be part of DocPasswordHelper?
427cdf0e10cSrcweir     uno::Sequence< beans::NamedValue > aEncryptionData;
428cdf0e10cSrcweir     sal_Int32 nSha1Ind = 0;
429cdf0e10cSrcweir     if ( aPassword.getLength() )
430cdf0e10cSrcweir     {
431cdf0e10cSrcweir         // generate SHA256 start key
432cdf0e10cSrcweir         try
433cdf0e10cSrcweir         {
434cdf0e10cSrcweir             uno::Reference< lang::XMultiServiceFactory > xFactory = xSF.is() ? xSF : ::comphelper::getProcessServiceFactory();
435cdf0e10cSrcweir             if ( !xFactory.is() )
436cdf0e10cSrcweir                 throw uno::RuntimeException();
437cdf0e10cSrcweir 
438cdf0e10cSrcweir             uno::Reference< xml::crypto::XDigestContextSupplier > xDigestContextSupplier( xFactory->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.crypto.NSSInitializer" ) ) ), uno::UNO_QUERY_THROW );
439cdf0e10cSrcweir             uno::Reference< xml::crypto::XDigestContext > xDigestContext( xDigestContextSupplier->getDigestContext( xml::crypto::DigestID::SHA256, uno::Sequence< beans::NamedValue >() ), uno::UNO_SET_THROW );
440cdf0e10cSrcweir 
441cdf0e10cSrcweir             ::rtl::OString aUTF8Password( ::rtl::OUStringToOString( aPassword, RTL_TEXTENCODING_UTF8 ) );
442cdf0e10cSrcweir             xDigestContext->updateDigest( uno::Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aUTF8Password.getStr() ), aUTF8Password.getLength() ) );
443cdf0e10cSrcweir             uno::Sequence< sal_Int8 > aDigest = xDigestContext->finalizeDigestAndDispose();
444cdf0e10cSrcweir 
445cdf0e10cSrcweir             aEncryptionData.realloc( ++nSha1Ind );
446cdf0e10cSrcweir             aEncryptionData[0].Name = PACKAGE_ENCRYPTIONDATA_SHA256UTF8;
447cdf0e10cSrcweir             aEncryptionData[0].Value <<= aDigest;
448cdf0e10cSrcweir         }
449cdf0e10cSrcweir         catch ( uno::Exception& )
450cdf0e10cSrcweir         {
451cdf0e10cSrcweir             OSL_ENSURE( false, "Can not create SHA256 digest!" );
452cdf0e10cSrcweir         }
453cdf0e10cSrcweir 
454cdf0e10cSrcweir         // MS_1252 encoding was used for SO60 document format password encoding,
455cdf0e10cSrcweir         // this encoding supports only a minor subset of nonascii characters,
456cdf0e10cSrcweir         // but for compatibility reasons it has to be used for old document formats
457cdf0e10cSrcweir         aEncryptionData.realloc( nSha1Ind + 2 );
458cdf0e10cSrcweir         aEncryptionData[nSha1Ind].Name = PACKAGE_ENCRYPTIONDATA_SHA1UTF8;
459cdf0e10cSrcweir         aEncryptionData[nSha1Ind + 1].Name = PACKAGE_ENCRYPTIONDATA_SHA1MS1252;
460cdf0e10cSrcweir 
461cdf0e10cSrcweir         rtl_TextEncoding pEncoding[2] = { RTL_TEXTENCODING_UTF8, RTL_TEXTENCODING_MS_1252 };
462cdf0e10cSrcweir 
463cdf0e10cSrcweir         for ( sal_Int32 nInd = 0; nInd < 2; nInd++ )
464cdf0e10cSrcweir         {
465cdf0e10cSrcweir             ::rtl::OString aByteStrPass = ::rtl::OUStringToOString( aPassword, pEncoding[nInd] );
466cdf0e10cSrcweir 
467cdf0e10cSrcweir             sal_uInt8 pBuffer[RTL_DIGEST_LENGTH_SHA1];
468cdf0e10cSrcweir             rtlDigestError nError = rtl_digest_SHA1( aByteStrPass.getStr(),
469cdf0e10cSrcweir                                                     aByteStrPass.getLength(),
470cdf0e10cSrcweir                                                     pBuffer,
471cdf0e10cSrcweir                                                     RTL_DIGEST_LENGTH_SHA1 );
472cdf0e10cSrcweir 
473cdf0e10cSrcweir             if ( nError != rtl_Digest_E_None )
474cdf0e10cSrcweir             {
475cdf0e10cSrcweir                 aEncryptionData.realloc( nSha1Ind );
476cdf0e10cSrcweir                 break;
477cdf0e10cSrcweir             }
478cdf0e10cSrcweir 
479cdf0e10cSrcweir             aEncryptionData[nSha1Ind+nInd].Value <<= uno::Sequence< sal_Int8 >( (sal_Int8*)pBuffer, RTL_DIGEST_LENGTH_SHA1 );
480cdf0e10cSrcweir         }
481cdf0e10cSrcweir     }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir     return aEncryptionData;
484cdf0e10cSrcweir }
485cdf0e10cSrcweir 
486cdf0e10cSrcweir // ----------------------------------------------------------------------
487cdf0e10cSrcweir sal_Bool OStorageHelper::IsValidZipEntryFileName( const ::rtl::OUString& aName, sal_Bool bSlashAllowed )
488cdf0e10cSrcweir {
489cdf0e10cSrcweir     return IsValidZipEntryFileName( aName.getStr(), aName.getLength(), bSlashAllowed );
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir // ----------------------------------------------------------------------
493cdf0e10cSrcweir sal_Bool OStorageHelper::IsValidZipEntryFileName(
494cdf0e10cSrcweir     const sal_Unicode *pChar, sal_Int32 nLength, sal_Bool bSlashAllowed )
495cdf0e10cSrcweir {
496cdf0e10cSrcweir     for ( sal_Int32 i = 0; i < nLength; i++ )
497cdf0e10cSrcweir     {
498cdf0e10cSrcweir         switch ( pChar[i] )
499cdf0e10cSrcweir         {
500cdf0e10cSrcweir             case '\\':
501cdf0e10cSrcweir             case '?':
502cdf0e10cSrcweir             case '<':
503cdf0e10cSrcweir             case '>':
504cdf0e10cSrcweir             case '\"':
505cdf0e10cSrcweir             case '|':
506cdf0e10cSrcweir             case ':':
507cdf0e10cSrcweir                 return sal_False;
508cdf0e10cSrcweir             case '/':
509cdf0e10cSrcweir                 if ( !bSlashAllowed )
510cdf0e10cSrcweir                     return sal_False;
511cdf0e10cSrcweir                 break;
512cdf0e10cSrcweir             default:
513cdf0e10cSrcweir                 if ( pChar[i] < 32  || (pChar[i] >= 0xD800 && pChar[i] <= 0xDFFF) )
514cdf0e10cSrcweir                     return sal_False;
515cdf0e10cSrcweir         }
516cdf0e10cSrcweir     }
517cdf0e10cSrcweir     return sal_True;
518cdf0e10cSrcweir }
519cdf0e10cSrcweir 
520cdf0e10cSrcweir // ----------------------------------------------------------------------
521cdf0e10cSrcweir sal_Bool OStorageHelper::PathHasSegment( const ::rtl::OUString& aPath, const ::rtl::OUString& aSegment )
522cdf0e10cSrcweir {
523cdf0e10cSrcweir     sal_Bool bResult = sal_False;
524cdf0e10cSrcweir     const sal_Int32 nPathLen = aPath.getLength();
525cdf0e10cSrcweir     const sal_Int32 nSegLen = aSegment.getLength();
526cdf0e10cSrcweir 
527cdf0e10cSrcweir     if ( nSegLen && nPathLen >= nSegLen )
528cdf0e10cSrcweir     {
529cdf0e10cSrcweir         ::rtl::OUString aEndSegment( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
530cdf0e10cSrcweir         aEndSegment += aSegment;
531cdf0e10cSrcweir 
532cdf0e10cSrcweir         ::rtl::OUString aInternalSegment( aEndSegment );
533cdf0e10cSrcweir         aInternalSegment += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
534cdf0e10cSrcweir 
535cdf0e10cSrcweir         if ( aPath.indexOf( aInternalSegment ) >= 0 )
536cdf0e10cSrcweir             bResult = sal_True;
537cdf0e10cSrcweir 
538cdf0e10cSrcweir         if ( !bResult && !aPath.compareTo( aSegment, nSegLen ) )
539cdf0e10cSrcweir         {
540cdf0e10cSrcweir             if ( nPathLen == nSegLen || aPath.getStr()[nSegLen] == (sal_Unicode)'/' )
541cdf0e10cSrcweir                 bResult = sal_True;
542cdf0e10cSrcweir         }
543cdf0e10cSrcweir 
544cdf0e10cSrcweir         if ( !bResult && nPathLen > nSegLen && aPath.copy( nPathLen - nSegLen - 1, nSegLen + 1 ).equals( aEndSegment ) )
545cdf0e10cSrcweir             bResult = sal_True;
546cdf0e10cSrcweir     }
547cdf0e10cSrcweir 
548cdf0e10cSrcweir     return bResult;
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir }
552cdf0e10cSrcweir 
553