void PushInstance::unregisterService(const picojson::value& args,
picojson::object& out) {
LoggerD("Enter");
- picojson::value result;
- ReportSuccess(result, out);
+ common::PlatformResult result = PushManager::getInstance()
+ .unregisterService(args.get("callbackId").get<double>());
+ if (result.IsError()) {
+ LoggerE("Error occured");
+ ReportError(result, &out);
+ } else {
+ picojson::value res;
+ ReportSuccess(res, out);
+ }
}
void PushInstance::connectService(const picojson::value& args,
PostMessage(resultListener.serialize().c_str());
}
+void PushInstance::onDeregister(double callbackId,
+ common::PlatformResult result) {
+ LoggerD("Enter");
+ picojson::value::object dict;
+ dict["callbackId"] = picojson::value(callbackId);
+ if (result.IsError()) {
+ dict["error"] = result.ToJSON();
+ }
+ picojson::value res(dict);
+ PostMessage(res.serialize().c_str());
+}
+
PushInstance::~PushInstance() {
LoggerD("Enter");
}
common::PlatformResult result, const std::string& id);
virtual void onPushNotify(const std::string& appData,
const std::string& alertMessage, double date);
+ virtual void onDeregister(double callbackId, common::PlatformResult result);
private:
void registerService(const picojson::value& args, picojson::object& out);
PushManager::PushManager() :
m_handle(NULL),
- m_listener(NULL) {
+ m_listener(NULL),
+ m_state(PUSH_STATE_UNREGISTERED) {
LoggerD("Enter");
initAppId();
return common::PlatformResult(ErrorCode::NO_ERROR);
}
+common::PlatformResult PushManager::unregisterService(double callbackId) {
+ double* pcallbackId = new double(callbackId);
+ if (m_state == PUSH_STATE_UNREGISTERED) {
+ LoggerD("Already unregister, call unregister callback");
+ if (!g_idle_add(onFakeDeregister, pcallbackId)) {
+ delete pcallbackId;
+ LoggerE("g_idle_add failed");
+ return common::PlatformResult(ErrorCode::UNKNOWN_ERR,
+ "Unknown error");
+ }
+ } else {
+ int ret = push_deregister(m_handle, onDeregister, pcallbackId);
+ if (ret != PUSH_ERROR_NONE) {
+ delete pcallbackId;
+ LoggerE("Failed to deregister: push_deregister failed");
+ return common::PlatformResult(ErrorCode::UNKNOWN_ERR,
+ "Unknown error");
+ }
+ }
+ return common::PlatformResult(ErrorCode::NO_ERROR);
+}
+
void PushManager::onPushState(push_state_e state, const char* err,
void* user_data) {
LoggerD("Enter %d", state);
+ getInstance().m_state = state;
}
void PushManager::onPushNotify(push_notification_h noti, void* user_data) {
delete callbackId;
}
+gboolean PushManager::onFakeDeregister(gpointer user_data) {
+ LoggerD("Enter");
+ if (!getInstance().m_listener) {
+ LoggerW("Listener not set, ignoring");
+ return G_SOURCE_REMOVE;
+ }
+ double* callbackId = static_cast<double*>(user_data);
+ getInstance().m_listener->onDeregister(*callbackId,
+ PlatformResult(ErrorCode::NO_ERROR));
+ delete callbackId;
+ return G_SOURCE_REMOVE;
+}
+
+void PushManager::onDeregister(push_result_e result, const char* msg,
+ void* user_data) {
+ LoggerD("Enter");
+ if (!getInstance().m_listener) {
+ LoggerW("Listener not set, ignoring");
+ return;
+ }
+ double* callbackId = static_cast<double*>(user_data);
+ if (result == PUSH_RESULT_SUCCESS) {
+ getInstance().m_listener->onDeregister(*callbackId,
+ PlatformResult(ErrorCode::NO_ERROR));
+ } else {
+ getInstance().m_listener->onDeregister(*callbackId,
+ PlatformResult(ErrorCode::UNKNOWN_ERR,
+ msg == NULL ? "Unknown error" : msg));
+ }
+ delete callbackId;
+}
+
} // namespace push
} // namespace extension
#define SRC_PUSH_PUSH_MANAGER_H_
#include <push.h>
+#include <glib.h>
#include <string>
#include <vector>
#include <map>
common::PlatformResult result, const std::string& id) = 0;
virtual void onPushNotify(const std::string& appData,
const std::string& alertMessage, double date) = 0;
+ virtual void onDeregister(double callbackId,
+ common::PlatformResult result) = 0;
virtual ~EventListener() {}
};
};
common::PlatformResult registerService(const ApplicationControl &appControl,
double callbackId);
+ common::PlatformResult unregisterService(double callbackId);
private:
PushManager();
static void onPushNotify(push_notification_h noti, void *user_data);
static void onPushRegister(push_result_e result, const char *msg,
void *user_data);
+ static gboolean onFakeDeregister(gpointer user_data);
+ static void onDeregister(push_result_e result, const char *msg,
+ void *user_data);
push_connection_h m_handle;
EventListener* m_listener;
+ push_state_e m_state;
std::string m_appId;
std::string m_pkgId;
};