1 // Copyright (c) 2011 Novell, Inc. 2 // 3 // This program is free software; you can redistribute it and/or 4 // modify it under the terms of version 2 of the Lesser GNU General 5 // Public License as published by the Free Software Foundation. 6 // 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 10 // Lesser General Public License for more details. 11 // 12 // You should have received a copy of the GNU Lesser General Public 13 // License along with this program; if not, write to the 14 // Free Software Foundation, Inc., 59 Temple Place - Suite 330, 15 // Boston, MA 02111-1307, USA. 16 17 using System; 18 using System.Runtime.InteropServices; 19 20 namespace GLib { 21 22 public class Variant : IDisposable { 23 24 IntPtr handle; 25 public IntPtr Handle { 26 get { return handle; } 27 } 28 29 // Docs say that GVariant is threadsafe. ~Variant()30 ~Variant () 31 { 32 Dispose (false); 33 } 34 Dispose()35 public void Dispose () 36 { 37 Dispose (true); 38 } 39 40 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_unref(IntPtr handle)41 static extern void g_variant_unref (IntPtr handle); 42 Dispose(bool disposing)43 void Dispose (bool disposing) 44 { 45 if (handle == IntPtr.Zero) 46 return; 47 48 g_variant_unref (handle); 49 handle = IntPtr.Zero; 50 if (disposing) 51 GC.SuppressFinalize (this); 52 } 53 54 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_ref_sink(IntPtr handle)55 static extern IntPtr g_variant_ref_sink (IntPtr handle); 56 Variant(IntPtr handle)57 public Variant (IntPtr handle) 58 { 59 this.handle = g_variant_ref_sink (handle); 60 } 61 62 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_boolean(bool val)63 static extern IntPtr g_variant_new_boolean (bool val); 64 Variant(bool val)65 public Variant (bool val) : this (g_variant_new_boolean (val)) {} 66 67 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_byte(byte val)68 static extern IntPtr g_variant_new_byte (byte val); 69 Variant(byte val)70 public Variant (byte val) : this (g_variant_new_byte (val)) {} 71 72 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_int16(short val)73 static extern IntPtr g_variant_new_int16 (short val); 74 Variant(short val)75 public Variant (short val) : this (g_variant_new_int16 (val)) {} 76 77 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_uint16(ushort val)78 static extern IntPtr g_variant_new_uint16 (ushort val); 79 Variant(ushort val)80 public Variant (ushort val) : this (g_variant_new_uint16 (val)) {} 81 82 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_int32(int val)83 static extern IntPtr g_variant_new_int32 (int val); 84 Variant(int val)85 public Variant (int val) : this (g_variant_new_int32 (val)) {} 86 87 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_uint32(uint val)88 static extern IntPtr g_variant_new_uint32 (uint val); 89 Variant(uint val)90 public Variant (uint val) : this (g_variant_new_uint32 (val)) {} 91 92 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_int64(long val)93 static extern IntPtr g_variant_new_int64 (long val); 94 Variant(long val)95 public Variant (long val) : this (g_variant_new_int64 (val)) {} 96 97 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_uint64(ulong val)98 static extern IntPtr g_variant_new_uint64 (ulong val); 99 Variant(ulong val)100 public Variant (ulong val) : this (g_variant_new_uint64 (val)) {} 101 102 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_double(double val)103 static extern IntPtr g_variant_new_double (double val); 104 Variant(double val)105 public Variant (double val) : this (g_variant_new_double (val)) {} 106 107 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_new_string(IntPtr val)108 static extern IntPtr g_variant_new_string (IntPtr val); 109 Variant(string val)110 public Variant (string val) 111 { 112 IntPtr native_val = Marshaller.StringToPtrGStrdup (val); 113 handle = g_variant_ref_sink (g_variant_new_string (native_val)); 114 Marshaller.Free (native_val); 115 } 116 117 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_boolean(IntPtr handle)118 static extern bool g_variant_get_boolean (IntPtr handle); 119 operator bool(Variant val)120 public static explicit operator bool (Variant val) 121 { 122 return g_variant_get_boolean (val.Handle); 123 } 124 125 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_byte(IntPtr handle)126 static extern byte g_variant_get_byte (IntPtr handle); 127 operator byte(Variant val)128 public static explicit operator byte (Variant val) 129 { 130 return g_variant_get_byte (val.Handle); 131 } 132 133 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_int16(IntPtr handle)134 static extern short g_variant_get_int16 (IntPtr handle); 135 operator short(Variant val)136 public static explicit operator short (Variant val) 137 { 138 return g_variant_get_int16 (val.Handle); 139 } 140 141 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_uint16(IntPtr handle)142 static extern ushort g_variant_get_uint16 (IntPtr handle); 143 operator ushort(Variant val)144 public static explicit operator ushort (Variant val) 145 { 146 return g_variant_get_uint16 (val.Handle); 147 } 148 149 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_int32(IntPtr handle)150 static extern int g_variant_get_int32 (IntPtr handle); 151 operator int(Variant val)152 public static explicit operator int (Variant val) 153 { 154 return g_variant_get_int32 (val.Handle); 155 } 156 157 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_uint32(IntPtr handle)158 static extern uint g_variant_get_uint32 (IntPtr handle); 159 operator uint(Variant val)160 public static explicit operator uint (Variant val) 161 { 162 return g_variant_get_uint32 (val.Handle); 163 } 164 165 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_int64(IntPtr handle)166 static extern long g_variant_get_int64 (IntPtr handle); 167 operator long(Variant val)168 public static explicit operator long (Variant val) 169 { 170 return g_variant_get_int64 (val.Handle); 171 } 172 173 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_uint64(IntPtr handle)174 static extern ulong g_variant_get_uint64 (IntPtr handle); 175 operator ulong(Variant val)176 public static explicit operator ulong (Variant val) 177 { 178 return g_variant_get_uint64 (val.Handle); 179 } 180 181 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_double(IntPtr handle)182 static extern double g_variant_get_double (IntPtr handle); 183 operator double(Variant val)184 public static explicit operator double (Variant val) 185 { 186 return g_variant_get_double (val.Handle); 187 } 188 189 [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] g_variant_get_string(IntPtr handle)190 static extern IntPtr g_variant_get_string (IntPtr handle); 191 operator string(Variant val)192 public static explicit operator string (Variant val) 193 { 194 IntPtr str = g_variant_get_string (val.Handle); 195 return str == IntPtr.Zero ? null : GLib.Marshaller.Utf8PtrToString (str); 196 } 197 } 198 } 199