#ifndef __XRDOUCNAME2NAME_H__
#define __XRDOUCNAME2NAME_H__
/******************************************************************************/
/* */
/* X r d O u c n a m e 2 n a m e . h h */
/* */
/* (c) 2006 by the Board of Trustees of the Leland Stanford, Jr., University */
/* All Rights Reserved */
/* Produced by Andrew Hanushevsky for Stanford University under contract */
/* DE-AC02-76-SFO0515 with the Department of Energy */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* 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 Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
#include
#include
/******************************************************************************/
/* X r d O u c N a m e 2 N a m e */
/******************************************************************************/
//! Class XrdoucName2Name must be used for creating a name translation plug-in.
//! This plug-in is specified by the 'oss.namelib' directive and when present
//! makes the default oss plug-in load the plug-in shared library, locate the
//! XrdOucgetName2Name function within and use it to obtain an instance of the
//! XrdOucName2Name object to perform name translation prior to all subsequent
//! storage system calls. The companion object, XrdOucName2NameVec, should
//! also be defined in the same shared library (see the class definition below).
class XrdOucName2Name
{
public:
//------------------------------------------------------------------------------
//! Map a logical file name to a physical file name.
//!
//! @param lfn -> Logical file name.
//! @param buff -> Buffer where the physical file name of an existing file is
//! to be placed. It must end with a null byte.
//! @param blen The length of the buffer.
//!
//! @return Success: Zero.
//! Failure: An errno number describing the failure; typically
//! EINVAL - The supplied lfn is invalid.
//! ENAMETOOLONG - The buffer is too small for the pfn.
//------------------------------------------------------------------------------
virtual int lfn2pfn(const char *lfn, char *buff, int blen) = 0;
//------------------------------------------------------------------------------
//! Map a logical file name to the name the file would have in a remote storage
//! system (e.g. Mass Storage System at a remote location).
//!
//! @param lfn -> Logical file name.
//! @param buff -> Buffer where the remote file name is to be placed. It need
//! not actually exist in that location but could be created
//! there with that name. It must end with a null byte.
//! @param blen The length of the buffer.
//!
//! @return Success: Zero.
//! Failure: An errno number describing the failure; typically
//! EINVAL - The supplied lfn is invalid.
//! ENAMETOOLONG - The buffer is too small for the pfn.
//------------------------------------------------------------------------------
virtual int lfn2rfn(const char *lfn, char *buff, int blen) = 0;
//------------------------------------------------------------------------------
//! Map a physical file name to it's logical file name.
//!
//! @param pfn -> Physical file name. This is always a valid name of either
//! an existing file or a file that could been created.
//! @param buff -> Buffer where the logical file name is to be placed. It need
//! not actually exist but could be created with that name.
//! It must end with a null byte.
//! @param blen The length of the buffer.
//!
//! @return Success: Zero.
//! Failure: An errno number describing the failure; typically
//! EINVAL - The supplied lfn is invalid.
//! ENAMETOOLONG - The buffer is too small for the pfn.
//------------------------------------------------------------------------------
virtual int pfn2lfn(const char *pfn, char *buff, int blen) = 0;
//------------------------------------------------------------------------------
//! Constructor
//------------------------------------------------------------------------------
XrdOucName2Name() {}
//------------------------------------------------------------------------------
//! Destructor
//------------------------------------------------------------------------------
virtual ~XrdOucName2Name() {}
};
/******************************************************************************/
/* X r d O u c N a m e 2 N a m e V e c */
/******************************************************************************/
//! Class XrdOucName2NameVec must be used to define a companion name translation
//! mechanism. It is optional but highly recommended and may in fact be required
//! by certain statlib plug-ins specific by the 'oss.statlib' directive. Refer
//! to plug-in documentation to see if it requires this form of name2name
//! translator. This translator should return all possible translations of a
//! given logical file name. After an instance of the XrdOucName2Name
//! translator is obtained (which implies it's full initilization) the default
//! oss plug-in check if the symbol 'Name2NameVec' is present in the shared
//! library. If it does, it obtains the contents of the symbol which should be
//! a pointer to an object derived from the following class. That object is
//! used to obtain a list of possible name translations. Initialization is
//! is simplified if your implementation inherits XrdOucName2Name as well as
//! XrdOucName2Namevec. The symbol that contains the pointer must be defined
//! at file level as follows:
//! XrdOucName2NameVec *Name2NameVec;
//! It should be set during XrdOucName2Name initialization to point to an
//! instance of the object. The methods defined for this class must be
//! thread-safe. The default XrdOucName2Name translator also includes the
//! XrdOucName2NameVec translator.
class XrdOucName2NameVec
{
public:
//------------------------------------------------------------------------------
//! Map a logical file name to all of its possible physical file names.
//!
//! @param lfn -> Logical file name.
//!
//! @return Success: Pointer to a vector of strings of physical file names.
//! Failure: A nil pointer indicating that no translation exists.
//------------------------------------------------------------------------------
virtual std::vector *n2nVec(const char *lfn)=0;
//------------------------------------------------------------------------------
//! Release all storage occupied by the vector returned by n2nVec().
//!
//! @param nvP -> Vector returned by n2nVec().
//------------------------------------------------------------------------------
virtual void Recycle(std::vector *nvP)
{if (nvP)
{for (unsigned int i = 0; i < nvP->size(); i++)
{delete (*nvP)[i];}
delete nvP;
}
}
//------------------------------------------------------------------------------
//! Constructor and Destructor
//------------------------------------------------------------------------------
XrdOucName2NameVec() {}
virtual ~XrdOucName2NameVec() {}
};
/******************************************************************************/
/* X r d O u c g e t N a m e 2 N a m e */
/******************************************************************************/
//------------------------------------------------------------------------------
//! Obtain an instance of the XrdOucName2Name object.
//!
//! This extern "C" function is called when a shared library plug-in containing
//! implementation of this class is loaded. It must exist in the shared library
//! and must be thread-safe.
//!
//! @param eDest -> The error object that must be used to print any errors or
//! other messages (see XrdSysError.hh).
//! @param confg -> Name of the configuration file that was used. This pointer
//! may be null though that would be impossible.
//! @param parms -> Argument string specified on the namelib directive. It may
//! be null or point to a null string if no parms exist.
//! @param lroot -> The path specified by the localroot directive. It is a
//! null pointer if the directive was not specified.
//! @param rroot -> The path specified by the remoteroot directive. It is a
//! null pointer if the directive was not specified.
//!
//! @return Success: A pointer to an instance of the XrdOucName2Name object.
//! Failure: A null pointer which causes initialization to fail.
//!
//! The Name2Name object is used frequently in the course of opening files
//! as well as other meta-file operations (e.g., stat(), rename(), etc.).
//! The algorithms used by this object *must* be efficient and speedy;
//! otherwise system performance will be severely degraded.
//------------------------------------------------------------------------------
class XrdSysError;
#define XrdOucgetName2NameArgs XrdSysError *eDest, \
const char *confg, \
const char *parms, \
const char *lroot, \
const char *rroot
extern "C" XrdOucName2Name *XrdOucgetName2Name(XrdOucgetName2NameArgs);
//------------------------------------------------------------------------------
//! Declare compilation version.
//!
//! Additionally, you *should* declare the xrootd version you used to compile
//! your plug-in. While not currently required, it is highly recommended to
//! avoid execution issues should the class definition change. Declare it as:
//------------------------------------------------------------------------------
/*! #include "XrdVersion.hh"
XrdVERSIONINFO(XrdOucgetName2Name,);
where is a 1- to 15-character unquoted name identifying your plugin.
*/
#endif