summaryrefslogtreecommitdiffstats
path: root/src/lib/log/message_dictionary.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/log/message_dictionary.cc')
-rw-r--r--src/lib/log/message_dictionary.cc121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/lib/log/message_dictionary.cc b/src/lib/log/message_dictionary.cc
new file mode 100644
index 0000000..5271e46
--- /dev/null
+++ b/src/lib/log/message_dictionary.cc
@@ -0,0 +1,121 @@
+// Copyright (C) 2011-2022 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/.
+
+#include <config.h>
+
+#include <cstddef>
+#include <log/message_dictionary.h>
+#include <log/message_types.h>
+
+using namespace std;
+
+namespace isc {
+namespace log {
+
+// Constructor
+
+MessageDictionary::MessageDictionary() : dictionary_(), empty_("") {
+}
+
+// (Virtual) Destructor
+
+MessageDictionary::~MessageDictionary() {
+}
+
+// Add message and note if ID already exists
+
+bool
+MessageDictionary::add(const std::string& ident, const std::string& text) {
+ Dictionary::iterator i = dictionary_.find(ident);
+ bool not_found = (i == dictionary_.end());
+ if (not_found) {
+
+ // Message not already in the dictionary, so add it.
+ dictionary_[ident] = text;
+ }
+
+ return (not_found);
+}
+
+// Add message and note if ID does not already exist
+
+bool
+MessageDictionary::replace(const std::string& ident, const std::string& text) {
+ Dictionary::iterator i = dictionary_.find(ident);
+ bool found = (i != dictionary_.end());
+ if (found) {
+
+ // Exists, so replace it.
+ dictionary_[ident] = text;
+ }
+
+ return (found);
+}
+
+bool
+MessageDictionary::erase(const std::string& ident, const std::string& text) {
+ Dictionary::iterator mes = dictionary_.find(ident);
+ // Both the ID and the text must match.
+ bool found = (mes != dictionary_.end() && (mes->second == text));
+ if (found) {
+ dictionary_.erase(mes);
+ }
+ return (found);
+}
+
+// Load a set of messages
+
+vector<std::string>
+MessageDictionary::load(const char* messages[]) {
+ vector<std::string> duplicates;
+ int i = 0;
+ while (messages[i]) {
+ // ID present, so point to text.
+ ++i;
+ if (messages[i]) {
+ const MessageID ident(messages[i - 1]);
+ // Text not null, note it and point to next ident.
+ const std::string text(messages[i]);
+ ++i;
+
+ // Add ID and text to message dictionary, noting if the ID was
+ // already present.
+ bool added = add(ident, text);
+ if (!added) {
+ duplicates.push_back(boost::lexical_cast<string>(ident));
+ }
+ }
+ }
+ return (duplicates);
+}
+
+// Return message text or blank string. A reference is returned to a string
+// in the dictionary - this is fine, as the string is immediately used for
+// output.
+
+const string&
+MessageDictionary::getText(const std::string& ident) const {
+ Dictionary::const_iterator i = dictionary_.find(ident);
+ if (i == dictionary_.end()) {
+ return (empty_);
+ } else {
+ return (i->second);
+ }
+}
+
+// Return global dictionary
+
+const MessageDictionaryPtr&
+MessageDictionary::globalDictionary() {
+ static MessageDictionaryPtr global(new MessageDictionary());
+ return (global);
+}
+
+
+
+
+} // namespace log
+} // namespace isc