From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 11/12] Internal and Driver api changes for Send USSD proactive command
Date: Thu, 09 Sep 2010 10:59:40 -0500 [thread overview]
Message-ID: <4C89046C.5040106@gmail.com> (raw)
In-Reply-To: <1284035516-21359-12-git-send-email-jeevaka.badrappan@elektrobit.com>
[-- Attachment #1: Type: text/plain, Size: 21203 bytes --]
Hi Jeevaka,
On 09/09/2010 07:31 AM, Jeevaka Badrappan wrote:
> ---
> drivers/atmodem/ussd.c | 81 ++++++++++-----------
> drivers/isimodem/ussd.c | 44 ++++--------
> include/types.h | 1 +
> include/ussd.h | 8 ++-
> src/ofono.h | 17 +++++
> src/ussd.c | 179 ++++++++++++++++++++++++++++++++++++++++++-----
> 6 files changed, 236 insertions(+), 94 deletions(-)
Please break this patch up into two. One with the core driver changes
and one for implementing __ofono_ussd_initiate
>
> diff --git a/drivers/atmodem/ussd.c b/drivers/atmodem/ussd.c
> index cb1515f..573417a 100644
> --- a/drivers/atmodem/ussd.c
> +++ b/drivers/atmodem/ussd.c
> @@ -67,15 +67,14 @@ static void read_charset_cb(gboolean ok, GAtResult *result,
>
> static void cusd_parse(GAtResult *result, struct ofono_ussd *ussd)
> {
> + struct ussd_data *data = ofono_ussd_get_data(ussd);
> GAtResultIter iter;
> int status;
> int dcs;
> const char *content;
> - char *converted = NULL;
> - gboolean udhi;
> enum sms_charset charset;
> - gboolean compressed;
> - gboolean iso639;
> + unsigned char msg[182];
The buffer should be 160 bytes no?
> + long msg_len = 0;
>
> g_at_result_iter_init(&iter, result);
>
> @@ -89,33 +88,27 @@ static void cusd_parse(GAtResult *result, struct ofono_ussd *ussd)
> goto out;
>
> if (g_at_result_iter_next_number(&iter, &dcs)) {
> - if (!cbs_dcs_decode(dcs, &udhi, NULL, &charset,
> - &compressed, NULL, &iso639))
> - goto out;
> -
> - if (udhi || compressed || iso639)
> + if (!cbs_dcs_decode(dcs, NULL, NULL, &charset,
> + NULL, NULL, NULL))
> goto out;
> } else
> charset = SMS_CHARSET_7BIT;
>
> - if (charset == SMS_CHARSET_7BIT)
> - converted = convert_gsm_to_utf8((const guint8 *) content,
> - strlen(content), NULL, NULL, 0);
> -
> - else if (charset == SMS_CHARSET_8BIT) {
> - /* TODO: Figure out what to do with 8 bit data */
> - ofono_error("8-bit coded USSD response received");
> - status = 4; /* Not supported */
> - } else {
> + if (charset == SMS_CHARSET_7BIT) {
> + if (data->charset == AT_UTIL_CHARSET_GSM)
> + pack_7bit_own_buf((const guint8 *) content,
> + strlen(content), 0, TRUE,
> + &msg_len, 0, msg);
> + } else if (charset == SMS_CHARSET_8BIT)
> + decode_hex_own_buf(content, -1, &msg_len, 0, msg);
> + else {
> /* No other encoding is mentioned in TS27007 7.15 */
> ofono_error("Unsupported USSD data coding scheme (%02x)", dcs);
> status = 4; /* Not supported */
> }
>
> out:
> - ofono_ussd_notify(ussd, status, converted);
> -
> - g_free(converted);
> + ofono_ussd_notify(ussd, status, dcs, msg, (int) msg_len);
I don't think you need the cast here
> }
>
> static void cusd_request_cb(gboolean ok, GAtResult *result, gpointer user_data)
> @@ -132,45 +125,50 @@ static void cusd_request_cb(gboolean ok, GAtResult *result, gpointer user_data)
> cusd_parse(result, ussd);
> }
>
> -static void at_ussd_request(struct ofono_ussd *ussd, const char *str,
> +static void at_ussd_request(struct ofono_ussd *ussd, int dcs,
> + const unsigned char *binary_data,
> + int binary_data_len,
> ofono_ussd_cb_t cb, void *user_data)
> {
> struct ussd_data *data = ofono_ussd_get_data(ussd);
> struct cb_data *cbd = cb_data_new(cb, user_data);
> - unsigned char *converted = NULL;
> - int dcs;
> - int max_len;
> - long written;
> char buf[256];
> + long max_chars = 182;
> + unsigned char *unpacked_buf = NULL;
> + long written;
> + enum sms_charset charset;
>
> if (!cbd)
> goto error;
>
> cbd->user = ussd;
> +
> + if (!cbs_dcs_decode(dcs, NULL, NULL, &charset,
> + NULL, NULL, NULL))
> + charset = SMS_CHARSET_7BIT;
Failing is fine here. As a general rule, it is better to fail early.
>
> - converted = convert_utf8_to_gsm(str, strlen(str), NULL, &written, 0);
> -
> - if (!converted)
> - goto error;
> - else {
> - dcs = 15;
> - max_len = 182;
> - }
> + if (charset == SMS_CHARSET_7BIT) {
> + unpacked_buf = unpack_7bit(binary_data, binary_data_len, 0,
> + TRUE, max_chars, &written, 0);
>
> - if (written > max_len)
> - goto error;
> + if ( !unpacked_buf || written <= 0)
> + goto error;
>
> - snprintf(buf, sizeof(buf), "AT+CUSD=1,\"%.*s\",%d",
> - (int) written, converted, dcs);
> + snprintf(buf, sizeof(buf), "AT+CUSD=1,\"%.*s\",%d",
> + (int) written, unpacked_buf, dcs);
>
> - g_free(converted);
> - converted = NULL;
> + g_free(unpacked_buf);
> + unpacked_buf = NULL;
> + } else
> + snprintf(buf, sizeof(buf), "AT+CUSD=1,\"%.*s\",%d",
> + binary_data_len, binary_data, dcs);
This should be hex encoded
>
> if (data->vendor == OFONO_VENDOR_QUALCOMM_MSM) {
> /* Ensure that the modem is using GSM character set. It
> * seems it defaults to IRA and then umlauts are not
> * properly encoded. The modem returns some weird from
> - * of Latin-1, but it is not really Latin-1 either. */
> + * of Latin-1, but it is not really Latin-1 either.
> + */
Please send this as a separate cleanup patch
> g_at_chat_send(data->chat, "AT+CSCS=\"GSM\"", none_prefix,
> NULL, NULL, NULL);
> }
> @@ -181,7 +179,6 @@ static void at_ussd_request(struct ofono_ussd *ussd, const char *str,
>
> error:
> g_free(cbd);
> - g_free(converted);
>
> CALLBACK_WITH_FAILURE(cb, user_data);
> }
> diff --git a/drivers/isimodem/ussd.c b/drivers/isimodem/ussd.c
> index 330a141..6ac945b 100644
> --- a/drivers/isimodem/ussd.c
> +++ b/drivers/isimodem/ussd.c
> @@ -74,7 +74,9 @@ static void ussd_parse(struct ofono_ussd *ussd, const void *restrict data,
> {
> const unsigned char *msg = data;
> int status = OFONO_USSD_STATUS_NOT_SUPPORTED;
> - char *converted = NULL;
> + int msg_len = 0;
> + int dcs = -1;
> + unsigned char *coded_msg = NULL;
>
> if (!msg || len < 4)
> goto out;
> @@ -84,14 +86,11 @@ static void ussd_parse(struct ofono_ussd *ussd, const void *restrict data,
> if (msg[3] == 0 || (size_t)(msg[3] + 4) > len)
> goto out;
>
> - converted = ussd_decode(msg[1], msg[3], msg + 4);
> -
> - if (converted)
> - status = OFONO_USSD_STATUS_NOTIFY;
> -
> + dcs = msg[1];
> + msg_len = msg[3];
> + coded_msg = (guint8 *) msg+4;
> out:
> - ofono_ussd_notify(ussd, status, converted);
> - g_free(converted);
> + ofono_ussd_notify(ussd, status, dcs, coded_msg, msg_len);
> }
>
>
> @@ -129,7 +128,7 @@ error:
> }
>
> static GIsiRequest *ussd_send(GIsiClient *client,
> - uint8_t *str, size_t len,
> + int dcs, uint8_t *str, size_t len,
> void *data, GDestroyNotify notify)
> {
> const uint8_t msg[] = {
> @@ -138,7 +137,7 @@ static GIsiRequest *ussd_send(GIsiClient *client,
> 0x01, /* subblock count */
> SS_GSM_USSD_STRING,
> 4 + len + 3, /* subblock length */
> - 0x0f, /* DCS */
> + dcs, /* DCS */
> len, /* string length */
> /* USSD string goes here */
> };
> @@ -152,33 +151,18 @@ static GIsiRequest *ussd_send(GIsiClient *client,
> ussd_send_resp_cb, data, notify);
> }
>
> -static void isi_request(struct ofono_ussd *ussd, const char *str,
> - ofono_ussd_cb_t cb, void *data)
> +static void isi_request(struct ofono_ussd *ussd, int dcs,
> + const unsigned char *binary_data, int binary_data_len,
> + ofono_ussd_cb_t cb, void *data)
> {
> struct ussd_data *ud = ofono_ussd_get_data(ussd);
> struct isi_cb_data *cbd = isi_cb_data_new(ussd, cb, data);
> - unsigned char buf[256];
> - unsigned char *packed = NULL;
> - unsigned char *converted = NULL;
> - long num_packed;
> - long written;
>
> if (!cbd)
> goto error;
>
> - converted = convert_utf8_to_gsm(str, strlen(str), NULL, &written, 0);
> - if (!converted)
> - goto error;
> -
> - packed = pack_7bit_own_buf(converted, written, 0, TRUE,
> - &num_packed, 0, buf);
> -
> - g_free(converted);
> -
> - if (written > SS_MAX_USSD_LENGTH)
> - goto error;
> -
> - if (ussd_send(ud->client, packed, num_packed, cbd, g_free))
> + if (ussd_send(ud->client, dcs, (guint8 *) binary_data,
> + binary_data_len, cbd, g_free))
> return;
>
This looks fine to me
> error:
> diff --git a/include/types.h b/include/types.h
> index 6098cba..fbd3c6a 100644
> --- a/include/types.h
> +++ b/include/types.h
> @@ -77,6 +77,7 @@ struct ofono_error {
> };
>
> #define OFONO_MAX_PHONE_NUMBER_LENGTH 20
> +#define OFONO_MAX_USSD_LENGTH 160
This define is only being used by ussd.c. If so, please move it out to
ussd.c and don't give it the OFONO_ prefix.
>
> struct ofono_phone_number {
> char number[OFONO_MAX_PHONE_NUMBER_LENGTH + 1];
> diff --git a/include/ussd.h b/include/ussd.h
> index 96e04cb..08dfc40 100644
> --- a/include/ussd.h
> +++ b/include/ussd.h
> @@ -45,13 +45,15 @@ struct ofono_ussd_driver {
> const char *name;
> int (*probe)(struct ofono_ussd *ussd, unsigned int vendor, void *data);
> void (*remove)(struct ofono_ussd *ussd);
> - void (*request)(struct ofono_ussd *ussd, const char *str,
> - ofono_ussd_cb_t, void *data);
> + void (*request)(struct ofono_ussd *ussd, int dcs,
> + const unsigned char *binary_data, int binary_data_len,
> + ofono_ussd_cb_t, void *data);
> void (*cancel)(struct ofono_ussd *ussd,
> ofono_ussd_cb_t cb, void *data);
> };
>
> -void ofono_ussd_notify(struct ofono_ussd *ussd, int status, const char *str);
> +void ofono_ussd_notify(struct ofono_ussd *ussd, int status, int dcs,
> + const unsigned char *data, int data_len);
>
> int ofono_ussd_driver_register(const struct ofono_ussd_driver *d);
> void ofono_ussd_driver_unregister(const struct ofono_ussd_driver *d);
> diff --git a/src/ofono.h b/src/ofono.h
> index 9b8d938..bc67c73 100644
> --- a/src/ofono.h
> +++ b/src/ofono.h
> @@ -244,6 +244,13 @@ gboolean __ofono_ssn_mt_watch_remove(struct ofono_ssn *ssn, int id);
>
> #include <ofono/ussd.h>
>
> +enum ofono_ussd_failure {
> + OFONO_USSD_FAILURE_NONE,
> + OFONO_USSD_FAILURE_USER_TERMINATED,
> + OFONO_USSD_FAILURE_RETURN_ERROR,
> + OFONO_USSD_FAILURE_TIMED_OUT,
> +};
> +
> typedef gboolean (*ofono_ussd_ssc_cb_t)(int type,
> const char *sc,
> const char *sia, const char *sib,
> @@ -254,6 +261,10 @@ typedef gboolean (*ofono_ussd_passwd_cb_t)(const char *sc,
> const char *old, const char *new,
> DBusMessage *msg, void *data);
>
> +typedef void (*ofono_ussd_request_cb_t)(int error, int dcs,
> + const unsigned char *str,
> + int str_len, void *data);
> +
> gboolean __ofono_ussd_ssc_register(struct ofono_ussd *ussd, const char *sc,
> ofono_ussd_ssc_cb_t cb, void *data,
> ofono_destroy_func destroy);
> @@ -264,6 +275,12 @@ gboolean __ofono_ussd_passwd_register(struct ofono_ussd *ussd, const char *sc,
> ofono_destroy_func destroy);
> void __ofono_ussd_passwd_unregister(struct ofono_ussd *ussd, const char *sc);
>
> +gboolean __ofono_ussd_is_busy(struct ofono_ussd *ussd);
> +
> +int __ofono_ussd_initiate(struct ofono_ussd *ussd, int dcs,
> + const unsigned char *binary_data, int binary_data_len,
naming these data or pdu and len is good enough
> + ofono_ussd_request_cb_t cb, void *user_data);
> +
> #include <ofono/netreg.h>
>
> typedef void (*ofono_netreg_status_notify_cb_t)(int status, int lac, int ci,
> diff --git a/src/ussd.c b/src/ussd.c
> index 825d560..c58bd7c 100644
> --- a/src/ussd.c
> +++ b/src/ussd.c
> @@ -34,6 +34,8 @@
> #include "ofono.h"
>
> #include "common.h"
> +#include "smsutil.h"
> +#include "util.h"
>
> #define SUPPLEMENTARY_SERVICES_INTERFACE "org.ofono.SupplementaryServices"
>
> @@ -46,6 +48,15 @@ enum ussd_state {
> USSD_STATE_RESPONSE_SENT,
> };
>
> +struct ussd_request {
> + struct ofono_ussd *ussd;
> + int dcs;
> + unsigned char *str;
> + int str_len;
> + ofono_ussd_request_cb_t cb;
> + void *user_data;
> +};
> +
> struct ofono_ussd {
> int state;
> DBusMessage *pending;
> @@ -56,6 +67,7 @@ struct ofono_ussd {
> const struct ofono_ussd_driver *driver;
> void *driver_data;
> struct ofono_atom *atom;
> + struct ussd_request *req;
> };
>
> struct ssc_entry {
> @@ -306,15 +318,56 @@ static void ussd_change_state(struct ofono_ussd *ussd, int state)
> "State", DBUS_TYPE_STRING, &value);
> }
>
> -void ofono_ussd_notify(struct ofono_ussd *ussd, int status, const char *str)
> +static void ussd_request_finish(struct ofono_ussd *ussd, int error, int dcs,
> + const unsigned char *str, int str_len)
> +{
> + struct ussd_request *req = ussd->req;
> +
> + if (req && req->cb) {
> + req->cb(error, dcs, str, str_len, req->user_data);
> + g_free(req->str);
> + g_free(req);
> + ussd->req = NULL;
> + }
> +}
> +
> +static int ussd_status_to_failure_code(int status)
> +{
> + switch (status) {
> + case OFONO_USSD_STATUS_TIMED_OUT:
> + return OFONO_USSD_FAILURE_TIMED_OUT;
> + case OFONO_USSD_STATUS_NOT_SUPPORTED:
> + return OFONO_USSD_FAILURE_RETURN_ERROR;
> + }
> +
> + return OFONO_USSD_FAILURE_NONE;
> +}
> +
> +void ofono_ussd_notify(struct ofono_ussd *ussd, int status, int dcs,
> + const unsigned char *data, int data_len)
> {
> DBusConnection *conn = ofono_dbus_get_connection();
> const char *ussdstr = "USSD";
> + char *utf8_str = NULL;
> + gboolean utf8_str_valid = FALSE;
> const char sig[] = { DBUS_TYPE_STRING, 0 };
> DBusMessage *reply;
> DBusMessageIter iter;
> DBusMessageIter variant;
>
> + if (ussd->req &&
> + (status == OFONO_USSD_STATUS_NOTIFY ||
> + status == OFONO_USSD_STATUS_TERMINATED ||
> + status == OFONO_USSD_STATUS_TIMED_OUT ||
> + status == OFONO_USSD_STATUS_NOT_SUPPORTED)) {
> +
> + ussd_request_finish(ussd, ussd_status_to_failure_code(status),
> + dcs, data, data_len);
> +
> + ussd_change_state(ussd, USSD_STATE_IDLE);
> + return;
> + }
> +
> if (status == OFONO_USSD_STATUS_NOT_SUPPORTED) {
> ussd_change_state(ussd, USSD_STATE_IDLE);
>
> @@ -334,15 +387,21 @@ void ofono_ussd_notify(struct ofono_ussd *ussd, int status, const char *str)
> reply = __ofono_error_timed_out(ussd->pending);
> goto out;
> }
> +
> + if (data && data_len > 0)
> + utf8_str = ussd_decode(dcs, data_len, data);
> +
> + if (!utf8_str) {
> + utf8_str = "";
> + status = OFONO_USSD_STATUS_NOTIFY;
> + } else
> + utf8_str_valid = TRUE;
>
> /* TODO: Rework this in the Agent framework */
> if (ussd->state == USSD_STATE_ACTIVE) {
>
> reply = dbus_message_new_method_return(ussd->pending);
>
> - if (!str)
> - str = "";
> -
> dbus_message_iter_init_append(reply, &iter);
>
> dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
> @@ -352,7 +411,7 @@ void ofono_ussd_notify(struct ofono_ussd *ussd, int status, const char *str)
> &variant);
>
> dbus_message_iter_append_basic(&variant, DBUS_TYPE_STRING,
> - &str);
> + &utf8_str);
>
> dbus_message_iter_close_container(&iter, &variant);
>
> @@ -364,10 +423,7 @@ void ofono_ussd_notify(struct ofono_ussd *ussd, int status, const char *str)
> } else if (ussd->state == USSD_STATE_RESPONSE_SENT) {
> reply = dbus_message_new_method_return(ussd->pending);
>
> - if (!str)
> - str = "";
> -
> - dbus_message_append_args(reply, DBUS_TYPE_STRING, &str,
> + dbus_message_append_args(reply, DBUS_TYPE_STRING, &utf8_str,
> DBUS_TYPE_INVALID);
>
> if (status == OFONO_USSD_STATUS_ACTION_REQUIRED)
> @@ -387,20 +443,17 @@ void ofono_ussd_notify(struct ofono_ussd *ussd, int status, const char *str)
> signal_name = "NotificationReceived";
> }
>
> - if (!str)
> - str = "";
> -
> g_dbus_emit_signal(conn, path,
> SUPPLEMENTARY_SERVICES_INTERFACE, signal_name,
> - DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID);
> + DBUS_TYPE_STRING, &utf8_str, DBUS_TYPE_INVALID);
>
> ussd_change_state(ussd, new_state);
> - return;
> + goto free;
> } else {
> ofono_error("Received an unsolicited USSD but can't handle.");
> - DBG("USSD is: status: %d, %s", status, str);
> + DBG("USSD is: status: %d, %s", status, utf8_str);
>
> - return;
> + goto free;
> }
>
> out:
> @@ -408,6 +461,10 @@ out:
>
> dbus_message_unref(ussd->pending);
> ussd->pending = NULL;
> +
> +free:
> + if (utf8_str_valid)
> + g_free(utf8_str);
> }
>
> static void ussd_callback(const struct ofono_error *error, void *data)
> @@ -436,6 +493,12 @@ static DBusMessage *ussd_initiate(DBusConnection *conn, DBusMessage *msg,
> {
> struct ofono_ussd *ussd = data;
> const char *str;
> + int dcs = 0x0f;
> + unsigned char buf[256];
> + unsigned char *converted;
> + unsigned char *packed = NULL;
> + long num_packed;
> + long written;
>
> if (ussd->pending)
> return __ofono_error_busy(msg);
> @@ -458,14 +521,27 @@ static DBusMessage *ussd_initiate(DBusConnection *conn, DBusMessage *msg,
> if (!valid_ussd_string(str))
> return __ofono_error_invalid_format(msg);
>
> - DBG("OK, running USSD request");
> + converted = convert_utf8_to_gsm(str, strlen(str), NULL, &written, 0);
> + if (!converted)
> + return __ofono_error_invalid_format(msg);
> +
> + packed = pack_7bit_own_buf(converted, written, 0, TRUE,
> + &num_packed, 0, buf);
> +
> + g_free(converted);
> +
> + if (num_packed > OFONO_MAX_USSD_LENGTH)
> + return __ofono_error_invalid_format(msg);
>
> if (!ussd->driver->request)
> return __ofono_error_not_implemented(msg);
>
> + DBG("OK, running USSD request");
> +
> ussd->pending = dbus_message_ref(msg);
>
> - ussd->driver->request(ussd, str, ussd_callback, ussd);
> + ussd->driver->request(ussd, dcs, packed, (int) num_packed,
> + ussd_callback, ussd);
>
> return NULL;
> }
> @@ -496,6 +572,12 @@ static DBusMessage *ussd_respond(DBusConnection *conn, DBusMessage *msg,
> {
> struct ofono_ussd *ussd = data;
> const char *str;
> + int dcs = 0x0f;
> + unsigned char buf[256];
> + unsigned char *converted;
> + unsigned char *packed = NULL;
> + long num_packed;
> + long written;
>
> if (ussd->pending)
> return __ofono_error_busy(msg);
> @@ -510,12 +592,25 @@ static DBusMessage *ussd_respond(DBusConnection *conn, DBusMessage *msg,
> if (strlen(str) == 0)
> return __ofono_error_invalid_format(msg);
>
> + converted = convert_utf8_to_gsm(str, strlen(str), NULL, &written, 0);
> + if (!converted)
> + return __ofono_error_invalid_format(msg);
> +
> + packed = pack_7bit_own_buf(converted, written, 0, TRUE,
> + &num_packed, 0, buf);
> +
> + g_free(converted);
> +
> + if (num_packed > OFONO_MAX_USSD_LENGTH)
> + return __ofono_error_invalid_args(msg);
> +
> if (!ussd->driver->request)
> return __ofono_error_not_implemented(msg);
>
> ussd->pending = dbus_message_ref(msg);
>
> - ussd->driver->request(ussd, str, ussd_response_callback, ussd);
> + ussd->driver->request(ussd, dcs, packed, (int) num_packed,
> + ussd_response_callback, ussd);
>
> return NULL;
> }
> @@ -543,6 +638,9 @@ static void ussd_cancel_callback(const struct ofono_error *error, void *data)
> reply = dbus_message_new_method_return(ussd->cancel);
> __ofono_dbus_pending_reply(&ussd->cancel, reply);
>
> + if (ussd->req)
> + ussd_request_finish(ussd, -1, USSD_STATE_USER_ACTION, NULL, -1);
> +
> ussd_change_state(ussd, USSD_STATE_IDLE);
> }
>
> @@ -741,3 +839,46 @@ void *ofono_ussd_get_data(struct ofono_ussd *ussd)
> {
> return ussd->driver_data;
> }
> +
> +static void ussd_request_callback(const struct ofono_error *error, void *data)
> +{
> + struct ofono_ussd *ussd = data;
> +
> + if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
> + ussd_request_finish(ussd, OFONO_USSD_FAILURE_RETURN_ERROR, -1, NULL, -1);
> + else
> + ussd_change_state(ussd,USSD_STATE_ACTIVE);
> +}
> +
> +gboolean __ofono_ussd_is_busy(struct ofono_ussd *ussd)
> +{
> + if (ussd->pending || ussd->state != USSD_STATE_IDLE || ussd->req)
> + return TRUE;
> +
> + return FALSE;
> +}
> +
> +int __ofono_ussd_initiate(struct ofono_ussd *ussd, int dcs,
> + const unsigned char *binary_data,
> + int binary_data_len,
> + ofono_ussd_request_cb_t cb, void *user_data)
> +{
> + struct ussd_request *req;
> +
> + if (!ussd->driver->request)
> + return -ENOSYS;
> +
> + req = g_try_new0(struct ussd_request, 1);
> + req->dcs = dcs;
> + req->str = g_memdup(binary_data, binary_data_len);
> + req->str_len = binary_data_len;
> + req->cb = cb;
> + req->user_data = user_data;
> +
> + ussd->req = req;
> +
> + ussd->driver->request(ussd, dcs, binary_data, binary_data_len,
> + ussd_request_callback, ussd);
> +
> + return 0;
> +}
Otherwise it looks fine, but I'll have to perform another round of
reviews once you separate out the driver changes from
ofono_ussd_initiate changes.
Regards,
-Denis
next prev parent reply other threads:[~2010-09-09 15:59 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-09 12:31 Add support for Send USSD proactive command handling Jeevaka Badrappan
2010-09-09 12:31 ` [PATCH 01/12] atutil changes for parsing cscs query and cscs support Jeevaka Badrappan
2010-09-09 14:45 ` Denis Kenzior
2010-09-09 18:56 ` Jeevaka Badrappan
2010-09-09 18:56 ` [PATCH 01/13] " Jeevaka Badrappan
2010-09-10 17:27 ` Denis Kenzior
2010-09-09 12:31 ` [PATCH 02/12] atgen changes for setting TE character set Jeevaka Badrappan
2010-09-09 14:50 ` Denis Kenzior
2010-09-09 19:00 ` [PATCH 02/13] " Jeevaka Badrappan
2010-09-09 12:31 ` [PATCH 03/12] phonesim " Jeevaka Badrappan
2010-09-09 19:01 ` [PATCH 03/13] " Jeevaka Badrappan
2010-09-10 17:07 ` Denis Kenzior
2010-09-10 20:29 ` [PATCH 2/7] " Jeevaka Badrappan
2010-09-09 12:31 ` [PATCH 04/12] USSD atom driver changes to read current character setting Jeevaka Badrappan
2010-09-09 19:02 ` [PATCH 04/13] " Jeevaka Badrappan
2010-09-09 12:31 ` [PATCH 05/12] Add internal api __ofono_call_barring_is_busy Jeevaka Badrappan
2010-09-09 15:06 ` Denis Kenzior
2010-09-09 12:31 ` [PATCH 06/12] Add internal api __ofono_call_forwarding_is_busy Jeevaka Badrappan
2010-09-09 15:07 ` Denis Kenzior
2010-09-09 12:31 ` [PATCH 07/12] Add internal api __ofono_call_settings_is_busy Jeevaka Badrappan
2010-09-09 15:07 ` Denis Kenzior
2010-09-09 12:31 ` [PATCH 08/12] Add Send USSD command specific result codes Jeevaka Badrappan
2010-09-09 15:09 ` Denis Kenzior
2010-09-09 12:31 ` [PATCH 09/12] Add Send USSD terminal response data structures Jeevaka Badrappan
2010-09-09 15:20 ` Denis Kenzior
2010-09-09 12:31 ` [PATCH 10/12] Add build_dataobj_ussd_text for ussd specific text string handling Jeevaka Badrappan
2010-09-09 15:31 ` Denis Kenzior
2010-09-09 19:06 ` [PATCH 10/13] " Jeevaka Badrappan
2010-09-10 17:29 ` Denis Kenzior
2010-09-10 20:19 ` [PATCH 4/7] " Jeevaka Badrappan
2010-09-10 20:22 ` Denis Kenzior
2010-09-09 12:31 ` [PATCH 11/12] Internal and Driver api changes for Send USSD proactive command Jeevaka Badrappan
2010-09-09 15:59 ` Denis Kenzior [this message]
2010-09-09 20:25 ` [PATCH 6/8] " Jeevaka Badrappan
2010-09-09 20:25 ` [PATCH 7/8] Add __ofono_ussd_initiate internal api for Sending USSD Jeevaka Badrappan
2010-09-09 12:31 ` [PATCH 12/12] Handling of Send USSD proactive command Jeevaka Badrappan
2010-09-09 15:37 ` Denis Kenzior
2010-09-09 19:42 ` [PATCH 8/8] " Jeevaka Badrappan
2010-09-13 23:00 ` Added UCS2 handling and review comments incorporated Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 1/8] smsutil: Add USSD encoding function Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 2/8] util: Add UCS2 to GSM 7bit converion function Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 3/8] test-util: Add function for validating UCS2 to GSM bit conversion Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 4/8] USSD atom driver changes to read current character setting Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 5/8] Internal and Driver API changes for Send USSD Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 6/8] Add __ofono_ussd_initiate internal api for Sending USSD Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 7/8] stk: Handling of Send USSD proactive command Jeevaka Badrappan
2010-09-13 23:00 ` [PATCH 8/8] stkutil: Add handling of error case scenario in build USSD data object Jeevaka Badrappan
2010-09-14 21:49 ` [PATCH 3/4] stk: Handling of Send USSD proactive command Jeevaka Badrappan
2010-09-15 17:15 ` Denis Kenzior
2010-09-14 17:45 ` [PATCH 6/8] Add __ofono_ussd_initiate internal api for Sending USSD Denis Kenzior
2010-09-14 21:31 ` [PATCH 2/4] " Jeevaka Badrappan
2010-09-15 17:13 ` Denis Kenzior
2010-09-14 17:24 ` [PATCH 5/8] Internal and Driver API changes for Send USSD Denis Kenzior
2010-09-14 21:23 ` [PATCH 1/4] " Jeevaka Badrappan
2010-09-15 17:13 ` Denis Kenzior
2010-09-14 17:01 ` [PATCH 4/8] USSD atom driver changes to read current character setting Denis Kenzior
2010-09-14 17:01 ` [PATCH 3/8] test-util: Add function for validating UCS2 to GSM bit conversion Denis Kenzior
2010-09-14 17:01 ` [PATCH 2/8] util: Add UCS2 to GSM 7bit converion function Denis Kenzior
2010-09-14 16:58 ` [PATCH 1/8] smsutil: Add USSD encoding function Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C89046C.5040106@gmail.com \
--to=denkenz@gmail.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.