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