123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- // Copyright (C) 2011-2016 Internet Systems Consortium, Inc. ("ISC")
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this
- // file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #ifndef MESSAGE_DICTIONARY_H
- #define MESSAGE_DICTIONARY_H
- #include <cstddef>
- #include <string>
- #include <map>
- #include <vector>
- #include <boost/lexical_cast.hpp>
- #include <boost/shared_ptr.hpp>
- #include <log/message_types.h>
- namespace isc {
- namespace log {
- /// \brief Forward declaration of \c MessageDictionary
- class MessageDictionary;
- /// \brief Shared pointer to the \c MessageDictionary.
- typedef boost::shared_ptr<MessageDictionary> MessageDictionaryPtr;
- /// \brief Message Dictionary
- ///
- /// The message dictionary is a wrapper around a std::map object, and allows
- /// message text to be retrieved given the string identification.
- ///
- /// Adding text occurs in two modes:
- ///
- /// Through the "Add" method, ID/text mappings are added to the dictionary
- /// unless the ID already exists. This is designed for use during program
- /// initialization, where a local message may supplant a compiled-in message.
- ///
- /// Through the "Replace" method, ID/text mappings are added to the dictionary
- /// only if the ID already exists. This is for use when a message file is
- /// supplied to replace messages provided with the program.
- ///
- /// Although the class can be used stand-alone, it does supply a static method
- /// to return a particular instance - the "global" dictionary.
- class MessageDictionary {
- public:
- typedef std::map<std::string, std::string> Dictionary;
- typedef Dictionary::const_iterator const_iterator;
- /// \brief Constructor
- MessageDictionary();
- /// \brief Virtual Destructor
- virtual ~MessageDictionary();
- /// \brief Add Message
- ///
- /// Adds a message to the dictionary. If the ID already exists, the ID is
- /// added to the overflow vector.
- ///
- /// \param ident Identification of the message to add
- /// \param text Message text
- ///
- /// \return true if the message was added to the dictionary, false if the
- /// message existed and it was not added.
- virtual bool add(const MessageID& ident, const std::string& text) {
- return (add(boost::lexical_cast<std::string>(ident), text));
- }
- /// \brief Add Message
- ///
- /// Alternate signature.
- ///
- /// \param ident Identification of the message to add
- /// \param text Message text
- ///
- /// \return true if the message was added to the dictionary, false if the
- /// message existed and it was not added.
- virtual bool add (const std::string& ident, const std::string& text);
- /// \brief Replace Message
- ///
- /// Replaces a message in the dictionary. If the ID does not exist, it is
- /// added to the overflow vector.
- ///
- /// \param ident Identification of the message to replace
- /// \param text Message text
- ///
- /// \return true if the message was added to the dictionary, false if the
- /// message did not exist and it was not added.
- virtual bool replace(const MessageID& ident, const std::string& text) {
- return (replace(boost::lexical_cast<std::string>(ident), text));
- }
- /// \brief Replace Message
- ///
- /// Alternate signature.
- ///
- /// \param ident Identification of the message to replace
- /// \param text Message text
- ///
- /// \return true if the message was added to the dictionary, false if the
- /// message did not exist and it was not added.
- virtual bool replace(const std::string& ident, const std::string& text);
- /// \brief Removes the specified message from the dictionary.
- ///
- /// Checks if both the message identifier and the text match the message
- /// in the dictionary before removal. If the text doesn't match it is
- /// an indication that the message which removal is requested is a
- /// duplicate of another message. This may occur when two Kea modules
- /// register messages with the same identifier. When one of the modules
- /// is unloaded and the relevant messages are unregistered, there is a
- /// need to make sure that the message registered by the other module
- /// is not accidentally removed. Hence, the additional check for the
- /// text match is needed.
- ///
- /// \param ident Identification of the message to remove.
- /// \param text Message text
- ///
- /// \return true of the message has been removed, false if the message
- /// couldn't be found.
- virtual bool erase(const std::string& ident, const std::string& text);
- /// \brief Load Dictionary
- ///
- /// Designed to be used during the initialization of programs, this
- /// accepts a set of (ID, text) pairs as a one-dimensional array of
- /// const char* and adds them to the dictionary. The messages are added
- /// using "Add".
- ///
- /// \param elements null-terminated array of const char* alternating ID and
- /// message text. This should be an odd number of elements long, the last
- /// element being NULL. If it is an even number of elements long, the
- /// last ID is ignored.
- ///
- /// \return Vector of message IDs that were not loaded because an ID of the
- /// same name already existing in the dictionary. This vector may be
- /// empty.
- virtual std::vector<std::string> load(const char* elements[]);
- /// \brief Get Message Text
- ///
- /// Given an ID, retrieve associated message text.
- ///
- /// \param ident Message identification
- ///
- /// \return Text associated with message or empty string if the ID is not
- /// recognized. (Note: this precludes an ID being associated with an empty
- /// string.)
- virtual const std::string& getText(const MessageID& ident) const {
- return(getText(boost::lexical_cast<std::string>(ident)));
- }
- /// \brief Get Message Text
- ///
- /// Alternate signature.
- ///
- /// \param ident Message identification
- ///
- /// \return Text associated with message or empty string if the ID is not
- /// recognized. (Note: this precludes an ID being associated with an empty
- /// string.)
- virtual const std::string& getText(const std::string& ident) const;
- /// \brief Number of Items in Dictionary
- ///
- /// \return Number of items in the dictionary
- virtual size_t size() const {
- return (dictionary_.size());
- }
- /// \brief Return begin() iterator of internal map
- const_iterator begin() const {
- return (dictionary_.begin());
- }
- /// \brief Return end() iterator of internal map
- const_iterator end() const {
- return (dictionary_.end());
- }
- /// \brief Return Global Dictionary
- ///
- /// Returns a pointer to the singleton global dictionary.
- ///
- /// \return Pointer to global dictionary.
- static const MessageDictionaryPtr& globalDictionary();
- private:
- Dictionary dictionary_; ///< Holds the ID to text lookups
- const std::string empty_; ///< Empty string
- };
- } // namespace log
- } // namespace isc
- #endif // MESSAGE_DICTIONARY_H
|