Skip to content

Commit

Permalink
Merge pull request #66 from monich/response_text
Browse files Browse the repository at this point in the history
Added text details to the send state change notifications
  • Loading branch information
monich committed Apr 14, 2015
2 parents 2526c68 + b84cd5c commit 800bad3
Show file tree
Hide file tree
Showing 12 changed files with 78 additions and 16 deletions.
8 changes: 8 additions & 0 deletions mms-handler-dbus/spec/org.nemomobile.MmsHandler.xml
Expand Up @@ -225,6 +225,14 @@
6 (Refused): Operator refused to accept the message
-->
<arg direction="in" type="i" name="state"/>
<!--
Optional detail string. In most cases it's empty by in case
if the message was refused by the operator it contains the
value of X-Mms-Response-Text header from M-Send.conf PDU.
It could explain the reason for the failure and should be
displayed to the user.
-->
<arg direction="in" type="s" name="details"/>
</method>

<!--
Expand Down
6 changes: 4 additions & 2 deletions mms-handler-dbus/src/mms_handler_dbus.c
Expand Up @@ -369,15 +369,17 @@ gboolean
mms_handler_dbus_message_send_state_changed(
MMSHandler* handler,
const char* id,
MMS_SEND_STATE state)
MMS_SEND_STATE state,
const char* details)
{
OrgNemomobileMmsHandler* proxy = mms_handler_dbus_connect(handler);
MMS_ASSERT(id && id[0]);
if (id && id[0] && proxy) {
mms_handler_ref(handler);
mms_handler_busy_inc(handler);
org_nemomobile_mms_handler_call_message_send_state_changed(proxy, id,
state, NULL, mms_handler_dbus_call_done, handler);
state, details ? details : "", NULL, mms_handler_dbus_call_done,
handler);
return TRUE;
}
return FALSE;
Expand Down
6 changes: 4 additions & 2 deletions mms-lib/include/mms_handler.h
Expand Up @@ -140,7 +140,8 @@ typedef struct mms_handler_class {
gboolean (*fn_message_send_state_changed)(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_SEND_STATE state); /* Receive state */
MMS_SEND_STATE state, /* Receive state */
const char* details); /* Optional details */

/* Message has been sent */
gboolean (*fn_message_sent)(
Expand Down Expand Up @@ -221,7 +222,8 @@ gboolean
mms_handler_message_send_state_changed(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_SEND_STATE state); /* Receive state */
MMS_SEND_STATE state, /* Receive state */
const char* details); /* Optional details */

gboolean
mms_handler_message_sent(
Expand Down
3 changes: 3 additions & 0 deletions mms-lib/src/mms_codec.c
Expand Up @@ -1443,6 +1443,8 @@ static gboolean decode_send_conf(struct wsp_header_iter *iter,
&out->version,
MMS_HEADER_RESPONSE_STATUS,
HEADER_FLAG_MANDATORY, &out->sc.rsp_status,
MMS_HEADER_RESPONSE_TEXT,
0, &out->sc.rsp_text,
MMS_HEADER_MESSAGE_ID,
0, &out->sc.msgid,
MMS_HEADER_INVALID);
Expand Down Expand Up @@ -1551,6 +1553,7 @@ void mms_message_free(struct mms_message *msg)
g_free(msg->sr.content_type);
break;
case MMS_MESSAGE_TYPE_SEND_CONF:
g_free(msg->sc.rsp_text);
g_free(msg->sc.msgid);
break;
case MMS_MESSAGE_TYPE_NOTIFICATION_IND:
Expand Down
1 change: 1 addition & 0 deletions mms-lib/src/mms_codec.h
Expand Up @@ -153,6 +153,7 @@ struct mms_send_req {

struct mms_send_conf {
enum mms_message_rsp_status rsp_status;
char *rsp_text;
char *msgid;
};

Expand Down
5 changes: 3 additions & 2 deletions mms-lib/src/mms_handler.c
Expand Up @@ -199,12 +199,13 @@ gboolean
mms_handler_message_send_state_changed(
MMSHandler* h,
const char* id,
MMS_SEND_STATE state)
MMS_SEND_STATE state,
const char* details)
{
if (h) {
MMSHandlerClass* klass = MMS_HANDLER_GET_CLASS(h);
if (klass->fn_message_send_state_changed) {
return klass->fn_message_send_state_changed(h, id, state);
return klass->fn_message_send_state_changed(h, id, state, details);
}
MMS_ERR("mms_handler_message_send_state_changed not implemented");
}
Expand Down
7 changes: 4 additions & 3 deletions mms-lib/src/mms_task_encode.c
Expand Up @@ -326,7 +326,8 @@ mms_task_encode_job_done(
} else {
mms_handler_message_send_state_changed(task->handler, task->id,
(job->state == MMS_ENCODE_STATE_TOO_BIG) ?
MMS_SEND_STATE_TOO_BIG : MMS_SEND_STATE_SEND_ERROR);
MMS_SEND_STATE_TOO_BIG : MMS_SEND_STATE_SEND_ERROR,
NULL);
}
mms_task_set_state(&enc->task, MMS_TASK_STATE_DONE);
mms_encode_job_unref(job);
Expand All @@ -350,7 +351,7 @@ mms_task_encode_run(
if (thread) {
g_thread_unref(thread);
mms_handler_message_send_state_changed(task->handler, task->id,
MMS_SEND_STATE_ENCODING);
MMS_SEND_STATE_ENCODING, NULL);
mms_task_set_state(task, MMS_TASK_STATE_WORKING);
MMS_ASSERT(!enc->active_job);
enc->active_job = job;
Expand All @@ -361,7 +362,7 @@ mms_task_encode_run(
mms_encode_job_unref(job);
mms_handler_message_send_state_changed(task->handler, task->id,
mms_task_retry(task) ? MMS_SEND_STATE_DEFERRED :
MMS_SEND_STATE_SEND_ERROR);
MMS_SEND_STATE_SEND_ERROR, NULL);
}
}

Expand Down
11 changes: 7 additions & 4 deletions mms-lib/src/mms_task_send.c
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2013-2014 Jolla Ltd.
* Copyright (C) 2013-2015 Jolla Ltd.
* Contact: Slava Monich <slava.monich@jolla.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
Expand Down Expand Up @@ -39,7 +40,7 @@ mms_task_send_started(
MMSTaskHttp* http)
{
mms_handler_message_send_state_changed(http->task.handler,
http->task.id, MMS_SEND_STATE_SENDING);
http->task.id, MMS_SEND_STATE_SENDING, NULL);
}

static
Expand All @@ -48,7 +49,7 @@ mms_task_send_paused(
MMSTaskHttp* http)
{
mms_handler_message_send_state_changed(http->task.handler,
http->task.id, MMS_SEND_STATE_DEFERRED);
http->task.id, MMS_SEND_STATE_DEFERRED, NULL);
}

static
Expand All @@ -61,6 +62,7 @@ mms_task_send_done(
MMSPdu* pdu = NULL;
MMS_SEND_STATE state = MMS_SEND_STATE_SEND_ERROR;
const char* msgid = NULL;
const char* details = NULL;
if (SOUP_STATUS_IS_SUCCESSFUL(status)) {
/* Decode the result */
GError* error = NULL;
Expand All @@ -81,6 +83,7 @@ mms_task_send_done(
}
} else {
MMS_ERR("MMSC responded with %u", pdu->sc.rsp_status);
details = pdu->sc.rsp_text;
switch (pdu->sc.rsp_status) {
case MMS_MESSAGE_RSP_STATUS_ERR_SERVICE_DENIED:
case MMS_MESSAGE_RSP_STATUS_ERR_CONTENT_NOT_ACCEPTED:
Expand Down Expand Up @@ -110,7 +113,7 @@ mms_task_send_done(
mms_handler_message_sent(http->task.handler, http->task.id, msgid);
} else {
mms_handler_message_send_state_changed(http->task.handler,
http->task.id, state);
http->task.id, state, details);
}
if (pdu) mms_message_free(pdu);
}
Expand Down
23 changes: 21 additions & 2 deletions mms-lib/test/common/test_handler.c
Expand Up @@ -53,6 +53,7 @@ typedef struct mms_handler_record_send {
MMS_DELIVERY_STATUS delivery_status;
MMS_READ_STATUS read_status;
char* msgid;
char* details;
} MMSHandlerRecordSend;

typedef struct mms_handler_record_receive {
Expand Down Expand Up @@ -205,6 +206,16 @@ mms_handler_test_send_state(
return send ? send->state : MMS_SEND_STATE_INVALID;
}

const char*
mms_handler_test_send_details(
MMSHandler* handler,
const char* id)
{
MMSHandlerRecordSend* send =
mms_handler_test_get_send_record(MMS_HANDLER_TEST(handler), id);
return send ? send->details : NULL;
}

MMS_RECEIVE_STATE
mms_handler_test_receive_state(
MMSHandler* handler,
Expand Down Expand Up @@ -365,6 +376,7 @@ mms_handler_test_hash_remove_record(
g_free(recv);
} else {
MMSHandlerRecordSend* send = mms_handler_test_record_send(rec);
g_free(send->details);
g_free(send->msgid);
g_free(send);
}
Expand Down Expand Up @@ -615,13 +627,20 @@ gboolean
mms_handler_test_message_send_state_changed(
MMSHandler* handler,
const char* id,
MMS_SEND_STATE state)
MMS_SEND_STATE state,
const char* details)
{
MMSHandlerRecordSend* send =
mms_handler_test_get_send_record(MMS_HANDLER_TEST(handler), id);
if (send) {
send->state = state;
MMS_DEBUG("Message %s send state %d", id, state);
g_free(send->details);
send->details = g_strdup(details);
if (details) {
MMS_DEBUG("Message %s send state %d: %s", id, state, details);
} else {
MMS_DEBUG("Message %s send state %d", id, state);
}
return TRUE;
} else {
MMS_ERR("No such outbound message: %s", id);
Expand Down
5 changes: 5 additions & 0 deletions mms-lib/test/common/test_handler.h
Expand Up @@ -41,6 +41,11 @@ mms_handler_test_send_state(
MMSHandler* handler,
const char* id);

const char*
mms_handler_test_send_details(
MMSHandler* handler,
const char* id);

MMS_RECEIVE_STATE
mms_handler_test_receive_state(
MMSHandler* handler,
Expand Down
Binary file modified mms-lib/test/test_send/data/ServiceDenied/m-send.conf
Binary file not shown.
19 changes: 18 additions & 1 deletion mms-lib/test/test_send/test_send.c
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2013-2014 Jolla Ltd.
* Copyright (C) 2013-2015 Jolla Ltd.
* Contact: Slava Monich <slava.monich@jolla.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
Expand Down Expand Up @@ -48,6 +49,7 @@ typedef struct test_desc {
const char* resp_type;
unsigned int resp_status;
MMS_SEND_STATE expected_state;
const char* details;
const char* msgid;
} TestDesc;

Expand Down Expand Up @@ -118,6 +120,7 @@ static const TestDesc send_tests[] = {
MMS_CONTENT_TYPE,
SOUP_STATUS_OK,
MMS_SEND_STATE_SENDING,
NULL,
"TestMessageId"
},{
"AcceptNoExt",
Expand All @@ -133,6 +136,7 @@ static const TestDesc send_tests[] = {
MMS_CONTENT_TYPE,
SOUP_STATUS_OK,
MMS_SEND_STATE_SENDING,
NULL,
"TestMessageId"
},{
"ServiceDenied",
Expand All @@ -148,6 +152,7 @@ static const TestDesc send_tests[] = {
MMS_CONTENT_TYPE,
SOUP_STATUS_OK,
MMS_SEND_STATE_REFUSED,
"Unable to send",
NULL
},{
"Failure",
Expand All @@ -163,6 +168,7 @@ static const TestDesc send_tests[] = {
MMS_CONTENT_TYPE,
SOUP_STATUS_OK,
MMS_SEND_STATE_SEND_ERROR,
NULL,
NULL
},{
"UnparsableResp",
Expand All @@ -178,6 +184,7 @@ static const TestDesc send_tests[] = {
MMS_CONTENT_TYPE,
SOUP_STATUS_OK,
MMS_SEND_STATE_SEND_ERROR,
NULL,
NULL
},{
"UnexpectedResp",
Expand All @@ -193,6 +200,7 @@ static const TestDesc send_tests[] = {
MMS_CONTENT_TYPE,
SOUP_STATUS_OK,
MMS_SEND_STATE_SEND_ERROR,
NULL,
NULL
},{
"EmptyMessageID",
Expand All @@ -208,6 +216,7 @@ static const TestDesc send_tests[] = {
MMS_CONTENT_TYPE,
SOUP_STATUS_OK,
MMS_SEND_STATE_SEND_ERROR,
NULL,
NULL
},{
"Cancel",
Expand All @@ -223,6 +232,7 @@ static const TestDesc send_tests[] = {
NULL,
SOUP_STATUS_INTERNAL_SERVER_ERROR,
MMS_SEND_STATE_SEND_ERROR,
NULL,
NULL
},{
"TooBig",
Expand All @@ -238,6 +248,7 @@ static const TestDesc send_tests[] = {
NULL,
SOUP_STATUS_INTERNAL_SERVER_ERROR,
MMS_SEND_STATE_TOO_BIG,
NULL,
NULL
}
};
Expand All @@ -251,11 +262,17 @@ test_finish(
const char* name = desc->name;
if (test->ret == RET_OK) {
MMS_SEND_STATE state;
const char* details;
state = mms_handler_test_send_state(test->handler, test->id);
details = mms_handler_test_send_details(test->handler, test->id);
if (state != desc->expected_state) {
test->ret = RET_ERR;
MMS_ERR("%s state %d, expected %d", name, state,
desc->expected_state);
} else if (g_strcmp0(details, desc->details)) {
test->ret = RET_ERR;
MMS_ERR("%s details '%s', expected '%s'", name, details,
desc->details);
} else if (desc->msgid) {
const char* msgid =
mms_handler_test_send_msgid(test->handler, test->id);
Expand Down

0 comments on commit 800bad3

Please sign in to comment.