#include #include "mail.hpp" namespace smtp::manage { // //Constructors // Mail::Mail( file::mail::types::IFileManipulatorPtr const& file_reader ) : mFileReader( file_reader ) , mMails( mFileReader->Read() ) { } Mail::Mail( Mail const& mails) { mMails = mails.mMails; mFileReader = mails.mFileReader; } // //Public methods // general::MailsSet Mail::GetMailToSend() const { return mMails; } bool Mail::AddMailsToSend( general::MailsSet const& mails_to_add ) { auto merged_mails = GetMergedMails( mails_to_add ); auto result = RefreshMails( merged_mails ); mCondition.notify_one(); return result; } bool Mail::DeleteMailToSend( general::MailsSet const& mail_to_delete ) { auto mails_to_delete = GetItersectionMails( mail_to_delete ); 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 // general::MailsSet Mail::GetMergedMails( general::MailsSet const& mails_to_add ) { auto result = mails_to_add; result.merge( mMails ); result.sort(); result.unique(); return result; } general::MailsSet Mail::GetItersectionMails( general::MailsSet const& mail_to_delete ) const { general::MailsSet result; auto sorted_mail_to_send = mail_to_delete; sorted_mail_to_send.sort(); std::set_intersection( mMails.cbegin(), mMails.cend(), sorted_mail_to_send.cbegin(), sorted_mail_to_send.cend(), std::back_inserter( result ) ); return result; } general::MailsSet Mail::GetMailsAfterDelete( general::MailsSet const& mails_to_delete ) { auto result = mMails; for( const auto& mail : mails_to_delete ) { result.remove( mail ); } return result; } bool Mail::RefreshMails( general::MailsSet const& new_mails ) { auto result = mFileReader->Write( new_mails ); mMails = mFileReader->Read(); return result; } }