diff options
Diffstat (limited to 'src/base/message_handler.cc')
-rw-r--r-- | src/base/message_handler.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/base/message_handler.cc b/src/base/message_handler.cc new file mode 100644 index 0000000..70959c0 --- /dev/null +++ b/src/base/message_handler.cc @@ -0,0 +1,69 @@ +#include "image_io/base/message_handler.h" + +#include <memory> +#include <string> +#include <utility> + +#include "image_io/base/cout_message_writer.h" + +namespace photos_editing_formats { +namespace image_io { + +using std::string; +using std::unique_ptr; + +/// The message handler. No effort made to delete it at program's end. +static MessageHandler* gMessageHandler = nullptr; + +void MessageHandler::Init(std::unique_ptr<MessageWriter> message_writer, + std::unique_ptr<MessageStore> message_store) { + auto* old_handler = gMessageHandler; + gMessageHandler = new MessageHandler; + gMessageHandler->SetMessageWriter(std::move(message_writer)); + gMessageHandler->SetMessageStore(std::move(message_store)); + delete old_handler; +} + +MessageHandler* MessageHandler::Get() { + if (!gMessageHandler) { + gMessageHandler = new MessageHandler; + gMessageHandler->SetMessageWriter( + unique_ptr<MessageWriter>(new CoutMessageWriter)); + gMessageHandler->SetMessageStore( + unique_ptr<MessageStore>(new VectorMessageStore)); + } + return gMessageHandler; +} + +MessageHandler::~MessageHandler() { + if (gMessageHandler == this) { + gMessageHandler = nullptr; + } +} + +void MessageHandler::SetMessageWriter( + std::unique_ptr<MessageWriter> message_writer) { + message_writer_ = std::move(message_writer); +} + +void MessageHandler::SetMessageStore( + std::unique_ptr<MessageStore> message_store) { + message_store_ = std::move(message_store); +} + +void MessageHandler::ReportMessage(Message::Type type, const string& text) { + int system_errno = (type == Message::kStdLibError) ? errno : 0; + ReportMessage(Message(type, system_errno, text)); +} + +void MessageHandler::ReportMessage(const Message& message) { + if (message_store_) { + message_store_->AddMessage(message); + } + if (message_writer_) { + message_writer_->WriteMessage(message); + } +} + +} // namespace image_io +} // namespace photos_editing_formats |