2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 #include <email-types.h>
20 #include <email-api.h>
21 #include <email-api-network.h>
22 #include <email-api-init.h>
23 #include <email-api-account.h>
25 #include <dpl/log/log.h>
26 #include <dpl/assert.h>
27 #include <Commons/Exception.h>
28 #include <Commons/ThreadPool.h>
29 #include "ReqReceiverMessage.h"
30 #include "EventSendMessage.h"
31 #include "EventMessagingService.h"
32 #include "EventOnSendingFailed.h"
33 #include "MailSender.h"
34 #include "NetworkStatus.h"
35 #include "Messaging.h"
38 const char* DBUS_FILTER_NETWORK_STATUS =
39 "type='signal',interface='User.Email.NetworkStatus'";
45 using namespace WrtDeviceApis::Commons;
46 using namespace WrtDeviceApis::CommonsJavaScript;
48 MailSender& MailSender::getInstance()
50 static MailSender instance;
54 int MailSender::send(const IEmailPtr& mail)
56 Assert(mail && "Mail must not be NULL.");
58 int mailId = mail->convertId(mail->getIdRef());
59 LogDebug("send mailId = " << mailId);
60 SendRequestsIterator it = m_requests.find(mailId);
61 if (m_requests.end() != it) {
62 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
63 "Email: " << mailId << " already requested to be send.");
66 return sendInternal(mail);
69 void MailSender::cancel(int handle)
71 SendRequestsIterator it = m_requests.find(handle);
72 if (m_requests.end() == it) {
73 //ThrowMsg(WrtDeviceApis::Commons::PlatformException,
74 // "Email handle : " << handle << " not found.");
75 LogDebug("Email handle" << handle << " not found!");
80 cancelInternal(it->second);
84 // TODO Copied from former solution, refactor it.
85 void MailSender::OnEventReceived(const DBus::MessageEvent& event)
88 NetworkStatusPtr msg(new NetworkStatus(event.GetArg0()));
89 int mailId = msg->getMailId();
90 LogDebug("status : " << msg->getStatus() << " mailId : " << mailId);
93 if ( msg->getStatus() == NOTI_SEND_FINISH || msg->getStatus() == NOTI_SEND_FAIL)
96 SendRequestsIterator it = m_requests.begin();
97 for (; it != m_requests.end() ; it++)
99 if ( it->second.mail->getUID() == mailId)
102 LogDebug("handle : " << handle);
107 if (msg->getStatus() == NOTI_SEND_FAIL)
109 LogDebug(" Error Code : " << msg->getErrorCode());
114 if ( msg->getStatus() == NOTI_SEND_START )
116 LogDebug("NOTI_SEND_START");
118 else if ( msg->getStatus() == NOTI_SEND_CANCEL )
120 LogDebug("NOTI_SEND_CANCEL");
126 LogDebug("handle : " << handle);
128 SendRequestsIterator it = m_requests.find(handle); //find reqeuset
129 if (m_requests.end() != it) {
130 switch (msg->getStatus()) {
131 case NOTI_SEND_START:
132 LogInfo("Start sending e-mail: " << mailId);
135 case NOTI_SEND_FINISH:
137 const IEmailPtr& mail = it->second.mail;
138 //EventSendMessageReqReceiver* requestReceiver = mail->getRequestReceiver();
139 EventMessagingServiceReqReceiver* requestReceiver = mail->getRequestReceiver();
141 if (requestReceiver) {
142 //EventSendMessagePtr event = mail->getSendMessageEvent();
143 EventMessagingServicePtr event = mail->getMessagingServiceEvent();
146 for (size_t i = 0; i < mail->getToRecipients().getRecipientSize(); ++i) {
147 event->m_successRecipients.push_back(mail->getToRecipients().getRecipient(i));
149 for (size_t i = 0; i < mail->getCcRecipients().getRecipientSize(); ++i) {
150 event->m_successRecipients.push_back(mail->getCcRecipients().getRecipient(i));
152 for (size_t i = 0; i < mail->getBccRecipients().getRecipientSize(); ++i) {
153 event->m_successRecipients.push_back(mail->getBccRecipients().getRecipient(i));
156 requestReceiver->ManualAnswer(event);
160 mail->setMessageStatus(MESSAGE_STATUS_SENT);
161 LogInfo("E-mail sent: " << mailId);
162 m_requests.erase(mailId);
168 const IEmailPtr& mail = it->second.mail;
169 EventOnSendingFailedEmitterPtr emitter = mail->getEmitter();
170 //EventSendMessageReqReceiver *requestReceiver = mail->getRequestReceiver();
171 EventMessagingServiceReqReceiver* requestReceiver = mail->getRequestReceiver();
173 EventOnSendingFailedPtr event(
174 new EventOnSendingFailed()
176 switch (msg->getErrorCode()) {
177 case EMAIL_ERROR_NO_SIM_INSERTED:
178 case EMAIL_ERROR_FLIGHT_MODE:
180 EventOnSendingFailed::NO_NETWORKING
184 case EMAIL_ERROR_SMTP_SEND_FAILURE:
185 case EMAIL_ERROR_NO_SUCH_HOST:
186 case EMAIL_ERROR_CONNECTION_FAILURE:
187 case EMAIL_ERROR_CONNECTION_BROKEN:
188 case EMAIL_ERROR_INVALID_SERVER:
189 case EMAIL_ERROR_NO_RESPONSE:
191 EventOnSendingFailed::NO_CONNECTION
196 event->setError(EventOnSendingFailed::UNKNOWN);
198 emitter->emit(event);
199 } else if (requestReceiver) {
200 //EventSendMessagePtr event = mail->getSendMessageEvent();
201 EventMessagingServicePtr event = mail->getMessagingServiceEvent();
202 event->setExceptionCode(
203 WrtDeviceApis::Commons::ExceptionCodes::UnknownException
205 requestReceiver->ManualAnswer(event);
207 mail->setMessageStatus(MESSAGE_STATUS_FAILED);
209 LogInfo("Sending e-mail: " << mailId <<
210 " failed with error: " << msg->getErrorCode());
211 m_requests.erase(mailId);
218 MailSender::MailSender() :
219 m_dbusThread(new DPL::Thread()),
220 m_dbus(new DBus::Connection())
224 m_dbus->setWorkerThread(m_dbusThread.Get());
225 m_dbus->AddListener(this);
226 m_dbus->SwitchAllListenersToThread(
227 ThreadPool::getInstance().getThreadRef(ThreadEnum::MESSAGING_THREAD)
229 m_dbus->addFilter(DBUS_FILTER_NETWORK_STATUS);
230 m_dbus->open(DBUS_BUS_SYSTEM);
232 //start email service
233 if (EMAIL_ERROR_NONE == email_service_begin()) {
234 LogDebug("Email service Begin\n");
235 if (EMAIL_ERROR_NONE == email_open_db()) {
236 LogDebug("Email open DB success\n");
239 LogDebug("Email open DB failed\n");
243 LogDebug("Email service not started\n");
248 MailSender::~MailSender()
250 m_dbus->RemoveListener(this);
253 m_dbusThread->Quit();
256 //close email service
257 if (EMAIL_ERROR_NONE == email_close_db()) {
258 LogDebug("Email Close DB Success\n");
259 if (EMAIL_ERROR_NONE == email_service_end()){
260 LogDebug("Email service close Success\n");
263 LogDebug("Email service end failed\n");
267 LogDebug("Email Close DB failed\n");
272 int MailSender::sendInternal(const IEmailPtr& mail)
274 int mailId = mail->convertId(mail->getIdRef());
276 email_option_t options = {};
277 options.keep_local_copy = 1;
280 int error = email_send_mail(mailId,
283 if (EMAIL_ERROR_NONE != error) {
284 LogDebug("Send Fail error = " << error );
285 m_requests.erase(mailId);
286 mail->setMessageStatus(MESSAGE_STATUS_SENDING);
287 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
288 "Failed to initialize send request. [" << error << "]");
293 m_requests.insert(std::make_pair(email_handle, SendRequestData(email_handle, mail)));
296 LogDebug("emf Handle : " << email_handle
297 << "requests size :" << m_requests.size() );
302 void MailSender::cancelInternal(const SendRequestData& data)
304 int error = email_cancel_job(data.mail->getAccountID(), data.handle,EMAIL_CANCELED_BY_USER);
305 if (EMAIL_ERROR_NONE != error) {
306 ThrowMsg(WrtDeviceApis::Commons::PlatformException,
307 "Couldn't cancel sending for email: " <<
308 data.mail->getIdRef());
311 m_requests.erase(data.handle);