Hi Mikhail, Thanks for your last reply. I fixed the problems in your advice, and some more during the compilation process, but there are still two errors(as in error.log in the attachment), both of which seems to me are originated from data type mismatches. Could you please tell me the causes of and solutions to the errors?
Best Regards, Felix. Mikhail Voitenko 写道: > Hi Felix, > > The files look good from the first view. There are small problems: > - in the attributes implementation getUri() method should use > mpTempFile->GetURL() and getResourceName() method should use > mpTempFile->GetFileName() as it is done for the related properties in > the old implementation; > - XTempFile_createInstance should create an instance of OTempFileService > object; > > Additionally, OTempFileBase could be used as the direct base of the > OTempFileService. That would probably improve a little bit readability > of the code. > > The reimplementation is close to be ready ( if I do not forget anything > ), so you probably can start to build the service and try to let the > office run using the new implementation :) > > Please see the answers for your questions below. > > Zhang Xiaofei wrote: > >> Hi Mikhail, >> >> Thanks to your instructions in our last IRC meeting, I have adjusted the >> declaration of the interface and worked out most of the implementations. >> All the related files are attached to this mail, please give a >> inspection to them and some advice to me. :-) >> >> Just as usual, I have some questions today. >> 1. Is the XTempFile::GetProps() method to be disposed in the new >> implementation as well? >> >> > > Yes, this function is not needed any more. > > >> 2. As I can recall, you have mentioned the compatibility thing before, >> do we need to do additional implementations or the PropertySetMixin >> class takes care of it itself? >> >> > > Exactly, the PropertySetMixin should provide the XPropertySet access > based on the attributes implementation. > > >> 3. Could you give me some further explanation why >> IllegalArgumentException is thrown in the old, but not thrown in the new >> implementation? >> >> > > I assume you mean the setRemoveFile() method. In the old implementation > the setting of the related property could trigger > IllegalArgumentException because XPropertySet::setPropertyValue() takes > uno::Any as the new value, so it is possible to provide a wrong > argument. After the property is replaced by the attribute, the > setRemoveFile() method is used, and here the type-check happens on > compilation time. > > >> 4. I see lots of the methods use mutex. However they don't use the same >> one. While most of them use maMutex, the getTypes() method which >> inherits from XTypeProvider, as you taught me in a previous mail, uses >> m_pData->m_rSharedMutexRef->GetMutex(). To make it more confusing, the >> GetProps() method in the old implementation uses >> ::osl::Mutex::getGlobalMutex(). Could you give me some hints here? >> >> > > Of course the getTypes() method should use > ::osl::Mutex::getGlobalMutex() as well. Sorry for the typo, it is a > copy-paste problem. > The method getTypes() initializes a static variable, so the > object-related maMutex is not enough, the method should be guarded using > the global one. > > Best Regards, > Mikhail. > > >> Thanks and Best Regards, >> Felix >> >> > >
#ifndef _XTEMPFILE_HXX_ #define _XTEMPFILE_HXX_ #ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_HPP_ #include <com/sun/star/io/XInputStream.hpp> #endif #ifndef _COM_SUN_STAR_IO_XOUTPUTSTREAM_HPP_ #include <com/sun/star/io/XOutputStream.hpp> #endif #ifndef _COM_SUN_STAR_IO_XSEEKABLE_HPP_ #include <com/sun/star/io/XSeekable.hpp> #endif #ifndef _COM_SUN_STAR_IO_XSTREAM_HPP_ #include <com/sun/star/io/XStream.hpp> #endif #ifndef _COM_SUN_STAR_IO_XTEMPFILE_HPP_ #include <com/sun/star/io/XTempFile.hpp> #endif #ifndef _COM_SUN_STAR_IO_XTRUNCATE_HPP_ #include <com/sun/star/io/XTruncate.hpp> #endif #ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_ #include <com/sun/star/lang/XSingleServiceFactory.hpp> #endif #ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ #include <com/sun/star/lang/XMultiServiceFactory.hpp> #endif #ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_ #include <com/sun/star/lang/XServiceInfo.hpp> #endif #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSETINFO_HPP_ #include <com/sun/star/beans/XPropertySetInfo.hpp> #endif #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ #include <com/sun/star/beans/XPropertySet.hpp> #endif #ifndef _CPPUHELPER_IMPLBASE5_HXX_ #include <cppuhelper/implbase5.hxx> #endif #ifndef _CPPUHELPER_PROPERTYSETMIXIN_HXX_ #include <cppuhelper/propertysetmixin.hxx> #endif #ifndef _OSL_MUTEX_HXX_ #include <osl/mutex.hxx> #endif class SvStream; namespace utl { class TempFile; } typedef ::cppu::WeakImplHelper5< ::com::sun::star::io::XTempFile , ::com::sun::star::io::XInputStream , ::com::sun::star::io::XOutputStream , ::com::sun::star::io::XTruncate , ::com::sun::star::lang::XServiceInfo > OTempFileBase; class OTempFileService : public OTempFileBase, public ::cppu::PropertySetMixin< ::com::sun::star::io::XTempFile > { protected: ::utl::TempFile* mpTempFile; ::osl::Mutex maMutex; SvStream* mpStream; sal_Bool mbRemoveFile; sal_Bool mbInClosed; sal_Bool mbOutClosed; sal_Int64 mnCachedPos; sal_Bool mbHasCachedPos; void checkError () const; void checkConnected (); public: OTempFileService (); virtual ~OTempFileService (); //Methods // XInterface virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL acquire( ) throw (); virtual void SAL_CALL release( ) throw (); // XTypeProvider virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Sequence< ::sal_Int8 > SAL_CALL getImplementationId( ) throw (::com::sun::star::uno::RuntimeException); // XTempFile virtual ::sal_Bool SAL_CALL getRemoveFile() throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setRemoveFile( ::sal_Bool _removefile ) throw (::com::sun::star::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getUri() throw (::com::sun::star::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getResourceName() throw (::com::sun::star::uno::RuntimeException); // XInputStream virtual ::sal_Int32 SAL_CALL readBytes( ::com::sun::star::uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nBytesToRead ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual ::sal_Int32 SAL_CALL readSomeBytes( ::com::sun::star::uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nMaxBytesToRead ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL skipBytes( ::sal_Int32 nBytesToSkip ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual ::sal_Int32 SAL_CALL available( ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL closeInput( ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); // XOutputStream virtual void SAL_CALL writeBytes( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& aData ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL flush( ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL closeOutput( ) throw (::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); // XSeekable virtual void SAL_CALL seek( sal_Int64 location ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual sal_Int64 SAL_CALL getPosition( ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual sal_Int64 SAL_CALL getLength( ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); // XStream virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getInputStream( ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > SAL_CALL getOutputStream( ) throw (::com::sun::star::uno::RuntimeException); // XTruncate virtual void SAL_CALL truncate( ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); // XServiceInfo virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); static ::rtl::OUString getImplementationName_Static (); static ::com::sun::star::uno::Sequence < ::rtl::OUString > getSupportedServiceNames_Static(); static ::com::sun::star::uno::Reference < com::sun::star::lang::XSingleServiceFactory > createServiceFactory_Static( com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory > const & rServiceFactory ); }; #endif
#include "precompiled_unotools.hxx" #ifndef _XTEMPFILE_HXX_ #include <XTempFile.hxx> #endif #ifndef _CPPUHELPER_FACTORY_HXX_ #include <cppuhelper/factory.hxx> #endif #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_ #include <cppuhelper/typeprovider.hxx> #endif #ifndef _COM_SUN_STAR_REGISTRY_XREGISTRYKEY_HPP #include <com/sun/star/registry/XRegistryKey.hpp> #endif #ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP #include <com/sun/star/beans/PropertyAttribute.hpp> #endif #ifndef _UNOTOOLS_TEMPFILE_HXX #include <unotools/TempFile.hxx> #endif #ifndef _OSL_FILE_HXX_ #include <osl/file.hxx> #endif #ifndef _UTL_CONFIGMGR_HXX_ #include <unotools/configmgr.hxx> #endif #ifndef _URLOBJ_HXX #include <tools/urlobj.hxx> #endif #ifndef _TOOLS_DEBUG_HXX #include <tools/debug.hxx> #endif namespace css = com::sun::star; // copy define from desktop\source\app\appinit.cxx #define DESKTOP_TEMPNAMEBASE_DIR "/temp/soffice.tmp" OTempFileService::OTempFileService() : mpStream( NULL ) , mbRemoveFile( sal_True ) , mbInClosed( sal_False ) , mbOutClosed( sal_False ) , mnCachedPos( 0 ) , mbHasCachedPos( sal_False ) { mpTempFile = new ::utl::TempFile; mpTempFile->EnableKillingFile ( sal_True ); } OTempFileService::~OTempFileService () { if ( mpTempFile ) delete mpTempFile; } // XInterface ::css::uno::Any SAL_CALL OTempFileService::queryInterface( ::css::uno::Type const & aType ) throw ( ::css::uno::RuntimeException ) { ::css::uno::Any aResult( OTempFileBase::queryInterface( aType ) ); if (!aResult.hasValue()) aResult = cppu::PropertySetMixin< ::css::io::XTempFile >::queryInterface( aType ) ; return aResult; }; void SAL_CALL OTempFileService::acquire( ) throw () { OTempFileBase::acquire(); } void SAL_CALL OTempFileService::release( ) throw () { OTempFileBase::release(); } // XTypeProvider ::css::uno::Sequence< ::css::uno::Type > SAL_CALL OTempFileService::getTypes( ) throw ( ::css::uno::RuntimeException ) { static ::cppu::OTypeCollection* pTypeCollection = NULL; if ( pTypeCollection == NULL ) { ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); if ( pTypeCollection == NULL ) { static ::cppu::OTypeCollection aTypeCollection( OTempFileBase::getTypes(), ::getCppuType( ( const ::css::uno::Reference< ::css::beans::XPropertySet >*)NULL ) ); pTypeCollection = &aTypeCollection; } } return pTypeCollection->getTypes(); }; ::css::uno::Sequence< sal_Int8 > SAL_CALL OTempFileService::getImplementationId( ) throw ( ::css::uno::RuntimeException ) { return OTempFileBase::getImplementationId(); } // XTempFile sal_Bool SAL_CALL OTempFileService::getRemoveFile() throw ( ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( !mpTempFile ) { // the stream is already disconnected throw ::css::uno::RuntimeException(); } return mbRemoveFile; }; void SAL_CALL OTempFileService::setRemoveFile( sal_Bool _removefile ) throw ( ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( !mpTempFile ) { // the stream is already disconnected throw ::css::uno::RuntimeException(); } mbRemoveFile = _removefile; mpTempFile->EnableKillingFile( mbRemoveFile ); }; ::rtl::OUString SAL_CALL OTempFileService::getUri() throw ( ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( !mpTempFile ) { throw ::css::uno::RuntimeException(); } return ::rtl::OUString( mpTempFile->GetURL() ); }; ::rtl::OUString SAL_CALL OTempFileService::getResourceName() throw ( ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( !mpTempFile ) { throw ::css::uno::RuntimeException(); } return ::rtl::OUString( mpTempFile->GetFileName() ); }; // XInputStream sal_Int32 SAL_CALL OTempFileService::readBytes( ::css::uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) throw (::css::io::NotConnectedException, ::css::io::BufferSizeExceededException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbInClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); checkConnected(); if (nBytesToRead < 0) throw ::css::io::BufferSizeExceededException( ::rtl::OUString(), static_cast< ::css::uno::XWeak * >(this)); aData.realloc(nBytesToRead); sal_uInt32 nRead = mpStream->Read(static_cast < void* > ( aData.getArray() ), nBytesToRead); checkError(); if (nRead < static_cast < sal_uInt32 > ( nBytesToRead ) ) aData.realloc( nRead ); if ( sal::static_int_cast<sal_uInt32>(nBytesToRead) > nRead ) { // usually that means that the stream was read till the end // TODO/LATER: it is better to get rid of this optimization by avoiding using of multiple temporary files ( there should be only one temporary file? ) mnCachedPos = mpStream->Tell(); mbHasCachedPos = sal_True; mpStream = NULL; if ( mpTempFile ) mpTempFile->CloseStream(); } return nRead; } sal_Int32 SAL_CALL OTempFileService::readSomeBytes( ::css::uno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead ) throw ( ::css::io::NotConnectedException, ::css::io::BufferSizeExceededException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbInClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); checkConnected(); checkError(); if (nMaxBytesToRead < 0) throw ::css::io::BufferSizeExceededException( ::rtl::OUString(), static_cast < ::css::uno::XWeak * >( this ) ); if (mpStream->IsEof()) { aData.realloc(0); return 0; } else return readBytes(aData, nMaxBytesToRead); } void SAL_CALL OTempFileService::skipBytes( sal_Int32 nBytesToSkip ) throw ( ::css::io::NotConnectedException, ::css::io::BufferSizeExceededException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbInClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); checkConnected(); checkError(); mpStream->SeekRel(nBytesToSkip); checkError(); } sal_Int32 SAL_CALL OTempFileService::available( ) throw ( ::css::io::NotConnectedException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbInClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); checkConnected(); sal_uInt32 nPos = mpStream->Tell(); checkError(); mpStream->Seek(STREAM_SEEK_TO_END); checkError(); sal_Int32 nAvailable = (sal_Int32)mpStream->Tell() - nPos; mpStream->Seek(nPos); checkError(); return nAvailable; } void SAL_CALL OTempFileService::closeInput( ) throw ( ::css::io::NotConnectedException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbInClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); mbInClosed = sal_True; if ( mbOutClosed ) { // stream will be deleted by TempFile implementation mpStream = NULL; if ( mpTempFile ) { delete mpTempFile; mpTempFile = NULL; } } } // XOutputStream void SAL_CALL OTempFileService::writeBytes( const ::css::uno::Sequence< sal_Int8 >& aData ) throw ( ::css::io::NotConnectedException, ::css::io::BufferSizeExceededException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbOutClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); checkConnected(); sal_uInt32 nWritten = mpStream->Write(aData.getConstArray(),aData.getLength()); checkError(); if ( nWritten != (sal_uInt32)aData.getLength()) throw ::css::io::BufferSizeExceededException( ::rtl::OUString(),static_cast < ::css::uno::XWeak * > ( this ) ); } void SAL_CALL OTempFileService::flush( ) throw ( ::css::io::NotConnectedException, ::css::io::BufferSizeExceededException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbOutClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); checkConnected(); mpStream->Flush(); checkError(); } void SAL_CALL OTempFileService::closeOutput( ) throw ( ::css::io::NotConnectedException, ::css::io::BufferSizeExceededException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); if ( mbOutClosed ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); mbOutClosed = sal_True; // TODO/LATER: it is better to get rid of this optimization by avoiding using of multiple temporary files ( there should be only one temporary file? ) if ( mpStream ) { mnCachedPos = mpStream->Tell(); mbHasCachedPos = sal_True; mpStream = NULL; if ( mpTempFile ) mpTempFile->CloseStream(); } if ( mbInClosed ) { // stream will be deleted by TempFile implementation mpStream = NULL; if ( mpTempFile ) { delete mpTempFile; mpTempFile = NULL; } } } void OTempFileService::checkError () const { if (!mpStream || mpStream->SvStream::GetError () != ERRCODE_NONE ) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); } void OTempFileService::checkConnected () { if (!mpStream && mpTempFile) { mpStream = mpTempFile->GetStream( STREAM_STD_READWRITE ); if ( mpStream && mbHasCachedPos ) { mpStream->Seek( sal::static_int_cast<sal_Size>(mnCachedPos) ); if ( mpStream->SvStream::GetError () == ERRCODE_NONE ) { mbHasCachedPos = sal_False; mnCachedPos = 0; } else { mpStream = NULL; mpTempFile->CloseStream(); } } } if (!mpStream) throw ::css::io::NotConnectedException ( ::rtl::OUString(), const_cast < ::css::uno::XWeak * > ( static_cast < const ::css::uno::XWeak * > (this ) ) ); } // XSeekable void SAL_CALL OTempFileService::seek( sal_Int64 nLocation ) throw ( ::css::lang::IllegalArgumentException, ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); checkConnected(); if ( nLocation < 0 || nLocation > getLength() ) throw ::css::lang::IllegalArgumentException(); mpStream->Seek((sal_uInt32) nLocation ); checkError(); } sal_Int64 SAL_CALL OTempFileService::getPosition( ) throw ( ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); checkConnected(); sal_uInt32 nPos = mpStream->Tell(); checkError(); return (sal_Int64)nPos; } sal_Int64 SAL_CALL OTempFileService::getLength( ) throw ( ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); checkConnected(); sal_uInt32 nCurrentPos = mpStream->Tell(); checkError(); mpStream->Seek(STREAM_SEEK_TO_END); sal_uInt32 nEndPos = mpStream->Tell(); mpStream->Seek(nCurrentPos); checkError(); return (sal_Int64)nEndPos; } // XStream ::css::uno::Reference< ::css::io::XInputStream > SAL_CALL OTempFileService::getInputStream() throw ( ::css::uno::RuntimeException ) { return ::css::uno::Reference< ::css::io::XInputStream >( *this, ::css::uno::UNO_QUERY ); } ::css::uno::Reference< ::css::io::XOutputStream > SAL_CALL OTempFileService::getOutputStream() throw ( ::css::uno::RuntimeException ) { return ::css::uno::Reference< ::css::io::XOutputStream >( *this, ::css::uno::UNO_QUERY ); } // XTruncate void SAL_CALL OTempFileService::truncate() throw ( ::css::io::IOException, ::css::uno::RuntimeException ) { ::osl::MutexGuard aGuard( maMutex ); checkConnected(); // SetStreamSize() call does not change the position mpStream->Seek( 0 ); mpStream->SetStreamSize( 0 ); checkError(); } // XServiceInfo ::rtl::OUString SAL_CALL OTempFileService::getImplementationName() throw ( ::css::uno::RuntimeException ) { return getImplementationName_Static(); } sal_Bool SAL_CALL OTempFileService::supportsService( ::rtl::OUString const & rServiceName ) throw ( ::css::uno::RuntimeException ) { ::css::uno::Sequence< ::rtl::OUString > aServices(getSupportedServiceNames_Static()); return rServiceName == aServices[0]; } ::css::uno::Sequence < ::rtl::OUString > SAL_CALL OTempFileService::getSupportedServiceNames() throw ( ::css::uno::RuntimeException ) { return getSupportedServiceNames_Static(); } ::rtl::OUString OTempFileService::getImplementationName_Static () { return ::rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.io.comp.TempFile" ) ); } ::css::uno::Sequence < ::rtl::OUString > OTempFileService::getSupportedServiceNames_Static() { ::css::uno::Sequence < ::rtl::OUString > aNames ( 1 ); aNames[0] = ::rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.io.TempFile" ) ); return aNames; } ::css::uno::Reference < ::css::uno::XInterface >SAL_CALL XTempFile_createInstance( const ::css::uno::Reference< ::css::lang::XMultiServiceFactory > & /*xMgr*/ ) { return ::css::uno::Reference< ::css::uno::XInterface >( *new OTempFileService ); } ::css::uno::Reference < ::css::lang::XSingleServiceFactory > OTempFileService::createServiceFactory_Static( ::css::uno::Reference < ::css::lang::XMultiServiceFactory > const & rServiceFactory ) { return cppu::createSingleFactory ( rServiceFactory, getImplementationName_Static(), XTempFile_createInstance, getSupportedServiceNames_Static()); } static sal_Bool writeInfo( void * pRegistryKey, const ::rtl::OUString & rImplementationName, ::css::uno::Sequence< ::rtl::OUString > const & rServiceNames ) { ::rtl::OUString aKeyName( RTL_CONSTASCII_USTRINGPARAM ( "/" ) ); aKeyName += rImplementationName; aKeyName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "/UNO/SERVICES" ) ); ::css::uno::Reference< ::css::registry::XRegistryKey > xKey; try { xKey = static_cast< ::css::registry::XRegistryKey * >( pRegistryKey )->createKey( aKeyName ); } catch ( ::css::registry::InvalidRegistryException const & ) { } if ( !xKey.is() ) return sal_False; sal_Bool bSuccess = sal_True; for ( sal_Int32 n = 0; n < rServiceNames.getLength(); ++n ) { try { xKey->createKey( rServiceNames[ n ] ); } catch ( ::css::registry::InvalidRegistryException const & ) { bSuccess = sal_False; break; } } return bSuccess; } // C functions to implement this as a component extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ ) { *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; } /** * This function creates an implementation section in the registry and another subkey * for each supported service. * @param pServiceManager generic uno interface providing a service manager * @param pRegistryKey generic uno interface providing registry key to write */ extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo( void* /*pServiceManager*/, void* pRegistryKey ) { return pRegistryKey && writeInfo (pRegistryKey, OTempFileService::getImplementationName_Static(), OTempFileService::getSupportedServiceNames_Static() ); } /** * This function is called to get service factories for an implementation. * @param pImplName name of implementation * @param pServiceManager generic uno interface providing a service manager to instantiate components * @param pRegistryKey registry data key to read and write component persistent data * @return a component factory (generic uno interface) */ extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( const sal_Char * pImplName, void * pServiceManager, void * /*pRegistryKey*/ ) { void * pRet = 0; ::css::uno::Reference< ::css::lang::XMultiServiceFactory > xSMgr( reinterpret_cast< ::css::lang::XMultiServiceFactory * >( pServiceManager ) ); ::css::uno::Reference< ::css::lang::XSingleServiceFactory > xFactory; if (OTempFileService::getImplementationName_Static().compareToAscii( pImplName ) == 0) xFactory = OTempFileService::createServiceFactory_Static ( xSMgr ); if ( xFactory.is() ) { xFactory->acquire(); pRet = xFactory.get(); } return pRet; }
build -- version: 1.151 ============= Building project unotools ============= /cygdrive/e/ooo_OOE680_m6_src/unotools/source/i18n dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/config dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/accessibility dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/misc dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/processfactory dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/property dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/streaming dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------- /cygdrive/e/ooo_OOE680_m6_src/unotools/source/ucbhelper dmake.exe: Executing shell macro: +echo %_cwd dmake.exe: Executing shell macro: +echo %_4ver ------------------------------ Making: ..\..\wntmsci10.pro\slo\xtempfile.obj c:\PROGRA~1\MICROS~1.NET\Vc7\bin\cl.exe -Zm500 -Zc:forScope -GR -c -nologo -Gs -Gy -Ob1 -Oxs -Oy- -Gd -I. -I..\..\wntmsci10.pro\inc\ucbhelp -I..\inc -I..\..\inc\inc -I..\..\inc\pch -I..\..\inc -I..\..\WIN\inc -I..\..\wntmsci10.pro\inc -I. -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\stl -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\external -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc -Ie:\ooo_ooe680_m6_src\solenv\wntmsci10\inc -Ie:\ooo_ooe680_m6_src\solenv\inc -Ie:\ooo_ooe680_m6_src\res -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\stl -Id:\OOEnv\J2SDK1~1.2_0\include\win32 -Id:\OOEnv\J2SDK1~1.2_0\include -Id:\OOEnv\PSDK\include -Ic:\progra~1\micros~1.net\vc7\include -Id:\OOEnv\DXSDK2~1\include -Ie:\ooo_ooe680_m6_src\solver\680\wntmsci10.pro\inc\offuh -I. -I..\..\res -I. -GX -Wall -wd4061 -wd4063 -wd4127 -wd4191 -wd4217 -wd4250 -wd4251 -wd4275 -wd4290 -wd4292 -wd4294 -wd4344 -wd4347 -wd4355 -wd4503 -wd4511 -wd4512 -wd4514 -wd4611 -wd4619 -wd4625 -wd4626 -wd4640 -wd4675 -wd4686 -wd4710 -wd4711 -wd4786 -wd4800 -wd4820 -DWNT -DWNT -DNT351 -DMSC -DM1310 -DINTEL -D_X86_=1 -DFULL_DESK -DSTLPORT_VERSION=400 -DWINVER=0x400 -D_WIN32_IE=0x400 -D_MT -DCPPU_ENV=msci -DSUPD=680 -DPRODUCT -DNDEBUG -DPRODUCT_FULL -DOSL_DEBUG_LEVEL=0 -DOPTIMIZE -DEXCEPTIONS_ON -DCUI -DSOLAR_JAVA -DOOE680=OOE680 -DUNOTOOLS_DLLIMPLEMENTATION -DSHAREDLIB -D_DLL_ -DWIN32 -D_MT -D_DLL -DWIN32 -D_MT -D_DLL -DMULTITHREAD -Fo..\..\wntmsci10.pro\slo\xtempfile.obj e:\ooo_OOE680_m6_src\unotools\source\ucbhelper\xtempfile.cxx c:\PROGRA~1\MICROS~1.NET\Vc7\bin\cl.exe @C:\DOCUME~1\ZXF~1.CH2\LOCALS~1\Temp\mk608_2899_7 xtempfile.cxx e:\ooo_OOE680_m6_src\unotools\source\ucbhelper\XTempFile.cxx(48) : error C2512: 'cppu::PropertySetMixin<T>' : no appropriate default constructor available with [ T=com::sun::star::io::XTempFile ] e:\ooo_OOE680_m6_src\unotools\source\ucbhelper\XTempFile.cxx(95) : error C2664: 'cppu::OTypeCollection::OTypeCollection(const com::sun::star::uno::Type &,const com::sun::star::uno::Sequence<E> &) throw()' : cannot convert parameter 1 from 'com::sun::star::uno::Sequence<E>' to 'const com::sun::star::uno::Type &' with [ E=com::sun::star::uno::Type ] and [ E=com::sun::star::uno::Type ] Reason: cannot convert from 'com::sun::star::uno::Sequence<E>' to 'const com::sun::star::uno::Type' with [ E=com::sun::star::uno::Type ] No constructor could take the source type, or constructor overload resolution was ambiguous '---* tg_merge.mk *---'
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]