//#################################### ^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: #################################
// 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);
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,
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
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:
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;
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)
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);
};
{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);
}
}
});
+
+ 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, [
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";
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);
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
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,
}
}
+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 {
}
+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");
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);
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);