Add debug option to log SMTP session transcripts.
[dcpomatic.git] / src / lib / cinema_kdms.cc
index aa701cafa75dbfbee86f99853dab5858e21d7b54..37c9e1fb55cb5684aaba45612b8bdcc6c5ba2ba2 100644 (file)
 
 */
 
-#include "quickmail.h"
 #include "exceptions.h"
 #include "cinema_kdms.h"
 #include "cinema.h"
 #include "screen.h"
 #include "config.h"
 #include "util.h"
-#include "film.h"
+#include "emailer.h"
 #include "compose.hpp"
+#include "log.h"
 #include <zip.h>
 #include <boost/foreach.hpp>
 
+#include "i18n.h"
+
 using std::list;
+using std::cout;
 using std::string;
 using boost::shared_ptr;
 
 void
-CinemaKDMs::make_zip_file (shared_ptr<const Film> film, boost::filesystem::path zip_file) const
+CinemaKDMs::make_zip_file (string film_name, boost::filesystem::path zip_file) const
 {
        int error;
        struct zip* zip = zip_open (zip_file.string().c_str(), ZIP_CREATE | ZIP_EXCL, &error);
@@ -56,7 +59,7 @@ CinemaKDMs::make_zip_file (shared_ptr<const Film> film, boost::filesystem::path
                        throw StringError ("could not create ZIP source");
                }
 
-               if (zip_add (zip, i.filename(film).c_str(), source) == -1) {
+               if (zip_add (zip, i.filename(film_name).c_str(), source) == -1) {
                        throw StringError ("failed to add KDM to ZIP archive");
                }
        }
@@ -102,51 +105,42 @@ CinemaKDMs::collect (list<ScreenKDM> screen_kdms)
 }
 
 void
-CinemaKDMs::write_zip_files (shared_ptr<const Film> film, list<CinemaKDMs> cinema_kdms, boost::filesystem::path directory)
+CinemaKDMs::write_zip_files (string film_name, list<CinemaKDMs> cinema_kdms, boost::filesystem::path directory)
 {
        BOOST_FOREACH (CinemaKDMs const & i, cinema_kdms) {
                boost::filesystem::path path = directory;
                path /= tidy_for_filename (i.cinema->name) + ".zip";
-               i.make_zip_file (film, path);
+               i.make_zip_file (film_name, path);
        }
 }
 
+/** @param log Log to write email session transcript to, or 0 */
 /* XXX: should probably get from/to from the KDMs themselves */
 void
-CinemaKDMs::email (shared_ptr<const Film> film, list<CinemaKDMs> cinema_kdms, dcp::LocalTime from, dcp::LocalTime to)
+CinemaKDMs::email (
+       string film_name, string cpl_name, list<CinemaKDMs> cinema_kdms, dcp::LocalTime from, dcp::LocalTime to, shared_ptr<Job> job, shared_ptr<Log> log
+       )
 {
+       Config* config = Config::instance ();
+
        BOOST_FOREACH (CinemaKDMs const & i, cinema_kdms) {
 
                boost::filesystem::path zip_file = boost::filesystem::temp_directory_path ();
                zip_file /= boost::filesystem::unique_path().string() + ".zip";
-               i.make_zip_file (film, zip_file);
-
-               /* Send email */
-
-               quickmail_initialize ();
+               i.make_zip_file (film_name, zip_file);
 
+               string subject = config->kdm_subject();
                SafeStringStream start;
                start << from.date() << " " << from.time_of_day();
                SafeStringStream end;
                end << to.date() << " " << to.time_of_day();
-
-               string subject = Config::instance()->kdm_subject();
-               boost::algorithm::replace_all (subject, "$CPL_NAME", film->dcp_name ());
+               boost::algorithm::replace_all (subject, "$CPL_NAME", cpl_name);
                boost::algorithm::replace_all (subject, "$START_TIME", start.str ());
                boost::algorithm::replace_all (subject, "$END_TIME", end.str ());
                boost::algorithm::replace_all (subject, "$CINEMA_NAME", i.cinema->name);
-               quickmail mail = quickmail_create (Config::instance()->kdm_from().c_str(), subject.c_str ());
 
-               quickmail_add_to (mail, i.cinema->email.c_str ());
-               if (!Config::instance()->kdm_cc().empty ()) {
-                       quickmail_add_cc (mail, Config::instance()->kdm_cc().c_str ());
-               }
-               if (!Config::instance()->kdm_bcc().empty ()) {
-                       quickmail_add_bcc (mail, Config::instance()->kdm_bcc().c_str ());
-               }
-
-               string body = Config::instance()->kdm_email().c_str();
-               boost::algorithm::replace_all (body, "$CPL_NAME", film->dcp_name ());
+               string body = config->kdm_email().c_str();
+               boost::algorithm::replace_all (body, "$CPL_NAME", cpl_name);
                boost::algorithm::replace_all (body, "$START_TIME", start.str ());
                boost::algorithm::replace_all (body, "$END_TIME", end.str ());
                boost::algorithm::replace_all (body, "$CINEMA_NAME", i.cinema->name);
@@ -157,27 +151,21 @@ CinemaKDMs::email (shared_ptr<const Film> film, list<CinemaKDMs> cinema_kdms, dc
                }
                boost::algorithm::replace_all (body, "$SCREENS", screens.str().substr (0, screens.str().length() - 2));
 
-               quickmail_set_body (mail, body.c_str());
-               quickmail_add_attachment_file (mail, zip_file.string().c_str(), "application/zip");
-
-               char const* error = quickmail_send (
-                       mail,
-                       Config::instance()->mail_server().c_str(),
-                       Config::instance()->mail_port(),
-                       Config::instance()->mail_user().c_str(),
-                       Config::instance()->mail_password().c_str()
-                       );
-
-               if (error) {
-                       quickmail_destroy (mail);
-                       throw KDMError (
-                               String::compose (
-                                       "Failed to send KDM email to %1 (%2)",
-                                       Config::instance()->mail_server(),
-                                       error
-                                       )
-                               );
+               Emailer email (config->kdm_from(), i.cinema->email, subject, body);
+
+               if (!config->kdm_cc().empty ()) {
+                       email.add_cc (config->kdm_cc ());
+               }
+               if (!config->kdm_bcc().empty ()) {
+                       email.add_bcc (config->kdm_bcc ());
+               }
+
+               string const name = tidy_for_filename(i.cinema->name) + "_" + tidy_for_filename(film_name) + ".zip";
+               email.add_attachment (zip_file, name, "application/zip");
+               email.send (job);
+
+               if (log) {
+                       log->log (email.notes(), LogEntry::TYPE_DEBUG_EMAIL);
                }
-               quickmail_destroy (mail);
        }
 }