Release 980601
[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 /**********************************************************************
121  *           CALLBACK_CallASPIPostProc
122  */
123 static LRESULT WINAPI CALLBACK_CallASPIPostProc( FARPROC16 proc, SEGPTR ptr )
124 {
125     return proc( ptr );
126 }
127
128
129 /**********************************************************************
130  *           CALLBACK_CallWOWCallbackProc
131  */
132 static DWORD WINAPI CALLBACK_CallWOWCallbackProc( FARPROC16 proc, DWORD dw )
133 {
134     return proc( dw );
135 }
136
137 /**********************************************************************
138  *           CALLBACK_CallWOWCallback16Ex
139  *
140  * WCB16_MAX_CBARGS (16) is the maximum number of args.
141  *
142  * Can call functions using CDECL or PASCAL calling conventions. The CDECL
143  * ones are reversed (not 100% sure about that).
144  */
145 static BOOL32 WINAPI CALLBACK_CallWOWCallback16Ex( 
146         FARPROC16 proc, DWORD dwFlags, DWORD cbArgs, LPVOID xargs,LPDWORD pdwret
147 ) {
148     LPDWORD     args = (LPDWORD)xargs;
149     DWORD       ret,i;
150
151     if (dwFlags == WCB16_CDECL) {
152         /* swap the arguments */
153         args = HeapAlloc(GetProcessHeap(),0,cbArgs*sizeof(DWORD));
154         for (i=0;i<cbArgs;i++)
155                 args[i] = ((DWORD*)xargs)[cbArgs-i-1];
156     }
157     switch (cbArgs) {
158     case 0: ret = proc();break;
159     case 1: ret = proc(args[0]);break;
160     case 2: ret = proc(args[0],args[1]);break;
161     case 3: ret = proc(args[0],args[1],args[2]);break;
162     case 4: ret = proc(args[0],args[1],args[2],args[3]);break;
163     case 5: ret = proc(args[0],args[1],args[2],args[3],args[4]);break;
164     case 6: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5]);
165             break;
166     case 7: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
167                     args[6]
168             );
169             break;
170     case 8: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
171                     args[6],args[7]
172             );
173             break;
174     case 9: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
175                     args[6],args[7],args[8]
176             );
177             break;
178     case 10:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
179                     args[6],args[7],args[8],args[9]
180             );
181             break;
182     case 11:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
183                     args[6],args[7],args[8],args[9],args[10]
184             );
185             break;
186     case 12:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
187                     args[6],args[7],args[8],args[9],args[10],args[11]
188             );
189             break;
190     case 13:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
191                     args[6],args[7],args[8],args[9],args[10],args[11],
192                     args[12]
193             );
194             break;
195     case 14:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
196                     args[6],args[7],args[8],args[9],args[10],args[11],
197                     args[12],args[13]
198             );
199             break;
200     case 15:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
201                     args[6],args[7],args[8],args[9],args[10],args[11],
202                     args[12],args[13],args[14]
203             );
204             break;
205     case 16:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
206                     args[6],args[7],args[8],args[9],args[10],args[11],
207                     args[12],args[13],args[14],args[15]
208             );
209             break;
210     default:
211             WARN(relay,"(%ld) arguments not supported.\n",cbArgs);
212             if (dwFlags == WCB16_CDECL)
213                 HeapFree(GetProcessHeap(),0,args);
214             return FALSE;
215     }
216     if (dwFlags == WCB16_CDECL)
217         HeapFree(GetProcessHeap(),0,args);
218     if (pdwret) 
219         *pdwret = ret;
220     return TRUE;
221 }
222
223 /**********************************************************************
224  *           CALLBACK_WinelibTable
225  *
226  * The callbacks function table for Winelib
227  */
228 static const CALLBACKS_TABLE CALLBACK_WinelibTable =
229 {
230     CALLBACK_CallRegisterProc,     /* CallRegisterShortProc */
231     CALLBACK_CallRegisterProc,     /* CallRegisterLongProc */
232     TASK_Reschedule,               /* CallTaskRescheduleProc */
233     NULL,                          /* CallFrom16WndProc */
234     CALLBACK_CallWndProc,          /* CallWndProc */
235     CALLBACK_CallDriverProc,       /* CallDriverProc */
236     CALLBACK_CallDriverCallback,   /* CallDriverCallback */
237     CALLBACK_CallTimeFuncProc,     /* CallTimeFuncProc */
238     CALLBACK_CallWindowsExitProc,  /* CallWindowsExitProc */
239     CALLBACK_CallWordBreakProc,    /* CallWordBreakProc */
240     CALLBACK_CallBootAppProc,      /* CallBootAppProc */
241     CALLBACK_CallLoadAppSegProc,   /* CallLoadAppSegProc */
242     CALLBACK_CallSystemTimerProc,  /* CallSystemTimerProc */
243     CALLBACK_CallWOWCallbackProc,  /* CallWOWCallbackProc */
244     CALLBACK_CallWOWCallback16Ex,  /* CallWOWCallback16Ex */
245     CALLBACK_CallASPIPostProc,     /* CallASPIPostProc */
246     /* The graphics driver callbacks are never used in Winelib */
247     NULL,                          /* CallDrvControlProc */
248     NULL,                          /* CallDrvEnableProc */
249     NULL,                          /* CallDrvEnumDFontsProc */
250     NULL,                          /* CallDrvEnumObjProc */
251     NULL,                          /* CallDrvOutputProc */
252     NULL,                          /* CallDrvRealizeProc */
253     NULL,                          /* CallDrvStretchBltProc */
254     NULL,                          /* CallDrvExtTextOutProc */
255     NULL                           /* CallDrvGetCharWidth */
256 };
257
258 const CALLBACKS_TABLE *Callbacks = &CALLBACK_WinelibTable;
259
260