Skip to content

Commit

Permalink
Merge pull request #5 from monich/read-ind
Browse files Browse the repository at this point in the history
Handling of read reports
  • Loading branch information
Slava Monich committed Mar 18, 2014
2 parents 834f977 + 90ba51c commit 8beb723
Show file tree
Hide file tree
Showing 16 changed files with 415 additions and 25 deletions.
26 changes: 26 additions & 0 deletions mms-handler-dbus/src/mms_handler_dbus.c
Expand Up @@ -230,6 +230,31 @@ mms_handler_dbus_delivery_report(
return ok;
}

/* Read report has been received */
static
gboolean
mms_handler_dbus_read_report(
MMSHandler* handler,
const char* imsi,
const char* msgid,
const char* recipient,
MMS_READ_STATUS status)
{
gboolean ok = FALSE;
OrgNemomobileMmsHandler* proxy = mms_handler_dbus_connect(handler);
if (msgid && msgid[0] && recipient && recipient[0] && proxy) {
GError* error = NULL;
if (org_nemomobile_mms_handler_call_read_report_sync(proxy,
imsi, msgid, recipient, status, NULL, &error)) {
ok = TRUE;
} else {
MMS_ERR("%s", MMS_ERRMSG(error));
g_error_free(error);
}
}
return ok;
}

static
void
mms_handler_dbus_dispose(
Expand All @@ -256,6 +281,7 @@ mms_handler_dbus_class_init(
mms_handler_dbus_message_send_state_changed;
klass->fn_message_sent = mms_handler_dbus_message_sent;
klass->fn_delivery_report = mms_handler_dbus_delivery_report;
klass->fn_read_report = mms_handler_dbus_read_report;
G_OBJECT_CLASS(klass)->dispose = mms_handler_dbus_dispose;
}

Expand Down
19 changes: 19 additions & 0 deletions mms-lib/include/mms_handler.h
Expand Up @@ -53,6 +53,9 @@ typedef enum _mmm_delivery_status {
MMS_DELIVERY_STATUS_UNREACHABLE
} MMS_DELIVERY_STATUS;

/* Read status */
typedef MMSReadStatus MMS_READ_STATUS;

/* Class */
typedef struct mms_handler_class {
GObjectClass parent;
Expand Down Expand Up @@ -98,6 +101,14 @@ typedef struct mms_handler_class {
const char* recipient, /* Recipient's phone number */
MMS_DELIVERY_STATUS ds); /* Delivery status */

/* Read report has been received */
gboolean (*fn_read_report)(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* msgid, /* Message id assigned by operator */
const char* recipient, /* Recipient's phone number */
MMS_READ_STATUS ds); /* Read status */

} MMSHandlerClass;

GType mms_handler_get_type(void);
Expand Down Expand Up @@ -151,6 +162,14 @@ mms_handler_delivery_report(
const char* recipient, /* Recipient's phone number */
MMS_DELIVERY_STATUS ds); /* Delivery status */

gboolean
mms_handler_read_report(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* msgid, /* Message id assigned by operator */
const char* recipient, /* Recipient's phone number */
MMS_READ_STATUS rs); /* Read status */

#endif /* JOLLA_MMS_HANDLER_H */

/*
Expand Down
5 changes: 3 additions & 2 deletions mms-lib/include/mms_lib_types.h
Expand Up @@ -79,8 +79,9 @@ typedef struct _mms_attachment MMSAttachment;

/* MMS read status */
typedef enum mms_read_status {
MMS_READ_STATUS_READ, /* Message has been read */
MMS_READ_STATUS_DELETED /* Message has been deleted without reading */
MMS_READ_STATUS_INVALID = -1, /* Invalid or unknown status */
MMS_READ_STATUS_READ, /* Message has been read */
MMS_READ_STATUS_DELETED /* Message deleted without reading */
} MMSReadStatus;

/* Convenience macros */
Expand Down
18 changes: 18 additions & 0 deletions mms-lib/src/mms_handler.c
Expand Up @@ -175,6 +175,24 @@ mms_handler_delivery_report(
return FALSE;
}

gboolean
mms_handler_read_report(
MMSHandler* h,
const char* imsi,
const char* msgid,
const char* recipient,
MMS_READ_STATUS rs)
{
if (h) {
MMSHandlerClass* klass = MMS_HANDLER_GET_CLASS(h);
if (klass->fn_read_report) {
return klass->fn_read_report(h, imsi, msgid, recipient, rs);
}
MMS_ERR("mms_handler_read_report not implemented");
}
return FALSE;
}

/*
* Local Variables:
* mode: C
Expand Down
19 changes: 18 additions & 1 deletion mms-lib/src/mms_task_notification.c
Expand Up @@ -177,8 +177,25 @@ void
mms_task_read_orig_ind(
MMSTaskNotification* ind)
{
MMS_READ_STATUS rs;
MMSTask* t = &ind->task;
const struct mms_read_ind* ri = &ind->pdu->ri;
const char* to = mms_strip_address_type(ri->to);
MMS_DEBUG("Processing M-Read-Orig.ind");
MMS_DEBUG(" MMS message id: %s", ind->pdu->ri.msgid);
MMS_DEBUG(" MMS message id: %s", ri->msgid);
MMS_DEBUG(" Recipient: %s", to);
switch (ri->rr_status) {
case MMS_MESSAGE_READ_STATUS_READ:
rs = MMS_READ_STATUS_READ;
break;
case MMS_MESSAGE_READ_STATUS_DELETED:
rs = MMS_READ_STATUS_DELETED;
break;
default:
rs = MMS_READ_STATUS_INVALID;
break;
}
mms_handler_read_report(t->handler, t->imsi, ri->msgid, to, rs);
if (ind->task.config->keep_temp_files) {
mms_task_notification_write_file(ind, MMS_READ_ORIG_IND_FILE);
}
Expand Down
1 change: 1 addition & 0 deletions mms-lib/test/Makefile
Expand Up @@ -5,6 +5,7 @@ all:
@$(MAKE) -C media_type $*
@$(MAKE) -C mms_codec $*
@$(MAKE) -C delivery_ind $*
@$(MAKE) -C read_ind $*
@$(MAKE) -C read_report $*
@$(MAKE) -C resize $*
@$(MAKE) -C retrieve $*
Expand Down
38 changes: 38 additions & 0 deletions mms-lib/test/common/test_handler.c
Expand Up @@ -44,6 +44,7 @@ typedef struct mms_handler_record_send {
MMSHandlerRecord rec;
MMS_SEND_STATE state;
MMS_DELIVERY_STATUS delivery_status;
MMS_READ_STATUS read_status;
char* msgid;
} MMSHandlerRecordSend;

Expand Down Expand Up @@ -253,6 +254,16 @@ mms_handler_test_delivery_status(
return send ? send->delivery_status : MMS_DELIVERY_STATUS_INVALID;
}

MMS_READ_STATUS
mms_handler_test_read_status(
MMSHandler* handler,
const char* id)
{
MMSHandlerRecordSend* send =
mms_handler_test_get_send_record(MMS_HANDLER_TEST(handler), id);
return send ? send->read_status : MMS_READ_STATUS_INVALID;
}

static
void
mms_handler_test_hash_remove_record(
Expand Down Expand Up @@ -378,6 +389,7 @@ mms_handler_test_send_new(
send->rec.type = MMS_HANDLER_RECORD_SEND;
send->state = MMS_SEND_STATE_INVALID;
send->delivery_status = MMS_DELIVERY_STATUS_INVALID;
send->read_status = MMS_READ_STATUS_INVALID;
MMS_DEBUG("New send %s imsi=%s", id, imsi);
g_hash_table_replace(test->recs, id, &send->rec);
return id;
Expand Down Expand Up @@ -448,6 +460,31 @@ mms_handler_test_delivery_report(
return FALSE;
}

static
gboolean
mms_handler_test_read_report(
MMSHandler* handler,
const char* imsi,
const char* msgid,
const char* recipient,
MMS_READ_STATUS status)
{
MMSHandlerTest* test = MMS_HANDLER_TEST(handler);
MMSHandlerRecordSend* send =
mms_handler_get_send_record_for_msgid(test, msgid);
MMS_DEBUG("Message %s read by %s", msgid, recipient);
if (send) {
MMS_ASSERT(send->read_status == MMS_READ_STATUS_INVALID);
if (send->read_status == MMS_READ_STATUS_INVALID) {
send->read_status = status;
return TRUE;
}
} else {
MMS_DEBUG("Unknown message id %s (this may be OK)", msgid);
}
return FALSE;
}

void
mms_handler_test_finalize(
GObject* object)
Expand All @@ -473,6 +510,7 @@ mms_handler_test_class_init(
klass->fn_message_receive_state_changed =
mms_handler_test_message_receive_state_changed;
klass->fn_delivery_report = mms_handler_test_delivery_report;
klass->fn_read_report = mms_handler_test_read_report;
}

static
Expand Down
5 changes: 5 additions & 0 deletions mms-lib/test/common/test_handler.h
Expand Up @@ -55,6 +55,11 @@ mms_handler_test_delivery_status(
MMSHandler* handler,
const char* id);

MMS_READ_STATUS
mms_handler_test_read_status(
MMSHandler* handler,
const char* id);

void
mms_handler_test_defer_receive(
MMSHandler* handler,
Expand Down
2 changes: 1 addition & 1 deletion mms-lib/test/coverage/run
Expand Up @@ -3,7 +3,7 @@
# This script requires lcov to be installed
#

TESTS="media_type mms_codec delivery_ind read_report resize retrieve retrieve_cancel retrieve_no_proxy send"
TESTS="media_type mms_codec delivery_ind read_ind read_report resize retrieve retrieve_cancel retrieve_no_proxy send"
FLAVOR="release"

pushd `dirname $0` > /dev/null
Expand Down
10 changes: 3 additions & 7 deletions mms-lib/test/delivery_ind/test_delivery_ind.c
Expand Up @@ -167,7 +167,7 @@ test_finalize(

static
int
test_run1(
test_run_one(
const MMSConfig* config,
const TestDesc* desc)
{
Expand All @@ -189,7 +189,6 @@ test_run1(
MMS_ERR("%s", MMS_ERRMSG(error));
MMS_INFO("%s FAILED", desc->name);
g_error_free(error);
test_finish(&test);
}
g_bytes_unref(push);
test_finalize(&test);
Expand All @@ -211,15 +210,15 @@ test_run(
for (i=0, ret = RET_ERR; i<G_N_ELEMENTS(delivery_tests); i++) {
const TestDesc* test = delivery_tests + i;
if (!strcmp(test->name, name)) {
ret = test_run1(config, test);
ret = test_run_one(config, test);
found = test;
break;
}
}
if (!found) MMS_ERR("No such test: %s", name);
} else {
for (i=0, ret = RET_OK; i<G_N_ELEMENTS(delivery_tests); i++) {
int test_status = test_run1(config, delivery_tests + i);
int test_status = test_run_one(config, delivery_tests + i);
if (ret == RET_OK && test_status != RET_OK) ret = test_status;
}
}
Expand All @@ -242,9 +241,6 @@ int main(int argc, char* argv[])
argc--;
} else {
mms_log_default.level = MMS_LOGLEVEL_INFO;
mms_task_http_log.level =
mms_task_decode_log.level =
mms_task_retrieve_log.level =
mms_task_notification_log.level = MMS_LOGLEVEL_NONE;
mms_log_stdout_timestamp = FALSE;
}
Expand Down
7 changes: 7 additions & 0 deletions mms-lib/test/read_ind/Makefile
@@ -0,0 +1,7 @@
# -*- Mode: makefile-gmake -*-

EXE = test_read_ind
SRC = test_read_ind.c
COMMON_SRC = test_connection.c test_connman.c test_handler.c

include ../common/Makefile
Binary file not shown.
Binary file not shown.

0 comments on commit 8beb723

Please sign in to comment.