1 /***********************************************************************\
2 *                                 dde.d                                 *
3 *                                                                       *
4 *                       Windows API header module                       *
5 *                                                                       *
6 *                 Translated from MinGW Windows headers                 *
7 *                           by Stewart Gordon                           *
8 *                                                                       *
9 *                       Placed into public domain                       *
10 \***********************************************************************/
11 module win32.dde;
12 pragma(lib, "user32.lib");
13 
14 private import win32.windef;
15 
16 enum : uint {
17 	WM_DDE_FIRST     = 0x03E0,
18 	WM_DDE_INITIATE  = WM_DDE_FIRST,
19 	WM_DDE_TERMINATE,
20 	WM_DDE_ADVISE,
21 	WM_DDE_UNADVISE,
22 	WM_DDE_ACK,
23 	WM_DDE_DATA,
24 	WM_DDE_REQUEST,
25 	WM_DDE_POKE,
26 	WM_DDE_EXECUTE,
27 	WM_DDE_LAST      = WM_DDE_EXECUTE
28 }
29 
30 struct DDEACK {
31 	ubyte bAppReturnCode;
32 	ubyte _bf;
33 
34 	ubyte reserved() { return cast(ubyte) (_bf & 0x3F); }
35 	bool  fBusy()    { return cast(bool)  (_bf & 0x40); }
36 	bool  fAck()     { return cast(bool)  (_bf & 0x80); }
37 
38 	ubyte reserved(ubyte r) {
39 		_bf = cast(ubyte) ((_bf & ~0x3F) | (r & 0x3F));
40 		return cast(ubyte)(r & 0x3F);
41 	}
42 
43 	bool fBusy(bool f) { _bf = cast(ubyte) ((_bf & ~0x40) | (f << 6)); return f; }
44 	bool fAck(bool f)  { _bf = cast(ubyte) ((_bf & ~0x80) | (f << 7)); return f; }
45 }
46 
47 struct DDEADVISE {
48 	ushort _bf;
49 	short  cfFormat;
50 
51 	ushort reserved()  { return cast(ushort) (_bf & 0x3FFF); }
52 	bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
53 	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
54 
55 	ushort reserved(ushort r) {
56 		_bf = cast(ushort) ((_bf & ~0x3FFF) | (r & 0x3FFF));
57 		return cast(ushort)(r & 0x3FFF);
58 	}
59 
60 	bool   fDeferUpd(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
61 	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
62 }
63 
64 struct DDEDATA {
65 	ushort _bf;
66 	short  cfFormat;
67 	byte   _Value;
68 
69 	ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
70 	bool   fResponse() { return cast(bool)   (_bf & 0x1000); }
71 	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
72 	bool   reserved()  { return cast(bool)   (_bf & 0x4000); }
73 	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
74 
75 	byte*  Value() { return &_Value; }
76 
77 	ushort unused(ushort r) {
78 		_bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
79 		return cast(ushort)(r & 0x0FFF);
80 	}
81 
82 	bool   fResponse(bool f) { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
83 	bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
84 	bool   reserved(bool f)  { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
85 	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
86 }
87 
88 struct DDEPOKE {
89 	ushort _bf;
90 	short  cfFormat;
91 	byte   _Value;
92 
93 	ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
94 	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
95 	ubyte  fReserved() { return cast(ubyte)  ((_bf & 0xC000) >>> 14); }
96 
97 	byte*  Value() { return &_Value; }
98 
99 	ushort unused(ushort u) {
100 		_bf = cast(ushort) ((_bf & ~0x1FFF) | (u & 0x1FFF));
101 		return cast(ushort)(u & 0x1FFF);
102 	}
103 
104 	bool   fRelease(bool f)   { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
105 	ubyte  fReserved(ubyte r) { _bf = cast(ushort) ((_bf & ~0xC000) | (r << 14)); return r; }
106 }
107 
108 deprecated struct DDELN {
109 	ushort _bf;
110 	short  cfFormat;
111 
112 	ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
113 	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
114 	bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
115 	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
116 
117 	ushort unused(ushort u) {
118 		_bf = cast(ushort)((_bf & ~0x1FFF) | (u & 0x1FFF));
119 		return cast(ushort)(u & 0x1FFF);
120 	}
121 
122 	bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
123 	bool   fDeferUpd(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
124 	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
125 }
126 
127 deprecated struct DDEUP {
128 	ushort _bf;
129 	short  cfFormat;
130 	byte   _rgb;
131 
132 	ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
133 	bool   fAck()      { return cast(bool)   (_bf & 0x1000); }
134 	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
135 	bool   fReserved() { return cast(bool)   (_bf & 0x4000); }
136 	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
137 
138 	byte*  rgb() { return &_rgb; }
139 
140 	ushort unused(ushort r) {
141 		_bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
142 		return cast(ushort)(r & 0x0FFF);
143 	}
144 
145 	bool   fAck(bool f)      { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
146 	bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
147 	bool   fReserved(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
148 	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
149 }
150 
151 extern (Windows) {
152 	BOOL DdeSetQualityOfService(HWND, CPtr!(SECURITY_QUALITY_OF_SERVICE),
153 	  PSECURITY_QUALITY_OF_SERVICE);
154 	BOOL ImpersonateDdeClientWindow(HWND, HWND);
155 	LPARAM PackDDElParam(UINT, UINT_PTR, UINT_PTR);
156 	BOOL UnpackDDElParam(UINT, LPARAM, PUINT_PTR, PUINT_PTR);
157 	BOOL FreeDDElParam(UINT, LPARAM);
158 	LPARAM ReuseDDElParam(LPARAM, UINT, UINT, UINT_PTR, UINT_PTR);
159 }
160 
161 debug (WindowsUnitTest) {
162 	unittest {
163 		DDEACK ddeack;
164 
165 		with (ddeack) {
166 			reserved = 10;
167 			assert (_bf == 0x0A);
168 			fBusy = true;
169 			assert (_bf == 0x4A);
170 			fAck = true;
171 			assert (_bf == 0xCA);
172 
173 			assert (reserved == 10);
174 			assert (fBusy == true);
175 			assert (fAck == true);
176 
177 			reserved = 43;
178 			assert (_bf == 0xEB);
179 			fBusy = false;
180 			assert (_bf == 0xAB);
181 			fAck = false;
182 			assert (_bf == 0x2B);
183 
184 			assert (reserved == 43);
185 			assert (fBusy == false);
186 			assert (fAck == false);
187 		}
188 
189 		DDEPOKE ddepoke;
190 
191 		with (ddepoke) {
192 			unused = 3456;
193 			assert (_bf == 0x0D80);
194 			fRelease = true;
195 			assert (_bf == 0x2D80);
196 			fReserved = 2;
197 			assert (_bf == 0xAD80);
198 
199 			assert (unused == 3456);
200 			assert (fRelease == true);
201 			assert (fReserved == 2);
202 
203 			unused = 2109;
204 			assert (_bf == 0xa83d);
205 			fRelease = false;
206 			assert (_bf == 0x883d);
207 			fReserved = 1;
208 			assert (_bf == 0x483d);
209 
210 			assert (unused == 2109);
211 			assert (fRelease == false);
212 			assert (fReserved == 1);
213 		}
214 	}
215 }