ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

line.c
Go to the documentation of this file.
00001 /*
00002  * TAPI32 line services
00003  *
00004  * Copyright 1999  Andreas Mohr
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00019  */
00020 
00021 #include <string.h>
00022 #include <stdlib.h>
00023 #include <stdarg.h>
00024 #include <stdio.h>
00025 #include "windef.h"
00026 #include "winbase.h"
00027 #include "wingdi.h"
00028 #include "winreg.h"
00029 #include "winnls.h"
00030 #include "winerror.h"
00031 #include "objbase.h"
00032 #include "tapi.h"
00033 #include "wine/debug.h"
00034 
00035 WINE_DEFAULT_DEBUG_CHANNEL(tapi);
00036 
00037 /* registry keys */
00038 static const char szCountrylistKey[] =
00039     "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Country List";
00040 static const char szLocationsKey[] =
00041     "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Locations";
00042 static const char szCardsKey[] =
00043     "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Cards";
00044 
00045 
00046 /***********************************************************************
00047  *      lineAccept (TAPI32.@)
00048  */
00049 DWORD WINAPI lineAccept(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
00050 {
00051     FIXME("(%p, %s, %d): stub.\n", hCall, lpsUserUserInfo, dwSize);
00052     return 1;
00053 }
00054 
00055 /***********************************************************************
00056  *      lineAddProviderA (TAPI32.@)
00057  */
00058 DWORD WINAPI lineAddProviderA(LPCSTR lpszProviderName, HWND hwndOwner, LPDWORD lpdwPermanentProviderID)
00059 {
00060     FIXME("(%s, %p, %p): stub.\n", lpszProviderName, hwndOwner, lpdwPermanentProviderID);
00061     return LINEERR_OPERATIONFAILED;
00062 }
00063 
00064 /***********************************************************************
00065  *      lineAddProviderW (TAPI32.@)
00066  */
00067 DWORD WINAPI lineAddProviderW(LPCWSTR lpszProviderName, HWND hwndOwner, LPDWORD lpdwPermanentProviderID)
00068 {
00069     FIXME("(%s, %p, %p): stub.\n", wine_dbgstr_w(lpszProviderName), hwndOwner, lpdwPermanentProviderID);
00070     return LINEERR_OPERATIONFAILED;
00071 }
00072 
00073 /***********************************************************************
00074  *      lineAddToConference (TAPI32.@)
00075  */
00076 DWORD WINAPI lineAddToConference(HCALL hConfCall, HCALL hConsultCall)
00077 {
00078     FIXME("(%p, %p): stub.\n", hConfCall, hConsultCall);
00079     return 1;
00080 }
00081 
00082 /***********************************************************************
00083  *      lineAnswer (TAPI32.@)
00084  */
00085 DWORD WINAPI lineAnswer(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
00086 {
00087     FIXME("(%p, %s, %d): stub.\n", hCall, lpsUserUserInfo, dwSize);
00088     return 1;
00089 }
00090 
00091 /***********************************************************************
00092  *      lineBlindTransfer (TAPI32.@)
00093  */
00094 DWORD WINAPI lineBlindTransferA(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
00095 {
00096     FIXME("(%p, %s, %08x): stub.\n", hCall, lpszDestAddress, dwCountryCode);
00097     return 1;
00098 }
00099 
00100 /***********************************************************************
00101  *      lineClose (TAPI32.@)
00102  */
00103 DWORD WINAPI lineClose(HLINE hLine)
00104 {
00105     FIXME("(%p): stub.\n", hLine);
00106     return 0;
00107 }
00108 
00109 /***********************************************************************
00110  *      lineCompleteCall (TAPI32.@)
00111  */
00112 DWORD WINAPI lineCompleteCall(HCALL hCall, LPDWORD lpdwCompletionID, DWORD dwCompletionMode, DWORD dwMessageID)
00113 {
00114     FIXME("(%p, %p, %08x, %08x): stub.\n", hCall, lpdwCompletionID, dwCompletionMode, dwMessageID);
00115     return 1;
00116 }
00117 
00118 /***********************************************************************
00119  *      lineCompleteTransfer (TAPI32.@)
00120  */
00121 DWORD WINAPI lineCompleteTransfer(HCALL hCall, HCALL hConsultCall, LPHCALL lphConfCall, DWORD dwTransferMode)
00122 {
00123     FIXME("(%p, %p, %p, %08x): stub.\n", hCall, hConsultCall, lphConfCall, dwTransferMode);
00124     return 1;
00125 }
00126 
00127 /***********************************************************************
00128  *      lineConfigDialog (TAPI32.@)
00129  */
00130 DWORD WINAPI lineConfigDialogA(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass)
00131 {
00132     FIXME("(%08x, %p, %s): stub.\n", dwDeviceID, hwndOwner, lpszDeviceClass);
00133     return 0;
00134 }
00135 
00136 /***********************************************************************
00137  *      lineConfigDialogEdit (TAPI32.@)
00138  */
00139 DWORD WINAPI lineConfigDialogEditA(DWORD dwDeviceID, HWND hwndOwner, LPCSTR lpszDeviceClass, LPVOID const lpDeviceConfigIn, DWORD dwSize, LPVARSTRING lpDeviceConfigOut)
00140 {
00141     FIXME("stub.\n");
00142     return 0;
00143 }
00144 
00145 /***********************************************************************
00146  *      lineConfigProvider (TAPI32.@)
00147  */
00148 DWORD WINAPI lineConfigProvider(HWND hwndOwner, DWORD dwPermanentProviderID)
00149 {
00150     FIXME("(%p, %08x): stub.\n", hwndOwner, dwPermanentProviderID);
00151     return 0;
00152 }
00153 
00154 /***********************************************************************
00155  *      lineDeallocateCall (TAPI32.@)
00156  */
00157 DWORD WINAPI lineDeallocateCall(HCALL hCall)
00158 {
00159     FIXME("(%p): stub.\n", hCall);
00160     return 0;
00161 }
00162 
00163 /***********************************************************************
00164  *      lineDevSpecific (TAPI32.@)
00165  */
00166 DWORD WINAPI lineDevSpecific(HLINE hLine, DWORD dwAddressId, HCALL hCall, LPVOID lpParams, DWORD dwSize)
00167 {
00168     FIXME("(%p, %08x, %p, %p, %d): stub.\n", hLine, dwAddressId, hCall, lpParams, dwSize);
00169     return 1;
00170 }
00171 
00172 /***********************************************************************
00173  *      lineDevSpecificFeature (TAPI32.@)
00174  */
00175 DWORD WINAPI lineDevSpecificFeature(HLINE hLine, DWORD dwFeature, LPVOID lpParams, DWORD dwSize)
00176 {
00177     FIXME("(%p, %08x, %p, %d): stub.\n", hLine, dwFeature, lpParams, dwSize);
00178     return 1;
00179 }
00180 
00181 /***********************************************************************
00182  *      lineDial (TAPI32.@)
00183  */
00184 DWORD WINAPI lineDialA(HCALL hCall, LPCSTR lpszDestAddress, DWORD dwCountryCode)
00185 {
00186     FIXME("(%p, %s, %08x): stub.\n", hCall, lpszDestAddress, dwCountryCode);
00187     return 1;
00188 }
00189 
00190 /***********************************************************************
00191  *      lineDrop (TAPI32.@)
00192  */
00193 DWORD WINAPI lineDrop(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
00194 {
00195     FIXME("(%p, %s, %08x): stub.\n", hCall, lpsUserUserInfo, dwSize);
00196     return 1;
00197 }
00198 
00199 /***********************************************************************
00200  *      lineForward (TAPI32.@)
00201  */
00202 DWORD WINAPI lineForwardA(HLINE hLine, DWORD bAllAddress, DWORD dwAddressID, LPLINEFORWARDLIST lpForwardList, DWORD dwNumRingsNoAnswer, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
00203 {
00204     FIXME("stub.\n");
00205     return 1;
00206 }
00207 
00208 /***********************************************************************
00209  *      lineGatherDigits (TAPI32.@)
00210  */
00211 DWORD WINAPI lineGatherDigitsA(HCALL hCall, DWORD dwDigitModes, LPSTR lpsDigits, DWORD dwNumDigits, LPCSTR lpszTerminationDigits, DWORD dwFirstDigitTimeout, DWORD dwInterDigitTimeout)
00212 {
00213     FIXME("stub.\n");
00214     return 0;
00215 }
00216 
00217 /***********************************************************************
00218  *      lineGenerateDigits (TAPI32.@)
00219  */
00220 DWORD WINAPI lineGenerateDigitsA(HCALL hCall, DWORD dwDigitModes, LPCSTR lpszDigits, DWORD dwDuration)
00221 {
00222     FIXME("(%p, %08x, %s, %d): stub.\n", hCall, dwDigitModes, lpszDigits, dwDuration);
00223     return 0;
00224 }
00225 
00226 /***********************************************************************
00227  *      lineGenerateTone (TAPI32.@)
00228  */
00229 DWORD WINAPI lineGenerateTone(HCALL hCall, DWORD dwToneMode, DWORD dwDuration, DWORD dwNumTones, LPLINEGENERATETONE lpTones)
00230 {
00231     FIXME("(%p, %08x, %d, %d, %p): stub.\n", hCall, dwToneMode, dwDuration, dwNumTones, lpTones);
00232     return 0;
00233 }
00234 
00235 /***********************************************************************
00236  *      lineGetAddressCaps (TAPI32.@)
00237  */
00238 DWORD WINAPI lineGetAddressCapsA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAddressID, DWORD dwAPIVersion, DWORD dwExtVersion, LPLINEADDRESSCAPS lpAddressCaps)
00239 {
00240     FIXME("(%p, %08x, %08x, %08x, %08x, %p): stub.\n", hLineApp, dwDeviceID, dwAddressID, dwAPIVersion, dwExtVersion, lpAddressCaps);
00241     return 0;
00242 }
00243 
00244 /***********************************************************************
00245  *      lineGetAddressID (TAPI32.@)
00246  */
00247 DWORD WINAPI lineGetAddressIDA(HLINE hLine, LPDWORD lpdwAddressID, DWORD dwAddressMode, LPCSTR lpsAddress, DWORD dwSize)
00248 {
00249     FIXME("%p, %p, %08x, %s, %d): stub.\n", hLine, lpdwAddressID, dwAddressMode, lpsAddress, dwSize);
00250     return 0;
00251 }
00252 
00253 /***********************************************************************
00254  *      lineGetAddressStatus (TAPI32.@)
00255  */
00256 DWORD WINAPI lineGetAddressStatusA(HLINE hLine, DWORD dwAddressID, LPLINEADDRESSSTATUS lpAddressStatus)
00257 {
00258     FIXME("(%p, %08x, %p): stub.\n", hLine, dwAddressID, lpAddressStatus);
00259     return 0;
00260 }
00261 
00262 /***********************************************************************
00263  *      lineGetAppPriority (TAPI32.@)
00264  */
00265 DWORD WINAPI lineGetAppPriorityA(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPVARSTRING lpExtensionName, LPDWORD lpdwPriority)
00266 {
00267     FIXME("(%s, %08x, %p, %08x, %p, %p): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpExtensionName, lpdwPriority);
00268     return 0;
00269 }
00270 
00271 /***********************************************************************
00272  *      lineGetCallInfo (TAPI32.@)
00273  */
00274 DWORD WINAPI lineGetCallInfoA(HCALL hCall, LPLINECALLINFO lpCallInfo)
00275 {
00276     FIXME("(%p, %p): stub.\n", hCall, lpCallInfo);
00277     return 0;
00278 }
00279 
00280 /***********************************************************************
00281  *      lineGetCallStatus (TAPI32.@)
00282  */
00283 DWORD WINAPI lineGetCallStatus(HCALL hCall, LPLINECALLSTATUS lpCallStatus)
00284 {
00285     FIXME("(%p, %p): stub.\n", hCall, lpCallStatus);
00286     return 0;
00287 }
00288 
00289 /***********************************************************************
00290  *      lineGetConfRelatedCalls (TAPI32.@)
00291  */
00292 DWORD WINAPI lineGetConfRelatedCalls(HCALL hCall, LPLINECALLLIST lpCallList)
00293 {
00294     FIXME("(%p, %p): stub.\n", hCall, lpCallList);
00295     return 0;
00296 }
00297 
00298 typedef struct tagTAPI_CountryInfo
00299 {
00300     DWORD  dwCountryID;
00301     DWORD  dwCountryCode;
00302     LPSTR  lpCountryName;
00303     LPSTR  lpSameAreaRule;
00304     LPSTR  lpLongDistanceRule;
00305     LPSTR  lpInternationalRule;
00306 } TAPI_CountryInfo;
00307 
00308 /***********************************************************************
00309  *      lineGetCountry (TAPI32.@)
00310  */
00311 DWORD WINAPI lineGetCountryA(DWORD dwCountryID, DWORD dwAPIVersion, LPLINECOUNTRYLIST lpLineCountryList)
00312 {
00313     DWORD dwAvailSize, dwOffset, i, num_countries, max_subkey_len;
00314     LPLINECOUNTRYENTRY lpLCE;
00315     HKEY hkey;
00316     char *subkey_name;
00317 
00318     if(!lpLineCountryList) {
00319     TRACE("(%08x, %08x, %p): stub. Returning LINEERR_INVALPOINTER\n",
00320           dwCountryID, dwAPIVersion, lpLineCountryList);
00321         return LINEERR_INVALPOINTER;
00322     }
00323 
00324     TRACE("(%08x, %08x, %p(%d)): stub.\n",
00325       dwCountryID, dwAPIVersion, lpLineCountryList,
00326       lpLineCountryList->dwTotalSize);
00327 
00328     if(RegOpenKeyA(HKEY_LOCAL_MACHINE, szCountrylistKey, &hkey)
00329             != ERROR_SUCCESS)
00330         return LINEERR_INIFILECORRUPT;
00331 
00332 
00333     dwAvailSize = lpLineCountryList->dwTotalSize;
00334     dwOffset = sizeof (LINECOUNTRYLIST);
00335 
00336     if(dwAvailSize<dwOffset)
00337         return LINEERR_STRUCTURETOOSMALL;
00338 
00339     memset(lpLineCountryList, 0, dwAvailSize);
00340 
00341     lpLineCountryList->dwTotalSize         = dwAvailSize;
00342     lpLineCountryList->dwUsedSize          = dwOffset;
00343     lpLineCountryList->dwNumCountries      = 0;
00344     lpLineCountryList->dwCountryListSize   = 0;
00345     lpLineCountryList->dwCountryListOffset = dwOffset;
00346 
00347     lpLCE = (LPLINECOUNTRYENTRY)(&lpLineCountryList[1]);
00348 
00349     if(RegQueryInfoKeyA(hkey, NULL, NULL, NULL, &num_countries, &max_subkey_len,
00350             NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {
00351         RegCloseKey(hkey);
00352         return LINEERR_STRUCTURETOOSMALL;
00353     }
00354 
00355     if(dwCountryID)
00356         dwOffset = sizeof (LINECOUNTRYENTRY);
00357     else
00358         dwOffset += num_countries * sizeof (LINECOUNTRYENTRY);
00359 
00360     max_subkey_len++;
00361     subkey_name = HeapAlloc(GetProcessHeap(), 0, max_subkey_len);
00362     for(i = 0; i < num_countries; i++)
00363     {
00364         DWORD len, size, size_int, size_long, size_name, size_same;
00365     HKEY hsubkey;
00366 
00367     if(RegEnumKeyA(hkey, i, subkey_name, max_subkey_len) !=
00368        ERROR_SUCCESS)
00369         continue;
00370 
00371         if(dwCountryID && (atoi(subkey_name) != dwCountryID))
00372             continue;
00373 
00374     if(RegOpenKeyA(hkey, subkey_name, &hsubkey) != ERROR_SUCCESS)
00375         continue;
00376 
00377     RegQueryValueExA(hsubkey, "InternationalRule", NULL, NULL,
00378              NULL, &size_int);
00379         len  = size_int;
00380 
00381     RegQueryValueExA(hsubkey, "LongDistanceRule", NULL, NULL,
00382              NULL, &size_long);
00383         len += size_long;
00384 
00385     RegQueryValueExA(hsubkey, "Name", NULL, NULL,
00386              NULL, &size_name);
00387         len += size_name;
00388 
00389     RegQueryValueExA(hsubkey, "SameAreaRule", NULL, NULL,
00390              NULL, &size_same);
00391         len += size_same;
00392 
00393         if(dwAvailSize < (dwOffset+len))
00394         {
00395             dwOffset += len;
00396         RegCloseKey(hsubkey);
00397         if(dwCountryID)
00398         break;
00399             continue;
00400         }
00401 
00402         lpLineCountryList->dwNumCountries++;
00403         lpLineCountryList->dwCountryListSize += sizeof (LINECOUNTRYENTRY);
00404         lpLineCountryList->dwUsedSize += len + sizeof (LINECOUNTRYENTRY);
00405 
00406     if(dwCountryID)
00407         i = 0;
00408 
00409         lpLCE[i].dwCountryID = atoi(subkey_name);
00410     size = sizeof(DWORD);
00411     RegQueryValueExA(hsubkey, "CountryCode", NULL, NULL,
00412              (BYTE*)&lpLCE[i].dwCountryCode, &size);
00413 
00414     lpLCE[i].dwNextCountryID = 0;
00415         
00416     if(i > 0)
00417             lpLCE[i-1].dwNextCountryID = lpLCE[i].dwCountryID;
00418 
00419         /* add country name */
00420         lpLCE[i].dwCountryNameSize = size_name;
00421         lpLCE[i].dwCountryNameOffset = dwOffset;
00422     RegQueryValueExA(hsubkey, "Name", NULL, NULL,
00423              ((LPBYTE)lpLineCountryList)+dwOffset,
00424              &size_name);
00425         dwOffset += size_name;
00426 
00427         /* add Same Area Rule */
00428         lpLCE[i].dwSameAreaRuleSize = size_same;
00429         lpLCE[i].dwSameAreaRuleOffset = dwOffset;
00430     RegQueryValueExA(hsubkey, "SameAreaRule", NULL, NULL,
00431              ((LPBYTE)lpLineCountryList)+dwOffset,
00432              &size_same);
00433         dwOffset += size_same;
00434 
00435         /* add Long Distance Rule */
00436         lpLCE[i].dwLongDistanceRuleSize = size_long;
00437         lpLCE[i].dwLongDistanceRuleOffset = dwOffset;
00438     RegQueryValueExA(hsubkey, "LongDistanceRule", NULL, NULL,
00439              ((LPBYTE)lpLineCountryList)+dwOffset,
00440              &size_long);
00441         dwOffset += size_long;
00442 
00443         /* add Long Distance Rule */
00444         lpLCE[i].dwInternationalRuleSize = size_int;
00445         lpLCE[i].dwInternationalRuleOffset = dwOffset;
00446     RegQueryValueExA(hsubkey, "InternationalRule", NULL, NULL,
00447              ((LPBYTE)lpLineCountryList)+dwOffset,
00448              &size_int);
00449         dwOffset += size_int;
00450     RegCloseKey(hsubkey);
00451 
00452         TRACE("Added country %s at %p\n", (LPSTR)lpLineCountryList + lpLCE[i].dwCountryNameOffset,
00453           &lpLCE[i]);
00454 
00455     if(dwCountryID) break;
00456     }
00457 
00458     lpLineCountryList->dwNeededSize = dwOffset;
00459 
00460     TRACE("%d available %d required\n", dwAvailSize, dwOffset);
00461 
00462     HeapFree(GetProcessHeap(), 0, subkey_name);
00463     RegCloseKey(hkey);
00464 
00465     return 0;
00466 }
00467 
00468 /***********************************************************************
00469  *      lineGetDevCapsW (TAPI32.@)
00470  */
00471 DWORD WINAPI lineGetDevCapsW(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion,
00472                              DWORD dwExtVersion, LPLINEDEVCAPS lpLineDevCaps)
00473 {
00474     FIXME("(%p, %08x, %08x, %08x, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion,
00475                                                  dwExtVersion, lpLineDevCaps);
00476     return LINEERR_OPERATIONFAILED;
00477 }
00478 
00479 /***********************************************************************
00480  *      lineGetDevCapsA (TAPI32.@)
00481  */
00482 DWORD WINAPI lineGetDevCapsA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion,
00483                              DWORD dwExtVersion, LPLINEDEVCAPS lpLineDevCaps)
00484 {
00485     FIXME("(%p, %08x, %08x, %08x, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion,
00486                                                  dwExtVersion, lpLineDevCaps);
00487     return LINEERR_OPERATIONFAILED;
00488 }
00489 
00490 /***********************************************************************
00491  *      lineGetDevConfig (TAPI32.@)
00492  */
00493 DWORD WINAPI lineGetDevConfigA(DWORD dwDeviceID, LPVARSTRING lpDeviceConfig, LPCSTR lpszDeviceClass)
00494 {
00495     FIXME("(%08x, %p, %s): stub.\n", dwDeviceID, lpDeviceConfig, lpszDeviceClass);
00496     return 0;
00497 }
00498 
00499 /***********************************************************************
00500  *      lineGetIDW (TAPI32.@)
00501  */
00502 DWORD WINAPI lineGetIDW(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect,
00503                         LPVARSTRING lpDeviceID, LPCWSTR lpszDeviceClass)
00504 {
00505     FIXME("(%p, %08x, %p, %08x, %p, %s): stub.\n", hLine, dwAddressID, hCall,
00506                                                    dwSelect, lpDeviceID,
00507                                                    debugstr_w(lpszDeviceClass));
00508     return LINEERR_OPERATIONFAILED;
00509 }
00510 
00511 /***********************************************************************
00512  *      lineGetIDA (TAPI32.@)
00513  */
00514 DWORD WINAPI lineGetIDA(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect,
00515                         LPVARSTRING lpDeviceID, LPCSTR lpszDeviceClass)
00516 {
00517     FIXME("(%p, %08x, %p, %08x, %p, %s): stub.\n", hLine, dwAddressID, hCall,
00518                                                    dwSelect, lpDeviceID, lpszDeviceClass);
00519     return LINEERR_OPERATIONFAILED;
00520 }
00521 
00522 /***********************************************************************
00523  *      lineGetIcon (TAPI32.@)
00524  */
00525 DWORD WINAPI lineGetIconA(DWORD dwDeviceID, LPCSTR lpszDeviceClass, HICON *lphIcon)
00526 {
00527     FIXME("(%08x, %s, %p): stub.\n", dwDeviceID, lpszDeviceClass, lphIcon);
00528     return 0;
00529 }
00530 
00531 /***********************************************************************
00532  *      lineGetLineDevStatus (TAPI32.@)
00533  */
00534 DWORD WINAPI lineGetLineDevStatusA(HLINE hLine, LPLINEDEVSTATUS lpLineDevStatus)
00535 {
00536     FIXME("(%p, %p): stub.\n", hLine, lpLineDevStatus);
00537     return 0;
00538 }
00539 
00540 /***********************************************************************
00541  *      lineGetNewCalls (TAPI32.@)
00542  */
00543 DWORD WINAPI lineGetNewCalls(HLINE hLine, DWORD dwAddressID, DWORD dwSelect, LPLINECALLLIST lpCallList)
00544 {
00545     FIXME("(%p, %08x, %08x, %p): stub.\n", hLine, dwAddressID, dwSelect, lpCallList);
00546     return 0;
00547 }
00548 
00549 /***********************************************************************
00550  *      lineGetNumRings (TAPI32.@)
00551  */
00552 DWORD WINAPI lineGetNumRings(HLINE hLine, DWORD dwAddressID, LPDWORD lpdwNumRings)
00553 {
00554     FIXME("(%p, %08x, %p): stub.\n", hLine, dwAddressID, lpdwNumRings);
00555     return 0;
00556 }
00557 
00558 /***********************************************************************
00559  *      lineGetProviderListA (TAPI32.@)
00560  */
00561 DWORD WINAPI lineGetProviderListA(DWORD dwAPIVersion, LPLINEPROVIDERLIST lpProviderList)
00562 {
00563     FIXME("(%08x, %p): stub.\n", dwAPIVersion, lpProviderList);
00564     return LINEERR_OPERATIONFAILED;
00565 }
00566 
00567 /***********************************************************************
00568  *      lineGetProviderListW (TAPI32.@)
00569  */
00570 DWORD WINAPI lineGetProviderListW(DWORD dwAPIVersion, LPLINEPROVIDERLIST lpProviderList)
00571 {
00572     FIXME("(%08x, %p): stub.\n", dwAPIVersion, lpProviderList);
00573     return LINEERR_OPERATIONFAILED;
00574 }
00575 
00576 /***********************************************************************
00577  *      lineGetRequest (TAPI32.@)
00578  */
00579 DWORD WINAPI lineGetRequestA(HLINEAPP hLineApp, DWORD dwRequestMode, LPVOID lpRequestBuffer)
00580 {
00581     FIXME("%p, %08x, %p): stub.\n", hLineApp, dwRequestMode, lpRequestBuffer);
00582     return 0;
00583 }
00584 
00585 /***********************************************************************
00586  *      lineGetStatusMessages (TAPI32.@)
00587  */
00588 DWORD WINAPI lineGetStatusMessages(HLINE hLine, LPDWORD lpdwLineStatus, LPDWORD lpdwAddressStates)
00589 {
00590     FIXME("(%p, %p, %p): stub.\n", hLine, lpdwLineStatus, lpdwAddressStates);
00591     return 0;
00592 }
00593 
00594 /***********************************************************************
00595  *      lineGetTranslateCaps (TAPI32.@)
00596  *
00597  *      get address translate capabilities. Returns a LINETRANSLATECAPS
00598  *      structure:
00599  *
00600  *      +-----------------------+
00601  *      |TotalSize              |
00602  *      |NeededSize             |
00603  *      |UsedSize               |
00604  *      +-----------------------+
00605  *      |NumLocations           |
00606  *      |LocationsListSize      |
00607  *      |LocationsListOffset    | -+
00608  *      |CurrentLocationID      |  |
00609  *      +-----------------------+  |
00610  *      |NumCards               |  |
00611  *      |CardListSize           |  |
00612  *      |CardListOffset         | -|--+
00613  *      |CurrentPreferredCardID |  |  |
00614  *      +-----------------------+  |  |
00615  *      |                       | <+  |
00616  *      |LINELOCATIONENTRY #1   |     |
00617  *      |                       |     |
00618  *      +-----------------------+     |
00619  *      ~                       ~     |
00620  *      +-----------------------+     |
00621  *      |                       |     |
00622  *      |LINELOCATIONENTRY      |     |
00623  *      |          #NumLocations|     |
00624  *      +-----------------------+     |
00625  *      |                       | <---+
00626  *      |LINECARDENTRY #1       |
00627  *      |                       |
00628  *      +-----------------------+
00629  *      ~                       ~
00630  *      +-----------------------+
00631  *      |                       |
00632  *      |LINECARDENTRY #NumCards|
00633  *      |                       |
00634  *      +-----------------------+
00635  *      | room for strings named|
00636  *      | in the structures     |
00637  *      | above.                |
00638  *      +-----------------------+
00639  */
00640 DWORD WINAPI lineGetTranslateCapsA(HLINEAPP hLineApp, DWORD dwAPIVersion,
00641         LPLINETRANSLATECAPS lpTranslateCaps)
00642 {
00643     HKEY hkLocations, hkCards, hkCardLocations, hsubkey;
00644     int numlocations, numcards;
00645     DWORD maxlockeylen,
00646         maxcardkeylen;
00647     char *loc_key_name = NULL;
00648     char *card_key_name = NULL;
00649     LPBYTE strptr;
00650     int length;
00651     int i;
00652     DWORD lendword;
00653     DWORD currentid;
00654     LPLINELOCATIONENTRY pLocEntry;
00655     LPLINECARDENTRY pCardEntry;
00656     
00657     TRACE("(%p, %08x, %p (tot. size %d)\n", hLineApp, dwAPIVersion,
00658             lpTranslateCaps, lpTranslateCaps->dwTotalSize );
00659     if( lpTranslateCaps->dwTotalSize < sizeof(LINETRANSLATECAPS))
00660         return LINEERR_STRUCTURETOOSMALL;
00661     if( RegCreateKeyA(HKEY_LOCAL_MACHINE, szLocationsKey, &hkLocations)
00662             != ERROR_SUCCESS ) {
00663         ERR("unexpected registry error 1.\n");
00664         return LINEERR_INIFILECORRUPT;  
00665     }
00666     lendword = sizeof( DWORD);
00667     if( RegQueryValueExA( hkLocations, "CurrentID", NULL, NULL,
00668                 (LPBYTE) &currentid, &lendword) != ERROR_SUCCESS )
00669         currentid = -1;  /* change this later */
00670     if(RegQueryInfoKeyA(hkLocations, NULL, NULL, NULL, NULL, &maxlockeylen,
00671             NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {
00672         RegCloseKey(hkLocations);
00673         ERR("unexpected registry error 2.\n");
00674         return LINEERR_INIFILECORRUPT;
00675     }
00676     maxlockeylen++;
00677     if( maxlockeylen < 10)
00678         maxlockeylen = 10; /* need this also if there is no key */
00679     loc_key_name = HeapAlloc( GetProcessHeap(), 0, maxlockeylen);
00680     /* first time through: calculate needed space */
00681     length=0;
00682     i=0;
00683     numlocations=0;
00684     while( RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen)
00685             == ERROR_SUCCESS){
00686         DWORD size_val;
00687         i++;
00688         if( strncasecmp(loc_key_name, "location", 8)  ||
00689                 (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey)
00690                  != ERROR_SUCCESS))
00691             continue;
00692         numlocations++;
00693         length += sizeof(LINELOCATIONENTRY);
00694         RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val); 
00695         length += size_val;
00696         RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL,NULL,&size_val); 
00697         length += size_val;
00698         RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL,NULL,&size_val); 
00699         length += size_val;
00700         RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL,NULL,&size_val); 
00701         length += size_val;
00702         RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL,NULL,&size_val); 
00703         length += size_val;
00704         /* fixme: what about TollPrefixList???? */
00705         RegCloseKey(hsubkey);
00706     }
00707     if(numlocations == 0) {
00708         /* add one location */
00709         if( RegCreateKeyA( hkLocations, "Location1", &hsubkey)
00710                 == ERROR_SUCCESS) {
00711             DWORD dwval;
00712             char buf[10];
00713             numlocations = 1;
00714             length += sizeof(LINELOCATIONENTRY) + 20 ;
00715             RegSetValueExA( hsubkey, "AreaCode", 0, REG_SZ, (const BYTE *)"010", 4);
00716             GetLocaleInfoA( LOCALE_SYSTEM_DEFAULT, LOCALE_ICOUNTRY, buf, 8);
00717             dwval = atoi(buf);
00718             RegSetValueExA( hsubkey, "Country", 0, REG_DWORD, (LPBYTE)&dwval,
00719                     sizeof(DWORD));
00720             RegSetValueExA( hsubkey, "DisableCallWaiting", 0, REG_SZ, (const BYTE *)"", 1);
00721             dwval = 1;  
00722             RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval,
00723                     sizeof(DWORD));
00724             RegSetValueExA( hsubkey, "LongDistanceAccess", 0, REG_SZ, (const BYTE *)"", 1);
00725             RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (const BYTE *)"New Location", 13);
00726             RegSetValueExA( hsubkey, "OutsideAccess", 0, REG_SZ, (const BYTE *)"", 1);
00727             RegCloseKey(hsubkey);
00728             dwval = 1;  
00729             RegSetValueExA( hkLocations, "CurrentID", 0, REG_DWORD,
00730                     (LPBYTE)&dwval, sizeof(DWORD));
00731             dwval = 2;  
00732             RegSetValueExA( hkLocations, "NextID", 0, REG_DWORD, (LPBYTE)&dwval,
00733                     sizeof(DWORD));
00734         }
00735     }
00736     /* do the card list */
00737     numcards=0;
00738     if( RegCreateKeyA(HKEY_CURRENT_USER, szCardsKey, &hkCards)
00739             == ERROR_SUCCESS ) {
00740         if(RegQueryInfoKeyA(hkCards, NULL, NULL, NULL, NULL, &maxcardkeylen,
00741                 NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
00742             maxcardkeylen++;
00743             if( maxcardkeylen < 6) maxcardkeylen = 6;
00744             card_key_name = HeapAlloc(GetProcessHeap(), 0, maxcardkeylen);
00745             i=0;
00746             while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) ==
00747                     ERROR_SUCCESS){
00748                 DWORD size_val;
00749                 i++;
00750                 if( strncasecmp(card_key_name, "card", 4)  || ERROR_SUCCESS !=
00751                         (RegOpenKeyA(hkCards, card_key_name, &hsubkey) ))
00752                     continue;
00753                 numcards++;
00754                 length += sizeof(LINECARDENTRY);
00755                 RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val); 
00756                 length += size_val;
00757                 RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL,NULL,&size_val); 
00758                 length += size_val;
00759                 RegQueryValueExA(hsubkey, "LDRule",NULL,NULL,NULL,&size_val); 
00760                 length += size_val;
00761                 RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL,NULL,
00762                         &size_val); 
00763                 length += size_val;
00764                 RegCloseKey(hsubkey);
00765             }
00766         }
00767         /* add one card (direct call) */
00768         if (numcards == 0 &&
00769                 ERROR_SUCCESS == RegCreateKeyA( hkCards, "Card1", &hsubkey)) {
00770             DWORD dwval;
00771             numcards = 1;
00772             length += sizeof(LINECARDENTRY) + 22 ;
00773             RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (const BYTE *)"None (Direct Call)", 19);
00774             dwval = 1;  
00775             RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval,
00776                     sizeof(DWORD));
00777             RegSetValueExA( hsubkey, "InternationalRule", 0, REG_SZ, (const BYTE *)"", 1);
00778             RegSetValueExA( hsubkey, "LDRule", 0, REG_SZ, (const BYTE *)"", 1);
00779             RegSetValueExA( hsubkey, "LocalRule", 0, REG_SZ, (const BYTE *)"", 1);
00780             RegCloseKey(hsubkey);
00781             dwval = 2;  
00782             RegSetValueExA( hkCards, "NextID", 0, REG_DWORD, (LPBYTE)&dwval,
00783                     sizeof(DWORD));
00784         }
00785     } else hkCards = 0;  /* should really fail */
00786     /* check if sufficient room is available */
00787     lpTranslateCaps->dwNeededSize =  sizeof(LINETRANSLATECAPS) + length;
00788     if ( lpTranslateCaps->dwNeededSize > lpTranslateCaps->dwTotalSize ) {
00789         RegCloseKey( hkLocations);
00790         if( hkCards) RegCloseKey( hkCards);
00791         HeapFree(GetProcessHeap(), 0, loc_key_name);
00792         HeapFree(GetProcessHeap(), 0, card_key_name);
00793         lpTranslateCaps->dwUsedSize = sizeof(LINETRANSLATECAPS);
00794         TRACE("Insufficient space: total %d needed %d used %d\n",
00795                 lpTranslateCaps->dwTotalSize,
00796                 lpTranslateCaps->dwNeededSize,
00797                 lpTranslateCaps->dwUsedSize);
00798         return  0;
00799     }
00800     /* fill in the LINETRANSLATECAPS structure */
00801     lpTranslateCaps->dwUsedSize = lpTranslateCaps->dwNeededSize;
00802     lpTranslateCaps->dwNumLocations = numlocations;
00803     lpTranslateCaps->dwLocationListSize = sizeof(LINELOCATIONENTRY) *
00804             lpTranslateCaps->dwNumLocations;
00805     lpTranslateCaps->dwLocationListOffset = sizeof(LINETRANSLATECAPS);
00806     lpTranslateCaps->dwCurrentLocationID = currentid; 
00807     lpTranslateCaps->dwNumCards = numcards;
00808     lpTranslateCaps->dwCardListSize = sizeof(LINECARDENTRY) *
00809             lpTranslateCaps->dwNumCards;
00810     lpTranslateCaps->dwCardListOffset = lpTranslateCaps->dwLocationListOffset +
00811             lpTranslateCaps->dwLocationListSize;
00812     lpTranslateCaps->dwCurrentPreferredCardID = 0; 
00813     /* this is where the strings will be stored */
00814     strptr = ((LPBYTE) lpTranslateCaps) +
00815         lpTranslateCaps->dwCardListOffset + lpTranslateCaps->dwCardListSize;
00816     pLocEntry = (LPLINELOCATIONENTRY) (lpTranslateCaps + 1);
00817     /* key with Preferred CardID's */
00818     if( RegOpenKeyA(HKEY_CURRENT_USER, szLocationsKey, &hkCardLocations)
00819             != ERROR_SUCCESS ) 
00820         hkCardLocations = 0;
00821     /* second time through all locations */
00822     i=0;
00823     while(RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen)
00824             == ERROR_SUCCESS){
00825         DWORD size_val;
00826         i++;
00827         if( strncasecmp(loc_key_name, "location", 8)  ||
00828                 (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey)
00829                  != ERROR_SUCCESS))
00830             continue;
00831         size_val=sizeof(DWORD);
00832         if( RegQueryValueExA(hsubkey, "ID",NULL, NULL,
00833                 (LPBYTE) &(pLocEntry->dwPermanentLocationID), &size_val) !=
00834                 ERROR_SUCCESS)
00835             pLocEntry->dwPermanentLocationID = atoi( loc_key_name + 8);
00836         size_val=2048;
00837         RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val);
00838         pLocEntry->dwLocationNameSize = size_val;
00839         pLocEntry->dwLocationNameOffset = strptr - (LPBYTE) lpTranslateCaps;
00840         strptr += size_val;
00841  
00842         size_val=2048;
00843         RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL, strptr, &size_val);
00844         pLocEntry->dwCityCodeSize = size_val;
00845         pLocEntry->dwCityCodeOffset = strptr - (LPBYTE) lpTranslateCaps;
00846         strptr += size_val;
00847         
00848         size_val=2048;
00849         RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL, strptr, &size_val);
00850         pLocEntry->dwLocalAccessCodeSize = size_val;
00851         pLocEntry->dwLocalAccessCodeOffset = strptr - (LPBYTE) lpTranslateCaps;
00852         strptr += size_val;
00853         size_val=2048;
00854         RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL, strptr,
00855                 &size_val);
00856         pLocEntry->dwLongDistanceAccessCodeSize= size_val;
00857         pLocEntry->dwLongDistanceAccessCodeOffset= strptr -
00858             (LPBYTE) lpTranslateCaps;
00859         strptr += size_val;
00860         size_val=2048;
00861         RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL, strptr,
00862                 &size_val);
00863         pLocEntry->dwCancelCallWaitingSize= size_val;
00864         pLocEntry->dwCancelCallWaitingOffset= strptr - (LPBYTE) lpTranslateCaps;
00865         strptr += size_val;
00866 
00867         pLocEntry->dwTollPrefixListSize = 0;    /* FIXME */
00868         pLocEntry->dwTollPrefixListOffset = 0;    /* FIXME */
00869 
00870         size_val=sizeof(DWORD);
00871         RegQueryValueExA(hsubkey, "Country",NULL,NULL,
00872                 (LPBYTE) &(pLocEntry->dwCountryCode), &size_val);
00873         pLocEntry->dwCountryID = pLocEntry->dwCountryCode; /* FIXME */
00874         RegQueryValueExA(hsubkey, "Flags",NULL,NULL,
00875                 (LPBYTE) &(pLocEntry->dwOptions), &size_val);
00876         RegCloseKey(hsubkey);
00877         /* get preferred cardid */
00878         pLocEntry->dwPreferredCardID = 0;
00879         if ( hkCardLocations) {
00880             size_val=sizeof(DWORD);
00881             if(RegOpenKeyA(hkCardLocations, loc_key_name, &hsubkey) ==
00882                     ERROR_SUCCESS) {
00883                 RegQueryValueExA(hsubkey, "CallingCard",NULL,NULL,
00884                         (LPBYTE) &(pLocEntry->dwPreferredCardID), &size_val);
00885                 RegCloseKey(hsubkey);
00886             }
00887                 
00888         }
00889         /* make sure there is a currentID */
00890         if(currentid == -1){
00891             currentid = pLocEntry->dwPermanentLocationID;
00892             lpTranslateCaps->dwCurrentLocationID = currentid; 
00893         }
00894         if(pLocEntry->dwPermanentLocationID == currentid )
00895             lpTranslateCaps->dwCurrentPreferredCardID =
00896                     pLocEntry->dwPreferredCardID;
00897         TRACE("added: ID %d %s CountryCode %d CityCode %s CardID %d "
00898                 "LocalAccess: %s LongDistanceAccess: %s CountryID %d "
00899                 "Options %d CancelCallWait %s\n",
00900                 pLocEntry->dwPermanentLocationID,
00901                 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocationNameOffset),
00902                 pLocEntry->dwCountryCode,
00903                 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCityCodeOffset),
00904                 pLocEntry->dwPreferredCardID,
00905                 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocalAccessCodeOffset),
00906                 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLongDistanceAccessCodeOffset),
00907                 pLocEntry->dwCountryID,
00908                 pLocEntry->dwOptions,
00909                 debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCancelCallWaitingOffset));
00910         pLocEntry++;
00911     }
00912     pCardEntry= (LPLINECARDENTRY) pLocEntry;
00913     /* do the card list */
00914     if( hkCards) {
00915         i=0;
00916         while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) ==
00917                 ERROR_SUCCESS){
00918             DWORD size_val;
00919             i++;
00920             if( strncasecmp(card_key_name, "card", 4)  ||
00921                     (RegOpenKeyA(hkCards, card_key_name, &hsubkey) != ERROR_SUCCESS))
00922                 continue;
00923             size_val=sizeof(DWORD);
00924             if( RegQueryValueExA(hsubkey, "ID",NULL, NULL,
00925                     (LPBYTE) &(pCardEntry->dwPermanentCardID), &size_val) !=
00926                     ERROR_SUCCESS)
00927                 pCardEntry->dwPermanentCardID= atoi( card_key_name + 4);
00928             size_val=2048;
00929             RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val);
00930             pCardEntry->dwCardNameSize = size_val;
00931             pCardEntry->dwCardNameOffset = strptr - (LPBYTE) lpTranslateCaps;
00932             strptr += size_val;
00933             pCardEntry->dwCardNumberDigits = 1; /* FIXME */
00934             size_val=2048;
00935             RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL, strptr, &size_val);
00936             pCardEntry->dwSameAreaRuleSize= size_val;
00937             pCardEntry->dwSameAreaRuleOffset= strptr - (LPBYTE) lpTranslateCaps;
00938             strptr += size_val;
00939             size_val=2048;
00940             RegQueryValueExA(hsubkey, "LDRule",NULL,NULL, strptr, &size_val);
00941             pCardEntry->dwLongDistanceRuleSize = size_val;
00942             pCardEntry->dwLongDistanceRuleOffset = strptr - (LPBYTE) lpTranslateCaps;
00943             strptr += size_val;
00944             size_val=2048;
00945             RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL, strptr,
00946                     &size_val);
00947             pCardEntry->dwInternationalRuleSize = size_val;
00948             pCardEntry->dwInternationalRuleOffset = strptr -
00949                 (LPBYTE) lpTranslateCaps;
00950             strptr += size_val;
00951             size_val=sizeof(DWORD);
00952             RegQueryValueExA(hsubkey, "Flags",NULL, NULL,
00953                     (LPBYTE) &(pCardEntry->dwOptions), &size_val); 
00954             TRACE( "added card: ID %d name %s SameArea %s LongDistance %s International %s Options 0x%x\n", 
00955                     pCardEntry->dwPermanentCardID,
00956                     debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwCardNameOffset),
00957                     debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwSameAreaRuleOffset),
00958                     debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwLongDistanceRuleOffset),
00959                     debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwInternationalRuleOffset),
00960                     pCardEntry->dwOptions);
00961 
00962             pCardEntry++;
00963         }
00964     }
00965 
00966     if(hkLocations) RegCloseKey(hkLocations);
00967     if(hkCards) RegCloseKey(hkCards);
00968     if(hkCardLocations) RegCloseKey(hkCardLocations);
00969     HeapFree(GetProcessHeap(), 0, loc_key_name);
00970     HeapFree(GetProcessHeap(), 0, card_key_name);
00971     TRACE(" returning success tot %d needed %d used %d\n",
00972             lpTranslateCaps->dwTotalSize,
00973             lpTranslateCaps->dwNeededSize,
00974             lpTranslateCaps->dwUsedSize );
00975     return 0; /* success */
00976 }
00977 
00978 /***********************************************************************
00979  *      lineHandoff (TAPI32.@)
00980  */
00981 DWORD WINAPI lineHandoffA(HCALL hCall, LPCSTR lpszFileName, DWORD dwMediaMode)
00982 {
00983     FIXME("(%p, %s, %08x): stub.\n", hCall, lpszFileName, dwMediaMode);
00984     return 0;
00985 }
00986 
00987 /***********************************************************************
00988  *      lineHold (TAPI32.@)
00989  */
00990 DWORD WINAPI lineHold(HCALL hCall)
00991 {
00992     FIXME("(%p): stub.\n", hCall);
00993     return 1;
00994 }
00995 
00996 /***********************************************************************
00997  *      lineInitialize (TAPI32.@)
00998  */
00999 DWORD WINAPI lineInitialize(
01000   LPHLINEAPP lphLineApp,
01001   HINSTANCE hInstance,
01002   LINECALLBACK lpfnCallback,
01003   LPCSTR lpszAppName,
01004   LPDWORD lpdwNumDevs)
01005 {
01006     FIXME("(%p, %p, %p, %s, %p): stub.\n", lphLineApp, hInstance,
01007       lpfnCallback, debugstr_a(lpszAppName), lpdwNumDevs);
01008     return 0;
01009 }
01010 
01011 /***********************************************************************
01012  *              lineInitializeExA (TAPI32.@)
01013  */
01014 LONG WINAPI lineInitializeExA(LPHLINEAPP lphLineApp, HINSTANCE hInstance, LINECALLBACK lpfnCallback, LPCSTR lpszFriendlyAppName, LPDWORD lpdwNumDevs, LPDWORD lpdwAPIVersion, LPLINEINITIALIZEEXPARAMS lpLineInitializeExParams)
01015 {
01016     FIXME("(%p, %p, %p, %s, %p, %p, %p): stub.\n", lphLineApp, hInstance,
01017           lpfnCallback, debugstr_a(lpszFriendlyAppName), lpdwNumDevs, lpdwAPIVersion, lpLineInitializeExParams);
01018     return 0;
01019 }
01020 
01021 /***********************************************************************
01022  *      lineMakeCallW (TAPI32.@)
01023  */
01024 DWORD WINAPI lineMakeCallW(HLINE hLine, LPHCALL lphCall, LPCWSTR lpszDestAddress,
01025                            DWORD dwCountryCode, LPLINECALLPARAMS lpCallParams)
01026 {
01027     FIXME("(%p, %p, %s, %08x, %p): stub.\n", hLine, lphCall, debugstr_w(lpszDestAddress),
01028                                              dwCountryCode, lpCallParams);
01029     return LINEERR_OPERATIONFAILED;
01030 }
01031 
01032 /***********************************************************************
01033  *      lineMakeCallA (TAPI32.@)
01034  */
01035 DWORD WINAPI lineMakeCallA(HLINE hLine, LPHCALL lphCall, LPCSTR lpszDestAddress,
01036                            DWORD dwCountryCode, LPLINECALLPARAMS lpCallParams)
01037 {
01038     FIXME("(%p, %p, %s, %08x, %p): stub.\n", hLine, lphCall, lpszDestAddress,
01039                                              dwCountryCode, lpCallParams);
01040     return LINEERR_OPERATIONFAILED;
01041 }
01042 
01043 /***********************************************************************
01044  *      lineMonitorDigits (TAPI32.@)
01045  */
01046 DWORD WINAPI lineMonitorDigits(HCALL hCall, DWORD dwDigitModes)
01047 {
01048     FIXME("(%p, %08x): stub.\n", hCall, dwDigitModes);
01049     return 0;
01050 }
01051 
01052 /***********************************************************************
01053  *      lineMonitorMedia (TAPI32.@)
01054  */
01055 DWORD WINAPI lineMonitorMedia(HCALL hCall, DWORD dwMediaModes)
01056 {
01057     FIXME("(%p, %08x): stub.\n", hCall, dwMediaModes);
01058     return 0;
01059 }
01060 
01061 /***********************************************************************
01062  *      lineMonitorTones (TAPI32.@)
01063  */
01064 DWORD WINAPI lineMonitorTones(HCALL hCall, LPLINEMONITORTONE lpToneList, DWORD dwNumEntries)
01065 {
01066     FIXME("(%p, %p, %08x): stub.\n", hCall, lpToneList, dwNumEntries);
01067     return 0;
01068 }
01069 
01070 /***********************************************************************
01071  *      lineNegotiateAPIVersion (TAPI32.@)
01072  */
01073 DWORD WINAPI lineNegotiateAPIVersion(
01074   HLINEAPP hLineApp,
01075   DWORD dwDeviceID,
01076   DWORD dwAPILowVersion,
01077   DWORD dwAPIHighVersion,
01078   LPDWORD lpdwAPIVersion,
01079   LPLINEEXTENSIONID lpExtensionID
01080 )
01081 {
01082     FIXME("(%p, %d, %d, %d, %p, %p): stub.\n", hLineApp, dwDeviceID,
01083       dwAPILowVersion, dwAPIHighVersion, lpdwAPIVersion, lpExtensionID);
01084     *lpdwAPIVersion = dwAPIHighVersion;
01085     return 0;
01086 }
01087 
01088 /***********************************************************************
01089  *      lineNegotiateExtVersion (TAPI32.@)
01090  */
01091 DWORD WINAPI lineNegotiateExtVersion(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, DWORD dwExtLowVersion, DWORD dwExtHighVersion, LPDWORD lpdwExtVersion)
01092 {
01093     FIXME("stub.\n");
01094     return 0;
01095 }
01096 
01097 /***********************************************************************
01098  *      lineOpen (TAPI32.@)
01099  */
01100 DWORD WINAPI lineOpenA(HLINEAPP hLineApp, DWORD dwDeviceID, LPHLINE lphLine, DWORD dwAPIVersion, DWORD dwExtVersion, DWORD dwCallbackInstance, DWORD dwPrivileges, DWORD dwMediaModes, LPLINECALLPARAMS lpCallParams)
01101 {
01102     FIXME("stub.\n");
01103     return 0;
01104 }
01105 
01106 /***********************************************************************
01107  *      linePark (TAPI32.@)
01108  */
01109 DWORD WINAPI lineParkA(HCALL hCall, DWORD dwParkMode, LPCSTR lpszDirAddress, LPVARSTRING lpNonDirAddress)
01110 {
01111     FIXME("(%p, %08x, %s, %p): stub.\n", hCall, dwParkMode, lpszDirAddress, lpNonDirAddress);
01112     return 1;
01113 }
01114 
01115 /***********************************************************************
01116  *      linePickup (TAPI32.@)
01117  */
01118 DWORD WINAPI linePickupA(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress, LPCSTR lpszGroupID)
01119 {
01120     FIXME("(%p, %08x, %p, %s, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress, lpszGroupID);
01121     return 1;
01122 }
01123 
01124 /***********************************************************************
01125  *      linePrepareAddToConference (TAPI32.@)
01126  */
01127 DWORD WINAPI linePrepareAddToConferenceA(HCALL hConfCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
01128 {
01129     FIXME("(%p, %p, %p): stub.\n", hConfCall, lphConsultCall, lpCallParams);
01130     return 1;
01131 }
01132 
01133 /***********************************************************************
01134  *      lineRedirect (TAPI32.@)
01135  */
01136 DWORD WINAPI lineRedirectA(
01137   HCALL hCall,
01138   LPCSTR lpszDestAddress,
01139   DWORD  dwCountryCode) {
01140 
01141   FIXME(": stub.\n");
01142   return 1;
01143 }
01144 
01145 /***********************************************************************
01146  *      lineRegisterRequestRecipient (TAPI32.@)
01147  */
01148 DWORD WINAPI lineRegisterRequestRecipient(HLINEAPP hLineApp, DWORD dwRegistrationInstance, DWORD dwRequestMode, DWORD dwEnable)
01149 {
01150     FIXME("(%p, %08x, %08x, %08x): stub.\n", hLineApp, dwRegistrationInstance, dwRequestMode, dwEnable);
01151     return 1;
01152 }
01153 
01154 /***********************************************************************
01155  *      lineReleaseUserUserInfo (TAPI32.@)
01156  */
01157 DWORD WINAPI lineReleaseUserUserInfo(HCALL hCall)
01158 {
01159     FIXME("(%p): stub.\n", hCall);
01160     return 1;
01161 }
01162 
01163 /***********************************************************************
01164  *      lineRemoveFromConference (TAPI32.@)
01165  */
01166 DWORD WINAPI lineRemoveFromConference(HCALL hCall)
01167 {
01168     FIXME("(%p): stub.\n", hCall);
01169     return 1;
01170 }
01171 
01172 /***********************************************************************
01173  *      lineRemoveProvider (TAPI32.@)
01174  */
01175 DWORD WINAPI lineRemoveProvider(DWORD dwPermanentProviderID, HWND hwndOwner)
01176 {
01177     FIXME("(%08x, %p): stub.\n", dwPermanentProviderID, hwndOwner);
01178     return 1;
01179 }
01180 
01181 /***********************************************************************
01182  *      lineSecureCall (TAPI32.@)
01183  */
01184 DWORD WINAPI lineSecureCall(HCALL hCall)
01185 {
01186     FIXME("(%p): stub.\n", hCall);
01187     return 1;
01188 }
01189 
01190 /***********************************************************************
01191  *      lineSendUserUserInfo (TAPI32.@)
01192  */
01193 DWORD WINAPI lineSendUserUserInfo(HCALL hCall, LPCSTR lpsUserUserInfo, DWORD dwSize)
01194 {
01195     FIXME("(%p, %s, %08x): stub.\n", hCall, lpsUserUserInfo, dwSize);
01196     return 1;
01197 }
01198 
01199 /***********************************************************************
01200  *      lineSetAppPriority (TAPI32.@)
01201  */
01202 DWORD WINAPI lineSetAppPriorityA(LPCSTR lpszAppFilename, DWORD dwMediaMode, LPLINEEXTENSIONID const lpExtensionID, DWORD dwRequestMode, LPCSTR lpszExtensionName, DWORD dwPriority)
01203 {
01204     FIXME("(%s, %08x, %p, %08x, %s, %08x): stub.\n", lpszAppFilename, dwMediaMode, lpExtensionID, dwRequestMode, lpszExtensionName, dwPriority);
01205     return 0;
01206 }
01207 
01208 /***********************************************************************
01209  *      lineSetAppSpecific (TAPI32.@)
01210  */
01211 DWORD WINAPI lineSetAppSpecific(HCALL hCall, DWORD dwAppSpecific)
01212 {
01213     FIXME("(%p, %08x): stub.\n", hCall, dwAppSpecific);
01214     return 0;
01215 }
01216 
01217 /***********************************************************************
01218  *      lineSetCallParams (TAPI32.@)
01219  */
01220 DWORD WINAPI lineSetCallParams(HCALL hCall, DWORD dwBearerMode, DWORD dwMinRate, DWORD dwMaxRate, LPLINEDIALPARAMS lpDialParams)
01221 {
01222     FIXME("(%p, %08x, %08x, %08x, %p): stub.\n", hCall, dwBearerMode, dwMinRate, dwMaxRate, lpDialParams);
01223     return 1;
01224 }
01225 
01226 /***********************************************************************
01227  *      lineSetCallPrivilege (TAPI32.@)
01228  */
01229 DWORD WINAPI lineSetCallPrivilege(HCALL hCall, DWORD dwCallPrivilege)
01230 {
01231     FIXME("(%p, %08x): stub.\n", hCall, dwCallPrivilege);
01232     return 0;
01233 }
01234 
01235 /***********************************************************************
01236  *      lineSetCurrentLocation (TAPI32.@)
01237  */
01238 DWORD WINAPI lineSetCurrentLocation(HLINEAPP hLineApp, DWORD dwLocation)
01239 {
01240     FIXME("(%p, %08x): stub.\n", hLineApp, dwLocation);
01241     return 0;
01242 }
01243 
01244 /***********************************************************************
01245  *      lineSetDevConfig (TAPI32.@)
01246  */
01247 DWORD WINAPI lineSetDevConfigA(DWORD dwDeviceID, LPVOID lpDeviceConfig, DWORD dwSize, LPCSTR lpszDeviceClass)
01248 {
01249     FIXME("(%08x, %p, %08x, %s): stub.\n", dwDeviceID, lpDeviceConfig, dwSize, lpszDeviceClass);
01250     return 0;
01251 }
01252 
01253 /***********************************************************************
01254  *      lineSetMediaControl (TAPI32.@)
01255  */
01256 DWORD WINAPI lineSetMediaControl(
01257 HLINE hLine,
01258 DWORD dwAddressID,
01259 HCALL hCall,
01260 DWORD dwSelect,
01261 LPLINEMEDIACONTROLDIGIT const lpDigitList,
01262 DWORD dwDigitNumEntries,
01263 LPLINEMEDIACONTROLMEDIA const lpMediaList,
01264 DWORD dwMediaNumEntries,
01265 LPLINEMEDIACONTROLTONE const lpToneList,
01266 DWORD dwToneNumEntries,
01267 LPLINEMEDIACONTROLCALLSTATE const lpCallStateList,
01268 DWORD dwCallStateNumEntries)
01269 {
01270     FIXME(": stub.\n");
01271     return 0;
01272 }
01273 
01274 /***********************************************************************
01275  *      lineSetMediaMode (TAPI32.@)
01276  */
01277 DWORD WINAPI lineSetMediaMode(HCALL hCall, DWORD dwMediaModes)
01278 {
01279     FIXME("(%p, %08x): stub.\n", hCall, dwMediaModes);
01280     return 0;
01281 }
01282 
01283 /***********************************************************************
01284  *      lineSetNumRings (TAPI32.@)
01285  */
01286 DWORD WINAPI lineSetNumRings(HLINE hLine, DWORD dwAddressID, DWORD dwNumRings)
01287 {
01288     FIXME("(%p, %08x, %08x): stub.\n", hLine, dwAddressID, dwNumRings);
01289     return 0;
01290 }
01291 
01292 /***********************************************************************
01293  *      lineSetStatusMessages (TAPI32.@)
01294  */
01295 DWORD WINAPI lineSetStatusMessages(HLINE hLine, DWORD dwLineStates, DWORD dwAddressStates)
01296 {
01297     FIXME("(%p, %08x, %08x): stub.\n", hLine, dwLineStates, dwAddressStates);
01298     return 0;
01299 }
01300 
01301 /***********************************************************************
01302  *      lineSetTerminal (TAPI32.@)
01303  */
01304 DWORD WINAPI lineSetTerminal(HLINE hLine, DWORD dwAddressID, HCALL hCall, DWORD dwSelect, DWORD dwTerminalModes, DWORD dwTerminalID, DWORD bEnable)
01305 {
01306     FIXME("(%p, %08x, %p, %08x, %08x, %08x, %08x): stub.\n", hLine, dwAddressID, hCall, dwSelect, dwTerminalModes, dwTerminalID, bEnable);
01307     return 1;
01308 }
01309 
01310 /***********************************************************************
01311  *      lineSetTollList (TAPI32.@)
01312  */
01313 DWORD WINAPI lineSetTollListA(HLINEAPP hLineApp, DWORD dwDeviceID, LPCSTR lpszAddressIn, DWORD dwTollListOption)
01314 {
01315     FIXME("(%p, %08x, %s, %08x): stub.\n", hLineApp, dwDeviceID, lpszAddressIn, dwTollListOption);
01316     return 0;
01317 }
01318 
01319 /***********************************************************************
01320  *      lineSetupConference (TAPI32.@)
01321  */
01322 DWORD WINAPI lineSetupConferenceA(HCALL hCall, HLINE hLine, LPHCALL lphConfCall, LPHCALL lphConsultCall, DWORD dwNumParties, LPLINECALLPARAMS lpCallParams)
01323 {
01324     FIXME("(%p, %p, %p, %p, %08x, %p): stub.\n", hCall, hLine, lphConfCall, lphConsultCall, dwNumParties, lpCallParams);
01325     return 1;
01326 }
01327 
01328 /***********************************************************************
01329  *      lineSetupTransfer (TAPI32.@)
01330  */
01331 DWORD WINAPI lineSetupTransferA(HCALL hCall, LPHCALL lphConsultCall, LPLINECALLPARAMS lpCallParams)
01332 {
01333     FIXME("(%p, %p, %p): stub.\n", hCall, lphConsultCall, lpCallParams);
01334     return 1;
01335 }
01336 
01337 /***********************************************************************
01338  *      lineShutdown (TAPI32.@)
01339  */
01340 DWORD WINAPI lineShutdown(HLINEAPP hLineApp)
01341 {
01342     FIXME("(%p): stub.\n", hLineApp);
01343     return 0;
01344 }
01345 
01346 /***********************************************************************
01347  *      lineSwapHold (TAPI32.@)
01348  */
01349 DWORD WINAPI lineSwapHold(HCALL hActiveCall, HCALL hHeldCall)
01350 {
01351     FIXME("(active: %p, held: %p): stub.\n", hActiveCall, hHeldCall);
01352     return 1;
01353 }
01354 
01355 /***********************************************************************
01356  *      lineTranslateAddress (TAPI32.@)
01357  */
01358 DWORD WINAPI lineTranslateAddressA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, LPCSTR lpszAddressIn, DWORD dwCard, DWORD dwTranslateOptions, LPLINETRANSLATEOUTPUT lpTranslateOutput)
01359 {
01360     FIXME("(%p, %08x, %08x, %s, %08x, %08x, %p): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, lpszAddressIn, dwCard, dwTranslateOptions, lpTranslateOutput);
01361     return 0;
01362 }
01363 
01364 /***********************************************************************
01365  *      lineTranslateDialog (TAPI32.@)
01366  */
01367 DWORD WINAPI lineTranslateDialogA(HLINEAPP hLineApp, DWORD dwDeviceID, DWORD dwAPIVersion, HWND hwndOwner, LPCSTR lpszAddressIn)
01368 {
01369     FIXME("(%p, %08x, %08x, %p, %s): stub.\n", hLineApp, dwDeviceID, dwAPIVersion, hwndOwner, lpszAddressIn);
01370     return 0;
01371 }
01372 
01373 /***********************************************************************
01374  *      lineUncompleteCall (TAPI32.@)
01375  */
01376 DWORD WINAPI lineUncompleteCall(HLINE hLine, DWORD dwCompletionID)
01377 {
01378     FIXME("(%p, %08x): stub.\n", hLine, dwCompletionID);
01379     return 1;
01380 }
01381 
01382 /***********************************************************************
01383  *      lineUnhold (TAPI32.@)
01384  */
01385 DWORD WINAPI lineUnhold(HCALL hCall)
01386 {
01387     FIXME("(%p): stub.\n", hCall);
01388     return 1;
01389 }
01390 
01391 /***********************************************************************
01392  *      lineUnpark (TAPI32.@)
01393  */
01394 DWORD WINAPI lineUnparkA(HLINE hLine, DWORD dwAddressID, LPHCALL lphCall, LPCSTR lpszDestAddress)
01395 {
01396     FIXME("(%p, %08x, %p, %s): stub.\n", hLine, dwAddressID, lphCall, lpszDestAddress);
01397     return 1;
01398 }

Generated on Sun May 27 2012 04:26:35 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.