/*
 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef __MOBILE_PROVIDER_H
#define __MOBILE_PROVIDER_H

#include <glib.h>

#ifdef __cplusplus
extern "C" {
#endif

struct localized_name {
  gchar *name;
  gchar *lang;
};

struct mobile_apn {
  gchar *value;
  int num_names;
  struct localized_name **names;
  gchar *username;
  gchar *password;
};

struct mobile_provider
{
  /*
   * the "next" field links providers with
   * same name in different countries
   */
  struct mobile_provider *next;
  gchar country[3];
  gchar **networks;
  int num_names;
  struct localized_name **names;
  int num_apns;
  struct mobile_apn **apns;
  int refcnt;
  gboolean primary;
  int requires_roaming;
};

struct mobile_provider_db;

typedef void (*ProviderIterFunc)(struct mobile_provider *);
typedef void (*NetworkIterFunc)(gchar *, struct mobile_provider *);

struct mobile_provider_db *mobile_provider_open_db(const gchar *pathname);
void mobile_provider_close_db(struct mobile_provider_db *db);
struct mobile_provider *mobile_provider_lookup_by_name(
    const struct mobile_provider_db *db,
    const gchar *provider_name);
struct mobile_provider *mobile_provider_lookup_by_network(
    const struct mobile_provider_db *db,
    const gchar *network_id);
struct mobile_provider *mobile_provider_lookup_best_match(
    const struct mobile_provider_db *db,
    const gchar *provider_name,
    const gchar *network_id);
const gchar *mobile_provider_get_name(struct mobile_provider *provider);
void mobile_provider_foreach_provider(
    const struct mobile_provider_db *db,
    ProviderIterFunc func);
void mobile_provider_foreach_network(
    const struct mobile_provider_db *db,
    NetworkIterFunc func);

#ifdef __cplusplus
}
#endif

#endif /* __MOBILE_PROVIDER_H */
