4 * Copyright 1999 Andreas Mohr
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.
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.
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
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(tapi);
36 static const char szCountrylistKey[] =
37 "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Country List";
38 static const char szLocationsKey[] =
39 "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Locations";
40 static const char szCardsKey[] =
41 "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Cards";
44 /***********************************************************************
45 * lineAccept (TAPI32.@)
47 DWORD WINAPI lineAccept(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
49 FIXME("(%p, %s, %ld): stub.\n", hCall, lpsUserUserInfo, dwSize);
53 /***********************************************************************
54 * lineAddProvider (TAPI32.@)
56 DWORD WINAPI lineAddProviderA(LPCSTR lpszProviderName, HWND hwndOwner, LPDWORD lpdwPermanentProviderID)
58 FIXME("(%s, %p, %p): stub.\n", lpszProviderName, hwndOwner, lpdwPermanentProviderID);
62 /***********************************************************************
63 * lineAddToConference (TAPI32.@)
65 DWORD WINAPI lineAddToConference(HCALL hConfCall, HCALL hConsultCall)
67 FIXME("(%p, %p): stub.\n", hConfCall, hConsultCall);
71 /***********************************************************************
72 * lineAnswer (TAPI32.@)
74 DWORD WINAPI lineAnswer(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
76 FIXME("(%p, %s, %ld): stub.\n", hCall, lpsUserUserInfo, dwSize);
80 /***********************************************************************
81 * lineBlindTransfer (TAPI32.@)
83 DWORD WINAPI lineBlindTransferA(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
85 FIXME("(%p, %s, %08lx): stub.\n", hCall, lpszDestAddress, dwCountryCode);
89 /***********************************************************************
90 * lineClose (TAPI32.@)
92 DWORD WINAPI lineClose(HLINE hLine)
94 FIXME("(%p): stub.\n", hLine);
98 /***********************************************************************
99 * lineCompleteCall (TAPI32.@)
101 DWORD WINAPI lineCompleteCall(HCALL hCall, LPDWORD lpdwCompletionID, DWORD dwCompletionMode, DWORD dwMessageID)
103 FIXME("(%p, %p, %08lx, %08lx): stub.\n", hCall, lpdwCompletionID, dwCompletionMode, dwMessageID);
107 /***********************************************************************
108 * lineCompleteTransfer (TAPI32.@)
110 DWORD WINAPI lineCompleteTransfer(HCALL hCall, HCALL hConsultCall, LPHCALL lphConfCall, DWORD dwTransferMode)
112 FIXME("(%p, %p, %p, %08lx): stub.\n", hCall, hConsultCall, lphConfCall, dwTransferMode);
116 /***********************************************************************
117 * lineConfigDialog (TAPI32.@)
119 DWORD WINAPI lineConfigDialogA(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass)
121 FIXME("(%08lx, %p, %s): stub.\n", dwDeviceID, hwndOwner, lpszDeviceClass);
125 /***********************************************************************
126 * lineConfigDialogEdit (TAPI32.@)
128 DWORD WINAPI lineConfigDialogEditA(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass, LPVOID const lpDeviceConfigIn, DWORD dwSize, LPVARSTRING lpDeviceConfigOut)
134 /***********************************************************************
135 * lineConfigProvider (TAPI32.@)
137 DWORD WINAPI lineConfigProvider(HWND hwndOwner, DWORD dwPermanentProviderID)
139 FIXME("(%p, %08lx): stub.\n", hwndOwner, dwPermanentProviderID);
143 /***********************************************************************
144 * lineDeallocateCall (TAPI32.@)
146 DWORD WINAPI lineDeallocateCall(HCALL hCall)
148 FIXME("(%p): stub.\n", hCall);
152 /***********************************************************************
153 * lineDevSpecific (TAPI32.@)
155 DWORD WINAPI lineDevSpecific(HLINE hLine, DWORD dwAddressId, HCALL hCall, LPVOID lpParams, DWORD dwSize)
157 FIXME("(%p, %08lx, %p, %p, %ld): stub.\n", hLine, dwAddressId, hCall, lpParams, dwSize);
161 /***********************************************************************
162 * lineDevSpecificFeature (TAPI32.@)
164 DWORD WINAPI lineDevSpecificFeature(HLINE hLine, DWORD dwFeature, LPVOID lpParams, DWORD dwSize)
166 FIXME("(%p, %08lx, %p, %ld): stub.\n", hLine, dwFeature, lpParams, dwSize);
170 /***********************************************************************
171 * lineDial (TAPI32.@)
173 DWORD WINAPI lineDialA(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
175 FIXME("(%p, %s, %08lx): stub.\n", hCall, lpszDestAddress, dwCountryCode);
179 /***********************************************************************
180 * lineDrop (TAPI32.@)
182 DWORD WINAPI lineDrop(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
184 FIXME("(%p, %s, %08lx): stub.\n", hCall, lpsUserUserInfo, dwSize);
188 /***********************************************************************
189 * lineForward (TAPI32.@)
191 DWORD WINAPI lineForwardA(HLINE hLine, DWORD bAllAddress, DWORD dwAdressID, LPLINEFORWARDLIST lpForwardList, DWORD dwNumRingsNoAnswer, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
197 /***********************************************************************
198 * lineGatherDigits (TAPI32.@)
200 DWORD WINAPI lineGatherDigitsA(HCALL hCall, DWORD dwDigitModes, LPSTR lpsDigits, DWORD dwNumDigits, LPCSTR lpszTerminationDigits, DWORD dwFirstDigitTimeout, DWORD dwInterDigitTimeout)
206 /***********************************************************************
207 * lineGenerateDigits (TAPI32.@)
209 DWORD WINAPI lineGenerateDigitsA(HCALL hCall, DWORD dwDigitModes, LPCSTR lpszDigits, DWORD dwDuration)
211 FIXME("(%p, %08lx, %s, %ld): stub.\n", hCall, dwDigitModes, lpszDigits, dwDuration);
215 /***********************************************************************
216 * lineGenerateTone (TAPI32.@)
218 DWORD WINAPI lineGenerateTone(HCALL hCall, DWORD dwToneMode, DWORD dwDuration, DWORD dwNumTones, LPLINEGENERATETONE lpTones)
220 FIXME("(%p, %08lx, %ld, %ld, %p): stub.\n", hCall, dwToneMode, dwDuration, dwNumTones, lpTones);
224 /***********************************************************************
225 * lineGetAddressCaps (TAPI32.@)
227 DWORD WINAPI lineGetAddressCapsA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAddressID, DWORD dwAPIVersion, DWORD dwExtVersion, LPLINEADDRESSCAPS lpAddressCaps)
229 FIXME("(%p, %08lx, %08lx, %08lx, %08lx, %p): stub.\n", hLineApp, dwDeviceID, dwAddressID, dwAPIVersion, dwExtVersion, lpAddressCaps);
233 /***********************************************************************
234 * lineGetAddressID (TAPI32.@)
236 DWORD WINAPI lineGetAddressIDA(HLINE hLine, LPDWORD lpdwAddressID, DWORD dwAddressMode, LPCSTR lpsAddress, DWORD dwSize)
238 FIXME("%p, %p, %08lx, %s, %ld): stub.\n", hLine, lpdwAddressID, dwAddressMode, lpsAddress, dwSize);
242 /***********************************************************************
243 * lineGetAddressStatus (TAPI32.@)
245 DWORD WINAPI lineGetAddressStatusA(HLINE hLine, DWORD dwAddressID, LPLINEADDRESSSTATUS lpAddressStatus)
247 FIXME("(%p, %08lx, %p): stub.\n", hLine, dwAddressID, lpAddressStatus);
251 /***********************************************************************
252 * lineGetAppPriority (TAPI32.@)
254 DWORD WINAPI lineGetAppPriorityA(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPVARSTRING lpExtensionName, LPDWORD lpdwPriority)
256 FIXME("(%s, %08lx, %p, %08lx, %p, %p): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpExtensionName, lpdwPriority);
260 /***********************************************************************
261 * lineGetCallInfo (TAPI32.@)
263 DWORD WINAPI lineGetCallInfoA(HCALL hCall, LPLINECALLINFO lpCallInfo)
265 FIXME("(%p, %p): stub.\n", hCall, lpCallInfo);
269 /***********************************************************************
270 * lineGetCallStatus (TAPI32.@)
272 DWORD WINAPI lineGetCallStatus(HCALL hCall, LPLINECALLSTATUS lpCallStatus)
274 FIXME("(%p, %p): stub.\n", hCall, lpCallStatus);
278 /***********************************************************************
279 * lineGetConfRelatedCalls (TAPI32.@)
281 DWORD WINAPI lineGetConfRelatedCalls(HCALL hCall, LPLINECALLLIST lpCallList)
283 FIXME("(%p, %p): stub.\n", hCall, lpCallList);
287 typedef struct tagTAPI_CountryInfo
292 LPSTR lpSameAreaRule;
293 LPSTR lpLongDistanceRule;
294 LPSTR lpInternationalRule;
297 /***********************************************************************
298 * lineGetCountry (TAPI32.@)
300 DWORD WINAPI lineGetCountryA(DWORD dwCountryID, DWORD dwAPIVersion, LPLINECOUNTRYLIST lpLineCountryList)
302 DWORD dwAvailSize, dwOffset, i, num_countries, max_subkey_len;
303 LPLINECOUNTRYENTRY lpLCE;
307 if(!lpLineCountryList) {
308 TRACE("(%08lx, %08lx, %p): stub. Returning LINEERR_INVALPOINTER\n",
309 dwCountryID, dwAPIVersion, lpLineCountryList);
310 return LINEERR_INVALPOINTER;
313 TRACE("(%08lx, %08lx, %p(%ld)): stub.\n",
314 dwCountryID, dwAPIVersion, lpLineCountryList,
315 lpLineCountryList->dwTotalSize);
317 if(RegOpenKeyA(HKEY_LOCAL_MACHINE, szCountrylistKey, &hkey)
319 return LINEERR_INIFILECORRUPT;
322 dwAvailSize = lpLineCountryList->dwTotalSize;
323 dwOffset = sizeof (LINECOUNTRYLIST);
325 if(dwAvailSize<dwOffset)
326 return LINEERR_STRUCTURETOOSMALL;
328 memset(lpLineCountryList, 0, dwAvailSize);
330 lpLineCountryList->dwTotalSize = dwAvailSize;
331 lpLineCountryList->dwUsedSize = dwOffset;
332 lpLineCountryList->dwNumCountries = 0;
333 lpLineCountryList->dwCountryListSize = 0;
334 lpLineCountryList->dwCountryListOffset = dwOffset;
336 lpLCE = (LPLINECOUNTRYENTRY)(&lpLineCountryList[1]);
338 if(RegQueryInfoKeyA(hkey, NULL, NULL, NULL, &num_countries, &max_subkey_len,
339 NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {
341 return LINEERR_STRUCTURETOOSMALL;
345 dwOffset = sizeof (LINECOUNTRYENTRY);
347 dwOffset += num_countries * sizeof (LINECOUNTRYENTRY);
350 subkey_name = HeapAlloc(GetProcessHeap(), 0, max_subkey_len);
351 for(i = 0; i < num_countries; i++)
353 DWORD len, size, size_int, size_long, size_name, size_same;
356 if(RegEnumKeyA(hkey, i, subkey_name, max_subkey_len) !=
360 if(dwCountryID && (atoi(subkey_name) != dwCountryID))
363 if(RegOpenKeyA(hkey, subkey_name, &hsubkey) != ERROR_SUCCESS)
366 RegQueryValueExA(hsubkey, "InternationalRule", NULL, NULL,
370 RegQueryValueExA(hsubkey, "LongDistanceRule", NULL, NULL,
374 RegQueryValueExA(hsubkey, "Name", NULL, NULL,
378 RegQueryValueExA(hsubkey, "SameAreaRule", NULL, NULL,
382 if(dwAvailSize < (dwOffset+len))
385 RegCloseKey(hsubkey);
391 lpLineCountryList->dwNumCountries++;
392 lpLineCountryList->dwCountryListSize += sizeof (LINECOUNTRYENTRY);
393 lpLineCountryList->dwUsedSize += len + sizeof (LINECOUNTRYENTRY);
398 lpLCE[i].dwCountryID = atoi(subkey_name);
399 size = sizeof(DWORD);
400 RegQueryValueExA(hsubkey, "CountryCode", NULL, NULL,
401 (BYTE*)&lpLCE[i].dwCountryCode, &size);
403 lpLCE[i].dwNextCountryID = 0;
406 lpLCE[i-1].dwNextCountryID = lpLCE[i].dwCountryID;
408 /* add country name */
409 lpLCE[i].dwCountryNameSize = size_name;
410 lpLCE[i].dwCountryNameOffset = dwOffset;
411 RegQueryValueExA(hsubkey, "Name", NULL, NULL,
412 ((LPBYTE)lpLineCountryList)+dwOffset,
414 dwOffset += size_name;
416 /* add Same Area Rule */
417 lpLCE[i].dwSameAreaRuleSize = size_same;
418 lpLCE[i].dwSameAreaRuleOffset = dwOffset;
419 RegQueryValueExA(hsubkey, "SameAreaRule", NULL, NULL,
420 ((LPBYTE)lpLineCountryList)+dwOffset,
422 dwOffset += size_same;
424 /* add Long Distance Rule */
425 lpLCE[i].dwLongDistanceRuleSize = size_long;
426 lpLCE[i].dwLongDistanceRuleOffset = dwOffset;
427 RegQueryValueExA(hsubkey, "LongDistanceRule", NULL, NULL,
428 ((LPBYTE)lpLineCountryList)+dwOffset,
430 dwOffset += size_long;
432 /* add Long Distance Rule */
433 lpLCE[i].dwInternationalRuleSize = size_int;
434 lpLCE[i].dwInternationalRuleOffset = dwOffset;
435 RegQueryValueExA(hsubkey, "InternationalRule", NULL, NULL,
436 ((LPBYTE)lpLineCountryList)+dwOffset,
438 dwOffset += size_int;
439 RegCloseKey(hsubkey);
441 TRACE("Added country %s at %p\n", (LPSTR)lpLineCountryList + lpLCE[i].dwCountryNameOffset,
444 if(dwCountryID) break;
447 lpLineCountryList->dwNeededSize = dwOffset;
449 TRACE("%ld available %ld required\n", dwAvailSize, dwOffset);
451 HeapFree(GetProcessHeap(), 0, subkey_name);
457 /***********************************************************************
458 * lineGetDevCaps (TAPI32.@)
460 DWORD WINAPI lineGetDevCapsA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, DWORD dwExtVersion, LPLINEDEVCAPS lpLineDevCaps)
462 FIXME("(%p, %08lx, %08lx, %08lx, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, dwExtVersion, lpLineDevCaps);
466 /***********************************************************************
467 * lineGetDevConfig (TAPI32.@)
469 DWORD WINAPI lineGetDevConfigA(DWORD dwDeviceID, LPVARSTRING lpDeviceConfig, LPCSTR lpszDeviceClass)
471 FIXME("(%08lx, %p, %s): stub.\n", dwDeviceID, lpDeviceConfig, lpszDeviceClass);
475 /***********************************************************************
476 * lineGetID (TAPI32.@)
478 DWORD WINAPI lineGetIDA(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, LPVARSTRING lpDeviceID, LPCSTR lpszDeviceClass)
480 FIXME("(%p, %08lx, %p, %08lx, %p, %s): stub.\n", hLine, dwAddressID, hCall, dwSelect, lpDeviceID, lpszDeviceClass);
484 /***********************************************************************
485 * lineGetIcon (TAPI32.@)
487 DWORD WINAPI lineGetIconA(DWORD dwDeviceID, LPCSTR lpszDeviceClass, HICON *lphIcon)
489 FIXME("(%08lx, %s, %p): stub.\n", dwDeviceID, lpszDeviceClass, lphIcon);
493 /***********************************************************************
494 * lineGetLineDevStatus (TAPI32.@)
496 DWORD WINAPI lineGetLineDevStatusA(HLINE hLine, LPLINEDEVSTATUS lpLineDevStatus)
498 FIXME("(%p, %p): stub.\n", hLine, lpLineDevStatus);
502 /***********************************************************************
503 * lineGetNewCalls (TAPI32.@)
505 DWORD WINAPI lineGetNewCalls(HLINE hLine, DWORD dwAddressID, DWORD dwSelect, LPLINECALLLIST lpCallList)
507 FIXME("(%p, %08lx, %08lx, %p): stub.\n", hLine, dwAddressID, dwSelect, lpCallList);
511 /***********************************************************************
512 * lineGetNumRings (TAPI32.@)
514 DWORD WINAPI lineGetNumRings(HLINE hLine, DWORD dwAddressID, LPDWORD lpdwNumRings)
516 FIXME("(%p, %08lx, %p): stub.\n", hLine, dwAddressID, lpdwNumRings);
520 /***********************************************************************
521 * lineGetProviderList (TAPI32.@)
523 DWORD WINAPI lineGetProviderListA(DWORD dwAPIVersion, LPLINEPROVIDERLIST lpProviderList)
525 FIXME("(%08lx, %p): stub.\n", dwAPIVersion, lpProviderList);
529 /***********************************************************************
530 * lineGetRequest (TAPI32.@)
532 DWORD WINAPI lineGetRequestA(HLINEAPP hLineApp, DWORD dwRequestMode, LPVOID lpRequestBuffer)
534 FIXME("%p, %08lx, %p): stub.\n", hLineApp, dwRequestMode, lpRequestBuffer);
538 /***********************************************************************
539 * lineGetStatusMessages (TAPI32.@)
541 DWORD WINAPI lineGetStatusMessages(HLINE hLine, LPDWORD lpdwLineStatus, LPDWORD lpdwAddressStates)
543 FIXME("(%p, %p, %p): stub.\n", hLine, lpdwLineStatus, lpdwAddressStates);
547 /***********************************************************************
548 * lineGetTranslateCaps (TAPI32.@)
550 * get address translate capabilities. Returns a LINETRANSLATECAPS
553 * +-----------------------+
557 * +-----------------------+
559 * |LocationsListSize |
560 * |LocationsListOffset | -+
561 * |CurrentLocationID | |
562 * +-----------------------+ |
565 * |CardListOffset | -|--+
566 * |CurrentPreferredCardID | | |
567 * +-----------------------+ | |
569 * |LINELOCATIONENTRY #1 | |
571 * +-----------------------+ |
573 * +-----------------------+ |
575 * |LINELOCATIONENTRY | |
577 * +-----------------------+ |
579 * |LINECARDENTRY #1 |
581 * +-----------------------+
583 * +-----------------------+
585 * |LINECARDENTRY #NumCards|
587 * +-----------------------+
588 * | room for strings named|
589 * | in the structures |
591 * +-----------------------+
593 DWORD WINAPI lineGetTranslateCapsA(HLINEAPP hLineApp, DWORD dwAPIVersion,
594 LPLINETRANSLATECAPS lpTranslateCaps)
596 HKEY hkLocations, hkCards, hkCardLocations, hsubkey;
597 int numlocations, numcards;
600 char *loc_key_name = NULL;
601 char *card_key_name = NULL;
607 LPLINELOCATIONENTRY pLocEntry;
608 LPLINECARDENTRY pCardEntry;
610 TRACE("(%p, %08lx, %p (tot. size %ld)\n", hLineApp, dwAPIVersion,
611 lpTranslateCaps, lpTranslateCaps->dwTotalSize );
612 if( lpTranslateCaps->dwTotalSize < sizeof(LINETRANSLATECAPS))
613 return LINEERR_STRUCTURETOOSMALL;
614 if( RegCreateKeyA(HKEY_LOCAL_MACHINE, szLocationsKey, &hkLocations)
616 ERR("unexpected registry error 1.\n");
617 return LINEERR_INIFILECORRUPT;
619 lendword = sizeof( DWORD);
620 if( RegQueryValueExA( hkLocations, "CurrentID", NULL, NULL,
621 (LPBYTE) ¤tid, &lendword) != ERROR_SUCCESS )
622 currentid = -1; /* change this later */
623 if(RegQueryInfoKeyA(hkLocations, NULL, NULL, NULL, NULL, &maxlockeylen,
624 NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {
625 RegCloseKey(hkLocations);
626 ERR("unexpected registry error 2.\n");
627 return LINEERR_INIFILECORRUPT;
630 if( maxlockeylen < 10)
631 maxlockeylen = 10; /* need this also if there is no key */
632 loc_key_name = HeapAlloc( GetProcessHeap(), 0, maxlockeylen);
633 /* first time through: calculate needed space */
637 while( RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen)
641 if( strncasecmp(loc_key_name, "location", 8) ||
642 (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey)
646 length += sizeof(LINELOCATIONENTRY);
647 RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val);
649 RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL,NULL,&size_val);
651 RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL,NULL,&size_val);
653 RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL,NULL,&size_val);
655 RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL,NULL,&size_val);
657 /* fixme: what about TollPrefixList???? */
658 RegCloseKey(hsubkey);
660 if(numlocations == 0) {
661 /* add one location */
662 if( RegCreateKeyA( hkLocations, "Location1", &hsubkey)
667 length += sizeof(LINELOCATIONENTRY) + 20 ;
668 RegSetValueExA( hsubkey, "AreaCode", 0, REG_SZ, (LPBYTE)"010", 4);
669 GetLocaleInfoA( LOCALE_SYSTEM_DEFAULT, LOCALE_ICOUNTRY, buf, 8);
671 RegSetValueExA( hsubkey, "Country", 0, REG_DWORD, (LPBYTE)&dwval,
673 RegSetValueExA( hsubkey, "DisableCallWaiting", 0, REG_SZ, (LPBYTE)"", 1);
675 RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval,
677 RegSetValueExA( hsubkey, "LongDistanceAccess", 0, REG_SZ, (LPBYTE)"", 1);
678 RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (LPBYTE)"New Location", 13);
679 RegSetValueExA( hsubkey, "OutsideAccess", 0, REG_SZ, (LPBYTE)"", 1);
680 RegCloseKey(hsubkey);
682 RegSetValueExA( hkLocations, "CurrentID", 0, REG_DWORD,
683 (LPBYTE)&dwval, sizeof(DWORD));
685 RegSetValueExA( hkLocations, "NextID", 0, REG_DWORD, (LPBYTE)&dwval,
689 /* do the card list */
691 if( RegCreateKeyA(HKEY_CURRENT_USER, szCardsKey, &hkCards)
693 if(RegQueryInfoKeyA(hkCards, NULL, NULL, NULL, NULL, &maxcardkeylen,
694 NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
696 if( maxcardkeylen < 6) maxcardkeylen = 6;
697 card_key_name = HeapAlloc(GetProcessHeap(), 0, maxcardkeylen);
699 while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) ==
703 if( strncasecmp(card_key_name, "card", 4) || ERROR_SUCCESS !=
704 (RegOpenKeyA(hkCards, card_key_name, &hsubkey) ))
707 length += sizeof(LINECARDENTRY);
708 RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val);
710 RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL,NULL,&size_val);
712 RegQueryValueExA(hsubkey, "LDRule",NULL,NULL,NULL,&size_val);
714 RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL,NULL,
717 RegCloseKey(hsubkey);
720 /* add one card (direct call) */
722 ERROR_SUCCESS == RegCreateKeyA( hkCards, "Card1", &hsubkey)) {
725 length += sizeof(LINECARDENTRY) + 22 ;
726 RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (LPBYTE)"None (Direct Call)", 19);
728 RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval,
730 RegSetValueExA( hsubkey, "InternationalRule", 0, REG_SZ, (LPBYTE)"", 1);
731 RegSetValueExA( hsubkey, "LDRule", 0, REG_SZ, (LPBYTE)"", 1);
732 RegSetValueExA( hsubkey, "LocalRule", 0, REG_SZ, (LPBYTE)"", 1);
733 RegCloseKey(hsubkey);
735 RegSetValueExA( hkCards, "NextID", 0, REG_DWORD, (LPBYTE)&dwval,
738 } else hkCards = 0; /* should realy fail */
739 /* check if sufficient room is available */
740 lpTranslateCaps->dwNeededSize = sizeof(LINETRANSLATECAPS) + length;
741 if ( lpTranslateCaps->dwNeededSize > lpTranslateCaps->dwTotalSize ) {
742 RegCloseKey( hkLocations);
743 if( hkCards) RegCloseKey( hkCards);
744 HeapFree(GetProcessHeap(), 0, loc_key_name);
745 HeapFree(GetProcessHeap(), 0, card_key_name);
746 lpTranslateCaps->dwUsedSize = sizeof(LINETRANSLATECAPS);
747 TRACE("Insufficient space: total %ld needed %ld used %ld\n",
748 lpTranslateCaps->dwTotalSize,
749 lpTranslateCaps->dwNeededSize,
750 lpTranslateCaps->dwUsedSize);
753 /* fill in the LINETRANSLATECAPS structure */
754 lpTranslateCaps->dwUsedSize = lpTranslateCaps->dwNeededSize;
755 lpTranslateCaps->dwNumLocations = numlocations;
756 lpTranslateCaps->dwLocationListSize = sizeof(LINELOCATIONENTRY) *
757 lpTranslateCaps->dwNumLocations;
758 lpTranslateCaps->dwLocationListOffset = sizeof(LINETRANSLATECAPS);
759 lpTranslateCaps->dwCurrentLocationID = currentid;
760 lpTranslateCaps->dwNumCards = numcards;
761 lpTranslateCaps->dwCardListSize = sizeof(LINECARDENTRY) *
762 lpTranslateCaps->dwNumCards;
763 lpTranslateCaps->dwCardListOffset = lpTranslateCaps->dwLocationListOffset +
764 lpTranslateCaps->dwLocationListSize;
765 lpTranslateCaps->dwCurrentPreferredCardID = 0;
766 /* this is where the strings will be stored */
767 strptr = ((LPBYTE) lpTranslateCaps) +
768 lpTranslateCaps->dwCardListOffset + lpTranslateCaps->dwCardListSize;
769 pLocEntry = (LPLINELOCATIONENTRY) (lpTranslateCaps + 1);
770 /* key with Preferred CardID's */
771 if( RegOpenKeyA(HKEY_CURRENT_USER, szLocationsKey, &hkCardLocations)
774 /* second time through all locations */
776 while(RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen)
780 if( strncasecmp(loc_key_name, "location", 8) ||
781 (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey)
784 size_val=sizeof(DWORD);
785 if( RegQueryValueExA(hsubkey, "ID",NULL, NULL,
786 (LPBYTE) &(pLocEntry->dwPermanentLocationID), &size_val) !=
788 pLocEntry->dwPermanentLocationID = atoi( loc_key_name + 8);
790 RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val);
791 pLocEntry->dwLocationNameSize = size_val;
792 pLocEntry->dwLocationNameOffset = strptr - (LPBYTE) lpTranslateCaps;
796 RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL, strptr, &size_val);
797 pLocEntry->dwCityCodeSize = size_val;
798 pLocEntry->dwCityCodeOffset = strptr - (LPBYTE) lpTranslateCaps;
802 RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL, strptr, &size_val);
803 pLocEntry->dwLocalAccessCodeSize = size_val;
804 pLocEntry->dwLocalAccessCodeOffset = strptr - (LPBYTE) lpTranslateCaps;
807 RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL, strptr,
809 pLocEntry->dwLongDistanceAccessCodeSize= size_val;
810 pLocEntry->dwLongDistanceAccessCodeOffset= strptr -
811 (LPBYTE) lpTranslateCaps;
814 RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL, strptr,
816 pLocEntry->dwCancelCallWaitingSize= size_val;
817 pLocEntry->dwCancelCallWaitingOffset= strptr - (LPBYTE) lpTranslateCaps;
820 pLocEntry->dwTollPrefixListSize = 0; /* FIXME */
821 pLocEntry->dwTollPrefixListOffset = 0; /* FIXME */
823 size_val=sizeof(DWORD);
824 RegQueryValueExA(hsubkey, "Country",NULL,NULL,
825 (LPBYTE) &(pLocEntry->dwCountryCode), &size_val);
826 pLocEntry->dwCountryID = pLocEntry->dwCountryCode; /* FIXME */
827 RegQueryValueExA(hsubkey, "Flags",NULL,NULL,
828 (LPBYTE) &(pLocEntry->dwOptions), &size_val);
829 RegCloseKey(hsubkey);
830 /* get preferred cardid */
831 pLocEntry->dwPreferredCardID = 0;
832 if ( hkCardLocations) {
833 size_val=sizeof(DWORD);
834 if(RegOpenKeyA(hkCardLocations, loc_key_name, &hsubkey) ==
836 RegQueryValueExA(hsubkey, "CallingCard",NULL,NULL,
837 (LPBYTE) &(pLocEntry->dwPreferredCardID), &size_val);
838 RegCloseKey(hsubkey);
842 /* make sure there is a currentID */
844 currentid = pLocEntry->dwPermanentLocationID;
845 lpTranslateCaps->dwCurrentLocationID = currentid;
847 if(pLocEntry->dwPermanentLocationID == currentid )
848 lpTranslateCaps->dwCurrentPreferredCardID =
849 pLocEntry->dwPreferredCardID;
850 TRACE("added: ID %ld %s CountryCode %ld CityCode %s CardID %ld "
851 "LocalAccess: %s LongDistanceAccess: %s CountryID %ld "
852 "Options %ld CancelCallWait %s\n",
853 pLocEntry->dwPermanentLocationID,
854 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocationNameOffset),
855 pLocEntry->dwCountryCode,
856 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCityCodeOffset),
857 pLocEntry->dwPreferredCardID,
858 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocalAccessCodeOffset),
859 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLongDistanceAccessCodeOffset),
860 pLocEntry->dwCountryID,
861 pLocEntry->dwOptions,
862 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCancelCallWaitingOffset));
865 pCardEntry= (LPLINECARDENTRY) pLocEntry;
866 /* do the card list */
869 while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) ==
873 if( strncasecmp(card_key_name, "card", 4) ||
874 (RegOpenKeyA(hkCards, card_key_name, &hsubkey) != ERROR_SUCCESS))
876 size_val=sizeof(DWORD);
877 if( RegQueryValueExA(hsubkey, "ID",NULL, NULL,
878 (LPBYTE) &(pCardEntry->dwPermanentCardID), &size_val) !=
880 pCardEntry->dwPermanentCardID= atoi( card_key_name + 4);
882 RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val);
883 pCardEntry->dwCardNameSize = size_val;
884 pCardEntry->dwCardNameOffset = strptr - (LPBYTE) lpTranslateCaps;
886 pCardEntry->dwCardNumberDigits = 1; /* FIXME */
888 RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL, strptr, &size_val);
889 pCardEntry->dwSameAreaRuleSize= size_val;
890 pCardEntry->dwSameAreaRuleOffset= strptr - (LPBYTE) lpTranslateCaps;
893 RegQueryValueExA(hsubkey, "LDRule",NULL,NULL, strptr, &size_val);
894 pCardEntry->dwLongDistanceRuleSize = size_val;
895 pCardEntry->dwLongDistanceRuleOffset = strptr - (LPBYTE) lpTranslateCaps;
898 RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL, strptr,
900 pCardEntry->dwInternationalRuleSize = size_val;
901 pCardEntry->dwInternationalRuleOffset = strptr -
902 (LPBYTE) lpTranslateCaps;
904 size_val=sizeof(DWORD);
905 RegQueryValueExA(hsubkey, "Flags",NULL, NULL,
906 (LPBYTE) &(pCardEntry->dwOptions), &size_val);
907 TRACE( "added card: ID %ld name %s SameArea %s LongDistance %s International %s Options 0x%lx\n",
908 pCardEntry->dwPermanentCardID,
909 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwCardNameOffset),
910 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwSameAreaRuleOffset),
911 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwLongDistanceRuleOffset),
912 debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwInternationalRuleOffset),
913 pCardEntry->dwOptions);
919 if(hkLocations) RegCloseKey(hkLocations);
920 if(hkCards) RegCloseKey(hkCards);
921 if(hkCardLocations) RegCloseKey(hkCardLocations);
922 HeapFree(GetProcessHeap(), 0, loc_key_name);
923 HeapFree(GetProcessHeap(), 0, card_key_name);
924 TRACE(" returning success tot %ld needed %ld used %ld \n",
925 lpTranslateCaps->dwTotalSize,
926 lpTranslateCaps->dwNeededSize,
927 lpTranslateCaps->dwUsedSize );
928 return 0; /* success */
931 /***********************************************************************
932 * lineHandoff (TAPI32.@)
934 DWORD WINAPI lineHandoffA(HCALL hCall, LPCSTR lpszFileName, DWORD dwMediaMode)
936 FIXME("(%p, %s, %08lx): stub.\n", hCall, lpszFileName, dwMediaMode);
940 /***********************************************************************
941 * lineHold (TAPI32.@)
943 DWORD WINAPI lineHold(HCALL hCall)
945 FIXME("(%p): stub.\n", hCall);
949 /***********************************************************************
950 * lineInitialize (TAPI32.@)
952 DWORD WINAPI lineInitialize(
953 LPHLINEAPP lphLineApp,
955 LINECALLBACK lpfnCallback,
959 FIXME("(%p, %p, %p, %s, %p): stub.\n", lphLineApp, hInstance,
960 lpfnCallback, debugstr_a(lpszAppName), lpdwNumDevs);
964 /***********************************************************************
965 * lineMakeCall (TAPI32.@)
967 DWORD WINAPI lineMakeCallA(HLINE hLine, LPHCALL lphCall, LPCSTR lpszDestAddress, DWORD dwCountryCode, LPLINECALLPARAMS lpCallParams)
969 FIXME("(%p, %p, %s, %08lx, %p): stub.\n", hLine, lphCall, lpszDestAddress, dwCountryCode, lpCallParams);
973 /***********************************************************************
974 * lineMonitorDigits (TAPI32.@)
976 DWORD WINAPI lineMonitorDigits(HCALL hCall, DWORD dwDigitModes)
978 FIXME("(%p, %08lx): stub.\n", hCall, dwDigitModes);
982 /***********************************************************************
983 * lineMonitorMedia (TAPI32.@)
985 DWORD WINAPI lineMonitorMedia(HCALL hCall, DWORD dwMediaModes)
987 FIXME("(%p, %08lx): stub.\n", hCall, dwMediaModes);
991 /***********************************************************************
992 * lineMonitorTones (TAPI32.@)
994 DWORD WINAPI lineMonitorTones(HCALL hCall, LPLINEMONITORTONE lpToneList, DWORD dwNumEntries)
996 FIXME("(%p, %p, %08lx): stub.\n", hCall, lpToneList, dwNumEntries);
1000 /***********************************************************************
1001 * lineNegotiateAPIVersion (TAPI32.@)
1003 DWORD WINAPI lineNegotiateAPIVersion(
1006 DWORD dwAPILowVersion,
1007 DWORD dwAPIHighVersion,
1008 LPDWORD lpdwAPIVersion,
1009 LPLINEEXTENSIONID lpExtensionID
1012 FIXME("(%p, %ld, %ld, %ld, %p, %p): stub.\n", hLineApp, dwDeviceID,
1013 dwAPILowVersion, dwAPIHighVersion, lpdwAPIVersion, lpExtensionID);
1014 *lpdwAPIVersion = dwAPIHighVersion;
1018 /***********************************************************************
1019 * lineNegotiateExtVersion (TAPI32.@)
1021 DWORD WINAPI lineNegotiateExtVersion(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, DWORD dwExtLowVersion, DWORD dwExtHighVersion, LPDWORD lpdwExtVersion)
1027 /***********************************************************************
1028 * lineOpen (TAPI32.@)
1030 DWORD WINAPI lineOpenA(HLINEAPP hLineApp, DWORD dwDeviceID, LPHLINE lphLine, DWORD dwAPIVersion, DWORD dwExtVersion, DWORD dwCallbackInstance, DWORD dwPrivileges, DWORD dwMediaModes, LPLINECALLPARAMS lpCallParams)
1036 /***********************************************************************
1037 * linePark (TAPI32.@)
1039 DWORD WINAPI lineParkA(HCALL hCall, DWORD dwParkMode, LPCSTR lpszDirAddress, LPVARSTRING lpNonDirAddress)
1041 FIXME("(%p, %08lx, %s, %p): stub.\n", hCall, dwParkMode, lpszDirAddress, lpNonDirAddress);
1045 /***********************************************************************
1046 * linePickup (TAPI32.@)
1048 DWORD WINAPI linePickupA(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress, LPCSTR lpszGroupID)
1050 FIXME("(%p, %08lx, %p, %s, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress, lpszGroupID);
1054 /***********************************************************************
1055 * linePrepareAddToConference (TAPI32.@)
1057 DWORD WINAPI linePrepareAddToConferenceA(HCALL hConfCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
1059 FIXME("(%p, %p, %p): stub.\n", hConfCall, lphConsultCall, lpCallParams);
1063 /***********************************************************************
1064 * lineRedirect (TAPI32.@)
1066 DWORD WINAPI lineRedirectA(
1068 LPCSTR lpszDestAddress,
1069 DWORD dwCountryCode) {
1075 /***********************************************************************
1076 * lineRegisterRequestRecipient (TAPI32.@)
1078 DWORD WINAPI lineRegisterRequestRecipient(HLINEAPP hLineApp, DWORD dwRegistrationInstance, DWORD dwRequestMode, DWORD dwEnable)
1080 FIXME("(%p, %08lx, %08lx, %08lx): stub.\n", hLineApp, dwRegistrationInstance, dwRequestMode, dwEnable);
1084 /***********************************************************************
1085 * lineReleaseUserUserInfo (TAPI32.@)
1087 DWORD WINAPI lineReleaseUserUserInfo(HCALL hCall)
1089 FIXME("(%p): stub.\n", hCall);
1093 /***********************************************************************
1094 * lineRemoveFromConference (TAPI32.@)
1096 DWORD WINAPI lineRemoveFromConference(HCALL hCall)
1098 FIXME("(%p): stub.\n", hCall);
1102 /***********************************************************************
1103 * lineRemoveProvider (TAPI32.@)
1105 DWORD WINAPI lineRemoveProvider(DWORD dwPermanentProviderID, HWND hwndOwner)
1107 FIXME("(%08lx, %p): stub.\n", dwPermanentProviderID, hwndOwner);
1111 /***********************************************************************
1112 * lineSecureCall (TAPI32.@)
1114 DWORD WINAPI lineSecureCall(HCALL hCall)
1116 FIXME("(%p): stub.\n", hCall);
1120 /***********************************************************************
1121 * lineSendUserUserInfo (TAPI32.@)
1123 DWORD WINAPI lineSendUserUserInfo(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
1125 FIXME("(%p, %s, %08lx): stub.\n", hCall, lpsUserUserInfo, dwSize);
1129 /***********************************************************************
1130 * lineSetAppPriority (TAPI32.@)
1132 DWORD WINAPI lineSetAppPriorityA(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPCSTR lpszExtensionName, DWORD dwPriority)
1134 FIXME("(%s, %08lx, %p, %08lx, %s, %08lx): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpszExtensionName, dwPriority);
1138 /***********************************************************************
1139 * lineSetAppSpecific (TAPI32.@)
1141 DWORD WINAPI lineSetAppSpecific(HCALL hCall, DWORD dwAppSpecific)
1143 FIXME("(%p, %08lx): stub.\n", hCall, dwAppSpecific);
1147 /***********************************************************************
1148 * lineSetCallParams (TAPI32.@)
1150 DWORD WINAPI lineSetCallParams(HCALL hCall, DWORD dwBearerMode, DWORD dwMinRate, DWORD dwMaxRate, LPLINEDIALPARAMS lpDialParams)
1152 FIXME("(%p, %08lx, %08lx, %08lx, %p): stub.\n", hCall, dwBearerMode, dwMinRate, dwMaxRate, lpDialParams);
1156 /***********************************************************************
1157 * lineSetCallPrivilege (TAPI32.@)
1159 DWORD WINAPI lineSetCallPrivilege(HCALL hCall, DWORD dwCallPrivilege)
1161 FIXME("(%p, %08lx): stub.\n", hCall, dwCallPrivilege);
1165 /***********************************************************************
1166 * lineSetCurrentLocation (TAPI32.@)
1168 DWORD WINAPI lineSetCurrentLocation(HLINEAPP hLineApp, DWORD dwLocation)
1170 FIXME("(%p, %08lx): stub.\n", hLineApp, dwLocation);
1174 /***********************************************************************
1175 * lineSetDevConfig (TAPI32.@)
1177 DWORD WINAPI lineSetDevConfigA(DWORD dwDeviceID, LPVOID lpDeviceConfig, DWORD dwSize, LPCSTR lpszDeviceClass)
1179 FIXME("(%08lx, %p, %08lx, %s): stub.\n", dwDeviceID, lpDeviceConfig, dwSize, lpszDeviceClass);
1183 /***********************************************************************
1184 * lineSetMediaControl (TAPI32.@)
1186 DWORD WINAPI lineSetMediaControl(
1191 LPLINEMEDIACONTROLDIGIT const lpDigitList,
1192 DWORD dwDigitNumEntries,
1193 LPLINEMEDIACONTROLMEDIA const lpMediaList,
1194 DWORD dwMediaNumEntries,
1195 LPLINEMEDIACONTROLTONE const lpToneList,
1196 DWORD dwToneNumEntries,
1197 LPLINEMEDIACONTROLCALLSTATE const lpCallStateList,
1198 DWORD dwCallStateNumEntries)
1204 /***********************************************************************
1205 * lineSetMediaMode (TAPI32.@)
1207 DWORD WINAPI lineSetMediaMode(HCALL hCall, DWORD dwMediaModes)
1209 FIXME("(%p, %08lx): stub.\n", hCall, dwMediaModes);
1213 /***********************************************************************
1214 * lineSetNumRings (TAPI32.@)
1216 DWORD WINAPI lineSetNumRings(HLINE hLine, DWORD dwAddressID, DWORD dwNumRings)
1218 FIXME("(%p, %08lx, %08lx): stub.\n", hLine, dwAddressID, dwNumRings);
1222 /***********************************************************************
1223 * lineSetStatusMessages (TAPI32.@)
1225 DWORD WINAPI lineSetStatusMessages(HLINE hLine, DWORD dwLineStates, DWORD dwAddressStates)
1227 FIXME("(%p, %08lx, %08lx): stub.\n", hLine, dwLineStates, dwAddressStates);
1231 /***********************************************************************
1232 * lineSetTerminal (TAPI32.@)
1234 DWORD WINAPI lineSetTerminal(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, DWORD dwTerminalModes, DWORD dwTerminalID, DWORD bEnable)
1236 FIXME("(%p, %08lx, %p, %08lx, %08lx, %08lx, %08lx): stub.\n", hLine, dwAddressID, hCall, dwSelect, dwTerminalModes, dwTerminalID, bEnable);
1240 /***********************************************************************
1241 * lineSetTollList (TAPI32.@)
1243 DWORD WINAPI lineSetTollListA(HLINEAPP hLineApp, DWORD dwDeviceID, LPCSTR lpszAddressIn, DWORD dwTollListOption)
1245 FIXME("(%p, %08lx, %s, %08lx): stub.\n", hLineApp, dwDeviceID, lpszAddressIn, dwTollListOption);
1249 /***********************************************************************
1250 * lineSetupConference (TAPI32.@)
1252 DWORD WINAPI lineSetupConferenceA(HCALL hCall, HLINE hLine, LPHCALL lphConfCall, LPHCALL lphConsultCall, DWORD dwNumParties, LPLINECALLPARAMS lpCallParams)
1254 FIXME("(%p, %p, %p, %p, %08lx, %p): stub.\n", hCall, hLine, lphConfCall, lphConsultCall, dwNumParties, lpCallParams);
1258 /***********************************************************************
1259 * lineSetupTransfer (TAPI32.@)
1261 DWORD WINAPI lineSetupTransferA(HCALL hCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
1263 FIXME("(%p, %p, %p): stub.\n", hCall, lphConsultCall, lpCallParams);
1267 /***********************************************************************
1268 * lineShutdown (TAPI32.@)
1270 DWORD WINAPI lineShutdown(HLINEAPP hLineApp)
1272 FIXME("(%p): stub.\n", hLineApp);
1276 /***********************************************************************
1277 * lineSwapHold (TAPI32.@)
1279 DWORD WINAPI lineSwapHold(HCALL hActiveCall, HCALL hHeldCall)
1281 FIXME("(active: %p, held: %p): stub.\n", hActiveCall, hHeldCall);
1285 /***********************************************************************
1286 * lineTranslateAddress (TAPI32.@)
1288 DWORD WINAPI lineTranslateAddressA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, LPCSTR lpszAddressIn, DWORD dwCard, DWORD dwTranslateOptions, LPLINETRANSLATEOUTPUT lpTranslateOutput)
1290 FIXME("(%p, %08lx, %08lx, %s, %08lx, %08lx, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, lpszAddressIn, dwCard, dwTranslateOptions, lpTranslateOutput);
1294 /***********************************************************************
1295 * lineTranslateDialog (TAPI32.@)
1297 DWORD WINAPI lineTranslateDialogA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, HWND hwndOwner, LPCSTR lpszAddressIn)
1299 FIXME("(%p, %08lx, %08lx, %p, %s): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, hwndOwner, lpszAddressIn);
1303 /***********************************************************************
1304 * lineUncompleteCall (TAPI32.@)
1306 DWORD WINAPI lineUncompleteCall(HLINE hLine, DWORD dwCompletionID)
1308 FIXME("(%p, %08lx): stub.\n", hLine, dwCompletionID);
1312 /***********************************************************************
1313 * lineUnhold (TAPI32.@)
1315 DWORD WINAPI lineUnhold(HCALL hCall)
1317 FIXME("(%p): stub.\n", hCall);
1321 /***********************************************************************
1322 * lineUnpark (TAPI32.@)
1324 DWORD WINAPI lineUnparkA(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress)
1326 FIXME("(%p, %08lx, %p, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress);