static void ggg_plan_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GggPlanDialog *dialog = GGG_PLAN_DIALOG (object); switch (property_id) { case PROP_PROVIDER: { RestXmlNode *node; node = g_value_get_boxed (value); populate_store (dialog->priv->store, node); gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->priv->combo), 0); node = rest_xml_node_find (node, "name"); if (node && node->content && strlen (node->content) > 0) { char *str; /* TRANSLATORS: placeholder is service provider name, * e.g. "Vodafone" */ str = g_strdup_printf (_("Select your %s 3G Plan"), node->content); gtk_label_set_text (GTK_LABEL (dialog->priv->label), str); g_free (str); } else { gtk_label_set_text (GTK_LABEL (dialog->priv->label), _("Select your 3G Plan")); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static void ggg_plan_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GggPlanDialog *dialog = GGG_PLAN_DIALOG (object); switch (property_id) { case PROP_PROVIDER: { RestXmlNode *node; node = g_value_get_boxed (value); populate_store (dialog->priv->store, node); gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->priv->combo), 0); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static void state_machine (void) { GtkWidget *dialog; int old_state; while (state != STATE_FINISH) { /* For sanity checking state changes later */ old_state = state; switch (state) { case STATE_START: /* * Determine if we need to select a service or can go straight to probing * the service. */ if (services) { if (services->next) { dialog = g_object_new (GGG_TYPE_SERVICE_DIALOG, "services", services, NULL); switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: state = STATE_FINISH; break; case GTK_RESPONSE_ACCEPT: service = ggg_service_dialog_get_selected (GGG_SERVICE_DIALOG (dialog)); state = STATE_SERVICE; break; } gtk_widget_destroy (dialog); } else { service = services->data; state = STATE_SERVICE; } } else { g_printerr ("No services found\n"); state = STATE_FINISH; } break; case STATE_SERVICE: /* * Exmaine the service and determine if we can probe some information, or * have to do guided configuration. */ g_assert (service); if (ggg_service_is_roaming (service)) { state = STATE_COUNTRY; } else { provider_node = ggg_mobile_info_get_provider_for_ids (ggg_service_get_mcc (service), ggg_service_get_mnc (service)); /* If we found a provider switch straight to the plan selector, otherwises fall back to the manual configuration */ state = provider_node ? STATE_PLAN : STATE_MANUAL; } break; case STATE_COUNTRY: dialog = g_object_new (GGG_TYPE_COUNTRY_DIALOG, NULL); switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: state = STATE_FINISH; break; case GTK_RESPONSE_REJECT: state = STATE_MANUAL; break; case GTK_RESPONSE_ACCEPT: country_node = ggg_country_dialog_get_selected (GGG_COUNTRY_DIALOG (dialog)); state = STATE_PROVIDER; break; } gtk_widget_destroy (dialog); break; case STATE_PROVIDER: g_assert (country_node); dialog = g_object_new (GGG_TYPE_PROVIDER_DIALOG, "country", country_node, NULL); switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: state = STATE_FINISH; break; case GTK_RESPONSE_REJECT: state = STATE_MANUAL; break; case GTK_RESPONSE_ACCEPT: provider_node = ggg_provider_dialog_get_selected (GGG_PROVIDER_DIALOG (dialog)); state = STATE_PLAN; break; } gtk_widget_destroy (dialog); break; case STATE_PLAN: g_assert (provider_node); dialog = g_object_new (GGG_TYPE_PLAN_DIALOG, "provider", provider_node, NULL); switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: state = STATE_FINISH; break; case GTK_RESPONSE_REJECT: state = STATE_MANUAL; break; case GTK_RESPONSE_ACCEPT: plan_node = ggg_plan_dialog_get_selected (GGG_PLAN_DIALOG (dialog)); state = STATE_SAVE; break; } gtk_widget_destroy (dialog); break; case STATE_MANUAL: dialog = g_object_new (GGG_TYPE_MANUAL_DIALOG, NULL); switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: state = STATE_FINISH; break; case GTK_RESPONSE_ACCEPT: plan_node = ggg_manual_dialog_get_plan (GGG_MANUAL_DIALOG (dialog)); state = STATE_SAVE; break; } break; case STATE_SAVE: g_assert (plan_node); ggg_service_set (service, rest_xml_node_get_attr (plan_node, "value"), get_child_content (plan_node, "username"), get_child_content (plan_node, "password")); ggg_service_connect (service); state = STATE_FINISH; break; case STATE_FINISH: break; } g_assert (state != old_state); } }