branch update for HEAD-2003050101
[reactos.git] / lib / user32 / windows / message.c
1 /* $Id$
2  *
3  * COPYRIGHT:       See COPYING in the top level directory
4  * PROJECT:         ReactOS user32.dll
5  * FILE:            lib/user32/windows/message.c
6  * PURPOSE:         Messages
7  * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
8  * UPDATE HISTORY:
9  *      06-06-2001  CSH  Created
10  */
11 #include <windows.h>
12 #include <user32.h>
13 #include <string.h>
14 #include <debug.h>
15
16 LPARAM
17 STDCALL
18 GetMessageExtraInfo(VOID)
19 {
20   return (LPARAM)0;
21 }
22
23 DWORD
24 STDCALL
25 GetMessagePos(VOID)
26 {
27   return 0;
28 }
29
30 LONG
31 STDCALL
32 GetMessageTime(VOID)
33 {
34   return 0;
35 }
36 WINBOOL
37 STDCALL
38 InSendMessage(VOID)
39 {
40   return FALSE;
41 }
42
43 DWORD
44 STDCALL
45 InSendMessageEx(
46   LPVOID lpReserved)
47 {
48   return 0;
49 }
50 WINBOOL
51 STDCALL
52 ReplyMessage(
53   LRESULT lResult)
54 {
55   return FALSE;
56 }
57 LPARAM
58 STDCALL
59 SetMessageExtraInfo(
60   LPARAM lParam)
61 {
62   return (LPARAM)0;
63 }
64
65 VOID STATIC
66 User32FreeAsciiConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
67 {
68   switch(Msg)
69     {
70     case WM_GETTEXT:
71       {
72         ANSI_STRING AnsiString;
73         UNICODE_STRING UnicodeString;
74         LPSTR TempString;
75         LPSTR InString;
76         InString = (LPSTR)lParam;
77         TempString = RtlAllocateHeap(RtlGetProcessHeap(), 0, strlen(InString));
78         strcpy(TempString, InString);
79         RtlInitAnsiString(&AnsiString, TempString);
80         UnicodeString.Length = wParam;
81         UnicodeString.MaximumLength = wParam;
82         UnicodeString.Buffer = (PWSTR)lParam;
83         RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE);
84         RtlFreeHeap(RtlGetProcessHeap(), 0, TempString);
85         break;
86       }
87     case WM_NCCREATE:
88       {
89         CREATESTRUCTA* Cs;
90
91         Cs = (CREATESTRUCTA*)lParam;
92         RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR)Cs->lpszName);
93         RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR)Cs->lpszClass);
94         RtlFreeHeap(RtlGetProcessHeap(), 0, Cs);
95         break;
96       }
97     }
98 }
99
100 VOID STATIC
101 User32ConvertToAsciiMessage(UINT* Msg, WPARAM* wParam, LPARAM* lParam)
102 {
103   switch((*Msg))
104     {
105     case WM_NCCREATE:
106       {
107         CREATESTRUCTA* CsA;
108         CREATESTRUCTW* CsW;
109         UNICODE_STRING UString;
110         ANSI_STRING AString;
111
112         CsW = (CREATESTRUCTW*)(*lParam);
113         CsA = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(CREATESTRUCTA));
114         memcpy(CsA, CsW, sizeof(CREATESTRUCTW));
115
116         RtlInitUnicodeString(&UString, CsW->lpszName);
117         RtlUnicodeStringToAnsiString(&AString, &UString, TRUE);
118         CsA->lpszName = AString.Buffer;
119
120         RtlInitUnicodeString(&UString, CsW->lpszClass);
121         RtlUnicodeStringToAnsiString(&AString, &UString, TRUE);
122         CsA->lpszClass = AString.Buffer;
123
124         (*lParam) = (LPARAM)CsA;
125         break;
126       }
127     }
128   return;
129 }
130
131 VOID STATIC
132 User32FreeUnicodeConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
133 {
134 }
135
136 VOID STATIC
137 User32ConvertToUnicodeMessage(UINT* Msg, WPARAM* wParam, LPARAM* lParam)
138 {
139 }
140
141 LRESULT STDCALL
142 CallWindowProcA(WNDPROC lpPrevWndFunc,
143                 HWND hWnd,
144                 UINT Msg,
145                 WPARAM wParam,
146                 LPARAM lParam)
147 {
148   if (IsWindowUnicode(hWnd))
149     {
150       LRESULT Result;
151       User32ConvertToUnicodeMessage(&Msg, &wParam, &lParam);
152       Result = lpPrevWndFunc(hWnd, Msg, wParam, lParam);
153       User32FreeUnicodeConvertedMessage(Msg, wParam, lParam);
154       return(Result);
155     }
156   else
157     {
158       return(lpPrevWndFunc(hWnd, Msg, wParam, lParam));
159     }
160 }
161
162 LRESULT STDCALL
163 CallWindowProcW(WNDPROC lpPrevWndFunc,
164                 HWND hWnd,
165                 UINT Msg,
166                 WPARAM wParam,
167                 LPARAM lParam)
168 {
169   if (!IsWindowUnicode(hWnd))
170     {
171       LRESULT Result;
172       User32ConvertToAsciiMessage(&Msg, &wParam, &lParam);
173       Result = lpPrevWndFunc(hWnd, Msg, wParam, lParam);
174       User32FreeAsciiConvertedMessage(Msg, wParam, lParam);
175       return(Result);
176     }
177   else
178     {
179       return(lpPrevWndFunc(hWnd, Msg, wParam, lParam));
180     }
181 }
182
183
184 BOOL
185 MsgiAnsiToUnicodeMessage(LPMSG UnicodeMsg, LPMSG AnsiMsg)
186 {
187   *UnicodeMsg = *AnsiMsg;
188   switch (AnsiMsg->message)
189     {
190     case WM_GETTEXT:
191       {
192         UnicodeMsg->wParam = UnicodeMsg->wParam / 2;
193         break;
194       }
195     }
196   return(TRUE);
197 }
198
199 BOOL
200 MsgiAnsiToUnicodeReply(LPMSG UnicodeMsg, LPMSG AnsiMsg, LRESULT Result)
201 {
202   switch (AnsiMsg->message)
203     {
204     case WM_GETTEXT:
205       {
206         ANSI_STRING AnsiString;
207         UNICODE_STRING UnicodeString;
208         LPWSTR TempString;
209         LPWSTR InString;
210         InString = (LPWSTR)UnicodeMsg->lParam;
211         TempString = RtlAllocateHeap(RtlGetProcessHeap(), 0, 
212                                      wcslen(InString) * sizeof(WCHAR));
213         wcscpy(TempString, InString);
214         RtlInitUnicodeString(&UnicodeString, TempString);
215         AnsiString.Length = AnsiMsg->wParam;
216         AnsiString.MaximumLength = AnsiMsg->wParam;
217         AnsiString.Buffer = (PSTR)AnsiMsg->lParam;
218         RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE);
219         RtlFreeHeap(RtlGetProcessHeap(), 0, TempString);
220         break;
221       }
222     }
223   return(TRUE);
224 }
225
226
227 LRESULT STDCALL
228 DispatchMessageA(CONST MSG *lpmsg)
229 {
230   return(NtUserDispatchMessage(lpmsg));
231 }
232
233 LRESULT STDCALL
234 DispatchMessageW(CONST MSG *lpmsg)
235 {
236   return(NtUserDispatchMessage((LPMSG)lpmsg));
237 }
238
239 WINBOOL
240 STDCALL
241 GetMessageA(
242   LPMSG lpMsg,
243   HWND hWnd,
244   UINT wMsgFilterMin,
245   UINT wMsgFilterMax)
246 {
247   return NtUserGetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
248 }
249
250 WINBOOL
251 STDCALL
252 GetMessageW(
253   LPMSG lpMsg,
254   HWND hWnd,
255   UINT wMsgFilterMin,
256   UINT wMsgFilterMax)
257 {
258   return NtUserGetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
259 }
260
261 WINBOOL
262 STDCALL
263 PeekMessageA(
264   LPMSG lpMsg,
265   HWND hWnd,
266   UINT wMsgFilterMin,
267   UINT wMsgFilterMax,
268   UINT wRemoveMsg)
269 {
270   return NtUserPeekMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
271 }
272
273 WINBOOL
274 STDCALL
275 PeekMessageW(
276   LPMSG lpMsg,
277   HWND hWnd,
278   UINT wMsgFilterMin,
279   UINT wMsgFilterMax,
280   UINT wRemoveMsg)
281 {
282   return NtUserPeekMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
283 }
284
285 WINBOOL
286 STDCALL
287 PostMessageA(
288   HWND hWnd,
289   UINT Msg,
290   WPARAM wParam,
291   LPARAM lParam)
292 {
293   return NtUserPostMessage(hWnd, Msg, wParam, lParam);
294 }
295
296 WINBOOL
297 STDCALL
298 PostMessageW(
299   HWND hWnd,
300   UINT Msg,
301   WPARAM wParam,
302   LPARAM lParam)
303 {
304   return NtUserPostMessage(hWnd, Msg, wParam, lParam);
305 }
306
307 VOID
308 STDCALL
309 PostQuitMessage(
310   int nExitCode)
311 {
312   (void) NtUserPostMessage(NULL, WM_QUIT, nExitCode, 0);
313 }
314
315 WINBOOL
316 STDCALL
317 PostThreadMessageA(
318   DWORD idThread,
319   UINT Msg,
320   WPARAM wParam,
321   LPARAM lParam)
322 {
323   return NtUserPostThreadMessage(idThread, Msg, wParam, lParam);
324 }
325
326 WINBOOL
327 STDCALL
328 PostThreadMessageW(
329   DWORD idThread,
330   UINT Msg,
331   WPARAM wParam,
332   LPARAM lParam)
333 {
334   return NtUserPostThreadMessage(idThread, Msg, wParam, lParam);
335 }
336
337 LRESULT STDCALL
338 SendMessageW(HWND hWnd,
339              UINT Msg,
340              WPARAM wParam,
341              LPARAM lParam)
342 {
343   return(NtUserSendMessage(hWnd, Msg, wParam, lParam));
344 }
345
346
347 LRESULT STDCALL
348 SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
349 {
350   MSG AnsiMsg;
351   MSG UcMsg;
352   LRESULT Result;
353
354   AnsiMsg.hwnd = hWnd;
355   AnsiMsg.message = Msg;
356   AnsiMsg.wParam = wParam;
357   AnsiMsg.lParam = lParam;
358
359   if (!MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg))
360     {
361       return(FALSE);
362     }
363   Result = SendMessageW(UcMsg.hwnd, UcMsg.message, UcMsg.wParam, UcMsg.lParam);
364   if (!MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, Result))
365     {
366       return(FALSE);
367     }
368   return(Result);
369 }
370
371 WINBOOL
372 STDCALL
373 SendMessageCallbackA(
374   HWND hWnd,
375   UINT Msg,
376   WPARAM wParam,
377   LPARAM lParam,
378   SENDASYNCPROC lpCallBack,
379   ULONG_PTR dwData)
380 {
381   return NtUserSendMessageCallback(
382     hWnd,
383     Msg,
384     wParam,
385     lParam,
386     lpCallBack,
387     dwData);
388 }
389
390 WINBOOL
391 STDCALL
392 SendMessageCallbackW(
393   HWND hWnd,
394   UINT Msg,
395   WPARAM wParam,
396   LPARAM lParam,
397   SENDASYNCPROC lpCallBack,
398   ULONG_PTR dwData)
399 {
400   return NtUserSendMessageCallback(
401     hWnd,
402     Msg,
403     wParam,
404     lParam,
405     lpCallBack,
406     dwData);
407 }
408
409 LRESULT
410 STDCALL
411 SendMessageTimeoutA(
412   HWND hWnd,
413   UINT Msg,
414   WPARAM wParam,
415   LPARAM lParam,
416   UINT fuFlags,
417   UINT uTimeout,
418   PDWORD_PTR lpdwResult)
419 {
420   return (LRESULT)0;
421 }
422
423 LRESULT
424 STDCALL
425 SendMessageTimeoutW(
426   HWND hWnd,
427   UINT Msg,
428   WPARAM wParam,
429   LPARAM lParam,
430   UINT fuFlags,
431   UINT uTimeout,
432   PDWORD_PTR lpdwResult)
433 {
434   return (LRESULT)0;
435 }
436
437
438
439 WINBOOL
440 STDCALL
441 SendNotifyMessageA(
442   HWND hWnd,
443   UINT Msg,
444   WPARAM wParam,
445   LPARAM lParam)
446 {
447   return FALSE;
448 }
449
450 WINBOOL
451 STDCALL
452 SendNotifyMessageW(
453   HWND hWnd,
454   UINT Msg,
455   WPARAM wParam,
456   LPARAM lParam)
457 {
458   return FALSE;
459 }
460
461 WINBOOL STDCALL
462 TranslateMessage(CONST MSG *lpMsg)
463 {
464   return(NtUserTranslateMessage((LPMSG)lpMsg, 0));
465 }
466
467 WINBOOL
468 STDCALL
469 WaitMessage(VOID)
470 {
471   return FALSE;
472 }
473
474 UINT STDCALL
475 RegisterWindowMessageA(LPCSTR lpString)
476 {
477   UNICODE_STRING String;
478   BOOLEAN Result;
479   UINT Atom;
480
481   Result = RtlCreateUnicodeStringFromAsciiz(&String, (PCSZ)lpString);
482   if (!Result)
483     {
484       return(0);
485     }
486   Atom = RegisterWindowMessageW(String.Buffer);
487   RtlFreeUnicodeString(&String);
488   return(Atom);
489 }
490
491 UINT STDCALL
492 RegisterWindowMessageW(LPCWSTR lpString)
493 {
494   return(NtUserRegisterWindowMessage(lpString));
495 }
496
497
498 /* EOF */