diff --git a/src/plugins/project.conf b/src/plugins/project.conf index 8229e1c..2194fcb 100644 --- a/src/plugins/project.conf +++ b/src/plugins/project.conf @@ -146,7 +146,7 @@ sources=ussd.c install=$(LIBDIR)/Phone/plugins [ussd.c] -depends=../../include/Phone.h +depends=../../include/Phone.h,../../config.h [video] type=plugin diff --git a/src/plugins/ussd.c b/src/plugins/ussd.c index 6c0d20b..31da61e 100644 --- a/src/plugins/ussd.c +++ b/src/plugins/ussd.c @@ -12,11 +12,10 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -/* FIXME: - * - use a configuration file instead */ +#include #ifdef DEBUG # include #endif @@ -24,6 +23,14 @@ #include #include #include "Phone.h" +#include "../../config.h" + +#ifndef PREFIX +# define PREFIX "/usr/local" +#endif +#ifndef SYSCONFDIR +# define SYSCONFDIR PREFIX "/etc" +#endif /* USSD */ @@ -32,103 +39,29 @@ typedef struct _PhonePlugin { PhonePluginHelper * helper; - size_t _operator; + Config * config; + char * _operator; /* widgets */ GtkWidget * window; GtkWidget * operators; GtkWidget * codes; } USSD; -typedef struct _USSDCode +typedef enum _USSDOperator { - char const * number; - char const * name; + UO_OPERATOR = 0, + UO_DISPLAY +} USSDOperator; +#define UO_LAST UO_DISPLAY +#define UO_COUNT (UO_LAST + 1) + +typedef enum _USSDCode +{ + UC_CODE = 0, + UC_DISPLAY } USSDCode; - - -/* constants */ -/* Germany */ -static USSDCode _ussd_codes_de_ccc_32c3[] = -{ - { "*#100#", "Number request" }, - { NULL, NULL } -}; - -/* E-Plus, see http://www.prepaid-wiki.de/index.php5/E-Plus */ -static USSDCode _ussd_codes_de_eplus[] = -{ - { "*100#", "Balance enquiry" }, - { NULL, NULL } -}; - -/* FYVE, see http://www.prepaid-wiki.de/index.php5/FYVE#Servicefunktionen */ -static USSDCode _ussd_codes_de_fyve[] = -{ - { "*100#", "Balance enquiry and charging menu" }, - { "*106#", "Balance enquiry" }, - { NULL, NULL } -}; - -/* MTN, see http://www.mtn.co.za/Support/faq/Pages/USSD.aspx */ -static USSDCode _ussd_codes_za_mtn[] = -{ - { "*141#", "Balance enquiry" }, - { "*141*4#", "Tariff Analyser and Priceplan Migrations menu" }, - { "*141*4*0#", "Tariff Analyser" }, - { "*141*6*0#", "Data bundle cancellation" }, - { "*141*7*0#", "SMS bundle cancellation" }, - { "*141*8#", "Yello Fortune Entries" }, - { NULL, NULL } -}; - -/* Telekom */ -static USSDCode _ussd_codes_de_telekom[] = -{ - { "*2221#", "Multi-SIM: current status" }, - { "*2222#", "Multi-SIM: set card as default" }, - { NULL, NULL } -}; - -/* Virgin Mobile, see - * http://fr.wikipedia.org/wiki/Unstructured_Supplementary_Service_Data */ -static USSDCode _ussd_codes_fr_virgin[] = -{ - { "*144#", "Balance enquiry" }, - { NULL, NULL } -}; - -/* Vodafone India, see - * http://broadbandforum.in/vodafone-3g/66861-important-vodafone-sms-codes-ussd/ - */ -static USSDCode _ussd_codes_in_vodafone[] = -{ - { "*141#", "Balance enquiry" }, - { "*444#", "Self-service portal" }, - { "*225*6#", "See unused GPRS data and expiry" }, - { "*225*3#", "See unused 3G data and expiry" }, - { "*444*5#", "Activate 30MB, 1 day, GPRS plan" }, - { NULL, NULL } -}; - -static const struct -{ - char const * name; - char const * _operator; - USSDCode * codes; -} _ussd_operators[] = -{ - /* FIXME obtain the corresponding operator names */ - { "CCC 32C3", NULL, _ussd_codes_de_ccc_32c3 }, - { "E-Plus", NULL, _ussd_codes_de_eplus }, - { "FYVE", NULL, _ussd_codes_de_fyve }, - { "Monacell", NULL, _ussd_codes_fr_virgin }, - { "MTN", NULL, _ussd_codes_za_mtn }, - { "NRJ", NULL, _ussd_codes_fr_virgin }, - { "Telekom", "Telekom.de", _ussd_codes_de_telekom }, - { "Virgin", NULL, _ussd_codes_fr_virgin }, - { "Vodafone", NULL, _ussd_codes_in_vodafone }, - { NULL, NULL, NULL } -}; +#define UC_LAST UC_DISPLAY +#define UC_COUNT (UC_LAST + 1) /* prototypes */ @@ -139,7 +72,7 @@ static int _ussd_event(USSD * ussd, PhoneEvent * event); static void _ussd_settings(USSD * ussd); /* useful */ -static int _ussd_load_operator(USSD * ussd, char const * _operator); +static int _ussd_load_operator(USSD * ussd, char const * name); /* callbacks */ static void _ussd_on_operators_changed(gpointer data); @@ -170,11 +103,16 @@ static USSD * _ussd_init(PhonePluginHelper * helper) if((ussd = object_new(sizeof(*ussd))) == NULL) return NULL; + ussd->config = config_new(); + ussd->_operator = NULL; ussd->helper = helper; - ussd->_operator = 0; ussd->window = NULL; ussd->operators = NULL; ussd->codes = NULL; + /* check for errors */ + if(ussd->config == NULL || config_load(ussd->config, + SYSCONFDIR "/" PACKAGE "/ussd.conf") != 0) + helper->error(helper->phone, error_get(NULL), 1); return ussd; } @@ -184,6 +122,9 @@ static void _ussd_destroy(USSD * ussd) { if(ussd->window != NULL) gtk_widget_destroy(ussd->window); + free(ussd->_operator); + if(ussd->config != NULL) + config_delete(ussd->config); object_delete(ussd); } @@ -221,6 +162,7 @@ static int _event_modem(USSD * ussd, ModemEvent * event) /* ussd_settings */ static void _settings_window(USSD * ussd); +static void _settings_window_operators(String const * section, void * data); static void _ussd_settings(USSD * ussd) { @@ -232,11 +174,12 @@ static void _ussd_settings(USSD * ussd) static void _settings_window(USSD * ussd) { GtkSizeGroup * group; + GtkListStore * model; GtkWidget * vbox; GtkWidget * hbox; GtkWidget * image; GtkWidget * widget; - size_t i; + GtkCellRenderer * renderer; group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); ussd->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -267,17 +210,15 @@ static void _settings_window(USSD * ussd) #endif gtk_size_group_add_widget(group, widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); -#if GTK_CHECK_VERSION(3, 0, 0) - ussd->operators = gtk_combo_box_text_new(); - for(i = 0; _ussd_operators[i].name != NULL; i++) - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(ussd->operators), - NULL, _ussd_operators[i].name); -#else - ussd->operators = gtk_combo_box_new_text(); - for(i = 0; _ussd_operators[i].name != NULL; i++) - gtk_combo_box_append_text(GTK_COMBO_BOX(ussd->operators), - _ussd_operators[i].name); -#endif + model = gtk_list_store_new(UO_COUNT, G_TYPE_STRING, G_TYPE_STRING); + ussd->operators = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model)); + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(ussd->operators), renderer, + TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(ussd->operators), + renderer, "text", UO_DISPLAY, NULL); + if(ussd->config != NULL) + config_foreach(ussd->config, _settings_window_operators, ussd); g_signal_connect_swapped(ussd->operators, "changed", G_CALLBACK( _ussd_on_operators_changed), ussd); gtk_box_pack_start(GTK_BOX(hbox), ussd->operators, TRUE, TRUE, 0); @@ -296,11 +237,13 @@ static void _settings_window(USSD * ussd) #endif gtk_size_group_add_widget(group, widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); -#if GTK_CHECK_VERSION(3, 0, 0) - ussd->codes = gtk_combo_box_text_new(); -#else - ussd->codes = gtk_combo_box_new_text(); -#endif + model = gtk_list_store_new(UC_COUNT, G_TYPE_STRING, G_TYPE_STRING); + ussd->codes = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model)); + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(ussd->codes), renderer, + TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(ussd->codes), renderer, + "text", UC_DISPLAY, NULL); gtk_box_pack_start(GTK_BOX(hbox), ussd->codes, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); /* send */ @@ -338,59 +281,98 @@ static void _settings_window(USSD * ussd) gtk_container_add(GTK_CONTAINER(hbox), widget); gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(ussd->window), vbox); - gtk_combo_box_set_active(GTK_COMBO_BOX(ussd->operators), - ussd->_operator); + gtk_combo_box_set_active(GTK_COMBO_BOX(ussd->operators), 0); gtk_widget_show_all(vbox); } +static void _settings_window_operators(String const * section, void * data) +{ + USSD * ussd = data; + GtkTreeModel * model; + GtkTreeIter iter; + String const * name; + + model = gtk_combo_box_get_model(GTK_COMBO_BOX(ussd->operators)); + gtk_list_store_append(GTK_LIST_STORE(model), &iter); + name = config_get(ussd->config, section, "name"); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, UO_OPERATOR, section, + UO_DISPLAY, (name != NULL) ? name : section, -1); +} + /* useful */ /* ussd_load_operator */ -static int _ussd_load_operator(USSD * ussd, char const * _operator) +static int _ussd_load_operator(USSD * ussd, char const * name) { - size_t i; + GtkTreeModel * model; + GtkTreeIter iter; + gboolean valid; + gchar * _operator; - if(_operator == NULL) + if(name == NULL) return -1; - for(i = 0; _ussd_operators[i].name != NULL; i++) - if(_ussd_operators[i]._operator == NULL) - continue; - else if(strcmp(_ussd_operators[i]._operator, _operator) == 0) + free(ussd->_operator); + if((ussd->_operator = strdup(name)) == NULL) + return -1; + model = gtk_combo_box_get_model(GTK_COMBO_BOX(ussd->operators)); + for(valid = gtk_tree_model_get_iter_first(model, &iter); valid; + valid = gtk_tree_model_iter_next(model, &iter)) + { + gtk_tree_model_get(model, &iter, UO_OPERATOR, &_operator, -1); + valid = (strcmp(name, _operator) == 0) ? TRUE : FALSE; + g_free(_operator); + if(valid) { - ussd->_operator = i; - if(ussd->window != NULL) - gtk_combo_box_set_active(GTK_COMBO_BOX( - ussd->operators), i); + gtk_combo_box_set_active_iter( + GTK_COMBO_BOX(ussd->operators), &iter); break; } + } return 0; } /* callbacks */ /* ussd_on_operators_changed */ +static void _ussd_on_operators_changed_operator(char const * variable, + char const * value, void * data); + static void _ussd_on_operators_changed(gpointer data) { USSD * ussd = data; GtkTreeModel * model; - int i; - USSDCode * codes; + GtkTreeIter iter; + gchar * p; model = gtk_combo_box_get_model(GTK_COMBO_BOX(ussd->codes)); gtk_list_store_clear(GTK_LIST_STORE(model)); - i = gtk_combo_box_get_active(GTK_COMBO_BOX(ussd->operators)); - codes = _ussd_operators[i].codes; - for(i = 0; codes[i].name != NULL; i++) -#if GTK_CHECK_VERSION(3, 0, 0) - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(ussd->codes), - NULL, codes[i].name); -#else - gtk_combo_box_append_text(GTK_COMBO_BOX(ussd->codes), - codes[i].name); -#endif + if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ussd->operators), &iter) + != TRUE) + return; + model = gtk_combo_box_get_model(GTK_COMBO_BOX(ussd->operators)); + gtk_tree_model_get(model, &iter, UO_OPERATOR, &p, -1); + if(ussd->config != NULL) + config_foreach_section(ussd->config, p, + _ussd_on_operators_changed_operator, ussd); + g_free(p); gtk_combo_box_set_active(GTK_COMBO_BOX(ussd->codes), 0); } +static void _ussd_on_operators_changed_operator(char const * variable, + char const * value, void * data) +{ + USSD * ussd = data; + GtkTreeModel * model; + GtkTreeIter iter; + + if(strcmp(variable, "name") == 0) + return; + model = gtk_combo_box_get_model(GTK_COMBO_BOX(ussd->codes)); + gtk_list_store_append(GTK_LIST_STORE(model), &iter); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, UC_CODE, variable, + UC_DISPLAY, value, -1); +} + /* ussd_on_settings_close */ static void _ussd_on_settings_close(gpointer data) @@ -406,19 +388,20 @@ static void _ussd_on_settings_send(gpointer data) { USSD * ussd = data; PhonePluginHelper * helper = ussd->helper; - int i; - USSDCode * codes; + GtkTreeModel * model; + GtkTreeIter iter; + gchar * code; ModemRequest request; - i = gtk_combo_box_get_active(GTK_COMBO_BOX(ussd->operators)); - codes = _ussd_operators[i].codes; - i = gtk_combo_box_get_active(GTK_COMBO_BOX(ussd->codes)); -#ifdef DEBUG - fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, codes[i].number); -#endif + model = gtk_combo_box_get_model(GTK_COMBO_BOX(ussd->codes)); + if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ussd->codes), &iter) + != TRUE) + return; + gtk_tree_model_get(model, &iter, UC_CODE, &code, -1); memset(&request, 0, sizeof(request)); request.type = MODEM_REQUEST_CALL; request.call.call_type = MODEM_CALL_TYPE_VOICE; - request.call.number = codes[i].number; + request.call.number = code; helper->request(helper->phone, &request); + g_free(code); } diff --git a/src/plugins/ussd/ussd.conf b/src/plugins/ussd/ussd.conf index 42b005c..4cb2086 100644 --- a/src/plugins/ussd/ussd.conf +++ b/src/plugins/ussd/ussd.conf @@ -1,368 +1,49 @@ -[du] -msisdn-query=*#100# - -[Karabakh Telecom] -balance-check=*122# -balance-top-up=*123*CODE# - -[tele.ring] -balance-check=*102# - -[Azerfon] -msisdn-query=*100#3# - -[m:tel] -balance-check=*101# - -[HT-ERONET] -balance-check=*101# - -[Robi (AKTel)] -balance-check=*222# -balance-top-up=*111*CODE# -msisdn-query=*140*2*4# - -[Banglalink] -balance-check=*124# -balance-top-up=*123*CODE# -msisdn-query=*511# - -[GrameenPhone] -balance-check=*566# -balance-top-up=*555*CODE# -msisdn-query=*2# - -[Airtel (Warid)] -balance-check=*778# -balance-top-up=*787*CODE# -msisdn-query=*121*6*3# - -[Teletalk] -balance-check=*152# -balance-top-up=#151*CODE# -msisdn-query=*551# - -[Mobistar] -balance-check=#123# - -[GloBul] -balance-check=*125# - -[M-Tel] -balance-check=*101# - -[Vivacom] -balance-check=*102# - -[Claro] -balance-check=*544# - -[TIM] -balance-check=*222# - -[velcom] -balance-check=*100# - -[MTS] -balance-check=*100# - -[life:)] -balance-check=*100# - -[Orange] -balance-check=#121# -balance-top-up=#121*CODE# - -[Swisscom] -balance-check=*130# -balance-top-up=*123*CODE# - -[M-Budget] -msisdn-query=*#100# - -[Cytamobile-Vodafone] -msisdn-query=*#109# - -[Vodafone] -balance-check=*22# - -[O2] -balance-check=*104*# -balance-top-up=*102*CODE# - -[AldiTalk/MedionMobile] -balance-check=*100# -balance-top-up=*104*CODE# - -[blau.de] -balance-check=*100# -balance-top-up=*104*CODE# +[CCC 32C3] +*#100#=Number request [E-Plus] -balance-check=*100# -balance-top-up=*104*CODE# +#E-Plus, see +#http://www.prepaid-wiki.de/index.php5/E-Plus +*100#=Balance enquiry -[O2] -balance-check=*101# -balance-top-up=*103*CODE# +[FYVE] +#FYVE, see +#http://www.prepaid-wiki.de/index.php5/FYVE#Servicefunktionen +*100#=Balance enquiry and charging menu +*106#=Balance enquiry -[Tchibo-Mobil] -balance-check=*101# -balance-top-up=*103*CODE# - -[T-Mobile(Telekom)] -balance-check=*100# -balance-top-up=*101*CODE# - -[Congstar] -balance-check=*100# -balance-top-up=*101*CODE# - -[Vodafone] -balance-check=*100# -balance-top-up=*100*CODE# - -[FONIC] -balance-check=*101# -balance-top-up=*103*CODE# - -[simyo Internet] -balance-check=*100# -balance-top-up=*104*CODE# - -[1&1] -balance-check=*100# - -[Telenor] -balance-check=*101# - -[TDC] -balance-check=*101# - -[Telia] -balance-check=*101# - -[Orange] -balance-check=#131# - -[Claro] -balance-check=*122# - -[Viva] -balance-check=#111# - -[Vodafone] -msisdn-query=*878# - -[Orange] -balance-check=*111# - -[Vodafone] -msisdn-query=*138# - -[Yoigo] -balance-check=*111# - -[Ethio Telecom] -balance-check=*804# - -[Vodafone FO] -msisdn-query=*#100# - -[Vodafone / Kidanet] -msisdn-query=*999# - -[Orange] -balance-check=#123# -balance-top-up=#124*CODE# - -[O2] -balance-check=*#10# - -[giffgaff] -balance-check=*100# - -[Vodafone] -balance-check=*#1345# -msisdn-query=*#100# +[Monacell] +#like Virgin +*144#=Balance enquiry [MTN] -balance-check=*124# -balance-top-up=*125*CODE# +#MTN, see +#http://www.mtn.co.za/Support/faq/Pages/USSD.aspx +*141#=Balance enquiry +*141*4#=Tariff Analyser and Priceplan Migrations menu +*141*4*0#=Tariff Analyser +*141*6*0#=Data bundle cancellation +*141*7*0#=SMS bundle cancellation +*141*8#=Yello Fortune Entries + +[NRJ] +#like Virgin +*144#=Balance enquiry + +[Telekom.de] +*2221#=Multi-SIM: current status +*2222#=Multi-SIM: set card as default + +[Virgin] +#Virgin Mobile, see +#http://fr.wikipedia.org/wiki/Unstructured_Supplementary_Service_Data +*144#=Balance enquiry [Vodafone] -balance-check=*122# -balance-top-up=*123*CODE# -msisdn-query=*127# - -[Tigo] -balance-check=*820# -balance-top-up=*842*CODE# - -[Airtel] -balance-check=*133# -balance-top-up=*134*CODE# - -[GloGhana] -balance-check=*124# -balance-top-up=*123*CODE# - -[O2] -balance-check=*#100# - -[Reliance] -balance-check= *111*1*3# - -[Safaricom] -balance-check=*144# -balance-top-up=*544*CODE# - -[Beeline] -balance-check=*102# - -[MegaCom] -balance-check=*500# - -[O!] -balance-check=*100# - -[Cellcard] -balance-check=#124# - -[Hello] -balance-check=*100# - -[qb] -balance-check=#132# - -[Smart Mobile] -balance-check=*888# - -[Metfone] -balance-check=*097# - -[Beeline] -balance-check=*102# - -[Mfone] -balance-check=*222# - -[Lao Telecom] -balance-check=*122# - -[Airtel NG] -balance-check=*123# -balance-top-up=*126*CODE# - -[MTN] -balance-check=*556# -balance-top-up=*555*CODE# - -[Glo Mobile] -balance-check=#124# -balance-top-up=*123*CODE# - -[Etisalat] -balance-check=*232# -balance-top-up=*222*CODE# - -[Vodafone] -msisdn-query=*#100# - -[Netcom] -balance-check=*150# - -[Tele2] -balance-check=*111# - -[T-mobile] -balance-check=*101# -balance-top-up=*111*CODE# - -[Play Online] -balance-check=*101# -balance-top-up=*100*CODE# - -[Orange] -balance-check=*124*# -balance-top-up=*125*CODE# - -[Plus] -balance-check=*100# -balance-top-up=*123*CODE# - -[Heyah] -balance-check=*108# -balance-top-up=*109*CODE# - -[GaduAIR] -balance-check=*101# - -[mBank mobile] -balance-check=*100# - -[Vodafone] -msisdn-query=*#100# - -[Beeline] -balance-check=*102# - -[MTS] -balance-check=*100# - -[Megafon] -balance-check=*100# - -[U-tel] -balance-check=*100# - -[Tele2] -balance-check=*111# - -[Comviq] -balance-check=*111# -balance-top-up=*110*CODE# - -[Telenor] -balance-check=*222# - -[Telia] -balance-check=*120# - -[Vodafone / Simobil] -msisdn-query=*100# - -[Zain] -balance-check=*888# -balance-top-up=*888*CODE# - -[Vodafone] -msisdn-query=*101# - -[life:)] -balance-check=*111# - -[Cell-c] -balance-check=*101# -balance-top-up=*102*CODE# -msisdn-query=*147*100# - -[MTN] -balance-check=*141# -balance-top-up=*141*CODE# -msisdn-query=*123*888# - -[Vodacom] -balance-check=*100# -balance-top-up=*100*01*CODE# -msisdn-query=*111*501# - -[Virgin Mobile] -balance-check=*101# -balance-top-up=*102*CODE# - -[8.ta] -balance-check=*188# -balance-top-up=*188*CODE# -msisdn-query=*1# - +#Vodafone India, see +#http://broadbandforum.in/vodafone-3g/66861-important-vodafone-sms-codes-ussd/ +*141#=Balance enquiry +*444#=Self-service portal +*225*6#=See unused GPRS data and expiry +*225*3#=See unused 3G data and expiry +*444*5#=Activate 30MB, 1 day, GPRS plan