1 module dqml.qmetaobject;
2 
3 import dqml.dothersideinterface;
4 import dqml.qmetatype;
5 import std.string;
6 
7 public struct SignalDefinition
8 {
9     this(string name, QMetaType[] types)
10     {
11         this.name = name;
12         this.parametersTypes = types;
13     }
14 
15     string name;
16     QMetaType[] parametersTypes;
17 }
18 
19 public struct SlotDefinition
20 {
21     this(string name, QMetaType returnType, QMetaType[] parametersTypes)
22     {
23         this.name = name;
24         this.returnType = returnType;
25         this.parametersTypes = parametersTypes;
26     }
27 
28     string name;
29     QMetaType returnType;
30     QMetaType[] parametersTypes;
31 }
32 
33 public struct PropertyDefinition
34 {
35     this(string name, QMetaType type, string readSlot, string writeSlot, string notifySignal)
36     {
37         this.name = name;
38         this.type = type;
39         this.readSlot = readSlot;
40         this.writeSlot = writeSlot;
41         this.notifySignal = notifySignal;
42     }
43 
44     string name;
45     QMetaType type;
46     string readSlot;
47     string writeSlot;
48     string notifySignal;
49 }
50 
51 public class QMetaObject
52 {
53     public this(void* vptr)
54     {
55         this.vptr = vptr;
56     }
57 
58     public this(QMetaObject superClass,
59                 string className,
60                 SignalDefinition[] signalDefinitions,
61                 SlotDefinition[] slotDefinitions,
62                 PropertyDefinition[] propertyDefinitions)
63     {
64         this.signalDefinitions = signalDefinitions;
65         this.slotDefinitions = slotDefinitions;
66         this.propertyDefinitions = propertyDefinitions;
67 
68         auto dosSignalDefinitionsArray = convert(signalDefinitions);
69         DosSignalDefinitions dosSignalDefinitions;
70         dosSignalDefinitions.count = cast(int) dosSignalDefinitionsArray.length;
71         dosSignalDefinitions.definitions = dosSignalDefinitionsArray.ptr;
72 
73         auto dosSlotDefinitionsArray = convert(slotDefinitions);
74         DosSlotDefinitions dosSlotDefinitions;
75         dosSlotDefinitions.count = cast(int) dosSlotDefinitionsArray.length;
76         dosSlotDefinitions.definitions = dosSlotDefinitionsArray.ptr;
77 
78         auto propertyDefinitionsArray = convert(propertyDefinitions);
79         DosPropertyDefinitions dosPropertyDefinitions;
80         dosPropertyDefinitions.count = cast(int) propertyDefinitionsArray.length;
81         dosPropertyDefinitions.definitions = propertyDefinitionsArray.ptr;
82 
83         this.vptr = dos_qmetaobject_create(superClass.vptr,
84                                            className.toStringz(),
85                                            dosSignalDefinitions,
86                                            dosSlotDefinitions,
87                                            dosPropertyDefinitions);
88     }
89 
90     public ~this()
91     {
92         dos_qmetaobject_delete(this.vptr);
93     }
94 
95     @property SignalDefinition[] signals() { return signalDefinitions; }
96     @property SlotDefinition[] slots() { return slotDefinitions; }
97     @property PropertyDefinition[] properties() { return propertyDefinitions; }
98 
99     private DosSignalDefinition[] convert(SignalDefinition[] definitions)
100     {
101         DosSignalDefinition[] result;
102         foreach (SignalDefinition definition; definitions) {
103             DosSignalDefinition dosDefinition;
104             dosDefinition.name = definition.name.toStringz();
105             dosDefinition.parametersCount = cast(int)definition.parametersTypes.length;
106             dosDefinition.parametersTypes = cast(int*)definition.parametersTypes.ptr;
107             result ~= dosDefinition;
108         }
109         return result;
110     }
111 
112     private DosSlotDefinition[] convert(SlotDefinition[] definitions)
113     {
114         DosSlotDefinition[] result;
115         foreach (SlotDefinition definition; definitions) {
116             DosSlotDefinition dosDefinition;
117             dosDefinition.name = definition.name.toStringz();
118             dosDefinition.returnType = definition.returnType;
119             dosDefinition.parametersCount = cast(int)definition.parametersTypes.length;
120             dosDefinition.parametersTypes = cast(int*)definition.parametersTypes.ptr;
121             result ~= dosDefinition;
122         }
123         return result;
124     }
125 
126     private DosPropertyDefinition[] convert(PropertyDefinition[] definitions)
127     {
128         DosPropertyDefinition[] result;
129         foreach (PropertyDefinition definition; definitions) {
130             DosPropertyDefinition dosDefinition;
131             dosDefinition.name = definition.name.toStringz();
132             dosDefinition.type = definition.type;
133             dosDefinition.readSlot = definition.readSlot.toStringz();
134             dosDefinition.writeSlot = definition.writeSlot.toStringz();
135             dosDefinition.notifySignal = definition.notifySignal.toStringz();
136             result ~= dosDefinition;
137         }
138         return result;
139     }
140 
141     public void* voidPointer()
142     {
143         return this.vptr;
144     }
145 
146     private void* vptr;
147     private PropertyDefinition[] propertyDefinitions;
148     private SignalDefinition[] signalDefinitions;
149     private SlotDefinition[] slotDefinitions;
150 }