// // aegis - project change supervisor // Copyright (C) 2005, 2006, 2008, 2009, 2012, 2014 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program 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 General Public License // along with this program. If not, see // . // #ifndef LIBAEGIS_RFC822_H #define LIBAEGIS_RFC822_H #include #include #include #include /** * The rfc822 class is used to represent a database of name and values * in RFC822 format. It ispossible to populate the database by reading * the RFC822 header from a file, and the values can be stored by * writing an RFC822 header to a file. */ class rfc822 { public: /** * The destructor. */ virtual ~rfc822(); /** * The default constructor. */ rfc822(); /** * The copy constructor. */ rfc822(const rfc822 &arg); /** * The assignment operator. */ rfc822 &operator=(const rfc822 &arg); /** * The set method is used to insert a record into the database. * * @param name * The name of the record to set. * @param value * The value of the record being set. */ void set(const nstring &name, const char *value); /** * The set method is used to insert a record into the database. * * @param name * The name of the record to set. * @param value * The value of the record being set. */ void set(const nstring &name, const nstring &value); /** * The set_minimalist method is used to insert a record into the * database, but only is the value supplied is not empty. If the * value is empty, and existing record will be removed. * * @param name * The name of the record to set. * @param value * The value of the record being set. */ void set_minimalist(const nstring &name, const nstring &value); /** * The set method is a convenience function which reformats the * long value as a string, and then sets that value. * * @param name * The name of the record to set. * @param value * The value of the record being set. */ void set(const nstring &name, long value); /** * The set method is a convenience function which reformats the * unsigned long value as a string, and then sets that value. * * @param name * The name of the record to set. * @param value * The value of the record being set. */ void set(const nstring &name, unsigned long value); /** * The set_off_t method is a convenience function which reformats * the off_t value as a string, and then sets that value. * * The name needs to be mention the type to avoid portability and * compilation problems: * - on 32 bit systems without LFS off_t is probably a long; * - on 32 bit systems with LFS off_t is probably a long long; * - on 64 bit systems off_t is probably a long again. * * @param name * The name of the record to set. * @param value * The value of the record being set. */ void set_off_t(const nstring &name, off_t value); /** * The set method is a convenience function which reformats the * bool value as a string, and then sets that value. * * @param name * The name of the record to set. * @param value * The value of the record being set. */ void set(const nstring &name, bool value); /** * The is_set method is used to determine if a given header record * has been set. (Note that even if the value is the empty string, * it is still considered to have been set.) * * @param name * The name of the header record to test for. */ bool is_set(const nstring &name) const; /** * The get method is used to get the named header value. * * @param name * The name of the record to get. * @returns * A reference to the record's value. You are not allowed to * change it. If the named record does not exist, the empty * string will be returned. */ const nstring &get(const nstring &name); /** * The get method is used to get the named header value. * * @param name * The name of the record to get. * @returns * The record's value. If the named record does not exist, the * empty string will be returned. */ nstring get(const nstring &name) const; /** * The get_long method is used to get the named header value, as an * integer. * * @param name * The name of the record to get. * @returns * The record's value. * @note * Values which are not numbers will be silently converted to * zero. */ long get_long(const nstring &name); /** * The get_ulong method is used to get the named header value, as an * unsigned long integer. * * @param name * The name of the record to get. * @returns * The record's value. * @note * Values which are not numbers will be silently converted to * zero. */ unsigned long get_ulong(const nstring &name); /** * The get_off_t method is used to get the named header value, as an * off_t. * * @param name * The name of the record to get. * @returns * The record's value. * @note * Values which are not numbers will be silently converted to * zero. */ off_t get_off_t(const nstring &name); /** * The load method is used to load the database contents by reading * the given input for and RFC 822 formatted header. It stops * after reading a blank line. * * @param src * The input to read the data from. * @param maybe_not * false if a header must be present, * true if it is acceptable for the header to be absent. */ void load(const input::pointer &src, bool maybe_not = false); /** * The load_from_file method is used to load the database contents * by reading from a file. Blank lines and # comments are ignored. * * @param filename * The input to read the data from. */ void load_from_file(const nstring &filename); /** * The store method is used to dump the database out as an RFC 822 * compliant header, followed by a single blank line. * * @param dst * The output stream on which to write the data. */ void store(output::pointer dst); /** * The store_to_file method is used to dump the database to a file. * It calls the strore method to do all the work. * * @param filename * The filename into which to write the data. */ void store_to_file(const nstring &filename); /** * The empty method is used to determine whether or not the * database currently had no data. */ bool empty() const { return database.empty(); } /** * The date class method is used to obtain the current date and * time, conforming to RFC 822 format. */ static nstring date(); /** * The keys method is used to obtain the keys to the database. */ void keys(nstring_list &result) { database.keys(result); } /** * The clear method is used to discard all settings from the database. */ void clear(); private: /** * The database instance variable is used to remeber the name-value * pairs for each header item. */ symtab database; /** * The sanitize_name class method is used to normalize the name * into lower case, with non-alpha-numberics turned into minus * symbols. This is because RFC 822 header names are case-insensitive. * * @param name * The name to be sanitized. */ static nstring sanitize_name(const nstring &name); }; #endif // LIBAEGIS_RFC822_H // vim: set ts=8 sw=4 et :