#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;
{
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,
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
SUBJ_STATE_CONTACTS,
OPS_SUBSCRIBE,
"{"
- "\"Event\":{\"type\":\"string\",\"values\":[\"Changed\"]},"
- "\"Type\":{\"type\":\"string\",\"values\":[\"MyProfile\",\"Person\"]}"
+ "\"Event\":{\"enum\":[\"Changed\"]},"
+ "\"Type\":{\"enum\":[\"MyProfile\",\"Person\"]}"
"}",
NULL
},
SUBJ_STATE_EMAIL,
OPS_SUBSCRIBE,
"{"
- "\"Event\":{\"type\":\"string\",\"values\":[\"Received\",\"Sent\"]}"
+ "\"Event\":{\"enum\":[\"Received\",\"Sent\"]}"
"}",
NULL
},
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}"
"}"
},
{
OPS_SUBSCRIBE | OPS_READ,
"{"
TRIG_BOOL_ITEM_DEF("IsConnected") ","
- "\"Type\":{\"type\":\"string\",\"values\":[\"Normal\",\"Headset\",\"Bluetooth\"]}"
+ "\"Type\":{\"enum\":[\"Normal\",\"Headset\",\"Bluetooth\"]}"
"}",
NULL
},
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
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
SUBJ_STATE_GPS,
OPS_SUBSCRIBE | OPS_READ,
"{"
- "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Searching\",\"Connected\"]}"
+ "\"State\":{\"enum\":[\"Disabled\",\"Searching\",\"Connected\"]}"
"}",
NULL
},
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
},
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
},
SUBJ_STATE_WIFI,
OPS_SUBSCRIBE | OPS_READ,
"{"
- "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Unconnected\",\"Connected\"]},"
+ "\"State\":{\"enum\":[\"Disabled\",\"Unconnected\",\"Connected\"]},"
"\"BSSID\":{\"type\":\"string\"}"
"}",
NULL
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)
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);
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;
{
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);
}
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;
}