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 UInt64 : IDBusType 00013 { 00014 public const char Code = 't'; 00015 private System.UInt64 val; 00016 00017 private UInt64() 00018 { 00019 } 00020 00021 public UInt64(System.UInt64 val, Service service) 00022 { 00023 this.val = val; 00024 } 00025 00026 public UInt64(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 UINT64 argument:" + val); 00035 } 00036 00037 public static bool Suits(System.Type type) 00038 { 00039 if (type.IsEnum && Enum.GetUnderlyingType (type) == typeof(System.UInt64)) { 00040 return true; 00041 } 00042 00043 switch (type.ToString()) { 00044 case "System.UInt64": 00045 case "System.UInt64&": 00046 return true; 00047 } 00048 00049 return false; 00050 } 00051 00052 public static void EmitMarshalIn(ILGenerator generator, Type type) 00053 { 00054 if (type.IsByRef) { 00055 generator.Emit(OpCodes.Ldind_I8); 00056 } 00057 } 00058 00059 public static void EmitMarshalOut(ILGenerator generator, Type type, bool isReturn) 00060 { 00061 generator.Emit(OpCodes.Unbox, type); 00062 generator.Emit(OpCodes.Ldind_I8); 00063 if (!isReturn) { 00064 generator.Emit(OpCodes.Stind_I8); 00065 } 00066 } 00067 00068 public object Get() 00069 { 00070 return this.val; 00071 } 00072 00073 public object Get(System.Type type) 00074 { 00075 if (type.IsEnum) { 00076 return Enum.ToObject(type, this.val); 00077 } 00078 00079 switch (type.ToString()) 00080 { 00081 case "System.UInt64": 00082 case "System.UInt64&": 00083 return this.val; 00084 default: 00085 throw new ArgumentException("Cannot cast DBus.Type.UInt64 to type '" + type.ToString() + "'"); 00086 } 00087 } 00088 00089 [DllImport("dbus-1")] 00090 private extern static void dbus_message_iter_get_basic (IntPtr iter, out System.UInt64 value); 00091 00092 [DllImport("dbus-1")] 00093 private extern static bool dbus_message_iter_append_basic (IntPtr iter, int type, ref System.UInt64 value); 00094 } 00095 }