1 // Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "push/push_instance.h"
8 #include "common/logger.h"
9 #include "push/push_manager.h"
16 const std::string kPrivilegePush = "http://tizen.org/privilege/push";
20 PushInstance::PushInstance(): m_ignoreNotificationEvents(true) {
22 using std::placeholders::_1;
23 using std::placeholders::_2;
25 #define REGISTER_ASYNC(c, func) \
26 RegisterSyncHandler(c, func);
27 #define REGISTER_SYNC(c, func) \
28 RegisterSyncHandler(c, func);
30 REGISTER_ASYNC("Push_registerService",
31 std::bind(&PushInstance::registerService, this, _1, _2));
32 REGISTER_ASYNC("Push_unregisterService",
33 std::bind(&PushInstance::unregisterService, this, _1, _2));
34 REGISTER_SYNC("Push_connectService",
35 std::bind(&PushInstance::connectService, this, _1, _2));
36 REGISTER_SYNC("Push_disconnectService",
37 std::bind(&PushInstance::disconnectService, this, _1, _2));
38 REGISTER_SYNC("Push_getRegistrationId",
39 std::bind(&PushInstance::getRegistrationId, this, _1, _2));
40 REGISTER_SYNC("Push_getUnreadNotifications",
41 std::bind(&PushInstance::getUnreadNotifications, this, _1, _2));
42 PushManager::getInstance().setListener(this);
48 void PushInstance::registerService(const picojson::value& args,
49 picojson::object& out) {
52 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
54 PushManager::ApplicationControl appControl;
55 appControl.operation = args.get("operation").get<std::string>();
56 if (args.get("uri").is<std::string>()) {
57 appControl.uri = args.get("uri").get<std::string>();
59 if (args.get("mime").is<std::string>()) {
60 appControl.mime = args.get("mime").get<std::string>();
62 if (args.get("category").is<std::string>()) {
63 appControl.category = args.get("category").get<std::string>();
65 if (args.get("data").is<picojson::null>() == false) {
66 std::vector<picojson::value> dataArray =
67 args.get("data").get<picojson::array>();
68 for (auto &item : dataArray) {
69 std::string key = item.get("key").get<std::string>();
70 std::vector<picojson::value> values =
71 item.get("value").get<picojson::array>();
72 for (auto &value : values) {
73 appControl.data[key].push_back(value.to_str());
77 common::PlatformResult result = PushManager::getInstance().registerService(
79 args.get("callbackId").get<double>());
80 if (result.IsError()) {
81 LoggerE("Error occured");
82 ReportError(result, &out);
84 picojson::value result;
85 ReportSuccess(result, out);
89 void PushInstance::unregisterService(const picojson::value& args,
90 picojson::object& out) {
93 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
95 common::PlatformResult result = PushManager::getInstance()
96 .unregisterService(args.get("callbackId").get<double>());
97 if (result.IsError()) {
98 LoggerE("Error occured");
99 ReportError(result, &out);
102 ReportSuccess(res, out);
106 void PushInstance::connectService(const picojson::value& args,
107 picojson::object& out) {
110 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
112 m_ignoreNotificationEvents = false;
113 picojson::value result;
114 ReportSuccess(result, out);
117 void PushInstance::disconnectService(const picojson::value& args,
118 picojson::object& out) {
121 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
123 m_ignoreNotificationEvents = true;
124 picojson::value result;
125 ReportSuccess(result, out);
128 void PushInstance::getRegistrationId(const picojson::value& args,
129 picojson::object& out) {
132 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
135 common::PlatformResult result = PushManager::getInstance()
136 .getRegistrationId(id);
137 if (result.IsError()) {
138 // this method should fail silently and return null
139 picojson::value res = picojson::value();
140 ReportSuccess(res, out);
142 picojson::value res(id);
143 ReportSuccess(res, out);
147 void PushInstance::getUnreadNotifications(const picojson::value& args,
148 picojson::object& out) {
151 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
153 common::PlatformResult result = PushManager::getInstance()
154 .getUnreadNotifications();
155 if (result.IsError()) {
156 LoggerE("Error occured");
157 ReportError(result, &out);
160 ReportSuccess(res, out);
164 void PushInstance::onPushRegister(double callbackId,
165 common::PlatformResult result, const std::string& id) {
167 picojson::value::object dict;
168 dict["callbackId"] = picojson::value(callbackId);
169 if (result.IsError()) {
170 dict["error"] = result.ToJSON();
172 dict["registrationId"] = picojson::value(id);
174 picojson::value res(dict);
175 PostMessage(res.serialize().c_str());
178 void PushInstance::onPushNotify(const std::string& appData,
179 const std::string& alertMessage, double date) {
181 if (m_ignoreNotificationEvents) {
182 LoggerD("Listener not set, ignoring event");
184 picojson::value::object dict;
185 dict["listenerId"] = picojson::value("Push_Notification_Listener");
186 picojson::value::object pushMessage;
187 pushMessage["appData"] = picojson::value(appData);
188 pushMessage["alertMessage"] = picojson::value(alertMessage);
189 pushMessage["date"] = picojson::value(date);
190 dict["pushMessage"] = picojson::value(pushMessage);
191 picojson::value resultListener(dict);
192 PostMessage(resultListener.serialize().c_str());
195 void PushInstance::onDeregister(double callbackId,
196 common::PlatformResult result) {
198 picojson::value::object dict;
199 dict["callbackId"] = picojson::value(callbackId);
200 if (result.IsError()) {
201 dict["error"] = result.ToJSON();
203 picojson::value res(dict);
204 PostMessage(res.serialize().c_str());
207 PushInstance::~PushInstance() {
212 } // namespace extension