[Messaging] addMessagesListener - messageadded messageupdated (for emails)
authorMaciek Blim <m.blim@samsung.com>
Mon, 22 Dec 2014 13:35:39 +0000 (14:35 +0100)
committerJerzy Pabich <j.pabich@samsung.com>
Wed, 24 Dec 2014 07:02:40 +0000 (16:02 +0900)
Change-Id: I33ba7c429862b9bbb537842caf0c6239428244e7
Signed-off-by: Maciek Blim <m.blim@samsung.com>
src/messaging/DBus/MessageProxy.cpp
src/messaging/change_listener_container.cc
src/messaging/change_listener_container.h
src/messaging/messages_change_callback.cc
src/messaging/messages_change_callback.h

index 71373c8b8962abb83dce05f0082813ce9d9d1172..85feaa498dfd2e6a9a81c22c27b3f05846351435 100644 (file)
@@ -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<Message> 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<Message> 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<int> getMailIds(const std::string& idsString)
index 5278df1e589ec5a2e856656ad23884083db1450e..859071106c3c77b6e2c0384a70a720aa0c5407de 100644 (file)
@@ -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<std::mutex> shortlock(m_short_lock);
- *            callbacksCopy = m_short_message_callbacks;
- *        }
- *        callAdded<MessagesChangeCallback, EventMessages>(
- *                callbacksCopy, event);
- *    }
- *    else if(MessageType(EMAIL) == event->service_type) {
- *        LoggerD("Calling messageadded for Email");
- *        MCLmap callbacksCopy;
- *        {
- *            std::lock_guard<std::mutex> maillock(m_email_lock);
- *            callbacksCopy = m_email_message_callbacks;
- *        }
- *        callAdded<MessagesChangeCallback, EventMessages>(
- *                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<std::mutex> shortlock(m_short_lock);
- *            callbacksCopy = m_short_message_callbacks;
- *        }
- *        callUpdated<MessagesChangeCallback, EventMessages>(
- *                callbacksCopy, event);
- *    }
- *    else if(MessageType(EMAIL) == event->service_type) {
- *        LoggerD("Calling messageupdated for Email");
- *        MCLmap callbacksCopy;
- *        {
- *            std::lock_guard<std::mutex> maillock(m_email_lock);
- *            callbacksCopy = m_email_message_callbacks;
- *        }
- *        callUpdated<MessagesChangeCallback, EventMessages>(
- *                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<std::mutex> shortlock(m_short_lock);
+            //callbacksCopy = m_short_message_callbacks;
+        //}
+        //callAdded<MessagesChangeCallback, EventMessages>(
+                //callbacksCopy, event);
+    }
+    else if(MessageType(EMAIL) == event->service_type) {
+        LoggerD("Calling messageadded for Email");
+        MCLmap callbacksCopy;
+        {
+            std::lock_guard<std::mutex> maillock(m_email_lock);
+            callbacksCopy = m_email_message_callbacks;
+        }
+        callAdded<MessagesChangeCallback, EventMessages>(
+                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<std::mutex> shortlock(m_short_lock);
+            //callbacksCopy = m_short_message_callbacks;
+        //}
+        //callUpdated<MessagesChangeCallback, EventMessages>(
+                //callbacksCopy, event);
+    }
+    else if(MessageType(EMAIL) == event->service_type) {
+        LoggerD("Calling messageupdated for Email");
+        MCLmap callbacksCopy;
+        {
+            std::lock_guard<std::mutex> maillock(m_email_lock);
+            callbacksCopy = m_email_message_callbacks;
+        }
+        callUpdated<MessagesChangeCallback, EventMessages>(
+                callbacksCopy, event);
+    }
+    else {
+        LoggerW("Invalid event type (%d) - no callback called.", event->service_type);
+    }
+}
 
 void ChangeListenerContainer::callMessageRemoved(EventMessages* event)
 {
index 0fe650e4906b64f16a50f565df9df87248e2f32b..1c4e28567d003bdc54910471bd7b4b3feb0f169b 100644 (file)
@@ -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<class T, class U> void callAdded(
-         *        std::map<long,std::shared_ptr<T>>& collection,
-         *        U* event) {
-         *    typename std::map<long,std::shared_ptr<T>>::iterator itstart = collection.begin();
-         *    typename std::map<long,std::shared_ptr<T>>::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<class T, class U> void callAdded(
+                std::map<long,std::shared_ptr<T>>& collection,
+                U* event) {
+            typename std::map<long,std::shared_ptr<T>>::iterator itstart = collection.begin();
+            typename std::map<long,std::shared_ptr<T>>::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<class T, class U> void callUpdated(
-         *        std::map<long,std::shared_ptr<T>>& collection,
-         *        U* event) {
-         *    typename std::map<long,std::shared_ptr<T>>::iterator itstart = collection.begin();
-         *    typename std::map<long,std::shared_ptr<T>>::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<class T, class U> void callUpdated(
+                std::map<long,std::shared_ptr<T>>& collection,
+                U* event) {
+            typename std::map<long,std::shared_ptr<T>>::iterator itstart = collection.begin();
+            typename std::map<long,std::shared_ptr<T>>::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
index 5307e4093684da43072f6619f17bb49120d610b0..dc41ff49aa993b89c5c2f2d69ade9ead71a9ed34 100644 (file)
@@ -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<Message> 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<picojson::object>();
+    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<Message> 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<picojson::object>();
+    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)
 {
index 772c1fda40ed01f38bc7a2d84111b4235d98a13d..5270823ae5cd33996676aab4c5b0c1fe362f7e62 100644 (file)
@@ -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);