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"
23 #include "push/push_manager_old.h"
30 const std::string kPrivilegePush = "http://tizen.org/privilege/push";
34 PushInstance::PushInstance() : impl(nullptr) {
36 using std::placeholders::_1;
37 using std::placeholders::_2;
39 #define REGISTER_ASYNC(c, func) \
40 RegisterSyncHandler(c, func);
41 #define REGISTER_SYNC(c, func) \
42 RegisterSyncHandler(c, func);
44 REGISTER_ASYNC("Push_registerApplication",
45 std::bind(&PushInstance::registerApplication, this, _1, _2));
46 REGISTER_ASYNC("Push_unregisterApplication",
47 std::bind(&PushInstance::unregisterApplication, this, _1, _2));
48 REGISTER_SYNC("Push_connectService",
49 std::bind(&PushInstance::connectService, this, _1, _2));
50 REGISTER_SYNC("Push_disconnectService",
51 std::bind(&PushInstance::disconnectService, this, _1, _2));
52 REGISTER_SYNC("Push_getRegistrationId",
53 std::bind(&PushInstance::getRegistrationId, this, _1, _2));
54 REGISTER_SYNC("Push_getUnreadNotifications",
55 std::bind(&PushInstance::getUnreadNotifications, this, _1, _2));
56 REGISTER_SYNC("Push_getPushMessage",
57 std::bind(&PushInstance::getPushMessage, this, _1, _2));
63 void PushInstance::initApi(ApiVersionType type) {
66 if (PUSH_API_2_4 == type) {
67 LoggerD("No API already initialized - using Tizen 2.4 API");
68 impl = new PushManagerOld(this);
70 LoggerD("No API already initialized - using Tizen 3.0 API");
71 impl = new PushManager(this);
74 LoggerD("API already initialized - use currently initialized API");
78 void PushInstance::registerApplication(const picojson::value& args,
79 picojson::object& out) {
81 initApi(PUSH_API_2_4);
83 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
84 common::PlatformResult result = impl->registerApplication(
85 args.get("callbackId").get<double>());
86 if (result.IsError()) {
87 LogAndReportError(result, &out, ("Error occured"));
93 void PushInstance::unregisterApplication(const picojson::value& args,
94 picojson::object& out) {
96 initApi(PUSH_API_2_4);
98 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
100 common::PlatformResult result = impl->unregisterApplication(
101 args.get("callbackId").get<double>());
102 if (result.IsError()) {
103 LogAndReportError(result, &out, ("Error occured"));
109 void PushInstance::connectService(const picojson::value& args,
110 picojson::object& out) {
112 initApi(PUSH_API_3_0);
114 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
116 common::PlatformResult result = impl->connectService();
117 if (result.IsError()) {
118 LogAndReportError(result, &out, ("Error while connect service"));
124 void PushInstance::disconnectService(const picojson::value& args,
125 picojson::object& out) {
127 initApi(PUSH_API_2_4);
129 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
131 common::PlatformResult result = impl->disconnectService();
132 if (result.IsError()) {
133 LogAndReportError(result, &out, ("Error while disconnect service"));
140 void PushInstance::getRegistrationId(const picojson::value& args,
141 picojson::object& out) {
143 initApi(PUSH_API_2_4);
145 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
148 common::PlatformResult result = impl->getRegistrationId(id);
149 if (result.IsError()) {
150 // this method should fail silently and return null
151 picojson::value res = picojson::value();
152 ReportSuccess(res, out);
154 picojson::value res(id);
155 ReportSuccess(res, out);
159 void PushInstance::getUnreadNotifications(const picojson::value& args,
160 picojson::object& out) {
162 initApi(PUSH_API_2_4);
164 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
166 common::PlatformResult result = impl->getUnreadNotifications();
167 if (result.IsError()) {
168 LogAndReportError(result, &out, ("Error occured"));
174 void PushInstance::getPushMessage(const picojson::value& args,
175 picojson::object& out) {
177 initApi(PUSH_API_2_4);
179 CHECK_PRIVILEGE_ACCESS(kPrivilegePush, &out);
182 common::PlatformResult result = impl->getPushMessage(&msg);
184 if (result.IsError()) {
185 LoggerE("Error occurred");
186 ReportError(result, &out);
188 ReportSuccess(msg, out);
192 void PushInstance::onPushRegister(double callbackId,
193 common::PlatformResult result, const std::string& id) {
194 picojson::value::object dict;
195 dict["callbackId"] = picojson::value(callbackId);
196 if (result.IsError()) {
197 dict["error"] = result.ToJSON();
199 dict["registrationId"] = picojson::value(id);
201 picojson::value res(dict);
202 Instance::PostMessage(this, res.serialize().c_str());
205 void PushInstance::onPushNotify(push_service_notification_h noti) {
207 picojson::value::object dict;
208 picojson::value::object pushMessage;
209 impl->notificationToJson(noti, &pushMessage);
211 dict["listenerId"] = picojson::value("Push_Notification_Listener");
212 dict["pushMessage"] = picojson::value(pushMessage);
213 picojson::value resultListener(dict);
214 Instance::PostMessage(this, resultListener.serialize().c_str());
217 void PushInstance::onDeregister(double callbackId,
218 common::PlatformResult result) {
220 picojson::value::object dict;
221 dict["callbackId"] = picojson::value(callbackId);
222 if (result.IsError()) {
223 dict["error"] = result.ToJSON();
225 picojson::value res(dict);
226 Instance::PostMessage(this, res.serialize().c_str());
229 PushInstance::~PushInstance() {
238 } // namespace extension