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() {
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_registerService",
44 std::bind(&PushInstance::registerService, this, _1, _2));
45 REGISTER_ASYNC("Push_registerApplication",
46 std::bind(&PushInstance::registerApplication, this, _1, _2));
47 REGISTER_ASYNC("Push_unregisterService",
48 std::bind(&PushInstance::unregisterService, this, _1, _2));
49 REGISTER_ASYNC("Push_unregisterApplication",
50 std::bind(&PushInstance::unregisterApplication, this, _1, _2));
51 REGISTER_SYNC("Push_connectService",
52 std::bind(&PushInstance::connectService, this, _1, _2));
53 REGISTER_SYNC("Push_connect",
54 std::bind(&PushInstance::connect, this, _1, _2));
55 REGISTER_SYNC("Push_disconnectService",
56 std::bind(&PushInstance::disconnectService, this, _1, _2));
57 REGISTER_SYNC("Push_disconnect",
58 std::bind(&PushInstance::disconnect, this, _1, _2));
59 REGISTER_SYNC("Push_getRegistrationId",
60 std::bind(&PushInstance::getRegistrationId, this, _1, _2));
61 REGISTER_SYNC("Push_getUnreadNotifications",
62 std::bind(&PushInstance::getUnreadNotifications, this, _1, _2));
63 REGISTER_SYNC("Push_getPushMessage",
64 std::bind(&PushInstance::getPushMessage, this, _1, _2));
69 impl = new PushManager(this);
73 void PushInstance::registerService(const picojson::value& args,
74 picojson::object& out) {
77 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
78 common::PlatformResult result = impl->registerService(
79 args.get("callbackId").get<double>());
80 if (result.IsError()) {
81 LogAndReportError(result, &out, ("Error occured"));
87 void PushInstance::registerApplication(const picojson::value& args,
88 picojson::object& out) {
91 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
92 common::PlatformResult result = impl->registerApplication(
93 args.get("callbackId").get<double>());
94 if (result.IsError()) {
95 LogAndReportError(result, &out, ("Error occured"));
101 void PushInstance::unregisterService(const picojson::value& args,
102 picojson::object& out) {
105 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
107 common::PlatformResult result = impl->unregisterService(
108 args.get("callbackId").get<double>());
109 if (result.IsError()) {
110 LogAndReportError(result, &out, ("Error occured"));
116 void PushInstance::unregisterApplication(const picojson::value& args,
117 picojson::object& out) {
120 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
122 common::PlatformResult result = impl->unregisterApplication(
123 args.get("callbackId").get<double>());
124 if (result.IsError()) {
125 LogAndReportError(result, &out, ("Error occured"));
131 void PushInstance::connectService(const picojson::value& args,
132 picojson::object& out) {
135 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
137 common::PlatformResult result = impl->connectService();
138 if (result.IsError()) {
139 LogAndReportError(result, &out, ("Error while connect service"));
145 void PushInstance::connect(const picojson::value& args,
146 picojson::object& out) {
149 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
151 common::PlatformResult result = impl->connect();
152 if (result.IsError()) {
153 LogAndReportError(result, &out, ("Error while connect service"));
159 void PushInstance::disconnectService(const picojson::value& args,
160 picojson::object& out) {
163 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
165 common::PlatformResult result = impl->disconnectService();
166 if (result.IsError()) {
167 LogAndReportError(result, &out, ("Error while disconnect service"));
173 void PushInstance::disconnect(const picojson::value& args,
174 picojson::object& out) {
177 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
179 common::PlatformResult result = impl->disconnect();
180 if (result.IsError()) {
181 LogAndReportError(result, &out, ("Error while disconnect service"));
188 void PushInstance::getRegistrationId(const picojson::value& args,
189 picojson::object& out) {
192 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
195 common::PlatformResult result = impl->getRegistrationId(id);
196 if (result.IsError()) {
197 // this method should fail silently and return null
198 picojson::value res = picojson::value();
199 ReportSuccess(res, out);
201 picojson::value res(id);
202 ReportSuccess(res, out);
206 void PushInstance::getUnreadNotifications(const picojson::value& args,
207 picojson::object& out) {
210 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
212 common::PlatformResult result = impl->getUnreadNotifications();
213 if (result.IsError()) {
214 LogAndReportError(result, &out, ("Error occured"));
220 void PushInstance::getPushMessage(const picojson::value& args,
221 picojson::object& out) {
224 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
227 common::PlatformResult result = impl->getPushMessage(&msg);
229 if (result.IsError()) {
230 LoggerE("Error occurred");
231 ReportError(result, &out);
233 ReportSuccess(msg, out);
237 void PushInstance::onPushState(push_service_state_e state, common::PlatformResult result) {
239 picojson::value res{picojson::object()};
240 picojson::object& dict = res.get<picojson::object>();
242 dict["listenerId"] = picojson::value("Push_State_Listener");
243 if (result.IsError()) {
244 dict["error"] = result.ToJSON();
246 dict["state"] = picojson::value(PushManagerCommon::StateToString(state));
248 Instance::PostMessage(this, res.serialize().c_str());
251 void PushInstance::onPushRegister(double callbackId,
252 common::PlatformResult result, const std::string& id) {
253 picojson::value res{picojson::object()};
254 picojson::object& dict = res.get<picojson::object>();
256 dict["callbackId"] = picojson::value(callbackId);
257 if (result.IsError()) {
258 dict["error"] = result.ToJSON();
260 dict["registrationId"] = picojson::value(id);
262 Instance::PostMessage(this, res.serialize().c_str());
265 void PushInstance::onPushNotify(push_service_notification_h noti) {
267 picojson::value res{picojson::object()};
268 picojson::object& dict = res.get<picojson::object>();
270 picojson::value push_message{picojson::object()};
271 picojson::object& push_message_obj = push_message.get<picojson::object>();
273 PushManagerCommon::notificationToJson(noti, &push_message_obj);
275 dict["listenerId"] = picojson::value("Push_Notification_Listener");
276 dict["pushMessage"] = push_message;
277 Instance::PostMessage(this, res.serialize().c_str());
280 void PushInstance::onDeregister(double callbackId,
281 common::PlatformResult result) {
283 picojson::value res{picojson::object()};
284 picojson::object& dict = res.get<picojson::object>();
286 dict["callbackId"] = picojson::value(callbackId);
287 if (result.IsError()) {
288 dict["error"] = result.ToJSON();
290 Instance::PostMessage(this, res.serialize().c_str());
293 PushInstance::~PushInstance() {
302 } // namespace extension