Modified item definition format 65/78065/3
authorSomin Kim <somin926.kim@samsung.com>
Mon, 4 Jul 2016 07:14:52 +0000 (16:14 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Mon, 4 Jul 2016 08:57:25 +0000 (01:57 -0700)
Change-Id: Ie0aee0745a6de15062ee6969843056b64f806216
Signed-off-by: Somin Kim <somin926.kim@samsung.com>
include/ProviderList.h
src/custom/CustomManager.cpp

index a159c44..3042ca2 100644 (file)
 #define LIB_PREFIX             "libctx-prvd-"
 #define LIB_EXTENSION  ".so"
 
+/* Json Formats */
+#define TRIG_DEF_RANK                  "\"Rank\":{\"type\":\"integer\",\"minimum\":1}"
+#define TRIG_DEF_TOTAL_COUNT   "\"TotalCount\":{\"type\":\"integer\",\"minimum\":0}"
+#define TRIG_DEF_TIME_OF_DAY   "\"TimeOfDay\":{\"type\":\"string\"}"
+#define TRIG_DEF_DAY_OF_WEEK   "\"DayOfWeek\":{\"enum\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}"
+#define TRIG_BOOL_ITEM_DEF(sbj)        "\"" sbj "\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":1}"
+
 const struct {
        const char *subject;
        const char *library;
@@ -64,8 +71,8 @@ const struct {
        {
                SUBJ_ACTIVITY,
                OPS_SUBSCRIBE,
-               "{\"Event\":{\"type\":\"string\", \"values\":[\"Detected\"]}}",
-               "{\"Accuracy\":{\"type\":\"string\", \"values\":[\"Low\", \"Normal\", \"High\"]}}"
+               "{\"Event\":{\"enum\":[\"Detected\"]}}",
+               "{\"Accuracy\":{\"enum\":[\"Low\",\"Normal\",\"High\"]}}"
        },
        {
                SUBJ_APP_FREQUENCY,
@@ -81,8 +88,8 @@ const struct {
                OPS_SUBSCRIBE | OPS_READ,
                /* TODO remove Connecting, Connected */
                "{"
-                       "\"Medium\":{\"type\":\"string\",\"values\":[\"Voice\",\"Video\"]},"
-                       "\"State\":{\"type\":\"string\",\"values\":[\"Idle\",\"Connecting\",\"Connected\"]},"
+                       "\"Medium\":{\"enum\":[\"Voice\",\"Video\"]},"
+                       "\"State\":{\"enum\":[\"Idle\",\"Connecting\",\"Connected\"]},"
                        "\"Address\":{\"type\":\"string\"}"
                "}",
                NULL
@@ -91,8 +98,8 @@ const struct {
                SUBJ_STATE_CONTACTS,
                OPS_SUBSCRIBE,
                "{"
-                       "\"Event\":{\"type\":\"string\",\"values\":[\"Changed\"]},"
-                       "\"Type\":{\"type\":\"string\",\"values\":[\"MyProfile\",\"Person\"]}"
+                       "\"Event\":{\"enum\":[\"Changed\"]},"
+                       "\"Type\":{\"enum\":[\"MyProfile\",\"Person\"]}"
                "}",
                NULL
        },
@@ -106,7 +113,7 @@ const struct {
                SUBJ_STATE_EMAIL,
                OPS_SUBSCRIBE,
                "{"
-                       "\"Event\":{\"type\":\"string\",\"values\":[\"Received\",\"Sent\"]}"
+                       "\"Event\":{\"enum\":[\"Received\",\"Sent\"]}"
                "}",
                NULL
        },
@@ -114,10 +121,10 @@ const struct {
                SUBJ_PLACE_GEOFENCE,
                OPS_SUBSCRIBE,
                "{"
-                       "\"Event\":{\"type\":\"string\",\"values\":[\"In\",\"Out\"]}"
+                       "\"Event\":{\"enum\":[\"In\",\"Out\"]}"
                "}",
                "{"
-                       "\"PlaceId\":{\"type\":\"integer\",\"min\":1}"
+                       "\"PlaceId\":{\"type\":\"integer\",\"minimum\":1}"
                "}"
        },
        {
@@ -125,7 +132,7 @@ const struct {
                OPS_SUBSCRIBE | OPS_READ,
                "{"
                        TRIG_BOOL_ITEM_DEF("IsConnected") ","
-                       "\"Type\":{\"type\":\"string\",\"values\":[\"Normal\",\"Headset\",\"Bluetooth\"]}"
+                       "\"Type\":{\"enum\":[\"Normal\",\"Headset\",\"Bluetooth\"]}"
                "}",
                NULL
        },
@@ -145,8 +152,8 @@ const struct {
                SUBJ_STATE_MESSAGE,
                OPS_SUBSCRIBE,
                "{"
-                       "\"Event\":{\"type\":\"string\",\"values\":[\"Received\"]},"
-                       "\"Type\":{\"type\":\"string\",\"values\":[\"SMS\",\"MMS\"]},"
+                       "\"Event\":{\"enum\":[\"Received\"]},"
+                       "\"Type\":{\"enum\":[\"SMS\",\"MMS\"]},"
                        "\"Address\":{\"type\":\"string\"}"
                "}",
                NULL
@@ -164,7 +171,7 @@ const struct {
                SUBJ_STATE_BATTERY,
                OPS_SUBSCRIBE | OPS_READ,
                "{"
-                       "\"Level\":{\"type\":\"string\",\"values\":[\"Empty\",\"Critical\",\"Low\",\"Normal\",\"High\",\"Full\"]},"
+                       "\"Level\":{\"enum\":[\"Empty\",\"Critical\",\"Low\",\"Normal\",\"High\",\"Full\"]},"
                        TRIG_BOOL_ITEM_DEF("IsCharging")
                "}",
                NULL
@@ -179,7 +186,7 @@ const struct {
                SUBJ_STATE_GPS,
                OPS_SUBSCRIBE | OPS_READ,
                "{"
-                       "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Searching\",\"Connected\"]}"
+                       "\"State\":{\"enum\":[\"Disabled\",\"Searching\",\"Connected\"]}"
                "}",
                NULL
        },
@@ -199,8 +206,8 @@ const struct {
                SUBJ_STATE_ALARM,
                OPS_SUBSCRIBE,
                "{"
-                       "\"TimeOfDay\":{\"type\":\"integer\",\"min\":0,\"max\":1439},"
-                       "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}"
+                       "\"TimeOfDay\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":1439},"
+                       "\"DayOfWeek\":{\"enum\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}"
                "}",
                NULL
        },
@@ -208,9 +215,9 @@ const struct {
                SUBJ_STATE_TIME,
                OPS_READ,
                "{"
-                       "\"TimeOfDay\":{\"type\":\"integer\",\"min\":0,\"max\":1439},"
-                       "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]},"
-                       "\"DayOfMonth\":{\"type\":\"integer\",\"min\":1,\"max\":31}"
+                       "\"TimeOfDay\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":1439},"
+                       "\"DayOfWeek\":{\"enum\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]},"
+                       "\"DayOfMonth\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":31}"
                "}",
                NULL
        },
@@ -218,7 +225,7 @@ const struct {
                SUBJ_STATE_WIFI,
                OPS_SUBSCRIBE | OPS_READ,
                "{"
-                       "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Unconnected\",\"Connected\"]},"
+                       "\"State\":{\"enum\":[\"Disabled\",\"Unconnected\",\"Connected\"]},"
                        "\"BSSID\":{\"type\":\"string\"}"
                "}",
                NULL
index 90dfb32..6bb7a5e 100644 (file)
@@ -29,6 +29,7 @@ static DatabaseManager __dbManager;
 static bool __isValidFact(std::string subject, Json& fact);
 static bool __checkValueInt(Json& tmpl, std::string key, int value);
 static bool __checkValueString(Json& tmpl, std::string key, std::string value);
+static bool __checkValueEnum(Json& tmpl, std::string key, std::string value);
 
 CustomManager::CustomManager() :
        BasicProvider(SUBJ_CUSTOM)
@@ -216,7 +217,13 @@ bool __isValidFact(std::string subject, Json& fact)
                std::string key = *it;
 
                std::string type;
-               tmpl.get(key.c_str(), "type", &type);
+               ret = tmpl.get(key.c_str(), "type", &type);
+               if (!ret) {
+                       int size = tmpl.getSize(key.c_str(), "enum");
+                       IF_FAIL_RETURN_TAG(size >= 0, false, _E, "Invalid template");
+                       type = "enum";
+               }
+
                if (type == "integer") {
                        int val;
                        ret = fact.get(NULL, key.c_str(), &val);
@@ -231,6 +238,13 @@ bool __isValidFact(std::string subject, Json& fact)
 
                        ret = __checkValueString(tmpl, key, val_str);
                        IF_FAIL_RETURN_TAG(ret, false, _E, "Custom fact: invalid value");
+               } else if (type == "enum") {
+                       std::string val_str;
+                       ret = fact.get(NULL, key.c_str(), &val_str);
+                       IF_FAIL_RETURN_TAG(ret, false, _E, "Custom fact: invalid data type");
+
+                       ret = __checkValueEnum(tmpl, key, val_str);
+                       IF_FAIL_RETURN_TAG(ret, false, _E, "Custom fact: invalid value");
                } else {
                        _E("Custom fact: invalid data type");
                        return false;
@@ -244,11 +258,11 @@ bool __checkValueInt(Json& tmpl, std::string key, int value)
 {
        int min, max;
 
-       if (tmpl.get(key.c_str(), "min", &min)) {
+       if (tmpl.get(key.c_str(), "minimum", &min)) {
                IF_FAIL_RETURN(value >= min, false);
        }
 
-       if (tmpl.get(key.c_str(), "max", &max)) {
+       if (tmpl.get(key.c_str(), "maximum", &max)) {
                IF_FAIL_RETURN(value <= max, false);
        }
 
@@ -257,13 +271,15 @@ bool __checkValueInt(Json& tmpl, std::string key, int value)
 
 bool __checkValueString(Json& tmpl, std::string key, std::string value)
 {
-       /* case1: any value is accepted */
-       if (tmpl.getSize(key.c_str(), "values") <= 0)
-               return true;
+       /* any value is accepted */
+       return true;
+}
 
-       /* case2: check acceptable value */
+bool __checkValueEnum(Json& tmpl, std::string key, std::string value)
+{
+       /* check acceptable value */
        std::string tmplValue;
-       for (int i = 0; tmpl.getAt(key.c_str(), "values", i, &tmplValue); i++) {
+       for (int i = 0; tmpl.getAt(key.c_str(), "enum", i, &tmplValue); i++) {
                if (tmplValue == value)
                        return true;
        }