Darin Petkov | 36a3ace | 2012-03-06 17:22:14 +0100 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
Darin Petkov | f7897bc | 2011-06-08 17:13:36 -0700 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Christopher Wiley | 5447d2e | 2013-03-19 17:46:03 -0700 | [diff] [blame] | 5 | #include "shill/glib.h" |
| 6 | |
| 7 | #include <string> |
| 8 | |
Ben Chan | a0ddf46 | 2014-02-06 11:32:42 -0800 | [diff] [blame] | 9 | #include <base/strings/stringprintf.h> |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 10 | |
Christopher Wiley | 5447d2e | 2013-03-19 17:46:03 -0700 | [diff] [blame] | 11 | #include "shill/logging.h" |
| 12 | |
| 13 | using std::string; |
Darin Petkov | f7897bc | 2011-06-08 17:13:36 -0700 | [diff] [blame] | 14 | |
| 15 | namespace shill { |
| 16 | |
Christopher Wiley | 0f3eab3 | 2013-03-21 11:55:41 -0700 | [diff] [blame] | 17 | GLib::GLib() {} |
Darin Petkov | 3258a81 | 2011-06-23 11:28:45 -0700 | [diff] [blame] | 18 | GLib::~GLib() {} |
| 19 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 20 | std::string GLib::ConvertErrorToMessage(GError* error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 21 | if (!error) { |
| 22 | return "Unknown GLib error."; |
| 23 | } |
| 24 | std::string message = |
| 25 | base::StringPrintf("GError(%d): %s", error->code, error->message); |
| 26 | g_error_free(error); |
| 27 | return message; |
| 28 | } |
| 29 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 30 | bool GLib::B64Decode(const string& input, string* output) { |
Christopher Wiley | 5447d2e | 2013-03-19 17:46:03 -0700 | [diff] [blame] | 31 | CHECK(output); |
| 32 | gsize result_len = 0; |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 33 | guchar* result = g_base64_decode(input.c_str(), &result_len); |
Christopher Wiley | 5447d2e | 2013-03-19 17:46:03 -0700 | [diff] [blame] | 34 | if (!result) { |
| 35 | LOG(ERROR) << "Failed in encoding."; |
| 36 | return false; |
| 37 | } |
| 38 | |
| 39 | if (!result_len) { |
| 40 | LOG(ERROR) << "Failed in encoding."; |
| 41 | Free(result); |
| 42 | return false; |
| 43 | } |
| 44 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 45 | output->assign(reinterpret_cast<char*>(result), result_len); |
Christopher Wiley | 5447d2e | 2013-03-19 17:46:03 -0700 | [diff] [blame] | 46 | Free(result); |
| 47 | return true; |
| 48 | } |
| 49 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 50 | bool GLib::B64Encode(const string& input, string* output) { |
Christopher Wiley | 5447d2e | 2013-03-19 17:46:03 -0700 | [diff] [blame] | 51 | CHECK(output); |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 52 | gchar* result = g_base64_encode( |
| 53 | reinterpret_cast<const unsigned char*>(input.c_str()), input.length()); |
Christopher Wiley | 5447d2e | 2013-03-19 17:46:03 -0700 | [diff] [blame] | 54 | if (!result) { |
| 55 | LOG(ERROR) << "Failed in encoding."; |
| 56 | return false; |
| 57 | } |
| 58 | |
| 59 | output->assign(result); |
| 60 | Free(result); |
| 61 | return true; |
| 62 | } |
| 63 | |
Darin Petkov | 92c4390 | 2011-06-09 20:46:06 -0700 | [diff] [blame] | 64 | guint GLib::ChildWatchAdd(GPid pid, |
| 65 | GChildWatchFunc function, |
| 66 | gpointer data) { |
| 67 | return g_child_watch_add(pid, function, data); |
| 68 | } |
| 69 | |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 70 | void GLib::Free(gpointer mem) { |
| 71 | g_free(mem); |
| 72 | } |
| 73 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 74 | void GLib::KeyFileFree(GKeyFile* key_file) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 75 | g_key_file_free(key_file); |
| 76 | } |
| 77 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 78 | gboolean GLib::KeyFileLoadFromFile(GKeyFile* key_file, |
| 79 | const gchar* file, |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 80 | GKeyFileFlags flags, |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 81 | GError** error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 82 | return g_key_file_load_from_file(key_file, file, flags, error); |
| 83 | } |
| 84 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 85 | gboolean GLib::KeyFileGetBoolean(GKeyFile* key_file, |
| 86 | const gchar* group_name, |
| 87 | const gchar* key, |
| 88 | GError** error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 89 | return g_key_file_get_boolean(key_file, group_name, key, error); |
| 90 | } |
| 91 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 92 | gchar** GLib::KeyFileGetGroups(GKeyFile* key_file, |
| 93 | gsize* length) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 94 | return g_key_file_get_groups(key_file, length); |
| 95 | } |
| 96 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 97 | gint GLib::KeyFileGetInteger(GKeyFile* key_file, |
| 98 | const gchar* group_name, |
| 99 | const gchar* key, |
| 100 | GError** error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 101 | return g_key_file_get_integer(key_file, group_name, key, error); |
| 102 | } |
| 103 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 104 | gchar* GLib::KeyFileGetString(GKeyFile* key_file, |
| 105 | const gchar* group_name, |
| 106 | const gchar* key, |
| 107 | GError** error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 108 | return g_key_file_get_string(key_file, group_name, key, error); |
| 109 | } |
| 110 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 111 | gchar** GLib::KeyFileGetStringList(GKeyFile* key_file, |
| 112 | const gchar* group_name, |
| 113 | const gchar* key, |
| 114 | gsize* length, |
| 115 | GError** error) { |
Darin Petkov | b2841fd | 2011-06-30 12:54:12 -0700 | [diff] [blame] | 116 | return g_key_file_get_string_list(key_file, group_name, key, length, error); |
| 117 | } |
| 118 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 119 | gboolean GLib::KeyFileHasGroup(GKeyFile* key_file, |
| 120 | const gchar* group_name) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 121 | return g_key_file_has_group(key_file, group_name); |
| 122 | } |
| 123 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 124 | gboolean GLib::KeyFileHasKey(GKeyFile* key_file, |
| 125 | const gchar* group_name, |
| 126 | const gchar* key, |
| 127 | GError** error) { |
Paul Stewart | a41e38d | 2011-11-11 07:47:29 -0800 | [diff] [blame] | 128 | return g_key_file_has_key(key_file, group_name, key, error); |
| 129 | } |
| 130 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 131 | GKeyFile* GLib::KeyFileNew() { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 132 | return g_key_file_new(); |
| 133 | } |
| 134 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 135 | void GLib::KeyFileRemoveGroup(GKeyFile* key_file, |
| 136 | const gchar* group_name, |
| 137 | GError** error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 138 | g_key_file_remove_group(key_file, group_name, error); |
| 139 | } |
| 140 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 141 | void GLib::KeyFileRemoveKey(GKeyFile* key_file, |
| 142 | const gchar* group_name, |
| 143 | const gchar* key, |
| 144 | GError** error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 145 | g_key_file_remove_key(key_file, group_name, key, error); |
| 146 | } |
| 147 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 148 | void GLib::KeyFileSetBoolean(GKeyFile* key_file, |
| 149 | const gchar* group_name, |
| 150 | const gchar* key, |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 151 | gboolean value) { |
| 152 | g_key_file_set_boolean(key_file, group_name, key, value); |
| 153 | } |
| 154 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 155 | gboolean GLib::KeyFileSetComment(GKeyFile* key_file, |
| 156 | const gchar* group_name, |
| 157 | const gchar* key, |
| 158 | const gchar* comment, |
| 159 | GError** error) { |
Paul Stewart | 5dc40aa | 2011-10-28 19:43:43 -0700 | [diff] [blame] | 160 | return g_key_file_set_comment(key_file, group_name, key, comment, error); |
| 161 | } |
| 162 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 163 | void GLib::KeyFileSetInteger(GKeyFile* key_file, |
| 164 | const gchar* group_name, |
| 165 | const gchar* key, |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 166 | gint value) { |
| 167 | g_key_file_set_integer(key_file, group_name, key, value); |
| 168 | } |
| 169 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 170 | void GLib::KeyFileSetString(GKeyFile* key_file, |
| 171 | const gchar* group_name, |
| 172 | const gchar* key, |
| 173 | const gchar* value) { |
Hristo Stefanov | ed2c28c | 2011-11-29 15:37:30 -0800 | [diff] [blame] | 174 | g_key_file_set_string(key_file, group_name, key, value); |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 175 | } |
| 176 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 177 | void GLib::KeyFileSetStringList(GKeyFile* key_file, |
| 178 | const gchar* group_name, |
| 179 | const gchar* key, |
| 180 | const gchar* const list[], |
Darin Petkov | b2841fd | 2011-06-30 12:54:12 -0700 | [diff] [blame] | 181 | gsize length) { |
| 182 | g_key_file_set_string_list(key_file, group_name, key, list, length); |
| 183 | } |
| 184 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 185 | gchar* GLib::KeyFileToData(GKeyFile* key_file, |
| 186 | gsize* length, |
| 187 | GError** error) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 188 | return g_key_file_to_data(key_file, length, error); |
| 189 | } |
| 190 | |
Darin Petkov | 92c4390 | 2011-06-09 20:46:06 -0700 | [diff] [blame] | 191 | gboolean GLib::SourceRemove(guint tag) { |
| 192 | return g_source_remove(tag); |
| 193 | } |
| 194 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 195 | gboolean GLib::SpawnAsync(const gchar* working_directory, |
| 196 | gchar** argv, |
| 197 | gchar** envp, |
Darin Petkov | f7897bc | 2011-06-08 17:13:36 -0700 | [diff] [blame] | 198 | GSpawnFlags flags, |
| 199 | GSpawnChildSetupFunc child_setup, |
| 200 | gpointer user_data, |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 201 | GPid* child_pid, |
| 202 | GError** error) { |
Darin Petkov | f7897bc | 2011-06-08 17:13:36 -0700 | [diff] [blame] | 203 | return g_spawn_async(working_directory, |
| 204 | argv, |
| 205 | envp, |
| 206 | flags, |
| 207 | child_setup, |
| 208 | user_data, |
| 209 | child_pid, |
| 210 | error); |
| 211 | } |
| 212 | |
Darin Petkov | 92c4390 | 2011-06-09 20:46:06 -0700 | [diff] [blame] | 213 | void GLib::SpawnClosePID(GPid pid) { |
| 214 | g_spawn_close_pid(pid); |
| 215 | } |
| 216 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 217 | gboolean GLib::SpawnSync(const gchar* working_directory, |
| 218 | gchar** argv, |
| 219 | gchar** envp, |
Darin Petkov | 3c5e4dc | 2012-04-02 14:44:27 +0200 | [diff] [blame] | 220 | GSpawnFlags flags, |
| 221 | GSpawnChildSetupFunc child_setup, |
| 222 | gpointer user_data, |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 223 | gchar** standard_output, |
| 224 | gchar** standard_error, |
| 225 | gint* exit_status, |
| 226 | GError** error) { |
Darin Petkov | 3c5e4dc | 2012-04-02 14:44:27 +0200 | [diff] [blame] | 227 | return g_spawn_sync(working_directory, |
| 228 | argv, |
| 229 | envp, |
| 230 | flags, |
| 231 | child_setup, |
| 232 | user_data, |
| 233 | standard_output, |
| 234 | standard_error, |
| 235 | exit_status, |
| 236 | error); |
| 237 | } |
| 238 | |
Paul Stewart | 8ae1874 | 2015-06-16 13:13:10 -0700 | [diff] [blame] | 239 | void GLib::Strfreev(gchar** str_array) { |
Darin Petkov | 083047b | 2011-06-23 20:42:48 -0700 | [diff] [blame] | 240 | g_strfreev(str_array); |
| 241 | } |
| 242 | |
Darin Petkov | 887f298 | 2011-07-14 16:10:17 -0700 | [diff] [blame] | 243 | void GLib::TypeInit() { |
| 244 | g_type_init(); |
| 245 | } |
| 246 | |
Darin Petkov | f7897bc | 2011-06-08 17:13:36 -0700 | [diff] [blame] | 247 | } // namespace shill |