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