diff options
Diffstat (limited to 'src/message')
-rw-r--r-- | src/message/sender.cpp | 62 | ||||
-rw-r--r-- | src/message/sender.hpp | 9 | ||||
-rw-r--r-- | src/message/thread_safe_queue.cpp | 21 | ||||
-rw-r--r-- | src/message/thread_safe_queue.hpp | 29 |
4 files changed, 89 insertions, 32 deletions
diff --git a/src/message/sender.cpp b/src/message/sender.cpp index 30073a8..a200092 100644 --- a/src/message/sender.cpp +++ b/src/message/sender.cpp @@ -16,9 +16,10 @@ namespace smtp::message // // Constructors/Destructors // - Sender::Sender( manage::Settings& settings_storage, manage::Mail const& mail_to ) + Sender::Sender( manage::Settings const& settings_storage, manage::Mail const& mail_to, ThreadSafeQueue& message_queue ) : mSettingsStorage( settings_storage ) , mMailTo( mail_to ) + , mMessageQueue( message_queue ) { } @@ -27,7 +28,7 @@ namespace smtp::message //Public methods // - bool Sender::Send( std::string const& mail_from, std::string const& subject, std::string const& text ) + void Sender::Send() { static const std::string METHOD_NAME = "Send message"; @@ -35,35 +36,38 @@ namespace smtp::message curl_slist* recipients = nullptr; WriteThis upload_ctx{}; auto curl = curl_easy_init(); - //TODO сделать инициализацию через регистратор инициализаторов - if( !InitCurl( curl, upload_ctx, mail_from )) - { - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Error to initializate message service" ); - return false; - } - //TODO раздать mail_to другим методам - auto mail_to = mMailTo.GetMailToSend(); - if( mail_to.empty()) - { - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "We haven't any mail to" ); - return false; - } - FillRecipients( curl, recipients ); - UpdateMailText( mail_from, subject, text ); - - result = curl_easy_perform( curl ); - if( result != CURLE_OK ) - { - std::string message = "Error to send messge: " + std::string( curl_easy_strerror( result )); - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, message ); - return false; - } - //TODO сделать деинициализацию через регистратор деинициализаторов - curl_slist_free_all( recipients ); - curl_easy_cleanup( curl ); - return true; + while(1) + { + auto message = mMessageQueue.WaitAndPop(); + if( !InitCurl( curl, upload_ctx, mSettingsStorage.GetUserName() )) + { + logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Error to initializate message service" ); + } + //TODO раздать mail_to другим методам + 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 ); + + if( result != CURLE_OK ) + { + std::string message = "Error to send messge: " + std::string( curl_easy_strerror( result )); + logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, message ); + } + upload_ctx.counter = 0; + } + //TODO сделать деинициализацию через регистратор деинициализаторов + curl_slist_free_all( recipients ); + curl_easy_cleanup( curl ); } // diff --git a/src/message/sender.hpp b/src/message/sender.hpp index 3118319..2419e4c 100644 --- a/src/message/sender.hpp +++ b/src/message/sender.hpp @@ -7,6 +7,8 @@ #include "management/settings.hpp" #include "management/mail.hpp" +#include "thread_safe_queue.hpp" + namespace smtp::message { struct WriteThis @@ -17,10 +19,10 @@ namespace smtp::message class Sender { public: - Sender( manage::Settings& settings_storage, manage::Mail const& mail_to ); + Sender( manage::Settings const& settings_storage, manage::Mail const& mail_to, ThreadSafeQueue& message_queue ); ~Sender() = default; - bool Send( std::string const& mail_from, std::string const& subject, std::string const& text ); + void Send(); private: bool InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from ); void UpdateMailText( std::string const& mail_from, std::string const& subject, std::string const& textt ) const; @@ -28,8 +30,9 @@ namespace smtp::message std::string GetHostPortData() const; static size_t ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp ); - manage::Settings& mSettingsStorage; + manage::Settings const& mSettingsStorage; manage::Mail const& mMailTo; + ThreadSafeQueue& mMessageQueue; }; } diff --git a/src/message/thread_safe_queue.cpp b/src/message/thread_safe_queue.cpp new file mode 100644 index 0000000..092a2ac --- /dev/null +++ b/src/message/thread_safe_queue.cpp @@ -0,0 +1,21 @@ +#include "thread_safe_queue.hpp" + +namespace smtp::message +{ + void ThreadSafeQueue::Push( Message const &message) + { + std::lock_guard<std::mutex> lock{mMutex}; + mMessageQueue.push( message ); + mCondition.notify_one(); + } + + std::shared_ptr<Message> ThreadSafeQueue::WaitAndPop() + { + std::unique_lock<std::mutex> lock{mMutex}; + mCondition.wait(lock, [this](){return !mMessageQueue.empty();}); + auto result = std::make_shared<Message>(mMessageQueue.front()); + mMessageQueue.pop(); + return result; + } + +} diff --git a/src/message/thread_safe_queue.hpp b/src/message/thread_safe_queue.hpp new file mode 100644 index 0000000..5bb1ee4 --- /dev/null +++ b/src/message/thread_safe_queue.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include <string> +#include <mutex> +#include <queue> +#include <condition_variable> + +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<Message> WaitAndPop(); + private: + mutable std::mutex mMutex; + std::queue<Message> mMessageQueue; + std::condition_variable mCondition; + }; +} |