summaryrefslogtreecommitdiffstats
path: root/ucb/source/ucp/ftp/ftpcontent.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'ucb/source/ucp/ftp/ftpcontent.cxx')
-rw-r--r--ucb/source/ucp/ftp/ftpcontent.cxx853
1 files changed, 0 insertions, 853 deletions
diff --git a/ucb/source/ucp/ftp/ftpcontent.cxx b/ucb/source/ucp/ftp/ftpcontent.cxx
deleted file mode 100644
index 4cca92f3b601..000000000000
--- a/ucb/source/ucp/ftp/ftpcontent.cxx
+++ /dev/null
@@ -1,853 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-
-/**************************************************************************
- TODO
- **************************************************************************
-
- *************************************************************************/
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-
-#include "ftpdynresultset.hxx"
-#include "ftpresultsetfactory.hxx"
-#include "ftpresultsetI.hxx"
-#include "ftpcontent.hxx"
-#include "ftpcontentprovider.hxx"
-#include "ftpdirp.hxx"
-#include "ftpcontentidentifier.hxx"
-#include "ftpintreq.hxx"
-
-#include <memory>
-#include <utility>
-#include <vector>
-#include <string.h>
-#include "curl.hxx"
-#include <comphelper/propertysequence.hxx>
-#include <cppuhelper/queryinterface.hxx>
-#include <cppuhelper/supportsservice.hxx>
-#include <cppuhelper/typeprovider.hxx>
-#include <ucbhelper/cancelcommandexecution.hxx>
-#include <ucbhelper/fd_inputstream.hxx>
-#include <ucbhelper/propertyvalueset.hxx>
-#include <ucbhelper/simpleauthenticationrequest.hxx>
-#include <com/sun/star/lang/IllegalAccessException.hpp>
-#include <com/sun/star/lang/NoSupportException.hpp>
-#include <com/sun/star/ucb/ContentInfoAttribute.hpp>
-#include <com/sun/star/ucb/UnsupportedCommandException.hpp>
-#include <com/sun/star/beans/IllegalTypeException.hpp>
-#include <com/sun/star/beans/UnknownPropertyException.hpp>
-#include <com/sun/star/beans/Property.hpp>
-#include <com/sun/star/ucb/XCommandInfo.hpp>
-#include <com/sun/star/io/BufferSizeExceededException.hpp>
-#include <com/sun/star/io/IOException.hpp>
-#include <com/sun/star/io/NotConnectedException.hpp>
-#include <com/sun/star/io/XActiveDataSink.hpp>
-#include <com/sun/star/io/XOutputStream.hpp>
-#include <com/sun/star/ucb/UnsupportedDataSinkException.hpp>
-#include <com/sun/star/ucb/OpenCommandArgument2.hpp>
-#include <com/sun/star/ucb/UnsupportedOpenModeException.hpp>
-#include <com/sun/star/ucb/IllegalIdentifierException.hpp>
-#include <com/sun/star/ucb/InteractiveNetworkConnectException.hpp>
-#include <com/sun/star/ucb/InteractiveNetworkResolveNameException.hpp>
-#include <com/sun/star/ucb/InteractiveIOException.hpp>
-#include <com/sun/star/ucb/MissingPropertiesException.hpp>
-#include <com/sun/star/ucb/MissingInputStreamException.hpp>
-#include <com/sun/star/ucb/UnsupportedNameClashException.hpp>
-#include <com/sun/star/ucb/OpenMode.hpp>
-#include <com/sun/star/ucb/IOErrorCode.hpp>
-
-using namespace ftp;
-using namespace com::sun::star::task;
-using namespace com::sun::star::container;
-using namespace com::sun::star::lang;
-using namespace com::sun::star::uno;
-using namespace com::sun::star::ucb;
-using namespace com::sun::star::beans;
-using namespace com::sun::star::io;
-using namespace com::sun::star::sdbc;
-
-
-// Content Implementation.
-
-FTPContent::FTPContent( const Reference< XComponentContext >& rxContext,
- FTPContentProvider* pProvider,
- const Reference< XContentIdentifier >& Identifier,
- const FTPURL& aFTPURL)
- : ContentImplHelper(rxContext,pProvider,Identifier)
- , m_pFCP(pProvider)
- , m_aFTPURL(aFTPURL)
- , m_bInserted(false)
- , m_bTitleSet(false)
-{
-}
-
-FTPContent::FTPContent( const Reference< XComponentContext >& rxContext,
- FTPContentProvider* pProvider,
- const Reference< XContentIdentifier >& Identifier,
- ContentInfo Info)
- : ContentImplHelper(rxContext,pProvider,Identifier)
- , m_pFCP(pProvider)
- , m_aFTPURL(Identifier->getContentIdentifier(), pProvider)
- , m_bInserted(true)
- , m_bTitleSet(false)
- , m_aInfo(std::move(Info))
-{
-}
-
-FTPContent::~FTPContent()
-{
-}
-
-// XInterface methods.
-
-void SAL_CALL FTPContent::acquire()
- noexcept
-{
- OWeakObject::acquire();
-}
-
-void SAL_CALL FTPContent::release()
- noexcept
-{
- OWeakObject::release();
-}
-
-css::uno::Any SAL_CALL FTPContent::queryInterface( const css::uno::Type & rType )
-{
- css::uno::Any aRet = cppu::queryInterface( rType,
- static_cast< XTypeProvider* >(this),
- static_cast< XServiceInfo* >(this),
- static_cast< XContent* >(this),
- static_cast< XCommandProcessor* >(this),
- static_cast< XContentCreator* >(this),
- static_cast< XChild* >(this)
- );
- return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
-}
-
-// XTypeProvider methods.
-
-css::uno::Sequence< sal_Int8 > SAL_CALL FTPContent::getImplementationId()
-{
- return css::uno::Sequence<sal_Int8>();
-}
-
-css::uno::Sequence< css::uno::Type > SAL_CALL FTPContent::getTypes()
-{
- static cppu::OTypeCollection s_aCollection(
- cppu::UnoType<XTypeProvider>::get(),
- cppu::UnoType<XServiceInfo>::get(),
- cppu::UnoType<XContent>::get(),
- cppu::UnoType<XCommandProcessor>::get(),
- cppu::UnoType<XContentCreator>::get(),
- cppu::UnoType<XChild>::get()
- );
-
- return s_aCollection.getTypes();
-}
-
-
-// XServiceInfo methods.
-
-OUString SAL_CALL FTPContent::getImplementationName()
-{
- return "com.sun.star.comp.FTPContent";
-}
-
-sal_Bool SAL_CALL FTPContent::supportsService( const OUString& ServiceName )
-{
- return cppu::supportsService( this, ServiceName );
-}
-
-css::uno::Sequence< OUString > SAL_CALL FTPContent::getSupportedServiceNames()
-{
- return { "com.sun.star.ucb.FTPContent" };
-}
-
-
-// XContent methods.
-
-// virtual
-OUString SAL_CALL FTPContent::getContentType()
-{
- return FTP_CONTENT_TYPE;
-}
-
-// XCommandProcessor methods.
-
-//virtual
-void SAL_CALL FTPContent::abort( sal_Int32 /*CommandId*/ )
-{
-}
-
-
-ResultSetFactory::ResultSetFactory(const Reference<XComponentContext >& rxContext,
- const Reference<XContentProvider >& xProvider,
- const Sequence<Property>& seq,
- std::vector<FTPDirentry>&& dirvec)
- : m_xContext(rxContext),
- m_xProvider(xProvider),
- m_seq(seq),
- m_dirvec(std::move(dirvec))
-{
-}
-
-
-rtl::Reference<ResultSetBase> ResultSetFactory::createResultSet()
-{
- return new ResultSetI(m_xContext,
- m_xProvider,
- m_seq,
- m_dirvec);
-}
-
-
-// XCommandProcessor methods.
-
-namespace {
-
-enum ACTION { NOACTION,
- THROWAUTHENTICATIONREQUEST,
- THROWACCESSDENIED,
- THROWINTERACTIVECONNECT,
- THROWMALFORMED,
- THROWRESOLVENAME,
- THROWQUOTE,
- THROWNOFILE,
- THROWGENERAL };
-
-}
-
-// virtual
-Any SAL_CALL FTPContent::execute( const Command& aCommand,
- sal_Int32 /*CommandId*/,
- const Reference<
- XCommandEnvironment >& Environment)
-{
- ACTION action(NOACTION);
- Any aRet;
-
- while(true)
- {
- try
- {
- if(action == THROWAUTHENTICATIONREQUEST)
- {
- // try to get a continuation first
- OUString aPassword,aAccount;
- m_pFCP->forHost(m_aFTPURL.host(),
- m_aFTPURL.port(),
- m_aFTPURL.username(),
- aPassword,
- aAccount);
- rtl::Reference<ucbhelper::SimpleAuthenticationRequest>
- p( new ucbhelper::SimpleAuthenticationRequest(
- m_aFTPURL.ident(false, false),
- m_aFTPURL.host(), // ServerName
- ucbhelper::SimpleAuthenticationRequest::ENTITY_NA,
- OUString(),
- ucbhelper::SimpleAuthenticationRequest
- ::ENTITY_FIXED,
- m_aFTPURL.username(),
- ucbhelper::SimpleAuthenticationRequest
- ::ENTITY_MODIFY,
- aPassword));
-
- Reference<XInteractionHandler> xInteractionHandler;
- if(Environment.is())
- xInteractionHandler =
- Environment->getInteractionHandler();
-
- if( xInteractionHandler.is()) {
- xInteractionHandler->handle(p);
-
- Reference<XInterface> xSelection(
- p->getSelection());
-
- if(Reference<XInteractionRetry>(
- xSelection,UNO_QUERY).is())
- action = NOACTION;
- else if(Reference<XInteractionSupplyAuthentication>(
- xSelection,UNO_QUERY).is()) {
- m_pFCP->setHost(
- m_aFTPURL.host(),
- m_aFTPURL.port(),
- m_aFTPURL.username(),
- p->getAuthenticationSupplier()->getPassword(),
- aAccount);
- action = NOACTION;
- }
- }
- aRet = p->getRequest();
- }
-
-// if(aCommand.Name.equalsAscii(
-// "getPropertyValues") &&
-// action != NOACTION) {
-// // It is not allowed to throw if
-// // command is getPropertyValues
-// rtl::Reference<ucbhelper::PropertyValueSet> xRow =
-// new ucbhelper::PropertyValueSet(m_xSMgr);
-// Sequence<Property> Properties;
-// aCommand.Argument >>= Properties;
-// for(int i = 0; i < Properties.getLength(); ++i)
-// xRow->appendVoid(Properties[i]);
-// aRet <<= Reference<XRow>(xRow.get());
-// return aRet;
-// }
-
- switch (action)
- {
- case NOACTION:
- break;
-
- case THROWAUTHENTICATIONREQUEST:
- ucbhelper::cancelCommandExecution(
- aRet,
- Reference<XCommandEnvironment>(nullptr));
- break;
-
- case THROWACCESSDENIED:
- {
- Sequence<Any> seq(comphelper::InitAnyPropertySequence(
- {
- {"Uri", Any(m_aFTPURL.ident(false,false))}
- }));
- ucbhelper::cancelCommandExecution(
- IOErrorCode_ACCESS_DENIED,
- seq,
- Environment);
- break;
- }
- case THROWINTERACTIVECONNECT:
- {
- InteractiveNetworkConnectException excep;
- excep.Server = m_aFTPURL.host();
- aRet <<= excep;
- ucbhelper::cancelCommandExecution(
- aRet,
- Environment);
- break;
- }
- case THROWMALFORMED:
- {
- IllegalIdentifierException ex;
- aRet <<= ex;
- ucbhelper::cancelCommandExecution(
- aRet,
- Environment);
- break;
- }
- case THROWRESOLVENAME:
- {
- InteractiveNetworkResolveNameException excep;
- excep.Server = m_aFTPURL.host();
- aRet <<= excep;
- ucbhelper::cancelCommandExecution(
- aRet,
- Environment);
- break;
- }
- case THROWNOFILE:
- {
- Sequence<Any> seq(comphelper::InitAnyPropertySequence(
- {
- {"Uri", Any(m_aFTPURL.ident(false,false))}
- }));
- ucbhelper::cancelCommandExecution(
- IOErrorCode_NO_FILE,
- seq,
- Environment);
- break;
- }
- case THROWQUOTE:
- case THROWGENERAL:
- ucbhelper::cancelCommandExecution(
- IOErrorCode_GENERAL,
- Sequence<Any>(0),
- Environment);
- break;
- }
-
- if(aCommand.Name == "getPropertyValues") {
- Sequence<Property> Properties;
- if(!(aCommand.Argument >>= Properties))
- {
- aRet <<= IllegalArgumentException(
- "Wrong argument type!",
- getXWeak(),
- -1);
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
-
- aRet <<= getPropertyValues(Properties);
- }
- else if(aCommand.Name == "setPropertyValues")
- {
- Sequence<PropertyValue> propertyValues;
-
- if( ! ( aCommand.Argument >>= propertyValues ) ) {
- aRet <<= IllegalArgumentException(
- "Wrong argument type!",
- getXWeak(),
- -1);
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
-
- aRet <<= setPropertyValues(propertyValues);
- }
- else if(aCommand.Name == "getCommandInfo") {
- // Note: Implemented by base class.
- aRet <<= getCommandInfo(Environment);
- }
- else if(aCommand.Name == "getPropertySetInfo") {
- // Note: Implemented by base class.
- aRet <<= getPropertySetInfo(Environment);
- }
- else if(aCommand.Name == "insert")
- {
- InsertCommandArgument aInsertArgument;
- if ( ! ( aCommand.Argument >>= aInsertArgument ) ) {
- aRet <<= IllegalArgumentException(
- "Wrong argument type!",
- getXWeak(),
- -1);
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
- insert(aInsertArgument,Environment);
- }
- else if(aCommand.Name == "delete") {
- m_aFTPURL.del();
- deleted();
- }
- else if(aCommand.Name == "open") {
- OpenCommandArgument2 aOpenCommand;
- if ( !( aCommand.Argument >>= aOpenCommand ) ) {
- aRet <<= IllegalArgumentException(
- "Wrong argument type!",
- getXWeak(),
- -1);
-
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
-
- if(aOpenCommand.Mode == OpenMode::DOCUMENT) {
- // Open as a document
- Reference<XActiveDataSink>
- xActiveDataSink(aOpenCommand.Sink,UNO_QUERY);
- Reference< XOutputStream >
- xOutputStream(aOpenCommand.Sink,UNO_QUERY);
-
- if(xActiveDataSink.is()) {
- xActiveDataSink->setInputStream(
- new ucbhelper::FdInputStream(m_aFTPURL.open()));
- }
- else if(xOutputStream.is()) {
- Reference<XInputStream> xStream(
- new ucbhelper::FdInputStream(m_aFTPURL.open()));
- for (;;) {
- Sequence<sal_Int8> byte_seq(4096);
- sal_Int32 n = xStream->readBytes(byte_seq, 4096);
- if (n == 0) {
- break;
- }
- try {
- if(byte_seq.getLength() != n)
- byte_seq.realloc(n);
- xOutputStream->writeBytes(byte_seq);
- } catch(const NotConnectedException&) {
-
- } catch(const BufferSizeExceededException&) {
-
- } catch(const IOException&) {
-
- }
- }
- }
- else {
- aRet <<= UnsupportedDataSinkException(
- OUString(),
- getXWeak(),
- aOpenCommand.Sink);
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
- }
- else if(aOpenCommand.Mode == OpenMode::ALL ||
- aOpenCommand.Mode == OpenMode::DOCUMENTS ||
- aOpenCommand.Mode == OpenMode::FOLDERS ) {
- std::vector<FTPDirentry> resvec =
- m_aFTPURL.list(sal_Int16(aOpenCommand.Mode));
- Reference< XDynamicResultSet > xSet
- = new DynamicResultSet(
- m_xContext,
- aOpenCommand,
- std::make_unique<ResultSetFactory>(m_xContext,
- m_xProvider.get(),
- aOpenCommand.Properties,
- std::move(resvec)));
- aRet <<= xSet;
- }
- else if(aOpenCommand.Mode ==
- OpenMode::DOCUMENT_SHARE_DENY_NONE ||
- aOpenCommand.Mode ==
- OpenMode::DOCUMENT_SHARE_DENY_WRITE) {
- // Unsupported OpenMode
- aRet <<= UnsupportedOpenModeException(
- OUString(),
- getXWeak(),
- static_cast< sal_Int16 >(aOpenCommand.Mode));
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
- else {
- aRet <<= IllegalArgumentException(
- "Unexpected OpenMode!",
- getXWeak(),
- -1);
-
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
- } else if(aCommand.Name == "createNewContent") {
- ContentInfo aArg;
- if (!(aCommand.Argument >>= aArg)) {
- ucbhelper::cancelCommandExecution(
- Any(
- IllegalArgumentException(
- "Wrong argument type!",
- getXWeak(),
- -1)),
- Environment);
- // Unreachable
- }
- aRet <<= createNewContent(aArg);
- } else {
- aRet <<= UnsupportedCommandException(
- aCommand.Name,
- getXWeak());
- ucbhelper::cancelCommandExecution(aRet,Environment);
- }
-
- return aRet;
- }
- catch(const curl_exception& e)
- {
- if(e.code() == CURLE_COULDNT_CONNECT)
- action = THROWINTERACTIVECONNECT;
- else if (e.code() == CURLE_URL_MALFORMAT)
- {
- action = THROWMALFORMED;
- }
- else if(e.code() == CURLE_COULDNT_RESOLVE_HOST )
- action = THROWRESOLVENAME;
- else if(e.code() == CURLE_FTP_USER_PASSWORD_INCORRECT ||
- e.code() == CURLE_LOGIN_DENIED ||
- e.code() == CURLE_BAD_PASSWORD_ENTERED ||
- e.code() == CURLE_FTP_WEIRD_PASS_REPLY)
- action = THROWAUTHENTICATIONREQUEST;
- else if(e.code() == CURLE_FTP_ACCESS_DENIED)
- action = THROWACCESSDENIED;
- else if(e.code() == CURLE_FTP_QUOTE_ERROR)
- action = THROWQUOTE;
- else if(e.code() == CURLE_FTP_COULDNT_RETR_FILE)
- action = THROWNOFILE;
- else
- // nothing known about the cause of the error
- action = THROWGENERAL;
- }
- }
-}
-
-constexpr OUString FTP_FILE = u"application/vnd.sun.staroffice.ftp-file"_ustr;
-
-constexpr OUString FTP_FOLDER = u"application/vnd.sun.staroffice.ftp-folder"_ustr;
-
-Sequence<ContentInfo > SAL_CALL
-FTPContent::queryCreatableContentsInfo( )
-{
- return queryCreatableContentsInfo_Static();
-}
-
-// static
-Sequence<ContentInfo >
-FTPContent::queryCreatableContentsInfo_Static( )
-{
- Sequence< Property > props{ Property(
- "Title",
- -1,
- cppu::UnoType<OUString>::get(),
- PropertyAttribute::MAYBEVOID
- | PropertyAttribute::BOUND ) };
- return
- {
- { FTP_FILE, ContentInfoAttribute::INSERT_WITH_INPUTSTREAM | ContentInfoAttribute::KIND_DOCUMENT, props },
- { FTP_FOLDER, ContentInfoAttribute::KIND_FOLDER, props }
- };
-}
-
-Reference<XContent > SAL_CALL
-FTPContent::createNewContent( const ContentInfo& Info )
-{
- if( Info.Type =="application/vnd.sun.staroffice.ftp-file" || Info.Type == "application/vnd.sun.staroffice.ftp-folder" )
- return new FTPContent(m_xContext,
- m_pFCP,
- m_xIdentifier,Info);
- else
- return Reference<XContent>(nullptr);
-}
-
-
-Reference<XInterface > SAL_CALL
-FTPContent::getParent( )
-{
- Reference<XContentIdentifier>
- xIdent(new FTPContentIdentifier(m_aFTPURL.parent()));
- return Reference<XInterface>( m_xProvider->queryContent(xIdent), UNO_QUERY );
-}
-
-
-void SAL_CALL
-FTPContent::setParent(const Reference<XInterface >& /*Parent*/ )
-{
- throw NoSupportException();
-}
-
-
-OUString FTPContent::getParentURL()
-{
- return m_aFTPURL.parent();
-}
-
-namespace {
-
-class InsertData
- : public CurlInput {
-
-public:
-
- explicit InsertData(const Reference<XInputStream>& xInputStream)
- : m_xInputStream(xInputStream) { }
- virtual ~InsertData() {}
-
- // returns the number of bytes actually read
- virtual sal_Int32 read(sal_Int8 *dest,sal_Int32 nBytesRequested) override;
-
-private:
-
- Reference<XInputStream> m_xInputStream;
-};
-
-}
-
-sal_Int32 InsertData::read(sal_Int8 *dest,sal_Int32 nBytesRequested)
-{
- sal_Int32 m = 0;
-
- if(m_xInputStream.is()) {
- Sequence<sal_Int8> seq(nBytesRequested);
- m = m_xInputStream->readBytes(seq,nBytesRequested);
- memcpy(dest,seq.getConstArray(),m);
- }
- return m;
-}
-
-
-void FTPContent::insert(const InsertCommandArgument& aInsertCommand,
- const Reference<XCommandEnvironment>& Env)
-{
- osl::MutexGuard aGuard(m_aMutex);
-
- if(m_bInserted && !m_bTitleSet) {
- MissingPropertiesException excep;
- excep.Properties = { "Title" };
- ucbhelper::cancelCommandExecution(Any(excep), Env);
- }
-
- if(m_bInserted &&
- m_aInfo.Type == FTP_FILE &&
- !aInsertCommand.Data.is())
- {
- MissingInputStreamException excep;
- ucbhelper::cancelCommandExecution(Any(excep), Env);
- }
-
- bool bReplace(aInsertCommand.ReplaceExisting);
-
- retry:
- try {
- if(m_aInfo.Type == FTP_FILE) {
- InsertData data(aInsertCommand.Data);
- m_aFTPURL.insert(bReplace,&data);
- } else if(m_aInfo.Type == FTP_FOLDER)
- m_aFTPURL.mkdir(bReplace);
- } catch(const curl_exception& e) {
- if(e.code() == FOLDER_MIGHT_EXIST_DURING_INSERT ||
- e.code() == FILE_MIGHT_EXIST_DURING_INSERT) {
- // Interact
- Reference<XInteractionHandler> xInt;
- if(Env.is())
- xInt = Env->getInteractionHandler();
-
- UnsupportedNameClashException excep;
- excep.NameClash = 0; //NameClash::ERROR;
-
- if(!xInt.is()) {
- ucbhelper::cancelCommandExecution(Any(excep), Env);
- }
-
- XInteractionRequestImpl request;
- const Reference<XInteractionRequest>& xReq(request.getRequest());
- xInt->handle(xReq);
- if (request.approved()) {
- bReplace = true;
- goto retry;
- }
- else
- throw excep;
- }
- else
- throw;
- }
-
- // May not be reached, because both mkdir and insert can throw curl-
- // exceptions
- m_bInserted = false;
- inserted();
-}
-
-
-Reference< XRow > FTPContent::getPropertyValues(
- const Sequence< Property >& seqProp
-)
-{
- rtl::Reference<ucbhelper::PropertyValueSet> xRow =
- new ucbhelper::PropertyValueSet(m_xContext);
-
- FTPDirentry aDirEntry = m_aFTPURL.direntry();
-
- for(const auto& rProp : seqProp) {
- const OUString& Name = rProp.Name;
- if(Name == "Title")
- xRow->appendString(rProp,aDirEntry.m_aName);
- else if(Name == "CreatableContentsInfo")
- xRow->appendObject(rProp,
- Any(queryCreatableContentsInfo()));
- else if(aDirEntry.m_nMode != INETCOREFTP_FILEMODE_UNKNOWN) {
- if(Name == "ContentType")
- xRow->appendString(rProp,
- (aDirEntry.m_nMode & INETCOREFTP_FILEMODE_ISDIR)
- ? FTP_FOLDER
- : FTP_FILE );
- else if(Name == "IsReadOnly")
- xRow->appendBoolean(rProp,
- (aDirEntry.m_nMode
- & INETCOREFTP_FILEMODE_WRITE) == 0 );
- else if(Name == "IsDocument")
- xRow->appendBoolean(rProp,
- (aDirEntry.m_nMode &
- INETCOREFTP_FILEMODE_ISDIR) != INETCOREFTP_FILEMODE_ISDIR);
- else if(Name == "IsFolder")
- xRow->appendBoolean(rProp,
- (aDirEntry.m_nMode &
- INETCOREFTP_FILEMODE_ISDIR) == INETCOREFTP_FILEMODE_ISDIR);
- else if(Name == "Size")
- xRow->appendLong(rProp,
- aDirEntry.m_nSize);
- else if(Name == "DateCreated")
- xRow->appendTimestamp(rProp,
- aDirEntry.m_aDate);
- else
- xRow->appendVoid(rProp);
- } else
- xRow->appendVoid(rProp);
- }
-
- return xRow;
-}
-
-
-Sequence<Any> FTPContent::setPropertyValues(
- const Sequence<PropertyValue>& seqPropVal)
-{
- Sequence<Any> ret(seqPropVal.getLength());
- auto retRange = asNonConstRange(ret);
- Sequence<PropertyChangeEvent > evt;
-
- osl::MutexGuard aGuard(m_aMutex);
- for(sal_Int32 i = 0; i < ret.getLength(); ++i) {
- if ( seqPropVal[i].Name == "Title" ) {
- OUString Title;
- if(!(seqPropVal[i].Value >>= Title)) {
- retRange[i] <<= IllegalTypeException();
- continue;
- } else if(Title.isEmpty()) {
- retRange[i] <<= IllegalArgumentException();
- continue;
- }
-
- if(m_bInserted) {
- m_aFTPURL.child(Title);
- m_xIdentifier =
- new FTPContentIdentifier(m_aFTPURL.ident(false,false));
- m_bTitleSet = true;
- } else
- try {
- OUString OldTitle = m_aFTPURL.ren(Title);
- evt = { { /* Source */ {},
- /* PropertyName */ "Title",
- /* Further */ false,
- /* PropertyHandle */ -1,
- /* OldValue */ Any(OldTitle),
- /* NewValue */ Any(Title) } };
- } catch(const curl_exception&) {
- InteractiveIOException excep;
- // any better possibility here?
- // ( the error code is always CURLE_FTP_QUOTE_ERROR )
- excep.Code = IOErrorCode_ACCESS_DENIED;
- retRange[i] <<= excep;
- }
- } else {
- const Sequence<Property> props =
- getProperties(Reference<XCommandEnvironment>(nullptr));
-
- // either unknown or read-only
- retRange[i] <<= UnknownPropertyException();
- const auto& rName = seqPropVal[i].Name;
- auto pProp = std::find_if(props.begin(), props.end(),
- [&rName](const Property& rProp) { return rProp.Name == rName; });
- if (pProp != props.end()) {
- retRange[i] <<= IllegalAccessException(
- "Property is read-only!",
- //props[j].Attributes & PropertyAttribute::READONLY
- // ? "Property is read-only!"
- // : "Access denied!"),
- getXWeak());
- }
- }
- }
-
- if(evt.hasElements()) {
- // title has changed
- notifyPropertiesChange(evt);
- (void)exchange(new FTPContentIdentifier(m_aFTPURL.ident(false,false)));
- }
-
- return ret;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */