diff --git a/c/opendht.cpp b/c/opendht.cpp index dd61b3cf45a702e916b385081923a250af9974a7..7ba15ea9c310953e9aa2b8ce41f40730d26a6628 100644 --- a/c/opendht.cpp +++ b/c/opendht.cpp @@ -343,6 +343,7 @@ int dht_runner_run_config(dht_runner* r, in_port_t port, const dht_runner_config config.push_node_id = conf->push_node_id ? std::string(conf->push_node_id) : std::string{}; config.push_token = conf->push_token ? std::string(conf->push_token) : std::string{}; config.push_topic = conf->push_topic ? std::string(conf->push_topic) : std::string{}; + config.push_platform = conf->push_platform ? std::string(conf->push_platform) : std::string{}; config.peer_discovery = conf->peer_discovery; config.peer_publish = conf->peer_publish; diff --git a/c/opendht_c.h b/c/opendht_c.h index 5cdad798ead947551af3112133794c6a0a06843e..5e9a9aed6530f9ba313062f398d39bee6cb15a8a 100644 --- a/c/opendht_c.h +++ b/c/opendht_c.h @@ -147,6 +147,7 @@ struct OPENDHT_PUBLIC dht_runner_config { const char* push_node_id; const char* push_token; const char* push_topic; + const char* push_platform; bool peer_discovery; bool peer_publish; dht_certificate* server_ca; diff --git a/include/opendht/dht_interface.h b/include/opendht/dht_interface.h index 41ab734d7c618fe924d97a25b36f2fca8372705b..e621b1617974d19718b36f342715ae85c3988d31 100644 --- a/include/opendht/dht_interface.h +++ b/include/opendht/dht_interface.h @@ -266,6 +266,7 @@ public: virtual void setPushNotificationToken(const std::string&) {}; virtual void setPushNotificationTopic(const std::string&) {}; + virtual void setPushNotificationPlatform(const std::string&) {}; /** * Call linked callback with a push notification diff --git a/include/opendht/dht_proxy_client.h b/include/opendht/dht_proxy_client.h index 08bfb05fd281e27bdf9b87b57021f6230cc8ef83..02f8b2c565a1cf444524bdafb873300c5531684e 100644 --- a/include/opendht/dht_proxy_client.h +++ b/include/opendht/dht_proxy_client.h @@ -75,6 +75,14 @@ public: #endif } + virtual void setPushNotificationPlatform(const std::string& platform) override { +#ifdef OPENDHT_PUSH_NOTIFICATIONS + platform_ = platform; +#else + (void) platform; +#endif + } + virtual ~DhtProxyClient(); /** @@ -415,6 +423,20 @@ private: */ std::string notificationTopic_ {}; + /** + * Platform for push notifications (supported android, ios, unifiedpush) + */ + std::string platform_ +#ifdef __ANDROID__ + {"android"}; +#else +#ifdef __APPLE__ + {"ios"}; +#else + {}; +#endif +#endif + const std::function<void()> loopSignal_; #ifdef OPENDHT_PUSH_NOTIFICATIONS diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h index 2ea3c4f83e35422d41b653def84852dbbbc8e422..450b31581d58f9115ef0ad89306a7ac717d08708 100644 --- a/include/opendht/dhtrunner.h +++ b/include/opendht/dhtrunner.h @@ -62,6 +62,7 @@ public: std::string push_node_id {}; std::string push_token {}; std::string push_topic {}; + std::string push_platform {}; bool peer_discovery {false}; bool peer_publish {false}; std::shared_ptr<dht::crypto::Certificate> server_ca; @@ -453,6 +454,11 @@ public: */ void setPushNotificationTopic(const std::string& topic); + /** + * Sets the push notification platform + */ + void setPushNotificationPlatform(const std::string& platform); + /** * Insert a push notification to process for OpenDHT */ diff --git a/rust/src/dhtrunner.rs b/rust/src/dhtrunner.rs index 3470e3db4f553deb625b4d63fd3b42592bc5fbbb..ecac8f065548a5fa866fe03d0ee0177db4a11fed 100644 --- a/rust/src/dhtrunner.rs +++ b/rust/src/dhtrunner.rs @@ -48,6 +48,7 @@ impl DhtRunnerConfig { push_node_id: ptr::null(), push_token: ptr::null(), push_topic: ptr::null(), + push_platform: ptr::null(), peer_discovery: false, peer_publish: false, server_ca: ptr::null_mut(), @@ -78,6 +79,10 @@ impl DhtRunnerConfig { self.push_topic = CString::new(push_topic).unwrap().as_ptr(); } + pub fn set_push_platform(&mut self, push_platform: &str) { + self.push_platform = CString::new(push_platform).unwrap().as_ptr(); + } + pub fn set_identity(&mut self, certificate: Box<DhtCertificate>, privatekey: Box<PrivateKey>) { self.dht_config.id.privatekey = Box::into_raw(privatekey); self.dht_config.id.certificate = Box::into_raw(certificate); diff --git a/rust/src/ffi.rs b/rust/src/ffi.rs index 97cac9acfa587ada4c9d6b15e384c9423a336b6b..8e7eefb5bcad0f666d2e833e44ac1199f629e7df 100644 --- a/rust/src/ffi.rs +++ b/rust/src/ffi.rs @@ -119,6 +119,7 @@ pub struct DhtRunnerConfig pub push_node_id: *const c_char, pub push_token: *const c_char, pub push_topic: *const c_char, + pub push_platform: *const c_char, pub peer_discovery: bool, pub peer_publish: bool, pub server_ca: *mut DhtCertificate, diff --git a/src/dht_proxy_client.cpp b/src/dht_proxy_client.cpp index b91f2824551538e94e34bd86b56a67a7768ed921..d53b7693705b3bb67e0df27dbaf7e69b6feef6fe 100644 --- a/src/dht_proxy_client.cpp +++ b/src/dht_proxy_client.cpp @@ -1325,13 +1325,8 @@ DhtProxyClient::getPushRequest(Json::Value& body) const body["key"] = deviceKey_; body["client_id"] = pushClientId_; body["session_id"] = pushSessionId_; -#ifdef __ANDROID__ - body["platform"] = "android"; -#endif -#ifdef __APPLE__ body["topic"] = notificationTopic_; - body["platform"] = "ios"; -#endif + body["platform"] = platform_; } std::string diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp index a73897ff0b63dd5ab621cc753633bcd197e6c746..f687fdd7cfb850c357a343c707e5251f872d2062 100644 --- a/src/dhtrunner.cpp +++ b/src/dhtrunner.cpp @@ -1115,6 +1115,8 @@ DhtRunner::enableProxy(bool proxify) dht_via_proxy->setPushNotificationToken(config_.push_token); if (not config_.push_topic.empty()) dht_via_proxy->setPushNotificationTopic(config_.push_topic); + if (not config_.push_platform.empty()) + dht_via_proxy->setPushNotificationPlatform(config_.push_platform); dht_ = std::make_unique<SecureDht>(std::move(dht_via_proxy), config_.dht_config, identityAnnouncedCb_, logger_); // and use it use_proxy = proxify; @@ -1162,6 +1164,18 @@ DhtRunner::setPushNotificationTopic(const std::string& topic) { #endif } +void +DhtRunner::setPushNotificationPlatform(const std::string& platform) { + std::lock_guard<std::mutex> lck(dht_mtx); +#if defined(OPENDHT_PROXY_CLIENT) && defined(OPENDHT_PUSH_NOTIFICATIONS) + config_.push_platform = platform; + if (dht_) + dht_->setPushNotificationPlatform(platform); +#else + (void) platform; +#endif +} + void DhtRunner::pushNotificationReceived(const std::map<std::string, std::string>& data) {