From 235b75103d5fd2e7d0f8027d7b7e3b50a7deed2b Mon Sep 17 00:00:00 2001 From: claiff Date: Wed, 19 Oct 2022 18:17:14 +0300 Subject: refactor --- CMakeLists.txt | 2 + src/management/mail.cpp | 2 +- src/management/settings.cpp | 10 ++++ src/management/settings.hpp | 3 ++ src/message/queue_sender.cpp | 39 ++++++++++++++++ src/message/queue_sender.hpp | 26 +++++++++++ src/message/sender.cpp | 109 +++++++++++++++++++------------------------ src/message/sender.hpp | 25 ++++++---- src/service/smtp.cpp | 6 +-- 9 files changed, 149 insertions(+), 73 deletions(-) create mode 100644 src/message/queue_sender.cpp create mode 100644 src/message/queue_sender.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b188908..c5f8842 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,6 +108,8 @@ set(SRC_FILES ${MESSAGE_DIR}/sender.hpp ${MESSAGE_DIR}/sender.cpp + ${MESSAGE_DIR}/queue_sender.hpp + ${MESSAGE_DIR}/queue_sender.cpp ${MESSAGE_DIR}/builder/date.hpp ${MESSAGE_DIR}/builder/date.cpp diff --git a/src/management/mail.cpp b/src/management/mail.cpp index e3ef9f6..ed539b9 100644 --- a/src/management/mail.cpp +++ b/src/management/mail.cpp @@ -14,7 +14,7 @@ namespace smtp::manage { } - Mail::Mail(const Mail &mails) + Mail::Mail( Mail const& mails) { mMails = mails.mMails; mFileReader = mails.mFileReader; diff --git a/src/management/settings.cpp b/src/management/settings.cpp index 02392e0..8cee4e7 100644 --- a/src/management/settings.cpp +++ b/src/management/settings.cpp @@ -9,8 +9,16 @@ namespace smtp::manage { } + Settings::Settings( smtp::manage::Settings const& settings ) + : mFileReader( settings.mFileReader ) + , mSettingsFields( settings.mSettingsFields ) + { + } + bool Settings::SetSettings( general::SettingsFields const& settings_fields ) { + std::lock_guard lock{mMutex}; + auto result = mFileReader.Write( settings_fields ); mSettingsFields = mFileReader.Read(); @@ -19,6 +27,8 @@ namespace smtp::manage std::string Settings::GetSettings() { + std::lock_guard lock{mMutex}; + mSettingsFields = mFileReader.Read(); return converter::StructToString{}.Convert( mSettingsFields ); } diff --git a/src/management/settings.hpp b/src/management/settings.hpp index 2dbe1b6..31dbfc6 100644 --- a/src/management/settings.hpp +++ b/src/management/settings.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include "file/settings/settings.hpp" #include "general/struct.hpp" @@ -11,6 +12,7 @@ namespace smtp::manage { public: explicit Settings( file::settings::Settings const& file_reader ); + Settings( smtp::manage::Settings const& settings ); ~Settings() = default; bool SetSettings( general::SettingsFields const& settings_fields ); @@ -26,5 +28,6 @@ namespace smtp::manage private: file::settings::Settings mFileReader; general::SettingsFields mSettingsFields; + mutable std::mutex mMutex; }; } diff --git a/src/message/queue_sender.cpp b/src/message/queue_sender.cpp new file mode 100644 index 0000000..8f0172a --- /dev/null +++ b/src/message/queue_sender.cpp @@ -0,0 +1,39 @@ +#include "queue_sender.hpp" +#include "sender.hpp" + +namespace smtp::message +{ + QueueSender::QueueSender( manage::Settings const& settings_storage, + manage::Mail& mail_to, + thread::Queue& message_queue) + : mSettingsStorage( settings_storage ) + , mMailTo( mail_to ) + , mMessageQueue( message_queue ) + { + + } + + void QueueSender::SendMessages() + { + Sender message_sender; + while (1) + { + auto message = mMessageQueue.WaitAndPop(); + auto mail_from = GetMailfrom(); + auto mails_to = mMailTo.GetMailToSend(); + message_sender.Send( mSettingsStorage, mail_from, mails_to, message->subject, message->text ); + } + } + + std::string QueueSender::GetMailfrom() const + { + return mSettingsStorage.IsNeedAuth() ? mSettingsStorage.GetUserName() : + GetDefaultMailfrom(); + } + + std::string QueueSender::GetDefaultMailfrom() const + { + return "cp2-5422"; + } + +} diff --git a/src/message/queue_sender.hpp b/src/message/queue_sender.hpp new file mode 100644 index 0000000..170ebfc --- /dev/null +++ b/src/message/queue_sender.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "management/settings.hpp" +#include "management/mail.hpp" +#include "thread/queue.hpp" + +namespace smtp::message +{ + class QueueSender + { + public: + QueueSender( manage::Settings const& settings_storage, + manage::Mail& mail_to, + thread::Queue& message_queue ); + ~QueueSender() = default; + + void SendMessages(); + private: + std::string GetMailfrom() const; + std::string GetDefaultMailfrom() const; + + manage::Settings const& mSettingsStorage; + manage::Mail& mMailTo; + thread::Queue& mMessageQueue; + }; +} diff --git a/src/message/sender.cpp b/src/message/sender.cpp index 8b5371a..3431535 100644 --- a/src/message/sender.cpp +++ b/src/message/sender.cpp @@ -1,5 +1,4 @@ #include -#include #include "sender.hpp" #include "builder/date.hpp" @@ -14,79 +13,66 @@ namespace smtp::message { static std::string mText; - // - // Constructors/Destructors - // - Sender::Sender( manage::Settings const& settings_storage, manage::Mail& mail_to, thread::Queue& message_queue ) - : mSettingsStorage( settings_storage ) - , mMailTo( mail_to ) - , mMessageQueue( message_queue ) - { - - } - // //Public methods // - void Sender::Send() + bool Sender::Send( manage::Settings const& settings_storage, std::string const& mail_from, + general::MailsSet const& mails_to, std::string const& subject, + std::string const& text ) { static const std::string METHOD_NAME = "Send message"; + if( mails_to.empty() ) + { + return false; + } + CURLcode result = CURLE_OK; curl_slist* recipients = nullptr; WriteThis upload_ctx{}; auto curl = curl_easy_init(); //TODO сделать инициализацию через регистратор инициализаторов - - while(1) + if( !InitCurl( curl, upload_ctx, settings_storage, mail_from )) + { + logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Error to initializate message service" ); + return false; + } + FillRecipients( curl, recipients, mails_to); + UpdateMailText( mails_to, settings_storage.GetUserName(), subject, text ); + result = curl_easy_perform( curl ); + if( result != CURLE_OK ) { - mMailTo.WaitWhileEmptyMails(); - 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(); - 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; + 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; } // //Private methods // - bool smtp::message::Sender::InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from ) + bool smtp::message::Sender::InitCurl( CURL* curl, WriteThis const& upload_ctx, + manage::Settings const& settings_storage, + std::string const& mail_from ) { if( !curl ) { return false; } - if( mSettingsStorage.IsNeedAuth()) + if( settings_storage.IsNeedAuth()) { - curl_easy_setopt( curl, CURLOPT_USERNAME, mSettingsStorage.GetUserName().c_str()); - curl_easy_setopt( curl, CURLOPT_PASSWORD, mSettingsStorage.GetPassword().c_str()); + curl_easy_setopt( curl, CURLOPT_USERNAME, settings_storage.GetUserName().c_str()); + curl_easy_setopt( curl, CURLOPT_PASSWORD, settings_storage.GetPassword().c_str()); } - curl_easy_setopt( curl, CURLOPT_URL, GetHostPortData().c_str()); + curl_easy_setopt( curl, CURLOPT_URL, GetHostPortData( settings_storage ).c_str()); - mSettingsStorage.IsNeedSsl() ? curl_easy_setopt( curl, CURLOPT_USE_SSL, ( long ) CURLUSESSL_ALL ) : + settings_storage.IsNeedSsl() ? curl_easy_setopt( curl, CURLOPT_USE_SSL, ( long ) CURLUSESSL_ALL ) : curl_easy_setopt( curl, CURLOPT_USE_SSL, ( long ) CURLUSESSL_NONE ); curl_easy_setopt( curl, CURLOPT_MAIL_FROM, mail_from.c_str()); @@ -99,36 +85,39 @@ namespace smtp::message return true; } + void Sender::FillRecipients( CURL* curl, curl_slist* recipients, general::MailsSet const& mails_to ) + { + for( const auto& recipient: mails_to ) + { + recipients = curl_slist_append( recipients, recipient.c_str()); + } + + curl_easy_setopt( curl, CURLOPT_MAIL_RCPT, recipients ); + } + void - Sender::UpdateMailText( std::string const& mail_from, std::string const& subject, std::string const& text ) const + Sender::UpdateMailText( general::MailsSet const& mails_to, + std::string const& mail_from, + std::string const& subject, + std::string const& text ) const { - auto mail_to = mMailTo.GetMailToSend(); auto text_decorator = std::make_shared < builder::Text >( text ); text_decorator->Apply( std::make_shared < builder::Date >()) .Apply( std::make_shared < builder::Subject >( subject )) - .Apply( std::make_shared < builder::Cc >( mail_to )) + .Apply( std::make_shared < builder::Cc >( mails_to )) .Apply( std::make_shared < builder::From >( mail_from )) - .Apply( std::make_shared < builder::MailTo >( mail_to )); + .Apply( std::make_shared < builder::MailTo >( mails_to )); mText = text_decorator->Get(); } - void Sender::FillRecipients( CURL* curl, curl_slist* recipients ) - { - auto mail_to = mMailTo.GetMailToSend(); - for( const auto& recipient: mail_to ) - { - recipients = curl_slist_append( recipients, recipient.c_str()); - } - curl_easy_setopt( curl, CURLOPT_MAIL_RCPT, recipients ); - } - std::string Sender::GetHostPortData() const + std::string Sender::GetHostPortData( manage::Settings const& settings_storage ) const { - auto result = "smtp://" + mSettingsStorage.GetHost(); - if( !mSettingsStorage.GetPort().empty()) + auto result = "smtp://" + settings_storage.GetHost(); + if( !settings_storage.GetPort().empty()) { - result += ":" + mSettingsStorage.GetPort(); + result += ":" + settings_storage.GetPort(); } return result; } diff --git a/src/message/sender.hpp b/src/message/sender.hpp index 69f9346..10f1e1e 100644 --- a/src/message/sender.hpp +++ b/src/message/sender.hpp @@ -19,20 +19,27 @@ namespace smtp::message class Sender { public: - Sender( manage::Settings const& settings_storage, manage::Mail& mail_to, thread::Queue& message_queue ); + Sender() = default; ~Sender() = default; - void Send(); + bool Send(manage::Settings const& settings_storage, std::string const& mail_from, + general::MailsSet const& mails_to, std::string const& subject, + std::string const& text); 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; - void FillRecipients(CURL* curl, curl_slist* recipients ); - std::string GetHostPortData() const; + bool InitCurl( CURL* curl, WriteThis const& upload_ctx, + manage::Settings const& settings_storage, + std::string const& mail_from ); + void FillRecipients( CURL* curl, curl_slist* recipients, general::MailsSet const& mails_to ); + void UpdateMailText( general::MailsSet const& mails_to, + std::string const& mail_from, + std::string const& subject, + std::string const& text ) const; + std::string GetHostPortData( manage::Settings const& settings_storage ) const; static size_t ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp ); - manage::Settings const& mSettingsStorage; - manage::Mail& mMailTo; - thread::Queue& mMessageQueue; +// manage::Settings const& mSettingsStorage; +// manage::Mail& mMailTo; +// thread::Queue& mMessageQueue; }; } diff --git a/src/service/smtp.cpp b/src/service/smtp.cpp index 6c2f1ad..81a3f0d 100644 --- a/src/service/smtp.cpp +++ b/src/service/smtp.cpp @@ -1,5 +1,5 @@ #include "smtp.hpp" -#include "message/sender.hpp" +#include "message/queue_sender.hpp" namespace smtp::service { @@ -15,8 +15,8 @@ namespace smtp::service CreateSettingsManagerInterface( connection ); CreateMailManagerInterface( connection ); - message::Sender sender{mSettingsStorage, mMailTo, mMessageQueue}; - std::thread sender_message( &message::Sender::Send, std::move(sender) ); + message::QueueSender sender{ mSettingsStorage, mMailTo, mMessageQueue }; + std::thread sender_message( &message::QueueSender::SendMessages, std::move(sender) ); sender_message.detach(); } -- cgit v1.2.3