[Push] getRegistrationId and getUnreadNotifications
[platform/core/api/webapi-plugins.git] / src / push / push_instance.cc
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.
4
5 #include "push/push_instance.h"
6 #include <string>
7 #include <vector>
8 #include "common/logger.h"
9 #include "push/push_manager.h"
10
11 namespace extension {
12 namespace push {
13
14 PushInstance::PushInstance():
15         m_ignoreNotificationEvents(true) {
16     LoggerD("Enter");
17     using std::placeholders::_1;
18     using std::placeholders::_2;
19     RegisterHandler("Push_registerService",
20             std::bind(&PushInstance::registerService, this, _1, _2));
21     RegisterHandler("Push_unregisterService",
22             std::bind(&PushInstance::unregisterService, this, _1, _2));
23     RegisterSyncHandler("Push_connectService",
24             std::bind(&PushInstance::connectService, this, _1, _2));
25     RegisterSyncHandler("Push_disconnectService",
26             std::bind(&PushInstance::disconnectService, this, _1, _2));
27     RegisterSyncHandler("Push_getRegistrationId",
28             std::bind(&PushInstance::getRegistrationId, this, _1, _2));
29     RegisterSyncHandler("Push_getUnreadNotifications",
30             std::bind(&PushInstance::getUnreadNotifications, this, _1, _2));
31     PushManager::getInstance().setListener(this);
32 }
33
34 void PushInstance::registerService(const picojson::value& args,
35         picojson::object& out) {
36     LoggerD("Enter");
37     PushManager::ApplicationControl appControl;
38     appControl.operation = args.get("operation").get<std::string>();
39     if (args.get("uri").is<std::string>()) {
40         appControl.uri = args.get("uri").get<std::string>();
41     }
42     if (args.get("mime").is<std::string>()) {
43         appControl.mime = args.get("mime").get<std::string>();
44     }
45     if (args.get("category").is<std::string>()) {
46         appControl.category = args.get("category").get<std::string>();
47     }
48     if (args.get("data").is<picojson::null>() == false) {
49         std::vector<picojson::value> dataArray =
50                 args.get("data").get<picojson::array>();
51         for (auto &item : dataArray) {
52             std::string key = item.get("key").get<std::string>();
53             std::vector<picojson::value> values =
54                     item.get("value").get<picojson::array>();
55             for (auto &value : values) {
56                 appControl.data[key].push_back(value.to_str());
57             }
58         }
59     }
60     common::PlatformResult result = PushManager::getInstance().registerService(
61             appControl,
62             args.get("callbackId").get<double>());
63     if (result.IsError()) {
64         LoggerE("Error occured");
65         ReportError(result, &out);
66     } else {
67         picojson::value result;
68         ReportSuccess(result, out);
69     }
70 }
71
72 void PushInstance::unregisterService(const picojson::value& args,
73         picojson::object& out) {
74     LoggerD("Enter");
75     common::PlatformResult result = PushManager::getInstance()
76             .unregisterService(args.get("callbackId").get<double>());
77     if (result.IsError()) {
78         LoggerE("Error occured");
79         ReportError(result, &out);
80     } else {
81         picojson::value res;
82         ReportSuccess(res, out);
83     }
84 }
85
86 void PushInstance::connectService(const picojson::value& args,
87         picojson::object& out) {
88     LoggerD("Enter");
89     m_ignoreNotificationEvents = false;
90     picojson::value result;
91     ReportSuccess(result, out);
92 }
93
94 void PushInstance::disconnectService(const picojson::value& args,
95         picojson::object& out) {
96     LoggerD("Enter");
97     m_ignoreNotificationEvents = true;
98     picojson::value result;
99     ReportSuccess(result, out);
100 }
101
102 void PushInstance::getRegistrationId(const picojson::value& args,
103         picojson::object& out) {
104     LoggerD("Enter");
105     std::string id;
106     common::PlatformResult result = PushManager::getInstance()
107             .getRegistrationId(id);
108     if (result.IsError()) {
109         // this method should fail silently and return null
110         picojson::value res = picojson::value();
111         ReportSuccess(res, out);
112     } else {
113         picojson::value res(id);
114         ReportSuccess(res, out);
115     }
116 }
117
118 void PushInstance::getUnreadNotifications(const picojson::value& args,
119         picojson::object& out) {
120     LoggerD("Enter");
121     common::PlatformResult result = PushManager::getInstance()
122             .getUnreadNotifications();
123     if (result.IsError()) {
124         LoggerE("Error occured");
125         ReportError(result, &out);
126     } else {
127         picojson::value res;
128         ReportSuccess(res, out);
129     }
130 }
131
132 void PushInstance::onPushRegister(double callbackId,
133         common::PlatformResult result, const std::string& id) {
134     LoggerD("Enter");
135     picojson::value::object dict;
136     dict["callbackId"] = picojson::value(callbackId);
137     if (result.IsError()) {
138         dict["error"] = result.ToJSON();
139     } else {
140         dict["registrationId"] = picojson::value(id);
141     }
142     picojson::value res(dict);
143     PostMessage(res.serialize().c_str());
144 }
145
146 void PushInstance::onPushNotify(const std::string& appData,
147         const std::string& alertMessage, double date) {
148     LoggerD("Enter");
149     if (m_ignoreNotificationEvents) {
150         LoggerD("Listener not set, ignoring event");
151     }
152     picojson::value::object dict;
153     dict["listenerId"] = picojson::value("Push_Notification_Listener");
154     picojson::value::object pushMessage;
155     pushMessage["appData"] = picojson::value(appData);
156     pushMessage["alertMessage"] = picojson::value(alertMessage);
157     pushMessage["date"] = picojson::value(date);
158     dict["pushMessage"] = picojson::value(pushMessage);
159     picojson::value resultListener(dict);
160     PostMessage(resultListener.serialize().c_str());
161 }
162
163 void PushInstance::onDeregister(double callbackId,
164         common::PlatformResult result) {
165     LoggerD("Enter");
166     picojson::value::object dict;
167     dict["callbackId"] = picojson::value(callbackId);
168     if (result.IsError()) {
169         dict["error"] = result.ToJSON();
170     }
171     picojson::value res(dict);
172     PostMessage(res.serialize().c_str());
173 }
174
175 PushInstance::~PushInstance() {
176     LoggerD("Enter");
177 }
178
179 }  // namespace push
180 }  // namespace extension