[Messaging] Added syncFolder
authorJerzy Pabich <j.pabich@samsung.com>
Wed, 31 Dec 2014 07:50:03 +0000 (08:50 +0100)
committerJerzy Pabich <j.pabich@samsung.com>
Wed, 31 Dec 2014 07:51:56 +0000 (08:51 +0100)
Change-Id: I5286ca8cabac4e69af9163c6ece50d3ea05cdc09
Signed-off-by: Jerzy Pabich <j.pabich@samsung.com>
src/messaging/email_manager.cc
src/messaging/email_manager.h
src/messaging/message_service.cc
src/messaging/message_service.h
src/messaging/message_service_email.cc
src/messaging/message_service_email.h
src/messaging/messaging_api.js
src/messaging/messaging_instance.cc
src/messaging/messaging_util.cc
src/messaging/messaging_util.h

index 098f55aced70c37a96e6ed0f99eb03c83a4df9bd..7b56749e80ec3ae77b5e0321e05edd0f526a59d9 100644 (file)
@@ -691,83 +691,83 @@ void EmailManager::sync(void* data)
 
 //#################################### ^sync ###################################
 
-////################################## syncFolder: ###############################
-//
-//void EmailManager::syncFolder(SyncFolderCallbackData* callback)
-//{
-//    LoggerD("Entered");
-//    if(!callback){
-//        LoggerE("Callback is null");
-//        return;
-//    }
-//
-//    const long op_id = callback->getOpId();
-//    m_proxy_sync->addCallback(op_id, callback);
-//
-//    if(!callback->getMessageFolder())
-//    {
-//        LoggerE("Callback's messageFolder is null");
-//        m_proxy_sync->removeCallback(op_id);
-//        return;
-//    }
-//
-//    int err = EMAIL_ERROR_NONE;
-//
-//    email_mailbox_t* mailbox = NULL;
-//
-//    const std::string folder_id_str = callback->getMessageFolder()->getId();
-//    int folder_id = 0;
-//    std::istringstream(folder_id_str) >> folder_id;
-//
-//    err = email_get_mailbox_by_mailbox_id(folder_id, &mailbox);
-//    if (EMAIL_ERROR_NONE != err || NULL == mailbox) {
-//        LoggerE("Couldn't get mailbox, error code: %d", err);
-//        m_proxy_sync->removeCallback(op_id);
-//        return;
-//    }
-//
-//    try {
-//        const int limit = callback->getLimit();
-//        int slot_size = -1;
-//
-//        if (limit < 0) {
-//            slot_size = m_slot_size;
-//        }
-//        else {
-//            slot_size = limit;
-//        }
-//
-//        err = email_set_mail_slot_size(0, 0, slot_size);
-//        if(EMAIL_ERROR_NONE != err){
-//            LoggerE("Email set slot size failed, %d", err);
-//            throw UnknownException("Email set slot size failed");
-//        }
-//
-//        int op_handle = -1;
-//        const int account_id = callback->getAccountId();
-//        err = email_sync_header(account_id, mailbox->mailbox_id, &op_handle);
-//        if(EMAIL_ERROR_NONE != err) {
-//            LoggerE("Email sync header failed, %d", err);
-//            m_proxy_sync->removeCallback(op_id);
-//            throw UnknownException("Email sync header failed");
-//        }
-//        callback->setOperationHandle(op_handle);
-//    }
-//    catch (const BasePlatformException& e) {
-//        LoggerE("Exception in syncFolder");
-//    }
-//
-//    if (NULL != mailbox)
-//    {
-//        err = email_free_mailbox(&mailbox , 1);
-//        if  (EMAIL_ERROR_NONE !=  err) {
-//            LoggerD("Failed to email_free_mailbox - err:%d ", err);
-//        }
-//        mailbox = NULL;
-//    }
-//}
-//
-////#################################### ^syncFolder #############################
+//################################## syncFolder: ###############################
+
+void EmailManager::syncFolder(SyncFolderCallbackData* callback)
+{
+    LoggerD("Entered");
+    if(!callback){
+        LoggerE("Callback is null");
+        return;
+    }
+
+    const long op_id = callback->getOpId();
+    m_proxy_sync->addCallback(op_id, callback);
+
+    if(!callback->getMessageFolder())
+    {
+        LoggerE("Callback's messageFolder is null");
+        m_proxy_sync->removeCallback(op_id);
+        return;
+    }
+
+    int err = EMAIL_ERROR_NONE;
+
+    email_mailbox_t* mailbox = NULL;
+
+    const std::string folder_id_str = callback->getMessageFolder()->getId();
+    int folder_id = 0;
+    std::istringstream(folder_id_str) >> folder_id;
+
+    err = email_get_mailbox_by_mailbox_id(folder_id, &mailbox);
+    if (EMAIL_ERROR_NONE != err || NULL == mailbox) {
+        LoggerE("Couldn't get mailbox, error code: %d", err);
+        m_proxy_sync->removeCallback(op_id);
+        return;
+    }
+
+    try {
+        const int limit = callback->getLimit();
+        int slot_size = -1;
+
+        if (limit < 0) {
+            slot_size = m_slot_size;
+        }
+        else {
+            slot_size = limit;
+        }
+
+        err = email_set_mail_slot_size(0, 0, slot_size);
+        if(EMAIL_ERROR_NONE != err){
+            LoggerE("Email set slot size failed, %d", err);
+            throw UnknownException("Email set slot size failed");
+        }
+
+        int op_handle = -1;
+        const int account_id = callback->getAccountId();
+        err = email_sync_header(account_id, mailbox->mailbox_id, &op_handle);
+        if(EMAIL_ERROR_NONE != err) {
+            LoggerE("Email sync header failed, %d", err);
+            m_proxy_sync->removeCallback(op_id);
+            throw UnknownException("Email sync header failed");
+        }
+        callback->setOperationHandle(op_handle);
+    }
+    catch (const PlatformException& e) {
+        LoggerE("Exception in syncFolder");
+    }
+
+    if (NULL != mailbox)
+    {
+        err = email_free_mailbox(&mailbox , 1);
+        if  (EMAIL_ERROR_NONE !=  err) {
+            LoggerD("Failed to email_free_mailbox - err:%d ", err);
+        }
+        mailbox = NULL;
+    }
+}
+
+//#################################### ^syncFolder #############################
 
 //################################## stopSync: #################################
 
index 74b5b87849dc0222c245e449d1dbc38c5dc35cb9..eb5a75bbdfcfde4c66f948f4078e89b3809bb902 100644 (file)
@@ -77,7 +77,7 @@ public:
 //    void loadMessageAttachment(MessageAttachmentCallbackData* callback);
 
     void sync(void* data);
-//    void syncFolder(SyncFolderCallbackData* callback);
+    void syncFolder(SyncFolderCallbackData* callback);
     void stopSync(long op_id);
 
 //    void registerStatusCallback(msg_handle_t msg_handle);
index 74497895127cdb7f0dcb990f187df16131ba7704..85db4f01257d918910d5284a7a0f8cacf0e32879 100644 (file)
@@ -307,7 +307,30 @@ int SyncCallbackData::getAccountId() const
     return m_account_id;
 }
 
+//#################### SyncFolderCallbackData ####################
 
+SyncFolderCallbackData::SyncFolderCallbackData()
+{
+    LoggerD("Entered");
+}
+
+SyncFolderCallbackData::~SyncFolderCallbackData()
+{
+    LoggerD("Entered");
+}
+
+void SyncFolderCallbackData::setMessageFolder(
+        std::shared_ptr<MessageFolder> message_folder)
+{
+    m_message_folder = message_folder;
+}
+
+std::shared_ptr<MessageFolder> SyncFolderCallbackData::getMessageFolder() const
+{
+    return m_message_folder;
+}
+
+//#################### MessageService ####################
 
 MessageService::MessageService(int id,
                     MessageType msgType,
@@ -401,7 +424,7 @@ long MessageService::sync(SyncCallbackData *callback)
     throw common::NotSupportedException("Cannot sync with external server");
 }
 
-long MessageService::syncFolder()
+long MessageService::syncFolder(SyncFolderCallbackData *callback)
 {
     // this method should be overwritten by email service
     // for MMS and SMS this function is not supported
index 496382747f4a1c4e0ce686519db67ff27bed8f80..683760513a69659c7a1716b4673949c3fe6e31c9 100755 (executable)
@@ -129,6 +129,18 @@ protected:
     int m_account_id;
 };
 
+class SyncFolderCallbackData : public SyncCallbackData {
+public:
+    SyncFolderCallbackData();
+    virtual ~SyncFolderCallbackData();
+
+    void setMessageFolder(std::shared_ptr<MessageFolder> message_folder);
+    std::shared_ptr<MessageFolder> getMessageFolder() const;
+
+private:
+    std::shared_ptr<MessageFolder> m_message_folder;
+};
+
 class MessageService
 {
 public:
@@ -145,7 +157,7 @@ public:
     virtual void loadMessageBody(MessageBodyCallbackData* callback);
     virtual void loadMessageAttachment();
     virtual long sync(SyncCallbackData *callback);
-    virtual long syncFolder();
+    virtual long syncFolder(SyncFolderCallbackData *callback);
     virtual void stopSync(long op_id);
 
     picojson::object toPicoJS() const;
index ef31cf175d67d70971b595f8ad8bb98767c0e0b3..7ac0d30882e5fc5490ba9509679af4ef8dc9ca6e 100644 (file)
@@ -141,11 +141,47 @@ long MessageServiceEmail::sync(SyncCallbackData *callback)
     return op_id;
 }
 
-long MessageServiceEmail::syncFolder()
+static gboolean syncFolderTask(void* data)
 {
     LoggerD("Entered");
-    //TODO add implementation
-    return 0;
+
+    try {
+        EmailManager::getInstance().syncFolder(
+                static_cast<SyncFolderCallbackData*>(data));
+
+    } catch(const common::PlatformException& exception) {
+        LoggerE("Unhandled exception: %s (%s)!", (exception.name()).c_str(),
+             (exception.message()).c_str());
+    } catch(...) {
+        LoggerE("Unhandled exception!");
+    }
+
+    return FALSE;
+}
+
+long MessageServiceEmail::syncFolder(SyncFolderCallbackData *callback)
+{
+    LoggerD("Entered");
+    if(!callback){
+        LoggerE("Callback is null");
+        throw common::UnknownException("Callback is null");
+    }
+
+    if(!callback->getMessageFolder()) {
+        LoggerE("Message folder is null");
+        throw common::TypeMismatchException("Message folder is null");
+    }
+
+    long op_id = EmailManager::getInstance().getUniqueOpId();
+    callback->setOpId(op_id);
+
+    guint id = g_idle_add(syncFolderTask, callback);
+    if (!id) {
+        LoggerE("g_idle_add fails");
+        delete callback;
+    }
+
+    return op_id;
 }
 
 static gboolean stopSyncTask(void* data)
index c63bb13ac9c7da7e40b2e6c382764bf25159262f..9a9714932fbaa8980486df8f130d2afeff21f542 100755 (executable)
@@ -20,7 +20,7 @@ public:
     virtual void loadMessageBody(MessageBodyCallbackData* callback);
     virtual void loadMessageAttachment();
     virtual long sync(SyncCallbackData *callback);
-    virtual long syncFolder();
+    virtual long syncFolder(SyncFolderCallbackData *callback);
     virtual void stopSync(long op_id);
 };
 
index 9d4dbadc0a4d50ee53898d6c45c7e40f388e791e..84f24a0004c7f7657facfb38619774749dd703ad 100644 (file)
@@ -696,13 +696,8 @@ MessageService.prototype.syncFolder = function () {
         {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
     ]);
 
-    bridge.async({
-        cmd: 'MessageService_syncFolder',
-        args: {
-            folder: args.folder,
-            limit: args.limit
-        }
-    }).then({
+    var self = this;
+    var cid = bridge.listener({
         success: function () {
             if (args.successCallback) {
                 args.successCallback.call(null);
@@ -717,6 +712,16 @@ MessageService.prototype.syncFolder = function () {
             }
         }
     });
+
+    var result = bridge.sync({
+        cmd: 'MessageService_syncFolder',
+        cid: cid,
+        args: {
+            id: self.id,
+            folder: args.folder,
+            limit: args.limit || null
+        }
+    });
 };
 MessageService.prototype.stopSync = function () {
     var args = validator_.validateArgs(arguments, [
index b361981e6f6d5137d7b62d09c2725b6309e918ad..62a32688939e809a2f9af1a58b1946179d3c63e2 100644 (file)
@@ -41,6 +41,7 @@ const char* SYNC_ARGS_ID = "id";
 const char* SYNC_ARGS_LIMIT = "limit";
 
 const char* FUN_MESSAGE_SERVICE_SYNC_FOLDER = "MessageService_syncFolder";
+const char* SYNC_FOLDER_ARGS_ID = "id";
 const char* SYNC_FOLDER_ARGS_FOLDER = "folder";
 const char* SYNC_FOLDER_ARGS_LIMIT = "limit";
 
@@ -116,7 +117,6 @@ MessagingInstance::MessagingInstance()
       REGISTER_ASYNC(FUN_MESSAGE_SERVICE_SEND_MESSAGE, MessageServiceSendMessage);
       REGISTER_ASYNC(FUN_MESSAGE_SERVICE_LOAD_MESSAGE_BODY, MessageServiceLoadMessageBody);
       REGISTER_ASYNC(FUN_MESSAGE_SERVICE_LOAD_MESSAGE_ATTACHMENT, MessageServiceLoadMessageAttachment);
-      REGISTER_ASYNC(FUN_MESSAGE_SERVICE_SYNC_FOLDER, MessageServiceSyncFolder);
       REGISTER_ASYNC(FUN_MESSAGE_STORAGE_ADD_DRAFT_MESSAGE, MessageStorageAddDraft);
       REGISTER_ASYNC(FUN_MESSAGE_STORAGE_FIND_MESSAGES, MessageStorageFindMessages);
       REGISTER_ASYNC(FUN_MESSAGE_STORAGE_REMOVE_MESSAGES, MessageStorageRemoveMessages);
@@ -132,6 +132,7 @@ MessagingInstance::MessagingInstance()
       RegisterSyncHandler(c, std::bind(&MessagingInstance::x, this, _1, _2));
       REGISTER_SYNC(FUN_MESSAGE_SERVICE_SYNC, MessageServiceSync);
       REGISTER_SYNC(FUN_MESSAGE_SERVICE_STOP_SYNC, MessageServiceStopSync);
+      REGISTER_SYNC(FUN_MESSAGE_SERVICE_SYNC_FOLDER, MessageServiceSyncFolder);
       REGISTER_SYNC(FUN_MESSAGE_STORAGE_ADD_MESSAGES_CHANGE_LISTENER, MessageStorageAddMessagesChangeListener);
       REGISTER_SYNC(FUN_MESSAGE_STORAGE_REMOVE_CHANGE_LISTENER, MessageStorageRemoveChangeListener);
     #undef REGISTER_SYNC
@@ -280,6 +281,33 @@ void MessagingInstance::MessageServiceSyncFolder(const picojson::value& args,
         picojson::object& out)
 {
     LoggerD("Entered");
+
+    picojson::object data = args.get(JSON_DATA).get<picojson::object>();
+    picojson::value v_id = data.at(SYNC_FOLDER_ARGS_ID);
+    picojson::value v_folder = data.at(SYNC_FOLDER_ARGS_FOLDER);
+    picojson::value v_limit = data.at(SYNC_FOLDER_ARGS_LIMIT);
+    const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
+
+    int id = static_cast<int>(v_id.get<double>());
+    long limit = 0;
+    if (v_limit.is<double>()) {
+        limit = static_cast<long>(v_limit.get<double>());
+    }
+
+    auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
+    picojson::object& obj = json->get<picojson::object>();
+    obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
+
+    SyncFolderCallbackData *callback = new SyncFolderCallbackData();
+    callback->setJson(json);
+    callback->setAccountId(id);
+    callback->setMessageFolder(MessagingUtil::jsonToMessageFolder(v_folder));
+    callback->setLimit(limit);
+
+    long op_id = MessagingManager::getInstance().getMessageServiceEmail(id)->syncFolder(callback);
+
+    picojson::value v_op_id(static_cast<double>(op_id));
+    ReportSuccess(v_op_id, out);
 }
 
 void MessagingInstance::MessageServiceStopSync(const picojson::value& args,
index af0ca6b9d7f2e2db0c34f76a13ed0490987bb088..8400404cad8bfc725b5b62a8457ffc651cdf7c64 100644 (file)
@@ -137,6 +137,23 @@ std::string MessagingUtil::messageFolderTypeToString(MessageFolderType type)
     }
 }
 
+MessageFolderType MessagingUtil::stringToMessageFolderType(std::string type)
+{
+    if (FOLDER_TYPE_INBOX == type) {
+        return MessageFolderType::MESSAGE_FOLDER_TYPE_INBOX;
+    }
+    if (FOLDER_TYPE_OUTBOX == type) {
+        return MessageFolderType::MESSAGE_FOLDER_TYPE_OUTBOX;
+    }
+    if (FOLDER_TYPE_DRAFTS == type) {
+        return MessageFolderType::MESSAGE_FOLDER_TYPE_DRAFTS;
+    }
+    if (FOLDER_TYPE_SENTBOX == type) {
+        return MessageFolderType::MESSAGE_FOLDER_TYPE_SENTBOX;
+    }
+    return MessageFolderType::MESSAGE_FOLDER_TYPE_NOTSTANDARD;
+}
+
 MessageType MessagingUtil::stringToMessageType(std::string str)
 {
     try {
@@ -552,6 +569,51 @@ std::shared_ptr<Message> MessagingUtil::jsonToMessage(const picojson::value& jso
 
 }
 
+std::shared_ptr<MessageFolder> MessagingUtil::jsonToMessageFolder(const picojson::value& json)
+{
+    LoggerD("Entered");
+
+    picojson::object data = json.get<picojson::object>();
+
+    std::string id = MessagingUtil::getValueFromJSONObject<std::string>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_ID).c_str();
+
+    std::string parent_id = MessagingUtil::getValueFromJSONObject<std::string>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_PARENT_ID).c_str();
+
+    std::string service_id = MessagingUtil::getValueFromJSONObject<std::string>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_SERVICE_ID).c_str();
+
+    std::string content_type = MessagingUtil::getValueFromJSONObject<std::string>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_CONTENT_TYPE).c_str();
+
+    std::string name = MessagingUtil::getValueFromJSONObject<std::string>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_NAME).c_str();
+
+    std::string path = MessagingUtil::getValueFromJSONObject<std::string>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_PATH).c_str();
+
+    std::string type_str = MessagingUtil::getValueFromJSONObject<std::string>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_TYPE).c_str();
+    MessageFolderType type = MessagingUtil::stringToMessageFolderType(type_str);
+
+    bool synchronizable = MessagingUtil::getValueFromJSONObject<bool>(data,
+            MESSAGE_FOLDER_ATTRIBUTE_SYNCHRONIZABLE);
+
+    std::shared_ptr<MessageFolder> folder = std::shared_ptr<MessageFolder>(
+            new MessageFolder(
+                    id,
+                    parent_id,
+                    service_id,
+                    content_type,
+                    name,
+                    path,
+                    type,
+                    synchronizable));
+
+    return folder;
+}
+
 tizen::SortModePtr MessagingUtil::jsonToSortMode(const picojson::object& json)
 {
     LoggerD("Entered");
index 5f6490c1142058ddd8179f6f3675a31208df53ac..a6154d94329163e405559d4a8b2d526adf04f74d 100644 (file)
@@ -103,6 +103,7 @@ class MessageBody;
 class MessagingUtil {
 public:
     static std::string messageFolderTypeToString(MessageFolderType);
+    static MessageFolderType stringToMessageFolderType(std::string type);
     static MessageType stringToMessageType(std::string);
     static std::string messageTypeToString(MessageType);
     static std::string ltrim(const std::string& input);
@@ -115,6 +116,7 @@ public:
     static picojson::value conversationToJson(std::shared_ptr<MessageConversation> conversation);
     static picojson::value folderToJson(std::shared_ptr<MessageFolder> folder);
     static std::shared_ptr<Message> jsonToMessage(const picojson::value& json);
+    static std::shared_ptr<MessageFolder> jsonToMessageFolder(const picojson::value& json);
     static tizen::SortModePtr jsonToSortMode(const picojson::object& json);
     static tizen::AttributeFilterPtr jsonToAttributeFilter(const picojson::object& json);
     static std::shared_ptr<MessageConversation> jsonToMessageConversation(const picojson::value& json);