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