Skip to content

Commit 4538187

Browse files
committed
Fixed the marshalling of enums in signals.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 2df4fc1 commit 4538187

File tree

1 file changed

+56
-25
lines changed

1 file changed

+56
-25
lines changed

QtSharp/QObject.cs

+56-25
Original file line numberDiff line numberDiff line change
@@ -54,34 +54,65 @@ protected int HandleQtMetacall(int index, QMetaObject.Call call, void** argument
5454
{
5555
System.Reflection.ParameterInfo parameter = @params[i];
5656
var arg = new IntPtr(arguments[1 + i]);
57-
object value;
58-
if (parameter.ParameterType.IsValueType)
59-
{
60-
value = Marshal.PtrToStructure(arg, parameter.ParameterType);
61-
}
62-
else
63-
{
64-
if (parameter.ParameterType.IsAssignableFrom(typeof(string)))
65-
{
66-
var metaMethod = this.Sender.MetaObject.Method(handler.SignalId);
67-
if (metaMethod.ParameterType(i) == (int) QMetaType.Type.QString)
68-
{
69-
value = Marshal.PtrToStringUni(new IntPtr(QtCore.QString.__CreateInstance(arg).Utf16));
70-
}
71-
else
72-
{
73-
value = Marshal.PtrToStringUni(arg);
74-
}
75-
}
76-
else
77-
{
78-
value = Activator.CreateInstance(parameter.ParameterType, arg);
79-
}
80-
}
81-
parameters[i] = value;
57+
parameters[i] = GetParameterValue(handler, i, parameter, arg);
8258
}
8359
handler.Delegate.DynamicInvoke(parameters);
8460
return -1;
8561
}
62+
63+
private object GetParameterValue(Handler handler, int i, System.Reflection.ParameterInfo parameter, IntPtr arg)
64+
{
65+
if (arg == IntPtr.Zero)
66+
{
67+
return null;
68+
}
69+
var type = parameter.ParameterType.IsEnum ? parameter.ParameterType.GetEnumUnderlyingType() : parameter.ParameterType;
70+
switch (Type.GetTypeCode(type))
71+
{
72+
case TypeCode.Empty:
73+
return null;
74+
case TypeCode.Object:
75+
return Activator.CreateInstance(type, arg);
76+
case TypeCode.DBNull:
77+
return DBNull.Value;
78+
case TypeCode.Boolean:
79+
return *(bool*) arg;
80+
case TypeCode.Char:
81+
return *(char*) arg;
82+
case TypeCode.SByte:
83+
return *(sbyte*) arg;
84+
case TypeCode.Byte:
85+
return *(byte*) arg;
86+
case TypeCode.Int16:
87+
return *(short*) arg;
88+
case TypeCode.UInt16:
89+
return *(ushort*) arg;
90+
case TypeCode.Int32:
91+
return *(int*) arg;
92+
case TypeCode.UInt32:
93+
return *(uint*) arg;
94+
case TypeCode.Int64:
95+
return *(long*) arg;
96+
case TypeCode.UInt64:
97+
return *(ulong*) arg;
98+
case TypeCode.Single:
99+
return *(float*) arg;
100+
case TypeCode.Double:
101+
return *(double*) arg;
102+
case TypeCode.Decimal:
103+
return *(decimal*) arg;
104+
case TypeCode.DateTime:
105+
return *(DateTime*) arg;
106+
case TypeCode.String:
107+
var metaMethod = this.Sender.MetaObject.Method(handler.SignalId);
108+
if (metaMethod.ParameterType(i) == (int) QMetaType.Type.QString)
109+
{
110+
return Marshal.PtrToStringUni(new IntPtr(QtCore.QString.__CreateInstance(arg).Utf16));
111+
}
112+
return Marshal.PtrToStringUni(arg);
113+
default:
114+
throw new ArgumentOutOfRangeException(parameter.Name, "Parameter type with invalid type code.");
115+
}
116+
}
86117
}
87118
}

0 commit comments

Comments
 (0)