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