Windows2003-3790/inetcore/connectionwizard/icwhelp/tapiloc.cpp
2020-09-30 16:53:55 +02:00

393 lines
12 KiB
C++

// tapiloc.cpp : Implementation of CTapiLocationInfo
#include "stdafx.h"
#include "icwhelp.h"
#include "tapiloc.h"
/////////////////////////////////////////////////////////////////////////////
// CTapiLocationInfo
HRESULT CTapiLocationInfo::OnDraw(ATL_DRAWINFO& di)
{
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_wNumberOfLocations(short * psVal, long *pCurrLoc)
{
if ((psVal == NULL) || (pCurrLoc == NULL))
return E_POINTER;
*psVal = m_wNumTapiLocations;
*pCurrLoc = m_pTC ? (long) m_dwCurrLoc : 0;
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_bstrAreaCode(BSTR * pbstrAreaCode)
{
USES_CONVERSION;
if (pbstrAreaCode == NULL)
return E_POINTER;
*pbstrAreaCode = m_bstrAreaCode.Copy();
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::put_bstrAreaCode(BSTR bstrAreaCode)
{
USES_CONVERSION;
m_bstrAreaCode = bstrAreaCode;
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_lCountryCode(long * plVal)
{
*plVal = m_dwCountry;
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_NumCountries(long *pNumOfCountry)
{
LPLINECOUNTRYLIST pLineCountryTemp = NULL;
LPLINECOUNTRYENTRY pLCETemp;
DWORD idx;
DWORD dwCurLID = 0;
//LPIDLOOKUPELEMENT m_rgIDLookUp;
// Get TAPI country list
if (m_pLineCountryList)
GlobalFree(m_pLineCountryList);
m_pLineCountryList = (LPLINECOUNTRYLIST)GlobalAlloc(GPTR,sizeof(LINECOUNTRYLIST));
if (!m_pLineCountryList)
return S_FALSE;
m_pLineCountryList->dwTotalSize = sizeof(LINECOUNTRYLIST);
idx = lineGetCountry(0,0x10003,m_pLineCountryList);
if (idx && idx != LINEERR_STRUCTURETOOSMALL)
return S_FALSE;
Assert(m_pLineCountryList->dwNeededSize);
pLineCountryTemp = (LPLINECOUNTRYLIST)GlobalAlloc(GPTR,
(size_t)m_pLineCountryList->dwNeededSize);
if (!pLineCountryTemp)
return S_FALSE;
pLineCountryTemp->dwTotalSize = m_pLineCountryList->dwNeededSize;
GlobalFree(m_pLineCountryList);
m_pLineCountryList = pLineCountryTemp;
pLineCountryTemp = NULL;
if (lineGetCountry(0,0x10003,m_pLineCountryList))
return S_FALSE;
// look up array
pLCETemp = (LPLINECOUNTRYENTRY)((DWORD_PTR)m_pLineCountryList +
m_pLineCountryList->dwCountryListOffset);
if(m_rgNameLookUp)
GlobalFree(m_rgNameLookUp);
m_rgNameLookUp = (LPCNTRYNAMELOOKUPELEMENT)GlobalAlloc(GPTR,
(int)(sizeof(CNTRYNAMELOOKUPELEMENT) * m_pLineCountryList->dwNumCountries));
if (!m_rgNameLookUp) return S_FALSE;
DWORD dwCID = atol((const char *)m_szCountryCode);
for (idx=0;idx<m_pLineCountryList->dwNumCountries;idx++)
{
m_rgNameLookUp[idx].psCountryName = (LPTSTR)((LPBYTE)m_pLineCountryList + (DWORD)pLCETemp[idx].dwCountryNameOffset);
m_rgNameLookUp[idx].pLCE = &pLCETemp[idx];
if (m_rgNameLookUp[idx].pLCE->dwCountryCode == dwCID)
{
if (m_rgNameLookUp[idx].psCountryName)
m_bstrDefaultCountry = A2BSTR(m_rgNameLookUp[idx].psCountryName);
}
}
*pNumOfCountry = m_pLineCountryList->dwNumCountries;
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_CountryName(long lCountryIndex, BSTR* pszCountryName, long* pCountryCode)
{
*pszCountryName = A2BSTR(m_rgNameLookUp[lCountryIndex].psCountryName);
if (m_rgNameLookUp[lCountryIndex].pLCE)
{
*pCountryCode = m_rgNameLookUp[lCountryIndex].pLCE->dwCountryCode;
}
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_DefaultCountry(BSTR * pszCountryName)
{
USES_CONVERSION;
if (pszCountryName == NULL)
return E_POINTER;
*pszCountryName = m_bstrDefaultCountry.Copy();
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::GetTapiLocationInfo(BOOL * pbRetVal)
{
HRESULT hr = ERROR_SUCCESS;
TCHAR szAreaCode[MAX_AREACODE+1];
DWORD cDevices=0;
DWORD dwCurDev = 0;
DWORD dwAPI = 0;
LONG lrc = 0;
LINEEXTENSIONID leid;
LPVOID pv = NULL;
DWORD dwCurLoc = 0;
USES_CONVERSION;
m_hLineApp=NULL;
// Assume Failure
*pbRetVal = FALSE;
if (m_pTC)
{
m_dwCountry = 0; // Reset country ID, re-read TAPI info
GlobalFree(m_pTC);
m_pTC = NULL;
}
// Get area code from TAPI
if (!m_bstrAreaCode)
{
hr = tapiGetLocationInfo(m_szCountryCode,szAreaCode);
if (hr)
{
TraceMsg(TF_TAPIINFO, TEXT("ICWHELP:tapiGetLocationInfo failed. RUN FOR YOUR LIVES!!\n"));
#ifdef UNICODE
// There is no lineInitializeW verion in TAPI. So use A version lineInitialize.
hr = lineInitialize(&m_hLineApp,_Module.GetModuleInstance(),LineCallback,GetSzA(IDS_TITLE),&cDevices);
#else
hr = lineInitialize(&m_hLineApp,_Module.GetModuleInstance(),LineCallback,GetSz(IDS_TITLE),&cDevices);
#endif
if (hr == ERROR_SUCCESS)
{
lineTranslateDialog(m_hLineApp,0,0x10004,GetActiveWindow(),NULL);
lineShutdown(m_hLineApp);
}
hr = tapiGetLocationInfo(m_szCountryCode,szAreaCode);
}
if (hr)
{
goto GetTapiInfoExit;
}
m_bstrAreaCode = A2BSTR(szAreaCode);
}
// Get the numeric Country code from TAPI for the current location
if (m_dwCountry == 0)
{
// Get CountryID from TAPI
m_hLineApp = NULL;
// Get the handle to the line app
#ifdef UNICODE
// There is no lineInitializeW verion in TAPI. So use A version lineInitialize.
lineInitialize(&m_hLineApp,_Module.GetModuleInstance(),LineCallback,GetSzA(IDS_TITLE),&cDevices);
#else
lineInitialize(&m_hLineApp,_Module.GetModuleInstance(),LineCallback,GetSz(IDS_TITLE),&cDevices);
#endif
if (!m_hLineApp)
{
// if we can't figure it out because TAPI is messed up
// just default to the US and bail out of here.
// The user will still have the chance to pick the right answer.
m_dwCountry = 1;
goto GetTapiInfoExit;
}
if (cDevices)
{
// Get the TAPI API version
//
dwCurDev = 0;
dwAPI = 0;
lrc = -1;
while (lrc && dwCurDev < cDevices)
{
// NOTE: device ID's are 0 based
ZeroMemory(&leid,sizeof(leid));
lrc = lineNegotiateAPIVersion(m_hLineApp,dwCurDev,0x00010004,0x00010004,&dwAPI,&leid);
dwCurDev++;
}
if (lrc)
{
// TAPI and us can't agree on anything so nevermind...
goto GetTapiInfoExit;
}
// Find the CountryID in the translate cap structure
m_pTC = (LINETRANSLATECAPS *)GlobalAlloc(GPTR,sizeof(LINETRANSLATECAPS));
if (!m_pTC)
{
// we are in real trouble here, get out!
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetTapiInfoExit;
}
// Get the needed size
m_pTC->dwTotalSize = sizeof(LINETRANSLATECAPS);
lrc = lineGetTranslateCaps(m_hLineApp,dwAPI,m_pTC);
if(lrc)
{
goto GetTapiInfoExit;
}
pv = GlobalAlloc(GPTR, ((size_t)m_pTC->dwNeededSize));
if (!pv)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetTapiInfoExit;
}
((LINETRANSLATECAPS*)pv)->dwTotalSize = m_pTC->dwNeededSize;
m_pTC = (LINETRANSLATECAPS*)pv;
pv = NULL;
lrc = lineGetTranslateCaps(m_hLineApp,dwAPI,m_pTC);
if(lrc)
{
goto GetTapiInfoExit;
}
// sanity check
Assert(m_pTC->dwLocationListOffset);
// We have the Number of TAPI locations, so save it now
m_wNumTapiLocations = (WORD)m_pTC->dwNumLocations;
// Loop through the locations to find the correct country code
m_plle = LPLINELOCATIONENTRY (LPSTR(m_pTC) + m_pTC->dwLocationListOffset);
for (dwCurLoc = 0; dwCurLoc < m_pTC->dwNumLocations; dwCurLoc++)
{
if (m_pTC->dwCurrentLocationID == m_plle->dwPermanentLocationID)
{
m_dwCountry = m_plle->dwCountryID;
m_dwCurrLoc = dwCurLoc;
break; // for loop
}
m_plle++;
}
// If we could not find it in the above loop, default to US
if (!m_dwCountry)
{
m_dwCountry = 1;
goto GetTapiInfoExit;
}
}
}
*pbRetVal = TRUE; // Getting here means everything worked
GetTapiInfoExit:
// Give the user an Error Message, and the wizard will bail.
if (!*pbRetVal)
{
if( m_hLineApp )
{
lineShutdown(m_hLineApp);
m_hLineApp = NULL;
}
MsgBox(IDS_CONFIGAPIFAILED,MB_MYERROR);
}
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_LocationName(long lLocationIndex, BSTR* pszLocationName)
{
if (m_pTC == NULL)
return E_POINTER;
m_plle = LPLINELOCATIONENTRY (LPSTR(m_pTC) + m_pTC->dwLocationListOffset);
m_plle += lLocationIndex;
*pszLocationName = A2BSTR( ((LPSTR) m_pTC) + m_plle->dwLocationNameOffset );
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::get_LocationInfo(long lLocationIndex, long *pLocationID, BSTR* pszCountryName, long *pCountryCode, BSTR* pszAreaCode)
{
DWORD idx;
LPLINECOUNTRYLIST pLineCountryTemp = NULL;
DWORD dwCurLID = 0;
// Loop through the locations to find the correct country code
m_plle = LPLINELOCATIONENTRY (LPSTR(m_pTC) + m_pTC->dwLocationListOffset);
m_plle += lLocationIndex;
// Assign country code and area code
*pCountryCode = m_plle->dwCountryID;
*pszAreaCode = A2BSTR( ((LPSTR) m_pTC) + m_plle->dwCityCodeOffset );
// Assign location ID
*pLocationID = m_plle->dwPermanentLocationID;
if (m_pLineCountryList)
{
GlobalFree(m_pLineCountryList);
m_pLineCountryList = NULL;
}
// Get TAPI country name from country ID
m_pLineCountryList = (LPLINECOUNTRYLIST)GlobalAlloc(GPTR,sizeof(LINECOUNTRYLIST));
if (!m_pLineCountryList)
return E_POINTER;
m_pLineCountryList->dwTotalSize = sizeof(LINECOUNTRYLIST);
idx = lineGetCountry(m_plle->dwCountryID,0x10003,m_pLineCountryList);
if (idx && idx != LINEERR_STRUCTURETOOSMALL)
return E_POINTER;
Assert(m_pLineCountryList->dwNeededSize);
pLineCountryTemp = (LPLINECOUNTRYLIST)GlobalAlloc(GPTR,
(size_t)m_pLineCountryList->dwNeededSize);
if (!pLineCountryTemp)
return E_POINTER;
pLineCountryTemp->dwTotalSize = m_pLineCountryList->dwNeededSize;
GlobalFree(m_pLineCountryList);
m_pLineCountryList = pLineCountryTemp;
if (lineGetCountry(m_plle->dwCountryID,0x10003,m_pLineCountryList))
return E_POINTER;
LPLINECOUNTRYENTRY pLCETemp = (LPLINECOUNTRYENTRY)((DWORD_PTR)m_pLineCountryList + m_pLineCountryList->dwCountryListOffset);
LPTSTR psCountryName = (LPTSTR)((LPBYTE)m_pLineCountryList + (DWORD)pLCETemp[0].dwCountryNameOffset);
*pszCountryName = A2BSTR(psCountryName);
return S_OK;
}
STDMETHODIMP CTapiLocationInfo::put_LocationId(long lLocationID)
{
ASSERT(m_hLineApp);
// Must call GetTapiLocationInfo to get the Tapi handle first
if (m_hLineApp)
{
lineSetCurrentLocation(m_hLineApp, lLocationID);
return S_OK;
}
else
{
return E_FAIL;
}
}