2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <TriggerTypes.h>
20 #include "ContextMonitor.h"
21 #include "TemplateManager.h"
22 #include "RuleManager.h"
25 using namespace ctx::trigger;
36 bool Trigger::init(ContextManager* ctxMgr)
38 // Do the necessary initialization process.
39 // This function is called from the main thread during the service launching process.
40 _D("Context Trigger Init");
41 __processInitialize(ctxMgr);
46 void Trigger::release()
48 // Release the occupied resources.
49 // This function is called from the main thread during the service termination process.
51 _D("Template Manager Destroy");
52 TemplateManager::destroy();
54 _D("Rule Manager Release");
58 _D("Context Monitor Destroy");
59 ContextMonitor::destroy();
62 bool Trigger::assignRequest(RequestInfo* request)
64 std::string subject = request->getSubject();
65 if (subject != SUBJ_TRIGGER_ADD && subject != SUBJ_TRIGGER_REMOVE &&
66 subject != SUBJ_TRIGGER_ENABLE && subject != SUBJ_TRIGGER_DISABLE &&
67 subject != SUBJ_TRIGGER_GET && subject != SUBJ_TRIGGER_GET_RULE_IDS &&
68 subject != SUBJ_TRIGGER_GET_TEMPLATE) {
72 __processRequest(request);
76 void Trigger::__processRequest(RequestInfo* request)
78 // Process the request, and reply to the client if necessary.
79 const char* reqSubj = request->getSubject();
80 _D("Request is %s", reqSubj);
81 std::string subject(reqSubj);
83 if (subject == SUBJ_TRIGGER_ADD) {
85 } else if (subject == SUBJ_TRIGGER_REMOVE) {
86 __removeRule(request);
87 } else if (subject == SUBJ_TRIGGER_ENABLE) {
88 __enableRule(request);
89 } else if (subject == SUBJ_TRIGGER_DISABLE) {
90 __disableRule(request);
91 } else if (subject == SUBJ_TRIGGER_GET) {
92 __getRuleById(request);
93 } else if (subject == SUBJ_TRIGGER_GET_RULE_IDS) {
94 __getRuleIds(request);
95 } else if (subject == SUBJ_TRIGGER_GET_TEMPLATE) {
96 __getTemplate(request);
98 _E("Invalid request");
104 void Trigger::__processInitialize(ContextManager* mgr)
107 ContextMonitor::setContextManager(mgr);
110 __ruleMgr = new(std::nothrow) RuleManager();
111 IF_FAIL_VOID_TAG(__ruleMgr, _E, "Memory allocation failed");
114 TemplateManager::setManager(mgr, __ruleMgr);
115 TemplateManager* tmplMgr = TemplateManager::getInstance();
116 IF_FAIL_VOID_TAG(tmplMgr, _E, "Memory allocation failed");
119 if (!tmplMgr->init()) {
120 _E("Template manager initialization failed");
124 if (!__ruleMgr->init()) {
125 _E("Context trigger initialization failed");
130 void Trigger::__addRule(RequestInfo* request)
134 const char* client = request->getClient();
135 if (client == NULL) {
136 request->reply(ERR_OPERATION_FAILED);
140 const char* pkgId = request->getPackageId();
142 int error = __ruleMgr->addRule(client, pkgId, request->getDescription(), &ruleId);
143 _I("'%s' adds a rule (Error: %#x)", request->getClient(), error);
145 request->reply(error, ruleId);
148 void Trigger::__removeRule(RequestInfo* request)
153 const char* pkgId = request->getPackageId();
155 CtxJson1 ruleId = request->getDescription();
156 ruleId.get(NULL, TRIG_KEY_RULE_ID, &id);
158 error = __ruleMgr->checkRule((pkgId)? pkgId : "", id);
159 if (error != ERR_NONE) {
160 request->reply(error);
164 bool ret = __ruleMgr->isRuleEnabled(id);
166 request->reply(ERR_RULE_ENABLED);
170 error = __ruleMgr->removeRule(id);
171 _I("'%s' removes rule%d (Error: %#x)", request->getClient(), id, error);
172 request->reply(error);
175 void Trigger::__enableRule(RequestInfo* request)
180 const char* pkgId = request->getPackageId();
182 CtxJson1 ruleId = request->getDescription();
183 ruleId.get(NULL, TRIG_KEY_RULE_ID, &id);
185 error = __ruleMgr->checkRule((pkgId)? pkgId : "", id);
186 if (error != ERR_NONE) {
187 request->reply(error);
191 bool ret = __ruleMgr->isRuleEnabled(id);
193 request->reply(ERR_RULE_ENABLED);
197 error = __ruleMgr->enableRule(id);
198 _I("'%s' enables rule%d (Error: %#x)", request->getClient(), id, error);
199 request->reply(error);
202 void Trigger::__disableRule(RequestInfo* request)
207 const char* pkgId = request->getPackageId();
209 CtxJson1 ruleId = request->getDescription();
210 ruleId.get(NULL, TRIG_KEY_RULE_ID, &id);
212 error = __ruleMgr->checkRule((pkgId)? pkgId : "", id);
213 if (error != ERR_NONE) {
214 request->reply(error);
218 bool ret = __ruleMgr->isRuleEnabled(id);
220 request->reply(ERR_RULE_NOT_ENABLED);
224 error = __ruleMgr->disableRule(id);
225 _I("'%s' disables rule%d (Error: %#x)", request->getClient(), id, error);
226 request->reply(error);
229 void Trigger::__getRuleById(RequestInfo* request)
233 CtxJson1 option = request->getDescription();
235 option.get(NULL, TRIG_KEY_RULE_ID, &id);
237 const char* pkgId = request->getPackageId();
240 error = __ruleMgr->getRuleById((pkgId)? pkgId : "", id, &readData);
243 request->reply(error, dummy, readData);
246 void Trigger::__getRuleIds(RequestInfo* request)
250 const char* pkgId = request->getPackageId();
253 error = __ruleMgr->getRuleIds((pkgId)? pkgId : "", &readData);
256 request->reply(error, dummy, readData);
259 void Trigger::__getTemplate(RequestInfo* request)
263 CtxJson1 option = request->getDescription();
265 option.get(NULL, TRIG_TMPL_KEY_SUBJECT, &name);
267 TemplateManager* tmplMgr = TemplateManager::getInstance();
269 _E("Memory allocation failed");
270 request->reply(ERR_OUT_OF_MEMORY);
275 error = tmplMgr->getTemplate(name, &tmpl);
278 request->reply(error, dummy, tmpl);