Fix for avoiding subtraction from unsigned zero.
[wine] / dlls / tapi32 / line.c
1 /*
2  * TAPI32 line services
3  *
4  * Copyright 1999  Andreas Mohr
5  */
6
7 #include <string.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include "winbase.h"
11 #include "windef.h"
12 #include "tapi.h"
13 #include "debugtools.h"
14
15 DEFAULT_DEBUG_CHANNEL(tapi);
16
17 /***********************************************************************
18  *              lineAccept (TAPI32.@)
19  */
20 DWORD WINAPI lineAccept(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
21 {
22     FIXME("(%04x, %s, %ld): stub.\n", hCall, lpsUserUserInfo, dwSize);
23     return 1;
24 }
25
26 /***********************************************************************
27  *              lineAddProvider (TAPI32.@)
28  */
29 DWORD WINAPI lineAddProvider(LPCSTR lpszProviderName, HWND hwndOwner, LPDWORD lpdwPermanentProviderID)
30 {
31     FIXME("(%s, %04x, %p): stub.\n", lpszProviderName, hwndOwner, lpdwPermanentProviderID);
32     return 1;
33 }       
34
35 /***********************************************************************
36  *              lineAddToConference (TAPI32.@)
37  */
38 DWORD WINAPI lineAddToConference(HCALL hConfCall, HCALL hConsultCall)
39 {
40     FIXME("(%04x, %04x): stub.\n", hConfCall, hConsultCall);
41     return 1;
42 }
43
44 /***********************************************************************
45  *              lineAnswer (TAPI32.@)
46  */
47 DWORD WINAPI lineAnswer(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
48 {
49     FIXME("(%04x, %s, %ld): stub.\n", hCall, lpsUserUserInfo, dwSize);
50     return 1;
51 }       
52
53 /***********************************************************************
54  *              lineBlindTransfer (TAPI32.@)
55  */
56 DWORD WINAPI lineBlindTransfer(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
57 {
58     FIXME("(%04x, %s, %08lx): stub.\n", hCall, lpszDestAddress, dwCountryCode);
59     return 1;
60 }       
61
62 /***********************************************************************
63  *              lineClose (TAPI32.@)
64  */
65 DWORD WINAPI lineClose(HLINE hLine)
66 {
67     FIXME("(%04x): stub.\n", hLine);
68     return 0;
69 }       
70
71 /***********************************************************************
72  *              lineCompleteCall (TAPI32.@)
73  */
74 DWORD WINAPI lineCompleteCall(HCALL hCall, LPDWORD lpdwCompletionID, DWORD dwCompletionMode, DWORD dwMessageID)
75 {
76     FIXME("(%04x, %p, %08lx, %08lx): stub.\n", hCall, lpdwCompletionID, dwCompletionMode, dwMessageID);
77     return 1;
78 }       
79
80 /***********************************************************************
81  *              lineCompleteTransfer (TAPI32.@)
82  */
83 DWORD WINAPI lineCompleteTransfer(HCALL hCall, HCALL hConsultCall, LPHCALL lphConfCall, DWORD dwTransferMode)
84 {
85     FIXME("(%04x, %04x, %p, %08lx): stub.\n", hCall, hConsultCall, lphConfCall, dwTransferMode);
86     return 1;
87 }
88
89 /***********************************************************************
90  *              lineConfigDialog (TAPI32.@)
91  */
92 DWORD WINAPI lineConfigDialog(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass)
93 {
94     FIXME("(%08lx, %04x, %s): stub.\n", dwDeviceID, hwndOwner, lpszDeviceClass);
95     return 0;
96 }       
97
98 /***********************************************************************
99  *              lineConfigDialogEdit (TAPI32.@)
100  */
101 DWORD WINAPI lineConfigDialogEdit(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass, LPVOID const lpDeviceConfigIn, DWORD dwSize, LPVARSTRING lpDeviceConfigOut)
102 {
103     FIXME("stub.\n");
104     return 0;
105 }       
106
107 /***********************************************************************
108  *              lineConfigProvider (TAPI32.@)
109  */
110 DWORD WINAPI lineConfigProvider(HWND hwndOwner, DWORD dwPermanentProviderID)
111 {
112     FIXME("(%04x, %08lx): stub.\n", hwndOwner, dwPermanentProviderID);
113     return 0;
114 }
115
116 /***********************************************************************
117  *              lineDeallocateCall (TAPI32.@)
118  */
119 DWORD WINAPI lineDeallocateCall(HCALL hCall)
120 {
121     FIXME("(%04x): stub.\n", hCall);
122     return 0;
123 }
124
125 /***********************************************************************
126  *              lineDevSpecific (TAPI32.@)
127  */
128 DWORD WINAPI lineDevSpecific(HLINE hLine, DWORD dwAddressId, HCALL hCall, LPVOID lpParams, DWORD dwSize)
129 {
130     FIXME("(%04x, %08lx, %04x, %p, %ld): stub.\n", hLine, dwAddressId, hCall, lpParams, dwSize);
131     return 1;
132 }       
133
134 /***********************************************************************
135  *              lineDevSpecificFeature (TAPI32.@)
136  */
137 DWORD WINAPI lineDevSpecificFeature(HLINE hLine, DWORD dwFeature, LPVOID lpParams, DWORD dwSize)
138 {
139     FIXME("(%04x, %08lx, %p, %ld): stub.\n", hLine, dwFeature, lpParams, dwSize);
140     return 1;
141 }
142
143 /***********************************************************************
144  *              lineDial (TAPI32.@)
145  */
146 DWORD WINAPI lineDial(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
147 {
148     FIXME("(%04x, %s, %08lx): stub.\n", hCall, lpszDestAddress, dwCountryCode);
149     return 1;
150 }
151
152 /***********************************************************************
153  *              lineDrop (TAPI32.@)
154  */ 
155 DWORD WINAPI lineDrop(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
156 {
157     FIXME("(%04x, %s, %08lx): stub.\n", hCall, lpsUserUserInfo, dwSize);
158     return 1;
159 }
160
161 /***********************************************************************
162  *              lineForward (TAPI32.@)
163  */
164 DWORD WINAPI lineForward(HLINE hLine, DWORD bAllAddress, DWORD dwAdressID, LPLINEFORWARDLIST lpForwardList, DWORD dwNumRingsNoAnswer, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
165 {
166     FIXME("stub.\n");
167     return 1;
168 }
169
170 /***********************************************************************
171  *              lineGatherDigits (TAPI32.@)
172  */     
173 DWORD WINAPI lineGatherDigits(HCALL hCall, DWORD dwDigitModes, LPSTR lpsDigits, DWORD dwNumDigits, LPCSTR lpszTerminationDigits, DWORD dwFirstDigitTimeout, DWORD dwInterDigitTimeout)
174 {
175     FIXME("stub.\n");
176     return 0;
177 }
178
179 /***********************************************************************
180  *              lineGenerateDigits (TAPI32.@)
181  */
182 DWORD WINAPI lineGenerateDigits(HCALL hCall, DWORD dwDigitModes, LPCSTR lpszDigits, DWORD dwDuration)
183 {
184     FIXME("(%04x, %08lx, %s, %ld): stub.\n", hCall, dwDigitModes, lpszDigits, dwDuration);
185     return 0;
186 }
187
188 /***********************************************************************
189  *              lineGenerateTone (TAPI32.@)
190  */
191 DWORD WINAPI lineGenerateTone(HCALL hCall, DWORD dwToneMode, DWORD dwDuration, DWORD dwNumTones, LPLINEGENERATETONE lpTones)
192 {
193     FIXME("(%04x, %08lx, %ld, %ld, %p): stub.\n", hCall, dwToneMode, dwDuration, dwNumTones, lpTones);
194     return 0;
195 }       
196
197 /***********************************************************************
198  *              lineGetAddressCaps (TAPI32.@)
199  */
200 DWORD WINAPI lineGetAddressCaps(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAddressID, DWORD dwAPIVersion, DWORD dwExtVersion, LPLINEADDRESSCAPS lpAddressCaps)
201 {
202     FIXME("(%04x, %08lx, %08lx, %08lx, %08lx, %p): stub.\n", hLineApp, dwDeviceID, dwAddressID, dwAPIVersion, dwExtVersion, lpAddressCaps);
203     return 0;
204 }
205
206 /***********************************************************************
207  *              lineGetAddressID (TAPI32.@)
208  */
209 DWORD WINAPI lineGetAddressID(HLINE hLine, LPDWORD lpdwAddressID, DWORD dwAddressMode, LPCSTR lpsAddress, DWORD dwSize)
210 {
211     FIXME("%04x, %p, %08lx, %s, %ld): stub.\n", hLine, lpdwAddressID, dwAddressMode, lpsAddress, dwSize);
212     return 0;
213 }
214
215 /***********************************************************************
216  *              lineGetAddressStatus (TAPI32.@)
217  */
218 DWORD WINAPI lineGetAddressStatus(HLINE hLine, DWORD dwAddressID, LPLINEADDRESSSTATUS lpAddressStatus)
219 {
220     FIXME("(%04x, %08lx, %p): stub.\n", hLine, dwAddressID, lpAddressStatus);
221     return 0;
222 }
223
224 /***********************************************************************
225  *              lineGetAppPriority (TAPI32.@)
226  */
227 DWORD WINAPI lineGetAppPriority(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPVARSTRING lpExtensionName, LPDWORD lpdwPriority)
228 {
229     FIXME("(%s, %08lx, %p, %08lx, %p, %p): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpExtensionName, lpdwPriority);
230     return 0;
231 }       
232
233 /***********************************************************************
234  *              lineGetCallInfo (TAPI32.@)
235  */
236 DWORD WINAPI lineGetCallInfo(HCALL hCall, LPLINECALLINFO lpCallInfo)
237 {
238     FIXME("(%04x, %p): stub.\n", hCall, lpCallInfo);
239     return 0;
240 }
241
242 /***********************************************************************
243  *              lineGetCallStatus (TAPI32.@)
244  */
245 DWORD WINAPI lineGetCallStatus(HCALL hCall, LPLINECALLSTATUS lpCallStatus)
246 {
247     FIXME("(%04x, %p): stub.\n", hCall, lpCallStatus);
248     return 0;
249 }
250
251 /***********************************************************************
252  *              lineGetConfRelatedCalls (TAPI32.@)
253  */
254 DWORD WINAPI lineGetConfRelatedCalls(HCALL hCall, LPLINECALLLIST lpCallList)
255 {
256     FIXME("(%04x, %p): stub.\n", hCall, lpCallList);
257     return 0;
258 }       
259
260 typedef struct tagTAPI_CountryInfo
261 {
262     DWORD  dwCountryID;
263     DWORD  dwCountryCode;
264     LPSTR  lpCountryName;
265     LPSTR  lpSameAreaRule; 
266     LPSTR  lpLongDistanceRule; 
267     LPSTR  lpInternationalRule; 
268 } TAPI_CountryInfo;
269
270 /* FIXME: this should be stored in an ini file... perhaps TAPI.INI */
271 static TAPI_CountryInfo TAPI_LCList[] =
272 {
273     { 1, 61, "Australia", "", "0", "0011" },
274     { 2, 86, "China", "", "0", "00" },
275     { 3, 82, "Korea", "", "0", "00" },
276     { 4, 1,  "USA", "", "0", "001" },
277 };
278
279 #define NUMCOUNTRIES (sizeof TAPI_LCList/sizeof (TAPI_CountryInfo))
280
281 /***********************************************************************
282  *              lineGetCountry (TAPI32.@)
283  */
284 DWORD WINAPI lineGetCountry(DWORD dwCountryID, DWORD dwAPIVersion, LPLINECOUNTRYLIST lpLineCountryList)
285 {
286     DWORD dwAvailSize, dwOffset, i;
287     LPLINECOUNTRYENTRY lpLCE;
288
289     TRACE("(%08lx, %08lx, %p): stub.\n", dwCountryID, dwAPIVersion, lpLineCountryList);
290
291     dwAvailSize = lpLineCountryList->dwTotalSize;
292     dwOffset = sizeof (LINECOUNTRYLIST);
293
294     if(dwAvailSize<dwOffset)
295         return LINEERR_STRUCTURETOOSMALL;
296
297     if(!lpLineCountryList)
298         return LINEERR_INVALPOINTER;
299
300     memset(lpLineCountryList, 0, dwAvailSize);
301
302     lpLineCountryList->dwUsedSize          = dwOffset;
303     lpLineCountryList->dwNumCountries      = 0;
304     lpLineCountryList->dwCountryListSize   = 0;
305     lpLineCountryList->dwCountryListOffset = dwOffset;
306
307     lpLCE = (LPLINECOUNTRYENTRY)(&lpLineCountryList[1]);
308     dwOffset+= NUMCOUNTRIES * sizeof (LINECOUNTRYENTRY);
309
310     for(i=0; i<NUMCOUNTRIES; i++)
311     {
312         LPSTR lpstr;
313         DWORD len;
314
315         if(dwCountryID && (TAPI_LCList[i].dwCountryID != dwCountryID))
316             continue;
317
318         len  = strlen (TAPI_LCList[i].lpCountryName)+1;
319         len += strlen (TAPI_LCList[i].lpSameAreaRule)+1;
320         len += strlen (TAPI_LCList[i].lpLongDistanceRule)+1;
321         len += strlen (TAPI_LCList[i].lpInternationalRule)+1;
322
323         if(dwAvailSize<(dwOffset+len))
324         {
325             dwOffset+=len;
326             continue;
327         }
328
329         lpLineCountryList->dwNumCountries++;
330         lpLineCountryList->dwCountryListSize += len;
331         lpLineCountryList->dwUsedSize += sizeof (LINECOUNTRYENTRY); /* maybe wrong */
332
333         TRACE("Adding country %s at %p\n", TAPI_LCList[i].lpCountryName, lpLCE);
334
335         lpLCE[i].dwCountryID   = TAPI_LCList[i].dwCountryID;
336         lpLCE[i].dwCountryCode = TAPI_LCList[i].dwCountryCode;
337
338         /* deal with troublesome dwNextCountryID */
339         if( (i+1) == NUMCOUNTRIES )
340             lpLCE[i].dwNextCountryID = 0;
341         else
342             lpLCE[i].dwNextCountryID = TAPI_LCList[i+1].dwCountryID;
343
344         /* add country name */
345         len = strlen(TAPI_LCList[i].lpCountryName)+1;
346         lpLCE[i].dwCountryNameSize = len;
347         lpLCE[i].dwCountryNameOffset = dwOffset;
348         lpstr = ((LPSTR)lpLineCountryList)+dwOffset;
349         strcpy(lpstr, TAPI_LCList[i].lpCountryName);
350         dwOffset+=len;
351
352         /* add Same Area Rule */
353         len = strlen (TAPI_LCList[i].lpSameAreaRule)+1;
354         lpLCE[i].dwSameAreaRuleSize = len;
355         lpLCE[i].dwSameAreaRuleOffset = dwOffset;
356         lpstr = ((LPSTR)lpLineCountryList)+dwOffset;
357         strcpy(lpstr, TAPI_LCList[i].lpSameAreaRule);
358         dwOffset+=len;
359
360         /* add Long Distance Rule */
361         len = strlen (TAPI_LCList[i].lpLongDistanceRule)+1;
362         lpLCE[i].dwLongDistanceRuleSize = len;
363         lpLCE[i].dwLongDistanceRuleOffset = dwOffset;
364         lpstr = ((LPSTR)lpLineCountryList)+dwOffset;
365         strcpy(lpstr, TAPI_LCList[i].lpLongDistanceRule);
366         dwOffset+=len;
367
368         /* add Long Distance Rule */
369         len = strlen (TAPI_LCList[i].lpInternationalRule)+1;
370         lpLCE[i].dwInternationalRuleSize = len;
371         lpLCE[i].dwInternationalRuleOffset = dwOffset;
372         lpstr = ((LPSTR)lpLineCountryList)+dwOffset;
373         strcpy(lpstr, TAPI_LCList[i].lpInternationalRule);
374         dwOffset+=len;
375     }
376
377     lpLineCountryList->dwNeededSize = dwOffset;
378
379     TRACE("%ld available %ld required\n", dwAvailSize, dwOffset);
380
381     return 0;
382 }
383
384 /***********************************************************************
385  *              lineGetDevCaps (TAPI32.@)
386  */
387 DWORD WINAPI lineGetDevCaps(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, DWORD dwExtVersion, LPLINEDEVCAPS lpLineDevCaps)
388 {
389     FIXME("(%04x, %08lx, %08lx, %08lx, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, dwExtVersion, lpLineDevCaps);
390     return 0;
391 }       
392
393 /***********************************************************************
394  *              lineGetDevConfig (TAPI32.@)
395  */
396 DWORD WINAPI lineGetDevConfig(DWORD dwDeviceID, LPVARSTRING lpDeviceConfig, LPCSTR lpszDeviceClass)
397 {
398     FIXME("(%08lx, %p, %s): stub.\n", dwDeviceID, lpDeviceConfig, lpszDeviceClass);
399     return 0;
400 }
401
402 /***********************************************************************
403  *              lineGetID (TAPI32.@)
404  */
405 DWORD WINAPI lineGetID(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, LPVARSTRING lpDeviceID, LPCSTR lpszDeviceClass)
406 {
407     FIXME("(%04x, %08lx, %04x, %08lx, %p, %s): stub.\n", hLine, dwAddressID, hCall, dwSelect, lpDeviceID, lpszDeviceClass);
408     return 0;
409 }
410
411 /***********************************************************************
412  *              lineGetIcon (TAPI32.@)
413  */
414 DWORD WINAPI lineGetIcon(DWORD dwDeviceID, LPCSTR lpszDeviceClass, HICON *lphIcon)
415 {
416     FIXME("(%08lx, %s, %p): stub.\n", dwDeviceID, lpszDeviceClass, lphIcon);
417     return 0;
418 }       
419
420 /***********************************************************************
421  *              lineGetLineDevStatus (TAPI32.@)
422  */
423 DWORD WINAPI lineGetLineDevStatus(HLINE hLine, LPLINEDEVSTATUS lpLineDevStatus)
424 {
425     FIXME("(%04x, %p): stub.\n", hLine, lpLineDevStatus);
426     return 0;
427 }       
428
429 /***********************************************************************
430  *              lineGetNewCalls (TAPI32.@)
431  */
432 DWORD WINAPI lineGetNewCalls(HLINE hLine, DWORD dwAddressID, DWORD dwSelect, LPLINECALLLIST lpCallList)
433 {
434     FIXME("(%04x, %08lx, %08lx, %p): stub.\n", hLine, dwAddressID, dwSelect, lpCallList);
435     return 0;
436 }
437
438 /***********************************************************************
439  *              lineGetNumRings (TAPI32.@)
440  */
441 DWORD WINAPI lineGetNumRings(HLINE hLine, DWORD dwAddressID, LPDWORD lpdwNumRings)
442 {
443     FIXME("(%04x, %08lx, %p): stub.\n", hLine, dwAddressID, lpdwNumRings);
444     return 0;
445 }
446
447 /***********************************************************************
448  *              lineGetProviderList (TAPI32.@)
449  */
450 DWORD WINAPI lineGetProviderList(DWORD dwAPIVersion, LPLINEPROVIDERLIST lpProviderList)
451 {
452     FIXME("(%08lx, %p): stub.\n", dwAPIVersion, lpProviderList);
453     return 0;
454 }       
455
456 /***********************************************************************
457  *              lineGetRequest (TAPI32.@)
458  */
459 DWORD WINAPI lineGetRequest(HLINEAPP hLineApp, DWORD dwRequestMode, LPVOID lpRequestBuffer)
460 {
461     FIXME("%04x, %08lx, %p): stub.\n", hLineApp, dwRequestMode, lpRequestBuffer);
462     return 0;
463 }       
464
465 /***********************************************************************
466  *              lineGetStatusMessages (TAPI32.@)
467  */
468 DWORD WINAPI lineGetStatusMessages(HLINE hLine, LPDWORD lpdwLineStatus, LPDWORD lpdwAddressStates)
469 {
470     FIXME("(%04x, %p, %p): stub.\n", hLine, lpdwLineStatus, lpdwAddressStates);
471     return 0;
472 }       
473
474 /***********************************************************************
475  *              lineGetTranslateCaps (TAPI32.@)
476  */
477 DWORD WINAPI lineGetTranslateCaps(HLINEAPP hLineApp, DWORD dwAPIVersion, LPLINETRANSLATECAPS lpTranslateCaps)
478 {
479     FIXME("(%04x, %08lx, %p): stub.\n", hLineApp, dwAPIVersion, lpTranslateCaps);
480     return 0;
481 }
482
483 /***********************************************************************
484  *              lineHandoff (TAPI32.@)
485  */
486 DWORD WINAPI lineHandoff(HCALL hCall, LPCSTR lpszFileName, DWORD dwMediaMode)
487 {
488     FIXME("(%04x, %s, %08lx): stub.\n", hCall, lpszFileName, dwMediaMode);
489     return 0;
490 }       
491
492 /***********************************************************************
493  *              lineHold (TAPI32.@)
494  */
495 DWORD WINAPI lineHold(HCALL hCall)
496 {
497     FIXME("(%04x): stub.\n", hCall);
498     return 1;
499 }       
500
501 /***********************************************************************
502  *              lineInitialize (TAPI32.@)
503  */
504 DWORD WINAPI lineInitialize(
505   LPHLINEAPP lphLineApp,
506   HINSTANCE hInstance,
507   LINECALLBACK lpfnCallback,
508   LPCSTR lpszAppName,
509   LPDWORD lpdwNumDevs)
510 {
511     FIXME("(%p, %04x, %p, %s, %p): stub.\n", lphLineApp, hInstance,
512           lpfnCallback, debugstr_a(lpszAppName), lpdwNumDevs);
513     return 0;
514 }
515
516 /***********************************************************************
517  *              lineMakeCall (TAPI32.@)
518  */
519 DWORD WINAPI lineMakeCall(HLINE hLine, LPHCALL lphCall, LPCSTR lpszDestAddress, DWORD dwCountryCode, LPLINECALLPARAMS lpCallParams)
520 {
521     FIXME("(%04x, %p, %s, %08lx, %p): stub.\n", hLine, lphCall, lpszDestAddress, dwCountryCode, lpCallParams);
522     return 1;
523 }
524
525 /***********************************************************************
526  *              lineMonitorDigits (TAPI32.@)
527  */
528 DWORD WINAPI lineMonitorDigits(HCALL hCall, DWORD dwDigitModes)
529 {
530     FIXME("(%04x, %08lx): stub.\n", hCall, dwDigitModes);
531     return 0;
532 }
533
534 /***********************************************************************
535  *              lineMonitorMedia (TAPI32.@)
536  */
537 DWORD WINAPI lineMonitorMedia(HCALL hCall, DWORD dwMediaModes)
538 {
539     FIXME("(%04x, %08lx): stub.\n", hCall, dwMediaModes);
540     return 0;
541 }       
542
543 /***********************************************************************
544  *              lineMonitorTones (TAPI32.@)
545  */
546 DWORD WINAPI lineMonitorTones(HCALL hCall, LPLINEMONITORTONE lpToneList, DWORD dwNumEntries)
547 {
548     FIXME("(%04x, %p, %08lx): stub.\n", hCall, lpToneList, dwNumEntries);
549     return 0;
550 }       
551
552 /***********************************************************************
553  *              lineNegotiateAPIVersion (TAPI32.@)
554  */
555 DWORD WINAPI lineNegotiateAPIVersion(
556   HLINEAPP hLineApp,
557   DWORD dwDeviceID,
558   DWORD dwAPILowVersion,
559   DWORD dwAPIHighVersion,
560   LPDWORD lpdwAPIVersion,
561   LPLINEEXTENSIONID lpExtensionID
562 )
563 {
564     FIXME("(%04x, %ld, %ld, %ld, %p, %p): stub.\n", hLineApp, dwDeviceID, 
565           dwAPILowVersion, dwAPIHighVersion, lpdwAPIVersion, lpExtensionID);
566     *lpdwAPIVersion = dwAPIHighVersion;
567     return 0;
568 }
569
570 /***********************************************************************
571  *              lineNegotiateExtVersion (TAPI32.@)
572  */
573 DWORD WINAPI lineNegotiateExtVersion(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, DWORD dwExtLowVersion, DWORD dwExtHighVersion, LPDWORD lpdwExtVersion)
574 {
575     FIXME("stub.\n");
576     return 0;
577 }
578
579 /***********************************************************************
580  *              lineOpen (TAPI32.@)
581  */
582 DWORD WINAPI lineOpen(HLINEAPP hLineApp, DWORD dwDeviceID, LPHLINE lphLine, DWORD dwAPIVersion, DWORD dwExtVersion, DWORD dwCallbackInstance, DWORD dwPrivileges, DWORD dwMediaModes, LPLINECALLPARAMS lpCallParams)
583 {
584     FIXME("stub.\n");
585     return 0;
586 }
587
588 /***********************************************************************
589  *              linePark (TAPI32.@)
590  */
591 DWORD WINAPI linePark(HCALL hCall, DWORD dwParkMode, LPCSTR lpszDirAddress, LPVARSTRING lpNonDirAddress)
592 {
593     FIXME("(%04x, %08lx, %s, %p): stub.\n", hCall, dwParkMode, lpszDirAddress, lpNonDirAddress);
594     return 1;
595 }       
596
597 /***********************************************************************
598  *              linePickup (TAPI32.@)
599  */
600 DWORD WINAPI linePickup(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress, LPCSTR lpszGroupID)
601 {
602     FIXME("(%04x, %08lx, %p, %s, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress, lpszGroupID);
603     return 1;
604 }       
605
606 /***********************************************************************
607  *              linePrepareAddToConference (TAPI32.@)
608  */
609 DWORD WINAPI linePrepareAddToConference(HCALL hConfCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
610 {
611     FIXME("(%04x, %p, %p): stub.\n", hConfCall, lphConsultCall, lpCallParams);
612     return 1;
613 }       
614
615 /***********************************************************************
616  *              lineRedirect (TAPI32.@)
617  */
618 DWORD WINAPI lineRedirect(
619   HCALL hCall,
620   LPCSTR lpszDestAddress,
621   DWORD  dwCountryCode) {
622
623   FIXME(": stub.\n");
624   return 1;
625 }
626
627 /***********************************************************************
628  *              lineRegisterRequestRecipient (TAPI32.@)
629  */
630 DWORD WINAPI lineRegisterRequestRecipient(HLINEAPP hLineApp, DWORD dwRegistrationInstance, DWORD dwRequestMode, DWORD dwEnable)
631 {
632     FIXME("(%04x, %08lx, %08lx, %08lx): stub.\n", hLineApp, dwRegistrationInstance, dwRequestMode, dwEnable);
633     return 1;
634 }
635
636 /***********************************************************************
637  *              lineReleaseUserUserInfo (TAPI32.@)
638  */
639 DWORD WINAPI lineReleaseUserUserInfo(HCALL hCall)
640 {
641     FIXME("(%04x): stub.\n", hCall);
642     return 1;
643 }       
644
645 /***********************************************************************
646  *              lineRemoveFromConference (TAPI32.@)
647  */
648 DWORD WINAPI lineRemoveFromConference(HCALL hCall)
649 {
650     FIXME("(%04x): stub.\n", hCall);
651     return 1;
652 }
653
654 /***********************************************************************
655  *              lineRemoveProvider (TAPI32.@)
656  */
657 DWORD WINAPI lineRemoveProvider(DWORD dwPermanentProviderID, HWND hwndOwner)
658 {
659     FIXME("(%08lx, %04x): stub.\n", dwPermanentProviderID, hwndOwner);
660     return 1;
661 }       
662
663 /***********************************************************************
664  *              lineSecureCall (TAPI32.@)
665  */
666 DWORD WINAPI lineSecureCall(HCALL hCall)
667 {
668     FIXME("(%04x): stub.\n", hCall);
669     return 1;
670 }
671
672 /***********************************************************************
673  *              lineSendUserUserInfo (TAPI32.@)
674  */
675 DWORD WINAPI lineSendUserUserInfo(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
676 {
677     FIXME("(%04x, %s, %08lx): stub.\n", hCall, lpsUserUserInfo, dwSize);
678     return 1;
679 }
680
681 /***********************************************************************
682  *              lineSetAppPriority (TAPI32.@)
683  */
684 DWORD WINAPI lineSetAppPriority(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPCSTR lpszExtensionName, DWORD dwPriority)
685 {
686     FIXME("(%s, %08lx, %p, %08lx, %s, %08lx): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpszExtensionName, dwPriority);
687     return 0;
688 }
689
690 /***********************************************************************
691  *              lineSetAppSpecific (TAPI32.@)
692  */
693 DWORD WINAPI lineSetAppSpecific(HCALL hCall, DWORD dwAppSpecific)
694 {
695     FIXME("(%04x, %08lx): stub.\n", hCall, dwAppSpecific);
696     return 0;
697 }
698
699 /***********************************************************************
700  *              lineSetCallParams (TAPI32.@)
701  */
702 DWORD WINAPI lineSetCallParams(HCALL hCall, DWORD dwBearerMode, DWORD dwMinRate, DWORD dwMaxRate, LPLINEDIALPARAMS lpDialParams)
703 {
704     FIXME("(%04x, %08lx, %08lx, %08lx, %p): stub.\n", hCall, dwBearerMode, dwMinRate, dwMaxRate, lpDialParams);
705     return 1;
706 }
707
708 /***********************************************************************
709  *              lineSetCallPrivilege (TAPI32.@)
710  */
711 DWORD WINAPI lineSetCallPrivilege(HCALL hCall, DWORD dwCallPrivilege)
712 {
713     FIXME("(%04x, %08lx): stub.\n", hCall, dwCallPrivilege);
714     return 0;
715 }       
716                 
717 /***********************************************************************
718  *              lineSetCurrentLocation (TAPI32.@)
719  */
720 DWORD WINAPI lineSetCurrentLocation(HLINEAPP hLineApp, DWORD dwLocation)
721 {
722     FIXME("(%04x, %08lx): stub.\n", hLineApp, dwLocation);
723     return 0;
724 }
725
726 /***********************************************************************
727  *              lineSetDevConfig (TAPI32.@)
728  */
729 DWORD WINAPI lineSetDevConfig(DWORD dwDeviceID, LPVOID lpDeviceConfig, DWORD dwSize, LPCSTR lpszDeviceClass)
730 {
731     FIXME("(%08lx, %p, %08lx, %s): stub.\n", dwDeviceID, lpDeviceConfig, dwSize, lpszDeviceClass);
732     return 0;
733 }
734
735 /***********************************************************************
736  *              lineSetMediaControl (TAPI32.@)
737  */
738 DWORD WINAPI lineSetMediaControl(
739 HLINE hLine,
740 DWORD dwAddressID,
741 HCALL hCall,
742 DWORD dwSelect,
743 LPLINEMEDIACONTROLDIGIT const lpDigitList,
744 DWORD dwDigitNumEntries,
745 LPLINEMEDIACONTROLMEDIA const lpMediaList,
746 DWORD dwMediaNumEntries,
747 LPLINEMEDIACONTROLTONE const lpToneList, 
748 DWORD dwToneNumEntries,
749 LPLINEMEDIACONTROLCALLSTATE const lpCallStateList,
750 DWORD dwCallStateNumEntries)
751 {
752     FIXME(": stub.\n");
753     return 0;
754 }
755
756 /***********************************************************************
757  *              lineSetMediaMode (TAPI32.@)
758  */
759 DWORD WINAPI lineSetMediaMode(HCALL hCall, DWORD dwMediaModes)
760 {
761     FIXME("(%04x, %08lx): stub.\n", hCall, dwMediaModes);
762     return 0;
763 }       
764
765 /***********************************************************************
766  *              lineSetNumRings (TAPI32.@)
767  */
768 DWORD WINAPI lineSetNumRings(HLINE hLine, DWORD dwAddressID, DWORD dwNumRings)
769 {
770     FIXME("(%04x, %08lx, %08lx): stub.\n", hLine, dwAddressID, dwNumRings);
771     return 0;
772 }       
773                 
774 /***********************************************************************
775  *              lineSetStatusMessages (TAPI32.@)
776  */
777 DWORD WINAPI lineSetStatusMessages(HLINE hLine, DWORD dwLineStates, DWORD dwAddressStates)
778 {
779     FIXME("(%04x, %08lx, %08lx): stub.\n", hLine, dwLineStates, dwAddressStates);
780     return 0;
781 }       
782                 
783 /***********************************************************************
784  *              lineSetTerminal (TAPI32.@)
785  */
786 DWORD WINAPI lineSetTerminal(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, DWORD dwTerminalModes, DWORD dwTerminalID, DWORD bEnable)
787 {
788     FIXME("(%04x, %08lx, %04x, %08lx, %08lx, %08lx, %08lx): stub.\n", hLine, dwAddressID, hCall, dwSelect, dwTerminalModes, dwTerminalID, bEnable);
789     return 1;
790 }       
791
792 /***********************************************************************
793  *              lineSetTollList (TAPI32.@)
794  */
795 DWORD WINAPI lineSetTollList(HLINEAPP hLineApp, DWORD dwDeviceID, LPCSTR lpszAddressIn, DWORD dwTollListOption)
796 {
797     FIXME("(%04x, %08lx, %s, %08lx): stub.\n", hLineApp, dwDeviceID, lpszAddressIn, dwTollListOption);
798     return 0;
799 }       
800                 
801 /***********************************************************************
802  *              lineSetupConference (TAPI32.@)
803  */
804 DWORD WINAPI lineSetupConference(HCALL hCall, HLINE hLine, LPHCALL lphConfCall, LPHCALL lphConsultCall, DWORD dwNumParties, LPLINECALLPARAMS lpCallParams)
805 {
806     FIXME("(%04x, %04x, %p, %p, %08lx, %p): stub.\n", hCall, hLine, lphConfCall, lphConsultCall, dwNumParties, lpCallParams);
807     return 1;
808 }
809
810 /***********************************************************************
811  *              lineSetupTransfer (TAPI32.@)
812  */
813 DWORD WINAPI lineSetupTransfer(HCALL hCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
814 {
815     FIXME("(%04x, %p, %p): stub.\n", hCall, lphConsultCall, lpCallParams);
816     return 1;
817 }       
818
819 /***********************************************************************
820  *              lineShutdown (TAPI32.@)
821  */
822 DWORD WINAPI lineShutdown(HLINEAPP hLineApp)
823 {
824     FIXME("(%04x): stub.\n", hLineApp);
825     return 0;
826 }
827
828 /***********************************************************************
829  *              lineSwapHold (TAPI32.@)
830  */
831 DWORD WINAPI lineSwapHold(HCALL hActiveCall, HCALL hHeldCall)
832 {
833     FIXME("(active: %04x, held: %04x): stub.\n", hActiveCall, hHeldCall);
834     return 1;
835 }
836
837 /***********************************************************************
838  *              lineTranslateAddress (TAPI32.@)
839  */
840 DWORD WINAPI lineTranslateAddress(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, LPCSTR lpszAddressIn, DWORD dwCard, DWORD dwTranslateOptions, LPLINETRANSLATEOUTPUT lpTranslateOutput)
841 {
842     FIXME("(%04x, %08lx, %08lx, %s, %08lx, %08lx, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, lpszAddressIn, dwCard, dwTranslateOptions, lpTranslateOutput);
843     return 0;
844 }
845
846 /***********************************************************************
847  *              lineTranslateDialog (TAPI32.@)
848  */
849 DWORD WINAPI lineTranslateDialog(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, HWND hwndOwner, LPCSTR lpszAddressIn)
850 {
851     FIXME("(%04x, %08lx, %08lx, %04x, %s): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, hwndOwner, lpszAddressIn);
852     return 0;
853 }
854
855 /***********************************************************************
856  *              lineUncompleteCall (TAPI32.@)
857  */
858 DWORD WINAPI lineUncompleteCall(HLINE hLine, DWORD dwCompletionID)
859 {
860     FIXME("(%04x, %08lx): stub.\n", hLine, dwCompletionID);
861     return 1;
862 }
863
864 /***********************************************************************
865  *              lineUnhold (TAPI32.@)
866  */
867 DWORD WINAPI lineUnhold(HCALL hCall)
868 {
869     FIXME("(%04x): stub.\n", hCall);
870     return 1;
871 }
872
873 /***********************************************************************
874  *              lineUnpark (TAPI32.@)
875  */
876 DWORD WINAPI lineUnpark(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress)
877 {
878     FIXME("(%04x, %08lx, %p, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress);
879     return 1;
880 }