// Copyright (c) 2012 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 SHILL_GLIB_H_
#define SHILL_GLIB_H_

#include <string>

#include <gio/gio.h>
#include <glib.h>

#include <base/basictypes.h>

namespace shill {

// A GLib abstraction allowing GLib mocking in tests.
class GLib {
 public:
  GLib();
  virtual ~GLib();

  // Converts GLib's |error| to a string message and frees the GError object.
  virtual std::string ConvertErrorToMessage(GError *error);

  // Thin wrappers around Base64Decode/Encode.  Return true on success.
  virtual bool B64Decode(const std::string &input, std::string *output);
  virtual bool B64Encode(const std::string &input, std::string *output);

  // g_bus_unwatch_name
  virtual void BusUnwatchName(guint watcher_id);
  // g_bus_watch_name
  virtual guint BusWatchName(GBusType bus_type,
                             const gchar *name,
                             GBusNameWatcherFlags flags,
                             GBusNameAppearedCallback name_appeared_handler,
                             GBusNameVanishedCallback name_vanished_handler,
                             gpointer user_data,
                             GDestroyNotify user_data_free_func);
  // g_child_watch_add
  virtual guint ChildWatchAdd(GPid pid,
                              GChildWatchFunc function,
                              gpointer data);
  // g_free
  virtual void Free(gpointer mem);
  // g_key_file_free
  virtual void KeyFileFree(GKeyFile *key_file);
  // g_key_file_get_boolean
  virtual gboolean KeyFileGetBoolean(GKeyFile *key_file,
                                     const gchar *group_name,
                                     const gchar *key,
                                     GError **error);
  // g_key_file_get_groups
  virtual gchar **KeyFileGetGroups(GKeyFile *key_file,
                                   gsize *length);
  // g_key_file_get_integer
  virtual gint KeyFileGetInteger(GKeyFile *key_file,
                                 const gchar *group_name,
                                 const gchar *key,
                                 GError **error);
  // g_key_file_get_string
  virtual gchar *KeyFileGetString(GKeyFile *key_file,
                                  const gchar *group_name,
                                  const gchar *key,
                                  GError **error);
  // g_key_file_get_string_list
  virtual gchar **KeyFileGetStringList(GKeyFile *key_file,
                                       const gchar *group_name,
                                       const gchar *key,
                                       gsize *length,
                                       GError **error);
  // g_key_file_has_group
  virtual gboolean KeyFileHasGroup(GKeyFile *key_file,
                                   const gchar *group_name);
  // g_key_file_has_key
  virtual gboolean KeyFileHasKey(GKeyFile *key_file,
                                 const gchar *group_name,
                                 const gchar *key,
                                 GError **error);
  // g_key_file_load_from_file
  virtual gboolean KeyFileLoadFromFile(GKeyFile *key_file,
                                       const gchar *file,
                                       GKeyFileFlags flags,
                                       GError **error);
  // g_key_file_new
  virtual GKeyFile *KeyFileNew();
  // g_key_file_remove_group
  virtual void KeyFileRemoveGroup(GKeyFile *key_file,
                                  const gchar *group_name,
                                  GError **error);
  // g_key_file_remove_key
  virtual void KeyFileRemoveKey(GKeyFile *key_file,
                                const gchar *group_name,
                                const gchar *key,
                                GError **error);
  // g_key_file_set_boolean
  virtual void KeyFileSetBoolean(GKeyFile *key_file,
                                 const gchar *group_name,
                                 const gchar *key,
                                 gboolean value);
  // g_key_file_set_comment
  virtual gboolean KeyFileSetComment(GKeyFile *key_file,
                                     const gchar *group_name,
                                     const gchar *key,
                                     const gchar *comment,
                                     GError **error);
  // g_key_file_set_integer
  virtual void KeyFileSetInteger(GKeyFile *key_file,
                                 const gchar *group_name,
                                 const gchar *key,
                                 gint value);
  // g_key_file_set_string
  virtual void KeyFileSetString(GKeyFile *key_file,
                                const gchar *group_name,
                                const gchar *key,
                                const gchar *value);
  // g_key_file_set_string_list
  virtual void KeyFileSetStringList(GKeyFile *key_file,
                                    const gchar *group_name,
                                    const gchar *key,
                                    const gchar * const list[],
                                    gsize length);
  // g_key_file_to_data
  virtual gchar *KeyFileToData(GKeyFile *key_file,
                               gsize *length,
                               GError **error);
  // g_source_remove
  virtual gboolean SourceRemove(guint tag);
  // g_spawn_async
  virtual gboolean SpawnAsync(const gchar *working_directory,
                              gchar **argv,
                              gchar **envp,
                              GSpawnFlags flags,
                              GSpawnChildSetupFunc child_setup,
                              gpointer user_data,
                              GPid *child_pid,
                              GError **error);
  // g_spawn_close_pid
  virtual void SpawnClosePID(GPid pid);
  // g_spawn_sync
  virtual gboolean SpawnSync(const gchar *working_directory,
                             gchar **argv,
                             gchar **envp,
                             GSpawnFlags flags,
                             GSpawnChildSetupFunc child_setup,
                             gpointer user_data,
                             gchar **standard_output,
                             gchar **standard_error,
                             gint *exit_status,
                             GError **error);
  // g_strfreev
  virtual void Strfreev(gchar **str_array);
  // g_type_init
  virtual void TypeInit();

 private:
  DISALLOW_COPY_AND_ASSIGN(GLib);
};

}  // namespace shill

#endif  // SHILL_GLIB_H_
