Hi Mikhail,

Thanks very much for your suggestions, I've modified the implementation
and made 2 new patches, could you help to review them please?

And I might need your help on the following question:
- About The private member SequenceInputStreamService::m_xFactory, I
could not find it being used in any existing member functions, I tried
to remove it from the implementation and find nothing affected. Could
you please tell me for what the purpose does was it there, reserved for
future use, I suppose? Should we keep it in SequenceOutputStreamService'
implementation, too?

Thanks and Best Regards :-) ,
Felix.


Mikhail Voitenko 写道:
> Hi Felix,
>
> The implementation looks good, except one problem you have already
> mentioned. You are completely right, it is not allowed to have
> out-parameter in the constructor. Sorry, my failure. The attached
> implementation fills the sequence correctly, but unfortunately not the
> original sequence provided from outside. So we should design it in
> different way. I would suggest the following changes:
> - introduce a new interface XSequenceOutputStream derived from
> XOutputStream, that implements an additional method, kind of "sequence<
> byte > getWrittenBytes() throws ( NotConnectedException, IOException )"
> - let the service be derived from the interface
> - let the service get no arguments in constructor, the sequence will be
> just an internal member in the implementation
>
> Thus, the user will create the service, that will fill internal sequence
> while being written, and then return the sequence. Before returning of
> the stream, the sequence must get the correct length, since for
> optimization reasons OSequenceOutputStream can let the sequence be
> longer during the writing. Currently it is done in
> OSequenceOutputStream::closeOutput(), but we do not need to close the
> internal stream in case of getWrittenBytes() call. So I would suggest to
> fix OSequenceOutputStream::flush() so that it sets the correct size to
> the sequence, and use this method in getWrittenBytes() call.
>
>
> As for the 'O' prefix, it is has no special meaning. There is no name
> convention regarding class names of service implementations, so it is a
> matter of taste. :)
>
> Best Regards,
> Mikhail.
>
>
> Zhang Xiaofei wrote:
>   
>> Hi Mikhail,
>>
>> The attachment is the patches to udkapi and comphelper projects, the
>> compilation to udkapi, offapi, offuh, comphelper projects all passed,
>> and the application seems running fine after I delivered
>> comphelp4MSC.dll explicitly to the install directory. Could you help
>> to review them please?
>>
>> This time I have some questions as well:
>>
>> The first is about the ctor of SequenceOutputStream, I'm not sure if I
>> got your statement in our last IRC meeting, that the service
>> constructor should take sequence of bytes as output parameter, in the
>> right way. At first I declared the ctor as:
>>
>> /_createStreamFromSequence( [out] sequence<byte> aData );
>>
>> _/But then I was informed by the compiler that a parameter of a ctor
>> may *not* be /out /or /inout, /I modified it to:
>>
>> /_createStreamFromSequence( [in] sequence<byte> aData );
>>
>> _/then the compilation passed. However I don't know if this is
>> semantically correct. Could you please give me some instructions here?/_
>> _/
>> The second is about naming conventions on classes, I find sometimes a
>> class has an 'O' before its name, just like OSequenceOutputStream in
>> /compehelper/inc/seqstream.hxx, and OTempFileService in our first
>> task, too; but sometimes there isn't, like SequenceInputStream in
>> seqstream.hxx, what does the 'O' stand for and when is it appropriate
>> to have it?
>> Does it has something to do with the class deriving from a typedef-ed
>> base class, like OSequenceOutputStream_Base and OTempFileBase, I suppose?
>>
>> Best Regards,
>> Felix.
>>
>>     
>
>
>   
diff -urNpw @udkapi/com/sun/star/io/SequenceOutputStream.idl 
udkapi/com/sun/star/io/SequenceOutputStream.idl
--- @udkapi/com/sun/star/io/SequenceOutputStream.idl    1970-01-01 
08:00:00.000000000 +0800
+++ udkapi/com/sun/star/io/SequenceOutputStream.idl     2007-09-12 
10:20:30.000000000 +0800
@@ -0,0 +1,56 @@
+/*************************************************************************
+ *
+ *  OpenOffice.org - a multi-platform office productivity suite
+ *
+ *  $RCSfile: SequenceInputStream.idl,v $
+ *
+ *  $Revision: 1.2 $
+ *
+ *  last change: $Author: hr $ $Date: 2007/06/26 16:08:11 $
+ *
+ *  The Contents of this file are made available subject to
+ *  the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ *    GNU Lesser General Public License Version 2.1
+ *    =============================================
+ *    Copyright 2005 by Sun Microsystems, Inc.
+ *    901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License version 2.1, as published by the Free Software Foundation.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ *
+ *    You should have received a copy of the GNU Lesser General Public
+ *    License along with this library; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *    MA  02111-1307  USA
+ *
+ ************************************************************************/
+#ifndef __com_sun_star_io_SequenceOutputStream_idl__
+#define __com_sun_star_io_SequenceOutputStream_idl__
+
+#ifndef __com_sun_star_io_XSequenceOutputStream_idl__
+#include <com/sun/star/io/XSequenceOutputStream.idl>
+#endif
+
+
+//=============================================================================
 
+
+module com { module sun { module star { module io {
+
+//=============================================================================
 
+/** This service allows to wrap a sequence of bytes with a output stream 
object.
+ */
+service SequenceOutputStream : XSequenceOutputStream;
+ 
+//=============================================================================
 
+
+}; }; }; };
+
+#endif 
diff -urNpw @udkapi/com/sun/star/io/XSequenceOutputStream.idl 
udkapi/com/sun/star/io/XSequenceOutputStream.idl
--- @udkapi/com/sun/star/io/XSequenceOutputStream.idl   1970-01-01 
08:00:00.000000000 +0800
+++ udkapi/com/sun/star/io/XSequenceOutputStream.idl    2007-09-12 
10:18:30.000000000 +0800
@@ -0,0 +1,71 @@
+/*************************************************************************
+ *
+ *  OpenOffice.org - a multi-platform office productivity suite
+ *
+ *  $RCSfile: SequenceInputStream.idl,v $
+ *
+ *  $Revision: 1.2 $
+ *
+ *  last change: $Author: hr $ $Date: 2007/06/26 16:08:11 $
+ *
+ *  The Contents of this file are made available subject to
+ *  the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ *    GNU Lesser General Public License Version 2.1
+ *    =============================================
+ *    Copyright 2005 by Sun Microsystems, Inc.
+ *    901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License version 2.1, as published by the Free Software Foundation.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ *
+ *    You should have received a copy of the GNU Lesser General Public
+ *    License along with this library; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *    MA  02111-1307  USA
+ *
+ ************************************************************************/
+#ifndef __com_sun_star_io_XSequenceOutputStream_idl__
+#define __com_sun_star_io_XSequenceOutputStream_idl__
+
+#ifndef __com_sun_star_io_XOutputStream_idl__
+#include <com/sun/star/io/XOutputStream.idl>
+#endif
+
+#ifndef __com_sun_star_io_NotConnectedException_idl__
+#include <com/sun/star/io/NotConnectedException.idl>
+#endif
+
+#ifndef __com_sun_star_io_IOException_idl__
+#include <com/sun/star/io/IOException.idl>
+#endif
+
+
+//=============================================================================
 
+
+module com { module sun { module star { module io {
+
+//=============================================================================
+/** This interface offers access to the written bytes
+*/
+interface XSequenceOutputStream
+{
+    interface XOutputStream;
+
+    sequence< byte > getWrittenBytes()
+        raises( com::sun::star::io::NotConnectedException, 
+        com::sun::star::io::IOException );
+};
+
+//=============================================================================
+
+}; }; }; };
+
+#endif
\ No newline at end of file
diff -urNpw @udkapi/com/sun/star/io/makefile.mk 
udkapi/com/sun/star/io/makefile.mk
--- @udkapi/com/sun/star/io/makefile.mk 2007-06-27 00:08:34.000000000 +0800
+++ udkapi/com/sun/star/io/makefile.mk  2007-09-12 10:18:10.000000000 +0800
@@ -61,6 +61,7 @@ IDLFILES=\
        Pipe.idl\
        Pump.idl\
        SequenceInputStream.idl\
+    SequenceOutputStream.idl\
        UnexpectedEOFException.idl\
        WrongFormatException.idl\
        XActiveDataControl.idl\
@@ -84,6 +85,7 @@ IDLFILES=\
        XStreamListener.idl\
        XSeekable.idl\
        XSeekableInputStream.idl\
+       XSequenceOutputStream.idl\
        TextInputStream.idl\
        TextOutputStream.idl\
        XTextInputStream.idl\
diff -urNpw @comphelper/source/streaming/makefile.mk 
comphelper/source/streaming/makefile.mk
--- @comphelper/source/streaming/makefile.mk    2007-06-27 00:11:08.000000000 
+0800
+++ comphelper/source/streaming/makefile.mk     2007-09-11 13:39:14.000000000 
+0800
@@ -50,6 +50,7 @@ SLOFILES=     $(SLO)$/basicio.obj \
                        $(SLO)$/oslfile2streamwrap.obj  \
                        $(SLO)$/seqstream.obj   \
                        $(SLO)$/seqinputstreamserv.obj  \
+                       $(SLO)$/seqoutputstreamserv.obj  \
                        $(SLO)$/streamsection.obj \
                        $(SLO)$/seekableinput.obj \
                        $(SLO)$/otransactedfilestream.obj \
diff -urNpw @comphelper/source/streaming/seqoutputstreamserv.cxx 
comphelper/source/streaming/seqoutputstreamserv.cxx
--- @comphelper/source/streaming/seqoutputstreamserv.cxx        1970-01-01 
08:00:00.000000000 +0800
+++ comphelper/source/streaming/seqoutputstreamserv.cxx 2007-09-12 
14:00:20.000000000 +0800
@@ -0,0 +1,179 @@
+/*************************************************************************
+*
+*  OpenOffice.org - a multi-platform office productivity suite
+*
+*  $RCSfile: seqinputstreamserv.cxx,v $
+*
+*  $Revision: 1.2 $
+*
+*  last change: $Author: hr $ $Date: 2007/06/26 16:11:17 $
+*
+*  The Contents of this file are made available subject to
+*  the terms of GNU Lesser General Public License Version 2.1.
+*
+*
+*    GNU Lesser General Public License Version 2.1
+*    =============================================
+*    Copyright 2005 by Sun Microsystems, Inc.
+*    901 San Antonio Road, Palo Alto, CA 94303, USA
+*
+*    This library is free software; you can redistribute it and/or
+*    modify it under the terms of the GNU Lesser General Public
+*    License version 2.1, as published by the Free Software Foundation.
+*
+*    This library is distributed in the hope that it will be useful,
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+*    Lesser General Public License for more details.
+*
+*    You should have received a copy of the GNU Lesser General Public
+*    License along with this library; if not, write to the Free Software
+*    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+*    MA  02111-1307  USA
+*
+************************************************************************/
+
+#include "precompiled_comphelper.hxx"
+
+#include <sal/config.h>
+#include <osl/mutex.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implementationentry.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <comphelper/seqstream.hxx>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/io/XSequenceOutputStream.hpp>
+
+using namespace ::com::sun::star;
+
+::rtl::OUString SAL_CALL SequenceOutputStreamService_getImplementationName();
+uno::Sequence< ::rtl::OUString > SAL_CALL 
SequenceOutputStreamService_getSupportedServiceNames();
+uno::Reference< uno::XInterface > SAL_CALL 
SequenceOutputStreamService_createInstance( const uno::Reference< 
lang::XMultiServiceFactory > & xFactory ) SAL_THROW( (uno::Exception ) );
+
+
+namespace {
+
+class SequenceOutputStreamService:
+public ::cppu::WeakImplHelper2 < lang::XServiceInfo, io::XOutputStream>
+{
+public:
+    explicit SequenceOutputStreamService( uno::Reference< 
lang::XMultiServiceFactory > const & xFactory );
+
+    // ::com::sun::star::lang::XServiceInfo:
+    virtual ::rtl::OUString SAL_CALL getImplementationName() throw ( 
uno::RuntimeException );
+    virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString & 
ServiceName ) throw ( uno::RuntimeException );
+    virtual uno::Sequence< ::rtl::OUString > SAL_CALL 
getSupportedServiceNames() throw ( uno::RuntimeException );
+
+    // ::com::sun::star::io::XOutputStream:
+    virtual void SAL_CALL writeBytes( const uno::Sequence< ::sal_Int8 > & 
aData ) throw ( io::NotConnectedException, io::BufferSizeExceededException, 
io::IOException, uno::RuntimeException );
+    virtual void SAL_CALL flush() throw ( uno::RuntimeException, 
io::NotConnectedException, io::BufferSizeExceededException, io::IOException );
+    virtual void SAL_CALL closeOutput() throw ( uno::RuntimeException, 
io::NotConnectedException, io::BufferSizeExceededException, io::IOException );
+
+    // ::com::sun::star::io::XSequenceOutputStream:
+    virtual uno::Sequence< ::sal_Int8 > SAL_CALL getWrittenBytes(  ) throw ( 
io::NotConnectedException, io::IOException, uno::RuntimeException);
+
+private:
+    SequenceOutputStreamService( SequenceOutputStreamService & ); //not defined
+    void operator =( SequenceOutputStreamService & ); //not defined
+
+    virtual ~SequenceOutputStreamService() {};
+
+
+    ::osl::Mutex m_aMutex;
+    uno::Reference< lang::XMultiServiceFactory > m_xFactory;
+    uno::Reference< io::XOutputStream > m_xOutputStream;
+    uno::Sequence< ::sal_Int8 > m_aSequence;
+};
+
+SequenceOutputStreamService::SequenceOutputStreamService( uno::Reference< 
lang::XMultiServiceFactory > const & xFactory )
+: m_xFactory( xFactory )
+{}
+
+// com.sun.star.uno.XServiceInfo:
+::rtl::OUString SAL_CALL SequenceOutputStreamService::getImplementationName() 
throw ( uno::RuntimeException )
+{
+    return SequenceOutputStreamService_getImplementationName();
+}
+
+::sal_Bool SAL_CALL SequenceOutputStreamService::supportsService( 
::rtl::OUString const & serviceName ) throw ( uno::RuntimeException )
+{
+    uno::Sequence< ::rtl::OUString > serviceNames = 
SequenceOutputStreamService_getSupportedServiceNames();
+    for ( ::sal_Int32 i = 0; i < serviceNames.getLength(); ++i ) {
+        if ( serviceNames[i] == serviceName )
+            return sal_True;
+    }
+    return sal_False;
+}
+
+uno::Sequence< ::rtl::OUString > SAL_CALL 
SequenceOutputStreamService::getSupportedServiceNames() throw ( 
uno::RuntimeException )
+{
+    return SequenceOutputStreamService_getSupportedServiceNames();
+}
+
+// ::com::sun::star::io::XOutputStream:
+void SAL_CALL SequenceOutputStreamService::writeBytes( const uno::Sequence< 
::sal_Int8 > & aData ) throw ( uno::RuntimeException, 
io::NotConnectedException, io::BufferSizeExceededException, io::IOException )
+{
+    ::osl::MutexGuard aGuard( m_aMutex );
+    if ( !m_xOutputStream.is() )
+        throw io::NotConnectedException();
+
+    m_xOutputStream->writeBytes( aData );
+    m_aSequence = aData;
+}
+
+void SAL_CALL SequenceOutputStreamService::flush() throw ( 
uno::RuntimeException, io::NotConnectedException, 
io::BufferSizeExceededException, io::IOException )
+{
+    ::osl::MutexGuard aGuard( m_aMutex );
+    if ( !m_xOutputStream.is() )
+        throw io::NotConnectedException();
+
+    m_xOutputStream->flush();
+};
+
+void SAL_CALL SequenceOutputStreamService::closeOutput() throw ( 
uno::RuntimeException, io::NotConnectedException, 
io::BufferSizeExceededException, io::IOException )
+{
+    ::osl::MutexGuard aGuard( m_aMutex );
+    if ( !m_xOutputStream.is() )
+        throw io::NotConnectedException();
+
+    m_xOutputStream->closeOutput();
+    m_xOutputStream = uno::Reference< io::XOutputStream >();
+}
+
+// ::com::sun::star::io::XSequenceOutputStream:
+uno::Sequence< ::sal_Int8 > SAL_CALL 
SequenceOutputStreamService::getWrittenBytes() throw ( 
io::NotConnectedException, io::IOException, uno::RuntimeException)
+{
+    ::osl::MutexGuard aGuard( m_aMutex );
+    if ( !m_xOutputStream.is() )
+        throw io::NotConnectedException();
+    
+    m_xOutputStream->flush();
+    return m_aSequence;
+}
+
+} // anonymous namespace
+
+::rtl::OUString SAL_CALL SequenceOutputStreamService_getImplementationName() {
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
+        "com.sun.star.comp.SequenceOutputStreamService" ) );
+}
+
+uno::Sequence< ::rtl::OUString > SAL_CALL 
SequenceOutputStreamService_getSupportedServiceNames()
+{
+    uno::Sequence< ::rtl::OUString > s( 1 );
+    s[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
+        "com.sun.star.io.SequenceOutputStream" ) );
+    return s;
+}
+
+uno::Reference< uno::XInterface > SAL_CALL 
SequenceOutputStreamService_createInstance(
+    const uno::Reference< lang::XMultiServiceFactory > & xFactory )
+    SAL_THROW( (uno::Exception ) )
+{
+    return static_cast< ::cppu::OWeakObject * >( new 
SequenceOutputStreamService( xFactory ) );
+}
+
+
+
+
+
diff -urNpw @comphelper/source/streaming/seqstream.cxx 
comphelper/source/streaming/seqstream.cxx
--- @comphelper/source/streaming/seqstream.cxx  2006-09-18 01:21:22.000000000 
+0800
+++ comphelper/source/streaming/seqstream.cxx   2007-09-12 10:43:52.000000000 
+0800
@@ -234,7 +234,8 @@ void SAL_CALL OSequenceOutputStream::flu
        if (!m_bConnected)
                throw NotConnectedException();
 
-       // nothing to do here
+    // cut the sequence to the real size
+    m_rSequence.realloc(m_nSize);
 }
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to