diff --git a/mms-lib/include/mms_connman.h b/mms-lib/include/mms_connman.h index 235a426..d5c85be 100644 --- a/mms-lib/include/mms_connman.h +++ b/mms-lib/include/mms_connman.h @@ -19,6 +19,7 @@ typedef struct mms_connman_class { GObjectClass parent; + char* (*fn_default_imsi)(MMSConnMan* cm); MMSConnection* (*fn_open_connection)(MMSConnMan* cm, const char* imsi, gboolean user_request); } MMSConnManClass; @@ -35,6 +36,14 @@ void mms_connman_unref( MMSConnMan* cm); +/** + * Returns default (first available) IMSI or NULL if SIM is not present + * or not configured. Caller must g_free() the returned string. + */ +char* +mms_connman_default_imsi( + MMSConnMan* cm); + /** * Creates a new connection or returns the reference to an aready active one. * The caller must release the reference. diff --git a/mms-lib/src/mms_connman.c b/mms-lib/src/mms_connman.c index c2fc2f5..257e09e 100644 --- a/mms-lib/src/mms_connman.c +++ b/mms-lib/src/mms_connman.c @@ -55,6 +55,23 @@ mms_connman_init( { } +/** + * Returns default (first available) IMSI or NULL if SIM is not present + * or not configured. Caller must g_free() the returned string. + */ +char* +mms_connman_default_imsi( + MMSConnMan* cm) +{ + if (cm) { + MMSConnManClass* klass = MMS_CONNMAN_GET_CLASS(cm); + if (klass->fn_default_imsi) { + return klass->fn_default_imsi(cm); + } + } + return NULL; +} + /** * Creates a new connection or returns the reference to an aready active one. * The caller must release the reference. diff --git a/mms-ofono/src/mms_ofono_connman.c b/mms-ofono/src/mms_ofono_connman.c index 6651ba7..1595b2d 100644 --- a/mms-ofono/src/mms_ofono_connman.c +++ b/mms-ofono/src/mms_ofono_connman.c @@ -37,6 +37,24 @@ G_DEFINE_TYPE(MMSOfonoConnMan, mms_ofono_connman, MMS_TYPE_CONNMAN); #define MMS_OFONO_CONNMAN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ MMS_TYPE_OFONO_CONNMAN, MMSOfonoConnMan)) +/** + * Returns IMSI of the default SIM + */ +static +char* +mms_ofono_connman_default_imsi( + MMSConnMan* cm) +{ + MMSOfonoConnMan* ofono = MMS_OFONO_CONNMAN(cm); + if (ofono->man) { + MMSOfonoModem* modem = mms_ofono_manager_default_modem(ofono->man); + if (modem && modem->imsi) { + return g_strdup(modem->imsi); + } + } + return NULL; +} + /** * Creates a new connection or returns the reference to an aready active one. * The caller must release the reference. @@ -153,6 +171,7 @@ void mms_ofono_connman_class_init( MMSOfonoConnManClass* klass) { + klass->fn_default_imsi = mms_ofono_connman_default_imsi; klass->fn_open_connection = mms_ofono_connman_open_connection; G_OBJECT_CLASS(klass)->dispose = mms_ofono_connman_dispose; } diff --git a/mms-ofono/src/mms_ofono_manager.c b/mms-ofono/src/mms_ofono_manager.c index 697ef3f..e04d57f 100644 --- a/mms-ofono/src/mms_ofono_manager.c +++ b/mms-ofono/src/mms_ofono_manager.c @@ -155,6 +155,21 @@ mms_ofono_manager_modem_imsi_find_cb( return modem->imsi && !strcmp(modem->imsi, imsi); } +MMSOfonoModem* +mms_ofono_manager_default_modem( + MMSOfonoManager* ofono) +{ + if (g_hash_table_size(ofono->modems) > 0) { + GHashTableIter iter; + gpointer key, value = NULL; + g_hash_table_iter_init(&iter, ofono->modems); + if (g_hash_table_iter_next(&iter, &key, &value)) { + return value; + } + } + return NULL; +} + MMSOfonoModem* mms_ofono_manager_modem_for_imsi( MMSOfonoManager* ofono, diff --git a/mms-ofono/src/mms_ofono_manager.h b/mms-ofono/src/mms_ofono_manager.h index 76e40ae..92b568d 100644 --- a/mms-ofono/src/mms_ofono_manager.h +++ b/mms-ofono/src/mms_ofono_manager.h @@ -25,6 +25,10 @@ void mms_ofono_manager_free( MMSOfonoManager* ofono); +MMSOfonoModem* +mms_ofono_manager_default_modem( + MMSOfonoManager* ofono); + MMSOfonoModem* mms_ofono_manager_modem_for_imsi( MMSOfonoManager* ofono,