You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
392 lines
12 KiB
392 lines
12 KiB
// 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;
|
|
}
|
|
}
|