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