1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Stewart Gordon
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC core/sys/windows/_dde.d)
9  */
10 module core.sys.windows.dde;
11 version (Windows):
12 pragma(lib, "user32");
13 
14 import core.sys.windows.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     @property ubyte reserved() { return cast(ubyte) (_bf & 0x3F); }
35     @property bool  fBusy()    { return cast(bool)  (_bf & 0x40); }
36     @property bool  fAck()     { return cast(bool)  (_bf & 0x80); }
37 
38     @property ubyte reserved(ubyte r) {
39         _bf = cast(ubyte) ((_bf & ~0x3F) | (r & 0x3F));
40         return cast(ubyte)(r & 0x3F);
41     }
42 
43     @property bool fBusy(bool f) { _bf = cast(ubyte) ((_bf & ~0x40) | (f << 6)); return f; }
44     @property 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     @property ushort reserved()  { return cast(ushort) (_bf & 0x3FFF); }
52     @property bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
53     @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
54 
55     @property ushort reserved(ushort r) {
56         _bf = cast(ushort) ((_bf & ~0x3FFF) | (r & 0x3FFF));
57         return cast(ushort)(r & 0x3FFF);
58     }
59 
60     @property bool   fDeferUpd(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
61     @property 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     @property ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
70     @property bool   fResponse() { return cast(bool)   (_bf & 0x1000); }
71     @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
72     @property bool   reserved()  { return cast(bool)   (_bf & 0x4000); }
73     @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
74 
75     @property byte*  Value() return { return &_Value; }
76 
77     @property ushort unused(ushort r) {
78         _bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
79         return cast(ushort)(r & 0x0FFF);
80     }
81 
82     @property bool   fResponse(bool f) { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
83     @property bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
84     @property bool   reserved(bool f)  { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
85     @property 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     @property ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
94     @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
95     @property ubyte  fReserved() { return cast(ubyte)  ((_bf & 0xC000) >>> 14); }
96 
97     @property byte*  Value() return { return &_Value; }
98 
99     @property ushort unused(ushort u) {
100         _bf = cast(ushort) ((_bf & ~0x1FFF) | (u & 0x1FFF));
101         return cast(ushort)(u & 0x1FFF);
102     }
103 
104     @property bool   fRelease(bool f)   { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
105     @property 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     @property ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
113     @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
114     @property bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
115     @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
116 
117     @property ushort unused(ushort u) {
118         _bf = cast(ushort)((_bf & ~0x1FFF) | (u & 0x1FFF));
119         return cast(ushort)(u & 0x1FFF);
120     }
121 
122     @property bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
123     @property bool   fDeferUpd(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
124     @property 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     @property ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
133     @property bool   fAck()      { return cast(bool)   (_bf & 0x1000); }
134     @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
135     @property bool   fReserved() { return cast(bool)   (_bf & 0x4000); }
136     @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
137 
138     @property byte*  rgb() return { return &_rgb; }
139 
140     @property ushort unused(ushort r) {
141         _bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
142         return cast(ushort)(r & 0x0FFF);
143     }
144 
145     @property bool   fAck(bool f)      { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
146     @property bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
147     @property bool   fReserved(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
148     @property bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
149 }
150 
151 extern (Windows) {
152     BOOL DdeSetQualityOfService(HWND, const(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 }