#ifndef __XRDCKSCALC_HH__
#define __XRDCKSCALC_HH__
/******************************************************************************/
/* */
/* X r d C k s C a l c . h h */
/* */
/* (c) 2011 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. */
/******************************************************************************/
/*! This class defines the interface to a checksum computation. When this class
is used to define a plugin computation, the initial XrdCksCalc computation
object is created by the XrdCksCalcInit() function defined at the end of
this file.
*/
class XrdCksCalc
{
public:
//------------------------------------------------------------------------------
//! Calculate a one-time checksum. The obvious default implementation is
//! provided and assumes that Init() may be called more than once.
//!
//! @param Buff -> Data to be checksummed.
//! @param BLen -> Length of the data in Buff.
//!
//! @return the checksum value in binary format. The pointer to the value
//! becomes invalid once the associated object is deleted.
//------------------------------------------------------------------------------
virtual char *Calc(const char *Buff, int BLen)
{Init(); Update(Buff, BLen); return Final();}
//------------------------------------------------------------------------------
//! Get the current binary checksum value (defaults to final). However, the
//! final checksum result is not affected.
//!
//! @return the checksum value in binary format. The pointer to the value
//! becomes invalid once the associated object is deleted.
//------------------------------------------------------------------------------
virtual char *Current() {return Final();}
//------------------------------------------------------------------------------
//! Get the actual checksum in binary format.
//!
//! @return the checksum value in binary format. The pointer to the value
//! becomes invalid once the associated object is deleted.
//------------------------------------------------------------------------------
virtual char *Final() = 0;
//------------------------------------------------------------------------------
//! Initializes data structures (must be called by constructor). This is always
//! called to reuse the object for a new checksum.
//------------------------------------------------------------------------------
virtual void Init() = 0;
//------------------------------------------------------------------------------
//! Get a new instance of the underlying checksum calculation object.
//!
//! @return the checksum calculation object.
//------------------------------------------------------------------------------
virtual
XrdCksCalc *New() = 0;
//------------------------------------------------------------------------------
//! Recycle the checksum object as it is no longer needed. A default is given.
//------------------------------------------------------------------------------
virtual void Recycle() {delete this;}
//------------------------------------------------------------------------------
//! Get the checksum object algorithm name and the number bytes (i.e. size)
//! required for the checksum value.
//!
//! @param csSize -> Parameter to hold the size of the checksum value.
//!
//! @return the checksum algorithm's name. The name persists event after the
//! checksum object is deleted.
//------------------------------------------------------------------------------
virtual const char *Type(int &csSize) = 0;
//------------------------------------------------------------------------------
//! Compute a running checksum. This method may be called repeatedly for data
//! segments; with Final() returning the full checksum.
//!
//! @param Buff -> Data to be checksummed.
//! @param BLen -> Length of the data in Buff.
//------------------------------------------------------------------------------
virtual void Update(const char *Buff, int BLen) = 0;
//------------------------------------------------------------------------------
//! Constructor
//------------------------------------------------------------------------------
XrdCksCalc() {}
//------------------------------------------------------------------------------
//! Destructor
//------------------------------------------------------------------------------
virtual ~XrdCksCalc() {}
};
/******************************************************************************/
/* C h e c k s u m O b j e c t C r e a t o r */
/******************************************************************************/
//------------------------------------------------------------------------------
//! Obtain an instance of the checksum calculation object.
//!
//! XrdCksCalcInit() is an extern "C" function that is called to obtain an
//! initial instance of a checksum calculation object. You may create custom
//! checksum calculation and use them as plug-ins to the checksum manager
//! (see XrdCks.hh). The function must be defined in the plug-in shared library.
//! All the following extern symbols must be defined at file level!
//!
//! @param eDest -> The XrdSysError object for messages.
//! @param csName -> The name of the checksum algorithm.
//! @param cFN -> The name of the configuration file
//! @param Parms -> Parameters specified on the ckslib directive. If none it is
//! zero.
//------------------------------------------------------------------------------
/*! extern "C" XrdCksCalc *XrdCksCalcInit(XrdSysError *eDest,
const char *csName,
const char *cFN,
const char *Parms);
*/
//------------------------------------------------------------------------------
//! Declare the compilation version number.
//!
//! 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(XrdCksCalcInit,);
where is a 1- to 15-character unquoted name identifying your plugin.
*/
#endif