[Messaging] add support for AttributeRange filter
authorRobert Karolak <r.karolak@samsung.com>
Mon, 12 Jan 2015 14:04:19 +0000 (15:04 +0100)
committerRobert Karolak <r.karolak@samsung.com>
Tue, 13 Jan 2015 11:41:21 +0000 (12:41 +0100)
[Verification] More TCT tests passes

Change-Id: Id38eeacd1a36d013cf7f44faff1b4a5469d3df2c
Signed-off-by: Robert Karolak <r.karolak@samsung.com>
src/messaging/MsgCommon/Any.cpp
src/messaging/messaging_api.js
src/messaging/messaging_instance.cc
src/messaging/messaging_util.cc
src/messaging/messaging_util.h

index fb2b258..4f5d450 100644 (file)
@@ -16,6 +16,8 @@
 //
 
 #include "Any.h"
+
+#include <stdexcept>
 //#include <JSUtil.h>
 
 namespace extension {
@@ -99,15 +101,18 @@ std::string Any::toString() const
 
 std::tm* Any::toDateTm() const
 {
-    //TODO is it ok?
-    std::time_t time = static_cast<std::time_t>(m_value.get<double>());
-    return gmtime(&time);
+    std::tm* tm = new std::tm();
+    strptime(toString().c_str(), "%Y-%m-%dT%H:%M:%S.%zZ", tm);
+    return tm;
 }
 
 std::time_t Any::toTimeT() const
 {
-    //TODO is it ok?
-    return static_cast<std::time_t>(m_value.get<double>());
+    std::time_t current_time;
+    std::time(&current_time);
+    std::tm* timeinfo = std::localtime(&current_time);
+    long offset = timeinfo->tm_gmtoff;
+    return (mktime(toDateTm()) + offset) * 1000;
 }
 
 } // Tizen
index 90679be..bee7bea 100644 (file)
@@ -17,6 +17,7 @@ var Property = {
     E: 1 << 1,   // ENUMERABLE
     C: 1 << 2    // CONFIGURABLE
 }
+
 //TODO remove CommonFS when C++ filesystem will be available
 function CommonFS(){};
 CommonFS.cacheVirtualToReal = {
@@ -33,7 +34,7 @@ CommonFS.toRealPath = function (aPath) {
         _uriPrefix = 'file://',
         i;
     if (aPath.indexOf(_uriPrefix) === 0) {
-        _fileRealPath = aPath.substr(_uriPrefix.length);
+        _fileRealPath = aPath; /*.substr(_uriPrefix.length);*/
     } else if (aPath[0] != '/') {
         //virtual path$
         var _pathTokens = aPath.split('/');
@@ -53,6 +54,24 @@ CommonFS.toRealPath = function (aPath) {
     return _fileRealPath;
 };
 
+function addTypeToFilter_(data)
+{
+    var filter = {};
+
+    for(var field in data) {
+        filter[field] = data[field];
+    }
+
+    if (data instanceof tizen.AttributeFilter) {
+        filter.type = "AttributeFilter";
+    }
+    if (data instanceof tizen.AttributeRangeFilter) {
+        filter.type = "AttributeRangeFilter";
+    }
+
+    return filter;
+}
+
 /**
  * Example usage:
  * function Messaging () {
@@ -227,7 +246,7 @@ function Message(type, data) {
         this,
         'timestamp',
         {
-            get: function () {return _internal.timestamp;},
+            get: function () {return new Date(_internal.timestamp);},
             set: function (value) {
                 if (value instanceof InternalValues_) _internal.timestamp = value.timestamp;
             },
@@ -812,7 +831,7 @@ MessageStorage.prototype.findMessages = function () {
     bridge.async({
         cmd: 'MessageStorage_findMessages',
         args: {
-            filter: args.filter || null,
+            filter: addTypeToFilter_(args.filter) || null,
             sort: args.sort || null,
             limit: args.limit || null,
             offset: args.offset || null,
@@ -919,7 +938,7 @@ MessageStorage.prototype.findConversations = function () {
     bridge.async({
         cmd: 'MessageStorage_findConversations',
         args: {
-            filter: args.filter,
+            filter: addTypeToFilter_(args.filter),
             sort: args.sort || null,
             limit: args.limit || null,
             offset: args.offset || null,
@@ -995,7 +1014,7 @@ MessageStorage.prototype.findFolders = function () {
     bridge.async({
         cmd: 'MessageStorage_findFolders',
         args: {
-            filter: args.filter,
+            filter: addTypeToFilter_(args.filter),
             sort: args.sort || null,
             limit: args.limit || null,
             offset: args.offset || null,
@@ -1064,7 +1083,7 @@ MessageStorage.prototype.addMessagesChangeListener = function () {
         cmd: 'MessageStorage_addMessagesChangeListener',
         cid: cid,
         args: {
-            filter: args.filter || null,
+            filter: addTypeToFilter_(args.filter) || null,
             serviceId: self.service.id
         }
     });
@@ -1117,7 +1136,7 @@ MessageStorage.prototype.addConversationsChangeListener = function () {
         cmd: 'MessageStorage_addConversationsChangeListener',
         cid: cid,
         args: {
-            filter: args.filter || null,
+            filter: addTypeToFilter_(args.filter) || null,
             serviceId: self.service.id
         }
     });
index df48c66..9c05c7c 100644 (file)
@@ -406,8 +406,8 @@ void MessagingInstance::MessageStorageFindMessages(const picojson::value& args,
     picojson::object data = args.get(JSON_DATA).get<picojson::object>();
     const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
 
-    // TODO add support to AttributeRangeFilter
-    auto filter = MessagingUtil::jsonToAttributeFilter(data);
+    // TODO add support to CompositeFilter
+    auto filter = MessagingUtil::jsonToAbstractFilter(data);
     auto sortMode = MessagingUtil::jsonToSortMode(data);
 
     long limit = static_cast<long>
@@ -498,8 +498,8 @@ void MessagingInstance::MessageStorageFindConversations(const picojson::value& a
     picojson::object data = args.get(JSON_DATA).get<picojson::object>();
     const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
 
-    // TODO add support to AttributeRangeFilter
-    auto filter = MessagingUtil::jsonToAttributeFilter(data);
+    // TODO add support to CompositeFilter
+    auto filter = MessagingUtil::jsonToAbstractFilter(data);
     auto sortMode = MessagingUtil::jsonToSortMode(data);
     long limit = static_cast<long>
             (MessagingUtil::getValueFromJSONObject<double>(data, FIND_CONVERSATIONS_ARGS_LIMIT));
@@ -557,8 +557,8 @@ void MessagingInstance::MessageStorageFindFolders(const picojson::value& args,
     picojson::object data = args.get(JSON_DATA).get<picojson::object>();
     const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
 
-    // TODO add support to AttributeRangeFilter
-    auto filter = MessagingUtil::jsonToAttributeFilter(data);
+    // TODO add support to CompositeFilter
+    auto filter = MessagingUtil::jsonToAbstractFilter(data);
     int serviceId = static_cast<int>(data.at(FUNCTIONS_HIDDEN_ARGS_SERVICE_ID).get<double>());
 
     FoldersCallbackData* callback = new FoldersCallbackData();
@@ -586,8 +586,7 @@ void MessagingInstance::MessageStorageAddMessagesChangeListener(const picojson::
     std::shared_ptr<MessagesChangeCallback> callback(new MessagesChangeCallback(
                 callbackId, serviceId, service->getMsgServiceType()));
 
-    // TODO filter
-    // callback->setFilter(tizen::AbstractFilterPtr(new tizen::AbstractFilter()));
+    callback->setFilter(MessagingUtil::jsonToAbstractFilter(data));
 
     long op_id = service->getMsgStorage()->addMessagesChangeListener(callback);
 
@@ -608,8 +607,7 @@ void MessagingInstance::MessageStorageAddConversationsChangeListener(const picoj
     std::shared_ptr<ConversationsChangeCallback> callback(new ConversationsChangeCallback(
                 callbackId, serviceId, service->getMsgServiceType()));
 
-    // TODO filter
-    // callback->setFilter(tizen::AbstractFilterPtr(new tizen::AbstractFilter()));
+    callback->setFilter(MessagingUtil::jsonToAbstractFilter(data));
 
     long op_id = service->getMsgStorage()->addConversationsChangeListener(callback);
 
@@ -630,8 +628,7 @@ void MessagingInstance::MessageStorageAddFolderChangeListener(const picojson::va
     std::shared_ptr<FoldersChangeCallback> callback(new FoldersChangeCallback(
                 callbackId, serviceId, service->getMsgServiceType()));
 
-    // TODO filter
-    // callback->setFilter(tizen::AbstractFilterPtr(new tizen::AbstractFilter()));
+    callback->setFilter(MessagingUtil::jsonToAbstractFilter(data));
 
     long op_id = service->getMsgStorage()->addFoldersChangeListener(callback);
 
index de62c77..18e367c 100644 (file)
@@ -103,6 +103,12 @@ const std::string JSON_TO_SORT = "sort";
 const std::string JSON_TO_FILTER = "filter";
 const std::string JSON_TO_MATCH_FLAG = "matchFlag";
 const std::string JSON_TO_MATCH_VALUE = "matchValue";
+const std::string JSON_TO_INITIAL_VALUE = "initialValue";
+const std::string JSON_TO_END_VALUE = "endValue";
+
+const char* JSON_FILTER_ATTRIBUTE_TYPE = "AttributeFilter";
+const char* JSON_FILTER_ATTRIBUTERANGE_TYPE = "AttributeRangeFilter";
+const char* JSON_FILTER_COMPOSITE_TYPE = "CompositeFilter";
 
 const std::map<std::string, MessageType> stringToTypeMap = {
     {TYPE_SMS, MessageType::SMS},
@@ -659,13 +665,35 @@ tizen::SortModePtr MessagingUtil::jsonToSortMode(const picojson::object& json)
     return SortModePtr(new SortMode(name, order));
 }
 
-tizen::AttributeFilterPtr MessagingUtil::jsonToAttributeFilter(const picojson::object& json)
+tizen::AbstractFilterPtr MessagingUtil::jsonToAbstractFilter(const picojson::object& json)
+{
+    LoggerD("Entered");
+
+    auto filter = getValueFromJSONObject<picojson::object>(json, JSON_TO_FILTER);
+    std::string type = getValueFromJSONObject<std::string>(filter, "type");
+
+    if( JSON_FILTER_ATTRIBUTE_TYPE == type ){
+        return jsonFilterToAttributeFilter(filter);
+    }
+    if( JSON_FILTER_ATTRIBUTERANGE_TYPE == type ){
+        return jsonFilterToAttributeRangeFilter(filter);
+    }
+    if( JSON_FILTER_COMPOSITE_TYPE == type ) {
+        //TODO jsonToCompositeFilter
+        LoggerD("Composite filter currently not supported");
+    }
+
+    LoggerE("Unsupported filter type");
+    throw common::TypeMismatchException("Unsupported filter type");
+    return AbstractFilterPtr();
+}
+
+tizen::AttributeFilterPtr MessagingUtil::jsonFilterToAttributeFilter(const picojson::object& filter)
 {
     LoggerD("Entered");
 
     using namespace tizen;
 
-    auto filter = getValueFromJSONObject<picojson::object>(json, JSON_TO_FILTER);
     auto name = getValueFromJSONObject<std::string>(filter, JSON_TO_ATTRIBUTE_NAME);
     auto matchFlagStr = getValueFromJSONObject<std::string>(filter, JSON_TO_MATCH_FLAG);
 
@@ -700,6 +728,19 @@ tizen::AttributeFilterPtr MessagingUtil::jsonToAttributeFilter(const picojson::o
     return attributePtr;
 }
 
+tizen::AttributeRangeFilterPtr MessagingUtil::jsonFilterToAttributeRangeFilter(const picojson::object& filter)
+{
+    LoggerD("Entered");
+
+    auto name = getValueFromJSONObject<std::string>(filter, JSON_TO_ATTRIBUTE_NAME);
+
+    auto attributeRangePtr = tizen::AttributeRangeFilterPtr(new tizen::AttributeRangeFilter(name));
+    attributeRangePtr->setInitialValue(AnyPtr(new Any(filter.at(JSON_TO_INITIAL_VALUE))));
+    attributeRangePtr->setEndValue(AnyPtr(new Any(filter.at(JSON_TO_END_VALUE))));
+
+    return  attributeRangePtr;
+}
+
 std::shared_ptr<MessageAttachment> MessagingUtil::jsonToMessageAttachment(const picojson::value& json)
 {
     LoggerD("Entered");
index 694431e..bc92718 100644 (file)
@@ -123,7 +123,7 @@ public:
     static std::shared_ptr<MessageBody> jsonToMessageBody(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 tizen::AbstractFilterPtr jsonToAbstractFilter(const picojson::object& json);
     static std::shared_ptr<MessageConversation> jsonToMessageConversation(const picojson::value& json);
     static std::shared_ptr<MessageAttachment> jsonToMessageAttachment(const picojson::value& json);
 
@@ -152,6 +152,10 @@ public:
     */
     static std::string loadFileContentToString(const std::string& file_path);
     static std::string messageStatusToString(MessageStatus status);
+
+private:
+    static tizen::AttributeFilterPtr jsonFilterToAttributeFilter(const picojson::object& json);
+    static tizen::AttributeRangeFilterPtr jsonFilterToAttributeRangeFilter(const picojson::object& json);
 };
 
 } // messaging