1
0
mirror of https://github.com/nerzhul/ownCloud-SMS-App.git synced 2025-06-11 18:06:26 +00:00
ownCloud-SMS-App/src/main/cpp/smsbuffer.cpp
Loic Blot 3edd898d7d
Full sync is now fixed
Full sync was previously not really good, Sms were ordered by date DESC, then the last date was good and when multiple loop iterations occurs, only 1 iteration happened
SmsBuffer now owns LastMessageDate instead of AndroidSmsFetcher
Full sync is now owned by AsyncsmsSync instead of MainActivity
Last message date is more accurate and less error prone
2017-09-11 21:56:34 +02:00

162 lines
4.6 KiB
C++

/**
* Copyright (c) 2017, Loic Blot <loic.blot@unix-experience.fr>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <android/log.h>
#include <cassert>
#include <iomanip>
#include "smsbuffer.h"
#include "json.h"
#define LOG_TAG "SmsBuffer"
const char *SmsBuffer::classPathName = "fr/unix_experience/owncloud_sms/jni/SmsBuffer";
// See https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html
JNINativeMethod SmsBuffer::methods[] =
{
DECL_JNIMETHOD(createNativeObject, "()J")
DECL_JNIMETHOD(deleteNativeObject, "()V")
DECL_JNIMETHOD(empty, "()Z")
DECL_JNIMETHOD(asRawJsonString, "()Ljava/lang/String;")
DECL_JNIMETHOD(getLastMessageDate, "()J")
DECL_JNIMETHOD(push,
"(IIIJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V")
DECL_JNIMETHOD(print, "()V")
};
DECL_METHODSIZE(SmsBuffer)
#define SMSBUFFER_CAST \
if (!SmsBuffer::gJava_inited) { \
SmsBuffer::gJava_inited = true; \
SmsBuffer::gJava_mHandle = env->GetFieldID(env->GetObjectClass(self), "mHandle", "J"); \
} \
long ptr = env->GetLongField(self, SmsBuffer::gJava_mHandle); \
SmsBuffer *me = reinterpret_cast<SmsBuffer *>(ptr); \
if (!me) { \
__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "It's not a SmsBuffer!"); \
assert(false); \
}
bool SmsBuffer::gJava_inited = false;
jfieldID SmsBuffer::gJava_mHandle{};
jlong SmsBuffer::createNativeObject(JNIEnv *env, jobject self)
{
return reinterpret_cast<jlong>(new SmsBuffer());
}
void SmsBuffer::deleteNativeObject(JNIEnv *env, jobject self)
{
SMSBUFFER_CAST
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "deleteNativeObject 0x%li", ptr);
delete reinterpret_cast<SmsBuffer *>(ptr);
}
void SmsBuffer::reset_buffer()
{
m_buffer.clear();
m_buffer_empty = true;
m_sms_count = 0;
m_last_message_date = 0;
}
void SmsBuffer::push(JNIEnv *env, jobject self, jint msg_id, jint mailbox_id, jint type,
jlong date, jstring address, jstring body, jstring read, jstring seen)
{
SMSBUFFER_CAST
me->_push(msg_id, mailbox_id, type, date, env->GetStringUTFChars(address, NULL),
env->GetStringUTFChars(body, NULL), env->GetStringUTFChars(read, NULL),
env->GetStringUTFChars(seen, NULL));
}
void SmsBuffer::_push(int msg_id, int mailbox_id, int type,
long long date, const char *address, const char *body, const char *read,
const char *seen)
{
// If buffer is not empty, we are joining messages
if (!m_buffer_empty) {
m_buffer << ",";
}
// Else, we are starting array
else {
m_buffer << "[";
m_buffer_empty = false;
}
m_buffer << "{\"_id\":" << msg_id << ","
<< "\"mbox\":" << mailbox_id << ","
<< "\"type\":" << type << ","
<< "\"date\":" << date << ","
<< "\"body\":" << json::escape_string(body) << ","
<< "\"address\":" << json::escape_string(address) << ","
<< "\"read\":" << json::escape_string(read) << ","
<< "\"seen\":" << json::escape_string(seen)
<< "}";
if (date > m_last_message_date) {
m_last_message_date = date;
}
m_sms_count++;
}
jboolean SmsBuffer::empty(JNIEnv *env, jobject self)
{
SMSBUFFER_CAST
return (jboolean) (me->_empty() ? 1 : 0);
}
bool SmsBuffer::_empty() const
{
return m_buffer_empty;
}
void SmsBuffer::print(JNIEnv *env, jobject self)
{
SMSBUFFER_CAST
me->_print();
}
void SmsBuffer::_print()
{
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "SmsBuffer content: '%s'",
m_buffer.str().c_str());
}
jstring SmsBuffer::asRawJsonString(JNIEnv *env, jobject self)
{
SMSBUFFER_CAST
std::string result;
me->as_raw_json_string(result);
return env->NewStringUTF(result.c_str());
}
void SmsBuffer::as_raw_json_string(std::string &result)
{
std::stringstream ss;
ss << "{\"smsCount\": " << m_sms_count << ", \"smsDatas\": " << m_buffer.str() << "]}";
result = ss.str();
}
jlong SmsBuffer::getLastMessageDate(JNIEnv *env, jobject self)
{
SMSBUFFER_CAST
return me->_get_last_message_date();
}
long long SmsBuffer::_get_last_message_date() const
{
return m_last_message_date;
}