www.pudn.com > ppc_Cellcore.rar > extapi.cpp
// // Copyright (c) Microsoft Corporation. All rights reserved. // // // Use of this source code is subject to the terms of the Microsoft end-user // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. // If you did not accept the terms of the EULA, you are not authorized to use // this source code. For a copy of the EULA, please see the LICENSE.RTF on your // install media. // /* ExTAPI.CPP Sample that demonstrates some functionality of ExTAPI. NOTE: ExTAPI is a privileged API and any application using it must be signed using a priviliged certificate. */ #include#include #include #include #include #include "resource.h" // some definitons #define ARRAY_LENGTH(x) (sizeof(x)/sizeof((x)[0])) #define TAPI_API_LOW_VERSION 0x00020000 #define TAPI_API_HIGH_VERSION 0x00020000 #define EXT_API_LOW_VERSION 0x00010000 #define EXT_API_HIGH_VERSION 0x00010000 #define HUGE_BUFFER 4096 // global variables HINSTANCE g_hInstance; // Friendly application name passed to ExTAPI. // This is loaded from a STRINGTABLE in the program resources // to help enable internationalisation. TCHAR gszFriendlyAppName[160]; // function declarations BOOL GetExTAPIInfo(); DWORD GetTSPLineDeviceID(const HLINEAPP hLineApp, const DWORD dwNumberDevices, const DWORD dwAPIVersionLow, const DWORD dwAPIVersionHigh, const TCHAR* const psTSPLineName); // *************************************************************************** // Function Name: WinMain // // Purpose: Main entry point into the ExTAPI program // // Arguments: Standard WinMain arguments // // Return Values: TRUE // // Description: // This WinMain simply calls GetExTAPIInfo, which pops up a MessageBox int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPreviousInstance, LPWSTR pszCommandLine, int nCommandShow) { // store the hInstance g_hInstance = hInstance; // Get the friendly application name from the STRINGTABLE LoadString(g_hInstance, IDS_FRIENDLYNAME, gszFriendlyAppName, ARRAY_LENGTH(gszFriendlyAppName)); // pop up a message box with general info if (!GetExTAPIInfo()) { TCHAR szCGI[160]; LoadString(g_hInstance, IDS_CANTGETINFO, szCGI, ARRAY_LENGTH(szCGI)); MessageBox(NULL, szCGI, gszFriendlyAppName, MB_OK | MB_ICONERROR); } return TRUE; } // *************************************************************************** // Function Name: GetExTAPIInfo // // Purpose: To get and display general ExTAPI information. // // Arguments: None // // Return Values: // TRUE if all ExTAPI operations completed successfully, FALSE otherwise // // Description: // This function initializes ExTAPI and then calls lineGetGeneralInfo. // It then takes the info that lGGI returned and displays it in a MessageBox BOOL GetExTAPIInfo() { DWORD dwNumDevs; DWORD dwAPIVersion = TAPI_API_HIGH_VERSION; LINEINITIALIZEEXPARAMS liep; HLINEAPP hLineApp = 0; HLINE hLine = 0; DWORD dwExtVersion; TCHAR szMBString[HUGE_BUFFER]; BOOL bRetVal = FALSE; LPBYTE pLineGeneralInfoBytes = NULL; DWORD dwTAPILineDeviceID; const DWORD dwMediaMode = LINEMEDIAMODE_DATAMODEM | LINEMEDIAMODE_INTERACTIVEVOICE; LINEGENERALINFO lviGeneralInfo; LPLINEGENERALINFO plviGeneralInfo; LPTSTR tsManufacturer, tsModel, tsRevision, tsSerialNumber, tsSubscriberNumber; TCHAR szUnavailable[160]; // Load text from STRINGTABLE LoadString(g_hInstance, IDS_UNAVAILABLE, szUnavailable, ARRAY_LENGTH(szUnavailable)); // set the line init params liep.dwTotalSize = sizeof(liep); liep.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT; if (lineInitializeEx(&hLineApp, 0, 0, gszFriendlyAppName, &dwNumDevs, &dwAPIVersion, &liep)) { goto cleanup; } // get the device ID dwTAPILineDeviceID = GetTSPLineDeviceID(hLineApp, dwNumDevs, TAPI_API_LOW_VERSION, TAPI_API_HIGH_VERSION, CELLTSP_LINENAME_STRING); // error getting the line device ID? if (0xffffffff == dwTAPILineDeviceID) { goto cleanup; } // now try and open the line if(lineOpen(hLineApp, dwTAPILineDeviceID, &hLine, dwAPIVersion, 0, 0, LINECALLPRIVILEGE_OWNER, dwMediaMode, 0)) { goto cleanup; } // set up ExTAPI if (lineNegotiateExtVersion(hLineApp, dwTAPILineDeviceID, dwAPIVersion, EXT_API_LOW_VERSION, EXT_API_HIGH_VERSION, &dwExtVersion)) { goto cleanup; } // try to get the general info lviGeneralInfo.dwTotalSize = sizeof(lviGeneralInfo); // step 1: find out how much space we need if (lineGetGeneralInfo(hLine, &lviGeneralInfo)) { goto cleanup; } // step 2: malloc space for all the info we need pLineGeneralInfoBytes = new BYTE[lviGeneralInfo.dwNeededSize]; plviGeneralInfo = (LPLINEGENERALINFO)pLineGeneralInfoBytes; // step 3: call lGGI again with the appropriately sized buffer if(NULL != pLineGeneralInfoBytes) { plviGeneralInfo->dwTotalSize = lviGeneralInfo.dwNeededSize; if (lineGetGeneralInfo(hLine, plviGeneralInfo)) { goto cleanup; } } else { goto cleanup; } // step 4: cast all the arguments to strings if(0 < plviGeneralInfo->dwManufacturerSize) { tsManufacturer = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwManufacturerOffset); } else { tsManufacturer = szUnavailable; } if(0 < plviGeneralInfo->dwModelSize) { tsModel = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwModelOffset); } else { tsModel = szUnavailable; } if(0 < plviGeneralInfo->dwRevisionSize) { tsRevision = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwRevisionOffset); } else { tsRevision = szUnavailable; } if(0 < plviGeneralInfo->dwSerialNumberSize) { tsSerialNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwSerialNumberOffset); } else { tsSerialNumber = szUnavailable; } if(0 < plviGeneralInfo->dwSubscriberNumberSize) { tsSubscriberNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwSubscriberNumberOffset); } else { tsSubscriberNumber = szUnavailable; } // create the message box string. // { TCHAR szManufacturer[80]; TCHAR szModel[80]; TCHAR szRevision[80]; TCHAR szSerialNumber[80]; TCHAR szSubscriberNumber[80]; LoadString(g_hInstance, IDS_MANUFACTURER, szManufacturer, ARRAY_LENGTH(szManufacturer)); LoadString(g_hInstance, IDS_MODEL, szModel, ARRAY_LENGTH(szModel)); LoadString(g_hInstance, IDS_REVISION, szRevision, ARRAY_LENGTH(szRevision)); LoadString(g_hInstance, IDS_SERIALNUMBER, szSerialNumber, ARRAY_LENGTH(szSerialNumber)); LoadString(g_hInstance, IDS_SUBSCRIBERNUMBER, szSubscriberNumber, ARRAY_LENGTH(szSubscriberNumber)); _sntprintf(szMBString, ARRAY_LENGTH(szMBString), TEXT("%s: %s\n%s: %s\n%s: %s\n%s: %s\n%s: %s\n"), szManufacturer, tsManufacturer, szModel, tsModel, szRevision, tsRevision, szSerialNumber, tsSerialNumber, szSubscriberNumber, tsSubscriberNumber); } // pop up the message box { TCHAR szExTapiLineInfo[80]; LoadString(g_hInstance, IDS_EXTAPILINEINFO, szExTapiLineInfo, ARRAY_LENGTH(szExTapiLineInfo)); MessageBox(NULL, szMBString, szExTapiLineInfo, MB_OK | MB_ICONINFORMATION); } bRetVal = TRUE; cleanup: if (pLineGeneralInfoBytes) delete [] pLineGeneralInfoBytes; if (hLine) lineClose(hLine); if (hLineApp) lineShutdown(hLineApp); return bRetVal; } // *************************************************************************** // Function Name: GetTSPLineDeviceID // // Purpose: To get a TSP Line Device ID // // Arguments: // hLineApp = the HLINEAPP returned by lineInitializeEx // dwNumberDevices = also returned by lineInitializeEx // dwAPIVersionLow/High = min version of TAPI that we need // psTSPLineName = "Cellular Line" // // Return Values: Current Device ID // // Description: // This function returns the device ID of a named TAPI TSP. The Device ID is // used in the call to lineOpen DWORD GetTSPLineDeviceID(const HLINEAPP hLineApp, const DWORD dwNumberDevices, const DWORD dwAPIVersionLow, const DWORD dwAPIVersionHigh, const TCHAR* const psTSPLineName) { DWORD dwReturn = 0xffffffff; for(DWORD dwCurrentDevID = 0 ; dwCurrentDevID < dwNumberDevices ; dwCurrentDevID++) { DWORD dwAPIVersion; LINEEXTENSIONID LineExtensionID; if(0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, dwAPIVersionLow, dwAPIVersionHigh, &dwAPIVersion, &LineExtensionID)) { LINEDEVCAPS LineDevCaps; LineDevCaps.dwTotalSize = sizeof(LineDevCaps); if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, &LineDevCaps)) { BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize]; if(0 != pLineDevCapsBytes) { LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes; pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize; if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, pLineDevCaps)) { if(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset), psTSPLineName)) { dwReturn = dwCurrentDevID; } } delete[] pLineDevCapsBytes; } } } } return dwReturn; }