Files
epics-base/modules/libcom/src/misc/ipAddrToAsciiAsynchronous.h
2022-07-04 20:28:43 -05:00

171 lines
5.2 KiB
C++

/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* SPDX-License-Identifier: EPICS
* EPICS Base is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/**
* \file ipAddrToAsciiAsynchronous.h
* \brief Convert ip addresses to ASCII asynchronously
*
* ipAddrToAsciiEngine is the first class needed to convert an ipAddr to an
* ASCII address. From the engine, you can use createTransaction() to create a
* transaction object. The transaction object lets you attach callbacks and
* convert an address to ASCII.
*
* Example
* -------------
*
* \code{.cpp}
* class ConvertIPAddr: ipAddrToAsciiCallBack
* {
* ipAddrToAsciiTransaction & trans;
*
* public:
* epicsEvent complete;
*
* ConvertIPAddr(ipAddrToAsciiEngine & engine, osiSockAddr & addr):
* trans(engine.createTransaction())
* {
* trans.ipAddrToAscii(addr, *this);
* }
*
* virtual void transactionComplete (char const * node) override
* {
* printf("Address is %s\n", node);
* complete.signal();
* }
*
* virtual void show(unsigned level) override const
* {
* printf("This is a ConvertIPAddr class object.");
* }
*
* virtual ~ConvertIPAddr()
* {
* trans.release();
* }
* };
*
* ipAddrToAsciiEngine & engine(ipAddrToAsciiEngine::allocate());
*
* osiSockAddr addr;
* addr.ia.sin_family = AF_INET;
* addr.ia.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
* addr.ia.sin_port = htons(8080);
*
* ConvertIPAddr result(engine, addr);
*
* // Do other work here before waiting on the result
*
* result.complete.wait(2.0);
* engine.release();
* \endcode
*/
/*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#ifndef ipAddrToAsciiAsynchronous_h
#define ipAddrToAsciiAsynchronous_h
#include "osiSock.h"
#include "libComAPI.h"
/** \brief Users implement this virtual class to use ipAddrToAsciiTransaction
*
* In order to use ipAddrToAsciiTranaction, users should implement this virtual
* class to handle events that occur asynchronously while converting the IP
* address.
*
*/
class LIBCOM_API ipAddrToAsciiCallBack {
public:
/// Called once the ip address is converted to ASCII
/*
* \param pHostName The converted ASCII name */
virtual void transactionComplete ( const char * pHostName ) = 0;
/// Called by the show() method of ipAddrToAsciiTransaction or
/// ipAddrToAsciiEngine when passed a level >= 1.
virtual void show ( unsigned level ) const;
virtual ~ipAddrToAsciiCallBack () = 0;
};
/// Class which convert an ipAddr to ascii and call a user-supplied callback
/// when finished.
class LIBCOM_API ipAddrToAsciiTransaction {
public:
/// Destroy this transaction object and remove from the parent engine object
virtual void release () = 0;
/** \brief Convert an IP address to ascii, asynchronously
*
* \note The ipAddrToAsciiCallBack referenced must remain valid until release() is called on this transaction.
* \param addrIn Reference to the address to convert
* \param cbIn Reference to the user supplied callbacks to call when the result is available
*/
virtual void ipAddrToAscii ( const osiSockAddr & addrIn, ipAddrToAsciiCallBack & cbIn ) = 0;
/** \brief Get the conversion address currently set
* \return Get the last (or current) address converted to ascii
*/
virtual osiSockAddr address () const = 0;
/**
* \brief Prints the converted IP address
*
* Prints to stdout
*
* \param level 0 prints basic info, greater than 0 prints information from the callback's show() method too
*/
virtual void show ( unsigned level ) const = 0;
protected:
virtual ~ipAddrToAsciiTransaction () = 0;
};
/// Class which manages creating transactions for converting ipAddr's to ASCII
class LIBCOM_API ipAddrToAsciiEngine {
public:
/// Cancel any pending transactions and destroy this ipAddrToAsciiEngine object.
virtual void release () = 0;
/**
* \brief Create a new transaction object used to do IP address conversions
* \note Caller must release() the returned transaction
* \return The newly created transaction object
*/
virtual ipAddrToAsciiTransaction & createTransaction () = 0;
/**
* \brief Print information about this engine object and how many requests its processing
*
* Prints to stdout
*
* \param level 0 for basic information, 1 for extra info
*/
virtual void show ( unsigned level ) const = 0;
/**
* \brief Creates a new ipAddrToAsciiEngine to convert IP addresses
* \note Caller must release() this engine.
* \return Newly created engine object
*/
static ipAddrToAsciiEngine & allocate ();
protected:
virtual ~ipAddrToAsciiEngine () = 0;
public:
#ifdef EPICS_PRIVATE_API
static void cleanup();
#endif
};
#endif // ifdef ipAddrToAsciiAsynchronous_h