summaryrefslogtreecommitdiff
path: root/src/message
diff options
context:
space:
mode:
Diffstat (limited to 'src/message')
-rw-r--r--src/message/sender.cpp62
-rw-r--r--src/message/sender.hpp9
-rw-r--r--src/message/thread_safe_queue.cpp21
-rw-r--r--src/message/thread_safe_queue.hpp29
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;
+ };
+}