callback = NULL;
}
-//void EmailManager::findConversations(ConversationCallbackData* callback)
-//{
-// LoggerE("Entered");
-//
-// if(!callback){
-// LoggerE("Callback is null");
-// return;
-// }
-//
-// int convListCount = 0;
-// try {
-// std::lock_guard<std::mutex> lock(m_mutex);
-// std::vector<EmailConversationInfo> conversationsInfo =
-// MessagingDatabaseManager::getInstance().findEmailConversations(callback);
-// convListCount = conversationsInfo.size();
-// LoggerD("Found %d conversations", convListCount);
-//
-// for (int i = 0; i < convListCount; ++i) {
-// std::shared_ptr<MessageConversation> conversation =
-// MessageConversation::convertEmailConversationToObject(conversationsInfo.at(i).id);
-// conversation->setUnreadMessages(conversationsInfo.at(i).unreadMessages);
-// callback->addConversation(conversation);
-// }
-// } catch (const BasePlatformException& err) {
-// LoggerE("%s (%s)", (err.getName()).c_str(), (err.getMessage()).c_str());
-// callback->setError(err.getName(), err.getMessage());
-// } catch (...) {
-// LoggerE("Conversation find failed");
-// callback->setError(JSWebAPIErrorFactory::UNKNOWN_ERROR, "Conversation find failed");
-// }
-//
-// //Complete task
-// LoggerD("callback: %p error:%d conversations.size()=%d", callback, callback->isError(),
-// callback->getConversations().size());
-//
-// JSContextRef context = callback->getContext();
-// if (!GlobalContextManager::getInstance()->isAliveGlobalContext(context)) {
-// LoggerE("context was closed");
-// delete callback;
-// callback = NULL;
-// return;
-// }
-//
-// try {
-// if (callback->isError()) {
-// LoggerD("Calling error callback");
-// JSObjectRef errobj = JSWebAPIErrorFactory::makeErrorObject(context,
-// callback->getErrorName(),
-// callback->getErrorMessage());
-// callback->callErrorCallback(errobj);
-// } else {
-// LoggerD("Calling success callback");
-// callback->callSuccessCallback(
-// MessagingUtil::vectorToJSObjectArray<ConversationPtr,
-// JSMessageConversation>(context,
-// callback->getConversations()));
-// }
-// } catch (const BasePlatformException& err) {
-// LoggerE("Error while calling findConversations callback: %s (%s)",
-// (err.getName()).c_str(), (err.getMessage()).c_str());
-// } catch (...) {
-// LoggerE("Failed to call findConversations callback.");
-// }
-//
-// delete callback;
-// callback = NULL;
-//}
+void EmailManager::findConversations(ConversationCallbackData* callback)
+{
+ LoggerE("Entered");
+
+ if(!callback){
+ LoggerE("Callback is null");
+ return;
+ }
+
+ int convListCount = 0;
+ try {
+ std::lock_guard<std::mutex> lock(m_mutex);
+ std::vector<EmailConversationInfo> conversationsInfo =
+ MessagingDatabaseManager::getInstance().findEmailConversations(callback);
+ convListCount = conversationsInfo.size();
+ LoggerD("Found %d conversations", convListCount);
+
+ for (int i = 0; i < convListCount; ++i) {
+ std::shared_ptr<MessageConversation> conversation =
+ MessageConversation::convertEmailConversationToObject(conversationsInfo.at(i).id);
+ conversation->setUnreadMessages(conversationsInfo.at(i).unreadMessages);
+ callback->addConversation(conversation);
+ }
+
+ } catch (const PlatformException& err) {
+ LoggerE("%s (%s)", (err.name()).c_str(), (err.message()).c_str());
+ callback->setError(err.name(), err.message());
+ } catch (...) {
+ LoggerE("Conversation find failed");
+ UnknownException ex("Conversation find failed");
+ callback->setError(ex.name(), ex.message());
+ }
+
+ //Complete task
+ LoggerD("callback: %p error:%d conversations.size()=%d", callback, callback->isError(),
+ callback->getConversations().size());
+
+ try {
+ if (callback->isError()) {
+ LoggerD("Calling error callback");
+ MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str());
+ } else {
+ LoggerD("Calling success callback");
+ auto json = callback->getJson();
+ picojson::object& obj = json->get<picojson::object>();
+
+ std::vector<picojson::value> response;
+ auto messages = callback->getConversations();
+ std::for_each(messages.begin(), messages.end(),
+ [&response](std::shared_ptr<MessageConversation> &conversation) {
+ response.push_back(MessagingUtil::conversationToJson(conversation));
+ }
+ );
+ obj[JSON_DATA] = picojson::value(response);
+ obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS);
+ MessagingInstance::getInstance().PostMessage(json->serialize().c_str());
+ }
+ } catch (const common::PlatformException& err) {
+ LoggerE("Error while calling findConversations callback: %s (%s)",
+ (err.name()).c_str(), (err.message()).c_str());
+ } catch (...) {
+ LoggerE("Failed to call findConversations callback.");
+ }
+
+ delete callback;
+ callback = NULL;
+}
long EmailManager::getUniqueOpId()
{
void removeMessages(MessagesCallbackUserData* callback);
void updateMessages(MessagesCallbackUserData* callback);
void findMessages(FindMsgCallbackUserData* callback);
-// void findConversations(ConversationCallbackData* callback);
+ void findConversations(ConversationCallbackData* callback);
// void findFolders(FoldersCallbackData* callback);
void removeConversations(ConversationCallbackData* callback);
virtual void removeMessages(MessagesCallbackUserData* callback) = 0;
virtual void updateMessages(MessagesCallbackUserData* callback) = 0;
virtual void findMessages(FindMsgCallbackUserData* callback) = 0;
- virtual void findConversations() = 0;
+ virtual void findConversations(ConversationCallbackData* callback) = 0;
virtual void removeConversations(ConversationCallbackData* callback) = 0;
virtual void findFolders() = 0;
}
}
-void MessageStorageEmail::findConversations()
+static gboolean findConversationsTask(void* data)
{
LoggerD("Entered");
- //TODO add implementation
+
+ ConversationCallbackData *callback = static_cast<ConversationCallbackData*>(data);
+ EmailManager::getInstance().findConversations(callback);
+
+ return FALSE;
+}
+
+void MessageStorageEmail::findConversations(ConversationCallbackData* callback)
+{
+ LoggerD("Entered");
+
+ if (!callback) {
+ LoggerE("Callback is null");
+ throw common::UnknownException("Callback is null");
+ }
+
+ callback->setAccountId(m_id);
+ callback->setMessageServiceType(m_msg_type);
+ guint id = g_idle_add(findConversationsTask, static_cast<void*>(callback));
+ if (!id) {
+ LoggerE("g_idle_add failed");
+ delete callback;
+ callback = NULL;
+ }
}
static gboolean removeConversationsTask(void* data)
virtual void removeMessages(MessagesCallbackUserData* callback);
virtual void updateMessages(MessagesCallbackUserData* callback);
virtual void findMessages(FindMsgCallbackUserData* callback);
- virtual void findConversations();
+ virtual void findConversations(ConversationCallbackData* callback);
virtual void removeConversations(ConversationCallbackData* callback);
virtual void findFolders();
};
{name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
]);
+ var self = this;
+
bridge.async({
cmd: 'MessageStorage_findMessages',
args: {
sort: args.sort,
limit: args.limit,
offset: args.offset,
- serviceId: this.service.id
+ type: self.service.type
}
}).then({
success: function (data) {
{name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
]);
+ var self = this;
+
bridge.async({
cmd: 'MessageStorage_findConversations',
args: {
filter: args.filter,
sort: args.sort,
limit: args.limit,
- offset: args.offset
+ offset: args.offset,
+ serviceId: self.service.id
}
}).then({
success: function (data) {
data.forEach(function (el) {
conversations.push(new MessageConversation(el));
});
- args.successCallback.call(null, messages);
+ args.successCallback.call(null, conversations);
},
error: function (e) {
if (args.errorCallback) {
#include "common/logger.h"
#include "common/platform_exception.h"
+#include "conversation_callback_data.h"
#include "messaging_database_manager.h"
#include "messaging_manager.h"
// freeTable(&results);
// return conversationsIds;
//}
-//
-//std::vector<EmailConversationInfo> MessagingDatabaseManager::findEmailConversations(
-// ConversationCallbackData* callback)
-//{
-// LOGD("Entered");
-// std::ostringstream sqlWhereClause;
-// int resultsCount;
-// email_mail_data_t* results;
-// std::map<int, int> conversationsBag;
-// std::vector<EmailConversationInfo> conversationsInfo;
-//
-// // Adding filters query
-// AbstractFilterPtr filter = callback->getFilter();
-// SortModePtr sortMode = callback->getSortMode();
-// long limit = callback->getLimit();
-// long offset = callback->getOffset();
-// MessageType msgType = callback->getMessageServiceType();
-// int accountId = callback->getAccountId();
-//
-// sqlWhereClause << "WHERE "
-// << m_email_conv_attr_map["serviceId"].sql_name << " = " << accountId << " AND "
-// << addFilters(filter, sortMode, limit, offset, m_email_conv_attr_map, msgType);
-// LOGD("%s", sqlWhereClause.str().c_str());
-//
-// // Getting results from database
-// msg_error_t err = email_query_mails(const_cast<char*>(sqlWhereClause.str().c_str()),
-// &results, &resultsCount);
-// if (EMAIL_ERROR_NONE != err) {
-// LOGE("Getting mail list fail [%d]", err);
-//
-// if (EMAIL_ERROR_MAIL_NOT_FOUND == err) {
-// resultsCount = 0;
-// } else {
-// throw UnknownException("Error while getting data from database.");
-// }
-// }
-//
-// // Assigning found emails to conversation
-// for (int i = 0; i < resultsCount; ++i) {
-// if (conversationsBag.find(results[i].thread_id) == conversationsBag.end()) {
-// EmailConversationInfo info;
-// info.id = results[i].thread_id;
-// conversationsInfo.push_back(info);
-// conversationsBag.insert(std::make_pair(results[i].thread_id, 0));
-// }
-//
-// if (!(static_cast<bool>(results[i].flags_seen_field))) {
-// ++conversationsBag[results[i].thread_id];
-// }
-// }
-//
-// for (std::vector<EmailConversationInfo>::iterator it = conversationsInfo.begin();
-// it != conversationsInfo.end(); ++it) {
-// (*it).unreadMessages = conversationsBag[(*it).id];
-// }
-//
-// email_free_mail_data(&results, resultsCount);
-// return conversationsInfo;
-//}
+
+std::vector<EmailConversationInfo> MessagingDatabaseManager::findEmailConversations(
+ ConversationCallbackData* callback)
+{
+ LoggerD("Entered");
+ std::ostringstream sqlWhereClause;
+ int resultsCount;
+ email_mail_data_t* results;
+ std::map<int, int> conversationsBag;
+ std::vector<EmailConversationInfo> conversationsInfo;
+
+ // Adding filters query
+ AbstractFilterPtr filter = callback->getFilter();
+ SortModePtr sortMode = callback->getSortMode();
+ long limit = callback->getLimit();
+ long offset = callback->getOffset();
+ MessageType msgType = callback->getMessageServiceType();
+ int accountId = callback->getAccountId();
+
+ sqlWhereClause << "WHERE "
+ << m_email_conv_attr_map["serviceId"].sql_name << " = " << accountId << " AND "
+ << addFilters(filter, sortMode, limit, offset, m_email_conv_attr_map, msgType);
+ LoggerD("%s", sqlWhereClause.str().c_str());
+
+ // Getting results from database
+ msg_error_t err = email_query_mails(const_cast<char*>(sqlWhereClause.str().c_str()),
+ &results, &resultsCount);
+ if (EMAIL_ERROR_NONE != err) {
+ LoggerE("Getting mail list fail [%d]", err);
+
+ if (EMAIL_ERROR_MAIL_NOT_FOUND == err) {
+ resultsCount = 0;
+ } else {
+ throw UnknownException("Error while getting data from database.");
+ }
+ }
+
+ // Assigning found emails to conversation
+ for (int i = 0; i < resultsCount; ++i) {
+ if (conversationsBag.find(results[i].thread_id) == conversationsBag.end()) {
+ EmailConversationInfo info;
+ info.id = results[i].thread_id;
+ conversationsInfo.push_back(info);
+ conversationsBag.insert(std::make_pair(results[i].thread_id, 0));
+ }
+
+ if (!(static_cast<bool>(results[i].flags_seen_field))) {
+ ++conversationsBag[results[i].thread_id];
+ }
+ }
+
+ for (std::vector<EmailConversationInfo>::iterator it = conversationsInfo.begin();
+ it != conversationsInfo.end(); ++it) {
+ (*it).unreadMessages = conversationsBag[(*it).id];
+ }
+
+ email_free_mail_data(&results, resultsCount);
+ return conversationsInfo;
+}
} // Messaging
} // DeviceAPI
std::vector<int> findShortMessages(FindMsgCallbackUserData* callback);
std::pair<int, email_mail_data_t*> findEmails(FindMsgCallbackUserData* callback);
// std::vector<int> findShortMessageConversations(ConversationCallbackData* callback);
-// std::vector<EmailConversationInfo> findEmailConversations(ConversationCallbackData* callback);
+ std::vector<EmailConversationInfo> findEmailConversations(ConversationCallbackData* callback);
private:
MessagingDatabaseManager();
picojson::object& out)
{
LoggerD("Entered");
+
+ picojson::object data = args.get(JSON_DATA).get<picojson::object>();
+ const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
+
+ auto filter = MessagingUtil::jsonToAttributeFilter(data);
+ auto sortMode = MessagingUtil::jsonToSortMode(data);
+ long limit = static_cast<long>
+ (MessagingUtil::getValueFromJSONObject<double>(data, FIND_CONVERSATIONS_ARGS_LIMIT));
+ long offset = static_cast<long>
+ (MessagingUtil::getValueFromJSONObject<double>(data, FIND_CONVERSATIONS_ARGS_OFFSET));
+ int serviceId = static_cast<int>(data.at(FUNCTIONS_HIDDEN_ARGS_SERVICE_ID).get<double>());
+
+ ConversationCallbackData* callback = new ConversationCallbackData();
+ callback->setFilter(filter);
+ callback->setLimit(limit);
+ callback->setOffset(offset);
+ callback->setAccountId(serviceId);
+
+ 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);
+ callback->setJson(json);
+
+ auto storage = MessagingManager::getInstance().getMessageServiceEmail(serviceId)->getMsgStorage();
+ storage->findConversations(callback);
}
void MessagingInstance::MessageStorageRemoveConversations(const picojson::value& args,
return v;
}
+picojson::value MessagingUtil::conversationToJson(std::shared_ptr<MessageConversation> conversation)
+{
+ picojson::object o;
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_ID] = picojson::value(std::to_string(conversation->getConversationId()));
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_TYPE] =
+ picojson::value(MessagingUtil::messageTypeToString(conversation->getType()));
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_TIMESTAMP] =
+ picojson::value(static_cast<double>(conversation->getTimestamp()));
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_MESSAGE_COUNT] =
+ picojson::value(static_cast<double>(conversation->getMessageCount()));
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_UNREAD_MESSAGES] =
+ picojson::value(static_cast<double>(conversation->getUnreadMessages()));
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_PREVIEW] =
+ picojson::value(conversation->getPreview());
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_IS_READ] =
+ picojson::value(conversation->getIsRead());
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_FROM] =
+ picojson::value(conversation->getFrom());
+
+ o[MESSAGE_CONVERSATION_ATTRIBUTE_LAST_MESSAGE_ID] =
+ picojson::value(std::to_string(conversation->getLastMessageId()));
+
+ std::vector<picojson::value> array;
+ auto vectorToArray = [&array] (std::string& s)->void {
+ array.push_back(picojson::value(s));
+ };
+
+ switch (conversation->getType()) {
+ case MessageType::SMS:
+ break;
+ case MessageType::MMS:
+ case MessageType::EMAIL:
+
+ std::vector<std::string> to = conversation->getTo();
+ for_each(to.begin(), to.end(), vectorToArray);
+ o[MESSAGE_ATTRIBUTE_IN_RESPONSE_TO] = picojson::value(array);
+ array.clear();
+
+ std::vector<std::string> cc = conversation->getCC();
+ for_each(cc.begin(), cc.end(), vectorToArray);
+ o[MESSAGE_ATTRIBUTE_CC] = picojson::value(array);
+ array.clear();
+
+ std::vector<std::string> bcc = conversation->getBCC();
+ for_each(bcc.begin(), bcc.end(), vectorToArray);
+ o[MESSAGE_ATTRIBUTE_BCC] = picojson::value(array);
+ array.clear();
+
+ o[MESSAGE_ATTRIBUTE_SUBJECT] = picojson::value(conversation->getSubject());
+ break;
+ }
+
+ picojson::value v(o);
+ return v;
+}
+
std::shared_ptr<Message> MessagingUtil::jsonToMessage(const picojson::value& json)
{
LoggerD("Entered");
static picojson::value messageBodyToJson(std::shared_ptr<MessageBody> body);
static picojson::value messageToJson(std::shared_ptr<Message> message);
+ static picojson::value conversationToJson(std::shared_ptr<MessageConversation> conversation);
static std::shared_ptr<Message> jsonToMessage(const picojson::value& json);
static tizen::SortModePtr jsonToSortMode(const picojson::object& json);
static tizen::AttributeFilterPtr jsonToAttributeFilter(const picojson::object& json);