Hi Pasi,
> From: Pasi Miettinen <[email protected]>
>
> ---
> include/sms.h | 2 +-
> src/sms.c | 124
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files
changed,
> 119 insertions(+), 7 deletions(-)
>
> diff --git a/include/sms.h b/include/sms.h
> index daaec37..c007675 100644
> --- a/include/sms.h
> +++ b/include/sms.h
> @@ -54,7 +54,7 @@ struct ofono_sms_driver {
>
> void ofono_sms_deliver_notify(struct ofono_sms *sms, unsigned char *pdu,
> int len, int tpdu_len);
> -void ofono_sms_status_notify(struct ofono_sms *sms, unsigned char *pdu,
> +void ofono_sms_status_report_notify(struct ofono_sms *sms, unsigned char
> *pdu, int len, int tpdu_len);
Please leave the rename out for now.
>
> int ofono_sms_driver_register(const struct ofono_sms_driver *d);
> diff --git a/src/sms.c b/src/sms.c
> index 855bef8..63e0190 100644
> --- a/src/sms.c
> +++ b/src/sms.c
> @@ -459,9 +459,10 @@ static GDBusMethodTable sms_manager_methods[] = {
> };
>
> static GDBusSignalTable sms_manager_signals[] = {
> - { "PropertyChanged", "sv" },
> - { "IncomingMessage", "sa{sv}" },
> - { "ImmediateMessage", "sa{sv}" },
> + { "PropertyChanged", "sv" },
> + { "IncomingMessage", "sa{sv}" },
> + { "ImmediateMessage", "sa{sv}" },
> + { "IncomingStatusReport", "{sv}" },
Your patch does too much here. If you want to reformat this table, send a
separate patch please. The current patch should only add the new entry.
> { }
> };
>
> @@ -471,6 +472,7 @@ static void dispatch_app_datagram(struct ofono_sms
> *sms, int dst, int src, DBG("Got app datagram for dst port: %d, src port:
> %d",
> dst, src);
> DBG("Contents-Len: %ld", len);
> + //DBG("buf: %s", buf);
Submissions should never contain commented-out code, you either need it or you
don't.
> }
>
> static void dispatch_text_message(struct ofono_sms *sms,
> @@ -539,6 +541,74 @@ static void dispatch_text_message(struct ofono_sms
> *sms, }
> }
>
> +static void dispatch_sms_delivery_report(struct ofono_sms *sms,
> + const enum sms_st *st,
> + const struct sms_address *raddr,
> + const struct sms_scts *scts)
> +{
> + DBusConnection *conn = ofono_dbus_get_connection();
> + const char *path = __ofono_atom_get_path(sms->atom);
> + DBusMessage *signal;
> + DBusMessageIter iter;
> + DBusMessageIter dict;
> + char buf[128];
> + const char *signal_name;
> + time_t ts;
> + struct tm remote;
> + struct tm local;
> + const char *str = buf;
> +
> + if (!st){
> + DBG("status unavailable");
> + return;
> + }
> +
> + signal_name = "IncomingStatusReport";
> +
> + signal = dbus_message_new_signal(path, OFONO_SMS_MANAGER_INTERFACE,
> + signal_name);
This variable and assignment is not needed, simply use the string in the
dbus_message_new_signal call.
> +
> + if (!signal)
> + return;
> +
> +
Two consecutive empty lines is a no-no ;)
> + /*Start assembling dbus-message*/
> + dbus_message_iter_init_append(signal, &iter);
> +
> + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
> + OFONO_PROPERTIES_ARRAY_SIGNATURE,
> + &dict);
> +
Your signature here does not match the IncomingStatusReport signature.
> + /*This is the time when sender sent the message,
> + should be delivery time?*/
> + ts = sms_scts_to_time(scts, &remote);
> + localtime_r(&ts, &local);
> +
> + strftime(buf, 127, "%Y-%m-%dT%H:%M:%S%z", &local);
> + buf[127] = '\0';
> + ofono_dbus_dict_append(&dict, "LocalSentTime", DBUS_TYPE_STRING, &str);
> +
> + strftime(buf, 127, "%Y-%m-%dT%H:%M:%S%z", &remote);
> + buf[127] = '\0';
> + ofono_dbus_dict_append(&dict, "SentTime", DBUS_TYPE_STRING, &str);
SentTime and LocalSentTime?
> +
> + /*Status*/
> + if(*st==0x00){
> + str = sms_address_to_string(raddr);
> + ofono_dbus_dict_append(&dict, "Message was delivered to",
> DBUS_TYPE_STRING, &str); + }
> + else{
> + str = sms_address_to_string(raddr);
> + ofono_dbus_dict_append(&dict, "Message was not delivered to",
> DBUS_TYPE_STRING, &str); + }
I suggest using simple string types, like 'delivered', 'undeliverable', etc.
Also, the status report enum has nice definitions on whether this is a final /
non-final result, etc. These should be handled appropriately.
> +
> + /*dbus-message assembled*/
> + dbus_message_iter_close_container(&iter, &dict);
> +
> + g_dbus_send_message(conn, signal);
> +
> +}
> +
> static void sms_dispatch(struct ofono_sms *sms, GSList *sms_list)
> {
> GSList *l;
> @@ -646,6 +716,18 @@ static void sms_dispatch(struct ofono_sms *sms, GSList
> *sms_list) }
> }
>
> +static void sms_status_report_dispatch(struct ofono_sms *sms, GSList
> *sms_list) +{
> + const struct sms *s;
> + enum sms_charset uninitialized_var(old_charset);
What is the purpose of this variable?
> +
> + s = sms_list->data;
> + dispatch_sms_delivery_report(sms, &s->status_report.st,
> + &s->status_report.raddr,
> + &s->status_report.scts);
> +
> +}
> +
Not quite sure why all of this is in a separate function...
> static void handle_deliver(struct ofono_sms *sms, const struct sms
> *incoming) {
> GSList *l;
> @@ -679,6 +761,19 @@ static void handle_deliver(struct ofono_sms *sms,
> const struct sms *incoming) g_slist_free(l);
> }
>
> +static void handle_sms_status_report(struct ofono_sms *sms, const struct
> sms *incoming) +{
> + GSList *l;
> +
> + /*TODO:
> + fragmented SMS delivery report? check handle_deliver()
> + */
I suggest that we figure this part out first actually :)
> +
> + l = g_slist_append(NULL, (void *)incoming);
Casting is not required.
> + sms_status_report_dispatch(sms, l);
> + g_slist_free(l);
> +}
> +
> static inline gboolean handle_mwi(struct ofono_sms *sms, struct sms *s)
> {
> gboolean discard;
> @@ -696,7 +791,7 @@ void ofono_sms_deliver_notify(struct ofono_sms *sms,
> unsigned char *pdu, {
> struct sms s;
> enum sms_class cls;
> -
> + DBG("ofono_sms_deliver_notify");
You should use a newline to separate the variable definitions and code. If
statement blocks should generally be preceded and followed by an empty line.
> if (!sms_decode(pdu, len, FALSE, tpdu_len, &s)) {
> ofono_error("Unable to decode PDU");
> return;
> @@ -807,10 +902,27 @@ out:
> handle_deliver(sms, &s);
> }
>
> -void ofono_sms_status_notify(struct ofono_sms *sms, unsigned char *pdu,
> +void ofono_sms_status_report_notify(struct ofono_sms *sms, unsigned char
> *pdu, int len, int tpdu_len)
> {
> - ofono_error("SMS Status-Report not yet handled");
> + struct sms s;
> + enum sms_class cls;
> +
> + if (!sms_decode(pdu, len, FALSE, tpdu_len, &s)) {
> + ofono_error("Unable to decode PDU");
> + return;
> + }
> +
> + if (s.type != SMS_TYPE_STATUS_REPORT) {
> + ofono_error("Expecting a STATUS REPORT pdu");
> + }
> +
> + if (!sms_dcs_decode(s.deliver.dcs, &cls, NULL, NULL, NULL)) {
> + ofono_error("Unknown / Reserved DCS. Ignoring");
> + return;
> + }
> +
> + handle_sms_status_report(sms, &s);
> }
>
> int ofono_sms_driver_register(const struct ofono_sms_driver *d)
>
Regards,
-Denis
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono