From 14a03abcd32800b52e900c405673c5b864e994a6 Mon Sep 17 00:00:00 2001 From: Cédric Bosdonnat Date: Sat, 1 Oct 2011 15:54:09 +0200 Subject: CMIS UCP: get the document content stream --- ucbhelper/Library_ucbhelper.mk | 1 + ucbhelper/Package_inc.mk | 1 + ucbhelper/inc/ucbhelper/fd_inputstream.hxx | 157 +++++++++++++++++++++ ucbhelper/source/provider/fd_inputstream.cxx | 203 +++++++++++++++++++++++++++ 4 files changed, 362 insertions(+) create mode 100644 ucbhelper/inc/ucbhelper/fd_inputstream.hxx create mode 100644 ucbhelper/source/provider/fd_inputstream.cxx (limited to 'ucbhelper') diff --git a/ucbhelper/Library_ucbhelper.mk b/ucbhelper/Library_ucbhelper.mk index ce1798d6f230..5fe25ca71f0a 100644 --- a/ucbhelper/Library_ucbhelper.mk +++ b/ucbhelper/Library_ucbhelper.mk @@ -72,6 +72,7 @@ $(eval $(call gb_Library_add_exception_objects,ucbhelper,\ ucbhelper/source/provider/contentinfo \ ucbhelper/source/provider/interactionrequest \ ucbhelper/source/provider/providerhelper \ + ucbhelper/source/provider/fd_inputstream \ ucbhelper/source/client/proxydecider \ ucbhelper/source/client/content \ ucbhelper/source/client/contentbroker \ diff --git a/ucbhelper/Package_inc.mk b/ucbhelper/Package_inc.mk index 501cc29c3790..ccce9c9eaed2 100644 --- a/ucbhelper/Package_inc.mk +++ b/ucbhelper/Package_inc.mk @@ -54,5 +54,6 @@ $(eval $(call gb_Package_add_file,ucbhelper_inc,inc/ucbhelper/contentidentifier. $(eval $(call gb_Package_add_file,ucbhelper_inc,inc/ucbhelper/providerhelper.hxx,ucbhelper/providerhelper.hxx)) $(eval $(call gb_Package_add_file,ucbhelper_inc,inc/ucbhelper/simplenameclashresolverequest.hxx,ucbhelper/simplenameclashresolverequest.hxx)) $(eval $(call gb_Package_add_file,ucbhelper_inc,inc/ucbhelper/macros.hxx,ucbhelper/macros.hxx)) +$(eval $(call gb_Package_add_file,ucbhelper_inc,inc/ucbhelper/fd_inputstream.hxx,ucbhelper/fd_inputstream.hxx)) # vim: set noet sw=4 ts=4: diff --git a/ucbhelper/inc/ucbhelper/fd_inputstream.hxx b/ucbhelper/inc/ucbhelper/fd_inputstream.hxx new file mode 100644 index 000000000000..a6551f7b99cb --- /dev/null +++ b/ucbhelper/inc/ucbhelper/fd_inputstream.hxx @@ -0,0 +1,157 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +/************************************************************************** + TODO + ************************************************************************** + + *************************************************************************/ + +#ifndef _UCBHELPER_FD_INPUTSTREAM_HXX_ +#define _UCBHELPER_FD_INPUTSTREAM_HXX_ + + +#include +#include +#include +#include +#include +#include +#include + +#include "ucbhelper/ucbhelperdllapi.h" + + +namespace ucbhelper +{ + + + /** Implements a seekable InputStream + * working on a buffer. + */ + + + namespace css = com::sun::star; + + + class UCBHELPER_DLLPUBLIC FdInputStream + : public cppu::OWeakObject, + public com::sun::star::io::XInputStream, + public com::sun::star::io::XSeekable + { + public: + + /** Defines the storage kind found + * on which the inputstream acts. + */ + + FdInputStream(FILE* tmpfl = 0); + + ~FdInputStream(); + + virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type& rType) + throw(css::uno::RuntimeException); + + virtual void SAL_CALL acquire(void) throw(); + + virtual void SAL_CALL release(void) throw(); + + virtual sal_Int32 SAL_CALL + readBytes(css::uno::Sequence< sal_Int8 >& aData, + sal_Int32 nBytesToRead) + throw( css::io::NotConnectedException, + css::io::BufferSizeExceededException, + css::io::IOException, + css::uno::RuntimeException); + + virtual sal_Int32 SAL_CALL + readSomeBytes(css::uno::Sequence< sal_Int8 >& aData, + sal_Int32 nMaxBytesToRead ) + throw( css::io::NotConnectedException, + css::io::BufferSizeExceededException, + css::io::IOException, + css::uno::RuntimeException); + + virtual void SAL_CALL + skipBytes(sal_Int32 nBytesToSkip) + throw(css::io::NotConnectedException, + css::io::BufferSizeExceededException, + css::io::IOException, + css::uno::RuntimeException ); + + virtual sal_Int32 SAL_CALL + available(void) + throw(css::io::NotConnectedException, + css::io::IOException, + css::uno::RuntimeException ); + + virtual void SAL_CALL + closeInput(void) + throw(css::io::NotConnectedException, + css::io::IOException, + css::uno::RuntimeException); + + + /** XSeekable + */ + + virtual void SAL_CALL + seek(sal_Int64 location) + throw(css::lang::IllegalArgumentException, + css::io::IOException, + css::uno::RuntimeException); + + + virtual sal_Int64 SAL_CALL + getPosition(void) + throw(css::io::IOException, + css::uno::RuntimeException); + + + virtual sal_Int64 SAL_CALL + getLength(void) + throw(css::io::IOException, + css::uno::RuntimeException); + + // additional + +// void append(const void* pBuffer,size_t size,size_t nmemb); + + private: + + osl::Mutex m_aMutex; + FILE* m_tmpfl; + sal_Int64 m_nLength; + }; + + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/ucbhelper/source/provider/fd_inputstream.cxx b/ucbhelper/source/provider/fd_inputstream.cxx new file mode 100644 index 000000000000..3c0e88d730d3 --- /dev/null +++ b/ucbhelper/source/provider/fd_inputstream.cxx @@ -0,0 +1,203 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_ucbhelper.hxx" + +#include "ucbhelper/fd_inputstream.hxx" + +#include +#include +#include + + +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::io; + +namespace ucbhelper +{ + FdInputStream::FdInputStream(FILE* tmpfl) + : m_tmpfl(tmpfl ? tmpfl : tmpfile()) + { + fseek(m_tmpfl,0,SEEK_END); + long pos = ftell(m_tmpfl); + rewind(m_tmpfl); + m_nLength = sal_Int64(pos); + } + + + + FdInputStream::~FdInputStream() + { + if ( 0 != m_tmpfl) + fclose(m_tmpfl); + } + + + Any SAL_CALL FdInputStream::queryInterface( + const Type& rType + ) + throw( + RuntimeException + ) + { + Any aRet = ::cppu::queryInterface(rType, + SAL_STATIC_CAST( XInputStream*,this ), + SAL_STATIC_CAST( XSeekable*,this ) ); + + return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); + } + + + + void SAL_CALL FdInputStream::acquire( void ) throw() { + OWeakObject::acquire(); + } + + + + void SAL_CALL FdInputStream::release( void ) throw() { + OWeakObject::release(); + } + + + sal_Int32 SAL_CALL FdInputStream::readBytes(Sequence< sal_Int8 >& aData, + sal_Int32 nBytesToRead) + throw(NotConnectedException, + BufferSizeExceededException, + IOException, + RuntimeException) + { + osl::MutexGuard aGuard(m_aMutex); + + if(0 <= nBytesToRead && aData.getLength() < nBytesToRead) + aData.realloc(nBytesToRead); + + size_t nWanted = static_cast(nBytesToRead); + size_t nRead = fread(aData.getArray(), 1, nWanted, m_tmpfl); + if (nRead != nWanted && ferror(m_tmpfl)) + throw IOException(); + + return static_cast(nRead); + } + + + sal_Int32 SAL_CALL FdInputStream::readSomeBytes( Sequence< sal_Int8 >& aData, + sal_Int32 nMaxBytesToRead ) + throw( NotConnectedException, + BufferSizeExceededException, + IOException, + RuntimeException) + { + return readBytes(aData,nMaxBytesToRead); + } + + + + void SAL_CALL FdInputStream::skipBytes(sal_Int32 nBytesToSkip) + throw(NotConnectedException, + BufferSizeExceededException, + IOException, + RuntimeException) + { + osl::MutexGuard aGuard(m_aMutex); + if(!m_tmpfl) + throw IOException(); + + fseek(m_tmpfl,long(nBytesToSkip),SEEK_CUR); + } + + + + sal_Int32 SAL_CALL FdInputStream::available(void) + throw(NotConnectedException, + IOException, + RuntimeException) + { + return sal::static_int_cast(m_nLength - getPosition()); + } + + + + void SAL_CALL FdInputStream::closeInput(void) + throw(NotConnectedException, + IOException, + RuntimeException) + { + osl::MutexGuard aGuard(m_aMutex); + if(m_tmpfl) + fclose(m_tmpfl),m_tmpfl = 0; + } + + + + void SAL_CALL FdInputStream::seek(sal_Int64 location) + throw( IllegalArgumentException, + IOException, + RuntimeException ) + { + osl::MutexGuard aGuard(m_aMutex); + if(!m_tmpfl) + throw IOException(); + + fseek(m_tmpfl,long(location),SEEK_SET); + } + + + + sal_Int64 SAL_CALL + FdInputStream::getPosition( + void ) + throw( IOException, + RuntimeException ) + { + osl::MutexGuard aGuard(m_aMutex); + if(!m_tmpfl) + throw IOException(); + + // fpos_t pos; + // fgetpos(m_tmpfl,&pos); + long pos; + pos = ftell(m_tmpfl); + return sal_Int64(pos); + } + + + + sal_Int64 SAL_CALL FdInputStream::getLength( + void + ) throw( + IOException,RuntimeException + ) + { + return m_nLength; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit