1*40df464eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*40df464eSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*40df464eSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*40df464eSAndrew Rist * distributed with this work for additional information
6*40df464eSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*40df464eSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*40df464eSAndrew Rist * "License"); you may not use this file except in compliance
9*40df464eSAndrew Rist * with the License. You may obtain a copy of the License at
10*40df464eSAndrew Rist *
11*40df464eSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*40df464eSAndrew Rist *
13*40df464eSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*40df464eSAndrew Rist * software distributed under the License is distributed on an
15*40df464eSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*40df464eSAndrew Rist * KIND, either express or implied. See the License for the
17*40df464eSAndrew Rist * specific language governing permissions and limitations
18*40df464eSAndrew Rist * under the License.
19*40df464eSAndrew Rist *
20*40df464eSAndrew Rist *************************************************************/
21*40df464eSAndrew Rist
22*40df464eSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svl.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "fsfactory.hxx"
28cdf0e10cSrcweir #include "cppuhelper/factory.hxx"
29cdf0e10cSrcweir #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
30cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp>
31cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
32cdf0e10cSrcweir #include <com/sun/star/io/XSeekable.hpp>
33cdf0e10cSrcweir
34cdf0e10cSrcweir
35cdf0e10cSrcweir #include <ucbhelper/fileidentifierconverter.hxx>
36cdf0e10cSrcweir #include <ucbhelper/contentbroker.hxx>
37cdf0e10cSrcweir #include <ucbhelper/content.hxx>
38cdf0e10cSrcweir
39cdf0e10cSrcweir #include <unotools/tempfile.hxx>
40cdf0e10cSrcweir #include <unotools/ucbhelper.hxx>
41cdf0e10cSrcweir
42cdf0e10cSrcweir #include "fsstorage.hxx"
43cdf0e10cSrcweir
44cdf0e10cSrcweir
45cdf0e10cSrcweir using namespace ::com::sun::star;
46cdf0e10cSrcweir
47cdf0e10cSrcweir //-------------------------------------------------------------------------
impl_staticGetSupportedServiceNames()48cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > SAL_CALL FSStorageFactory::impl_staticGetSupportedServiceNames()
49cdf0e10cSrcweir {
50cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > aRet(2);
51cdf0e10cSrcweir aRet[0] = ::rtl::OUString::createFromAscii("com.sun.star.embed.FileSystemStorageFactory");
52cdf0e10cSrcweir aRet[1] = ::rtl::OUString::createFromAscii("com.sun.star.comp.embed.FileSystemStorageFactory");
53cdf0e10cSrcweir return aRet;
54cdf0e10cSrcweir }
55cdf0e10cSrcweir
56cdf0e10cSrcweir //-------------------------------------------------------------------------
impl_staticGetImplementationName()57cdf0e10cSrcweir ::rtl::OUString SAL_CALL FSStorageFactory::impl_staticGetImplementationName()
58cdf0e10cSrcweir {
59cdf0e10cSrcweir return ::rtl::OUString::createFromAscii("com.sun.star.comp.embed.FileSystemStorageFactory");
60cdf0e10cSrcweir }
61cdf0e10cSrcweir
62cdf0e10cSrcweir //-------------------------------------------------------------------------
impl_staticCreateSelfInstance(const uno::Reference<lang::XMultiServiceFactory> & xServiceManager)63cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL FSStorageFactory::impl_staticCreateSelfInstance(
64cdf0e10cSrcweir const uno::Reference< lang::XMultiServiceFactory >& xServiceManager )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir return uno::Reference< uno::XInterface >( *new FSStorageFactory( xServiceManager ) );
67cdf0e10cSrcweir }
68cdf0e10cSrcweir
69cdf0e10cSrcweir //-------------------------------------------------------------------------
createInstance()70cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL FSStorageFactory::createInstance()
71cdf0e10cSrcweir throw ( uno::Exception,
72cdf0e10cSrcweir uno::RuntimeException )
73cdf0e10cSrcweir {
74cdf0e10cSrcweir ::rtl::OUString aTempURL;
75cdf0e10cSrcweir
76cdf0e10cSrcweir aTempURL = ::utl::TempFile( NULL, sal_True ).GetURL();
77cdf0e10cSrcweir
78cdf0e10cSrcweir if ( !aTempURL.getLength() )
79cdf0e10cSrcweir throw uno::RuntimeException(); // TODO: can not create tempfile
80cdf0e10cSrcweir
81cdf0e10cSrcweir ::ucbhelper::Content aResultContent(
82cdf0e10cSrcweir aTempURL, uno::Reference< ucb::XCommandEnvironment >() );
83cdf0e10cSrcweir
84cdf0e10cSrcweir return uno::Reference< uno::XInterface >(
85cdf0e10cSrcweir static_cast< OWeakObject* >(
86cdf0e10cSrcweir new FSStorage( aResultContent,
87cdf0e10cSrcweir embed::ElementModes::READWRITE,
88cdf0e10cSrcweir uno::Sequence< beans::PropertyValue >(),
89cdf0e10cSrcweir m_xFactory ) ),
90cdf0e10cSrcweir uno::UNO_QUERY );
91cdf0e10cSrcweir }
92cdf0e10cSrcweir
93cdf0e10cSrcweir //-------------------------------------------------------------------------
createInstanceWithArguments(const uno::Sequence<uno::Any> & aArguments)94cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL FSStorageFactory::createInstanceWithArguments(
95cdf0e10cSrcweir const uno::Sequence< uno::Any >& aArguments )
96cdf0e10cSrcweir throw ( uno::Exception,
97cdf0e10cSrcweir uno::RuntimeException )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir // The request for storage can be done with up to three arguments
100cdf0e10cSrcweir
101cdf0e10cSrcweir // The first argument specifies a source for the storage
102cdf0e10cSrcweir // it must be URL.
103cdf0e10cSrcweir // The second value is a mode the storage should be open in.
104cdf0e10cSrcweir // And the third value is a media descriptor.
105cdf0e10cSrcweir
106cdf0e10cSrcweir sal_Int32 nArgNum = aArguments.getLength();
107cdf0e10cSrcweir OSL_ENSURE( nArgNum < 4, "Wrong parameter number" );
108cdf0e10cSrcweir
109cdf0e10cSrcweir if ( !nArgNum )
110cdf0e10cSrcweir return createInstance();
111cdf0e10cSrcweir
112cdf0e10cSrcweir // first try to retrieve storage open mode if any
113cdf0e10cSrcweir // by default the storage will be open in readonly mode
114cdf0e10cSrcweir sal_Int32 nStorageMode = embed::ElementModes::READ;
115cdf0e10cSrcweir if ( nArgNum >= 2 )
116cdf0e10cSrcweir {
117cdf0e10cSrcweir if( !( aArguments[1] >>= nStorageMode ) )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir OSL_ENSURE( sal_False, "Wrong second argument!\n" );
120cdf0e10cSrcweir throw uno::Exception(); // TODO: Illegal argument
121cdf0e10cSrcweir }
122cdf0e10cSrcweir // it's allways possible to read written storage in this implementation
123cdf0e10cSrcweir nStorageMode |= embed::ElementModes::READ;
124cdf0e10cSrcweir }
125cdf0e10cSrcweir
126cdf0e10cSrcweir // retrieve storage source URL
127cdf0e10cSrcweir ::rtl::OUString aURL;
128cdf0e10cSrcweir
129cdf0e10cSrcweir if ( aArguments[0] >>= aURL )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir if ( !aURL.getLength() )
132cdf0e10cSrcweir {
133cdf0e10cSrcweir OSL_ENSURE( sal_False, "Empty URL is provided!\n" );
134cdf0e10cSrcweir throw uno::Exception(); // TODO: illegal argument
135cdf0e10cSrcweir }
136cdf0e10cSrcweir }
137cdf0e10cSrcweir else
138cdf0e10cSrcweir {
139cdf0e10cSrcweir OSL_ENSURE( sal_False, "Wrong first argument!\n" );
140cdf0e10cSrcweir throw uno::Exception(); // TODO: Illegal argument
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
143cdf0e10cSrcweir // retrieve mediadescriptor and set storage properties
144cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aDescr;
145cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aPropsToSet;
146cdf0e10cSrcweir
147cdf0e10cSrcweir if ( nArgNum >= 3 )
148cdf0e10cSrcweir {
149cdf0e10cSrcweir if( aArguments[2] >>= aDescr )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir aPropsToSet.realloc(1);
152cdf0e10cSrcweir aPropsToSet[0].Name = ::rtl::OUString::createFromAscii( "URL" );
153cdf0e10cSrcweir aPropsToSet[0].Value <<= aURL;
154cdf0e10cSrcweir
155cdf0e10cSrcweir for ( sal_Int32 nInd = 0, nNumArgs = 1; nInd < aDescr.getLength(); nInd++ )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir if ( aDescr[nInd].Name.equalsAscii( "InteractionHandler" ) )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir aPropsToSet.realloc( ++nNumArgs );
160cdf0e10cSrcweir aPropsToSet[nNumArgs-1].Name = aDescr[nInd].Name;
161cdf0e10cSrcweir aPropsToSet[nNumArgs-1].Value = aDescr[nInd].Value;
162cdf0e10cSrcweir break;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir else
165cdf0e10cSrcweir OSL_ENSURE( sal_False, "Unacceptable property, will be ignored!\n" );
166cdf0e10cSrcweir }
167cdf0e10cSrcweir }
168cdf0e10cSrcweir else
169cdf0e10cSrcweir {
170cdf0e10cSrcweir OSL_ENSURE( sal_False, "Wrong third argument!\n" );
171cdf0e10cSrcweir throw uno::Exception(); // TODO: Illegal argument
172cdf0e10cSrcweir }
173cdf0e10cSrcweir }
174cdf0e10cSrcweir
175cdf0e10cSrcweir // allow to use other ucp's
176cdf0e10cSrcweir // if ( !isLocalNotFile_Impl( aURL ) )
177cdf0e10cSrcweir if ( aURL.equalsIgnoreAsciiCaseAsciiL( "vnd.sun.star.pkg", 16 )
178cdf0e10cSrcweir || aURL.equalsIgnoreAsciiCaseAsciiL( "vnd.sun.star.zip", 16 )
179cdf0e10cSrcweir || ::utl::UCBContentHelper::IsDocument( aURL ) )
180cdf0e10cSrcweir {
181cdf0e10cSrcweir OSL_ENSURE( sal_False, "File system storages can be based only on file URLs!\n" ); // ???
182cdf0e10cSrcweir throw uno::Exception(); // TODO: illegal argument
183cdf0e10cSrcweir }
184cdf0e10cSrcweir
185cdf0e10cSrcweir if ( ( nStorageMode & embed::ElementModes::WRITE ) && !( nStorageMode & embed::ElementModes::NOCREATE ) )
186cdf0e10cSrcweir FSStorage::MakeFolderNoUI( aURL, sal_False );
187cdf0e10cSrcweir else if ( !::utl::UCBContentHelper::IsFolder( aURL ) )
188cdf0e10cSrcweir throw io::IOException(); // there is no such folder
189cdf0e10cSrcweir
190cdf0e10cSrcweir ::ucbhelper::Content aResultContent(
191cdf0e10cSrcweir aURL, uno::Reference< ucb::XCommandEnvironment >() );
192cdf0e10cSrcweir
193cdf0e10cSrcweir // create storage based on source
194cdf0e10cSrcweir return uno::Reference< uno::XInterface >(
195cdf0e10cSrcweir static_cast< OWeakObject* >( new FSStorage( aResultContent,
196cdf0e10cSrcweir nStorageMode,
197cdf0e10cSrcweir aPropsToSet,
198cdf0e10cSrcweir m_xFactory ) ),
199cdf0e10cSrcweir uno::UNO_QUERY );
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202cdf0e10cSrcweir //-------------------------------------------------------------------------
getImplementationName()203cdf0e10cSrcweir ::rtl::OUString SAL_CALL FSStorageFactory::getImplementationName()
204cdf0e10cSrcweir throw ( uno::RuntimeException )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir return impl_staticGetImplementationName();
207cdf0e10cSrcweir }
208cdf0e10cSrcweir
209cdf0e10cSrcweir //-------------------------------------------------------------------------
supportsService(const::rtl::OUString & ServiceName)210cdf0e10cSrcweir sal_Bool SAL_CALL FSStorageFactory::supportsService( const ::rtl::OUString& ServiceName )
211cdf0e10cSrcweir throw ( uno::RuntimeException )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > aSeq = impl_staticGetSupportedServiceNames();
214cdf0e10cSrcweir
215cdf0e10cSrcweir for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
216cdf0e10cSrcweir if ( ServiceName.compareTo( aSeq[nInd] ) == 0 )
217cdf0e10cSrcweir return sal_True;
218cdf0e10cSrcweir
219cdf0e10cSrcweir return sal_False;
220cdf0e10cSrcweir }
221cdf0e10cSrcweir
222cdf0e10cSrcweir //-------------------------------------------------------------------------
getSupportedServiceNames()223cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > SAL_CALL FSStorageFactory::getSupportedServiceNames()
224cdf0e10cSrcweir throw ( uno::RuntimeException )
225cdf0e10cSrcweir {
226cdf0e10cSrcweir return impl_staticGetSupportedServiceNames();
227cdf0e10cSrcweir }
228cdf0e10cSrcweir
229cdf0e10cSrcweir //-------------------------------------------------------------------------
230cdf0e10cSrcweir
231cdf0e10cSrcweir extern "C"
232cdf0e10cSrcweir {
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment **)233cdf0e10cSrcweir SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment (
234cdf0e10cSrcweir const sal_Char ** ppEnvTypeName, uno_Environment ** /* ppEnv */)
235cdf0e10cSrcweir {
236cdf0e10cSrcweir *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
component_getFactory(const sal_Char * pImplementationName,void * pServiceManager,void *)239cdf0e10cSrcweir SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory (
240cdf0e10cSrcweir const sal_Char * pImplementationName, void * pServiceManager, void * /* pRegistryKey */)
241cdf0e10cSrcweir {
242cdf0e10cSrcweir void * pResult = 0;
243cdf0e10cSrcweir if (pServiceManager)
244cdf0e10cSrcweir {
245cdf0e10cSrcweir uno::Reference< lang::XSingleServiceFactory > xFactory;
246cdf0e10cSrcweir if (FSStorageFactory::impl_staticGetImplementationName().compareToAscii (pImplementationName) == 0)
247cdf0e10cSrcweir {
248cdf0e10cSrcweir xFactory = cppu::createOneInstanceFactory (
249cdf0e10cSrcweir reinterpret_cast< lang::XMultiServiceFactory* >(pServiceManager),
250cdf0e10cSrcweir FSStorageFactory::impl_staticGetImplementationName(),
251cdf0e10cSrcweir FSStorageFactory::impl_staticCreateSelfInstance,
252cdf0e10cSrcweir FSStorageFactory::impl_staticGetSupportedServiceNames() );
253cdf0e10cSrcweir }
254cdf0e10cSrcweir if (xFactory.is())
255cdf0e10cSrcweir {
256cdf0e10cSrcweir xFactory->acquire();
257cdf0e10cSrcweir pResult = xFactory.get();
258cdf0e10cSrcweir }
259cdf0e10cSrcweir }
260cdf0e10cSrcweir return pResult;
261cdf0e10cSrcweir }
262cdf0e10cSrcweir
263cdf0e10cSrcweir } // extern "C"
264cdf0e10cSrcweir
265