/** * shell_mobile_providers_parse: * @country_codes: (allow-none) File with the list of country codes. * @service_providers: (allow-none) File with the list of service providers. * * Returns: (element-type utf8 Shell.CountryMobileProvider) (transfer full): a * hash table where keys are country names #gchar and values are #ShellCountryMobileProvider. * Everything is destroyed with g_hash_table_destroy(). */ GHashTable * shell_mobile_providers_parse (const gchar *country_codes, const gchar *service_providers) { GMarkupParseContext *ctx; GIOChannel *channel; MobileParser parser; GError *error = NULL; char buffer[4096]; GIOStatus status; gsize len = 0; /* Use default paths if none given */ if (!country_codes) country_codes = ISO_3166_COUNTRY_CODES; if (!service_providers) service_providers = MOBILE_BROADBAND_PROVIDER_INFO; memset (&parser, 0, sizeof (MobileParser)); parser.table = read_country_codes (country_codes); if (!parser.table) goto out; channel = g_io_channel_new_file (service_providers, "r", &error); if (!channel) { if (error) { g_warning ("Could not read %s: %s", service_providers, error->message); g_error_free (error); } else g_warning ("Could not read %s: Unknown error", service_providers); goto out; } parser.state = PARSER_TOPLEVEL; ctx = g_markup_parse_context_new (&mobile_parser, 0, &parser, NULL); status = G_IO_STATUS_NORMAL; while (status == G_IO_STATUS_NORMAL) { status = g_io_channel_read_chars (channel, buffer, sizeof (buffer), &len, &error); switch (status) { case G_IO_STATUS_NORMAL: if (!g_markup_parse_context_parse (ctx, buffer, len, &error)) { status = G_IO_STATUS_ERROR; g_warning ("Error while parsing XML: %s", error->message); g_error_free (error);; } break; case G_IO_STATUS_EOF: break; case G_IO_STATUS_ERROR: g_warning ("Error while reading: %s", error->message); g_error_free (error); break; case G_IO_STATUS_AGAIN: /* FIXME: Try again a few times, but really, it never happes, right? */ break; } } g_io_channel_unref (channel); g_markup_parse_context_free (ctx); if (parser.current_provider) { g_warning ("pending current provider"); shell_mobile_provider_unref (parser.current_provider); } if (parser.current_providers) { g_warning ("pending current providers"); provider_list_free (parser.current_providers); } g_free (parser.current_country); g_free (parser.text_buffer); out: return parser.table; }
GHashTable * nmn_mobile_providers_parse (GHashTable **out_ccs) { GMarkupParseContext *ctx; GIOChannel *channel; MobileParser parser; GError *error = NULL; char buffer[4096]; GIOStatus status; gsize len = 0; memset (&parser, 0, sizeof (MobileParser)); parser.country_codes = read_country_codes (); if (!parser.country_codes) goto out; channel = g_io_channel_new_file (MOBILE_BROADBAND_PROVIDER_INFO, "r", &error); if (!channel) { if (error) { g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": %s", error->message); g_error_free (error); } else g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": Unknown error"); goto out; } parser.table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, provider_list_free); parser.state = PARSER_TOPLEVEL; ctx = g_markup_parse_context_new (&mobile_parser, 0, &parser, NULL); status = G_IO_STATUS_NORMAL; while (status == G_IO_STATUS_NORMAL) { status = g_io_channel_read_chars (channel, buffer, sizeof (buffer), &len, &error); switch (status) { case G_IO_STATUS_NORMAL: if (!g_markup_parse_context_parse (ctx, buffer, len, &error)) { status = G_IO_STATUS_ERROR; g_warning ("Error while parsing XML: %s", error->message); g_error_free (error);; } break; case G_IO_STATUS_EOF: break; case G_IO_STATUS_ERROR: g_warning ("Error while reading: %s", error->message); g_error_free (error); break; case G_IO_STATUS_AGAIN: /* FIXME: Try again a few times, but really, it never happes, right? */ break; } } g_io_channel_unref (channel); g_markup_parse_context_free (ctx); if (parser.current_provider) { g_warning ("pending current provider"); nmn_mobile_provider_unref (parser.current_provider); } if (parser.current_providers) { g_warning ("pending current providers"); provider_list_free (parser.current_providers); } g_free (parser.current_country); g_free (parser.text_buffer); out: if (parser.country_codes) { if (out_ccs) *out_ccs = parser.country_codes; else g_hash_table_destroy (parser.country_codes); } return parser.table; }
static gboolean read_service_providers (GHashTable *countries, const gchar *service_providers, GCancellable *cancellable, GError **error) { GMarkupParseContext *ctx; GIOChannel *channel; MobileParser parser; char buffer[4096]; GIOStatus status; gsize len = 0; memset (&parser, 0, sizeof (MobileParser)); parser.table = countries; channel = g_io_channel_new_file (service_providers, "r", error); if (!channel) { g_prefix_error (error, "Could not read '%s': ", service_providers); return FALSE; } parser.state = PARSER_TOPLEVEL; ctx = g_markup_parse_context_new (&mobile_parser, 0, &parser, NULL); status = G_IO_STATUS_NORMAL; while (status == G_IO_STATUS_NORMAL) { status = g_io_channel_read_chars (channel, buffer, sizeof (buffer), &len, error); switch (status) { case G_IO_STATUS_NORMAL: if (!g_markup_parse_context_parse (ctx, buffer, len, error)) { status = G_IO_STATUS_ERROR; g_prefix_error (error, "Error while parsing XML at '%s': ", service_providers); } break; case G_IO_STATUS_EOF: break; case G_IO_STATUS_ERROR: g_prefix_error (error, "Error while reading '%s': ", service_providers); break; case G_IO_STATUS_AGAIN: /* FIXME: Try again a few times, but really, it never happens, right? */ break; } if (g_cancellable_set_error_if_cancelled (cancellable, error)) status = G_IO_STATUS_ERROR; } g_io_channel_unref (channel); g_markup_parse_context_free (ctx); if (parser.current_provider) { g_warning ("pending current provider"); nma_mobile_provider_unref (parser.current_provider); } if (parser.current_providers) { g_warning ("pending current providers"); provider_list_free (parser.current_providers); } g_free (parser.current_country); g_free (parser.text_buffer); return (status == G_IO_STATUS_EOF); }