shill: Basic persistent store interface and key-file implementation.

The current interface and implementation support all functionality required by
the legacy network manager. The implementation uses glib's key file parser for
legacy reasons. The interface-based implementation allows us to switch to a
different format in the future, if necessary.

BUG=chromium-os:16897
TEST=unit test

Change-Id: I8fd54f47e7309c603b66ba86bbecb8d5092e8674
Reviewed-on: http://gerrit.chromium.org/gerrit/3160
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Darin Petkov <petkov@chromium.org>
diff --git a/glib.cc b/glib.cc
index 13545ac..51ee0cd 100644
--- a/glib.cc
+++ b/glib.cc
@@ -2,18 +2,120 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <base/stringprintf.h>
+
 #include "shill/glib.h"
 
 namespace shill {
 
 GLib::~GLib() {}
 
+std::string GLib::ConvertErrorToMessage(GError *error) {
+  if (!error) {
+    return "Unknown GLib error.";
+  }
+  std::string message =
+      base::StringPrintf("GError(%d): %s", error->code, error->message);
+  g_error_free(error);
+  return message;
+}
+
 guint GLib::ChildWatchAdd(GPid pid,
                           GChildWatchFunc function,
                           gpointer data) {
   return g_child_watch_add(pid, function, data);
 }
 
+void GLib::Free(gpointer mem) {
+  g_free(mem);
+}
+
+void GLib::KeyFileFree(GKeyFile *key_file) {
+  g_key_file_free(key_file);
+}
+
+gboolean GLib::KeyFileLoadFromFile(GKeyFile *key_file,
+                                   const gchar *file,
+                                   GKeyFileFlags flags,
+                                   GError **error) {
+  return g_key_file_load_from_file(key_file, file, flags, error);
+}
+
+gboolean GLib::KeyFileGetBoolean(GKeyFile *key_file,
+                                 const gchar *group_name,
+                                 const gchar *key,
+                                 GError **error) {
+  return g_key_file_get_boolean(key_file, group_name, key, error);
+}
+
+gchar **GLib::KeyFileGetGroups(GKeyFile *key_file,
+                               gsize *length) {
+  return g_key_file_get_groups(key_file, length);
+}
+
+gint GLib::KeyFileGetInteger(GKeyFile *key_file,
+                             const gchar *group_name,
+                             const gchar *key,
+                             GError **error) {
+  return g_key_file_get_integer(key_file, group_name, key, error);
+}
+
+gchar *GLib::KeyFileGetString(GKeyFile *key_file,
+                              const gchar *group_name,
+                              const gchar *key,
+                              GError **error) {
+  return g_key_file_get_string(key_file, group_name, key, error);
+}
+
+gboolean GLib::KeyFileHasGroup(GKeyFile *key_file,
+                               const gchar *group_name) {
+  return g_key_file_has_group(key_file, group_name);
+}
+
+GKeyFile *GLib::KeyFileNew() {
+  return g_key_file_new();
+}
+
+void GLib::KeyFileRemoveGroup(GKeyFile *key_file,
+                              const gchar *group_name,
+                              GError **error) {
+  g_key_file_remove_group(key_file, group_name, error);
+}
+
+void GLib::KeyFileRemoveKey(GKeyFile *key_file,
+                            const gchar *group_name,
+                            const gchar *key,
+                            GError **error) {
+  g_key_file_remove_key(key_file, group_name, key, error);
+}
+
+void GLib::KeyFileSetBoolean(GKeyFile *key_file,
+                             const gchar *group_name,
+                             const gchar *key,
+                             gboolean value) {
+  g_key_file_set_boolean(key_file, group_name, key, value);
+}
+
+void GLib::KeyFileSetInteger(GKeyFile *key_file,
+                             const gchar *group_name,
+                             const gchar *key,
+                             gint value) {
+  g_key_file_set_integer(key_file, group_name, key, value);
+}
+
+void GLib::KeyFileSetString(GKeyFile *key_file,
+                            const gchar *group_name,
+                            const gchar *key,
+                            const gchar *string) {
+  g_key_file_set_string(key_file, group_name, key, string);
+}
+
+gchar *GLib::KeyFileToData(GKeyFile *key_file,
+                           gsize *length,
+                           GError **error) {
+  return g_key_file_to_data(key_file, length, error);
+}
+
 gboolean GLib::SourceRemove(guint tag) {
   return g_source_remove(tag);
 }
@@ -40,4 +142,8 @@
   g_spawn_close_pid(pid);
 }
 
+void GLib::Strfreev(gchar **str_array) {
+  g_strfreev(str_array);
+}
+
 }  // namespace shill