--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <map>
+#include <job_scheduler_types_internal.h>
+#include <context_trigger.h>
+#include "PrivilegeChecker.h"
+#include "ContextItem.h"
+
+#define URI(x) CTX_SCHED_URI_##x
+#define NAME(x) CTX_SCHED_ATTR_NAME_##x
+#define VALUE(x) CTX_SCHED_ATTR_VALUE_##x
+
+ContextItem::ContextItem(int cx) :
+ __context(cx)
+{
+}
+
+bool ContextItem::allowed()
+{
+ return PrivilegeChecker::hasPrivilege(__getPrivilege());
+}
+
+bool ContextItem::isValid(ctx_sched_job_context_h jobContext)
+{
+ //TODO: Check if the context has all mandatory fields
+ return true;
+}
+
+bool ContextItem::isValid(const std::string& attribute)
+{
+ //TODO: Check if the attribute is valid for this __context
+ return true;
+}
+
+bool ContextItem::isValid(const std::string& attribute, int value)
+{
+ //TODO: Check if the attribute & value pair is valid for this __context
+ return true;
+}
+
+bool ContextItem::isValid(const std::string& attribute, const std::string& value)
+{
+ //TODO: Check if the attribute & value pair is valid for this __context
+ return true;
+}
+
+EventItem::EventItem(int event) :
+ ContextItem(event)
+{
+}
+
+bool EventItem::deprecated()
+{
+ switch (__context) {
+ case CONTEXT_TRIGGER_EVENT_TIME:
+ case CONTEXT_TRIGGER_EVENT_POWER_SAVING_MODE:
+ case CONTEXT_TRIGGER_EVENT_CALL:
+ case CONTEXT_TRIGGER_EVENT_EMAIL:
+ case CONTEXT_TRIGGER_EVENT_MESSAGE:
+ return true;
+ default:
+ return false;
+ }
+}
+
+const char* EventItem::getUri()
+{
+ static const std::map<int, const char*> uriMap = {
+ {CONTEXT_TRIGGER_EVENT_TIME, CTX_SCHED_URI_PREFIX "event/time"},
+ {CONTEXT_TRIGGER_EVENT_BATTERY, URI(BATTERY)},
+ {CONTEXT_TRIGGER_EVENT_CHARGER, URI(CHARGER)},
+ {CONTEXT_TRIGGER_EVENT_GPS, URI(GPS)},
+ {CONTEXT_TRIGGER_EVENT_HEADPHONE, URI(EARJACK)},
+ {CONTEXT_TRIGGER_EVENT_POWER_SAVING_MODE, URI(POWERSAVE)},
+ {CONTEXT_TRIGGER_EVENT_USB, URI(USB)},
+ {CONTEXT_TRIGGER_EVENT_WIFI, URI(WIFI)},
+ {CONTEXT_TRIGGER_EVENT_CALL, CTX_SCHED_URI_PREFIX "state/call"},
+ {CONTEXT_TRIGGER_EVENT_EMAIL, CTX_SCHED_URI_PREFIX "event/email"},
+ {CONTEXT_TRIGGER_EVENT_MESSAGE, CTX_SCHED_URI_PREFIX "event/message"},
+ {CONTEXT_TRIGGER_EVENT_CONTACTS, URI(CONTACTS_DB)},
+ {CONTEXT_TRIGGER_EVENT_ACTIVITY_STATIONARY, URI(STATIONARY)},
+ {CONTEXT_TRIGGER_EVENT_ACTIVITY_WALKING, URI(WALKING)},
+ {CONTEXT_TRIGGER_EVENT_ACTIVITY_RUNNING, URI(RUNNING)},
+ {CONTEXT_TRIGGER_EVENT_ACTIVITY_IN_VEHICLE, URI(IN_VEHICLE)},
+ {CONTEXT_TRIGGER_EVENT_PLACE, URI(GEOFENCE)}
+ };
+
+ auto it = uriMap.find(__context);
+
+ if (it == uriMap.end())
+ return NULL;
+
+ return it->second;
+}
+
+const char* EventItem::__getPrivilege()
+{
+ if (CONTEXT_TRIGGER_EVENT_TIME == __context)
+ return "http://tizen.org/privilege/alarm.set";
+
+ if (CONTEXT_TRIGGER_EVENT_WIFI == __context)
+ return "http://tizen.org/privilege/network.get";
+
+ if (CONTEXT_TRIGGER_EVENT_CALL == __context)
+ return "http://tizen.org/privilege/telephony";
+
+ if (CONTEXT_TRIGGER_EVENT_MESSAGE == __context)
+ return "http://tizen.org/privilege/message.read";
+
+ if (CONTEXT_TRIGGER_EVENT_CONTACTS == __context)
+ return "http://tizen.org/privilege/contact.read";
+
+ if (CONTEXT_TRIGGER_EVENT_PLACE == __context)
+ return "http://tizen.org/privilege/location";
+
+ return NULL;
+}
+
+ConditionItem::ConditionItem(int cond) :
+ ContextItem(cond)
+{
+}
+
+bool ConditionItem::deprecated()
+{
+ switch (__context) {
+ case CONTEXT_TRIGGER_CONDITION_POWER_SAVING_MODE:
+ case CONTEXT_TRIGGER_CONDITION_CALL:
+ case CONTEXT_TRIGGER_CONDITION_APP_USE_FREQUENCY:
+ case CONTEXT_TRIGGER_CONDITION_COMMUNICATION_FREQUENCY:
+ case CONTEXT_TRIGGER_CONDITION_MUSIC_PLAYBACK_FREQUENCY:
+ case CONTEXT_TRIGGER_CONDITION_VIDEO_PLAYBACK_FREQUENCY:
+ return true;
+ default:
+ return false;
+ }
+}
+
+const char* ConditionItem::getUri()
+{
+ static const std::map<int, const char*> uriMap = {
+ {CONTEXT_TRIGGER_CONDITION_TIME, URI(TIME)},
+ {CONTEXT_TRIGGER_CONDITION_BATTERY, URI(BATTERY)},
+ {CONTEXT_TRIGGER_CONDITION_CHARGER, URI(CHARGER)},
+ {CONTEXT_TRIGGER_CONDITION_GPS, URI(GPS)},
+ {CONTEXT_TRIGGER_CONDITION_HEADPHONE, URI(EARJACK)},
+ {CONTEXT_TRIGGER_CONDITION_POWER_SAVING_MODE, URI(POWERSAVE)},
+ {CONTEXT_TRIGGER_CONDITION_USB, URI(USB)},
+ {CONTEXT_TRIGGER_CONDITION_WIFI, URI(WIFI)},
+ {CONTEXT_TRIGGER_CONDITION_CALL, CTX_SCHED_URI_PREFIX "state/call"},
+ {CONTEXT_TRIGGER_CONDITION_APP_USE_FREQUENCY, CTX_SCHED_URI_PREFIX "stats/app"},
+ {CONTEXT_TRIGGER_CONDITION_COMMUNICATION_FREQUENCY, CTX_SCHED_URI_PREFIX "stats/comm"},
+ {CONTEXT_TRIGGER_CONDITION_MUSIC_PLAYBACK_FREQUENCY, CTX_SCHED_URI_PREFIX "stats/music"},
+ {CONTEXT_TRIGGER_CONDITION_VIDEO_PLAYBACK_FREQUENCY, CTX_SCHED_URI_PREFIX "stats/video"}
+ };
+
+ auto it = uriMap.find(__context);
+
+ if (it == uriMap.end())
+ return NULL;
+
+ return it->second;
+}
+
+const char* ConditionItem::__getPrivilege()
+{
+ if (CONTEXT_TRIGGER_CONDITION_WIFI == __context)
+ return "http://tizen.org/privilege/network.get";
+
+ if (CONTEXT_TRIGGER_CONDITION_CALL == __context)
+ return "http://tizen.org/privilege/telephony";
+
+ if (CONTEXT_TRIGGER_CONDITION_APP_USE_FREQUENCY == __context)
+ return "http://tizen.org/privilege/apphistory.read";
+
+ if (CONTEXT_TRIGGER_CONDITION_COMMUNICATION_FREQUENCY == __context)
+ return "http://tizen.org/privilege/callhistory.read";
+
+ if (CONTEXT_TRIGGER_CONDITION_MUSIC_PLAYBACK_FREQUENCY == __context)
+ return "http://tizen.org/privilege/mediahistory.read";
+
+ if (CONTEXT_TRIGGER_CONDITION_VIDEO_PLAYBACK_FREQUENCY == __context)
+ return "http://tizen.org/privilege/mediahistory.read";
+
+ return NULL;
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONTEXT_TRIGGER_CONTEXT_ITEM_H__
+#define __CONTEXT_TRIGGER_CONTEXT_ITEM_H__
+
+#include <ContextTypes.h>
+#include <job_scheduler_internal.h>
+
+
+class ContextItem {
+public:
+ virtual ~ContextItem() {}
+
+ virtual bool deprecated() = 0;
+ virtual const char* getUri() = 0;
+
+ bool allowed();
+ bool isValid(ctx_sched_job_context_h jobContext);
+ bool isValid(const std::string& attribute);
+ bool isValid(const std::string& attribute, int value);
+ bool isValid(const std::string& attribute, const std::string& value);
+
+protected:
+ ContextItem(int cx);
+
+ int __context;
+
+private:
+ virtual const char* __getPrivilege() = 0;
+};
+
+
+class EventItem : public ContextItem {
+public:
+ EventItem(int event);
+
+ bool deprecated();
+ const char* getUri();
+
+private:
+ const char* __getPrivilege();
+};
+
+
+class ConditionItem : public ContextItem {
+public:
+ ConditionItem(int cond);
+
+ bool deprecated();
+ const char* getUri();
+
+private:
+ const char* __getPrivilege();
+};
+
+
+#endif /* __CONTEXT_TRIGGER_CONTEXT_ITEM_H__ */