Hi Aki,
On 09/02/2010 02:52 AM, Aki Niemi wrote:
---
src/sms.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/src/sms.c b/src/sms.c
index 2012fe5..8262d0c 100644
--- a/src/sms.c
+++ b/src/sms.c
@@ -65,6 +65,7 @@ struct ofono_sms {
GKeyFile *settings;
char *imsi;
int bearer;
+ int alphabet;
You might want to use the enum here
const struct ofono_sms_driver *driver;
void *driver_data;
struct ofono_atom *atom;
@@ -121,6 +122,39 @@ static int sms_bearer_from_string(const char *str)
return -1;
}
+static const char *sms_alphabet_to_string(int alphabet)
+{
+ switch (alphabet) {
+ case SMS_ALPHABET_TURKISH:
+ return "turkish";
+ case SMS_ALPHABET_SPANISH:
+ return "spanish";
+ case SMS_ALPHABET_PORTUGUESE:
+ return "portuguese";
+ case SMS_ALPHABET_REDUCED:
+ return "reduced";
+ case SMS_ALPHABET_DEFAULT:
+ default:
+ return "default";
+ }
I suggest dropping the default label and returning NULL here.
+}
+
+static int sms_alphabet_from_string(const char *str)
+{
+ if (g_str_equal(str, "default"))
+ return SMS_ALPHABET_DEFAULT;
+ else if (g_str_equal(str, "turkish"))
+ return SMS_ALPHABET_TURKISH;
+ else if (g_str_equal(str, "spanish"))
+ return SMS_ALPHABET_SPANISH;
+ else if (g_str_equal(str, "portuguese"))
+ return SMS_ALPHABET_PORTUGUESE;
+ else if (g_str_equal(str, "reduced"))
+ return SMS_ALPHABET_REDUCED;
+
+ return -1;
+}
+
You might want to do:
static gboolean sms_alphabet_from_string(const char *str,
enum *alphabet)
static void set_bearer(struct ofono_sms *sms, int bearer)
{
DBusConnection *conn = ofono_dbus_get_connection();
@@ -140,6 +174,25 @@ static void set_bearer(struct ofono_sms *sms, int bearer)
DBUS_TYPE_STRING, &value);
}
+static void set_alphabet(struct ofono_sms *sms, int alphabet)
+{
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(sms->atom);
+ const char *value;
+
+ if (sms->alphabet == alphabet)
+ return;
+
+ sms->alphabet = alphabet;
+
+ value = sms_alphabet_to_string(sms->alphabet);
+
+ ofono_dbus_signal_property_changed(conn, path,
+ OFONO_MESSAGE_MANAGER_INTERFACE,
+ "Alphabet",
+ DBUS_TYPE_STRING, &value);
+}
+
static void set_sca(struct ofono_sms *sms,
const struct ofono_phone_number *sca)
{
@@ -171,6 +224,7 @@ static DBusMessage *generate_get_properties_reply(struct ofono_sms
*sms,
DBusMessageIter dict;
const char *sca;
const char *bearer;
+ const char *alphabet;
reply = dbus_message_new_method_return(msg);
@@ -194,6 +248,9 @@ static DBusMessage *generate_get_properties_reply(struct ofono_sms
*sms,
bearer = sms_bearer_to_string(sms->bearer);
ofono_dbus_dict_append(&dict, "Bearer", DBUS_TYPE_STRING, &bearer);
+ alphabet = sms_alphabet_to_string(sms->alphabet);
+ ofono_dbus_dict_append(&dict, "Alphabet", DBUS_TYPE_STRING,
&alphabet);
+
dbus_message_iter_close_container(&iter, &dict);
return reply;
@@ -403,6 +460,25 @@ static DBusMessage *sms_set_property(DBusConnection *conn,
DBusMessage *msg,
return NULL;
}
+ if (!strcmp(property, "Alphabet")) {
+ const char *value;
+ int alphabet;
+
+ if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_get_basic(&var, &value);
+
+ alphabet = sms_alphabet_from_string(value);
+ if (alphabet < 0)
+ return __ofono_error_invalid_format(msg);
+
+ set_alphabet(sms, alphabet);
+
+ g_dbus_send_reply(conn, msg, DBUS_TYPE_INVALID);
+ return NULL;
+ }
+
return __ofono_error_invalid_args(msg);
}
@@ -620,8 +696,10 @@ static DBusMessage *sms_send_message(DBusConnection *conn,
DBusMessage *msg,
if (valid_phone_number_format(to) == FALSE)
return __ofono_error_invalid_format(msg);
- msg_list = sms_text_prepare(text, 0, TRUE, &ref_offset,
- sms->use_delivery_reports);
+ msg_list = sms_text_prepare_with_alphabet(text, 0, TRUE,
+ &ref_offset,
+ sms->use_delivery_reports,
+ sms->alphabet);
if (!msg_list)
return __ofono_error_invalid_format(msg);
@@ -1146,6 +1224,8 @@ static void sms_remove(struct ofono_atom *atom)
sms->use_delivery_reports);
g_key_file_set_integer(sms->settings, SETTINGS_GROUP,
"Bearer", sms->bearer);
+ g_key_file_set_integer(sms->settings, SETTINGS_GROUP,
+ "Alphabet", sms->alphabet);
storage_close(sms->imsi, SETTINGS_STORE, sms->settings, TRUE);
@@ -1251,6 +1331,9 @@ static void sms_load_settings(struct ofono_sms *sms, const char
*imsi)
"Bearer", &error);
if (error)
sms->bearer = 3; /* Default to CS then PS */
+
+ sms->alphabet = g_key_file_get_integer(sms->settings, SETTINGS_GROUP,
+ "Alphabet", &error);
}
static void bearer_init_callback(const struct ofono_error *error, void *data)
Regards,
-Denis