From: Maciek Blim Date: Mon, 22 Dec 2014 13:35:39 +0000 (+0100) Subject: [Messaging] addMessagesListener - messageadded messageupdated (for emails) X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~735 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f3c4119037508dd988148989e162042553ce1b8;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Messaging] addMessagesListener - messageadded messageupdated (for emails) Change-Id: I33ba7c429862b9bbb537842caf0c6239428244e7 Signed-off-by: Maciek Blim --- diff --git a/src/messaging/DBus/MessageProxy.cpp b/src/messaging/DBus/MessageProxy.cpp index 71373c8b..85feaa49 100644 --- a/src/messaging/DBus/MessageProxy.cpp +++ b/src/messaging/DBus/MessageProxy.cpp @@ -109,68 +109,71 @@ void MessageProxy::signalCallback(GDBusConnection *connection, void MessageProxy::handleEmailEvent(int account_id, int mail_id, int thread_id, int event) { -/* - * LoggerD("Enter"); - * - * if(NOTI_MAIL_UPDATE == event) { - * //getting thread_id from message - * email_mail_data_t *mail_data = NULL; - * - * if(EMAIL_ERROR_NONE != email_get_mail_data(mail_id, &mail_data)) { - * if (mail_data) email_free_mail_data(&mail_data, 1); - * - * LoggerE("Failed to get mail data during setting conversation id in MessageProxy."); - * return; - * } - * - * thread_id = mail_data->thread_id; - * - * if(EMAIL_ERROR_NONE != email_free_mail_data(&mail_data,1)) { - * LoggerE("Failed to free mail data memory"); - * } - * } - * - * email_mail_data_t* mail_data = EmailManager::getInstance().loadMessage(mail_id); - * if (mail_data == NULL) { - * throw common::UnknownException("Failed to load email"); - * } - * std::shared_ptr msg = Message::convertPlatformEmailToObject(*mail_data); - * ConversationPtr conv = MessageConversation::convertEmailConversationToObject( - * thread_id); - * - * EventMessages* eventMsg = new EventMessages(); - * eventMsg->service_type = MessageType::EMAIL; - * eventMsg->service_id = account_id; - * eventMsg->items.push_back(msg); - * EventConversations* eventConv = new EventConversations(); - * eventConv->service_type = MessageType::EMAIL; - * eventConv->service_id = account_id; - * eventConv->items.push_back(conv); - * switch (event) { - * case NOTI_MAIL_ADD: - * ChangeListenerContainer::getInstance().callMessageAdded(eventMsg); - * if (conv->getMessageCount() == 1) { - * LoggerD("This thread is new, triggering conversationAdded"); - * ChangeListenerContainer::getInstance().callConversationAdded(eventConv); - * } else { - * LoggerD("This thread is not new, but it's updated"); - * ChangeListenerContainer::getInstance().callConversationUpdated(eventConv); - * } - * break; - * case NOTI_MAIL_UPDATE: - * ChangeListenerContainer::getInstance().callMessageUpdated(eventMsg); - * ChangeListenerContainer::getInstance().callConversationUpdated(eventConv); - * break; - * default: - * LoggerW("Unknown event type: %d", event); - * break; - * - * } - * delete eventMsg; - * delete eventConv; - * - * EmailManager::getInstance().freeMessage(mail_data); - */ + LoggerD("Enter"); + + if(NOTI_MAIL_UPDATE == event) { + //getting thread_id from message + email_mail_data_t *mail_data = NULL; + + if(EMAIL_ERROR_NONE != email_get_mail_data(mail_id, &mail_data)) { + if (mail_data) email_free_mail_data(&mail_data, 1); + + LoggerE("Failed to get mail data during setting conversation id in MessageProxy."); + return; + } + + thread_id = mail_data->thread_id; + + if(EMAIL_ERROR_NONE != email_free_mail_data(&mail_data,1)) { + LoggerE("Failed to free mail data memory"); + } + } + + email_mail_data_t* mail_data = EmailManager::getInstance().loadMessage(mail_id); + if (mail_data == NULL) { + throw common::UnknownException("Failed to load email"); + } + std::shared_ptr msg = Message::convertPlatformEmailToObject(*mail_data); + // TODO + //ConversationPtr conv = MessageConversation::convertEmailConversationToObject( + //thread_id); + + EventMessages* eventMsg = new EventMessages(); + eventMsg->service_type = MessageType::EMAIL; + eventMsg->service_id = account_id; + eventMsg->items.push_back(msg); + // TODO + //EventConversations* eventConv = new EventConversations(); + //eventConv->service_type = MessageType::EMAIL; + //eventConv->service_id = account_id; + //eventConv->items.push_back(conv); + switch (event) { + case NOTI_MAIL_ADD: + ChangeListenerContainer::getInstance().callMessageAdded(eventMsg); + // TODO + //if (conv->getMessageCount() == 1) { + //LoggerD("This thread is new, triggering conversationAdded"); + //ChangeListenerContainer::getInstance().callConversationAdded(eventConv); + //} else { + //LoggerD("This thread is not new, but it's updated"); + //ChangeListenerContainer::getInstance().callConversationUpdated(eventConv); + //} + break; + case NOTI_MAIL_UPDATE: + ChangeListenerContainer::getInstance().callMessageUpdated(eventMsg); + // TODO + //ChangeListenerContainer::getInstance().callConversationUpdated(eventConv); + break; + default: + LoggerW("Unknown event type: %d", event); + break; + + } + delete eventMsg; + // TODO + //delete eventConv; + + EmailManager::getInstance().freeMessage(mail_data); } std::vector getMailIds(const std::string& idsString) diff --git a/src/messaging/change_listener_container.cc b/src/messaging/change_listener_container.cc index 5278df1e..85907110 100644 --- a/src/messaging/change_listener_container.cc +++ b/src/messaging/change_listener_container.cc @@ -158,69 +158,65 @@ void ChangeListenerContainer::removeChangeListener(long id) // --- Callback invoking functions --- // -- for message -- -/* - *void ChangeListenerContainer::callMessageAdded(EventMessages* event) - *{ - * LoggerD("Entered"); - * - * if(MessageType(SMS) == event->service_type || - * MessageType(MMS) == event->service_type) { - * LoggerD("Calling messageadded for ShortMessage"); - * MCLmap callbacksCopy; - * { - * std::lock_guard shortlock(m_short_lock); - * callbacksCopy = m_short_message_callbacks; - * } - * callAdded( - * callbacksCopy, event); - * } - * else if(MessageType(EMAIL) == event->service_type) { - * LoggerD("Calling messageadded for Email"); - * MCLmap callbacksCopy; - * { - * std::lock_guard maillock(m_email_lock); - * callbacksCopy = m_email_message_callbacks; - * } - * callAdded( - * callbacksCopy, event); - * } - * else { - * LoggerW("Invalid event type (%d) - no callback called.", event->service_type); - * } - *} - */ +void ChangeListenerContainer::callMessageAdded(EventMessages* event) +{ + LoggerD("Entered"); -/* - *void ChangeListenerContainer::callMessageUpdated(EventMessages* event) - *{ - * LoggerD("Entered"); - * - * if(MessageType(SMS) == event->service_type || - * MessageType(MMS) == event->service_type) { - * LoggerD("Calling messageupdated for ShortMessage"); - * MCLmap callbacksCopy; - * { - * std::lock_guard shortlock(m_short_lock); - * callbacksCopy = m_short_message_callbacks; - * } - * callUpdated( - * callbacksCopy, event); - * } - * else if(MessageType(EMAIL) == event->service_type) { - * LoggerD("Calling messageupdated for Email"); - * MCLmap callbacksCopy; - * { - * std::lock_guard maillock(m_email_lock); - * callbacksCopy = m_email_message_callbacks; - * } - * callUpdated( - * callbacksCopy, event); - * } - * else { - * LoggerW("Invalid event type (%d) - no callback called.", event->service_type); - * } - *} - */ + if(MessageType(SMS) == event->service_type || + MessageType(MMS) == event->service_type) { + //LoggerD("Calling messageadded for ShortMessage"); + //MCLmap callbacksCopy; + //{ + //std::lock_guard shortlock(m_short_lock); + //callbacksCopy = m_short_message_callbacks; + //} + //callAdded( + //callbacksCopy, event); + } + else if(MessageType(EMAIL) == event->service_type) { + LoggerD("Calling messageadded for Email"); + MCLmap callbacksCopy; + { + std::lock_guard maillock(m_email_lock); + callbacksCopy = m_email_message_callbacks; + } + callAdded( + callbacksCopy, event); + } + else { + LoggerW("Invalid event type (%d) - no callback called.", event->service_type); + } +} + +void ChangeListenerContainer::callMessageUpdated(EventMessages* event) +{ + LoggerD("Entered"); + + if(MessageType(SMS) == event->service_type || + MessageType(MMS) == event->service_type) { + //LoggerD("Calling messageupdated for ShortMessage"); + //MCLmap callbacksCopy; + //{ + //std::lock_guard shortlock(m_short_lock); + //callbacksCopy = m_short_message_callbacks; + //} + //callUpdated( + //callbacksCopy, event); + } + else if(MessageType(EMAIL) == event->service_type) { + LoggerD("Calling messageupdated for Email"); + MCLmap callbacksCopy; + { + std::lock_guard maillock(m_email_lock); + callbacksCopy = m_email_message_callbacks; + } + callUpdated( + callbacksCopy, event); + } + else { + LoggerW("Invalid event type (%d) - no callback called.", event->service_type); + } +} void ChangeListenerContainer::callMessageRemoved(EventMessages* event) { diff --git a/src/messaging/change_listener_container.h b/src/messaging/change_listener_container.h index 0fe650e4..1c4e2856 100644 --- a/src/messaging/change_listener_container.h +++ b/src/messaging/change_listener_container.h @@ -91,8 +91,8 @@ class ChangeListenerContainer { void removeChangeListener(long id); // Methods used to invoke registered listeners - //void callMessageAdded(EventMessages* event); - //void callMessageUpdated(EventMessages* event); + void callMessageAdded(EventMessages* event); + void callMessageUpdated(EventMessages* event); void callMessageRemoved(EventMessages* event); //void callConversationAdded(EventConversations* event); //void callConversationUpdated(EventConversations* event); @@ -151,63 +151,59 @@ class ChangeListenerContainer { * Template function for calling "added" callback for all listeners * from given collection with given event. * */ - /* - *template void callAdded( - * std::map>& collection, - * U* event) { - * typename std::map>::iterator itstart = collection.begin(); - * typename std::map>::iterator itend = collection.end(); - * try { - * for (; itstart != itend; ++itstart) { - * auto callback = (*itstart).second; - * if (callback->getServiceType() == event->service_type - * && callback->getServiceId() == event->service_id) { - * LoggerD("Found callback for given service id (%d) and type (%d)", - * event->service_id, event->service_type); - * //@todo filter msgs - * callback->added(event->items); - * } - * } - * }catch (const Common::BasePlatformException &err) { - * LoggerE("callAdded failed, %s: %s", err.getName().c_str(), - * err.getMessage().c_str()); - * } - * catch (...) { - * LoggerE("callAdded failed"); - * } - *} - */ + template void callAdded( + std::map>& collection, + U* event) { + typename std::map>::iterator itstart = collection.begin(); + typename std::map>::iterator itend = collection.end(); + try { + for (; itstart != itend; ++itstart) { + auto callback = (*itstart).second; + if (callback->getServiceType() == event->service_type + && callback->getServiceId() == event->service_id) { + LoggerD("Found callback for given service id (%d) and type (%d)", + event->service_id, event->service_type); + //@todo filter msgs + callback->added(event->items); + } + } + }catch (const common::PlatformException &err) { + LoggerE("callAdded failed, %s: %s", err.name().c_str(), + err.message().c_str()); + } + catch (...) { + LoggerE("callAdded failed"); + } + } /** * Template function for calling "updated" callback for all listeners * from given collection with given event. * */ - /* - *template void callUpdated( - * std::map>& collection, - * U* event) { - * typename std::map>::iterator itstart = collection.begin(); - * typename std::map>::iterator itend = collection.end(); - * try { - * for (; itstart != itend; ++itstart) { - * auto callback = (*itstart).second; - * if (callback->getServiceType() == event->service_type - * && callback->getServiceId() == event->service_id) { - * LoggerD("Found callback for given service id (%d) and type (%d)", - * event->service_id, event->service_type); - * //@todo filter msgs - * callback->updated(event->items); - * } - * } - * }catch (const Common::BasePlatformException &err) { - * LoggerE("callUpdated failed, %s: %s", err.getName().c_str(), - * err.getMessage().c_str()); - * } - * catch (...) { - * LoggerE("callUpdated failed"); - * } - *} - */ + template void callUpdated( + std::map>& collection, + U* event) { + typename std::map>::iterator itstart = collection.begin(); + typename std::map>::iterator itend = collection.end(); + try { + for (; itstart != itend; ++itstart) { + auto callback = (*itstart).second; + if (callback->getServiceType() == event->service_type + && callback->getServiceId() == event->service_id) { + LoggerD("Found callback for given service id (%d) and type (%d)", + event->service_id, event->service_type); + //@todo filter msgs + callback->updated(event->items); + } + } + }catch (const common::PlatformException &err) { + LoggerE("callUpdated failed, %s: %s", err.name().c_str(), + err.message().c_str()); + } + catch (...) { + LoggerE("callUpdated failed"); + } + } /** * Template function for calling "removed" callback for all listeners diff --git a/src/messaging/messages_change_callback.cc b/src/messaging/messages_change_callback.cc index 5307e409..dc41ff49 100644 --- a/src/messaging/messages_change_callback.cc +++ b/src/messaging/messages_change_callback.cc @@ -97,53 +97,67 @@ MessagePtrVector MessagesChangeCallback::filterMessages( } } -/* - *void MessagesChangeCallback::added(const MessagePtrVector& msgs) - *{ - * LoggerD("Entered num messages: %d", msgs.size()); - * if (!m_is_act) { - * return; - * } - * JSContextRef ctx = m_callback_data.getContext(); - * CHECK_CURRENT_CONTEXT_ALIVE(ctx) - * MessagePtrVector filtered_msgs = filterMessages(m_filter, msgs, m_service_id); - * //cancel callback only if filter did remove all messages - * //if callback was called with empty msgs list, call it - * if (msgs.size() > 0 && filtered_msgs.size() == 0) { - * LoggerD("All messages were filtered out, not calling callback"); - * return; - * } - * JSObjectRef js_obj = JSMessage::messageVectorToJSObjectArray( - * ctx, filtered_msgs); - * - * LoggerD("Calling:%s with:%d added messages", MESSAGESADDED, - * filtered_msgs.size()); - * m_callback_data.invokeCallback(MESSAGESADDED, js_obj); - *} - * - *void MessagesChangeCallback::updated(const MessagePtrVector& msgs) - *{ - * LoggerD("Entered num messages: %d", msgs.size()); - * if (!m_is_act) { - * return; - * } - * JSContextRef ctx = m_callback_data.getContext(); - * CHECK_CURRENT_CONTEXT_ALIVE(ctx) - * MessagePtrVector filtered_msgs = filterMessages(m_filter, msgs, m_service_id); - * //cancel callback only if filter did remove all messages - * //if callback was called with empty msgs list, call it - * if (msgs.size() > 0 && filtered_msgs.size() == 0) { - * LoggerD("All messages were filtered out, not calling callback"); - * return; - * } - * JSObjectRef js_obj = JSMessage::messageVectorToJSObjectArray( - * ctx, filtered_msgs); - * - * LoggerD("Calling:%s with:%d updated messages", MESSAGESUPDATED, - * filtered_msgs.size()); - * m_callback_data.invokeCallback(MESSAGESUPDATED, js_obj); - *} - */ +void MessagesChangeCallback::added(const MessagePtrVector& msgs) +{ + LoggerD("Entered num messages: %d", msgs.size()); + if (!m_is_act) { + return; + } + MessagePtrVector filtered_msgs = filterMessages(m_filter, msgs, m_service_id); + //cancel callback only if filter did remove all messages + //if callback was called with empty msgs list, call it + if (msgs.size() > 0 && filtered_msgs.size() == 0) { + LoggerD("All messages were filtered out, not calling callback"); + return; + } + + picojson::array array; + auto each = [&array] (std::shared_ptr m)->void { + array.push_back(MessagingUtil::messageToJson(m)); + }; + + for_each(filtered_msgs.begin(), filtered_msgs.end(), each); + + LoggerD("Calling:%s with:%d added messages", MESSAGESADDED, + filtered_msgs.size()); + + auto json = m_callback_data.getJson(); + picojson::object& obj = json->get(); + obj[JSON_ACTION] = picojson::value(MESSAGESADDED); + obj[JSON_DATA] = picojson::value(array); + MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); +} + +void MessagesChangeCallback::updated(const MessagePtrVector& msgs) +{ + LoggerD("Entered num messages: %d", msgs.size()); + if (!m_is_act) { + return; + } + MessagePtrVector filtered_msgs = filterMessages(m_filter, msgs, m_service_id); + //cancel callback only if filter did remove all messages + //if callback was called with empty msgs list, call it + if (msgs.size() > 0 && filtered_msgs.size() == 0) { + LoggerD("All messages were filtered out, not calling callback"); + return; + } + + picojson::array array; + auto each = [&array] (std::shared_ptr m)->void { + array.push_back(MessagingUtil::messageToJson(m)); + }; + + for_each(filtered_msgs.begin(), filtered_msgs.end(), each); + + LoggerD("Calling:%s with:%d updated messages", MESSAGESUPDATED, + filtered_msgs.size()); + + auto json = m_callback_data.getJson(); + picojson::object& obj = json->get(); + obj[JSON_ACTION] = picojson::value(MESSAGESUPDATED); + obj[JSON_DATA] = picojson::value(array); + MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); +} void MessagesChangeCallback::removed(const MessagePtrVector& msgs) { diff --git a/src/messaging/messages_change_callback.h b/src/messaging/messages_change_callback.h index 772c1fda..5270823a 100644 --- a/src/messaging/messages_change_callback.h +++ b/src/messaging/messages_change_callback.h @@ -30,8 +30,8 @@ public: MessageType service_type); virtual ~MessagesChangeCallback(); - //void added(const MessagePtrVector& messages); - //void updated(const MessagePtrVector& messages); + void added(const MessagePtrVector& messages); + void updated(const MessagePtrVector& messages); void removed(const MessagePtrVector& messages); void setFilter(tizen::AbstractFilterPtr filter);