Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[mms-lib] Implemented handling of delivery reports
  • Loading branch information
monich committed Mar 15, 2014
1 parent ebe17ff commit 66356d0
Show file tree
Hide file tree
Showing 15 changed files with 504 additions and 20 deletions.
3 changes: 2 additions & 1 deletion mms-handler-dbus/spec/org.nemomobile.MmsHandler.xml
Expand Up @@ -279,13 +279,14 @@
<!--
Delivery status:
0: Indeterminate
0: Indeterminate (unknown)
1: Expired
2: Retrieved
3: Rejected
4: Deferred
5: Unrecognised
6: Forwarded
7: Unreachable
-->
<arg direction="in" type="i" name="status"/>
</method>
Expand Down
27 changes: 27 additions & 0 deletions mms-handler-dbus/src/mms_handler_dbus.c
Expand Up @@ -182,6 +182,7 @@ mms_handler_dbus_message_send_state_changed(
}

/* Message has been sent */
static
gboolean
mms_handler_dbus_message_sent(
MMSHandler* handler,
Expand All @@ -204,6 +205,31 @@ mms_handler_dbus_message_sent(
return ok;
}

/* Delivery report has been received */
static
gboolean
mms_handler_dbus_delivery_report(
MMSHandler* handler,
const char* imsi,
const char* msgid,
const char* recipient,
MMS_DELIVERY_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_delivery_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 @@ -229,6 +255,7 @@ mms_handler_dbus_class_init(
klass->fn_message_send_state_changed =
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;
G_OBJECT_CLASS(klass)->dispose = mms_handler_dbus_dispose;
}

Expand Down
29 changes: 29 additions & 0 deletions mms-lib/include/mms_handler.h
Expand Up @@ -40,6 +40,19 @@ typedef enum _mmm_send_state {
MMS_SEND_STATE_REFUSED
} MMS_SEND_STATE;

/* Delivery status */
typedef enum _mmm_delivery_status {
MMS_DELIVERY_STATUS_INVALID = -1,
MMS_DELIVERY_STATUS_UNKNOWN,
MMS_DELIVERY_STATUS_EXPIRED,
MMS_DELIVERY_STATUS_RETRIEVED,
MMS_DELIVERY_STATUS_REJECTED,
MMS_DELIVERY_STATUS_DEFERRED,
MMS_DELIVERY_STATUS_UNRECOGNISED,
MMS_DELIVERY_STATUS_FORWARDED,
MMS_DELIVERY_STATUS_UNREACHABLE
} MMS_DELIVERY_STATUS;

/* Class */
typedef struct mms_handler_class {
GObjectClass parent;
Expand Down Expand Up @@ -77,6 +90,14 @@ typedef struct mms_handler_class {
const char* id, /* Handler record id */
const char* msgid); /* Message id assigned by operator */

/* Delivery report has been received */
gboolean (*fn_delivery_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_DELIVERY_STATUS ds); /* Delivery status */

} MMSHandlerClass;

GType mms_handler_get_type(void);
Expand Down Expand Up @@ -122,6 +143,14 @@ mms_handler_message_sent(
const char* id, /* Handler record id */
const char* msgid); /* Message id assigned by operator */

gboolean
mms_handler_delivery_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_DELIVERY_STATUS ds); /* Delivery status */

#endif /* JOLLA_MMS_HANDLER_H */

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

gboolean
mms_handler_delivery_report(
MMSHandler* h,
const char* imsi,
const char* msgid,
const char* recipient,
MMS_DELIVERY_STATUS ds)
{
if (h) {
MMSHandlerClass* klass = MMS_HANDLER_GET_CLASS(h);
if (klass->fn_delivery_report) {
return klass->fn_delivery_report(h, imsi, msgid, recipient, ds);
}
MMS_ERR("mms_handler_delivery_report not implemented");
}
return FALSE;
}

/*
* Local Variables:
* mode: C
Expand Down
37 changes: 35 additions & 2 deletions mms-lib/src/mms_task_notification.c
Expand Up @@ -129,9 +129,42 @@ void
mms_task_delivery_ind(
MMSTaskNotification* ind)
{
MMS_DELIVERY_STATUS ds;
MMSTask* t = &ind->task;
const struct mms_delivery_ind* di = &ind->pdu->di;
const char* to = mms_strip_address_type(di->to);
MMS_DEBUG("Processing M-Delivery.ind PDU");
MMS_DEBUG(" MMS message id: %s", ind->pdu->di.msgid);
if (ind->task.config->keep_temp_files) {
MMS_DEBUG(" MMS message id: %s", di->msgid);
MMS_DEBUG(" Recipient: %s", to);
switch (di->dr_status) {
case MMS_MESSAGE_DELIVERY_STATUS_EXPIRED:
ds = MMS_DELIVERY_STATUS_EXPIRED;
break;
case MMS_MESSAGE_DELIVERY_STATUS_RETRIEVED:
ds = MMS_DELIVERY_STATUS_RETRIEVED;
break;
case MMS_MESSAGE_DELIVERY_STATUS_REJECTED:
ds = MMS_DELIVERY_STATUS_REJECTED;
break;
case MMS_MESSAGE_DELIVERY_STATUS_DEFERRED:
ds = MMS_DELIVERY_STATUS_DEFERRED;
break;
case MMS_MESSAGE_DELIVERY_STATUS_UNRECOGNISED:
ds = MMS_DELIVERY_STATUS_UNRECOGNISED;
break;
case MMS_MESSAGE_DELIVERY_STATUS_FORWARDED:
ds = MMS_DELIVERY_STATUS_FORWARDED;
break;
case MMS_MESSAGE_DELIVERY_STATUS_UNREACHABLE:
ds = MMS_DELIVERY_STATUS_UNREACHABLE;
break;
case MMS_MESSAGE_DELIVERY_STATUS_INDETERMINATE:
default:
ds = MMS_DELIVERY_STATUS_UNKNOWN;
break;
}
mms_handler_delivery_report(t->handler, t->imsi, di->msgid, to, ds);
if (t->config->keep_temp_files) {
mms_task_notification_write_file(ind, MMS_DELIVERY_IND_FILE);
}
}
Expand Down
1 change: 1 addition & 0 deletions mms-lib/test/Makefile
Expand Up @@ -4,6 +4,7 @@ all:
%:
@$(MAKE) -C media_type $*
@$(MAKE) -C mms_codec $*
@$(MAKE) -C delivery_ind $*
@$(MAKE) -C read_report $*
@$(MAKE) -C resize $*
@$(MAKE) -C retrieve $*
Expand Down
85 changes: 81 additions & 4 deletions mms-lib/test/common/test_handler.c
Expand Up @@ -43,6 +43,7 @@ typedef struct mms_handler_record {
typedef struct mms_handler_record_send {
MMSHandlerRecord rec;
MMS_SEND_STATE state;
MMS_DELIVERY_STATUS delivery_status;
char* msgid;
} MMSHandlerRecordSend;

Expand Down Expand Up @@ -106,6 +107,45 @@ mms_handler_test_get_record(
return NULL;
}

typedef struct mms_handler_send_msgid_search {
const char* msgid;
MMSHandlerRecordSend* send;
} MMSHandlerSendMsgIdSearch;

static
void
mms_handler_get_send_record_for_msgid_cb(
gpointer key,
gpointer value,
gpointer user_data)
{
MMSHandlerRecord* rec = value;
if (rec->type == MMS_HANDLER_RECORD_SEND) {
MMSHandlerRecordSend* send = mms_handler_test_record_send(rec);
MMSHandlerSendMsgIdSearch* search = user_data;
if (!strcmp(send->msgid, search->msgid)) {
MMS_ASSERT(!search->send);
search->send = send;
}
}
}

static
MMSHandlerRecordSend*
mms_handler_get_send_record_for_msgid(
MMSHandlerTest* test,
const char* msgid)
{
MMSHandlerSendMsgIdSearch search;
search.send = NULL;
if (msgid) {
search.msgid = msgid;
g_hash_table_foreach(test->recs,
mms_handler_get_send_record_for_msgid_cb, &search);
}
return search.send;
}

static
MMSHandlerRecordSend*
mms_handler_test_get_send_record(
Expand Down Expand Up @@ -203,6 +243,16 @@ mms_handler_test_receive_pending(
}
}

MMS_DELIVERY_STATUS
mms_handler_test_delivery_status(
MMSHandler* handler,
const char* id)
{
MMSHandlerRecordSend* send =
mms_handler_test_get_send_record(MMS_HANDLER_TEST(handler), id);
return send ? send->delivery_status : MMS_DELIVERY_STATUS_INVALID;
}

static
void
mms_handler_test_hash_remove_record(
Expand Down Expand Up @@ -327,6 +377,7 @@ mms_handler_test_send_new(
send->rec.imsi = g_strdup(imsi);
send->rec.type = MMS_HANDLER_RECORD_SEND;
send->state = MMS_SEND_STATE_INVALID;
send->delivery_status = MMS_DELIVERY_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 @@ -364,12 +415,37 @@ mms_handler_test_message_sent(
MMS_ASSERT(send);
if (send) {
MMS_ASSERT(!send->msgid);
g_free(send->msgid);
send->msgid = g_strdup(msgid);
return TRUE;
if (!send->msgid) {
send->msgid = g_strdup(msgid);
return TRUE;
}
}
return FALSE;
}

static
gboolean
mms_handler_test_delivery_report(
MMSHandler* handler,
const char* imsi,
const char* msgid,
const char* recipient,
MMS_DELIVERY_STATUS status)
{
MMSHandlerTest* test = MMS_HANDLER_TEST(handler);
MMSHandlerRecordSend* send =
mms_handler_get_send_record_for_msgid(test, msgid);
MMS_DEBUG("Message %s delivered to %s", msgid, recipient);
if (send) {
MMS_ASSERT(send->delivery_status == MMS_DELIVERY_STATUS_INVALID);
if (send->delivery_status == MMS_DELIVERY_STATUS_INVALID) {
send->delivery_status = status;
return TRUE;
}
} else {
return FALSE;
MMS_DEBUG("Unknown message id %s (this may be OK)", msgid);
}
return FALSE;
}

void
Expand All @@ -396,6 +472,7 @@ mms_handler_test_class_init(
klass->fn_message_received = mms_handler_test_message_received;
klass->fn_message_receive_state_changed =
mms_handler_test_message_receive_state_changed;
klass->fn_delivery_report = mms_handler_test_delivery_report;
}

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

MMS_DELIVERY_STATUS
mms_handler_test_delivery_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 read_report resize retrieve retrieve_cancel retrieve_no_proxy send"
TESTS="media_type mms_codec delivery_ind read_report resize retrieve retrieve_cancel retrieve_no_proxy send"
FLAVOR="release"

pushd `dirname $0` > /dev/null
Expand Down
7 changes: 7 additions & 0 deletions mms-lib/test/delivery_ind/Makefile
@@ -0,0 +1,7 @@
# -*- Mode: makefile-gmake -*-

EXE = test_delivery_ind
SRC = test_delivery_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 66356d0

Please sign in to comment.