//------------------------------------------------------------------------------
// Copyright (c) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
// Author: Paul-Niklas Kramp
//------------------------------------------------------------------------------
// XRootD is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// XRootD 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 General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with XRootD. If not, see .
//------------------------------------------------------------------------------
#ifndef __XRD_CL_LOCAL_FILE_HANDLER_HH__
#define __XRD_CL_LOCAL_FILE_HANDLER_HH__
#include "XrdCl/XrdClJobManager.hh"
#include "XrdCl/XrdClLocalFileTask.hh"
#include "XrdCl/XrdClDefaultEnv.hh"
#include "XrdCl/XrdClLog.hh"
#include
namespace XrdCl
{
class Message;
struct MessageSendParams;
class LocalFileHandler
{
public:
LocalFileHandler();
~LocalFileHandler();
//------------------------------------------------------------------------
//! Open the file pointed to by the given URL
//!
//! @param url url of the file to be opened
//! @param flags OpenFlags::Flags
//! @param mode Access::Mode for new files, 0 otherwise
//! @param handler handler to be notified about the status of the operation
//! @param timeout timeout value, if 0 the environment default will be
//! used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Open( const std::string &url, uint16_t flags, uint16_t mode,
ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Handle local redirect to given URL triggered by the given request
//------------------------------------------------------------------------
XRootDStatus Open( const URL *url, const Message *req, AnyObject *&resp );
//------------------------------------------------------------------------
//! Close the file object
//!
//! @param handler handler to be notified about the status of the operation
//! @param timeout timeout value, if 0 the environment default will be
//! used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Close( ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Obtain status information for this file - async
//!
//! @param handler handler to be notified when the response arrives,
//! the response parameter will hold a StatInfo object
//! if the procedure is successful
//! @param timeout timeout value, if 0 the environment default will
//! be used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Stat( ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Read a data chunk at a given offset - sync
//!
//! @param offset offset from the beginning of the file
//! @param size number of bytes to be read
//! @param buffer a pointer to a buffer big enough to hold the data
//! or 0 if the buffer should be allocated by the system
//! @param handler handler to be notified when the response arrives,
//! the response parameter will hold a buffer object if
//! the procedure was successful, if a preallocated
//! buffer was specified then the buffer object will
//! "wrap" this buffer
//! @param timeout timeout value, if 0 the environment default will be
//! used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Read( uint64_t offset, uint32_t size, void *buffer,
ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Write a data chunk at a given offset - async
//!
//! @param offset offset from the beginning of the file
//! @param size number of bytes to be written
//! @param buffer a pointer to the buffer holding the data to be written
//! @param handler handler to be notified when the response arrives
//! @param timeout timeout value, if 0 the environment default will be
//! used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Write( uint64_t offset, uint32_t size, const void *buffer,
ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Commit all pending disk writes - async
//!
//! @param handler handler to be notified when the response arrives
//! @param timeout timeout value, if 0 the environment default will be
//! used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Sync( ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Truncate the file to a particular size - async
//!
//! @param size desired size of the file
//! @param handler handler to be notified when the response arrives
//! @param timeout timeout value, if 0 the environment default will be
//! used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Truncate( uint64_t size, ResponseHandler *handler,
uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Read scattered data chunks in one operation - async
//!
//! @param chunks list of the chunks to be read
//! @param buffer a pointer to a buffer big enough to hold the data
//! @param handler handler to be notified when the response arrives
//! @param timeout timeout value, if 0 then the environment default
//! will be used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus VectorRead( const ChunkList &chunks, void *buffer,
ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Write scattered data chunks in one operation - async
//!
//! @param chunks list of the chunks to be read
//! @param handler handler to be notified when the response arrives
//! @param timeout timeout value, if 0 then the environment default
//! will be used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus VectorWrite( const ChunkList &chunks,
ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Write scattered buffers in one operation - async
//!
//! @param offset offset from the beginning of the file
//! @param iov list of the buffers to be written
//! @param iovcnt number of buffers
//! @param handler handler to be notified when the response arrives
//! @param timeout timeout value, if 0 then the environment default
//! will be used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus WriteV( uint64_t offset,
ChunkList *chunks,
ResponseHandler *handler,
uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Queues a task to the jobmanager
//!
//! @param st the status of the file operation
//! @param obj the object holding data like open-, chunk- or vreadinfo
//! @param handler handler to be notified when the response arrives
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus QueueTask( XRootDStatus *st, AnyObject *obj,
ResponseHandler *handler );
//------------------------------------------------------------------------
//! Performs a custom operation on an open file - async
//!
//! @param arg query argument
//! @param handler handler to be notified when the response arrives,
//! the response parameter will hold a Buffer object
//! if the procedure is successful
//! @param timeout timeout value, if 0 the environment default will
//! be used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Fcntl( const Buffer &arg, ResponseHandler *handler,
uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! Get access token to a file - async
//!
//! @param handler handler to be notified when the response arrives,
//! the response parameter will hold a Buffer object
//! if the procedure is successful
//! @param timeout timeout value, if 0 the environment default will
//! be used
//! @return status of the operation
//------------------------------------------------------------------------
XRootDStatus Visa( ResponseHandler *handler, uint16_t timeout = 0 );
//------------------------------------------------------------------------
//! creates the directories specified in file_path
//!
//! @param file_path specifies which directories are to be created
//! @param mode same access modes as for the desired file operation
//! @return status of the mkdir system call
//------------------------------------------------------------------------
static XRootDStatus MkdirPath( const std::string &path );
void SetHostList( const HostList &hostList )
{
pHostList = hostList;
}
const HostList& GetHostList()
{
return pHostList;
}
//------------------------------------------------------------------------
//! Translate an XRootD request into LocalFileHandler call
//------------------------------------------------------------------------
XRootDStatus ExecRequest( const URL &url,
Message *msg,
ResponseHandler *handler,
MessageSendParams &sendParams );
private:
XRootDStatus OpenImpl( const std::string &url, uint16_t flags,
uint16_t mode, AnyObject *&resp );
//---------------------------------------------------------------------
// Receives LocalFileTasks to handle them async
//---------------------------------------------------------------------
JobManager *jmngr;
//---------------------------------------------------------------------
// Internal filedescriptor, which is used by all operations after open
//---------------------------------------------------------------------
int fd;
//---------------------------------------------------------------------
// The file URL
//---------------------------------------------------------------------
std::string pUrl;
//---------------------------------------------------------------------
// The host list returned in the user callback
//---------------------------------------------------------------------
HostList pHostList;
};
}
#endif