214e504c0849da6b4fb3a5cfb49f36398cc60bf8
[reactos.git] / reactos / dll / win32 / 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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 "wingdi.h"
28 #include "winreg.h"
29 #include "winnls.h"
30 #include "winerror.h"
31 #include "objbase.h"
32 #include "tapi.h"
33 #include "wine/debug.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(tapi);
36
37 /* registry keys */
38 static const char szCountrylistKey[] =
39 "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Country List";
40 static const char szLocationsKey[] =
41 "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Locations";
42 static const char szCardsKey[] =
43 "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Cards";
44
45
46 /***********************************************************************
47 * lineAccept (TAPI32.@)
48 */
49 DWORD WINAPI lineAccept(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
50 {
51 FIXME("(%p, %s, %d): stub.\n", hCall, lpsUserUserInfo, dwSize);
52 return 1;
53 }
54
55 /***********************************************************************
56 * lineAddProvider (TAPI32.@)
57 */
58 DWORD WINAPI lineAddProviderA(LPCSTR lpszProviderName, HWND hwndOwner, LPDWORD lpdwPermanentProviderID)
59 {
60 FIXME("(%s, %p, %p): stub.\n", lpszProviderName, hwndOwner, lpdwPermanentProviderID);
61 return 1;
62 }
63
64 /***********************************************************************
65 * lineAddToConference (TAPI32.@)
66 */
67 DWORD WINAPI lineAddToConference(HCALL hConfCall, HCALL hConsultCall)
68 {
69 FIXME("(%p, %p): stub.\n", hConfCall, hConsultCall);
70 return 1;
71 }
72
73 /***********************************************************************
74 * lineAnswer (TAPI32.@)
75 */
76 DWORD WINAPI lineAnswer(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
77 {
78 FIXME("(%p, %s, %d): stub.\n", hCall, lpsUserUserInfo, dwSize);
79 return 1;
80 }
81
82 /***********************************************************************
83 * lineBlindTransfer (TAPI32.@)
84 */
85 DWORD WINAPI lineBlindTransferA(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
86 {
87 FIXME("(%p, %s, %08x): stub.\n", hCall, lpszDestAddress, dwCountryCode);
88 return 1;
89 }
90
91 /***********************************************************************
92 * lineClose (TAPI32.@)
93 */
94 DWORD WINAPI lineClose(HLINE hLine)
95 {
96 FIXME("(%p): stub.\n", hLine);
97 return 0;
98 }
99
100 /***********************************************************************
101 * lineCompleteCall (TAPI32.@)
102 */
103 DWORD WINAPI lineCompleteCall(HCALL hCall, LPDWORD lpdwCompletionID, DWORD dwCompletionMode, DWORD dwMessageID)
104 {
105 FIXME("(%p, %p, %08x, %08x): stub.\n", hCall, lpdwCompletionID, dwCompletionMode, dwMessageID);
106 return 1;
107 }
108
109 /***********************************************************************
110 * lineCompleteTransfer (TAPI32.@)
111 */
112 DWORD WINAPI lineCompleteTransfer(HCALL hCall, HCALL hConsultCall, LPHCALL lphConfCall, DWORD dwTransferMode)
113 {
114 FIXME("(%p, %p, %p, %08x): stub.\n", hCall, hConsultCall, lphConfCall, dwTransferMode);
115 return 1;
116 }
117
118 /***********************************************************************
119 * lineConfigDialog (TAPI32.@)
120 */
121 DWORD WINAPI lineConfigDialogA(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass)
122 {
123 FIXME("(%08x, %p, %s): stub.\n", dwDeviceID, hwndOwner, lpszDeviceClass);
124 return 0;
125 }
126
127 /***********************************************************************
128 * lineConfigDialogEdit (TAPI32.@)
129 */
130 DWORD WINAPI lineConfigDialogEditA(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass, LPVOID const lpDeviceConfigIn, DWORD dwSize, LPVARSTRING lpDeviceConfigOut)
131 {
132 FIXME("stub.\n");
133 return 0;
134 }
135
136 /***********************************************************************
137 * lineConfigProvider (TAPI32.@)
138 */
139 DWORD WINAPI lineConfigProvider(HWND hwndOwner, DWORD dwPermanentProviderID)
140 {
141 FIXME("(%p, %08x): stub.\n", hwndOwner, dwPermanentProviderID);
142 return 0;
143 }
144
145 /***********************************************************************
146 * lineDeallocateCall (TAPI32.@)
147 */
148 DWORD WINAPI lineDeallocateCall(HCALL hCall)
149 {
150 FIXME("(%p): stub.\n", hCall);
151 return 0;
152 }
153
154 /***********************************************************************
155 * lineDevSpecific (TAPI32.@)
156 */
157 DWORD WINAPI lineDevSpecific(HLINE hLine, DWORD dwAddressId, HCALL hCall, LPVOID lpParams, DWORD dwSize)
158 {
159 FIXME("(%p, %08x, %p, %p, %d): stub.\n", hLine, dwAddressId, hCall, lpParams, dwSize);
160 return 1;
161 }
162
163 /***********************************************************************
164 * lineDevSpecificFeature (TAPI32.@)
165 */
166 DWORD WINAPI lineDevSpecificFeature(HLINE hLine, DWORD dwFeature, LPVOID lpParams, DWORD dwSize)
167 {
168 FIXME("(%p, %08x, %p, %d): stub.\n", hLine, dwFeature, lpParams, dwSize);
169 return 1;
170 }
171
172 /***********************************************************************
173 * lineDial (TAPI32.@)
174 */
175 DWORD WINAPI lineDialA(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
176 {
177 FIXME("(%p, %s, %08x): stub.\n", hCall, lpszDestAddress, dwCountryCode);
178 return 1;
179 }
180
181 /***********************************************************************
182 * lineDrop (TAPI32.@)
183 */
184 DWORD WINAPI lineDrop(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
185 {
186 FIXME("(%p, %s, %08x): stub.\n", hCall, lpsUserUserInfo, dwSize);
187 return 1;
188 }
189
190 /***********************************************************************
191 * lineForward (TAPI32.@)
192 */
193 DWORD WINAPI lineForwardA(HLINE hLine, DWORD bAllAddress, DWORD dwAddressID, LPLINEFORWARDLIST lpForwardList, DWORD dwNumRingsNoAnswer, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
194 {
195 FIXME("stub.\n");
196 return 1;
197 }
198
199 /***********************************************************************
200 * lineGatherDigits (TAPI32.@)
201 */
202 DWORD WINAPI lineGatherDigitsA(HCALL hCall, DWORD dwDigitModes, LPSTR lpsDigits, DWORD dwNumDigits, LPCSTR lpszTerminationDigits, DWORD dwFirstDigitTimeout, DWORD dwInterDigitTimeout)
203 {
204 FIXME("stub.\n");
205 return 0;
206 }
207
208 /***********************************************************************
209 * lineGenerateDigits (TAPI32.@)
210 */
211 DWORD WINAPI lineGenerateDigitsA(HCALL hCall, DWORD dwDigitModes, LPCSTR lpszDigits, DWORD dwDuration)
212 {
213 FIXME("(%p, %08x, %s, %d): stub.\n", hCall, dwDigitModes, lpszDigits, dwDuration);
214 return 0;
215 }
216
217 /***********************************************************************
218 * lineGenerateTone (TAPI32.@)
219 */
220 DWORD WINAPI lineGenerateTone(HCALL hCall, DWORD dwToneMode, DWORD dwDuration, DWORD dwNumTones, LPLINEGENERATETONE lpTones)
221 {
222 FIXME("(%p, %08x, %d, %d, %p): stub.\n", hCall, dwToneMode, dwDuration, dwNumTones, lpTones);
223 return 0;
224 }
225
226 /***********************************************************************
227 * lineGetAddressCaps (TAPI32.@)
228 */
229 DWORD WINAPI lineGetAddressCapsA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAddressID, DWORD dwAPIVersion, DWORD dwExtVersion, LPLINEADDRESSCAPS lpAddressCaps)
230 {
231 FIXME("(%p, %08x, %08x, %08x, %08x, %p): stub.\n", hLineApp, dwDeviceID, dwAddressID, dwAPIVersion, dwExtVersion, lpAddressCaps);
232 return 0;
233 }
234
235 /***********************************************************************
236 * lineGetAddressID (TAPI32.@)
237 */
238 DWORD WINAPI lineGetAddressIDA(HLINE hLine, LPDWORD lpdwAddressID, DWORD dwAddressMode, LPCSTR lpsAddress, DWORD dwSize)
239 {
240 FIXME("%p, %p, %08x, %s, %d): stub.\n", hLine, lpdwAddressID, dwAddressMode, lpsAddress, dwSize);
241 return 0;
242 }
243
244 /***********************************************************************
245 * lineGetAddressStatus (TAPI32.@)
246 */
247 DWORD WINAPI lineGetAddressStatusA(HLINE hLine, DWORD dwAddressID, LPLINEADDRESSSTATUS lpAddressStatus)
248 {
249 FIXME("(%p, %08x, %p): stub.\n", hLine, dwAddressID, lpAddressStatus);
250 return 0;
251 }
252
253 /***********************************************************************
254 * lineGetAppPriority (TAPI32.@)
255 */
256 DWORD WINAPI lineGetAppPriorityA(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPVARSTRING lpExtensionName, LPDWORD lpdwPriority)
257 {
258 FIXME("(%s, %08x, %p, %08x, %p, %p): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpExtensionName, lpdwPriority);
259 return 0;
260 }
261
262 /***********************************************************************
263 * lineGetCallInfo (TAPI32.@)
264 */
265 DWORD WINAPI lineGetCallInfoA(HCALL hCall, LPLINECALLINFO lpCallInfo)
266 {
267 FIXME("(%p, %p): stub.\n", hCall, lpCallInfo);
268 return 0;
269 }
270
271 /***********************************************************************
272 * lineGetCallStatus (TAPI32.@)
273 */
274 DWORD WINAPI lineGetCallStatus(HCALL hCall, LPLINECALLSTATUS lpCallStatus)
275 {
276 FIXME("(%p, %p): stub.\n", hCall, lpCallStatus);
277 return 0;
278 }
279
280 /***********************************************************************
281 * lineGetConfRelatedCalls (TAPI32.@)
282 */
283 DWORD WINAPI lineGetConfRelatedCalls(HCALL hCall, LPLINECALLLIST lpCallList)
284 {
285 FIXME("(%p, %p): stub.\n", hCall, lpCallList);
286 return 0;
287 }
288
289 typedef struct tagTAPI_CountryInfo
290 {
291 DWORD dwCountryID;
292 DWORD dwCountryCode;
293 LPSTR lpCountryName;
294 LPSTR lpSameAreaRule;
295 LPSTR lpLongDistanceRule;
296 LPSTR lpInternationalRule;
297 } TAPI_CountryInfo;
298
299 /***********************************************************************
300 * lineGetCountry (TAPI32.@)
301 */
302 DWORD WINAPI lineGetCountryA(DWORD dwCountryID, DWORD dwAPIVersion, LPLINECOUNTRYLIST lpLineCountryList)
303 {
304 DWORD dwAvailSize, dwOffset, i, num_countries, max_subkey_len;
305 LPLINECOUNTRYENTRY lpLCE;
306 HKEY hkey;
307 char *subkey_name;
308
309 if(!lpLineCountryList) {
310 TRACE("(%08x, %08x, %p): stub. Returning LINEERR_INVALPOINTER\n",
311 dwCountryID, dwAPIVersion, lpLineCountryList);
312 return LINEERR_INVALPOINTER;
313 }
314
315 TRACE("(%08x, %08x, %p(%d)): stub.\n",
316 dwCountryID, dwAPIVersion, lpLineCountryList,
317 lpLineCountryList->dwTotalSize);
318
319 if(RegOpenKeyA(HKEY_LOCAL_MACHINE, szCountrylistKey, &hkey)
320 != ERROR_SUCCESS)
321 return LINEERR_INIFILECORRUPT;
322
323
324 dwAvailSize = lpLineCountryList->dwTotalSize;
325 dwOffset = sizeof (LINECOUNTRYLIST);
326
327 if(dwAvailSize<dwOffset)
328 return LINEERR_STRUCTURETOOSMALL;
329
330 memset(lpLineCountryList, 0, dwAvailSize);
331
332 lpLineCountryList->dwTotalSize = dwAvailSize;
333 lpLineCountryList->dwUsedSize = dwOffset;
334 lpLineCountryList->dwNumCountries = 0;
335 lpLineCountryList->dwCountryListSize = 0;
336 lpLineCountryList->dwCountryListOffset = dwOffset;
337
338 lpLCE = (LPLINECOUNTRYENTRY)(&lpLineCountryList[1]);
339
340 if(RegQueryInfoKeyA(hkey, NULL, NULL, NULL, &num_countries, &max_subkey_len,
341 NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {
342 RegCloseKey(hkey);
343 return LINEERR_STRUCTURETOOSMALL;
344 }
345
346 if(dwCountryID)
347 dwOffset = sizeof (LINECOUNTRYENTRY);
348 else
349 dwOffset += num_countries * sizeof (LINECOUNTRYENTRY);
350
351 max_subkey_len++;
352 subkey_name = HeapAlloc(GetProcessHeap(), 0, max_subkey_len);
353 for(i = 0; i < num_countries; i++)
354 {
355 DWORD len, size, size_int, size_long, size_name, size_same;
356 HKEY hsubkey;
357
358 if(RegEnumKeyA(hkey, i, subkey_name, max_subkey_len) !=
359 ERROR_SUCCESS)
360 continue;
361
362 if(dwCountryID && (atoi(subkey_name) != dwCountryID))
363 continue;
364
365 if(RegOpenKeyA(hkey, subkey_name, &hsubkey) != ERROR_SUCCESS)
366 continue;
367
368 RegQueryValueExA(hsubkey, "InternationalRule", NULL, NULL,
369 NULL, &size_int);
370 len = size_int;
371
372 RegQueryValueExA(hsubkey, "LongDistanceRule", NULL, NULL,
373 NULL, &size_long);
374 len += size_long;
375
376 RegQueryValueExA(hsubkey, "Name", NULL, NULL,
377 NULL, &size_name);
378 len += size_name;
379
380 RegQueryValueExA(hsubkey, "SameAreaRule", NULL, NULL,
381 NULL, &size_same);
382 len += size_same;
383
384 if(dwAvailSize < (dwOffset+len))
385 {
386 dwOffset += len;
387 RegCloseKey(hsubkey);
388 if(dwCountryID)
389 break;
390 continue;
391 }
392
393 lpLineCountryList->dwNumCountries++;
394 lpLineCountryList->dwCountryListSize += sizeof (LINECOUNTRYENTRY);
395 lpLineCountryList->dwUsedSize += len + sizeof (LINECOUNTRYENTRY);
396
397 if(dwCountryID)
398 i = 0;
399
400 lpLCE[i].dwCountryID = atoi(subkey_name);
401 size = sizeof(DWORD);
402 RegQueryValueExA(hsubkey, "CountryCode", NULL, NULL,
403 (BYTE*)&lpLCE[i].dwCountryCode, &size);
404
405 lpLCE[i].dwNextCountryID = 0;
406
407 if(i > 0)
408 lpLCE[i-1].dwNextCountryID = lpLCE[i].dwCountryID;
409
410 /* add country name */
411 lpLCE[i].dwCountryNameSize = size_name;
412 lpLCE[i].dwCountryNameOffset = dwOffset;
413 RegQueryValueExA(hsubkey, "Name", NULL, NULL,
414 ((LPBYTE)lpLineCountryList)+dwOffset,
415 &size_name);
416 dwOffset += size_name;
417
418 /* add Same Area Rule */
419 lpLCE[i].dwSameAreaRuleSize = size_same;
420 lpLCE[i].dwSameAreaRuleOffset = dwOffset;
421 RegQueryValueExA(hsubkey, "SameAreaRule", NULL, NULL,
422 ((LPBYTE)lpLineCountryList)+dwOffset,
423 &size_same);
424 dwOffset += size_same;
425
426 /* add Long Distance Rule */
427 lpLCE[i].dwLongDistanceRuleSize = size_long;
428 lpLCE[i].dwLongDistanceRuleOffset = dwOffset;
429 RegQueryValueExA(hsubkey, "LongDistanceRule", NULL, NULL,
430 ((LPBYTE)lpLineCountryList)+dwOffset,
431 &size_long);
432 dwOffset += size_long;
433
434 /* add Long Distance Rule */
435 lpLCE[i].dwInternationalRuleSize = size_int;
436 lpLCE[i].dwInternationalRuleOffset = dwOffset;
437 RegQueryValueExA(hsubkey, "InternationalRule", NULL, NULL,
438 ((LPBYTE)lpLineCountryList)+dwOffset,
439 &size_int);
440 dwOffset += size_int;
441 RegCloseKey(hsubkey);
442
443 TRACE("Added country %s at %p\n", (LPSTR)lpLineCountryList + lpLCE[i].dwCountryNameOffset,
444 &lpLCE[i]);
445
446 if(dwCountryID) break;
447 }
448
449 lpLineCountryList->dwNeededSize = dwOffset;
450
451 TRACE("%d available %d required\n", dwAvailSize, dwOffset);
452
453 HeapFree(GetProcessHeap(), 0, subkey_name);
454 RegCloseKey(hkey);
455
456 return 0;
457 }
458
459 /***********************************************************************
460 * lineGetDevCaps (TAPI32.@)
461 */
462 DWORD WINAPI lineGetDevCapsA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, DWORD dwExtVersion, LPLINEDEVCAPS lpLineDevCaps)
463 {
464 FIXME("(%p, %08x, %08x, %08x, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, dwExtVersion, lpLineDevCaps);
465 return 0;
466 }
467
468 /***********************************************************************
469 * lineGetDevConfig (TAPI32.@)
470 */
471 DWORD WINAPI lineGetDevConfigA(DWORD dwDeviceID, LPVARSTRING lpDeviceConfig, LPCSTR lpszDeviceClass)
472 {
473 FIXME("(%08x, %p, %s): stub.\n", dwDeviceID, lpDeviceConfig, lpszDeviceClass);
474 return 0;
475 }
476
477 /***********************************************************************
478 * lineGetID (TAPI32.@)
479 */
480 DWORD WINAPI lineGetIDA(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, LPVARSTRING lpDeviceID, LPCSTR lpszDeviceClass)
481 {
482 FIXME("(%p, %08x, %p, %08x, %p, %s): stub.\n", hLine, dwAddressID, hCall, dwSelect, lpDeviceID, lpszDeviceClass);
483 return 0;
484 }
485
486 /***********************************************************************
487 * lineGetIcon (TAPI32.@)
488 */
489 DWORD WINAPI lineGetIconA(DWORD dwDeviceID, LPCSTR lpszDeviceClass, HICON *lphIcon)
490 {
491 FIXME("(%08x, %s, %p): stub.\n", dwDeviceID, lpszDeviceClass, lphIcon);
492 return 0;
493 }
494
495 /***********************************************************************
496 * lineGetLineDevStatus (TAPI32.@)
497 */
498 DWORD WINAPI lineGetLineDevStatusA(HLINE hLine, LPLINEDEVSTATUS lpLineDevStatus)
499 {
500 FIXME("(%p, %p): stub.\n", hLine, lpLineDevStatus);
501 return 0;
502 }
503
504 /***********************************************************************
505 * lineGetNewCalls (TAPI32.@)
506 */
507 DWORD WINAPI lineGetNewCalls(HLINE hLine, DWORD dwAddressID, DWORD dwSelect, LPLINECALLLIST lpCallList)
508 {
509 FIXME("(%p, %08x, %08x, %p): stub.\n", hLine, dwAddressID, dwSelect, lpCallList);
510 return 0;
511 }
512
513 /***********************************************************************
514 * lineGetNumRings (TAPI32.@)
515 */
516 DWORD WINAPI lineGetNumRings(HLINE hLine, DWORD dwAddressID, LPDWORD lpdwNumRings)
517 {
518 FIXME("(%p, %08x, %p): stub.\n", hLine, dwAddressID, lpdwNumRings);
519 return 0;
520 }
521
522 /***********************************************************************
523 * lineGetProviderList (TAPI32.@)
524 */
525 DWORD WINAPI lineGetProviderListA(DWORD dwAPIVersion, LPLINEPROVIDERLIST lpProviderList)
526 {
527 FIXME("(%08x, %p): stub.\n", dwAPIVersion, lpProviderList);
528 return 0;
529 }
530
531 /***********************************************************************
532 * lineGetRequest (TAPI32.@)
533 */
534 DWORD WINAPI lineGetRequestA(HLINEAPP hLineApp, DWORD dwRequestMode, LPVOID lpRequestBuffer)
535 {
536 FIXME("%p, %08x, %p): stub.\n", hLineApp, dwRequestMode, lpRequestBuffer);
537 return 0;
538 }
539
540 /***********************************************************************
541 * lineGetStatusMessages (TAPI32.@)
542 */
543 DWORD WINAPI lineGetStatusMessages(HLINE hLine, LPDWORD lpdwLineStatus, LPDWORD lpdwAddressStates)
544 {
545 FIXME("(%p, %p, %p): stub.\n", hLine, lpdwLineStatus, lpdwAddressStates);
546 return 0;
547 }
548
549 /***********************************************************************
550 * lineGetTranslateCaps (TAPI32.@)
551 *
552 * get address translate capabilities. Returns a LINETRANSLATECAPS
553 * structure:
554 *
555 * +-----------------------+
556 * |TotalSize |
557 * |NeededSize |
558 * |UsedSize |
559 * +-----------------------+
560 * |NumLocations |
561 * |LocationsListSize |
562 * |LocationsListOffset | -+
563 * |CurrentLocationID | |
564 * +-----------------------+ |
565 * |NumCards | |
566 * |CardListSize | |
567 * |CardListOffset | -|--+
568 * |CurrentPreferredCardID | | |
569 * +-----------------------+ | |
570 * | | <+ |
571 * |LINELOCATIONENTRY #1 | |
572 * | | |
573 * +-----------------------+ |
574 * ~ ~ |
575 * +-----------------------+ |
576 * | | |
577 * |LINELOCATIONENTRY | |
578 * | #NumLocations| |
579 * +-----------------------+ |
580 * | | <---+
581 * |LINECARDENTRY #1 |
582 * | |
583 * +-----------------------+
584 * ~ ~
585 * +-----------------------+
586 * | |
587 * |LINECARDENTRY #NumCards|
588 * | |
589 * +-----------------------+
590 * | room for strings named|
591 * | in the structures |
592 * | above. |
593 * +-----------------------+
594 */
595 DWORD WINAPI lineGetTranslateCapsA(HLINEAPP hLineApp, DWORD dwAPIVersion,
596 LPLINETRANSLATECAPS lpTranslateCaps)
597 {
598 HKEY hkLocations, hkCards, hkCardLocations, hsubkey;
599 int numlocations, numcards;
600 DWORD maxlockeylen,
601 maxcardkeylen;
602 char *loc_key_name = NULL;
603 char *card_key_name = NULL;
604 LPBYTE strptr;
605 int length;
606 int i;
607 DWORD lendword;
608 DWORD currentid;
609 LPLINELOCATIONENTRY pLocEntry;
610 LPLINECARDENTRY pCardEntry;
611
612 TRACE("(%p, %08x, %p (tot. size %d)\n", hLineApp, dwAPIVersion,
613 lpTranslateCaps, lpTranslateCaps->dwTotalSize );
614 if( lpTranslateCaps->dwTotalSize < sizeof(LINETRANSLATECAPS))
615 return LINEERR_STRUCTURETOOSMALL;
616 if( RegCreateKeyA(HKEY_LOCAL_MACHINE, szLocationsKey, &hkLocations)
617 != ERROR_SUCCESS ) {
618 ERR("unexpected registry error 1.\n");
619 return LINEERR_INIFILECORRUPT;
620 }
621 lendword = sizeof( DWORD);
622 if( RegQueryValueExA( hkLocations, "CurrentID", NULL, NULL,
623 (LPBYTE) &currentid, &lendword) != ERROR_SUCCESS )
624 currentid = -1; /* change this later */
625 if(RegQueryInfoKeyA(hkLocations, NULL, NULL, NULL, NULL, &maxlockeylen,
626 NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {
627 RegCloseKey(hkLocations);
628 ERR("unexpected registry error 2.\n");
629 return LINEERR_INIFILECORRUPT;
630 }
631 maxlockeylen++;
632 if( maxlockeylen < 10)
633 maxlockeylen = 10; /* need this also if there is no key */
634 loc_key_name = HeapAlloc( GetProcessHeap(), 0, maxlockeylen);
635 /* first time through: calculate needed space */
636 length=0;
637 i=0;
638 numlocations=0;
639 while( RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen)
640 == ERROR_SUCCESS){
641 DWORD size_val;
642 i++;
643 if( strncasecmp(loc_key_name, "location", 8) ||
644 (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey)
645 != ERROR_SUCCESS))
646 continue;
647 numlocations++;
648 length += sizeof(LINELOCATIONENTRY);
649 RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val);
650 length += size_val;
651 RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL,NULL,&size_val);
652 length += size_val;
653 RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL,NULL,&size_val);
654 length += size_val;
655 RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL,NULL,&size_val);
656 length += size_val;
657 RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL,NULL,&size_val);
658 length += size_val;
659 /* fixme: what about TollPrefixList???? */
660 RegCloseKey(hsubkey);
661 }
662 if(numlocations == 0) {
663 /* add one location */
664 if( RegCreateKeyA( hkLocations, "Location1", &hsubkey)
665 == ERROR_SUCCESS) {
666 DWORD dwval;
667 char buf[10];
668 numlocations = 1;
669 length += sizeof(LINELOCATIONENTRY) + 20 ;
670 RegSetValueExA( hsubkey, "AreaCode", 0, REG_SZ, (const BYTE *)"010", 4);
671 GetLocaleInfoA( LOCALE_SYSTEM_DEFAULT, LOCALE_ICOUNTRY, buf, 8);
672 dwval = atoi(buf);
673 RegSetValueExA( hsubkey, "Country", 0, REG_DWORD, (LPBYTE)&dwval,
674 sizeof(DWORD));
675 RegSetValueExA( hsubkey, "DisableCallWaiting", 0, REG_SZ, (const BYTE *)"", 1);
676 dwval = 1;
677 RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval,
678 sizeof(DWORD));
679 RegSetValueExA( hsubkey, "LongDistanceAccess", 0, REG_SZ, (const BYTE *)"", 1);
680 RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (const BYTE *)"New Location", 13);
681 RegSetValueExA( hsubkey, "OutsideAccess", 0, REG_SZ, (const BYTE *)"", 1);
682 RegCloseKey(hsubkey);
683 dwval = 1;
684 RegSetValueExA( hkLocations, "CurrentID", 0, REG_DWORD,
685 (LPBYTE)&dwval, sizeof(DWORD));
686 dwval = 2;
687 RegSetValueExA( hkLocations, "NextID", 0, REG_DWORD, (LPBYTE)&dwval,
688 sizeof(DWORD));
689 }
690 }
691 /* do the card list */
692 numcards=0;
693 if( RegCreateKeyA(HKEY_CURRENT_USER, szCardsKey, &hkCards)
694 == ERROR_SUCCESS ) {
695 if(RegQueryInfoKeyA(hkCards, NULL, NULL, NULL, NULL, &maxcardkeylen,
696 NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
697 maxcardkeylen++;
698 if( maxcardkeylen < 6) maxcardkeylen = 6;
699 card_key_name = HeapAlloc(GetProcessHeap(), 0, maxcardkeylen);
700 i=0;
701 while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) ==
702 ERROR_SUCCESS){
703 DWORD size_val;
704 i++;
705 if( strncasecmp(card_key_name, "card", 4) || ERROR_SUCCESS !=
706 (RegOpenKeyA(hkCards, card_key_name, &hsubkey) ))
707 continue;
708 numcards++;
709 length += sizeof(LINECARDENTRY);
710 RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val);
711 length += size_val;
712 RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL,NULL,&size_val);
713 length += size_val;
714 RegQueryValueExA(hsubkey, "LDRule",NULL,NULL,NULL,&size_val);
715 length += size_val;
716 RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL,NULL,
717 &size_val);
718 length += size_val;
719 RegCloseKey(hsubkey);
720 }
721 }
722 /* add one card (direct call) */
723 if (numcards == 0 &&
724 ERROR_SUCCESS == RegCreateKeyA( hkCards, "Card1", &hsubkey)) {
725 DWORD dwval;
726 numcards = 1;
727 length += sizeof(LINECARDENTRY) + 22 ;
728 RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (const BYTE *)"None (Direct Call)", 19);
729 dwval = 1;
730 RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval,
731 sizeof(DWORD));
732 RegSetValueExA( hsubkey, "InternationalRule", 0, REG_SZ, (const BYTE *)"", 1);
733 RegSetValueExA( hsubkey, "LDRule", 0, REG_SZ, (const BYTE *)"", 1);
734 RegSetValueExA( hsubkey, "LocalRule", 0, REG_SZ, (const BYTE *)"", 1);
735 RegCloseKey(hsubkey);
736 dwval = 2;
737 RegSetValueExA( hkCards, "NextID", 0, REG_DWORD, (LPBYTE)&dwval,
738 sizeof(DWORD));
739 }
740 } else hkCards = 0; /* should really fail */
741 /* check if sufficient room is available */
742 lpTranslateCaps->dwNeededSize = sizeof(LINETRANSLATECAPS) + length;
743 if ( lpTranslateCaps->dwNeededSize > lpTranslateCaps->dwTotalSize ) {
744 RegCloseKey( hkLocations);
745 if( hkCards) RegCloseKey( hkCards);
746 HeapFree(GetProcessHeap(), 0, loc_key_name);
747 HeapFree(GetProcessHeap(), 0, card_key_name);
748 lpTranslateCaps->dwUsedSize = sizeof(LINETRANSLATECAPS);
749 TRACE("Insufficient space: total %d needed %d used %d\n",
750 lpTranslateCaps->dwTotalSize,
751 lpTranslateCaps->dwNeededSize,
752 lpTranslateCaps->dwUsedSize);
753 return 0;
754 }
755 /* fill in the LINETRANSLATECAPS structure */
756 lpTranslateCaps->dwUsedSize = lpTranslateCaps->dwNeededSize;
757 lpTranslateCaps->dwNumLocations = numlocations;
758 lpTranslateCaps->dwLocationListSize = sizeof(LINELOCATIONENTRY) *
759 lpTranslateCaps->dwNumLocations;
760 lpTranslateCaps->dwLocationListOffset = sizeof(LINETRANSLATECAPS);
761 lpTranslateCaps->dwCurrentLocationID = currentid;
762 lpTranslateCaps->dwNumCards = numcards;
763 lpTranslateCaps->dwCardListSize = sizeof(LINECARDENTRY) *
764 lpTranslateCaps->dwNumCards;
765 lpTranslateCaps->dwCardListOffset = lpTranslateCaps->dwLocationListOffset +
766 lpTranslateCaps->dwLocationListSize;
767 lpTranslateCaps->dwCurrentPreferredCardID = 0;
768 /* this is where the strings will be stored */
769 strptr = ((LPBYTE) lpTranslateCaps) +
770 lpTranslateCaps->dwCardListOffset + lpTranslateCaps->dwCardListSize;
771 pLocEntry = (LPLINELOCATIONENTRY) (lpTranslateCaps + 1);
772 /* key with Preferred CardID's */
773 if( RegOpenKeyA(HKEY_CURRENT_USER, szLocationsKey, &hkCardLocations)
774 != ERROR_SUCCESS )
775 hkCardLocations = 0;
776 /* second time through all locations */
777 i=0;
778 while(RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen)
779 == ERROR_SUCCESS){
780 DWORD size_val;
781 i++;
782 if( strncasecmp(loc_key_name, "location", 8) ||
783 (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey)
784 != ERROR_SUCCESS))
785 continue;
786 size_val=sizeof(DWORD);
787 if( RegQueryValueExA(hsubkey, "ID",NULL, NULL,
788 (LPBYTE) &(pLocEntry->dwPermanentLocationID), &size_val) !=
789 ERROR_SUCCESS)
790 pLocEntry->dwPermanentLocationID = atoi( loc_key_name + 8);
791 size_val=2048;
792 RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val);
793 pLocEntry->dwLocationNameSize = size_val;
794 pLocEntry->dwLocationNameOffset = strptr - (LPBYTE) lpTranslateCaps;
795 strptr += size_val;
796
797 size_val=2048;
798 RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL, strptr, &size_val);
799 pLocEntry->dwCityCodeSize = size_val;
800 pLocEntry->dwCityCodeOffset = strptr - (LPBYTE) lpTranslateCaps;
801 strptr += size_val;
802
803 size_val=2048;
804 RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL, strptr, &size_val);
805 pLocEntry->dwLocalAccessCodeSize = size_val;
806 pLocEntry->dwLocalAccessCodeOffset = strptr - (LPBYTE) lpTranslateCaps;
807 strptr += size_val;
808 size_val=2048;
809 RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL, strptr,
810 &size_val);
811 pLocEntry->dwLongDistanceAccessCodeSize= size_val;
812 pLocEntry->dwLongDistanceAccessCodeOffset= strptr -
813 (LPBYTE) lpTranslateCaps;
814 strptr += size_val;
815 size_val=2048;
816 RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL, strptr,
817 &size_val);
818 pLocEntry->dwCancelCallWaitingSize= size_val;
819 pLocEntry->dwCancelCallWaitingOffset= strptr - (LPBYTE) lpTranslateCaps;
820 strptr += size_val;
821
822 pLocEntry->dwTollPrefixListSize = 0; /* FIXME */
823 pLocEntry->dwTollPrefixListOffset = 0; /* FIXME */
824
825 size_val=sizeof(DWORD);
826 RegQueryValueExA(hsubkey, "Country",NULL,NULL,
827 (LPBYTE) &(pLocEntry->dwCountryCode), &size_val);
828 pLocEntry->dwCountryID = pLocEntry->dwCountryCode; /* FIXME */
829 RegQueryValueExA(hsubkey, "Flags",NULL,NULL,
830 (LPBYTE) &(pLocEntry->dwOptions), &size_val);
831 RegCloseKey(hsubkey);
832 /* get preferred cardid */
833 pLocEntry->dwPreferredCardID = 0;
834 if ( hkCardLocations) {
835 size_val=sizeof(DWORD);
836 if(RegOpenKeyA(hkCardLocations, loc_key_name, &hsubkey) ==
837 ERROR_SUCCESS) {
838 RegQueryValueExA(hsubkey, "CallingCard",NULL,NULL,
839 (LPBYTE) &(pLocEntry->dwPreferredCardID), &size_val);
840 RegCloseKey(hsubkey);
841 }
842
843 }
844 /* make sure there is a currentID */
845 if(currentid == -1){
846 currentid = pLocEntry->dwPermanentLocationID;
847 lpTranslateCaps->dwCurrentLocationID = currentid;
848 }
849 if(pLocEntry->dwPermanentLocationID == currentid )
850 lpTranslateCaps->dwCurrentPreferredCardID =
851 pLocEntry->dwPreferredCardID;
852 TRACE("added: ID %d %s CountryCode %d CityCode %s CardID %d "
853 "LocalAccess: %s LongDistanceAccess: %s CountryID %d "
854 "Options %d CancelCallWait %s\n",
855 pLocEntry->dwPermanentLocationID,
856 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocationNameOffset),
857 pLocEntry->dwCountryCode,
858 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCityCodeOffset),
859 pLocEntry->dwPreferredCardID,
860 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocalAccessCodeOffset),
861 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLongDistanceAccessCodeOffset),
862 pLocEntry->dwCountryID,
863 pLocEntry->dwOptions,
864 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCancelCallWaitingOffset));
865 pLocEntry++;
866 }
867 pCardEntry= (LPLINECARDENTRY) pLocEntry;
868 /* do the card list */
869 if( hkCards) {
870 i=0;
871 while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) ==
872 ERROR_SUCCESS){
873 DWORD size_val;
874 i++;
875 if( strncasecmp(card_key_name, "card", 4) ||
876 (RegOpenKeyA(hkCards, card_key_name, &hsubkey) != ERROR_SUCCESS))
877 continue;
878 size_val=sizeof(DWORD);
879 if( RegQueryValueExA(hsubkey, "ID",NULL, NULL,
880 (LPBYTE) &(pCardEntry->dwPermanentCardID), &size_val) !=
881 ERROR_SUCCESS)
882 pCardEntry->dwPermanentCardID= atoi( card_key_name + 4);
883 size_val=2048;
884 RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val);
885 pCardEntry->dwCardNameSize = size_val;
886 pCardEntry->dwCardNameOffset = strptr - (LPBYTE) lpTranslateCaps;
887 strptr += size_val;
888 pCardEntry->dwCardNumberDigits = 1; /* FIXME */
889 size_val=2048;
890 RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL, strptr, &size_val);
891 pCardEntry->dwSameAreaRuleSize= size_val;
892 pCardEntry->dwSameAreaRuleOffset= strptr - (LPBYTE) lpTranslateCaps;
893 strptr += size_val;
894 size_val=2048;
895 RegQueryValueExA(hsubkey, "LDRule",NULL,NULL, strptr, &size_val);
896 pCardEntry->dwLongDistanceRuleSize = size_val;
897 pCardEntry->dwLongDistanceRuleOffset = strptr - (LPBYTE) lpTranslateCaps;
898 strptr += size_val;
899 size_val=2048;
900 RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL, strptr,
901 &size_val);
902 pCardEntry->dwInternationalRuleSize = size_val;
903 pCardEntry->dwInternationalRuleOffset = strptr -
904 (LPBYTE) lpTranslateCaps;
905 strptr += size_val;
906 size_val=sizeof(DWORD);
907 RegQueryValueExA(hsubkey, "Flags",NULL, NULL,
908 (LPBYTE) &(pCardEntry->dwOptions), &size_val);
909 TRACE( "added card: ID %d name %s SameArea %s LongDistance %s International %s Options 0x%x\n",
910 pCardEntry->dwPermanentCardID,
911 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwCardNameOffset),
912 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwSameAreaRuleOffset),
913 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwLongDistanceRuleOffset),
914 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwInternationalRuleOffset),
915 pCardEntry->dwOptions);
916
917 pCardEntry++;
918 }
919 }
920
921 if(hkLocations) RegCloseKey(hkLocations);
922 if(hkCards) RegCloseKey(hkCards);
923 if(hkCardLocations) RegCloseKey(hkCardLocations);
924 HeapFree(GetProcessHeap(), 0, loc_key_name);
925 HeapFree(GetProcessHeap(), 0, card_key_name);
926 TRACE(" returning success tot %d needed %d used %d\n",
927 lpTranslateCaps->dwTotalSize,
928 lpTranslateCaps->dwNeededSize,
929 lpTranslateCaps->dwUsedSize );
930 return 0; /* success */
931 }
932
933 /***********************************************************************
934 * lineHandoff (TAPI32.@)
935 */
936 DWORD WINAPI lineHandoffA(HCALL hCall, LPCSTR lpszFileName, DWORD dwMediaMode)
937 {
938 FIXME("(%p, %s, %08x): stub.\n", hCall, lpszFileName, dwMediaMode);
939 return 0;
940 }
941
942 /***********************************************************************
943 * lineHold (TAPI32.@)
944 */
945 DWORD WINAPI lineHold(HCALL hCall)
946 {
947 FIXME("(%p): stub.\n", hCall);
948 return 1;
949 }
950
951 /***********************************************************************
952 * lineInitialize (TAPI32.@)
953 */
954 DWORD WINAPI lineInitialize(
955 LPHLINEAPP lphLineApp,
956 HINSTANCE hInstance,
957 LINECALLBACK lpfnCallback,
958 LPCSTR lpszAppName,
959 LPDWORD lpdwNumDevs)
960 {
961 FIXME("(%p, %p, %p, %s, %p): stub.\n", lphLineApp, hInstance,
962 lpfnCallback, debugstr_a(lpszAppName), lpdwNumDevs);
963 return 0;
964 }
965
966 /***********************************************************************
967 * lineInitializeExA (TAPI32.@)
968 */
969 LONG WINAPI lineInitializeExA(LPHLINEAPP lphLineApp, HINSTANCE hInstance, LINECALLBACK lpfnCallback, LPCSTR lpszFriendlyAppName, LPDWORD lpdwNumDevs, LPDWORD lpdwAPIVersion, LPLINEINITIALIZEEXPARAMS lpLineInitializeExParams)
970 {
971 FIXME("(%p, %p, %p, %s, %p, %p, %p): stub.\n", lphLineApp, hInstance,
972 lpfnCallback, debugstr_a(lpszFriendlyAppName), lpdwNumDevs, lpdwAPIVersion, lpLineInitializeExParams);
973 return 0;
974 }
975
976 /***********************************************************************
977 * lineMakeCall (TAPI32.@)
978 */
979 DWORD WINAPI lineMakeCallA(HLINE hLine, LPHCALL lphCall, LPCSTR lpszDestAddress, DWORD dwCountryCode, LPLINECALLPARAMS lpCallParams)
980 {
981 FIXME("(%p, %p, %s, %08x, %p): stub.\n", hLine, lphCall, lpszDestAddress, dwCountryCode, lpCallParams);
982 return 1;
983 }
984
985 /***********************************************************************
986 * lineMonitorDigits (TAPI32.@)
987 */
988 DWORD WINAPI lineMonitorDigits(HCALL hCall, DWORD dwDigitModes)
989 {
990 FIXME("(%p, %08x): stub.\n", hCall, dwDigitModes);
991 return 0;
992 }
993
994 /***********************************************************************
995 * lineMonitorMedia (TAPI32.@)
996 */
997 DWORD WINAPI lineMonitorMedia(HCALL hCall, DWORD dwMediaModes)
998 {
999 FIXME("(%p, %08x): stub.\n", hCall, dwMediaModes);
1000 return 0;
1001 }
1002
1003 /***********************************************************************
1004 * lineMonitorTones (TAPI32.@)
1005 */
1006 DWORD WINAPI lineMonitorTones(HCALL hCall, LPLINEMONITORTONE lpToneList, DWORD dwNumEntries)
1007 {
1008 FIXME("(%p, %p, %08x): stub.\n", hCall, lpToneList, dwNumEntries);
1009 return 0;
1010 }
1011
1012 /***********************************************************************
1013 * lineNegotiateAPIVersion (TAPI32.@)
1014 */
1015 DWORD WINAPI lineNegotiateAPIVersion(
1016 HLINEAPP hLineApp,
1017 DWORD dwDeviceID,
1018 DWORD dwAPILowVersion,
1019 DWORD dwAPIHighVersion,
1020 LPDWORD lpdwAPIVersion,
1021 LPLINEEXTENSIONID lpExtensionID
1022 )
1023 {
1024 FIXME("(%p, %d, %d, %d, %p, %p): stub.\n", hLineApp, dwDeviceID,
1025 dwAPILowVersion, dwAPIHighVersion, lpdwAPIVersion, lpExtensionID);
1026 *lpdwAPIVersion = dwAPIHighVersion;
1027 return 0;
1028 }
1029
1030 /***********************************************************************
1031 * lineNegotiateExtVersion (TAPI32.@)
1032 */
1033 DWORD WINAPI lineNegotiateExtVersion(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, DWORD dwExtLowVersion, DWORD dwExtHighVersion, LPDWORD lpdwExtVersion)
1034 {
1035 FIXME("stub.\n");
1036 return 0;
1037 }
1038
1039 /***********************************************************************
1040 * lineOpen (TAPI32.@)
1041 */
1042 DWORD WINAPI lineOpenA(HLINEAPP hLineApp, DWORD dwDeviceID, LPHLINE lphLine, DWORD dwAPIVersion, DWORD dwExtVersion, DWORD dwCallbackInstance, DWORD dwPrivileges, DWORD dwMediaModes, LPLINECALLPARAMS lpCallParams)
1043 {
1044 FIXME("stub.\n");
1045 return 0;
1046 }
1047
1048 /***********************************************************************
1049 * linePark (TAPI32.@)
1050 */
1051 DWORD WINAPI lineParkA(HCALL hCall, DWORD dwParkMode, LPCSTR lpszDirAddress, LPVARSTRING lpNonDirAddress)
1052 {
1053 FIXME("(%p, %08x, %s, %p): stub.\n", hCall, dwParkMode, lpszDirAddress, lpNonDirAddress);
1054 return 1;
1055 }
1056
1057 /***********************************************************************
1058 * linePickup (TAPI32.@)
1059 */
1060 DWORD WINAPI linePickupA(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress, LPCSTR lpszGroupID)
1061 {
1062 FIXME("(%p, %08x, %p, %s, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress, lpszGroupID);
1063 return 1;
1064 }
1065
1066 /***********************************************************************
1067 * linePrepareAddToConference (TAPI32.@)
1068 */
1069 DWORD WINAPI linePrepareAddToConferenceA(HCALL hConfCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
1070 {
1071 FIXME("(%p, %p, %p): stub.\n", hConfCall, lphConsultCall, lpCallParams);
1072 return 1;
1073 }
1074
1075 /***********************************************************************
1076 * lineRedirect (TAPI32.@)
1077 */
1078 DWORD WINAPI lineRedirectA(
1079 HCALL hCall,
1080 LPCSTR lpszDestAddress,
1081 DWORD dwCountryCode) {
1082
1083 FIXME(": stub.\n");
1084 return 1;
1085 }
1086
1087 /***********************************************************************
1088 * lineRegisterRequestRecipient (TAPI32.@)
1089 */
1090 DWORD WINAPI lineRegisterRequestRecipient(HLINEAPP hLineApp, DWORD dwRegistrationInstance, DWORD dwRequestMode, DWORD dwEnable)
1091 {
1092 FIXME("(%p, %08x, %08x, %08x): stub.\n", hLineApp, dwRegistrationInstance, dwRequestMode, dwEnable);
1093 return 1;
1094 }
1095
1096 /***********************************************************************
1097 * lineReleaseUserUserInfo (TAPI32.@)
1098 */
1099 DWORD WINAPI lineReleaseUserUserInfo(HCALL hCall)
1100 {
1101 FIXME("(%p): stub.\n", hCall);
1102 return 1;
1103 }
1104
1105 /***********************************************************************
1106 * lineRemoveFromConference (TAPI32.@)
1107 */
1108 DWORD WINAPI lineRemoveFromConference(HCALL hCall)
1109 {
1110 FIXME("(%p): stub.\n", hCall);
1111 return 1;
1112 }
1113
1114 /***********************************************************************
1115 * lineRemoveProvider (TAPI32.@)
1116 */
1117 DWORD WINAPI lineRemoveProvider(DWORD dwPermanentProviderID, HWND hwndOwner)
1118 {
1119 FIXME("(%08x, %p): stub.\n", dwPermanentProviderID, hwndOwner);
1120 return 1;
1121 }
1122
1123 /***********************************************************************
1124 * lineSecureCall (TAPI32.@)
1125 */
1126 DWORD WINAPI lineSecureCall(HCALL hCall)
1127 {
1128 FIXME("(%p): stub.\n", hCall);
1129 return 1;
1130 }
1131
1132 /***********************************************************************
1133 * lineSendUserUserInfo (TAPI32.@)
1134 */
1135 DWORD WINAPI lineSendUserUserInfo(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
1136 {
1137 FIXME("(%p, %s, %08x): stub.\n", hCall, lpsUserUserInfo, dwSize);
1138 return 1;
1139 }
1140
1141 /***********************************************************************
1142 * lineSetAppPriority (TAPI32.@)
1143 */
1144 DWORD WINAPI lineSetAppPriorityA(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPCSTR lpszExtensionName, DWORD dwPriority)
1145 {
1146 FIXME("(%s, %08x, %p, %08x, %s, %08x): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpszExtensionName, dwPriority);
1147 return 0;
1148 }
1149
1150 /***********************************************************************
1151 * lineSetAppSpecific (TAPI32.@)
1152 */
1153 DWORD WINAPI lineSetAppSpecific(HCALL hCall, DWORD dwAppSpecific)
1154 {
1155 FIXME("(%p, %08x): stub.\n", hCall, dwAppSpecific);
1156 return 0;
1157 }
1158
1159 /***********************************************************************
1160 * lineSetCallParams (TAPI32.@)
1161 */
1162 DWORD WINAPI lineSetCallParams(HCALL hCall, DWORD dwBearerMode, DWORD dwMinRate, DWORD dwMaxRate, LPLINEDIALPARAMS lpDialParams)
1163 {
1164 FIXME("(%p, %08x, %08x, %08x, %p): stub.\n", hCall, dwBearerMode, dwMinRate, dwMaxRate, lpDialParams);
1165 return 1;
1166 }
1167
1168 /***********************************************************************
1169 * lineSetCallPrivilege (TAPI32.@)
1170 */
1171 DWORD WINAPI lineSetCallPrivilege(HCALL hCall, DWORD dwCallPrivilege)
1172 {
1173 FIXME("(%p, %08x): stub.\n", hCall, dwCallPrivilege);
1174 return 0;
1175 }
1176
1177 /***********************************************************************
1178 * lineSetCurrentLocation (TAPI32.@)
1179 */
1180 DWORD WINAPI lineSetCurrentLocation(HLINEAPP hLineApp, DWORD dwLocation)
1181 {
1182 FIXME("(%p, %08x): stub.\n", hLineApp, dwLocation);
1183 return 0;
1184 }
1185
1186 /***********************************************************************
1187 * lineSetDevConfig (TAPI32.@)
1188 */
1189 DWORD WINAPI lineSetDevConfigA(DWORD dwDeviceID, LPVOID lpDeviceConfig, DWORD dwSize, LPCSTR lpszDeviceClass)
1190 {
1191 FIXME("(%08x, %p, %08x, %s): stub.\n", dwDeviceID, lpDeviceConfig, dwSize, lpszDeviceClass);
1192 return 0;
1193 }
1194
1195 /***********************************************************************
1196 * lineSetMediaControl (TAPI32.@)
1197 */
1198 DWORD WINAPI lineSetMediaControl(
1199 HLINE hLine,
1200 DWORD dwAddressID,
1201 HCALL hCall,
1202 DWORD dwSelect,
1203 LPLINEMEDIACONTROLDIGIT const lpDigitList,
1204 DWORD dwDigitNumEntries,
1205 LPLINEMEDIACONTROLMEDIA const lpMediaList,
1206 DWORD dwMediaNumEntries,
1207 LPLINEMEDIACONTROLTONE const lpToneList,
1208 DWORD dwToneNumEntries,
1209 LPLINEMEDIACONTROLCALLSTATE const lpCallStateList,
1210 DWORD dwCallStateNumEntries)
1211 {
1212 FIXME(": stub.\n");
1213 return 0;
1214 }
1215
1216 /***********************************************************************
1217 * lineSetMediaMode (TAPI32.@)
1218 */
1219 DWORD WINAPI lineSetMediaMode(HCALL hCall, DWORD dwMediaModes)
1220 {
1221 FIXME("(%p, %08x): stub.\n", hCall, dwMediaModes);
1222 return 0;
1223 }
1224
1225 /***********************************************************************
1226 * lineSetNumRings (TAPI32.@)
1227 */
1228 DWORD WINAPI lineSetNumRings(HLINE hLine, DWORD dwAddressID, DWORD dwNumRings)
1229 {
1230 FIXME("(%p, %08x, %08x): stub.\n", hLine, dwAddressID, dwNumRings);
1231 return 0;
1232 }
1233
1234 /***********************************************************************
1235 * lineSetStatusMessages (TAPI32.@)
1236 */
1237 DWORD WINAPI lineSetStatusMessages(HLINE hLine, DWORD dwLineStates, DWORD dwAddressStates)
1238 {
1239 FIXME("(%p, %08x, %08x): stub.\n", hLine, dwLineStates, dwAddressStates);
1240 return 0;
1241 }
1242
1243 /***********************************************************************
1244 * lineSetTerminal (TAPI32.@)
1245 */
1246 DWORD WINAPI lineSetTerminal(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, DWORD dwTerminalModes, DWORD dwTerminalID, DWORD bEnable)
1247 {
1248 FIXME("(%p, %08x, %p, %08x, %08x, %08x, %08x): stub.\n", hLine, dwAddressID, hCall, dwSelect, dwTerminalModes, dwTerminalID, bEnable);
1249 return 1;
1250 }
1251
1252 /***********************************************************************
1253 * lineSetTollList (TAPI32.@)
1254 */
1255 DWORD WINAPI lineSetTollListA(HLINEAPP hLineApp, DWORD dwDeviceID, LPCSTR lpszAddressIn, DWORD dwTollListOption)
1256 {
1257 FIXME("(%p, %08x, %s, %08x): stub.\n", hLineApp, dwDeviceID, lpszAddressIn, dwTollListOption);
1258 return 0;
1259 }
1260
1261 /***********************************************************************
1262 * lineSetupConference (TAPI32.@)
1263 */
1264 DWORD WINAPI lineSetupConferenceA(HCALL hCall, HLINE hLine, LPHCALL lphConfCall, LPHCALL lphConsultCall, DWORD dwNumParties, LPLINECALLPARAMS lpCallParams)
1265 {
1266 FIXME("(%p, %p, %p, %p, %08x, %p): stub.\n", hCall, hLine, lphConfCall, lphConsultCall, dwNumParties, lpCallParams);
1267 return 1;
1268 }
1269
1270 /***********************************************************************
1271 * lineSetupTransfer (TAPI32.@)
1272 */
1273 DWORD WINAPI lineSetupTransferA(HCALL hCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
1274 {
1275 FIXME("(%p, %p, %p): stub.\n", hCall, lphConsultCall, lpCallParams);
1276 return 1;
1277 }
1278
1279 /***********************************************************************
1280 * lineShutdown (TAPI32.@)
1281 */
1282 DWORD WINAPI lineShutdown(HLINEAPP hLineApp)
1283 {
1284 FIXME("(%p): stub.\n", hLineApp);
1285 return 0;
1286 }
1287
1288 /***********************************************************************
1289 * lineSwapHold (TAPI32.@)
1290 */
1291 DWORD WINAPI lineSwapHold(HCALL hActiveCall, HCALL hHeldCall)
1292 {
1293 FIXME("(active: %p, held: %p): stub.\n", hActiveCall, hHeldCall);
1294 return 1;
1295 }
1296
1297 /***********************************************************************
1298 * lineTranslateAddress (TAPI32.@)
1299 */
1300 DWORD WINAPI lineTranslateAddressA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, LPCSTR lpszAddressIn, DWORD dwCard, DWORD dwTranslateOptions, LPLINETRANSLATEOUTPUT lpTranslateOutput)
1301 {
1302 FIXME("(%p, %08x, %08x, %s, %08x, %08x, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, lpszAddressIn, dwCard, dwTranslateOptions, lpTranslateOutput);
1303 return 0;
1304 }
1305
1306 /***********************************************************************
1307 * lineTranslateDialog (TAPI32.@)
1308 */
1309 DWORD WINAPI lineTranslateDialogA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, HWND hwndOwner, LPCSTR lpszAddressIn)
1310 {
1311 FIXME("(%p, %08x, %08x, %p, %s): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, hwndOwner, lpszAddressIn);
1312 return 0;
1313 }
1314
1315 /***********************************************************************
1316 * lineUncompleteCall (TAPI32.@)
1317 */
1318 DWORD WINAPI lineUncompleteCall(HLINE hLine, DWORD dwCompletionID)
1319 {
1320 FIXME("(%p, %08x): stub.\n", hLine, dwCompletionID);
1321 return 1;
1322 }
1323
1324 /***********************************************************************
1325 * lineUnhold (TAPI32.@)
1326 */
1327 DWORD WINAPI lineUnhold(HCALL hCall)
1328 {
1329 FIXME("(%p): stub.\n", hCall);
1330 return 1;
1331 }
1332
1333 /***********************************************************************
1334 * lineUnpark (TAPI32.@)
1335 */
1336 DWORD WINAPI lineUnparkA(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress)
1337 {
1338 FIXME("(%p, %08x, %p, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress);
1339 return 1;
1340 }