zeek/src/threading/Formatter.h
2021-09-16 15:35:39 -07:00

168 lines
4.3 KiB
C++

// See the file "COPYING" in the main distribution directory for copyright.
#pragma once
#include <string>
#include "zeek/Type.h"
#include "zeek/threading/SerialTypes.h"
namespace zeek::threading
{
class MsgThread;
/**
* A thread-safe class for converting values into some textual format. This
* is a base class that implements the interface for common
* rendering/parsing code needed by a number of input/output threads.
*/
class Formatter
{
public:
/**
* Constructor.
*
* @param t The thread that uses this class instance. The class uses
* some of the thread's methods, e.g., for error reporting and
* internal formatting.
*
*/
explicit Formatter(MsgThread* t);
/**
* Destructor.
*/
virtual ~Formatter();
/**
* Convert a list of threading values into an implementation specific
* textual representation.
*
* @param desc The ODesc object to write to.
*
* @param num_fields The number of fields in the logging record.
*
* @param fields Information about the fields for each of the given
* log values.
*
* @param vals The field values.
*
* @return Returns true on success, false on error. Errors must also
* be flagged via the thread.
*/
virtual bool Describe(ODesc* desc, int num_fields, const Field* const* fields,
Value** vals) const = 0;
/**
* Convert a single threading value into an implementation-specific
* representation.
*
* @param desc The ODesc object to write to.
*
* @param val the Value to render to the ODesc object.
*
* @param The name of a field associated with the value.
*
* @return Returns true on success, false on error. Errors are also
* flagged via the thread.
*/
virtual bool Describe(ODesc* desc, Value* val, const std::string& name = "") const = 0;
/**
* Convert an implementation-specific textual representation of a
* field into a value.
*
* @param s The string to parse.
*
* @param The name of a field associated with the value. Used only
* for error reporting.
*
* @return The new value, or null on error. Errors must also be
* flagged via the thread.
*/
virtual Value* ParseValue(const std::string& s, const std::string& name, TypeTag type,
TypeTag subtype = TYPE_ERROR) const = 0;
/**
* Convert an IP address into a string.
*
* This is a helper function that formatter implementations may use.
*
* @param addr The address.
*
* @return An ASCII representation of the address.
*/
static std::string Render(const Value::addr_t& addr);
/**
* Convert an subnet value into a string.
*
* This is a helper function that formatter implementations may use.
*
* @param addr The address.
*
* @return An ASCII representation of the subnet.
*/
static std::string Render(const Value::subnet_t& subnet);
/**
* Convert a double into a string. This renders the double with Bro's
* standard precision.
*
* This is a helper function that formatter implementations may use.
*
* @param d The double.
*
* @return An ASCII representation of the double.
*/
static std::string Render(double d);
/**
* Convert a transport protocol into a string.
*
* This is a helper function that formatter implementations may use.
*
* @param proto The transport protocol.
*
* @return An ASCII representation of the protocol.
*/
static std::string Render(TransportProto proto);
/**
* Convert a string into a TransportProto. The string must be one of
* \c tcp, \c udp, \c icmp, or \c unknown.
*
* This is a helper function that formatter implementations may use.
*
* @param proto The transport protocol
*
* @return The transport protocol, which will be \c TRANSPORT_UNKNOWN
* on error. Errors are also flagged via the thread.
*/
TransportProto ParseProto(const std::string& proto) const;
/**
* Convert a string into a Value::addr_t.
*
* This is a helper function that formatter implementations may use.
*
* @param addr String containing an IPv4 or IPv6 address.
*
* @return The address, which will be all-zero on error. Errors are
* also flagged via the thread.
*/
Value::addr_t ParseAddr(const std::string& addr) const;
protected:
/**
* Returns the thread associated with the formatter via the
* constructor.
*/
MsgThread* GetThread() const { return thread; }
private:
MsgThread* thread;
};
} // namespace zeek::threading