Release 980927
[wine] / misc / callback.c
1 /*
2  * Function callbacks for the library
3  *
4  * Copyright 1997 Alexandre Julliard
5  */
6
7 #include <assert.h>
8 #include "debug.h"
9 #include "windows.h"
10 #include "callback.h"
11 #include "task.h"
12
13
14 /**********************************************************************
15  *           CALLBACK_CallWndProc
16  */
17 static LRESULT WINAPI CALLBACK_CallWndProc( WNDPROC16 proc, HWND16 hwnd,
18                                             UINT16 msg, WPARAM16 wParam,
19                                             LPARAM lParam )
20 {
21     return proc( hwnd, msg, wParam, lParam );
22 }
23
24
25 /**********************************************************************
26  *           CALLBACK_CallRegisterProc
27  */
28 static LONG WINAPI CALLBACK_CallRegisterProc( CONTEXT *context, INT32 offset)
29 {
30     ERR(relay, "Cannot call a register proc in Winelib\n" );
31     assert( FALSE );
32     return 0;
33 }
34
35
36 /**********************************************************************
37  *           CALLBACK_CallDriverProc
38  */
39 static LRESULT WINAPI CALLBACK_CallDriverProc( DRIVERPROC16 proc, DWORD dwId,
40                                                HDRVR16 hdrvr, UINT16 msg,
41                                                LPARAM lp1, LPARAM lp2 )
42 {
43     return proc( dwId, hdrvr, msg, lp1, lp2 );
44 }
45
46
47 /**********************************************************************
48  *           CALLBACK_CallDriverCallback
49  */
50 static LRESULT WINAPI CALLBACK_CallDriverCallback( FARPROC16 proc,
51                                                    HANDLE16 hDev, UINT16 msg,
52                                                    DWORD dwUser, LPARAM lp1,
53                                                    LPARAM lp2 )
54 {
55     return proc( hDev, msg, dwUser, lp1, lp2 );
56 }
57
58
59 /**********************************************************************
60  *           CALLBACK_CallTimeFuncProc
61  */
62 static LRESULT WINAPI CALLBACK_CallTimeFuncProc( FARPROC16 proc, WORD id,
63                                                  UINT16 msg, DWORD dwUser,
64                                                  LPARAM lp1, LPARAM lp2 )
65 {
66     return proc( id, msg, dwUser, lp1, lp2 );
67 }
68
69
70 /**********************************************************************
71  *           CALLBACK_CallWindowsExitProc
72  */
73 static INT16 WINAPI CALLBACK_CallWindowsExitProc( FARPROC16 proc, INT16 type)
74 {
75     return proc( type );
76 }
77
78
79 /**********************************************************************
80  *           CALLBACK_CallWordBreakProc
81  */
82 static INT16 WINAPI CALLBACK_CallWordBreakProc( EDITWORDBREAKPROC16 proc,
83                                                 SEGPTR text, INT16 word,
84                                                 INT16 len, INT16 action )
85 {
86     return proc( (LPSTR)text, word, len, action );
87 }
88
89
90 /**********************************************************************
91  *           CALLBACK_CallBootAppProc
92  */
93 static void WINAPI CALLBACK_CallBootAppProc( FARPROC16 proc, HANDLE16 module,
94                                              HFILE16 file )
95 {
96     proc( module, file );
97 }
98
99
100 /**********************************************************************
101  *           CALLBACK_CallLoadAppSegProc
102  */
103 static WORD WINAPI CALLBACK_CallLoadAppSegProc( FARPROC16 proc,
104                                                 HANDLE16 module, HFILE16 file,
105                                                 WORD seg )
106 {
107     return proc( module, file, seg );
108 }
109
110
111 /**********************************************************************
112  *           CALLBACK_CallSystemTimerProc
113  */
114 static void WINAPI CALLBACK_CallSystemTimerProc( FARPROC16 proc )
115 {
116     proc();
117 }
118
119 /**********************************************************************
120  *           CALLBACK_CallResourceHandlerProc
121  */
122 static HGLOBAL16 WINAPI CALLBACK_CallResourceHandlerProc( FARPROC16 proc,
123                                                           HGLOBAL16 hMemObj, 
124                                                           HMODULE16 hModule,
125                                                           HRSRC16 hRsrc )
126 {
127     return proc( hMemObj, hModule, hRsrc );
128 }
129
130
131 /**********************************************************************
132  *           CALLBACK_CallASPIPostProc
133  */
134 static LRESULT WINAPI CALLBACK_CallASPIPostProc( FARPROC16 proc, SEGPTR ptr )
135 {
136     return proc( ptr );
137 }
138
139
140 /**********************************************************************
141  *           CALLBACK_CallWOWCallbackProc
142  */
143 static DWORD WINAPI CALLBACK_CallWOWCallbackProc( FARPROC16 proc, DWORD dw )
144 {
145     return proc( dw );
146 }
147
148 /**********************************************************************
149  *           CALLBACK_CallWOWCallback16Ex
150  *
151  * WCB16_MAX_CBARGS (16) is the maximum number of args.
152  *
153  * Can call functions using CDECL or PASCAL calling conventions. The CDECL
154  * ones are reversed (not 100% sure about that).
155  */
156 static BOOL32 WINAPI CALLBACK_CallWOWCallback16Ex( 
157         FARPROC16 proc, DWORD dwFlags, DWORD cbArgs, LPVOID xargs,LPDWORD pdwret
158 ) {
159     LPDWORD     args = (LPDWORD)xargs;
160     DWORD       ret,i;
161
162     if (dwFlags == WCB16_CDECL) {
163         /* swap the arguments */
164         args = HeapAlloc(GetProcessHeap(),0,cbArgs*sizeof(DWORD));
165         for (i=0;i<cbArgs;i++)
166                 args[i] = ((DWORD*)xargs)[cbArgs-i-1];
167     }
168     switch (cbArgs) {
169     case 0: ret = proc();break;
170     case 1: ret = proc(args[0]);break;
171     case 2: ret = proc(args[0],args[1]);break;
172     case 3: ret = proc(args[0],args[1],args[2]);break;
173     case 4: ret = proc(args[0],args[1],args[2],args[3]);break;
174     case 5: ret = proc(args[0],args[1],args[2],args[3],args[4]);break;
175     case 6: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5]);
176             break;
177     case 7: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
178                     args[6]
179             );
180             break;
181     case 8: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
182                     args[6],args[7]
183             );
184             break;
185     case 9: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
186                     args[6],args[7],args[8]
187             );
188             break;
189     case 10:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
190                     args[6],args[7],args[8],args[9]
191             );
192             break;
193     case 11:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
194                     args[6],args[7],args[8],args[9],args[10]
195             );
196             break;
197     case 12:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
198                     args[6],args[7],args[8],args[9],args[10],args[11]
199             );
200             break;
201     case 13:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
202                     args[6],args[7],args[8],args[9],args[10],args[11],
203                     args[12]
204             );
205             break;
206     case 14:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
207                     args[6],args[7],args[8],args[9],args[10],args[11],
208                     args[12],args[13]
209             );
210             break;
211     case 15:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
212                     args[6],args[7],args[8],args[9],args[10],args[11],
213                     args[12],args[13],args[14]
214             );
215             break;
216     case 16:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
217                     args[6],args[7],args[8],args[9],args[10],args[11],
218                     args[12],args[13],args[14],args[15]
219             );
220             break;
221     default:
222             WARN(relay,"(%ld) arguments not supported.\n",cbArgs);
223             if (dwFlags == WCB16_CDECL)
224                 HeapFree(GetProcessHeap(),0,args);
225             return FALSE;
226     }
227     if (dwFlags == WCB16_CDECL)
228         HeapFree(GetProcessHeap(),0,args);
229     if (pdwret) 
230         *pdwret = ret;
231     return TRUE;
232 }
233
234 /**********************************************************************
235  *           CALLBACK_WinelibTable
236  *
237  * The callbacks function table for Winelib
238  */
239 static const CALLBACKS_TABLE CALLBACK_WinelibTable =
240 {
241     CALLBACK_CallRegisterProc,        /* CallRegisterShortProc */
242     CALLBACK_CallRegisterProc,        /* CallRegisterLongProc */
243     TASK_Reschedule,                  /* CallTaskRescheduleProc */
244     NULL,                             /* CallFrom16WndProc */
245     CALLBACK_CallWndProc,             /* CallWndProc */
246     CALLBACK_CallDriverProc,          /* CallDriverProc */
247     CALLBACK_CallDriverCallback,      /* CallDriverCallback */
248     CALLBACK_CallTimeFuncProc,        /* CallTimeFuncProc */
249     CALLBACK_CallWindowsExitProc,     /* CallWindowsExitProc */
250     CALLBACK_CallWordBreakProc,       /* CallWordBreakProc */
251     CALLBACK_CallBootAppProc,         /* CallBootAppProc */
252     CALLBACK_CallLoadAppSegProc,      /* CallLoadAppSegProc */
253     CALLBACK_CallSystemTimerProc,     /* CallSystemTimerProc */
254     CALLBACK_CallResourceHandlerProc, /* CallResourceHandlerProc */
255     CALLBACK_CallWOWCallbackProc,     /* CallWOWCallbackProc */
256     CALLBACK_CallWOWCallback16Ex,     /* CallWOWCallback16Ex */
257     CALLBACK_CallASPIPostProc,        /* CallASPIPostProc */
258     /* The graphics driver callbacks are never used in Winelib */
259     NULL,                             /* CallDrvControlProc */
260     NULL,                             /* CallDrvEnableProc */
261     NULL,                             /* CallDrvEnumDFontsProc */
262     NULL,                             /* CallDrvEnumObjProc */
263     NULL,                             /* CallDrvOutputProc */
264     NULL,                             /* CallDrvRealizeProc */
265     NULL,                             /* CallDrvStretchBltProc */
266     NULL,                             /* CallDrvExtTextOutProc */
267     NULL                              /* CallDrvGetCharWidth */
268 };
269
270 const CALLBACKS_TABLE *Callbacks = &CALLBACK_WinelibTable;
271
272