xref: /trunk/main/sfx2/source/appl/xpackcreator.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sfx2.hxx"
30 #include <com/sun/star/ucb/XCommandEnvironment.hpp>
31 #include <com/sun/star/io/XOutputStream.hpp>
32 
33 
34 #include "xpackcreator.hxx"
35 
36 #include <sot/stg.hxx>
37 #include <sot/storage.hxx>
38 #include <tools/stream.hxx>
39 #include <unotools/tempfile.hxx>
40 #include <unotools/ucbhelper.hxx>
41 #include <ucbhelper/content.hxx>
42 #include <ucbhelper/commandenvironment.hxx>
43 
44 using namespace ::com::sun::star;
45 
46 //-------------------------------------------------------------------------
47 uno::Sequence< ::rtl::OUString > SAL_CALL OPackageStructureCreator::impl_getStaticSupportedServiceNames()
48 {
49     uno::Sequence< ::rtl::OUString > aRet(2);
50     aRet[0] = ::rtl::OUString::createFromAscii("com.sun.star.embed.PackageStructureCreator");
51     aRet[1] = ::rtl::OUString::createFromAscii("com.sun.star.comp.embed.PackageStructureCreator");
52     return aRet;
53 }
54 
55 //-------------------------------------------------------------------------
56 ::rtl::OUString SAL_CALL OPackageStructureCreator::impl_getStaticImplementationName()
57 {
58     return ::rtl::OUString::createFromAscii("com.sun.star.comp.embed.PackageStructureCreator");
59 }
60 
61 //-------------------------------------------------------------------------
62 uno::Reference< lang::XSingleServiceFactory > SAL_CALL OPackageStructureCreator::impl_createFactory(
63             const uno::Reference< lang::XMultiServiceFactory >& xServiceManager )
64 {
65     return ::cppu::createOneInstanceFactory( xServiceManager,
66                                 OPackageStructureCreator::impl_getStaticImplementationName(),
67                                 OPackageStructureCreator::impl_staticCreateSelfInstance,
68                                 OPackageStructureCreator::impl_getStaticSupportedServiceNames() );
69 }
70 
71 //-------------------------------------------------------------------------
72 uno::Reference< uno::XInterface > SAL_CALL OPackageStructureCreator::impl_staticCreateSelfInstance(
73             const uno::Reference< lang::XMultiServiceFactory >& xServiceManager )
74 {
75     return uno::Reference< uno::XInterface >( *new OPackageStructureCreator( xServiceManager ) );
76 }
77 
78 
79 //-------------------------------------------------------------------------
80 void SAL_CALL OPackageStructureCreator::convertToPackage( const ::rtl::OUString& aFolderUrl,
81                                                           const uno::Reference< io::XOutputStream >& xTargetStream )
82         throw ( io::IOException,
83                 uno::RuntimeException )
84 {
85     uno::Reference< ucb::XCommandEnvironment > xComEnv;
86 
87     if ( !xTargetStream.is() )
88         throw io::IOException(); // TODO/LATER
89 
90     sal_Bool bSuccess = sal_False;
91     ::ucbhelper::Content aContent;
92     if( ::ucbhelper::Content::create( aFolderUrl, xComEnv, aContent ) )
93     {
94         SvStream* pTempStream = NULL;
95 
96         ::rtl::OUString aTempURL = ::utl::TempFile().GetURL();
97         try {
98             if ( aContent.isFolder() )
99             {
100                 UCBStorage* pUCBStorage = new UCBStorage( aContent,
101                                                         aFolderUrl,
102                                                         STREAM_READ,
103                                                         sal_False,
104                                                         sal_True );
105                 SotStorageRef aStorage = new SotStorage( pUCBStorage );
106 
107                 if ( aTempURL.getLength() )
108                 {
109                     pTempStream = new SvFileStream( aTempURL, STREAM_STD_READWRITE );
110                     SotStorageRef aTargetStorage = new SotStorage( sal_True, *pTempStream );
111                     aStorage->CopyTo( aTargetStorage );
112                     aTargetStorage->Commit();
113 
114                     if ( aStorage->GetError() || aTargetStorage->GetError() || pTempStream->GetError() )
115                         throw io::IOException();
116 
117                     aTargetStorage = NULL;
118                     aStorage = NULL;
119 
120                     pTempStream->Seek( 0 );
121 
122                     uno::Sequence< sal_Int8 > aSeq( 32000 );
123                     sal_uInt32 nRead = 0;
124                     do {
125                         if ( aSeq.getLength() < 32000 )
126                             aSeq.realloc( 32000 );
127 
128                         nRead = pTempStream->Read( aSeq.getArray(), 32000 );
129                         if ( nRead < 32000 )
130                             aSeq.realloc( nRead );
131                         xTargetStream->writeBytes( aSeq );
132                     } while( !pTempStream->IsEof() && !pTempStream->GetError() && nRead );
133 
134                     if ( pTempStream->GetError() )
135                         throw io::IOException();
136 
137                     bSuccess = sal_True;
138                 }
139             }
140         }
141         catch ( uno::RuntimeException& )
142         {
143             if ( pTempStream )
144                 delete pTempStream;
145 
146             if ( aTempURL.getLength() )
147                 ::utl::UCBContentHelper::Kill( aTempURL );
148 
149             throw;
150         }
151         catch ( io::IOException& )
152         {
153             if ( pTempStream )
154                 delete pTempStream;
155 
156             if ( aTempURL.getLength() )
157                 ::utl::UCBContentHelper::Kill( aTempURL );
158 
159             throw;
160         }
161         catch ( uno::Exception& )
162         {
163         }
164 
165         if ( pTempStream )
166             delete pTempStream;
167 
168         if ( aTempURL.getLength() )
169             ::utl::UCBContentHelper::Kill( aTempURL );
170     }
171 
172     if ( !bSuccess )
173         throw io::IOException(); // TODO/LATER: can't proceed with creation
174 }
175 
176 //-------------------------------------------------------------------------
177 ::rtl::OUString SAL_CALL OPackageStructureCreator::getImplementationName()
178     throw ( uno::RuntimeException )
179 {
180     return impl_getStaticImplementationName();
181 }
182 
183 //-------------------------------------------------------------------------
184 sal_Bool SAL_CALL OPackageStructureCreator::supportsService( const ::rtl::OUString& ServiceName )
185     throw ( uno::RuntimeException )
186 {
187     uno::Sequence< ::rtl::OUString > aSeq = impl_getStaticSupportedServiceNames();
188 
189     for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
190         if ( ServiceName.compareTo( aSeq[nInd] ) == 0 )
191             return sal_True;
192 
193     return sal_False;
194 }
195 
196 //-------------------------------------------------------------------------
197 uno::Sequence< ::rtl::OUString > SAL_CALL OPackageStructureCreator::getSupportedServiceNames()
198     throw ( uno::RuntimeException )
199 {
200     return impl_getStaticSupportedServiceNames();
201 }
202 
203