2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
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.
17 #include "push/push_instance.h"
20 #include "common/logger.h"
21 #include "common/tools.h"
22 #include "push/push_manager.h"
29 const std::string kPrivilegePush = "http://tizen.org/privilege/push";
33 PushInstance::PushInstance(): m_ignoreNotificationEvents(true) {
35 using std::placeholders::_1;
36 using std::placeholders::_2;
38 #define REGISTER_ASYNC(c, func) \
39 RegisterSyncHandler(c, func);
40 #define REGISTER_SYNC(c, func) \
41 RegisterSyncHandler(c, func);
43 REGISTER_ASYNC("Push_registerApplication",
44 std::bind(&PushInstance::registerApplication, this, _1, _2));
45 REGISTER_ASYNC("Push_unregisterApplication",
46 std::bind(&PushInstance::unregisterApplication, this, _1, _2));
47 REGISTER_SYNC("Push_connectService",
48 std::bind(&PushInstance::connectService, this, _1, _2));
49 REGISTER_SYNC("Push_disconnectService",
50 std::bind(&PushInstance::disconnectService, this, _1, _2));
51 REGISTER_SYNC("Push_getRegistrationId",
52 std::bind(&PushInstance::getRegistrationId, this, _1, _2));
53 REGISTER_SYNC("Push_getUnreadNotifications",
54 std::bind(&PushInstance::getUnreadNotifications, this, _1, _2));
55 REGISTER_SYNC("Push_getPushMessage",
56 std::bind(&PushInstance::getPushMessage, this, _1, _2));
57 impl = new PushManager();
58 impl->setListener(this);
64 void PushInstance::registerApplication(const picojson::value& args,
65 picojson::object& out) {
68 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
69 common::PlatformResult result = impl->registerApplication(
70 args.get("callbackId").get<double>());
71 if (result.IsError()) {
72 LogAndReportError(result, &out, ("Error occured"));
74 picojson::value result;
75 ReportSuccess(result, out);
79 void PushInstance::unregisterApplication(const picojson::value& args,
80 picojson::object& out) {
83 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
85 common::PlatformResult result = impl->unregisterApplication(
86 args.get("callbackId").get<double>());
87 if (result.IsError()) {
88 LogAndReportError(result, &out, ("Error occured"));
91 ReportSuccess(res, out);
95 void PushInstance::connectService(const picojson::value& args,
96 picojson::object& out) {
99 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
101 m_ignoreNotificationEvents = false;
102 picojson::value result;
103 ReportSuccess(result, out);
106 void PushInstance::disconnectService(const picojson::value& args,
107 picojson::object& out) {
110 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
112 m_ignoreNotificationEvents = true;
113 picojson::value result;
114 ReportSuccess(result, out);
117 void PushInstance::getRegistrationId(const picojson::value& args,
118 picojson::object& out) {
121 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
124 common::PlatformResult result = impl->getRegistrationId(id);
125 if (result.IsError()) {
126 // this method should fail silently and return null
127 picojson::value res = picojson::value();
128 ReportSuccess(res, out);
130 picojson::value res(id);
131 ReportSuccess(res, out);
135 void PushInstance::getUnreadNotifications(const picojson::value& args,
136 picojson::object& out) {
139 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
141 common::PlatformResult result = impl->getUnreadNotifications();
142 if (result.IsError()) {
143 LogAndReportError(result, &out, ("Error occured"));
146 ReportSuccess(res, out);
150 void PushInstance::getPushMessage(const picojson::value& args,
151 picojson::object& out) {
154 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
157 common::PlatformResult result = impl->getPushMessage(&msg);
159 if (result.IsError()) {
160 LoggerE("Error occurred");
161 ReportError(result, &out);
163 ReportSuccess(msg, out);
167 void PushInstance::onPushRegister(double callbackId,
168 common::PlatformResult result, const std::string& id) {
170 picojson::value::object dict;
171 dict["callbackId"] = picojson::value(callbackId);
172 if (result.IsError()) {
173 dict["error"] = result.ToJSON();
175 dict["registrationId"] = picojson::value(id);
177 picojson::value res(dict);
178 Instance::PostMessage(this, res.serialize().c_str());
181 void PushInstance::onPushNotify(push_service_notification_h noti) {
183 if (m_ignoreNotificationEvents) {
184 LoggerD("Listener not set, ignoring event");
186 picojson::value::object dict;
187 picojson::value::object pushMessage;
188 impl->notificationToJson(noti, &pushMessage);
190 dict["listenerId"] = picojson::value("Push_Notification_Listener");
191 dict["pushMessage"] = picojson::value(pushMessage);
192 picojson::value resultListener(dict);
193 Instance::PostMessage(this, resultListener.serialize().c_str());
196 void PushInstance::onDeregister(double callbackId,
197 common::PlatformResult result) {
199 picojson::value::object dict;
200 dict["callbackId"] = picojson::value(callbackId);
201 if (result.IsError()) {
202 dict["error"] = result.ToJSON();
204 picojson::value res(dict);
205 Instance::PostMessage(this, res.serialize().c_str());
208 PushInstance::~PushInstance() {
210 impl->setListener(nullptr);
214 } // namespace extension