6#include "connector_p.h"
9#include <QCoreApplication>
14static QString fromJniString(JNIEnv *env, jstring s)
20 const char *str = env->GetStringUTFChars(s,
nullptr);
22 env->ReleaseStringUTFChars(s, str);
26static void newEndpoint(JNIEnv *env, jobject that, jstring token, jstring endpoint)
29 for (
auto c : ConnectorPrivate::s_instances) {
30 c->NewEndpoint(fromJniString(env, token), fromJniString(env, endpoint));
34static void registrationFailed(JNIEnv *env, jobject that, jstring token, jstring reason)
37 for (
auto c :ConnectorPrivate::s_instances) {
38 c->registrationFailed(fromJniString(env, token), fromJniString(env, reason));
42static void unregistered(JNIEnv *env, jobject that, jstring token)
45 for (
auto c : ConnectorPrivate::s_instances) {
46 c->Unregistered(fromJniString(env, token));
50static void message(JNIEnv *env, jobject that, jstring token, jbyteArray message, jstring messageId)
53 const auto messageSize = env->GetArrayLength(message);
54 const auto messageData = env->GetByteArrayElements(message,
nullptr);
56 for (
auto c : ConnectorPrivate::s_instances) {
57 c->handleMessage(fromJniString(env, token), messageQBA, fromJniString(env, messageId));
59 env->ReleaseByteArrayElements(message, messageData, JNI_ABORT);
62static const JNINativeMethod methods[] = {
63 {
"newEndpoint",
"(Ljava/lang/String;Ljava/lang/String;)V", (
void*)newEndpoint},
64 {
"registrationFailed",
"(Ljava/lang/String;Ljava/lang/String;)V", (
void*)registrationFailed},
65 {
"unregistered",
"(Ljava/lang/String;)V", (
void*)unregistered},
66 {
"message",
"(Ljava/lang/String;[BLjava/lang/String;)V", (
void*)message},
69Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm,
void*)
71 static bool initialized =
false;
73 return JNI_VERSION_1_4;
77 JNIEnv *env =
nullptr;
78 if (vm->GetEnv((
void**)&env, JNI_VERSION_1_4) != JNI_OK) {
79 qCWarning(
Log) <<
"Failed to get JNI environment.";
82 jclass cls = env->FindClass(
"org/kde/kunifiedpush/MessageReceiver");
83 if (env->RegisterNatives(cls, methods,
sizeof(methods) /
sizeof(JNINativeMethod)) < 0) {
84 qCWarning(
Log) <<
"Failed to register native functions.";
88 return JNI_VERSION_1_4;
91std::vector<ConnectorPrivate*> ConnectorPrivate::s_instances;
93void ConnectorPrivate::init()
95 s_instances.push_back(
this);
98void ConnectorPrivate::deinit()
100 s_instances.erase(std::remove(s_instances.begin(), s_instances.end(),
this), s_instances.end());
103void ConnectorPrivate::doSetDistributor(
const QString &distServiceName)
106 m_distributor = QAndroidJniObject(
"org.kde.kunifiedpush.Distributor",
"(Ljava/lang/String;Landroid/content/Context;)V",
QAndroidJniObject::fromString(distServiceName).
object(), context.
object());
109bool ConnectorPrivate::hasDistributor()
const
111 return m_distributor.isValid();
114void ConnectorPrivate::doRegister()
116 m_distributor.callMethod<
void>(
"register", m_token, m_description, m_vapidPublicKey);
119void ConnectorPrivate::doUnregister()
121 m_distributor.callMethod<
void>(
"unregister", m_token);
124void ConnectorPrivate::handleMessage(
const QString &token,
const QByteArray &message,
const QString &messageIdentifier)
126 if (m_token != token) {
130 Message(token, message, messageIdentifier);
132 if (!messageIdentifier.
isEmpty()) {
133 m_distributor.callMethod<
void>(
"acknowledge", token, messageIdentifier);
A received push notification message.
Client-side integration with UnifiedPush.
QByteArray fromRawData(const char *data, qsizetype size)
QJniObject fromString(const QString &string)
jobject object() const const
QString fromUtf8(QByteArrayView str)
bool isEmpty() const const