00001 using System; 00002 using System.Runtime.InteropServices; 00003 using System.Reflection.Emit; 00004 00005 using DBus; 00006 00007 namespace DBus.DBusType 00008 { 00012 public class Int32 : IDBusType 00013 { 00014 public const char Code = 'i'; 00015 private System.Int32 val; 00016 00017 private Int32() 00018 { 00019 } 00020 00021 public Int32(System.Int32 val, Service service) 00022 { 00023 this.val = val; 00024 } 00025 00026 public Int32(IntPtr iter, Service service) 00027 { 00028 dbus_message_iter_get_basic (iter, out this.val); 00029 } 00030 00031 public void Append(IntPtr iter) 00032 { 00033 if (!dbus_message_iter_append_basic (iter, (int) Code, ref val)) 00034 throw new ApplicationException("Failed to append INT32 argument:" + val); 00035 } 00036 00037 public static bool Suits(System.Type type) 00038 { 00039 if (type.IsEnum && Enum.GetUnderlyingType (type) == typeof(System.Int32)) { 00040 return true; 00041 } 00042 00043 switch (type.ToString()) { 00044 case "System.Int32": 00045 case "System.Int32&": 00046 return true; } 00047 00048 return false; 00049 } 00050 00051 public static void EmitMarshalIn(ILGenerator generator, Type type) 00052 { 00053 if (type.IsByRef) { 00054 generator.Emit(OpCodes.Ldind_I4); 00055 } 00056 } 00057 00058 public static void EmitMarshalOut(ILGenerator generator, Type type, bool isReturn) 00059 { 00060 generator.Emit(OpCodes.Unbox, type); 00061 generator.Emit(OpCodes.Ldind_I4); 00062 if (!isReturn) { 00063 generator.Emit(OpCodes.Stind_I4); 00064 } 00065 } 00066 00067 public object Get() 00068 { 00069 return this.val; 00070 } 00071 00072 public object Get(System.Type type) 00073 { 00074 if (type.IsEnum) { 00075 return Enum.ToObject(type, this.val); 00076 } 00077 00078 switch (type.ToString()) { 00079 case "System.Int32": 00080 case "System.Int32&": 00081 return this.val; 00082 default: 00083 throw new ArgumentException("Cannot cast DBus.Type.Int32 to type '" + type.ToString() + "'"); 00084 } 00085 } 00086 00087 [DllImport("dbus-1")] 00088 private extern static void dbus_message_iter_get_basic (IntPtr iter, out System.Int32 value); 00089 00090 [DllImport("dbus-1")] 00091 private extern static bool dbus_message_iter_append_basic (IntPtr iter, int type, ref System.Int32 value); 00092 } 00093 }