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]

Reply via email to