1 /*
2  * Copyright (C) 2008 Emweb bv, Herent, Belgium.
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include <Wt/WApplication.h>
8 #include <Wt/WBreak.h>
9 #include <Wt/WText.h>
10 #include <Wt/WPushButton.h>
11 #include <Wt/WContainerWidget.h>
12 #include <Wt/WStringUtil.h>
13 #ifndef _MSC_VER
14 #include <unistd.h>
15 #endif
16 
17 #include "Composer.h"
18 #include "ComposeExample.h"
19 #include "Contact.h"
20 
ComposeExample()21 ComposeExample::ComposeExample()
22   : WContainerWidget()
23 {
24   composer_ = this->addWidget(std::make_unique<Composer>());
25 
26   std::vector<Contact> addressBook;
27   addressBook.push_back(Contact(U"Koen Deforche",
28                                 U"koen.deforche@gmail.com"));
29   addressBook.push_back(Contact(U"Koen alias1",
30                                 U"koen.alias1@yahoo.com"));
31   addressBook.push_back(Contact(U"Koen alias2",
32                                 U"koen.alias2@yahoo.com"));
33   addressBook.push_back(Contact(U"Koen alias3",
34                                 U"koen.alias3@yahoo.com"));
35   addressBook.push_back(Contact(U"Bartje",
36                                 U"jafar@hotmail.com"));
37   composer_->setAddressBook(addressBook);
38 
39   std::vector<Contact> contacts;
40   contacts.push_back(Contact(U"Koen Deforche", U"koen.deforche@gmail.com"));
41 
42   composer_->setTo(contacts);
43   composer_->setSubject("That's cool! Want to start your own google?");
44 
45   composer_->send.connect(this, &ComposeExample::send);
46   composer_->discard.connect(this, &ComposeExample::discard);
47 
48   details_ = this->addWidget(std::make_unique<WContainerWidget>());
49 
50   details_->addWidget(std::make_unique<WText>(tr("example.info")));
51 }
52 
send()53 void ComposeExample::send()
54 {
55   WContainerWidget *feedback = this->addWidget(std::make_unique<WContainerWidget>());
56   feedback->setStyleClass(U"feedback");
57 
58   WContainerWidget *horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
59   horiz->addWidget(std::make_unique<WText>(U"<p>We could have, but did not send the following email:</p>"));
60 
61   std::vector<Contact> contacts = composer_->to();
62   if (!contacts.empty())
63     horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
64   for (unsigned i = 0; i < contacts.size(); ++i) {
65     horiz->addWidget(std::make_unique<WText>(U"To: \"" + contacts[i].name + U"\" <"
66               + contacts[i].email + U">", TextFormat::Plain));
67     horiz->addWidget(std::make_unique<WBreak>());
68   }
69 
70   contacts = composer_->cc();
71   if (!contacts.empty())
72     horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
73   for (unsigned i = 0; i < contacts.size(); ++i) {
74     horiz->addWidget(std::make_unique<WText>(U"Cc: \"" + contacts[i].name + U"\" <"
75               + contacts[i].email + U">", TextFormat::Plain));
76     horiz->addWidget(std::make_unique<WBreak>());
77   }
78 
79   contacts = composer_->bcc();
80   if (!contacts.empty())
81     horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
82   for (unsigned i = 0; i < contacts.size(); ++i) {
83       horiz->addWidget(std::make_unique<WText>(U"Bcc: \"" + contacts[i].name + U"\" <"
84                 + contacts[i].email + U">", TextFormat::Plain));
85       horiz->addWidget(std::make_unique<WBreak>());
86   }
87 
88   horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
89   horiz->addWidget(std::make_unique<WText>("Subject: \"" + composer_->subject() + "\"", TextFormat::Plain));
90 
91   std::vector<Attachment> attachments = composer_->attachments();
92   if (!attachments.empty())
93     horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
94   for (unsigned i = 0; i < attachments.size(); ++i) {
95     horiz->addWidget(std::make_unique<WText>(U"Attachment: \""
96 	      + attachments[i].fileName
97               + U"\" (" + attachments[i].contentDescription
98               + U")", TextFormat::Plain));
99 
100     unlink(attachments[i].spoolFileName.c_str());
101 
102     horiz->addWidget(std::make_unique<WText>(", was in spool file: "
103               + attachments[i].spoolFileName));
104     horiz->addWidget(std::make_unique<WBreak>());
105   }
106 
107   std::u32string message = composer_->message();
108 
109   horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
110   horiz->addWidget(std::make_unique<WText>("Message body: "));
111   horiz->addWidget(std::make_unique<WBreak>());
112 
113   if (!message.empty()) {
114     horiz->addWidget(std::make_unique<WText>(message, TextFormat::Plain));
115   } else
116     horiz->addWidget(std::make_unique<WText>("<i>(empty)</i>"));
117 
118   removeWidget(composer_);
119   composer_ = nullptr;
120   removeWidget(details_);
121   details_ = nullptr;
122 
123   wApp->quit();
124 }
125 
discard()126 void ComposeExample::discard()
127 {
128   WContainerWidget *feedback = this->addWidget(std::make_unique<WContainerWidget>());
129   feedback->setStyleClass("feedback");
130 
131   WContainerWidget *horiz = feedback->addWidget(std::make_unique<WContainerWidget>());
132   horiz->addWidget(std::make_unique<WText>("<p>Wise decision! Everyone's mailbox is already full anyway.</p>"));
133 
134   removeWidget(composer_);
135   composer_ = nullptr;
136   removeWidget(details_);
137   details_ = nullptr;
138 
139   wApp->quit();
140 }
141 
createApplication(const WEnvironment & env)142 std::unique_ptr<WApplication> createApplication(const WEnvironment& env)
143 {
144   std::unique_ptr<WApplication> app
145       = std::make_unique<WApplication>(env);
146 
147   // The following assumes composer.xml is in the webserver working directory
148   // (but does not need to be deployed within docroot):
149   app->messageResourceBundle().use(WApplication::appRoot() + "composer");
150 
151   // The following assumes composer.css is deployed in the seb server at the
152   // same location as the application:
153   app->useStyleSheet("composer.css");
154 
155   app->setTitle("Composer example");
156 
157   app->root()->addWidget(std::make_unique<ComposeExample>());
158 
159   return app;
160 }
161 
main(int argc,char ** argv)162 int main(int argc, char **argv)
163 {
164    return WRun(argc, argv, &createApplication);
165 }
166 
167