24#include <com/sun/star/io/BufferSizeExceededException.hpp>
25#include <com/sun/star/io/NotConnectedException.hpp>
26#include <com/sun/star/io/XMarkableStream.hpp>
27#include <com/sun/star/io/XOutputStream.hpp>
28#include <com/sun/star/io/XInputStream.hpp>
29#include <com/sun/star/io/XActiveDataSource.hpp>
30#include <com/sun/star/io/XActiveDataSink.hpp>
31#include <com/sun/star/io/XConnectable.hpp>
32#include <com/sun/star/lang/IllegalArgumentException.hpp>
33#include <com/sun/star/lang/XServiceInfo.hpp>
34#include <com/sun/star/uno/XComponentContext.hpp>
40#include <osl/diagnose.h>
43using namespace ::
cppu;
67class OMarkableOutputStream :
68 public WeakImplHelper< XOutputStream ,
76 OMarkableOutputStream( );
80 virtual void SAL_CALL flush()
override;
81 virtual void SAL_CALL closeOutput()
override;
84 virtual sal_Int32 SAL_CALL createMark()
override;
85 virtual void SAL_CALL deleteMark(sal_Int32 Mark)
override;
86 virtual void SAL_CALL jumpToMark(sal_Int32 nMark)
override;
87 virtual void SAL_CALL jumpToFurthest()
override;
88 virtual sal_Int32 SAL_CALL offsetToMark(sal_Int32 nMark)
override;
109 void checkMarksAndFlush();
118 std::map<sal_Int32,sal_Int32,std::less< sal_Int32 > >
m_mapMarks;
127OMarkableOutputStream::OMarkableOutputStream( )
138 throw NotConnectedException();
145 std::unique_lock guard(
m_mutex );
149 checkMarksAndFlush();
154void OMarkableOutputStream::flush()
158 std::unique_lock guard(
m_mutex );
171void OMarkableOutputStream::closeOutput()
174 throw NotConnectedException();
176 std::unique_lock guard(
m_mutex );
181 checkMarksAndFlush();
192sal_Int32 OMarkableOutputStream::createMark()
194 std::unique_lock guard(
m_mutex );
203void OMarkableOutputStream::deleteMark(sal_Int32 Mark)
205 std::unique_lock guard(
m_mutex );
206 std::map<sal_Int32,sal_Int32,std::less<sal_Int32> >::iterator ii =
m_mapMarks.find( Mark );
209 throw IllegalArgumentException(
210 "MarkableOutputStream::deleteMark unknown mark (" + OUString::number(Mark) +
")",
214 checkMarksAndFlush();
217void OMarkableOutputStream::jumpToMark(sal_Int32 nMark)
219 std::unique_lock guard(
m_mutex );
220 std::map<sal_Int32,sal_Int32,std::less<sal_Int32> >::iterator ii =
m_mapMarks.find( nMark );
223 throw IllegalArgumentException(
224 "MarkableOutputStream::jumpToMark unknown mark (" + OUString::number(nMark) +
")",
230void OMarkableOutputStream::jumpToFurthest()
232 std::unique_lock guard(
m_mutex );
234 checkMarksAndFlush();
237sal_Int32 OMarkableOutputStream::offsetToMark(sal_Int32 nMark)
240 std::unique_lock guard(
m_mutex );
241 std::map<sal_Int32,sal_Int32,std::less<sal_Int32> >::const_iterator ii =
m_mapMarks.find( nMark );
245 throw IllegalArgumentException(
246 "MarkableOutputStream::offsetToMark unknown mark (" + OUString::number(nMark) +
")",
260 setSuccessor( succ );
280 static_cast< XConnectable *
>(
this) ) );
297 static_cast< XConnectable *
>(
this ) ) );
309void OMarkableOutputStream::checkMarksAndFlush()
315 if( mark.second <= nNextFound ) {
316 nNextFound = mark.second;
325 mark.second -= nNextFound;
343OUString OMarkableOutputStream::getImplementationName()
345 return "com.sun.star.comp.io.stm.MarkableOutputStream";
349sal_Bool OMarkableOutputStream::supportsService(
const OUString& ServiceName)
357 return {
"com.sun.star.io.MarkableOutputStream" };
360extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
362 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
364 return cppu::acquire(
new OMarkableOutputStream());
372class OMarkableInputStream :
373 public WeakImplHelper
383 OMarkableInputStream( );
387 virtual sal_Int32 SAL_CALL readBytes(
Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead)
override ;
388 virtual sal_Int32 SAL_CALL readSomeBytes(
Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead)
override;
389 virtual void SAL_CALL skipBytes(sal_Int32 nBytesToSkip)
override;
391 virtual sal_Int32 SAL_CALL available()
override;
392 virtual void SAL_CALL closeInput()
override;
395 virtual sal_Int32 SAL_CALL createMark()
override;
396 virtual void SAL_CALL deleteMark(sal_Int32 Mark)
override;
397 virtual void SAL_CALL jumpToMark(sal_Int32 nMark)
override;
398 virtual void SAL_CALL jumpToFurthest()
override;
399 virtual sal_Int32 SAL_CALL offsetToMark(sal_Int32 nMark)
override;
417 void checkMarksAndFlush();
426 std::map<sal_Int32,sal_Int32,std::less< sal_Int32 > >
m_mapMarks;
435OMarkableInputStream::OMarkableInputStream()
448 sal_Int32 nBytesRead;
451 throw NotConnectedException(
452 "MarkableInputStream::readBytes NotConnectedException",
455 std::unique_lock guard(
m_mutex );
458 nBytesRead =
m_input->readBytes( aData, nBytesToRead );
467 nRead =
m_input->readBytes( aData , nToRead );
469 OSL_ASSERT(
aData.getLength() == nRead );
473 if( nRead < nToRead ) {
474 nBytesToRead = nBytesToRead - (nToRead-nRead);
483 nBytesRead = nBytesToRead;
490sal_Int32 OMarkableInputStream::readSomeBytes(
Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead)
493 sal_Int32 nBytesRead;
495 throw NotConnectedException(
496 "MarkableInputStream::readSomeBytes NotConnectedException",
500 std::unique_lock guard(
m_mutex );
503 nBytesRead =
m_input->readSomeBytes( aData, nMaxBytesToRead );
509 sal_Int32 nAdditionalBytesToRead = std::min<sal_Int32>(nMaxBytesToRead-nInBuffer,
m_input->available());
510 nAdditionalBytesToRead = std::max<sal_Int32>(0 , nAdditionalBytesToRead );
513 if( 0 == nInBuffer ) {
514 nRead =
m_input->readSomeBytes( aData , nMaxBytesToRead );
516 else if( nAdditionalBytesToRead ) {
517 nRead =
m_input->readBytes( aData , nAdditionalBytesToRead );
521 aData.realloc( nRead );
525 nBytesRead = std::min( nMaxBytesToRead , nInBuffer + nRead );
539void OMarkableInputStream::skipBytes(sal_Int32 nBytesToSkip)
541 if ( nBytesToSkip < 0 )
542 throw BufferSizeExceededException(
543 "precondition not met: XInputStream::skipBytes: non-negative integer required!",
549 readBytes( seqDummy , nBytesToSkip );
552sal_Int32 OMarkableInputStream::available()
555 throw NotConnectedException(
556 "MarkableInputStream::available NotConnectedException",
560 std::unique_lock guard(
m_mutex );
566void OMarkableInputStream::closeInput()
569 throw NotConnectedException(
570 "MarkableInputStream::closeInput NotConnectedException",
573 std::unique_lock guard(
m_mutex );
588sal_Int32 OMarkableInputStream::createMark()
590 std::unique_lock guard(
m_mutex );
599void OMarkableInputStream::deleteMark(sal_Int32 Mark)
601 std::unique_lock guard(
m_mutex );
602 std::map<sal_Int32,sal_Int32,std::less<sal_Int32> >::iterator ii =
m_mapMarks.find( Mark );
605 throw IllegalArgumentException(
606 "MarkableInputStream::deleteMark unknown mark (" + OUString::number(Mark) +
")",
610 checkMarksAndFlush();
613void OMarkableInputStream::jumpToMark(sal_Int32 nMark)
615 std::unique_lock guard(
m_mutex );
616 std::map<sal_Int32,sal_Int32,std::less<sal_Int32> >::iterator ii =
m_mapMarks.find( nMark );
620 throw IllegalArgumentException(
621 "MarkableInputStream::jumpToMark unknown mark (" + OUString::number(nMark) +
")",
627void OMarkableInputStream::jumpToFurthest()
629 std::unique_lock guard(
m_mutex );
631 checkMarksAndFlush();
634sal_Int32 OMarkableInputStream::offsetToMark(sal_Int32 nMark)
636 std::unique_lock guard(
m_mutex );
637 std::map<sal_Int32,sal_Int32,std::less<sal_Int32> >::const_iterator ii =
m_mapMarks.find( nMark );
641 throw IllegalArgumentException(
642 "MarkableInputStream::offsetToMark unknown mark (" + OUString::number(nMark) +
")",
657 setPredecessor( pred );
681 static_cast< XConnectable *
>(
this) ) );
699 static_cast< XConnectable *
>(
this) ) );
709void OMarkableInputStream::checkMarksAndFlush()
715 if( mark.second <= nNextFound ) {
716 nNextFound = mark.second;
725 mark.second -= nNextFound;
728 m_pBuffer->forgetFromStart( nNextFound );
738OUString OMarkableInputStream::getImplementationName()
740 return "com.sun.star.comp.io.stm.MarkableInputStream";
744sal_Bool OMarkableInputStream::supportsService(
const OUString& ServiceName)
752 return {
"com.sun.star.io.MarkableInputStream" };
755extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
757 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
759 return cppu::acquire(
new OMarkableInputStream());
constexpr OUStringLiteral aData
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * io_OMarkableInputStream_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * io_OMarkableOutputStream_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
bool getOutputStream(ProgramOptions const &options, OString const &extension, std::ostream **ppOutputStream, OString &targetSourceFileName, OString &tmpSourceFileName)
Reference< XConnectable > m_succ
std::map< sal_Int32, sal_Int32, std::less< sal_Int32 > > m_mapMarks
std::unique_ptr< MemRingBuffer > m_pBuffer
Reference< XOutputStream > m_output
Reference< XConnectable > m_pred
Reference< XInputStream > m_input
MemRingBuffer m_aRingBuffer