1 // Copyright (c) 2008-2011 Novell, Inc.
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 
22 
23 using System;
24 using System.Runtime.InteropServices;
25 
26 namespace GLib {
27 
28 	public enum KeyFileError {
29 		UnknownEncoding,
30 		Parse,
31 		NotFound,
32 		KeyNotFound,
33 		GroupNotFound,
34 		InvalidValue,
35 	}
36 
37 	[Flags]
38 	public enum KeyFileFlags {
39 		None,
40 		KeepComments = 1 << 0,
41 		KeepTranslations = 1 << 1,
42 	}
43 
44 	public class KeyFile {
45 
46 		IntPtr handle;
47 		bool owned;
48 
49 		class FinalizerInfo {
50 			IntPtr handle;
51 
FinalizerInfo(IntPtr handle)52 			public FinalizerInfo (IntPtr handle)
53 			{
54 				this.handle = handle;
55 			}
56 
Handler()57 			public bool Handler ()
58 			{
59 				g_key_file_free (handle);
60 				return false;
61 			}
62 		}
63 
~KeyFile()64 		~KeyFile ()
65 		{
66 			if (!owned)
67 				return;
68 			FinalizerInfo info = new FinalizerInfo (Handle);
69 			Timeout.Add (50, new TimeoutHandler (info.Handler));
70 		}
71 
KeyFile(IntPtr handle)72 		public KeyFile (IntPtr handle) : this (handle, false) {}
73 
KeyFile(IntPtr handle, bool owned)74 		public KeyFile (IntPtr handle, bool owned)
75 		{
76 			this.handle = handle;
77 			this.owned = owned;
78 		}
79 
KeyFile()80 		public KeyFile () : this (g_key_file_new (), true) {}
81 
KeyFile(string file)82 		public KeyFile (string file) : this (file, KeyFileFlags.KeepComments) {}
83 
KeyFile(string file, KeyFileFlags flags)84 		public KeyFile (string file, KeyFileFlags flags) : this ()
85 		{
86 			LoadFromFile (file, flags);
87 		}
88 
89 		public string[] Groups {
90 			get { return Marshaller.NullTermPtrToStringArray (g_key_file_get_groups (Handle, IntPtr.Zero), true); }
91 		}
92 
93 		public IntPtr Handle {
94 			get { return handle; }
95 		}
96 
97 		public string StartGroup {
98 			get { return Marshaller.PtrToStringGFree (g_key_file_get_start_group (Handle)); }
99 		}
100 
GetBoolean(string group_name, string key)101 		public bool GetBoolean (string group_name, string key)
102 		{
103 			IntPtr error;
104 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
105 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
106 			bool ret = g_key_file_get_boolean (Handle, native_group_name, native_key, out error);
107 			Marshaller.Free (native_group_name);
108 			Marshaller.Free (native_key);
109 			if (error != IntPtr.Zero) throw new GException (error);
110 			return ret;
111 		}
112 
GetBooleanList(string group_name, string key)113 		public bool[] GetBooleanList (string group_name, string key)
114 		{
115 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
116 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
117 			UIntPtr native_length;
118 			IntPtr error;
119 			IntPtr raw_ret = g_key_file_get_boolean_list (Handle, native_group_name, native_key, out native_length, out error);
120 			Marshaller.Free (native_group_name);
121 			Marshaller.Free (native_key);
122 			if (error != IntPtr.Zero) throw new GException (error);
123 			int length = (int) (ulong) native_length;
124 			int[] ints = new int [length];
125 			Marshal.Copy (raw_ret, ints, 0, length);
126 			Marshaller.Free (raw_ret);
127 			bool[] ret = new bool [length];
128 			for (int i = 0; i < length; i++)
129 				ret [i] = ints [i] != 0;
130 			return ret;
131 		}
132 
GetComment(string group_name, string key)133 		public string GetComment (string group_name, string key)
134 		{
135 			IntPtr error;
136 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
137 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
138 			string ret = Marshaller.PtrToStringGFree (g_key_file_get_comment (Handle, native_group_name, native_key, out error));
139 			Marshaller.Free (native_group_name);
140 			Marshaller.Free (native_key);
141 			if (error != IntPtr.Zero) throw new GException (error);
142 			return ret;
143 		}
144 
GetDouble(string group_name, string key)145 		public double GetDouble (string group_name, string key)
146 		{
147 			IntPtr error;
148 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
149 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
150 			double ret = g_key_file_get_double (Handle, native_group_name, native_key, out error);
151 			Marshaller.Free (native_group_name);
152 			Marshaller.Free (native_key);
153 			if (error != IntPtr.Zero) throw new GException (error);
154 			return ret;
155 		}
156 
GetDoubleList(string group_name, string key)157 		public double[] GetDoubleList (string group_name, string key)
158 		{
159 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
160 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
161 			UIntPtr native_length;
162 			IntPtr error;
163 			IntPtr raw_ret = g_key_file_get_double_list(Handle, native_group_name, native_key, out native_length, out error);
164 			Marshaller.Free (native_group_name);
165 			Marshaller.Free (native_key);
166 			if (error != IntPtr.Zero) throw new GException (error);
167 			int length = (int) (ulong)native_length;
168 			double[] ret = new double [length];
169 			Marshal.Copy (raw_ret, ret, 0, length);
170 			Marshaller.Free (raw_ret);
171 			return ret;
172 		}
173 
GetInteger(string group_name, string key)174 		public int GetInteger (string group_name, string key)
175 		{
176 			IntPtr error;
177 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
178 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
179 			int ret = g_key_file_get_integer (Handle, native_group_name, native_key, out error);
180 			Marshaller.Free (native_group_name);
181 			Marshaller.Free (native_key);
182 			if (error != IntPtr.Zero) throw new GException (error);
183 			return ret;
184 		}
185 
GetIntegerList(string group_name, string key)186 		public int[] GetIntegerList (string group_name, string key)
187 		{
188 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
189 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
190 			UIntPtr native_length;
191 			IntPtr error;
192 			IntPtr raw_ret = g_key_file_get_integer_list(Handle, native_group_name, native_key, out native_length, out error);
193 			Marshaller.Free (native_group_name);
194 			Marshaller.Free (native_key);
195 			if (error != IntPtr.Zero) throw new GException (error);
196 			int length = (int) (ulong) native_length;
197 			int[] ret = new int [length];
198 			Marshal.Copy (raw_ret, ret, 0, length);
199 			Marshaller.Free (raw_ret);
200 			return ret;
201 		}
202 
GetKeys(string group_name)203 		public string[] GetKeys (string group_name)
204 		{
205 			IntPtr error;
206 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
207 			string[] ret = Marshaller.NullTermPtrToStringArray (g_key_file_get_keys (Handle, native_group_name, IntPtr.Zero, out error), true);
208 			Marshaller.Free (native_group_name);
209 			if (error != IntPtr.Zero) throw new GException (error);
210 			return ret;
211 		}
212 
GetLocaleString(string group_name, string key, string locale)213 		public string GetLocaleString (string group_name, string key, string locale)
214 		{
215 			IntPtr error;
216 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
217 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
218 			IntPtr native_locale = Marshaller.StringToPtrGStrdup (locale);
219 			string ret = Marshaller.PtrToStringGFree (g_key_file_get_locale_string (Handle, native_group_name, native_key, native_locale, out error));
220 			Marshaller.Free (native_group_name);
221 			Marshaller.Free (native_key);
222 			Marshaller.Free (native_locale);
223 			if (error != IntPtr.Zero) throw new GException (error);
224 			return ret;
225 		}
226 
GetLocaleStringList(string group_name, string key, string locale)227 		public string[] GetLocaleStringList (string group_name, string key, string locale)
228 		{
229 			IntPtr error;
230 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
231 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
232 			IntPtr native_locale = Marshaller.StringToPtrGStrdup (locale);
233 			string[] ret = Marshaller.NullTermPtrToStringArray (g_key_file_get_locale_string_list (Handle, native_group_name, native_key, native_locale, IntPtr.Zero, out error), true);
234 			Marshaller.Free (native_group_name);
235 			Marshaller.Free (native_key);
236 			Marshaller.Free (native_locale);
237 			if (error != IntPtr.Zero) throw new GException (error);
238 			return ret;
239 		}
240 
GetString(string group_name, string key)241 		public string GetString (string group_name, string key)
242 		{
243 			IntPtr error;
244 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
245 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
246 			string ret = Marshaller.PtrToStringGFree (g_key_file_get_string (Handle, native_group_name, native_key, out error));
247 			Marshaller.Free (native_group_name);
248 			Marshaller.Free (native_key);
249 			if (error != IntPtr.Zero) throw new GException (error);
250 			return ret;
251 		}
252 
GetStringList(string group_name, string key)253 		public string[] GetStringList (string group_name, string key)
254 		{
255 			IntPtr error;
256 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
257 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
258 			string[] ret = Marshaller.NullTermPtrToStringArray (g_key_file_get_string_list (Handle, native_group_name, native_key, IntPtr.Zero, out error), true);
259 			Marshaller.Free (native_group_name);
260 			Marshaller.Free (native_key);
261 			if (error != IntPtr.Zero) throw new GException (error);
262 			return ret;
263 		}
264 
GetValue(string group_name, string key)265 		public string GetValue (string group_name, string key)
266 		{
267 			IntPtr error;
268 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
269 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
270 			string ret = Marshaller.PtrToStringGFree (g_key_file_get_value (Handle, native_group_name, native_key, out error));
271 			Marshaller.Free (native_group_name);
272 			Marshaller.Free (native_key);
273 			if (error != IntPtr.Zero) throw new GException (error);
274 			return ret;
275 		}
276 
HasGroup(string group_name)277 		public bool HasGroup (string group_name)
278 		{
279 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
280 			bool ret = g_key_file_has_group(Handle, native_group_name);
281 			Marshaller.Free (native_group_name);
282 			return ret;
283 		}
284 
HasKey(string group_name, string key)285 		public bool HasKey (string group_name, string key)
286 		{
287 			IntPtr error;
288 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
289 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
290 			bool ret = g_key_file_has_key (Handle, native_group_name, native_key, out error);
291 			Marshaller.Free (native_group_name);
292 			Marshaller.Free (native_key);
293 			if (error != IntPtr.Zero) throw new GException (error);
294 			return ret;
295 		}
296 
LoadFromData(byte[] data, KeyFileFlags flags)297 		public bool LoadFromData (byte[] data, KeyFileFlags flags)
298 		{
299 			if (data == null)
300 				throw new ArgumentNullException ("data");
301 			IntPtr error;
302 			bool ret = g_key_file_load_from_data (Handle, data, new UIntPtr ((ulong) data.Length), (int) flags, out error);
303 			if (error != IntPtr.Zero) throw new GException (error);
304 			return ret;
305 		}
306 
LoadFromDataDirs(string file, out string full_path, KeyFileFlags flags)307 		public bool LoadFromDataDirs (string file, out string full_path, KeyFileFlags flags)
308 		{
309 			IntPtr error;
310 			IntPtr native_full_path;
311 			IntPtr native_file = Marshaller.StringToPtrGStrdup (file);
312 			bool ret = g_key_file_load_from_data_dirs(Handle, native_file, out native_full_path, (int) flags, out error);
313 			Marshaller.Free (native_file);
314 			if (error != IntPtr.Zero) throw new GException (error);
315 			full_path = Marshaller.PtrToStringGFree (native_full_path);
316 			return ret;
317 		}
318 
LoadFromDirs(string file, string[] search_dirs, out string full_path, KeyFileFlags flags)319 		public bool LoadFromDirs (string file, string[] search_dirs, out string full_path, KeyFileFlags flags)
320 		{
321 			IntPtr error;
322 			IntPtr native_full_path;
323 			IntPtr native_file = Marshaller.StringToPtrGStrdup (file);
324 			IntPtr native_search_dirs = Marshaller.StringArrayToStrvPtr (search_dirs);
325 			bool ret = g_key_file_load_from_dirs (Handle, native_file, native_search_dirs, out native_full_path, (int) flags, out error);
326 			Marshaller.Free (native_file);
327 			Marshaller.StrFreeV (native_search_dirs);
328 			if (error != IntPtr.Zero) throw new GException (error);
329 			full_path = Marshaller.PtrToStringGFree (native_full_path);
330 			return ret;
331 		}
332 
LoadFromFile(string file, KeyFileFlags flags)333 		public bool LoadFromFile (string file, KeyFileFlags flags)
334 		{
335 			IntPtr error;
336 			IntPtr native_file = Marshaller.StringToFilenamePtr (file);
337 			bool ret = g_key_file_load_from_file (Handle, native_file, (int) flags, out error);
338 			Marshaller.Free (native_file);
339 			if (error != IntPtr.Zero) throw new GException (error);
340 			return ret;
341 		}
342 
RemoveComment(string group_name, string key)343 		public bool RemoveComment (string group_name, string key)
344 		{
345 			IntPtr error;
346 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
347 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
348 			bool ret = g_key_file_remove_comment (Handle, native_group_name, native_key, out error);
349 			Marshaller.Free (native_group_name);
350 			Marshaller.Free (native_key);
351 			if (error != IntPtr.Zero) throw new GException (error);
352 			return ret;
353 		}
354 
RemoveGroup(string group_name)355 		public bool RemoveGroup (string group_name)
356 		{
357 			IntPtr error;
358 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
359 			bool ret = g_key_file_remove_group (Handle, native_group_name, out error);
360 			Marshaller.Free (native_group_name);
361 			if (error != IntPtr.Zero) throw new GException (error);
362 			return ret;
363 		}
364 
RemoveKey(string group_name, string key)365 		public bool RemoveKey (string group_name, string key)
366 		{
367 			IntPtr error;
368 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
369 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
370 			bool ret = g_key_file_remove_key (Handle, native_group_name, native_key, out error);
371 			Marshaller.Free (native_group_name);
372 			Marshaller.Free (native_key);
373 			if (error != IntPtr.Zero) throw new GException (error);
374 			return ret;
375 		}
376 
Save(string filename)377 		public void Save (string filename)
378 		{
379 			byte [] content = ToData ();
380 			System.IO.FileStream stream = System.IO.File.Create (filename);
381 			stream.Write (content, 0, content.Length);
382 			stream.Close ();
383 		}
384 
SetBoolean(string group_name, string key, bool value)385 		public void SetBoolean (string group_name, string key, bool value)
386 		{
387 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
388 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
389 			g_key_file_set_boolean (Handle, native_group_name, native_key, value);
390 			Marshaller.Free (native_group_name);
391 			Marshaller.Free (native_key);
392 		}
393 
SetBooleanList(string group_name, string key, bool[] list)394 		public void SetBooleanList (string group_name, string key, bool[] list)
395 		{
396 			if (list == null)
397 				throw new ArgumentNullException ("list");
398 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
399 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
400 			g_key_file_set_boolean_list (Handle, native_group_name, native_key, list, new UIntPtr ((ulong) (list.Length)));
401 			Marshaller.Free (native_group_name);
402 			Marshaller.Free (native_key);
403 		}
404 
SetComment(string group_name, string key, string comment)405 		public bool SetComment (string group_name, string key, string comment)
406 		{
407 			IntPtr error;
408 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
409 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
410 			IntPtr native_comment = Marshaller.StringToPtrGStrdup (comment);
411 			bool ret = g_key_file_set_comment (Handle, native_group_name, native_key, native_comment, out error);
412 			Marshaller.Free (native_group_name);
413 			Marshaller.Free (native_key);
414 			Marshaller.Free (native_comment);
415 			if (error != IntPtr.Zero) throw new GException (error);
416 			return ret;
417 		}
418 
SetDouble(string group_name, string key, double value)419 		public void SetDouble (string group_name, string key, double value)
420 		{
421 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
422 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
423 			g_key_file_set_double (Handle, native_group_name, native_key, value);
424 			Marshaller.Free (native_group_name);
425 			Marshaller.Free (native_key);
426 		}
427 
SetDoubleList(string group_name, string key, double[] list)428 		public void SetDoubleList (string group_name, string key, double[] list)
429 		{
430 			if (list == null)
431 				throw new ArgumentNullException ("list");
432 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
433 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
434 			g_key_file_set_double_list (Handle, native_group_name, native_key, list, new UIntPtr ((ulong) (list.Length)));
435 			Marshaller.Free (native_group_name);
436 			Marshaller.Free (native_key);
437 		}
438 
SetInteger(string group_name, string key, int value)439 		public void SetInteger (string group_name, string key, int value)
440 		{
441 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
442 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
443 			g_key_file_set_integer (Handle, native_group_name, native_key, value);
444 			Marshaller.Free (native_group_name);
445 			Marshaller.Free (native_key);
446 		}
447 
SetIntegerList(string group_name, string key, int[] list)448 		public void SetIntegerList (string group_name, string key, int[] list)
449 		{
450 			if (list == null)
451 				throw new ArgumentNullException ("list");
452 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
453 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
454 			g_key_file_set_integer_list (Handle, native_group_name, native_key, list, new UIntPtr ((ulong) list.Length));
455 			Marshaller.Free (native_group_name);
456 			Marshaller.Free (native_key);
457 		}
458 
SetListSeparator(char value)459 		public void SetListSeparator (char value)
460 		{
461 			g_key_file_set_list_separator (Handle, (byte) value);
462 		}
463 
SetLocaleString(string group_name, string key, string locale, string value)464 		public void SetLocaleString (string group_name, string key, string locale, string value)
465 		{
466 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
467 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
468 			IntPtr native_locale = Marshaller.StringToPtrGStrdup (locale);
469 			IntPtr native_value = Marshaller.StringToPtrGStrdup (value);
470 			g_key_file_set_locale_string (Handle, native_group_name, native_key, native_locale, native_value);
471 			Marshaller.Free (native_group_name);
472 			Marshaller.Free (native_key);
473 			Marshaller.Free (native_locale);
474 			Marshaller.Free (native_value);
475 		}
476 
SetLocaleStringList(string group_name, string key, string locale, string[] list)477 		public void SetLocaleStringList (string group_name, string key, string locale, string[] list)
478 		{
479 			if (key == null)
480 				throw new ArgumentNullException ("key");
481 			if (locale == null)
482 				throw new ArgumentNullException ("locale");
483 			if (list == null)
484 				throw new ArgumentNullException ("list");
485 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
486 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
487 			IntPtr native_locale = Marshaller.StringToPtrGStrdup (locale);
488 			IntPtr native_list = Marshaller.StringArrayToStrvPtr (list);
489 			g_key_file_set_locale_string_list (Handle, native_group_name, native_key, native_locale, native_list, new UIntPtr ((ulong)list.Length));
490 			Marshaller.Free (native_group_name);
491 			Marshaller.Free (native_key);
492 			Marshaller.Free (native_locale);
493 			Marshaller.StrFreeV (native_list);
494 		}
495 
SetString(string group_name, string key, string value)496 		public void SetString (string group_name, string key, string value)
497 		{
498 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
499 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
500 			IntPtr native_value = Marshaller.StringToPtrGStrdup (value);
501 			g_key_file_set_string (Handle, native_group_name, native_key, native_value);
502 			Marshaller.Free (native_group_name);
503 			Marshaller.Free (native_key);
504 			Marshaller.Free (native_value);
505 		}
506 
SetStringList(string group_name, string key, string[] list)507 		public void SetStringList (string group_name, string key, string[] list)
508 		{
509 			if (list == null)
510 				throw new ArgumentNullException ("list");
511 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
512 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
513 			IntPtr native_list = Marshaller.StringArrayToStrvPtr (list);
514 			g_key_file_set_string_list (Handle, native_group_name, native_key, native_list, new UIntPtr ((ulong)list.Length));
515 			Marshaller.Free (native_group_name);
516 			Marshaller.Free (native_key);
517 			Marshaller.StrFreeV (native_list);
518 		}
519 
SetValue(string group_name, string key, string value)520 		public void SetValue (string group_name, string key, string value)
521 		{
522 			IntPtr native_group_name = Marshaller.StringToPtrGStrdup (group_name);
523 			IntPtr native_key = Marshaller.StringToPtrGStrdup (key);
524 			IntPtr native_value = Marshaller.StringToPtrGStrdup (value);
525 			g_key_file_set_value (Handle, native_group_name, native_key, native_value);
526 			Marshaller.Free (native_group_name);
527 			Marshaller.Free (native_key);
528 			Marshaller.Free (native_value);
529 		}
530 
ToData()531 		public byte[] ToData ()
532 		{
533 			UIntPtr native_length;
534 			IntPtr raw_ret = g_key_file_to_data (Handle, out native_length, IntPtr.Zero);
535 			int length = (int)native_length;
536 			byte[] ret = new byte [length];
537 			Marshal.Copy (raw_ret, ret, 0, length);
538 			Marshaller.Free (raw_ret);
539 			return ret;
540 		}
541 
542 		[DllImport (Global.GLibNativeDll)]
g_key_file_free(IntPtr raw)543 		static extern void g_key_file_free (IntPtr raw);
544 
545 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_boolean(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)546 		static extern bool g_key_file_get_boolean (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
547 
548 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_boolean_list(IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error)549 		static extern IntPtr g_key_file_get_boolean_list (IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error);
550 
551 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_comment(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)552 		static extern IntPtr g_key_file_get_comment (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
553 
554 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_double(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)555 		static extern double g_key_file_get_double (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
556 
557 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_double_list(IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error)558 		static extern IntPtr g_key_file_get_double_list (IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error);
559 
560 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_groups(IntPtr raw, IntPtr dummy)561 		static extern IntPtr g_key_file_get_groups (IntPtr raw, IntPtr dummy);
562 
563 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_integer(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)564 		static extern int g_key_file_get_integer (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
565 
566 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_integer_list(IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error)567 		static extern IntPtr g_key_file_get_integer_list (IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error);
568 
569 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_keys(IntPtr raw, IntPtr group_name, IntPtr dummy, out IntPtr error)570 		static extern IntPtr g_key_file_get_keys (IntPtr raw, IntPtr group_name, IntPtr dummy, out IntPtr error);
571 
572 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_locale_string(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, out IntPtr error)573 		static extern IntPtr g_key_file_get_locale_string (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, out IntPtr error);
574 
575 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_locale_string_list(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, IntPtr dummy, out IntPtr error)576 		static extern IntPtr g_key_file_get_locale_string_list (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, IntPtr dummy, out IntPtr error);
577 
578 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_start_group(IntPtr raw)579 		static extern IntPtr g_key_file_get_start_group (IntPtr raw);
580 
581 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_string(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)582 		static extern IntPtr g_key_file_get_string (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
583 
584 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_string_list(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr dummy, out IntPtr error)585 		static extern IntPtr g_key_file_get_string_list (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr dummy, out IntPtr error);
586 
587 		[DllImport (Global.GLibNativeDll)]
g_key_file_get_value(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)588 		static extern IntPtr g_key_file_get_value (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
589 
590 		[DllImport (Global.GLibNativeDll)]
g_key_file_has_group(IntPtr raw, IntPtr group_name)591 		static extern bool g_key_file_has_group (IntPtr raw, IntPtr group_name);
592 
593 		[DllImport (Global.GLibNativeDll)]
g_key_file_has_key(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)594 		static extern bool g_key_file_has_key (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
595 
596 		[DllImport (Global.GLibNativeDll)]
g_key_file_load_from_data(IntPtr raw, byte[] data, UIntPtr length, int flags, out IntPtr error)597 		static extern bool g_key_file_load_from_data (IntPtr raw, byte[] data, UIntPtr length, int flags, out IntPtr error);
598 
599 		[DllImport (Global.GLibNativeDll)]
g_key_file_load_from_data_dirs(IntPtr raw, IntPtr file, out IntPtr full_path, int flags, out IntPtr error)600 		static extern bool g_key_file_load_from_data_dirs (IntPtr raw, IntPtr file, out IntPtr full_path, int flags, out IntPtr error);
601 
602 		[DllImport (Global.GLibNativeDll)]
g_key_file_load_from_dirs(IntPtr raw, IntPtr file, IntPtr search_dirs, out IntPtr full_path, int flags, out IntPtr error)603 		static extern bool g_key_file_load_from_dirs (IntPtr raw, IntPtr file, IntPtr search_dirs, out IntPtr full_path, int flags, out IntPtr error);
604 
605 		[DllImport (Global.GLibNativeDll)]
g_key_file_load_from_file(IntPtr raw, IntPtr file, int flags, out IntPtr error)606 		static extern bool g_key_file_load_from_file (IntPtr raw, IntPtr file, int flags, out IntPtr error);
607 
608 		[DllImport (Global.GLibNativeDll)]
g_key_file_new()609 		static extern IntPtr g_key_file_new ();
610 
611 		[DllImport (Global.GLibNativeDll)]
g_key_file_remove_comment(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)612 		static extern bool g_key_file_remove_comment (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
613 
614 		[DllImport (Global.GLibNativeDll)]
g_key_file_remove_group(IntPtr raw, IntPtr group_name, out IntPtr error)615 		static extern bool g_key_file_remove_group (IntPtr raw, IntPtr group_name, out IntPtr error);
616 
617 		[DllImport (Global.GLibNativeDll)]
g_key_file_remove_key(IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error)618 		static extern bool g_key_file_remove_key (IntPtr raw, IntPtr group_name, IntPtr key, out IntPtr error);
619 
620 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_boolean(IntPtr raw, IntPtr group_name, IntPtr key, bool value)621 		static extern void g_key_file_set_boolean (IntPtr raw, IntPtr group_name, IntPtr key, bool value);
622 
623 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_boolean_list(IntPtr raw, IntPtr group_name, IntPtr key, bool[] list, UIntPtr n_list)624 		static extern void g_key_file_set_boolean_list (IntPtr raw, IntPtr group_name, IntPtr key, bool[] list, UIntPtr n_list);
625 
626 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_comment(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr comment, out IntPtr error)627 		static extern bool g_key_file_set_comment (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr comment, out IntPtr error);
628 
629 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_double(IntPtr raw, IntPtr group_name, IntPtr key, double value)630 		static extern void g_key_file_set_double (IntPtr raw, IntPtr group_name, IntPtr key, double value);
631 
632 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_double_list(IntPtr raw, IntPtr group_name, IntPtr key, double[] list, UIntPtr n_list)633 		static extern void g_key_file_set_double_list (IntPtr raw, IntPtr group_name, IntPtr key, double[] list, UIntPtr n_list);
634 
635 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_integer(IntPtr raw, IntPtr group_name, IntPtr key, int value)636 		static extern void g_key_file_set_integer (IntPtr raw, IntPtr group_name, IntPtr key, int value);
637 
638 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_integer_list(IntPtr raw, IntPtr group_name, IntPtr key, int[] list, UIntPtr n_list)639 		static extern void g_key_file_set_integer_list (IntPtr raw, IntPtr group_name, IntPtr key, int[] list, UIntPtr n_list);
640 
641 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_list_separator(IntPtr raw, byte separator)642 		static extern void g_key_file_set_list_separator (IntPtr raw, byte separator);
643 
644 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_locale_string(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, IntPtr value)645 		static extern void g_key_file_set_locale_string (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, IntPtr value);
646 
647 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_locale_string_list(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, IntPtr list, UIntPtr length)648 		static extern void g_key_file_set_locale_string_list (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr locale, IntPtr list, UIntPtr length);
649 
650 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_string(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr value)651 		static extern void g_key_file_set_string (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr value);
652 
653 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_string_list(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr list, UIntPtr n_list)654 		static extern void g_key_file_set_string_list (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr list, UIntPtr n_list);
655 
656 		[DllImport (Global.GLibNativeDll)]
g_key_file_set_value(IntPtr raw, IntPtr group_name, IntPtr key, IntPtr value)657 		static extern void g_key_file_set_value (IntPtr raw, IntPtr group_name, IntPtr key, IntPtr value);
658 
659 		[DllImport (Global.GLibNativeDll)]
g_key_file_to_data(IntPtr raw, out UIntPtr length, IntPtr dummy)660 		static extern IntPtr g_key_file_to_data (IntPtr raw, out UIntPtr length, IntPtr dummy);
661 
662 	}
663 }
664