From 1ca701a3056725f7560d10929baf3660d52bc4be Mon Sep 17 00:00:00 2001 From: claiff Date: Tue, 18 Oct 2022 16:52:46 +0300 Subject: waiting smtp recipients --- CMakeLists.txt | 6 ++++-- src/management/mail.cpp | 22 ++++++++++++++++++---- src/management/mail.hpp | 6 ++++++ src/message/sender.cpp | 9 +++------ src/message/sender.hpp | 8 ++++---- src/message/thread_safe_queue.cpp | 21 --------------------- src/message/thread_safe_queue.hpp | 29 ----------------------------- src/service/smtp.hpp | 4 ++-- src/thread/queue.cpp | 21 +++++++++++++++++++++ src/thread/queue.hpp | 29 +++++++++++++++++++++++++++++ 10 files changed, 87 insertions(+), 68 deletions(-) delete mode 100644 src/message/thread_safe_queue.cpp delete mode 100644 src/message/thread_safe_queue.hpp create mode 100644 src/thread/queue.cpp create mode 100644 src/thread/queue.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ea033d7..b188908 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,6 +98,7 @@ set(CONVERTER_DIR src/converter) set(LOGGER_DIR src/logger) set(CHECKER_DIR src/checker) set(GENERAL_DIR src/general) +set(THREAD_DIR src/thread) set(SRC_FILES ${SRC_DIR}/main.cpp @@ -107,8 +108,6 @@ set(SRC_FILES ${MESSAGE_DIR}/sender.hpp ${MESSAGE_DIR}/sender.cpp - ${MESSAGE_DIR}/thread_safe_queue.hpp - ${MESSAGE_DIR}/thread_safe_queue.cpp ${MESSAGE_DIR}/builder/date.hpp ${MESSAGE_DIR}/builder/date.cpp @@ -191,6 +190,9 @@ set(SRC_FILES ${GENERAL_DIR}/struct.hpp ${GENERAL_DIR}/idecorator.hpp + + ${THREAD_DIR}/queue.hpp + ${THREAD_DIR}/queue.cpp ) if( ${ADD_PHOSPHOR_LOGGING} STREQUAL "ON") diff --git a/src/management/mail.cpp b/src/management/mail.cpp index eefb666..e3ef9f6 100644 --- a/src/management/mail.cpp +++ b/src/management/mail.cpp @@ -11,8 +11,14 @@ namespace smtp::manage Mail::Mail( file::mail::types::IFileManipulatorPtr const& file_reader ) : mFileReader( file_reader ) , mMails( mFileReader->Read() ) - { - } + { + } + + Mail::Mail(const Mail &mails) + { + mMails = mails.mMails; + mFileReader = mails.mFileReader; + } // @@ -28,7 +34,9 @@ namespace smtp::manage { auto merged_mails = GetMergedMails( mails_to_add ); - return RefreshMails( merged_mails ); + auto result = RefreshMails( merged_mails ); + mCondition.notify_one(); + return result; } bool Mail::DeleteMailToSend( general::MailsSet const& mail_to_delete ) @@ -38,7 +46,13 @@ namespace smtp::manage auto result_set_after_delete = GetMailsAfterDelete( mails_to_delete ); return RefreshMails( result_set_after_delete ); - } + } + + void Mail::WaitWhileEmptyMails() + { + std::unique_lock lock{mMutex}; + mCondition.wait(lock, [this](){return !mMails.empty();}); + } // //Private methods diff --git a/src/management/mail.hpp b/src/management/mail.hpp index 39d4048..0a5c890 100644 --- a/src/management/mail.hpp +++ b/src/management/mail.hpp @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include "file/mail/types/ifile_manipulator.hpp" #include "checker/registrator_mails.hpp" @@ -11,11 +13,13 @@ namespace smtp::manage { public: explicit Mail( file::mail::types::IFileManipulatorPtr const& file_reader ); + Mail(Mail const& mails); ~Mail() = default; general::MailsSet GetMailToSend() const; bool AddMailsToSend( general::MailsSet const& mails ); bool DeleteMailToSend( general::MailsSet const& mail_to_delete ); + void WaitWhileEmptyMails(); private: general::MailsSet GetMergedMails( general::MailsSet const& mails_to_add ); general::MailsSet GetItersectionMails( general::MailsSet const& mail_to_delete ) const; @@ -24,6 +28,8 @@ namespace smtp::manage file::mail::types::IFileManipulatorPtr mFileReader; general::MailsSet mMails; + mutable std::mutex mMutex; + std::condition_variable mCondition; }; } diff --git a/src/message/sender.cpp b/src/message/sender.cpp index a200092..7df9819 100644 --- a/src/message/sender.cpp +++ b/src/message/sender.cpp @@ -16,7 +16,7 @@ namespace smtp::message // // Constructors/Destructors // - Sender::Sender( manage::Settings const& settings_storage, manage::Mail const& mail_to, ThreadSafeQueue& message_queue ) + Sender::Sender( manage::Settings const& settings_storage, manage::Mail& mail_to, thread::Queue& message_queue ) : mSettingsStorage( settings_storage ) , mMailTo( mail_to ) , mMessageQueue( message_queue ) @@ -46,14 +46,11 @@ namespace smtp::message logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Error to initializate message service" ); } //TODO раздать mail_to другим методам + + mMailTo.WaitWhileEmptyMails(); auto mail_to = mMailTo.GetMailToSend(); - if( mail_to.empty()) - { - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "We haven't any mail to" ); - } FillRecipients( curl, recipients ); - UpdateMailText( mSettingsStorage.GetUserName(), message->subject, message->text ); result = curl_easy_perform( curl ); diff --git a/src/message/sender.hpp b/src/message/sender.hpp index 2419e4c..69f9346 100644 --- a/src/message/sender.hpp +++ b/src/message/sender.hpp @@ -7,7 +7,7 @@ #include "management/settings.hpp" #include "management/mail.hpp" -#include "thread_safe_queue.hpp" +#include "thread/queue.hpp" namespace smtp::message { @@ -19,7 +19,7 @@ namespace smtp::message class Sender { public: - Sender( manage::Settings const& settings_storage, manage::Mail const& mail_to, ThreadSafeQueue& message_queue ); + Sender( manage::Settings const& settings_storage, manage::Mail& mail_to, thread::Queue& message_queue ); ~Sender() = default; void Send(); @@ -31,8 +31,8 @@ namespace smtp::message static size_t ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp ); manage::Settings const& mSettingsStorage; - manage::Mail const& mMailTo; - ThreadSafeQueue& mMessageQueue; + manage::Mail& mMailTo; + thread::Queue& mMessageQueue; }; } diff --git a/src/message/thread_safe_queue.cpp b/src/message/thread_safe_queue.cpp deleted file mode 100644 index 092a2ac..0000000 --- a/src/message/thread_safe_queue.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "thread_safe_queue.hpp" - -namespace smtp::message -{ - void ThreadSafeQueue::Push( Message const &message) - { - std::lock_guard lock{mMutex}; - mMessageQueue.push( message ); - mCondition.notify_one(); - } - - std::shared_ptr ThreadSafeQueue::WaitAndPop() - { - std::unique_lock lock{mMutex}; - mCondition.wait(lock, [this](){return !mMessageQueue.empty();}); - auto result = std::make_shared(mMessageQueue.front()); - mMessageQueue.pop(); - return result; - } - -} diff --git a/src/message/thread_safe_queue.hpp b/src/message/thread_safe_queue.hpp deleted file mode 100644 index 5bb1ee4..0000000 --- a/src/message/thread_safe_queue.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace smtp::message -{ - struct Message - { - std::string subject; - std::string text; - }; - - class ThreadSafeQueue - { - public: - ThreadSafeQueue() = default; - ~ThreadSafeQueue() = default; - - void Push( Message const& message ); - std::shared_ptr WaitAndPop(); - private: - mutable std::mutex mMutex; - std::queue mMessageQueue; - std::condition_variable mCondition; - }; -} diff --git a/src/service/smtp.hpp b/src/service/smtp.hpp index 0d8aea1..6329c7e 100644 --- a/src/service/smtp.hpp +++ b/src/service/smtp.hpp @@ -7,7 +7,7 @@ #include "management/mail.hpp" #include "management/settings.hpp" -#include "message/thread_safe_queue.hpp" +#include "thread/queue.hpp" namespace smtp::service { @@ -37,6 +37,6 @@ namespace smtp::service manage::Settings mSettingsStorage; manage::Mail mMailTo; - message::ThreadSafeQueue mMessageQueue; + thread::Queue mMessageQueue; }; } diff --git a/src/thread/queue.cpp b/src/thread/queue.cpp new file mode 100644 index 0000000..d2ed7d2 --- /dev/null +++ b/src/thread/queue.cpp @@ -0,0 +1,21 @@ +#include "queue.hpp" + +namespace smtp::thread +{ + void Queue::Push( Message const &message) + { + std::lock_guard lock{mMutex}; + mMessageQueue.push( message ); + mCondition.notify_one(); + } + + std::shared_ptr Queue::WaitAndPop() + { + std::unique_lock lock{mMutex}; + mCondition.wait(lock, [this](){return !mMessageQueue.empty();}); + auto result = std::make_shared(mMessageQueue.front()); + mMessageQueue.pop(); + return result; + } + +} diff --git a/src/thread/queue.hpp b/src/thread/queue.hpp new file mode 100644 index 0000000..9ed3a76 --- /dev/null +++ b/src/thread/queue.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include +#include + +namespace smtp::thread +{ + struct Message + { + std::string subject; + std::string text; + }; + + class Queue + { + public: + Queue() = default; + ~Queue() = default; + + void Push( Message const& message ); + std::shared_ptr WaitAndPop(); + private: + mutable std::mutex mMutex; + std::queue mMessageQueue; + std::condition_variable mCondition; + }; +} -- cgit v1.2.3