1bfd08df8SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3bfd08df8SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4bfd08df8SAndrew Rist * or more contributor license agreements. See the NOTICE file
5bfd08df8SAndrew Rist * distributed with this work for additional information
6bfd08df8SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7bfd08df8SAndrew Rist * to you under the Apache License, Version 2.0 (the
8bfd08df8SAndrew Rist * "License"); you may not use this file except in compliance
9bfd08df8SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11bfd08df8SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13bfd08df8SAndrew Rist * Unless required by applicable law or agreed to in writing,
14bfd08df8SAndrew Rist * software distributed under the License is distributed on an
15bfd08df8SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16bfd08df8SAndrew Rist * KIND, either express or implied. See the License for the
17bfd08df8SAndrew Rist * specific language governing permissions and limitations
18bfd08df8SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20bfd08df8SAndrew Rist *************************************************************/
21bfd08df8SAndrew Rist
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_embeddedobj.hxx"
24cdf0e10cSrcweir #include <com/sun/star/frame/XFrame.hpp>
25cdf0e10cSrcweir #include <com/sun/star/frame/XController.hpp>
26cdf0e10cSrcweir #include <com/sun/star/frame/XComponentLoader.hpp>
27cdf0e10cSrcweir #include <com/sun/star/awt/XTopWindow.hpp>
28cdf0e10cSrcweir #include <com/sun/star/embed/XClassifiedObject.hpp>
29cdf0e10cSrcweir #include <com/sun/star/io/XStream.hpp>
30cdf0e10cSrcweir #include <com/sun/star/io/XInputStream.hpp>
31cdf0e10cSrcweir #include <com/sun/star/io/XOutputStream.hpp>
32cdf0e10cSrcweir #include <com/sun/star/io/XSeekable.hpp>
33cdf0e10cSrcweir #include <com/sun/star/task/XInteractionHandler.hpp>
34cdf0e10cSrcweir #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
35cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp>
36cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
37cdf0e10cSrcweir
38*cda0808aSmseidel #ifndef _COM_SUN_STAR_DOCUMENT_XEVENTBROADCASTER_HPP_
39cdf0e10cSrcweir #include <com/sun/star/document/XEventBroadcaster.hpp>
40cdf0e10cSrcweir #endif
41cdf0e10cSrcweir #include <com/sun/star/document/XEventListener.hpp>
42cdf0e10cSrcweir #include <com/sun/star/document/XTypeDetection.hpp>
43cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
44cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx>
45cdf0e10cSrcweir #include <comphelper/storagehelper.hxx>
46cdf0e10cSrcweir #include <comphelper/mimeconfighelper.hxx>
47cdf0e10cSrcweir
48cdf0e10cSrcweir #include "ownview.hxx"
49cdf0e10cSrcweir
50cdf0e10cSrcweir using namespace ::com::sun::star;
51cdf0e10cSrcweir using namespace ::comphelper;
52cdf0e10cSrcweir
53cdf0e10cSrcweir ::rtl::OUString GetNewTempFileURL_Impl( const uno::Reference< lang::XMultiServiceFactory >& xFactory ) throw( io::IOException );
54cdf0e10cSrcweir ::rtl::OUString GetNewFilledTempFile_Impl( const uno::Reference< io::XInputStream >& xInStream, const uno::Reference< lang::XMultiServiceFactory >& xFactory ) throw( io::IOException );
55cdf0e10cSrcweir sal_Bool KillFile_Impl( const ::rtl::OUString& aURL, const uno::Reference< lang::XMultiServiceFactory >& xFactory );
56cdf0e10cSrcweir uno::Reference< io::XStream > TryToGetAcceptableFormat_Impl( const uno::Reference< io::XStream >& xStream, const uno::Reference< lang::XMultiServiceFactory >& xFactory ) throw ( uno::Exception );
57cdf0e10cSrcweir
58cdf0e10cSrcweir //========================================================
59cdf0e10cSrcweir // Dummy interaction handler
60cdf0e10cSrcweir //========================================================
61cdf0e10cSrcweir //--------------------------------------------------------
62cdf0e10cSrcweir class DummyHandler_Impl : public ::cppu::WeakImplHelper1< task::XInteractionHandler >
63cdf0e10cSrcweir {
64cdf0e10cSrcweir public:
DummyHandler_Impl()65cdf0e10cSrcweir DummyHandler_Impl() {}
66cdf0e10cSrcweir ~DummyHandler_Impl();
67cdf0e10cSrcweir
68cdf0e10cSrcweir virtual void SAL_CALL handle( const uno::Reference< task::XInteractionRequest >& xRequest )
69cdf0e10cSrcweir throw( uno::RuntimeException );
70cdf0e10cSrcweir };
71cdf0e10cSrcweir
72cdf0e10cSrcweir //--------------------------------------------------------
~DummyHandler_Impl()73cdf0e10cSrcweir DummyHandler_Impl::~DummyHandler_Impl()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir }
76cdf0e10cSrcweir
77cdf0e10cSrcweir //--------------------------------------------------------
handle(const uno::Reference<task::XInteractionRequest> &)78cdf0e10cSrcweir void SAL_CALL DummyHandler_Impl::handle( const uno::Reference< task::XInteractionRequest >& )
79cdf0e10cSrcweir throw( uno::RuntimeException )
80cdf0e10cSrcweir {
81cdf0e10cSrcweir return;
82cdf0e10cSrcweir }
83cdf0e10cSrcweir
84cdf0e10cSrcweir //========================================================
85cdf0e10cSrcweir // Object viewer
86cdf0e10cSrcweir //========================================================
87cdf0e10cSrcweir //--------------------------------------------------------
OwnView_Impl(const uno::Reference<lang::XMultiServiceFactory> & xFactory,const uno::Reference<io::XInputStream> & xInputStream)88cdf0e10cSrcweir OwnView_Impl::OwnView_Impl( const uno::Reference< lang::XMultiServiceFactory >& xFactory,
89cdf0e10cSrcweir const uno::Reference< io::XInputStream >& xInputStream )
90cdf0e10cSrcweir : m_xFactory( xFactory )
91cdf0e10cSrcweir , m_bBusy( sal_False )
92cdf0e10cSrcweir , m_bUseNative( sal_False )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir if ( !xFactory.is() || !xInputStream.is() )
95cdf0e10cSrcweir throw uno::RuntimeException();
96cdf0e10cSrcweir
97cdf0e10cSrcweir m_aTempFileURL = GetNewFilledTempFile_Impl( xInputStream, m_xFactory );
98cdf0e10cSrcweir }
99cdf0e10cSrcweir
100cdf0e10cSrcweir //--------------------------------------------------------
~OwnView_Impl()101cdf0e10cSrcweir OwnView_Impl::~OwnView_Impl()
102cdf0e10cSrcweir {
103cdf0e10cSrcweir try {
104cdf0e10cSrcweir KillFile_Impl( m_aTempFileURL, m_xFactory );
105cdf0e10cSrcweir } catch( uno::Exception& ) {}
106cdf0e10cSrcweir
107cdf0e10cSrcweir try {
108cdf0e10cSrcweir if ( m_aNativeTempURL.getLength() )
109cdf0e10cSrcweir KillFile_Impl( m_aNativeTempURL, m_xFactory );
110cdf0e10cSrcweir } catch( uno::Exception& ) {}
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
113cdf0e10cSrcweir //--------------------------------------------------------
CreateModelFromURL(const::rtl::OUString & aFileURL)114cdf0e10cSrcweir sal_Bool OwnView_Impl::CreateModelFromURL( const ::rtl::OUString& aFileURL )
115cdf0e10cSrcweir {
116cdf0e10cSrcweir sal_Bool bResult = sal_False;
117cdf0e10cSrcweir
118cdf0e10cSrcweir if ( aFileURL.getLength() )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir try {
121cdf0e10cSrcweir uno::Reference < frame::XComponentLoader > xDocumentLoader(
122cdf0e10cSrcweir m_xFactory->createInstance (
123cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ),
124cdf0e10cSrcweir uno::UNO_QUERY );
125cdf0e10cSrcweir
126cdf0e10cSrcweir if ( xDocumentLoader.is() )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aArgs( m_aFilterName.getLength() ? 5 : 4 );
129cdf0e10cSrcweir
130cdf0e10cSrcweir aArgs[0].Name = ::rtl::OUString::createFromAscii( "URL" );
131cdf0e10cSrcweir aArgs[0].Value <<= aFileURL;
132cdf0e10cSrcweir
133cdf0e10cSrcweir aArgs[1].Name = ::rtl::OUString::createFromAscii( "ReadOnly" );
134cdf0e10cSrcweir aArgs[1].Value <<= sal_True;
135cdf0e10cSrcweir
136cdf0e10cSrcweir aArgs[2].Name = ::rtl::OUString::createFromAscii( "InteractionHandler" );
137cdf0e10cSrcweir aArgs[2].Value <<= uno::Reference< task::XInteractionHandler >(
138cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >( new DummyHandler_Impl() ), uno::UNO_QUERY );
139cdf0e10cSrcweir
140cdf0e10cSrcweir aArgs[3].Name = ::rtl::OUString::createFromAscii( "DontEdit" );
141cdf0e10cSrcweir aArgs[3].Value <<= sal_True;
142cdf0e10cSrcweir
143cdf0e10cSrcweir if ( m_aFilterName.getLength() )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir aArgs[4].Name = ::rtl::OUString::createFromAscii( "FilterName" );
146cdf0e10cSrcweir aArgs[4].Value <<= m_aFilterName;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
149cdf0e10cSrcweir uno::Reference< frame::XModel > xModel( xDocumentLoader->loadComponentFromURL(
150cdf0e10cSrcweir aFileURL,
151cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "_blank" ),
152cdf0e10cSrcweir 0,
153cdf0e10cSrcweir aArgs ),
154cdf0e10cSrcweir uno::UNO_QUERY );
155cdf0e10cSrcweir
156cdf0e10cSrcweir if ( xModel.is() )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir uno::Reference< document::XEventBroadcaster > xBroadCaster( xModel, uno::UNO_QUERY );
159cdf0e10cSrcweir if ( xBroadCaster.is() )
160cdf0e10cSrcweir xBroadCaster->addEventListener( uno::Reference< document::XEventListener >(
161cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >( this ),
162cdf0e10cSrcweir uno::UNO_QUERY ) );
163cdf0e10cSrcweir
164cdf0e10cSrcweir uno::Reference< util::XCloseable > xCloseable( xModel, uno::UNO_QUERY );
165cdf0e10cSrcweir if ( xCloseable.is() )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir xCloseable->addCloseListener( uno::Reference< util::XCloseListener >(
168cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >( this ),
169cdf0e10cSrcweir uno::UNO_QUERY ) );
170cdf0e10cSrcweir
171cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
172cdf0e10cSrcweir m_xModel = xModel;
173cdf0e10cSrcweir bResult = sal_True;
174cdf0e10cSrcweir }
175cdf0e10cSrcweir }
176cdf0e10cSrcweir }
177cdf0e10cSrcweir }
178cdf0e10cSrcweir catch( uno::Exception& )
179cdf0e10cSrcweir {
180cdf0e10cSrcweir }
181cdf0e10cSrcweir }
182cdf0e10cSrcweir
183cdf0e10cSrcweir return bResult;
184cdf0e10cSrcweir }
185cdf0e10cSrcweir
186cdf0e10cSrcweir //--------------------------------------------------------
CreateModel(sal_Bool bUseNative)187cdf0e10cSrcweir sal_Bool OwnView_Impl::CreateModel( sal_Bool bUseNative )
188cdf0e10cSrcweir {
189cdf0e10cSrcweir sal_Bool bResult = sal_False;
190cdf0e10cSrcweir
191cdf0e10cSrcweir try {
192cdf0e10cSrcweir bResult = CreateModelFromURL( bUseNative ? m_aNativeTempURL : m_aTempFileURL );
193cdf0e10cSrcweir }
194cdf0e10cSrcweir catch( uno::Exception& )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir }
197cdf0e10cSrcweir
198cdf0e10cSrcweir return bResult;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
201cdf0e10cSrcweir //--------------------------------------------------------
GetFilterNameFromExtentionAndInStream(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & xFactory,const::rtl::OUString & aNameWithExtention,const uno::Reference<io::XInputStream> & xInputStream)202cdf0e10cSrcweir ::rtl::OUString OwnView_Impl::GetFilterNameFromExtentionAndInStream(
203cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xFactory,
204cdf0e10cSrcweir const ::rtl::OUString& aNameWithExtention,
205cdf0e10cSrcweir const uno::Reference< io::XInputStream >& xInputStream )
206cdf0e10cSrcweir {
207cdf0e10cSrcweir if ( !xInputStream.is() )
208cdf0e10cSrcweir throw uno::RuntimeException();
209cdf0e10cSrcweir
210cdf0e10cSrcweir uno::Reference< document::XTypeDetection > xTypeDetection(
211cdf0e10cSrcweir xFactory->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.document.TypeDetection" ) ),
212cdf0e10cSrcweir uno::UNO_QUERY_THROW );
213cdf0e10cSrcweir
214cdf0e10cSrcweir ::rtl::OUString aTypeName;
215cdf0e10cSrcweir
216cdf0e10cSrcweir if ( aNameWithExtention.getLength() )
217cdf0e10cSrcweir {
218cdf0e10cSrcweir ::rtl::OUString aURLToAnalyze =
219cdf0e10cSrcweir ( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "file:///" ) ) + aNameWithExtention );
220cdf0e10cSrcweir aTypeName = xTypeDetection->queryTypeByURL( aURLToAnalyze );
221cdf0e10cSrcweir }
222cdf0e10cSrcweir
223cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aArgs( aTypeName.getLength() ? 3 : 2 );
224cdf0e10cSrcweir aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
225cdf0e10cSrcweir aArgs[0].Value <<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:stream" ) );
226cdf0e10cSrcweir aArgs[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InputStream" ) );
227cdf0e10cSrcweir aArgs[1].Value <<= xInputStream;
228cdf0e10cSrcweir if ( aTypeName.getLength() )
229cdf0e10cSrcweir {
230cdf0e10cSrcweir aArgs[2].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TypeName" ) );
231cdf0e10cSrcweir aArgs[2].Value <<= aTypeName;
232cdf0e10cSrcweir }
233cdf0e10cSrcweir
234cdf0e10cSrcweir aTypeName = xTypeDetection->queryTypeByDescriptor( aArgs, sal_True );
235cdf0e10cSrcweir
236cdf0e10cSrcweir ::rtl::OUString aFilterName;
237cdf0e10cSrcweir for ( sal_Int32 nInd = 0; nInd < aArgs.getLength(); nInd++ )
238cdf0e10cSrcweir if ( aArgs[nInd].Name.equalsAscii( "FilterName" ) )
239cdf0e10cSrcweir aArgs[nInd].Value >>= aFilterName;
240cdf0e10cSrcweir
241cdf0e10cSrcweir if ( !aFilterName.getLength() && aTypeName.getLength() )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir // get the default filter name for the type
244cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNameAccess( xTypeDetection, uno::UNO_QUERY_THROW );
245cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aTypes;
246cdf0e10cSrcweir
247cdf0e10cSrcweir if ( xNameAccess.is() && ( xNameAccess->getByName( aTypeName ) >>= aTypes ) )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir for ( sal_Int32 nInd = 0; nInd < aTypes.getLength(); nInd++ )
250cdf0e10cSrcweir {
251cdf0e10cSrcweir if ( aTypes[nInd].Name.equalsAscii( "PreferredFilter" ) && ( aTypes[nInd].Value >>= aFilterName ) )
252cdf0e10cSrcweir {
253cdf0e10cSrcweir aTypes[nInd].Value >>= aFilterName;
254cdf0e10cSrcweir break;
255cdf0e10cSrcweir }
256cdf0e10cSrcweir }
257cdf0e10cSrcweir }
258cdf0e10cSrcweir }
259cdf0e10cSrcweir
260cdf0e10cSrcweir return aFilterName;
261cdf0e10cSrcweir }
262cdf0e10cSrcweir
263cdf0e10cSrcweir //--------------------------------------------------------
ReadContentsAndGenerateTempFile(const uno::Reference<io::XInputStream> & xInStream,sal_Bool bParseHeader)264cdf0e10cSrcweir sal_Bool OwnView_Impl::ReadContentsAndGenerateTempFile( const uno::Reference< io::XInputStream >& xInStream,
265cdf0e10cSrcweir sal_Bool bParseHeader )
266cdf0e10cSrcweir {
267cdf0e10cSrcweir uno::Reference< io::XSeekable > xSeekable( xInStream, uno::UNO_QUERY_THROW );
268cdf0e10cSrcweir xSeekable->seek( 0 );
269cdf0e10cSrcweir
270cdf0e10cSrcweir // create m_aNativeTempURL
271cdf0e10cSrcweir ::rtl::OUString aNativeTempURL;
272cdf0e10cSrcweir uno::Reference < beans::XPropertySet > xNativeTempFile(
273cdf0e10cSrcweir m_xFactory->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.io.TempFile" ) ),
274cdf0e10cSrcweir uno::UNO_QUERY_THROW );
275cdf0e10cSrcweir uno::Reference < io::XStream > xNativeTempStream( xNativeTempFile, uno::UNO_QUERY_THROW );
276cdf0e10cSrcweir uno::Reference < io::XOutputStream > xNativeOutTemp = xNativeTempStream->getOutputStream();
277cdf0e10cSrcweir uno::Reference < io::XInputStream > xNativeInTemp = xNativeTempStream->getInputStream();
278cdf0e10cSrcweir if ( !xNativeOutTemp.is() || !xNativeInTemp.is() )
279cdf0e10cSrcweir throw uno::RuntimeException();
280cdf0e10cSrcweir
281cdf0e10cSrcweir try {
282cdf0e10cSrcweir xNativeTempFile->setPropertyValue( ::rtl::OUString::createFromAscii( "RemoveFile" ), uno::makeAny( sal_False ) );
283cdf0e10cSrcweir uno::Any aUrl = xNativeTempFile->getPropertyValue( ::rtl::OUString::createFromAscii( "Uri" ) );
284cdf0e10cSrcweir aUrl >>= aNativeTempURL;
285cdf0e10cSrcweir }
286cdf0e10cSrcweir catch ( uno::Exception& )
287cdf0e10cSrcweir {
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
290cdf0e10cSrcweir sal_Bool bFailed = sal_False;
291cdf0e10cSrcweir ::rtl::OUString aFileSuffix;
292cdf0e10cSrcweir
293cdf0e10cSrcweir if ( bParseHeader )
294cdf0e10cSrcweir {
295cdf0e10cSrcweir uno::Sequence< sal_Int8 > aReadSeq( 4 );
296cdf0e10cSrcweir // read the complete size of the Object Package
297cdf0e10cSrcweir if ( xInStream->readBytes( aReadSeq, 4 ) != 4 )
298cdf0e10cSrcweir return sal_False;
299cdf0e10cSrcweir /*
300cdf0e10cSrcweir sal_uInt32 nLength = (sal_uInt8)aReadSeq[0]
301cdf0e10cSrcweir + (sal_uInt8)aReadSeq[1] * 0x100
302cdf0e10cSrcweir + (sal_uInt8)aReadSeq[2] * 0x10000
303cdf0e10cSrcweir + (sal_uInt8)aReadSeq[3] * 0x1000000;
304cdf0e10cSrcweir */
305cdf0e10cSrcweir // read the first header ( have no idea what does this header mean )
306cdf0e10cSrcweir if ( xInStream->readBytes( aReadSeq, 2 ) != 2 || aReadSeq[0] != 2 || aReadSeq[1] != 0 )
307cdf0e10cSrcweir return sal_False;
308cdf0e10cSrcweir
309cdf0e10cSrcweir // read file name
310cdf0e10cSrcweir // only extension is interesting so only subset of symbols is accepted
311cdf0e10cSrcweir do
312cdf0e10cSrcweir {
313cdf0e10cSrcweir if ( xInStream->readBytes( aReadSeq, 1 ) != 1 )
314cdf0e10cSrcweir return sal_False;
315cdf0e10cSrcweir
316cdf0e10cSrcweir if (
317cdf0e10cSrcweir (aReadSeq[0] >= '0' && aReadSeq[0] <= '9') ||
318cdf0e10cSrcweir (aReadSeq[0] >= 'a' && aReadSeq[0] <= 'z') ||
319cdf0e10cSrcweir (aReadSeq[0] >= 'A' && aReadSeq[0] <= 'Z') ||
320cdf0e10cSrcweir aReadSeq[0] == '.'
321cdf0e10cSrcweir )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir aFileSuffix += ::rtl::OUString::valueOf( (sal_Unicode) aReadSeq[0] );
324cdf0e10cSrcweir }
325cdf0e10cSrcweir
326cdf0e10cSrcweir } while( aReadSeq[0] );
327cdf0e10cSrcweir
328cdf0e10cSrcweir // skip url
329cdf0e10cSrcweir do
330cdf0e10cSrcweir {
331cdf0e10cSrcweir if ( xInStream->readBytes( aReadSeq, 1 ) != 1 )
332cdf0e10cSrcweir return sal_False;
333cdf0e10cSrcweir } while( aReadSeq[0] );
334cdf0e10cSrcweir
335cdf0e10cSrcweir // check the next header
336cdf0e10cSrcweir if ( xInStream->readBytes( aReadSeq, 4 ) != 4
337cdf0e10cSrcweir || aReadSeq[0] || aReadSeq[1] || aReadSeq[2] != 3 || aReadSeq[3] )
338cdf0e10cSrcweir return sal_False;
339cdf0e10cSrcweir
340cdf0e10cSrcweir // get the size of the next entry
341cdf0e10cSrcweir if ( xInStream->readBytes( aReadSeq, 4 ) != 4 )
342cdf0e10cSrcweir return sal_False;
343cdf0e10cSrcweir
344cdf0e10cSrcweir sal_uInt32 nUrlSize = (sal_uInt8)aReadSeq[0]
345cdf0e10cSrcweir + (sal_uInt8)aReadSeq[1] * 0x100
346cdf0e10cSrcweir + (sal_uInt8)aReadSeq[2] * 0x10000
347cdf0e10cSrcweir + (sal_uInt8)aReadSeq[3] * 0x1000000;
348cdf0e10cSrcweir sal_Int64 nTargetPos = xSeekable->getPosition() + nUrlSize;
349cdf0e10cSrcweir
350cdf0e10cSrcweir xSeekable->seek( nTargetPos );
351cdf0e10cSrcweir
352cdf0e10cSrcweir // get the size of stored data
353cdf0e10cSrcweir if ( xInStream->readBytes( aReadSeq, 4 ) != 4 )
354cdf0e10cSrcweir return sal_False;
355cdf0e10cSrcweir
356cdf0e10cSrcweir sal_uInt32 nDataSize = (sal_uInt8)aReadSeq[0]
357cdf0e10cSrcweir + (sal_uInt8)aReadSeq[1] * 0x100
358cdf0e10cSrcweir + (sal_uInt8)aReadSeq[2] * 0x10000
359cdf0e10cSrcweir + (sal_uInt8)aReadSeq[3] * 0x1000000;
360cdf0e10cSrcweir
361cdf0e10cSrcweir aReadSeq.realloc( 32000 );
362cdf0e10cSrcweir sal_uInt32 nRead = 0;
363cdf0e10cSrcweir while ( nRead < nDataSize )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir sal_uInt32 nToRead = ( nDataSize - nRead > 32000 ) ? 32000 : nDataSize - nRead;
366cdf0e10cSrcweir sal_uInt32 nLocalRead = xInStream->readBytes( aReadSeq, nToRead );
367cdf0e10cSrcweir
368cdf0e10cSrcweir if ( !nLocalRead )
369cdf0e10cSrcweir {
370cdf0e10cSrcweir bFailed = sal_True;
371cdf0e10cSrcweir break;
372cdf0e10cSrcweir }
373cdf0e10cSrcweir else if ( nLocalRead == 32000 )
374cdf0e10cSrcweir xNativeOutTemp->writeBytes( aReadSeq );
375cdf0e10cSrcweir else
376cdf0e10cSrcweir {
377cdf0e10cSrcweir uno::Sequence< sal_Int8 > aToWrite( aReadSeq );
378cdf0e10cSrcweir aToWrite.realloc( nLocalRead );
379cdf0e10cSrcweir xNativeOutTemp->writeBytes( aToWrite );
380cdf0e10cSrcweir }
381cdf0e10cSrcweir
382cdf0e10cSrcweir nRead += nLocalRead;
383cdf0e10cSrcweir }
384cdf0e10cSrcweir }
385cdf0e10cSrcweir else
386cdf0e10cSrcweir {
387cdf0e10cSrcweir uno::Sequence< sal_Int8 > aData( 8 );
388cdf0e10cSrcweir if ( xInStream->readBytes( aData, 8 ) == 8
389cdf0e10cSrcweir && aData[0] == -1 && aData[1] == -1 && aData[2] == -1 && aData[3] == -1
390cdf0e10cSrcweir && ( aData[4] == 2 || aData[4] == 3 ) && aData[5] == 0 && aData[6] == 0 && aData[7] == 0 )
391cdf0e10cSrcweir {
392cdf0e10cSrcweir // the header has to be removed
393cdf0e10cSrcweir xSeekable->seek( 40 );
394cdf0e10cSrcweir }
395cdf0e10cSrcweir else
396cdf0e10cSrcweir {
397cdf0e10cSrcweir // the usual Ole10Native format
398cdf0e10cSrcweir xSeekable->seek( 4 );
399cdf0e10cSrcweir }
400cdf0e10cSrcweir
401cdf0e10cSrcweir ::comphelper::OStorageHelper::CopyInputToOutput( xInStream, xNativeOutTemp );
402cdf0e10cSrcweir }
403cdf0e10cSrcweir
404cdf0e10cSrcweir xNativeOutTemp->closeOutput();
405cdf0e10cSrcweir
406cdf0e10cSrcweir // The temporary native file is created, now the filter must be detected
407cdf0e10cSrcweir if ( !bFailed )
408cdf0e10cSrcweir {
409cdf0e10cSrcweir m_aFilterName = GetFilterNameFromExtentionAndInStream( m_xFactory, aFileSuffix, xNativeInTemp );
410cdf0e10cSrcweir m_aNativeTempURL = aNativeTempURL;
411cdf0e10cSrcweir }
412cdf0e10cSrcweir
413cdf0e10cSrcweir return !bFailed;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir
416cdf0e10cSrcweir //--------------------------------------------------------
CreateNative()417cdf0e10cSrcweir void OwnView_Impl::CreateNative()
418cdf0e10cSrcweir {
419cdf0e10cSrcweir if ( m_aNativeTempURL.getLength() )
420cdf0e10cSrcweir return;
421cdf0e10cSrcweir
422cdf0e10cSrcweir try
423cdf0e10cSrcweir {
424cdf0e10cSrcweir uno::Reference < ucb::XSimpleFileAccess > xAccess(
425cdf0e10cSrcweir m_xFactory->createInstance (
426cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ),
427cdf0e10cSrcweir uno::UNO_QUERY_THROW );
428cdf0e10cSrcweir
429cdf0e10cSrcweir uno::Reference< io::XInputStream > xInStream = xAccess->openFileRead( m_aTempFileURL );
430cdf0e10cSrcweir if ( !xInStream.is() )
431cdf0e10cSrcweir throw uno::RuntimeException();
432cdf0e10cSrcweir
433cdf0e10cSrcweir uno::Sequence< uno::Any > aArgs( 1 );
434cdf0e10cSrcweir aArgs[0] <<= xInStream;
435cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNameAccess(
436cdf0e10cSrcweir m_xFactory->createInstanceWithArguments(
437cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "com.sun.star.embed.OLESimpleStorage" ),
438cdf0e10cSrcweir aArgs ),
439cdf0e10cSrcweir uno::UNO_QUERY_THROW );
440cdf0e10cSrcweir
441cdf0e10cSrcweir ::rtl::OUString aSubStreamName = ::rtl::OUString::createFromAscii( "\1Ole10Native" );
442cdf0e10cSrcweir uno::Reference< embed::XClassifiedObject > xStor( xNameAccess, uno::UNO_QUERY_THROW );
443cdf0e10cSrcweir uno::Sequence< sal_Int8 > aStorClassID = xStor->getClassID();
444cdf0e10cSrcweir
445cdf0e10cSrcweir if ( xNameAccess->hasByName( aSubStreamName ) )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir sal_uInt8 aClassID[] =
448cdf0e10cSrcweir { 0x00, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };
449cdf0e10cSrcweir uno::Sequence< sal_Int8 > aPackageClassID( (sal_Int8*)aClassID, 16 );
450cdf0e10cSrcweir
451cdf0e10cSrcweir uno::Reference< io::XStream > xSubStream;
452cdf0e10cSrcweir xNameAccess->getByName( aSubStreamName ) >>= xSubStream;
453cdf0e10cSrcweir if ( xSubStream.is() )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir sal_Bool bOk = sal_False;
456cdf0e10cSrcweir
457cdf0e10cSrcweir if ( MimeConfigurationHelper::ClassIDsEqual( aPackageClassID, aStorClassID ) )
458cdf0e10cSrcweir {
459cdf0e10cSrcweir // the storage represents Object Package
460cdf0e10cSrcweir
461cdf0e10cSrcweir bOk = ReadContentsAndGenerateTempFile( xSubStream->getInputStream(), sal_True );
462cdf0e10cSrcweir
463cdf0e10cSrcweir if ( !bOk && m_aNativeTempURL.getLength() )
464cdf0e10cSrcweir {
465cdf0e10cSrcweir KillFile_Impl( m_aNativeTempURL, m_xFactory );
466cdf0e10cSrcweir m_aNativeTempURL = ::rtl::OUString();
467cdf0e10cSrcweir }
468cdf0e10cSrcweir }
469cdf0e10cSrcweir
470cdf0e10cSrcweir if ( !bOk )
471cdf0e10cSrcweir {
472cdf0e10cSrcweir bOk = ReadContentsAndGenerateTempFile( xSubStream->getInputStream(), sal_False );
473cdf0e10cSrcweir
474cdf0e10cSrcweir if ( !bOk && m_aNativeTempURL.getLength() )
475cdf0e10cSrcweir {
476cdf0e10cSrcweir KillFile_Impl( m_aNativeTempURL, m_xFactory );
477cdf0e10cSrcweir m_aNativeTempURL = ::rtl::OUString();
478cdf0e10cSrcweir }
479cdf0e10cSrcweir }
480cdf0e10cSrcweir }
481cdf0e10cSrcweir }
482cdf0e10cSrcweir else
483cdf0e10cSrcweir {
484cdf0e10cSrcweir // TODO/LATER: No native stream, needs a new solution
485cdf0e10cSrcweir }
486cdf0e10cSrcweir }
487cdf0e10cSrcweir catch( uno::Exception& )
488cdf0e10cSrcweir {}
489cdf0e10cSrcweir }
490cdf0e10cSrcweir
491cdf0e10cSrcweir //--------------------------------------------------------
Open()492cdf0e10cSrcweir sal_Bool OwnView_Impl::Open()
493cdf0e10cSrcweir {
494cdf0e10cSrcweir sal_Bool bResult = sal_False;
495cdf0e10cSrcweir
496cdf0e10cSrcweir uno::Reference< frame::XModel > xExistingModel;
497cdf0e10cSrcweir
498cdf0e10cSrcweir {
499cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
500cdf0e10cSrcweir xExistingModel = m_xModel;
501cdf0e10cSrcweir if ( m_bBusy )
502cdf0e10cSrcweir return sal_False;
503cdf0e10cSrcweir
504cdf0e10cSrcweir m_bBusy = sal_True;
505cdf0e10cSrcweir }
506cdf0e10cSrcweir
507cdf0e10cSrcweir if ( xExistingModel.is() )
508cdf0e10cSrcweir {
509cdf0e10cSrcweir try {
510cdf0e10cSrcweir uno::Reference< frame::XController > xController = xExistingModel->getCurrentController();
511cdf0e10cSrcweir if ( xController.is() )
512cdf0e10cSrcweir {
513cdf0e10cSrcweir uno::Reference< frame::XFrame > xFrame = xController->getFrame();
514cdf0e10cSrcweir if ( xFrame.is() )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir xFrame->activate();
517cdf0e10cSrcweir uno::Reference<awt::XTopWindow> xTopWindow( xFrame->getContainerWindow(), uno::UNO_QUERY );
518cdf0e10cSrcweir if(xTopWindow.is())
519cdf0e10cSrcweir xTopWindow->toFront();
520cdf0e10cSrcweir
521cdf0e10cSrcweir bResult = sal_True;
522cdf0e10cSrcweir }
523cdf0e10cSrcweir }
524cdf0e10cSrcweir }
525cdf0e10cSrcweir catch( uno::Exception& )
526cdf0e10cSrcweir {
527cdf0e10cSrcweir }
528cdf0e10cSrcweir }
529cdf0e10cSrcweir else
530cdf0e10cSrcweir {
531cdf0e10cSrcweir bResult = CreateModel( m_bUseNative );
532cdf0e10cSrcweir
533cdf0e10cSrcweir if ( !bResult && !m_bUseNative )
534cdf0e10cSrcweir {
535cdf0e10cSrcweir // the original storage can not be recognized
536cdf0e10cSrcweir if ( !m_aNativeTempURL.getLength() )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir // create a temporary file for the native representation if there is no
539cdf0e10cSrcweir CreateNative();
540cdf0e10cSrcweir }
541cdf0e10cSrcweir
542cdf0e10cSrcweir if ( m_aNativeTempURL.getLength() )
543cdf0e10cSrcweir {
544cdf0e10cSrcweir bResult = CreateModel( sal_True );
545cdf0e10cSrcweir if ( bResult )
546cdf0e10cSrcweir m_bUseNative = sal_True;
547cdf0e10cSrcweir }
548cdf0e10cSrcweir }
549cdf0e10cSrcweir }
550cdf0e10cSrcweir
551cdf0e10cSrcweir m_bBusy = sal_False;
552cdf0e10cSrcweir
553cdf0e10cSrcweir return bResult;
554cdf0e10cSrcweir }
555cdf0e10cSrcweir
556cdf0e10cSrcweir //--------------------------------------------------------
Close()557cdf0e10cSrcweir void OwnView_Impl::Close()
558cdf0e10cSrcweir {
559cdf0e10cSrcweir uno::Reference< frame::XModel > xModel;
560cdf0e10cSrcweir
561cdf0e10cSrcweir {
562cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
563cdf0e10cSrcweir if ( !m_xModel.is() )
564cdf0e10cSrcweir return;
565cdf0e10cSrcweir xModel = m_xModel;
566cdf0e10cSrcweir m_xModel = uno::Reference< frame::XModel >();
567cdf0e10cSrcweir
568cdf0e10cSrcweir if ( m_bBusy )
569cdf0e10cSrcweir return;
570cdf0e10cSrcweir
571cdf0e10cSrcweir m_bBusy = sal_True;
572cdf0e10cSrcweir }
573cdf0e10cSrcweir
574cdf0e10cSrcweir try {
575cdf0e10cSrcweir uno::Reference< document::XEventBroadcaster > xBroadCaster( xModel, uno::UNO_QUERY );
576cdf0e10cSrcweir if ( xBroadCaster.is() )
577cdf0e10cSrcweir xBroadCaster->removeEventListener( uno::Reference< document::XEventListener >(
578cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >( this ),
579cdf0e10cSrcweir uno::UNO_QUERY ) );
580cdf0e10cSrcweir
581cdf0e10cSrcweir uno::Reference< util::XCloseable > xCloseable( xModel, uno::UNO_QUERY );
582cdf0e10cSrcweir if ( xCloseable.is() )
583cdf0e10cSrcweir {
584cdf0e10cSrcweir xCloseable->removeCloseListener( uno::Reference< util::XCloseListener >(
585cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >( this ),
586cdf0e10cSrcweir uno::UNO_QUERY ) );
587cdf0e10cSrcweir xCloseable->close( sal_True );
588cdf0e10cSrcweir }
589cdf0e10cSrcweir }
590cdf0e10cSrcweir catch( uno::Exception& )
591cdf0e10cSrcweir {}
592cdf0e10cSrcweir
593cdf0e10cSrcweir m_bBusy = sal_False;
594cdf0e10cSrcweir }
595cdf0e10cSrcweir
596cdf0e10cSrcweir //--------------------------------------------------------
notifyEvent(const document::EventObject & aEvent)597cdf0e10cSrcweir void SAL_CALL OwnView_Impl::notifyEvent( const document::EventObject& aEvent )
598cdf0e10cSrcweir throw ( uno::RuntimeException )
599cdf0e10cSrcweir {
600cdf0e10cSrcweir
601cdf0e10cSrcweir uno::Reference< frame::XModel > xModel;
602cdf0e10cSrcweir
603cdf0e10cSrcweir {
604cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
605cdf0e10cSrcweir if ( aEvent.Source == m_xModel && aEvent.EventName.equalsAscii( "OnSaveAsDone" ) )
606cdf0e10cSrcweir {
607cdf0e10cSrcweir // SaveAs operation took place, so just forget the model and deregister listeners
608cdf0e10cSrcweir xModel = m_xModel;
609cdf0e10cSrcweir m_xModel = uno::Reference< frame::XModel >();
610cdf0e10cSrcweir }
611cdf0e10cSrcweir }
612cdf0e10cSrcweir
613cdf0e10cSrcweir if ( xModel.is() )
614cdf0e10cSrcweir {
615cdf0e10cSrcweir try {
616cdf0e10cSrcweir uno::Reference< document::XEventBroadcaster > xBroadCaster( xModel, uno::UNO_QUERY );
617cdf0e10cSrcweir if ( xBroadCaster.is() )
618cdf0e10cSrcweir xBroadCaster->removeEventListener( uno::Reference< document::XEventListener >(
619cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >( this ),
620cdf0e10cSrcweir uno::UNO_QUERY ) );
621cdf0e10cSrcweir
622cdf0e10cSrcweir uno::Reference< util::XCloseable > xCloseable( xModel, uno::UNO_QUERY );
623cdf0e10cSrcweir if ( xCloseable.is() )
624cdf0e10cSrcweir xCloseable->removeCloseListener( uno::Reference< util::XCloseListener >(
625cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >( this ),
626cdf0e10cSrcweir uno::UNO_QUERY ) );
627cdf0e10cSrcweir }
628cdf0e10cSrcweir catch( uno::Exception& )
629cdf0e10cSrcweir {}
630cdf0e10cSrcweir }
631cdf0e10cSrcweir }
632cdf0e10cSrcweir
633cdf0e10cSrcweir //--------------------------------------------------------
queryClosing(const lang::EventObject &,sal_Bool)634cdf0e10cSrcweir void SAL_CALL OwnView_Impl::queryClosing( const lang::EventObject&, sal_Bool )
635cdf0e10cSrcweir throw ( util::CloseVetoException,
636cdf0e10cSrcweir uno::RuntimeException )
637cdf0e10cSrcweir {
638cdf0e10cSrcweir }
639cdf0e10cSrcweir
640cdf0e10cSrcweir //--------------------------------------------------------
notifyClosing(const lang::EventObject & Source)641cdf0e10cSrcweir void SAL_CALL OwnView_Impl::notifyClosing( const lang::EventObject& Source )
642cdf0e10cSrcweir throw ( uno::RuntimeException )
643cdf0e10cSrcweir {
644cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
645cdf0e10cSrcweir if ( Source.Source == m_xModel )
646cdf0e10cSrcweir m_xModel = uno::Reference< frame::XModel >();
647cdf0e10cSrcweir }
648cdf0e10cSrcweir
649cdf0e10cSrcweir //--------------------------------------------------------
disposing(const lang::EventObject & Source)650cdf0e10cSrcweir void SAL_CALL OwnView_Impl::disposing( const lang::EventObject& Source )
651cdf0e10cSrcweir throw (uno::RuntimeException)
652cdf0e10cSrcweir {
653cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
654cdf0e10cSrcweir if ( Source.Source == m_xModel )
655cdf0e10cSrcweir m_xModel = uno::Reference< frame::XModel >();
656cdf0e10cSrcweir };
657cdf0e10cSrcweir
658*cda0808aSmseidel /* vim: set noet sw=4 ts=4: */
659