diff options
author | Cédric Bosdonnat <cedric.bosdonnat.ooo@free.fr> | 2011-10-01 15:54:09 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat.ooo@free.fr> | 2011-10-01 16:04:47 +0200 |
commit | 14a03abcd32800b52e900c405673c5b864e994a6 (patch) | |
tree | fb68f96bdac222ac316de5379f9ddda8eb4b89d6 | |
parent | a43730b4dfce70ee02996f808525cbd4e197e899 (diff) |
CMIS UCP: get the document content stream
-rw-r--r-- | libcmis/ExternalLib_libcmis.mk | 2 | ||||
-rw-r--r-- | ucb/source/ucp/cmis/cmis_content.cxx | 192 | ||||
-rw-r--r-- | ucb/source/ucp/cmis/cmis_content.hxx | 4 | ||||
-rw-r--r-- | ucb/source/ucp/cmis/cmis_url.cxx | 94 | ||||
-rw-r--r-- | ucb/source/ucp/cmis/cmis_url.hxx | 56 | ||||
-rw-r--r-- | ucb/source/ucp/cmis/makefile.mk | 4 | ||||
-rw-r--r-- | ucb/source/ucp/ftp/ftpcfunc.cxx | 1 | ||||
-rw-r--r-- | ucb/source/ucp/ftp/ftpcontent.cxx | 6 | ||||
-rw-r--r-- | ucb/source/ucp/ftp/ftpinpstr.cxx | 208 | ||||
-rw-r--r-- | ucb/source/ucp/ftp/ftpurl.cxx | 1 | ||||
-rw-r--r-- | ucb/source/ucp/ftp/makefile.mk | 1 | ||||
-rw-r--r-- | ucb/source/ucp/gio/gio_content.cxx | 1 | ||||
-rw-r--r-- | ucbhelper/Library_ucbhelper.mk | 1 | ||||
-rw-r--r-- | ucbhelper/Package_inc.mk | 1 | ||||
-rw-r--r-- | ucbhelper/inc/ucbhelper/fd_inputstream.hxx (renamed from ucb/source/ucp/ftp/ftpinpstr.hxx) | 15 | ||||
-rw-r--r-- | ucbhelper/source/provider/fd_inputstream.cxx | 203 |
16 files changed, 535 insertions, 255 deletions
diff --git a/libcmis/ExternalLib_libcmis.mk b/libcmis/ExternalLib_libcmis.mk index 88d981d284a8..5f912e16842d 100644 --- a/libcmis/ExternalLib_libcmis.mk +++ b/libcmis/ExternalLib_libcmis.mk @@ -28,6 +28,6 @@ $(eval $(call gb_ExternalLib_ExternalLib,libcmis,autotools)) -$(eval $(call gb_ExternalLib_set_src_package,libcmis,b9ac948fed0a9a5dd083160119c0b0b3-libcmis-0.1.0.tar.gz)) +$(eval $(call gb_ExternalLib_set_src_package,libcmis,51eba115d4b25b5db571e385c1395ac8-libcmis-0.1.0.tar.gz)) # vim: set noet sw=4 ts=4: diff --git a/ucb/source/ucp/cmis/cmis_content.cxx b/ucb/source/ucp/cmis/cmis_content.cxx index 31f49a943abc..d72041e5e9b6 100644 --- a/ucb/source/ucp/cmis/cmis_content.cxx +++ b/ucb/source/ucp/cmis/cmis_content.cxx @@ -31,18 +31,29 @@ #include <com/sun/star/beans/PropertyAttribute.hpp> #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/beans/XPropertySetInfo.hpp> +#include <com/sun/star/io/XActiveDataSink.hpp> #include <com/sun/star/ucb/ContentInfoAttribute.hpp> #include <com/sun/star/ucb/InsertCommandArgument.hpp> +#include <com/sun/star/ucb/OpenMode.hpp> +#include <com/sun/star/ucb/UnsupportedDataSinkException.hpp> +#include <com/sun/star/ucb/UnsupportedOpenModeException.hpp> #include <com/sun/star/ucb/XCommandInfo.hpp> +#include <com/sun/star/ucb/XDynamicResultSet.hpp> + +#include <libcmis/document.hxx> #include <ucbhelper/cancelcommandexecution.hxx> #include <ucbhelper/contentidentifier.hxx> +#include <ucbhelper/fd_inputstream.hxx> #include <ucbhelper/propertyvalueset.hxx> #include "cmis_content.hxx" #include "cmis_provider.hxx" +#include "cmis_url.hxx" + using namespace com::sun::star; +using namespace std; namespace cmis { @@ -50,12 +61,20 @@ namespace cmis ContentProvider *pProvider, const uno::Reference< ucb::XContentIdentifier >& Identifier) throw ( ucb::ContentCreationException ) : ContentImplHelper( rxSMgr, pProvider, Identifier ), - m_pProvider( pProvider ) + m_pProvider( pProvider ), + m_pSession( NULL ) { #if OSL_DEBUG_LEVEL > 1 - fprintf(stderr, "TODO - New Content ('%s')\n", rtl::OUStringToOString(m_xIdentifier->getContentIdentifier(), RTL_TEXTENCODING_UTF8).getStr()); + fprintf(stderr, "New Content ('%s')\n", rtl::OUStringToOString(m_xIdentifier->getContentIdentifier(), RTL_TEXTENCODING_UTF8).getStr()); #endif - // TODO Implement me + // Split the URL into bits + cmis::URL url( m_xIdentifier->getContentIdentifier() ); + + // Initiate a CMIS session + m_pSession = libcmis::SessionFactory::createSession( url.getSessionParams( ) ); + + // Get the content Object + m_pObject = m_pSession->getObject( url.getObjectId() ); } Content::Content( const uno::Reference< lang::XMultiServiceFactory >& rxSMgr, ContentProvider *pProvider, @@ -63,7 +82,8 @@ namespace cmis sal_Bool /*bIsFolder*/) throw ( ucb::ContentCreationException ) : ContentImplHelper( rxSMgr, pProvider, Identifier ), - m_pProvider( pProvider ) + m_pProvider( pProvider ), + m_pSession( NULL ) { #if OSL_DEBUG_LEVEL > 1 fprintf(stderr, "TODO - Create Content ('%s')\n", rtl::OUStringToOString(m_xIdentifier->getContentIdentifier(), RTL_TEXTENCODING_UTF8).getStr()); @@ -73,21 +93,12 @@ namespace cmis Content::~Content() { -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "TODO - cmis::Content::~Content()\n" ); -#endif - // TODO Implement me + delete m_pSession; } bool Content::isFolder(const uno::Reference< ucb::XCommandEnvironment >& /*xEnv*/) { - bool bRet = false; -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "TODO - cmis::Content::isFolder()\n" ); -#endif - // TODO Implement me - - return bRet; + return m_pObject->getBaseType( ) == "cmis::folder"; } uno::Any Content::getBadArgExcept() @@ -98,17 +109,75 @@ namespace cmis } uno::Reference< sdbc::XRow > Content::getPropertyValues( - const uno::Sequence< beans::Property >& /*rProperties*/, + const uno::Sequence< beans::Property >& rProperties, const uno::Reference< ucb::XCommandEnvironment >& /*xEnv*/ ) { - uno::Reference< sdbc::XRow > rRow; - #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "TODO - cmis::Content::getPropertyValues()\n" ); #endif - // TODO Implement me + rtl::Reference< ::ucbhelper::PropertyValueSet > xRow = new ::ucbhelper::PropertyValueSet( m_xSMgr ); - return rRow; + sal_Int32 nProps; + const beans::Property* pProps; + + nProps = rProperties.getLength(); + pProps = rProperties.getConstArray(); + + for( sal_Int32 n = 0; n < nProps; ++n ) + { + const beans::Property& rProp = pProps[ n ]; + + if (rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsDocument" ) ) ) + { + if ( m_pObject->getBaseType( ) == "cmis:document" ) + xRow->appendBoolean( rProp, true ); + else + xRow->appendVoid( rProp ); + } + else if (rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsFolder" ) ) ) + { + if( m_pObject->getBaseType( ) == "cmis:folder" ) + xRow->appendBoolean( rProp, true ); + else + xRow->appendVoid( rProp ); + } + else if (rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Title" ) ) ) + { + xRow->appendString( rProp, rtl::OUString::createFromAscii( m_pObject->getName().c_str() ) ); + } + else if (rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsReadOnly" ) ) ) + { + // TODO Fix this value + xRow->appendBoolean( rProp, sal_True ); + } + else if (rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DateCreated" ) ) ) + { + // TODO Fix this value + xRow->appendVoid( rProp ); + } + else if (rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DateModified" ) ) ) + { + // TODO Fix this value + xRow->appendVoid( rProp ); + } + else if (rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Size" ) ) ) + { + libcmis::Document* document = dynamic_cast< libcmis::Document* >( m_pObject.get( ) ); + if ( NULL != document ) + xRow->appendLong( rProp, document->getContentLength() ); + else + xRow->appendVoid( rProp ); + } +#if OSL_DEBUG_LEVEL > 1 + else + { + fprintf( stderr, "Looking for unsupported property %s\n", + rtl::OUStringToOString( rProp.Name, RTL_TEXTENCODING_UTF8 ).getStr( ) ); + } +#endif + } + + return uno::Reference< sdbc::XRow >( xRow.get() ); } void Content::queryChildren( ContentRefList& /*rChildren*/ ) @@ -119,16 +188,62 @@ namespace cmis // TODO Implement me } - uno::Any Content::open(const ucb::OpenCommandArgument2 & /*rArg*/, - const uno::Reference< ucb::XCommandEnvironment > & /*xEnv*/ ) + uno::Any Content::open(const ucb::OpenCommandArgument2 & rOpenCommand, + const uno::Reference< ucb::XCommandEnvironment > & xEnv ) throw( uno::Exception ) { + bool bIsFolder = isFolder( xEnv ); + + // TODO Handle the case of the non-existing file + uno::Any aRet; + sal_Bool bOpenFolder = ( + ( rOpenCommand.Mode == ucb::OpenMode::ALL ) || + ( rOpenCommand.Mode == ucb::OpenMode::FOLDERS ) || + ( rOpenCommand.Mode == ucb::OpenMode::DOCUMENTS ) + ); + + if ( bOpenFolder && bIsFolder ) + { #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "TODO - cmis::Content::open()\n" ); + fprintf( stderr, "TODO - cmis::Content::open() - Folder case\n" ); #endif - // TODO Implement me + // TODO Implement the folder case + } + else if ( rOpenCommand.Sink.is() ) + { + if ( + ( rOpenCommand.Mode == ucb::OpenMode::DOCUMENT_SHARE_DENY_NONE ) || + ( rOpenCommand.Mode == ucb::OpenMode::DOCUMENT_SHARE_DENY_WRITE ) + ) + { + ucbhelper::cancelCommandExecution( + uno::makeAny ( ucb::UnsupportedOpenModeException + ( rtl::OUString(), static_cast< cppu::OWeakObject * >( this ), + sal_Int16( rOpenCommand.Mode ) ) ), + xEnv ); + } + + if ( !feedSink( rOpenCommand.Sink, xEnv ) ) + { + // Note: rOpenCommand.Sink may contain an XStream + // implementation. Support for this type of + // sink is optional... +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "Failed to load data from '%s'\n", + rtl::OUStringToOString( m_xIdentifier->getContentIdentifier(), RTL_TEXTENCODING_UTF8 ).getStr() ); +#endif + + ucbhelper::cancelCommandExecution( + uno::makeAny (ucb::UnsupportedDataSinkException + ( rtl::OUString(), static_cast< cppu::OWeakObject * >( this ), + rOpenCommand.Sink ) ), + xEnv ); + } + } + else + fprintf( stderr, "Open falling through ..." ); return aRet; } @@ -190,16 +305,31 @@ namespace cmis return aRet; } - sal_Bool Content::feedSink( uno::Reference< uno::XInterface> /*aSink*/, + sal_Bool Content::feedSink( uno::Reference< uno::XInterface> xSink, const uno::Reference< ucb::XCommandEnvironment >& /*xEnv*/ ) { - sal_Bool bRet = sal_False; -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "TODO - cmis::Content::feedSink()\n" ); -#endif - // TODO Implement me + if ( !xSink.is() ) + return sal_False; - return bRet; + uno::Reference< io::XOutputStream > xOut = uno::Reference< io::XOutputStream >(xSink, uno::UNO_QUERY ); + uno::Reference< io::XActiveDataSink > xDataSink = uno::Reference< io::XActiveDataSink >(xSink, uno::UNO_QUERY ); + + if ( !xOut.is() && !xDataSink.is() ) + return sal_False; + + libcmis::Document* document = dynamic_cast< libcmis::Document* >( m_pObject.get() ); + FILE* fd = document->getContent( ); + + uno::Reference< io::XInputStream > xIn = new ucbhelper::FdInputStream( fd ); + if( !xIn.is( ) ) + return sal_False; + + if ( xDataSink.is() ) + xDataSink->setInputStream( xIn ); + else if ( xOut.is() ) + copyData( xIn, xOut ); + + return sal_True; } sal_Bool Content::exchangeIdentity( const uno::Reference< ucb::XContentIdentifier >& /*xNewId*/ ) diff --git a/ucb/source/ucp/cmis/cmis_content.hxx b/ucb/source/ucp/cmis/cmis_content.hxx index 20171a606155..ef7503a0dfbe 100644 --- a/ucb/source/ucp/cmis/cmis_content.hxx +++ b/ucb/source/ucp/cmis/cmis_content.hxx @@ -66,7 +66,9 @@ class ContentProperties; class Content : public ::ucbhelper::ContentImplHelper, public com::sun::star::ucb::XContentCreator { private: - ContentProvider *m_pProvider; + ContentProvider* m_pProvider; + libcmis::Session* m_pSession; + libcmis::CmisObjectPtr m_pObject; bool isFolder(const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment >& xEnv); diff --git a/ucb/source/ucp/cmis/cmis_url.cxx b/ucb/source/ucp/cmis/cmis_url.cxx new file mode 100644 index 000000000000..2942d8c144e1 --- /dev/null +++ b/ucb/source/ucp/cmis/cmis_url.cxx @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * [ Copyright (C) 2011 SUSE <cbosdonnat@suse.com> (initial developer) ] + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include <libcmis/session-factory.hxx> +#include <tools/urlobj.hxx> + +#include "cmis_url.hxx" + +using namespace std; + +#define OUSTR_TO_STDSTR(s) string( rtl::OUStringToOString( s, RTL_TEXTENCODING_UTF8 ).getStr() ) + + +namespace cmis +{ + URL::URL( rtl::OUString const & urlStr ) + { + INetURLObject url( urlStr ); + + string bindingUrl( "http://" ); + bindingUrl += OUSTR_TO_STDSTR( url.GetHostPort( ) ); + bindingUrl += OUSTR_TO_STDSTR( url.GetURLPath( ) ); + m_sBindingUrl = bindingUrl; + + // Split the query into bits and locate the repo-id key + rtl::OUString query = url.GetParam( ); + while ( query.getLength() > 0 ) + { + sal_Int32 nPos = query.indexOfAsciiL( "&", 1 ); + rtl::OUString segment; + if ( nPos > 0 ) + { + segment = query.copy( 0, nPos ); + query = query.copy( nPos + 1 ); + } + else + { + segment = query; + query = rtl::OUString(); + } + + sal_Int32 nEqPos = segment.indexOfAsciiL( "=", 1 ); + string key = OUSTR_TO_STDSTR( segment.copy( 0, nEqPos ) ); + string value = OUSTR_TO_STDSTR( segment.copy( nEqPos +1 ) ); + + if ( key == "repo-id" ) + m_sRepositoryId = value; + else + m_aQuery[key] = value; + } + + } + + map< int, string > URL::getSessionParams( ) + { + map< int, string > params; + params[ATOMPUB_URL] = m_sBindingUrl; + params[REPOSITORY_ID] = m_sRepositoryId; + + return params; + } + + string URL::getObjectId( ) + { + return m_aQuery["id"]; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/ucb/source/ucp/cmis/cmis_url.hxx b/ucb/source/ucp/cmis/cmis_url.hxx new file mode 100644 index 000000000000..1859102fa59e --- /dev/null +++ b/ucb/source/ucp/cmis/cmis_url.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * [ Copyright (C) 2011 SUSE <cbosdonnat@suse.com> (initial developer) ] + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +#ifndef CMIS_URL_HXX +#define CMIS_URL_HXX + +#include <map> +#include <string> + +#include <rtl/ustring.hxx> + +namespace cmis +{ + class URL + { + private: + std::string m_sBindingUrl; + std::string m_sRepositoryId; + + std::map< std::string, std::string > m_aQuery; + + public: + URL( rtl::OUString const & urlStr ); + + std::map< int, std::string > getSessionParams( ); + std::string getObjectId( ); + }; +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/ucb/source/ucp/cmis/makefile.mk b/ucb/source/ucp/cmis/makefile.mk index d30a116e45c0..43b7c438ff30 100644 --- a/ucb/source/ucp/cmis/makefile.mk +++ b/ucb/source/ucp/cmis/makefile.mk @@ -41,7 +41,8 @@ NO_BSYMBOLIC=TRUE DLLPRE = SLOFILES=$(SLO)$/cmis_provider.obj\ - $(SLO)$/cmis_content.obj + $(SLO)$/cmis_content.obj \ + $(SLO)$/cmis_url.obj SHL1TARGET=$(TARGET)$(UCPCMIS_MAJOR).uno SHL1DEF=$(MISC)$/$(SHL1TARGET).def @@ -53,6 +54,7 @@ SHL1STDLIBS=\ $(SALLIB) \ $(SALHELPERLIB) \ $(UCBHELPERLIB) \ + $(TOOLSLIB) \ $(CMISLIB) SHL1VERSIONMAP=$(SOLARENV)/src/component.map diff --git a/ucb/source/ucp/ftp/ftpcfunc.cxx b/ucb/source/ucp/ftp/ftpcfunc.cxx index 8df90ecd087c..16373e277278 100644 --- a/ucb/source/ucp/ftp/ftpcfunc.cxx +++ b/ucb/source/ucp/ftp/ftpcfunc.cxx @@ -37,7 +37,6 @@ #include <string.h> #include "ftpcontentidentifier.hxx" -#include "ftpinpstr.hxx" #include <stdio.h> using namespace ftp; diff --git a/ucb/source/ucp/ftp/ftpcontent.cxx b/ucb/source/ucp/ftp/ftpcontent.cxx index f0edeea018ee..46d663a5de2e 100644 --- a/ucb/source/ucp/ftp/ftpcontent.cxx +++ b/ucb/source/ucp/ftp/ftpcontent.cxx @@ -41,7 +41,6 @@ #include "ftpresultsetI.hxx" #include "ftpcontent.hxx" #include "ftpcontentprovider.hxx" -#include "ftpinpstr.hxx" #include "ftpdirp.hxx" #include "ftpcontentidentifier.hxx" #include "ftpcfunc.hxx" @@ -55,6 +54,7 @@ #include <curl/easy.h> #include <ucbhelper/cancelcommandexecution.hxx> #include <ucbhelper/contentidentifier.hxx> +#include <ucbhelper/fd_inputstream.hxx> #include <ucbhelper/propertyvalueset.hxx> #include <ucbhelper/contentidentifier.hxx> #include <ucbhelper/cancelcommandexecution.hxx> @@ -505,11 +505,11 @@ Any SAL_CALL FTPContent::execute( if(xActiveDataSink.is()) { xActiveDataSink->setInputStream( - new FTPInputStream(m_aFTPURL.open())); + new ucbhelper::FdInputStream(m_aFTPURL.open())); } else if(xOutputStream.is()) { Reference<XInputStream> xStream( - new FTPInputStream(m_aFTPURL.open())); + new ucbhelper::FdInputStream(m_aFTPURL.open())); Sequence<sal_Int8> byte_seq(4096); sal_Int32 n = 1000; // value does not matter here for (;;) { diff --git a/ucb/source/ucp/ftp/ftpinpstr.cxx b/ucb/source/ucp/ftp/ftpinpstr.cxx deleted file mode 100644 index bb7d1a150c23..000000000000 --- a/ucb/source/ucp/ftp/ftpinpstr.cxx +++ /dev/null @@ -1,208 +0,0 @@ -/* -*- 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 - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_ucb.hxx" - -/************************************************************************** - TODO - ************************************************************************** - - *************************************************************************/ -#include "ftpinpstr.hxx" -#include <rtl/alloc.h> -#ifndef STD_ALGORITHM -#include <algorithm> -#define STD_ALGORITHM -#endif -#include <stdio.h> - -using namespace ftp; -using namespace com::sun::star::uno; -using namespace com::sun::star::lang; -using namespace com::sun::star::io; - - -FTPInputStream::FTPInputStream(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); -} - - - -FTPInputStream::~FTPInputStream() -{ - if ( 0 != m_tmpfl) - fclose(m_tmpfl); -} - - -Any SAL_CALL FTPInputStream::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 FTPInputStream::acquire( void ) throw() { - OWeakObject::acquire(); -} - - - -void SAL_CALL FTPInputStream::release( void ) throw() { - OWeakObject::release(); -} - - -sal_Int32 SAL_CALL FTPInputStream::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<size_t>(nBytesToRead); - size_t nRead = fread(aData.getArray(), 1, nWanted, m_tmpfl); - if (nRead != nWanted && ferror(m_tmpfl)) - throw IOException(); - - return static_cast<sal_Int32>(nRead); -} - - -sal_Int32 SAL_CALL FTPInputStream::readSomeBytes( Sequence< sal_Int8 >& aData, - sal_Int32 nMaxBytesToRead ) - throw( NotConnectedException, - BufferSizeExceededException, - IOException, - RuntimeException) -{ - return readBytes(aData,nMaxBytesToRead); -} - - - -void SAL_CALL FTPInputStream::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 FTPInputStream::available(void) - throw(NotConnectedException, - IOException, - RuntimeException) -{ - return sal::static_int_cast<sal_Int32>(m_nLength - getPosition()); -} - - - -void SAL_CALL FTPInputStream::closeInput(void) - throw(NotConnectedException, - IOException, - RuntimeException) -{ - osl::MutexGuard aGuard(m_aMutex); - if(m_tmpfl) - fclose(m_tmpfl),m_tmpfl = 0; -} - - - -void SAL_CALL FTPInputStream::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 -FTPInputStream::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 FTPInputStream::getLength( - void -) throw( - IOException,RuntimeException -) -{ - return m_nLength; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/ucb/source/ucp/ftp/ftpurl.cxx b/ucb/source/ucp/ftp/ftpurl.cxx index c022e584ac4a..93eeb2f05a9e 100644 --- a/ucb/source/ucp/ftp/ftpurl.cxx +++ b/ucb/source/ucp/ftp/ftpurl.cxx @@ -43,7 +43,6 @@ #include "ftpstrcont.hxx" #include "ftpurl.hxx" #include "ftphandleprovider.hxx" -#include "ftpinpstr.hxx" #include "ftpcfunc.hxx" #include "ftpcontainer.hxx" diff --git a/ucb/source/ucp/ftp/makefile.mk b/ucb/source/ucp/ftp/makefile.mk index 8c30a59807d9..944b179c2514 100644 --- a/ucb/source/ucp/ftp/makefile.mk +++ b/ucb/source/ucp/ftp/makefile.mk @@ -54,7 +54,6 @@ SLOFILES1=\ $(SLO)$/ftpresultsetbase.obj \ $(SLO)$/ftpresultsetI.obj \ $(SLO)$/ftploaderthread.obj \ - $(SLO)$/ftpinpstr.obj \ $(SLO)$/ftpdirp.obj \ $(SLO)$/ftpcfunc.obj \ $(SLO)$/ftpurl.obj \ diff --git a/ucb/source/ucp/gio/gio_content.cxx b/ucb/source/ucp/gio/gio_content.cxx index e10a69d34f39..fab393ee9547 100644 --- a/ucb/source/ucp/gio/gio_content.cxx +++ b/ucb/source/ucp/gio/gio_content.cxx @@ -65,7 +65,6 @@ #include <com/sun/star/ucb/UnsupportedDataSinkException.hpp> #include <com/sun/star/ucb/UnsupportedNameClashException.hpp> #include <com/sun/star/ucb/UnsupportedOpenModeException.hpp> -#include <com/sun/star/ucb/UnsupportedOpenModeException.hpp> #include <com/sun/star/ucb/NameClashException.hpp> #include <com/sun/star/ucb/XDynamicResultSet.hpp> #include <com/sun/star/ucb/XContentCreator.hpp> 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/ucb/source/ucp/ftp/ftpinpstr.hxx b/ucbhelper/inc/ucbhelper/fd_inputstream.hxx index 96e8e999a93d..a6551f7b99cb 100644 --- a/ucb/source/ucp/ftp/ftpinpstr.hxx +++ b/ucbhelper/inc/ucbhelper/fd_inputstream.hxx @@ -32,8 +32,8 @@ *************************************************************************/ -#ifndef _FTP_FTPINPSTR_HXX_ -#define _FTP_FTPINPSTR_HXX_ +#ifndef _UCBHELPER_FD_INPUTSTREAM_HXX_ +#define _UCBHELPER_FD_INPUTSTREAM_HXX_ #include <rtl/ustring.hxx> @@ -44,8 +44,11 @@ #include <com/sun/star/io/XSeekable.hpp> #include <stdio.h> +#include "ucbhelper/ucbhelperdllapi.h" -namespace ftp { + +namespace ucbhelper +{ /** Implements a seekable InputStream @@ -56,7 +59,7 @@ namespace ftp { namespace css = com::sun::star; - class FTPInputStream + class UCBHELPER_DLLPUBLIC FdInputStream : public cppu::OWeakObject, public com::sun::star::io::XInputStream, public com::sun::star::io::XSeekable @@ -67,9 +70,9 @@ namespace ftp { * on which the inputstream acts. */ - FTPInputStream(FILE* tmpfl = 0); + FdInputStream(FILE* tmpfl = 0); - ~FTPInputStream(); + ~FdInputStream(); virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type& rType) throw(css::uno::RuntimeException); 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 + * <http://www.openoffice.org/license.html> + * 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 <rtl/alloc.h> +#include <algorithm> +#include <stdio.h> + + +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<size_t>(nBytesToRead); + size_t nRead = fread(aData.getArray(), 1, nWanted, m_tmpfl); + if (nRead != nWanted && ferror(m_tmpfl)) + throw IOException(); + + return static_cast<sal_Int32>(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<sal_Int32>(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: */ |