#include "comdial.h" #include "resource.h" MYTAPI mytapi; extern HWND hTTYWnd; ///////////////////////////////////////////////////////////////////// // telephonyInitialize - megafunction to retrieve all // configuration information needed for telephony, plus // initialize TAPI and open the line. //////////////////////////////////////////////////////////////////// int telephonyInitialize(HWND hWnd, HINSTANCE hInst) { LONG lrc; int i; LINEEXTENSIONID extensions; // initialize application use of TAPI while (lineInitialize(&mytapi.hTAPI, hInst, mytapi.CallbackProc = (LINECALLBACK)MakeProcInstance((FARPROC)LineCallBackProc, hInst), "TAPIProcess", &mytapi.dwNumLines) == LINEERR_REINIT) { Sleep (5); // sleep for five seconds if (MessageBox(hWnd, "Telephony system is reinitializing \ - Click Cancel to abort", "Error", MB_RETRYCANCEL) ==IDCANCEL) goto done; } // end while (TAPI reinitializing) // bool indicates lineInitialize called successfully mytapi.bInitialized = TRUE; // check every logical line for one that support modem data for (i=0; (unsigned)idwMediaModes & LINEMEDIAMODE_DATAMODEM) { mytapi.dwLine = i; break; } } // get current configuration of serial comm device lrc = mylineGetOldDevConfig(); if (lrc) goto done; lrc = mylineGetDevConfig(); if (lrc) goto done; return 0; done: // error! clean up and return error code telephonyShutdown(); return lrc; } int telephonyOpen(HWND hWnd, HINSTANCE hInst) { LONG lrc; // open the line device lrc = lineOpen(mytapi.hTAPI, mytapi.dwLine, &mytapi.hLine, mytapi.dwVersionToUse, 0, 0, LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_DATAMODEM, NULL); if (lrc) goto done; // bool indicates lineOpen called successfully mytapi.bLineopen = TRUE; // get the telephony icon and make it ours myDrawTAPIIcon(hWnd); // get other telephony configuration info lrc = telephonyCaps(); if (lrc) goto done; // receive all possible status messages for the // line device and address lineSetStatusMessages(mytapi.hLine, mytapi.pLinedevcaps->dwLineStates, mytapi.pLineaddresscaps->dwAddressStates); // get modem capabilities lrc = telephonyGetModemCaps(); if (lrc) goto done; // get current modem settings lrc = telephonyGetModemSettings(); if (lrc) goto done; // success return 0; done: // error! clean up and return error code telephonyShutdown(); return lrc; } // end procedure (telephony initialize) //////////////////////////////////////////////////////////////////// // telephonyGetModemCaps - get COMMPROP and MODEMDEVCAPS // structures //////////////////////////////////////////////////////////////////// LONG telephonyGetModemCaps() { DWORD dwsize = sizeof(COMMPROP)+sizeof(MODEMDEVCAPS); LONG lrc; // if space already allocated for structure, free it up if (mytapi.bCommpropalloced) { free (mytapi.pCommprop); mytapi.bCommpropalloced = FALSE; } // allocate memory for structure mytapi.pCommprop = (COMMPROP *) calloc (1, dwsize); if (!mytapi.pCommprop) return -1; mytapi.bCommpropalloced = TRUE; // set structure size mytapi.pCommprop->wPacketLength = (WORD)dwsize; // get modem handle for use with serial comm api // NOTE: WE GET THE HANDLE, USE IT, THEN CLOSE IT AGAIN RIGHT // AWAY SO THAT THE MODEM IS NOT RESERVED BY OUR APPLICATION lrc = mylineGetID(); if (lrc) { free (mytapi.pCommprop); mytapi.bCommpropalloced = FALSE; return -1; } // get information into structure lrc = GetCommProperties(mytapi.hComm, mytapi.pCommprop); // Close the modem handle CloseHandle (mytapi.hComm); mytapi.bGotcommhandle = FALSE; // bomb out if error if (!lrc) { free (mytapi.pCommprop); mytapi.bCommpropalloced = FALSE; return -1; } // reallocate and try again mytapi.pModemcaps = (MODEMDEVCAPS *) mytapi.pCommprop->wcProvChar; dwsize = mytapi.pModemcaps->dwRequiredSize + sizeof(COMMPROP); free (mytapi.pCommprop); mytapi.bCommpropalloced = FALSE; mytapi.pCommprop = (COMMPROP *) calloc (1, dwsize); if (!mytapi.pCommprop) return -1; mytapi.bCommpropalloced = TRUE; mytapi.pCommprop->wPacketLength = (WORD)dwsize; // get modem handle for use with serial comm api // NOTE: WE GET THE HANDLE, USE IT, THEN CLOSE IT AGAIN RIGHT // AWAY SO THAT THE MODEM IS NOT RESERVED BY OUR APPLICATION lrc = mylineGetID(); if (lrc) { free (mytapi.pCommprop); mytapi.bCommpropalloced = FALSE; return -1; } // try again lrc = GetCommProperties(mytapi.hComm, mytapi.pCommprop); // Close the modem handle CloseHandle (mytapi.hComm); mytapi.bGotcommhandle = FALSE; if (!lrc) { free (mytapi.pCommprop); mytapi.bCommpropalloced = FALSE; return -1; } mytapi.pModemcaps = (MODEMDEVCAPS *) mytapi.pCommprop->wcProvChar; return 0; } // end procedure (telephonyGetModemCaps) //////////////////////////////////////////////////////////////////// // telephonyGetModemSettings - get COMMCONFIG and MODEMSETTINGS // structures //////////////////////////////////////////////////////////////////// LONG telephonyGetModemSettings() { DWORD dwsize = sizeof(COMMCONFIG)+sizeof(MODEMSETTINGS); LONG lrc; do { // if space already allocated for structure, free it up if (mytapi.bCommconfigalloced) { free (mytapi.pCommconfig); mytapi.bCommconfigalloced = FALSE; } // allocate memory for structure mytapi.pCommconfig = (COMMCONFIG *) calloc (1, dwsize); if (!mytapi.pCommconfig) return -1; mytapi.bCommconfigalloced = TRUE; // set structure size mytapi.pCommconfig->dwSize = dwsize; // get modem handle for use with serial comm api // NOTE: WE GET THE HANDLE, USE IT, THEN CLOSE IT AGAIN // RIGHT AWAY SO THAT THE MODEM IS NOT RESERVED BY OUR // APPLICATION lrc = mylineGetID(); if (lrc) { free (mytapi.pCommconfig); mytapi.bCommconfigalloced = FALSE; return -1; } // get information into structure lrc = GetCommConfig(mytapi.hComm, mytapi.pCommconfig, &dwsize); // Close the modem handle CloseHandle (mytapi.hComm); mytapi.bGotcommhandle = FALSE; // bomb out if error if (!lrc) { free (mytapi.pCommconfig); mytapi.bCommconfigalloced = FALSE; return -1; } mytapi.pModemsettings = (MODEMSETTINGS *) mytapi.pCommconfig->wcProviderData; // try again if (mytapi.pCommconfig->dwSize < dwsize) { continue; } break; } while (TRUE); return 0; } // end procedure (telephonyGetModemSettings) //////////////////////////////////////////////////////////////////// // myDrawTAPIIcon - get telephony icon and make it ours //////////////////////////////////////////////////////////////////// void myDrawTAPIIcon(HWND hwnd) { HICON hIcon; // get handle to telephony icon lineGetIcon (mytapi.dwLine, NULL, &hIcon); // make the icon ours SetClassLong (hwnd, GCL_HICON, (LONG)hIcon); } //////////////////////////////////////////////////////////////////// // mylineGetDevConfig - get configuration of serial device //////////////////////////////////////////////////////////////////// LONG mylineGetDevConfig() { LONG lrc; DWORD dwSize; // if space already allocated for structure, free it up if (mytapi.bDevconfigalloced) { free (mytapi.pDevconfig); mytapi.bDevconfigalloced = FALSE; } // allocate memory for structure mytapi.pDevconfig = (VARSTRING *) calloc (1, sizeof(VARSTRING)); if (!mytapi.pDevconfig) return -1; mytapi.bDevconfigalloced = TRUE; // set structure size mytapi.pDevconfig->dwTotalSize = sizeof(VARSTRING); do { // get information into structure lrc = lineGetDevConfig(mytapi.dwLine, mytapi.pDevconfig, "comm/datamodem"); // bomb out if error if (lrc) { free (mytapi.pDevconfig); mytapi.bDevconfigalloced = FALSE; return lrc; } // reallocate and try again if (mytapi.pDevconfig->dwTotalSize < mytapi.pDevconfig->dwNeededSize) { dwSize = mytapi.pDevconfig->dwNeededSize; free (mytapi.pDevconfig); mytapi.bDevconfigalloced = FALSE; mytapi.pDevconfig = (VARSTRING *) calloc(1, dwSize); if (!mytapi.pDevconfig) return -1; mytapi.bDevconfigalloced = TRUE; mytapi.pDevconfig->dwTotalSize = dwSize; continue; } /* end if (need more space) */ break; /* success */ } while (TRUE); return lrc; } //////////////////////////////////////////////////////////////////// // mylineGetOldDevConfig - get configuration of serial device for // later restore when program terminates //////////////////////////////////////////////////////////////////// LONG mylineGetOldDevConfig() { LONG lrc; DWORD dwSize; // if space already allocated for structure, free it up if (mytapi.bOlddevconfigalloced) { free (mytapi.pOlddevconfig); mytapi.bOlddevconfigalloced = FALSE; } // allocate memory for structure mytapi.pOlddevconfig = (VARSTRING *) calloc (1, sizeof(VARSTRING)); if (!mytapi.pOlddevconfig) return -1; mytapi.bOlddevconfigalloced = TRUE; // set structure size mytapi.pOlddevconfig->dwTotalSize = sizeof(VARSTRING); do { // get information into structure lrc = lineGetDevConfig(mytapi.dwLine, mytapi.pOlddevconfig, "comm/datamodem"); // bomb out if error if (lrc) { free (mytapi.pOlddevconfig); mytapi.bOlddevconfigalloced = FALSE; return lrc; } // reallocate and try again if (mytapi.pOlddevconfig->dwTotalSize < mytapi.pOlddevconfig->dwNeededSize) { dwSize = mytapi.pOlddevconfig->dwNeededSize; free (mytapi.pOlddevconfig); mytapi.bOlddevconfigalloced = FALSE; mytapi.pOlddevconfig = (VARSTRING *) calloc(1, dwSize); if (!mytapi.pOlddevconfig) return -1; mytapi.bOlddevconfigalloced = TRUE; mytapi.pOlddevconfig->dwTotalSize = dwSize; continue; } /* end if (need more space) */ break; /* success */ } while (TRUE); return lrc; } //////////////////////////////////////////////////////////////////// // mylineGetID - get modem handle //////////////////////////////////////////////////////////////////// LONG mylineGetID () { CommID FAR *cid; VARSTRING *vs; LONG lrc; DWORD dwSize; mytapi.bGotcommhandle = FALSE; // allocate memory for structure vs = (VARSTRING *) calloc (1, sizeof(VARSTRING)); // set structure size vs->dwTotalSize = sizeof(VARSTRING); do { // get information into structure lrc = lineGetID(mytapi.hLine, 0L, NULL, LINECALLSELECT_LINE, vs, "comm/datamodem"); // bomb out if error if (lrc) { free (vs); return -1; } // reallocate and try again if (vs->dwTotalSize < vs->dwNeededSize) { dwSize = vs->dwNeededSize; free (vs); vs = (VARSTRING *) calloc(1, dwSize); vs->dwTotalSize = dwSize; continue; } /* end if (need more space) */ break; /* success */ } while (TRUE); // copy modem handle and modem name from structure cid = (CommID FAR *) ((LPSTR)vs + vs->dwStringOffset); lstrcpy (mytapi.szModemName, &cid->szDeviceName[0]); // save modem handle mytapi.hComm = cid->hComm; // done with structure; free it free (vs); // set flag to indicate modem handle has been retrieved mytapi.bGotcommhandle = TRUE; return 0; } /* end function (GetCommHandle) */ //////////////////////////////////////////////////////////////////// // mylineGetCallID - get modem handle associated with call //////////////////////////////////////////////////////////////////// LONG mylineGetCallID () { CommID FAR *cid; VARSTRING *vs; LONG lrc; DWORD dwSize; mytapi.bGotcommhandle = FALSE; // allocate memory for structure vs = (VARSTRING *) calloc (1, sizeof(VARSTRING)); // set structure size vs->dwTotalSize = sizeof(VARSTRING); do { // get information into structure lrc = lineGetID(NULL, 0L, mytapi.hCall, LINECALLSELECT_CALL, vs, "comm/datamodem"); // bomb out if error if (lrc) { free (vs); return -1; } // reallocate and try again if (vs->dwTotalSize < vs->dwNeededSize) { dwSize = vs->dwNeededSize; free (vs); vs = (VARSTRING *) calloc(1, dwSize); vs->dwTotalSize = dwSize; continue; } /* end if (need more space) */ break; /* success */ } while (TRUE); // copy modem handle and modem name from structure cid = (CommID FAR *) ((LPSTR)vs + vs->dwStringOffset); lstrcpy (mytapi.szModemName, &cid->szDeviceName[0]); // save modem handle mytapi.hComm = cid->hComm; // done with structure; free it free (vs); // set flag to indicate modem handle has been retrieved mytapi.bGotcommhandle = TRUE; return 0; } /* end function (GetCommHandle) */ //////////////////////////////////////////////////////////////////// // mylineGetDevCaps - get LINEDEVCAPS structure //////////////////////////////////////////////////////////////////// LONG mylineGetDevCaps() { LONG lrc; DWORD dwsize; // if space already allocated for structure, free it up if (mytapi.bLinedevcapsalloced) { free (mytapi.pLinedevcaps); mytapi.bLinedevcapsalloced = FALSE; } // allocate memory for structure mytapi.pLinedevcaps = (LINEDEVCAPS *) calloc(1, sizeof(LINEDEVCAPS)); if (!mytapi.pLinedevcaps) return LINEERR_NOMEM; mytapi.bLinedevcapsalloced = TRUE; // set structure size mytapi.pLinedevcaps->dwTotalSize = sizeof(LINEDEVCAPS); do { // get information into structure lrc = lineGetDevCaps(mytapi.hTAPI, mytapi.dwLine, mytapi.dwVersionToUse, 0, mytapi.pLinedevcaps); // bomb out if error if (lrc) { free (mytapi.pLinedevcaps); mytapi.bLinedevcapsalloced = FALSE; return lrc; } dwsize = mytapi.pLinedevcaps->dwNeededSize; // reallocate and try again if (mytapi.pLinedevcaps->dwTotalSize < dwsize) { free (mytapi.pLinedevcaps); mytapi.bLinedevcapsalloced = FALSE; mytapi.pLinedevcaps = (LINEDEVCAPS *) calloc(1, dwsize); if (!mytapi.pLinedevcaps) return LINEERR_NOMEM; mytapi.bLinedevcapsalloced = TRUE; mytapi.pLinedevcaps->dwTotalSize = dwsize; continue; } break; } while (TRUE); return lrc; } //////////////////////////////////////////////////////////////////// // telephonyCaps - mega function to get LINEADDRESSCAPS, // LINETRANSLATECAPS, LINEDEVSTATUS, and LINEADDRESSSTATUS // structures. //////////////////////////////////////////////////////////////////// LONG telephonyCaps() { LONG lrc; DWORD dwsize; int i; // if space already allocated for structure, free it up if (mytapi.bLineaddresscapsalloced) { free (mytapi.pLineaddresscaps); mytapi.bLineaddresscapsalloced = FALSE; } // allocate memory for structure mytapi.pLineaddresscaps = (LINEADDRESSCAPS *) calloc(1, sizeof(LINEADDRESSCAPS)); if (!mytapi.pLineaddresscaps) return LINEERR_NOMEM; mytapi.bLineaddresscapsalloced = TRUE; // set structure size mytapi.pLineaddresscaps->dwTotalSize = sizeof(LINEADDRESSCAPS); // check each address supported by the line device for one // that allows calls to be answered i = 0; do { // get information into structure lrc = lineGetAddressCaps(mytapi.hTAPI, mytapi.dwLine, i, mytapi.dwVersionToUse, 0, mytapi.pLineaddresscaps); // bomb out if error if (lrc) { free (mytapi.pLineaddresscaps); mytapi.bLineaddresscapsalloced = FALSE; return lrc; } // make sure address can answer calls if (!(mytapi.pLineaddresscaps->dwCallFeatures & LINECALLFEATURE_ANSWER)) { i++; continue; } // reallocate and try again dwsize = mytapi.pLineaddresscaps->dwNeededSize; if (mytapi.pLineaddresscaps->dwTotalSize < dwsize) { free (mytapi.pLineaddresscaps); mytapi.bLineaddresscapsalloced = FALSE; mytapi.pLineaddresscaps = (LINEADDRESSCAPS *) calloc(1, dwsize); if (!mytapi.pLineaddresscaps) return LINEERR_NOMEM; mytapi.bLineaddresscapsalloced = TRUE; mytapi.pLineaddresscaps->dwTotalSize = dwsize; continue; } break; } while ((unsigned)i < mytapi.pLinedevcaps->dwNumAddresses); // if no address was found to answer calls, bomb out if ((unsigned)i == mytapi.pLinedevcaps->dwNumAddresses) { free (mytapi.pLineaddresscaps); mytapi.bLineaddresscapsalloced = FALSE; return -1; } // set address id to use mytapi.dwAddress = i; // now get address translate caps // if space already allocated for structure, free it up if (mytapi.bLinetranslatecapsalloced) { free (mytapi.pLinetranslatecaps); mytapi.bLinetranslatecapsalloced = FALSE; } // allocate memory for structure mytapi.pLinetranslatecaps = (LINETRANSLATECAPS *) calloc(1, sizeof(LINETRANSLATECAPS)); if (!mytapi.pLinetranslatecaps) return LINEERR_NOMEM; mytapi.bLinetranslatecapsalloced = TRUE; // set structure size mytapi.pLinetranslatecaps->dwTotalSize = sizeof(LINETRANSLATECAPS); do { // get information into structure lrc = lineGetTranslateCaps(mytapi.hTAPI, mytapi.dwVersionToUse, mytapi.pLinetranslatecaps); // bomb out if error if (lrc) { free (mytapi.pLinetranslatecaps); mytapi.bLinetranslatecapsalloced = FALSE; return lrc; } // reallocate and try again dwsize = mytapi.pLinetranslatecaps->dwNeededSize; if (mytapi.pLinetranslatecaps->dwTotalSize < dwsize) { free (mytapi.pLinetranslatecaps); mytapi.bLinetranslatecapsalloced = FALSE; mytapi.pLinetranslatecaps = (LINETRANSLATECAPS *) calloc(1, dwsize); if (!mytapi.pLinetranslatecaps) return LINEERR_NOMEM; mytapi.bLinetranslatecapsalloced = TRUE; mytapi.pLinetranslatecaps->dwTotalSize = dwsize; continue; } break; } while (TRUE); // get line device status lrc = mylineGetLineDevStatus(); if (lrc) return lrc; // get address status lrc = mylineGetAddressStatus(); if (lrc) return lrc; return lrc; } //////////////////////////////////////////////////////////////////// // mylineGetAddressStatus - get LINEADDRESSSTATUS structure //////////////////////////////////////////////////////////////////// LONG mylineGetAddressStatus() { LONG lrc; DWORD dwsize; // if space already allocated for structure, free it up if (mytapi.bLineaddressstatusalloced) { free (mytapi.pLineaddressstatus); mytapi.bLineaddressstatusalloced = FALSE; } // allocate memory for structure mytapi.pLineaddressstatus = (LINEADDRESSSTATUS *) calloc(1, sizeof(LINEADDRESSSTATUS)); if (!mytapi.pLineaddressstatus) return LINEERR_NOMEM; mytapi.bLineaddressstatusalloced = TRUE; // set structure size mytapi.pLineaddressstatus->dwTotalSize = sizeof(LINEADDRESSSTATUS); do { // get information into structure lrc = lineGetAddressStatus(mytapi.hLine, mytapi.dwAddress, mytapi.pLineaddressstatus); // bomb out if error if (lrc) { free (mytapi.pLineaddressstatus); mytapi.bLineaddressstatusalloced = FALSE; return lrc; } // reallocate and try again dwsize = mytapi.pLineaddressstatus->dwNeededSize; if (mytapi.pLineaddressstatus->dwTotalSize < dwsize) { free (mytapi.pLineaddressstatus); mytapi.bLineaddressstatusalloced = FALSE; mytapi.pLineaddressstatus = (LINEADDRESSSTATUS *) calloc(1, dwsize); if (!mytapi.pLineaddressstatus) return LINEERR_NOMEM; mytapi.bLineaddressstatusalloced = TRUE; mytapi.pLineaddressstatus->dwTotalSize = dwsize; continue; } break; } while (TRUE); return lrc; } //////////////////////////////////////////////////////////////////// // mylineGetLineDevStatus - get LINEDEVSTATUS structure //////////////////////////////////////////////////////////////////// LONG mylineGetLineDevStatus() { LONG lrc; DWORD dwsize; // if space already allocated for structure, free it up if (mytapi.bLinedevstatusalloced) { free (mytapi.pLinedevstatus); mytapi.bLinedevstatusalloced = FALSE; } // allocate memory for structure mytapi.pLinedevstatus = (LINEDEVSTATUS *) calloc(1, sizeof(LINEDEVSTATUS)); if (!mytapi.pLinedevstatus) return LINEERR_NOMEM; mytapi.bLinedevstatusalloced = TRUE; // set structure size mytapi.pLinedevstatus->dwTotalSize = sizeof(LINEDEVSTATUS); do { // get information into structure lrc = lineGetLineDevStatus(mytapi.hLine, mytapi.pLinedevstatus); // bomb out if error if (lrc) { free (mytapi.pLinedevstatus); mytapi.bLinedevstatusalloced = FALSE; return lrc; } // reallocate and try again dwsize = mytapi.pLinedevstatus->dwNeededSize; if (mytapi.pLinedevstatus->dwTotalSize < dwsize) { free (mytapi.pLinedevstatus); mytapi.bLinedevstatusalloced = FALSE; mytapi.pLinedevstatus = (LINEDEVSTATUS *) calloc(1, dwsize); if (!mytapi.pLinedevstatus) return LINEERR_NOMEM; mytapi.bLinedevstatusalloced = TRUE; mytapi.pLinedevstatus->dwTotalSize = dwsize; continue; } break; } while (TRUE); return lrc; } //////////////////////////////////////////////////////////////////// // mylineGetCallStatus - get LINECALLSTATUS structure //////////////////////////////////////////////////////////////////// LONG mylineGetCallStatus() { LONG lrc; DWORD dwsize; // if space already allocated for structure, free it up if (mytapi.bLinecallstatusalloced) { free (mytapi.pLinecallstatus); mytapi.bLinecallstatusalloced = FALSE; } // allocate memory for structure mytapi.pLinecallstatus = (LINECALLSTATUS *) calloc(1, sizeof(LINECALLSTATUS)); if (!mytapi.pLinecallstatus) return LINEERR_NOMEM; mytapi.bLinecallstatusalloced = TRUE; // set structure size mytapi.pLinecallstatus->dwTotalSize = sizeof(LINECALLSTATUS); do { // get information into structure lrc = lineGetCallStatus(mytapi.hCall, mytapi.pLinecallstatus); // bomb out if error if (lrc) { free (mytapi.pLinecallstatus); mytapi.bLinecallstatusalloced = FALSE; return lrc; } // reallocate and try again dwsize = mytapi.pLinecallstatus->dwNeededSize; if (mytapi.pLinecallstatus->dwTotalSize < dwsize) { free (mytapi.pLinecallstatus); mytapi.bLinecallstatusalloced = FALSE; mytapi.pLinecallstatus = (LINECALLSTATUS *) calloc(1, dwsize); if (!mytapi.pLinecallstatus) return LINEERR_NOMEM; mytapi.bLinecallstatusalloced = TRUE; mytapi.pLinecallstatus->dwTotalSize = dwsize; continue; } break; } while (TRUE); return lrc; } //////////////////////////////////////////////////////////////////// // mylineGetCallInfo - get LINECALLINFO structure //////////////////////////////////////////////////////////////////// LONG mylineGetCallInfo() { LONG lrc; DWORD dwsize; // if space already allocated for structure, free it up if (mytapi.bLinecallinfoalloced) { free (mytapi.pLinecallinfo); mytapi.bLinecallinfoalloced = FALSE; } // allocate memory for structure mytapi.pLinecallinfo = (LINECALLINFO *) calloc(1, sizeof(LINECALLINFO)); if (!mytapi.pLinecallinfo) return LINEERR_NOMEM; mytapi.bLinecallinfoalloced = TRUE; // set structure size mytapi.pLinecallinfo->dwTotalSize = sizeof(LINECALLINFO); do { // get information into structure lrc = lineGetCallInfo(mytapi.hCall, mytapi.pLinecallinfo); // bomb out if error if (lrc) { free (mytapi.pLinecallinfo); mytapi.bLinecallinfoalloced = FALSE; return lrc; } // reallocate and try again dwsize = mytapi.pLinecallinfo->dwNeededSize; if (mytapi.pLinecallinfo->dwTotalSize < dwsize) { free (mytapi.pLinecallinfo); mytapi.bLinecallinfoalloced = FALSE; mytapi.pLinecallinfo = (LINECALLINFO *) calloc(1, dwsize); if (!mytapi.pLinecallinfo) return LINEERR_NOMEM; mytapi.bLinecallinfoalloced = TRUE; mytapi.pLinecallinfo->dwTotalSize = dwsize; continue; } break; } while (TRUE); return lrc; } //////////////////////////////////////////////////////////////////// // telephonyShutdown - megafunction to close line, shut down // telephony, close modem handle, restore serial device // configuration, and free up various allocated structures. //////////////////////////////////////////////////////////////////// void telephonyShutdown() { DWORD id; // close line if open if (mytapi.bLineopen) lineClose(mytapi.hLine); // restore serial device configuration if (mytapi.bOlddevconfigalloced) lineSetDevConfig (mytapi.dwLine, (LPVOID)((LPBYTE)mytapi.pOlddevconfig + mytapi.pOlddevconfig->dwStringOffset), mytapi.pOlddevconfig->dwStringSize, "comm/datamodem"); // shutdown the read thread if it is running if (mytapi.bReading) { /* kill the read thread */ mytapi.bReading = FALSE; /* wait for thread to die... */ while (GetExitCodeThread(mytapi.hThread, &id)) { if (id == STILL_ACTIVE) continue; else break; } /* end while (no error reading thread exit code) */ CloseHandle (mytapi.hThread); } // close modem handle if open if (mytapi.bGotcommhandle) CloseHandle (mytapi.hComm); // shutdown tapi if initialized if (mytapi.bInitialized) lineShutdown(mytapi.hTAPI); // free up various structures if allocated if (mytapi.bLinedevcapsalloced) free (mytapi.pLinedevcaps); if (mytapi.bLineaddresscapsalloced) free (mytapi.pLineaddresscaps); if (mytapi.bLinetranslatecapsalloced) free (mytapi.pLinetranslatecaps); if (mytapi.bLinedevstatusalloced) free (mytapi.pLinedevstatus); if (mytapi.bLineaddressstatusalloced) free (mytapi.pLineaddressstatus); if (mytapi.bDevconfigalloced) free (mytapi.pDevconfig); if (mytapi.bOlddevconfigalloced) free (mytapi.pOlddevconfig); if (mytapi.bCommpropalloced) free (mytapi.pCommprop); if (mytapi.bCommconfigalloced) free (mytapi.pCommconfig); if (mytapi.bLinecallinfoalloced) free(mytapi.pLinecallinfo); if (mytapi.bLinecallstatusalloced) free(mytapi.pLinecallstatus); // set flags to indicate that the structures are no longer // allocated mytapi.bLinedevcapsalloced = FALSE; mytapi.bLineaddresscapsalloced = FALSE; mytapi.bLinetranslatecapsalloced = FALSE; mytapi.bLinedevstatusalloced = FALSE; mytapi.bLineaddressstatusalloced = FALSE; mytapi.bDevconfigalloced = FALSE; mytapi.bGotcommhandle = FALSE; mytapi.bCommpropalloced = FALSE; mytapi.bCommconfigalloced = FALSE; mytapi.bLineopen = FALSE; mytapi.bInitialized = FALSE; mytapi.bLinecallinfoalloced = FALSE; mytapi.bLinecallstatusalloced = FALSE; mytapi.bReading = FALSE; mytapi.bWaitForCall = FALSE; } // end function (telephonyShutdown) ///////////////////////////////////////////////////////////////////// // telephonySettings - change telephony settings //////////////////////////////////////////////////////////////////// LONG telephonySettings(HWND hwnd) { LONG lrc; LPVARSTRING vs = calloc(1, mytapi.pDevconfig->dwTotalSize + 15000); // update our local settings structure lrc = mylineGetDevConfig(); if (lrc) return lrc; vs->dwTotalSize = mytapi.pDevconfig->dwTotalSize + 15000; // display dialog to change telephony settings lrc = lineConfigDialogEdit(mytapi.dwLine, hwnd, "comm/datamodem", (LPVOID)((LPBYTE)mytapi.pDevconfig + mytapi.pDevconfig->dwStringOffset), mytapi.pDevconfig->dwStringSize, vs); if (lrc) { free (vs); return lrc; } // make new settings active lrc = lineSetDevConfig (mytapi.dwLine, (LPVOID)((LPBYTE)vs + vs->dwStringOffset), vs->dwStringSize, "comm/datamodem"); if (lrc) { free (vs); return lrc; } free (vs); // update our local settings structure lrc = mylineGetDevConfig(); return lrc; } //////////////////////////////////////////////////////////////////// // LineCallBackProc - message function for TAPI events //////////////////////////////////////////////////////////////////// /* callback function */ void FAR PASCAL LineCallBackProc(DWORD dwDevice, DWORD dwMessage,DWORD dwInstance,DWORD dwParam1, DWORD dwParam2,DWORD dwParam3) { HMENU hMenu; DWORD id; LONG lrc; switch (dwMessage) { case LINE_ADDRESSSTATE: mylineGetAddressStatus(); // update menus hMenu = GetMenu(hTTYWnd); if (mytapi.pLineaddressstatus->dwAddressFeatures & LINEADDRFEATURE_MAKECALL) EnableMenuItem( hMenu, IDM_MAKECALL, MF_ENABLED | MF_BYCOMMAND ) ; else EnableMenuItem( hMenu, IDM_MAKECALL, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ; switch (dwParam2) { case LINEADDRESSSTATE_OTHER: break; case LINEADDRESSSTATE_DEVSPECIFIC: break; case LINEADDRESSSTATE_INUSEZERO: break; case LINEADDRESSSTATE_INUSEONE: break; case LINEADDRESSSTATE_INUSEMANY: break; case LINEADDRESSSTATE_NUMCALLS: break; case LINEADDRESSSTATE_FORWARD: break; case LINEADDRESSSTATE_TERMINALS: break; default: break; } //end switch break; case LINE_CALLINFO: mylineGetCallInfo(); switch (dwParam1) { case LINECALLINFOSTATE_OTHER: break; case LINECALLINFOSTATE_DEVSPECIFIC: break; case LINECALLINFOSTATE_BEARERMODE: break; case LINECALLINFOSTATE_RATE: break; case LINECALLINFOSTATE_MEDIAMODE: break; case LINECALLINFOSTATE_APPSPECIFIC: break; case LINECALLINFOSTATE_CALLID: break; case LINECALLINFOSTATE_RELATEDCALLID: break; case LINECALLINFOSTATE_ORIGIN: break; case LINECALLINFOSTATE_REASON: break; case LINECALLINFOSTATE_COMPLETIONID: break; case LINECALLINFOSTATE_NUMOWNERINCR: break; case LINECALLINFOSTATE_NUMOWNERDECR: break; case LINECALLINFOSTATE_NUMMONITORS: break; case LINECALLINFOSTATE_TRUNK: break; case LINECALLINFOSTATE_CALLERID: break; case LINECALLINFOSTATE_CALLEDID: break; case LINECALLINFOSTATE_CONNECTEDID: break; case LINECALLINFOSTATE_REDIRECTIONID: break; case LINECALLINFOSTATE_REDIRECTINGID: break; case LINECALLINFOSTATE_DISPLAY: break; case LINECALLINFOSTATE_USERUSERINFO: break; case LINECALLINFOSTATE_HIGHLEVELCOMP: break; case LINECALLINFOSTATE_LOWLEVELCOMP: break; case LINECALLINFOSTATE_CHARGINGINFO: break; case LINECALLINFOSTATE_TERMINAL: break; case LINECALLINFOSTATE_DIALPARAMS: break; case LINECALLINFOSTATE_MONITORMODES: break; default: break; } //end switch break; case LINE_CALLSTATE: switch (dwParam3) { case LINECALLPRIVILEGE_MONITOR: break; case LINECALLPRIVILEGE_OWNER: // save call handle mytapi.hCall = (HCALL)dwDevice; // update local call information mylineGetCallStatus(); mylineGetCallInfo(); // update menus hMenu = GetMenu(hTTYWnd); // enable drop call? if (mytapi.pLinecallstatus->dwCallFeatures & LINECALLFEATURE_DROP) EnableMenuItem( hMenu, IDM_DISCONNECT, MF_ENABLED | MF_BYCOMMAND ) ; else EnableMenuItem( hMenu, IDM_DISCONNECT, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ; // enable answer call? if (mytapi.pLinecallstatus->dwCallFeatures & LINECALLFEATURE_ANSWER) EnableMenuItem( hMenu, IDM_ANSWER, MF_ENABLED | MF_BYCOMMAND ) ; else EnableMenuItem( hMenu, IDM_ANSWER, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ; break; default: break; } //end switch switch (dwParam1) { case LINECALLSTATE_IDLE: // deallocate call resources lineDeallocateCall (mytapi.hCall); // re-enable make call // update menus hMenu = GetMenu(hTTYWnd); if (mytapi.pLineaddressstatus->dwAddressFeatures & LINEADDRFEATURE_MAKECALL) EnableMenuItem( hMenu, IDM_MAKECALL, MF_ENABLED | MF_BYCOMMAND ) ; else EnableMenuItem( hMenu, IDM_MAKECALL, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ; break; case LINECALLSTATE_OFFERING: if (mytapi.bWaitForCall) { // answer incoming calls lrc = lineAnswer(mytapi.hCall,NULL,0); if (!(lrc >0 )) { ProcessTAPIError(lrc); myMessageBox("Error answering call"); } } break; case LINECALLSTATE_ACCEPTED: break; case LINECALLSTATE_DIALTONE: switch (dwParam2) { case LINEDIALTONEMODE_NORMAL: break; case LINEDIALTONEMODE_SPECIAL: break; case LINEDIALTONEMODE_INTERNAL: break; case LINEDIALTONEMODE_EXTERNAL: break; case LINEDIALTONEMODE_UNKNOWN: break; case LINEDIALTONEMODE_UNAVAIL: break; default: break; } //end switch break; case LINECALLSTATE_DIALING: break; case LINECALLSTATE_RINGBACK: break; case LINECALLSTATE_BUSY: switch (dwParam2) { case LINEBUSYMODE_STATION: break; case LINEBUSYMODE_TRUNK: break; case LINEBUSYMODE_UNKNOWN: break; case LINEBUSYMODE_UNAVAIL: break; default: break; } //end switch break; case LINECALLSTATE_SPECIALINFO: switch (dwParam2) { case LINESPECIALINFO_NOCIRCUIT: break; case LINESPECIALINFO_CUSTIRREG: break; case LINESPECIALINFO_REORDER: break; case LINESPECIALINFO_UNKNOWN: break; case LINESPECIALINFO_UNAVAIL: break; default: break; } //end switch break; case LINECALLSTATE_CONNECTED: /* create the thread for reading bytes */ mytapi.bReading = TRUE; if ((mytapi.hThread=CreateThread (NULL, /*def security */ 0, /* def stack size */ (LPTHREAD_START_ROUTINE)ReadThread, NULL, /* param to pass to thread */ 0, &id)) == INVALID_HANDLE_VALUE) { /* handle error */ MessageBox (NULL, "Error creating READ thread","",MB_OK); break; } /* end if (error creating read thread) */ break; case LINECALLSTATE_PROCEEDING: break; case LINECALLSTATE_ONHOLD: break; case LINECALLSTATE_CONFERENCED: break; case LINECALLSTATE_ONHOLDPENDCONF: break; case LINECALLSTATE_DISCONNECTED: /* kill the read thread */ if (mytapi.bReading) { mytapi.bReading = FALSE; /* wait for thread to die... */ while (GetExitCodeThread(mytapi.hThread, &id)) { if (id == STILL_ACTIVE) continue; else break; } /* end while (no error reading thread exit code) */ CloseHandle (mytapi.hThread); } switch (dwParam2) { case LINEDISCONNECTMODE_NORMAL: break; case LINEDISCONNECTMODE_UNKNOWN: break; case LINEDISCONNECTMODE_REJECT: break; case LINEDISCONNECTMODE_PICKUP: break; case LINEDISCONNECTMODE_FORWARDED: break; case LINEDISCONNECTMODE_BUSY: break; case LINEDISCONNECTMODE_NOANSWER: break; case LINEDISCONNECTMODE_BADADDRESS: break; case LINEDISCONNECTMODE_UNREACHABLE: break; case LINEDISCONNECTMODE_CONGESTION: break; case LINEDISCONNECTMODE_INCOMPATIBLE: break; case LINEDISCONNECTMODE_UNAVAIL: break; default: break; } //end switch break; case LINECALLSTATE_UNKNOWN: break; default: break; } //end switch break; case LINE_CLOSE: break; case LINE_DEVSPECIFIC: break; case LINE_DEVSPECIFICFEATURE: break; case LINE_GATHERDIGITS: switch (dwParam1) { case LINEGATHERTERM_BUFFERFULL: break; case LINEGATHERTERM_TERMDIGIT: break; case LINEGATHERTERM_FIRSTTIMEOUT: break; case LINEGATHERTERM_INTERTIMEOUT: break; case LINEGATHERTERM_CANCEL: break; default: break; } //end switch break; case LINE_GENERATE: switch (dwParam1) { case LINEGENERATETERM_DONE: break; case LINEGENERATETERM_CANCEL: break; default: break; } //end switch break; case LINE_LINEDEVSTATE: mylineGetLineDevStatus(); // update menus hMenu = GetMenu(hTTYWnd); if (mytapi.pLinedevstatus->dwLineFeatures & LINEFEATURE_MAKECALL) EnableMenuItem( hMenu, IDM_MAKECALL, MF_ENABLED | MF_BYCOMMAND ) ; else EnableMenuItem( hMenu, IDM_MAKECALL, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ; switch (dwParam1) { case LINEDEVSTATE_OTHER: break; case LINEDEVSTATE_RINGING: break; case LINEDEVSTATE_CONNECTED: break; case LINEDEVSTATE_DISCONNECTED: break; case LINEDEVSTATE_MSGWAITON: break; case LINEDEVSTATE_MSGWAITOFF: break; case LINEDEVSTATE_NUMCOMPLETIONS: break; case LINEDEVSTATE_INSERVICE: break; case LINEDEVSTATE_OUTOFSERVICE: break; case LINEDEVSTATE_MAINTENANCE: break; case LINEDEVSTATE_OPEN: break; case LINEDEVSTATE_CLOSE: break; case LINEDEVSTATE_NUMCALLS: break; case LINEDEVSTATE_TERMINALS: break; case LINEDEVSTATE_ROAMMODE: break; case LINEDEVSTATE_BATTERY: break; case LINEDEVSTATE_SIGNAL: break; case LINEDEVSTATE_DEVSPECIFIC: break; case LINEDEVSTATE_REINIT: break; case LINEDEVSTATE_LOCK: break; default: break; } //end switch break; case LINE_MONITORDIGITS: switch (dwParam2) { case LINEDIGITMODE_PULSE: break; case LINEDIGITMODE_DTMF: break; case LINEDIGITMODE_DTMFEND: break; default: break; } //end switch break; case LINE_MONITORMEDIA: switch (dwParam1) { case LINEMEDIAMODE_INTERACTIVEVOICE: break; case LINEMEDIAMODE_AUTOMATEDVOICE: break; case LINEMEDIAMODE_DATAMODEM: break; case LINEMEDIAMODE_G3FAX: break; case LINEMEDIAMODE_TDD: break; case LINEMEDIAMODE_G4FAX: break; case LINEMEDIAMODE_DIGITALDATA: break; case LINEMEDIAMODE_TELETEX: break; default: break; } //end switch break; case LINE_MONITORTONE: break; case LINE_REPLY: switch (dwParam2) { case LINEERR_ALLOCATED: myMessageBox(" LINEERR_ALLOCATED"); break; case LINEERR_BADDEVICEID: myMessageBox(" LINEERR_BADDEVICEID"); break; case LINEERR_BEARERMODEUNAVAIL: myMessageBox(" LINEERR_BEARERMODEUNAVAIL"); break; case LINEERR_CALLUNAVAIL: myMessageBox(" LINEERR_CALLUNAVAIL"); break; case LINEERR_COMPLETIONOVERRUN: myMessageBox(" LINEERR_COMPLETIONOVERRUN"); break; case LINEERR_CONFERENCEFULL: myMessageBox(" LINEERR_CONFERENCEFULL"); break; case LINEERR_DIALBILLING: myMessageBox(" LINEERR_DIALBILLING"); break; case LINEERR_DIALDIALTONE: myMessageBox(" LINEERR_DIALDIALTONE"); break; case LINEERR_DIALPROMPT: myMessageBox(" LINEERR_DIALPROMPT"); break; case LINEERR_DIALQUIET: myMessageBox(" LINEERR_DIALQUIET"); break; case LINEERR_INCOMPATIBLEAPIVERSION: myMessageBox(" LINEERR_INCOMPATIBLEAPIVERSION"); break; case LINEERR_INCOMPATIBLEEXTVERSION: myMessageBox(" LINEERR_INCOMPATIBLEEXTVERSION"); break; case LINEERR_INIFILECORRUPT: myMessageBox(" LINEERR_INIFILECORRUPT"); break; case LINEERR_INUSE: myMessageBox(" LINEERR_INUSE"); break; case LINEERR_INVALADDRESS: myMessageBox(" LINEERR_INVALADDRESS"); break; case LINEERR_INVALADDRESSID: myMessageBox(" LINEERR_INVALADDRESSID"); break; case LINEERR_INVALADDRESSMODE: myMessageBox(" LINEERR_INVALADDRESSMODE"); break; case LINEERR_INVALADDRESSSTATE: myMessageBox(" LINEERR_INVALADDRESSSTATE"); break; case LINEERR_INVALAPPHANDLE: myMessageBox(" LINEERR_INVALAPPHANDLE"); break; case LINEERR_INVALAPPNAME: myMessageBox(" LINEERR_INVALAPPNAME"); break; case LINEERR_INVALBEARERMODE: myMessageBox(" LINEERR_INVALBEARERMODE"); break; case LINEERR_INVALCALLCOMPLMODE: myMessageBox(" LINEERR_INVALCALLCOMPLMODE"); break; case LINEERR_INVALCALLHANDLE: myMessageBox(" LINEERR_INVALCALLHANDLE"); break; case LINEERR_INVALCALLPARAMS: myMessageBox(" LINEERR_INVALCALLPARAMS"); break; case LINEERR_INVALCALLPRIVILEGE: myMessageBox(" LINEERR_INVALCALLPRIVILEGE"); break; case LINEERR_INVALCALLSELECT: myMessageBox(" LINEERR_INVALCALLSELECT"); break; case LINEERR_INVALCALLSTATE: myMessageBox(" LINEERR_INVALCALLSTATE"); break; case LINEERR_INVALCALLSTATELIST: myMessageBox(" LINEERR_INVALCALLSTATELIST"); break; case LINEERR_INVALCARD: myMessageBox(" LINEERR_INVALCARD"); break; case LINEERR_INVALCOMPLETIONID: myMessageBox(" LINEERR_INVALCOMPLETIONID"); break; case LINEERR_INVALCONFCALLHANDLE: myMessageBox(" LINEERR_INVALCONFCALLHANDLE"); break; case LINEERR_INVALCONSULTCALLHANDLE: myMessageBox(" LINEERR_INVALCONSULTCALLHANDLE"); break; case LINEERR_INVALCOUNTRYCODE: myMessageBox(" LINEERR_INVALCOUNTRYCODE"); break; case LINEERR_INVALDEVICECLASS: myMessageBox(" LINEERR_INVALDEVICECLASS"); break; case LINEERR_INVALDEVICEHANDLE: myMessageBox(" LINEERR_INVALDEVICEHANDLE"); break; case LINEERR_INVALDIALPARAMS: myMessageBox(" LINEERR_INVALDIALPARAMS"); break; case LINEERR_INVALDIGITLIST: myMessageBox(" LINEERR_INVALDIGITLIST"); break; case LINEERR_INVALDIGITMODE: myMessageBox(" LINEERR_INVALDIGITMODE"); break; case LINEERR_INVALDIGITS: myMessageBox(" LINEERR_INVALDIGITS"); break; case LINEERR_INVALEXTVERSION: myMessageBox(" LINEERR_INVALEXTVERSION"); break; case LINEERR_INVALGROUPID: myMessageBox(" LINEERR_INVALGROUPID"); break; case LINEERR_INVALLINEHANDLE: myMessageBox(" LINEERR_INVALLINEHANDLE"); break; case LINEERR_INVALLINESTATE: myMessageBox(" LINEERR_INVALLINESTATE"); break; case LINEERR_INVALLOCATION: myMessageBox(" LINEERR_INVALLOCATION"); break; case LINEERR_INVALMEDIALIST: myMessageBox(" LINEERR_INVALMEDIALIST"); break; case LINEERR_INVALMEDIAMODE: myMessageBox(" LINEERR_INVALMEDIAMODE"); break; case LINEERR_INVALMESSAGEID: myMessageBox(" LINEERR_INVALMESSAGEID"); break; case LINEERR_INVALPARAM: myMessageBox(" LINEERR_INVALPARAM"); break; case LINEERR_INVALPARKID: myMessageBox(" LINEERR_INVALPARKID"); break; case LINEERR_INVALPARKMODE: myMessageBox(" LINEERR_INVALPARKMODE"); break; case LINEERR_INVALPOINTER: myMessageBox(" LINEERR_INVALPOINTER"); break; case LINEERR_INVALPRIVSELECT: myMessageBox(" LINEERR_INVALPRIVSELECT"); break; case LINEERR_INVALRATE: myMessageBox(" LINEERR_INVALRATE"); break; case LINEERR_INVALREQUESTMODE: myMessageBox(" LINEERR_INVALREQUESTMODE"); break; case LINEERR_INVALTERMINALID: myMessageBox(" LINEERR_INVALTERMINALID"); break; case LINEERR_INVALTERMINALMODE: myMessageBox(" LINEERR_INVALTERMINALMODE"); break; case LINEERR_INVALTIMEOUT: myMessageBox(" LINEERR_INVALTIMEOUT"); break; case LINEERR_INVALTONE: myMessageBox(" LINEERR_INVALTONE"); break; case LINEERR_INVALTONELIST: myMessageBox(" LINEERR_INVALTONELIST"); break; case LINEERR_INVALTONEMODE: myMessageBox(" LINEERR_INVALTONEMODE"); break; case LINEERR_INVALTRANSFERMODE: myMessageBox(" LINEERR_INVALTRANSFERMODE"); break; case LINEERR_LINEMAPPERFAILED: myMessageBox(" LINEERR_LINEMAPPERFAILED"); break; case LINEERR_NOCONFERENCE: myMessageBox(" LINEERR_NOCONFERENCE"); break; case LINEERR_NODEVICE: myMessageBox(" LINEERR_NODEVICE"); break; case LINEERR_NODRIVER: myMessageBox(" LINEERR_NODRIVER"); break; case LINEERR_NOMEM: myMessageBox(" LINEERR_NOMEM"); break; case LINEERR_NOREQUEST: myMessageBox(" LINEERR_NOREQUEST"); break; case LINEERR_NOTOWNER: myMessageBox(" LINEERR_NOTOWNER"); break; case LINEERR_NOTREGISTERED: myMessageBox(" LINEERR_NOTREGISTERED"); break; case LINEERR_OPERATIONFAILED: myMessageBox(" LINEERR_OPERATIONFAILED"); break; case LINEERR_OPERATIONUNAVAIL: myMessageBox(" LINEERR_OPERATIONUNAVAIL"); break; case LINEERR_RATEUNAVAIL: myMessageBox(" LINEERR_RATEUNAVAIL"); break; case LINEERR_RESOURCEUNAVAIL: myMessageBox(" LINEERR_RESOURCEUNAVAIL"); break; case LINEERR_REQUESTOVERRUN: myMessageBox(" LINEERR_REQUESTOVERRUN"); break; case LINEERR_STRUCTURETOOSMALL: myMessageBox(" LINEERR_STRUCTURETOOSMALL"); break; case LINEERR_TARGETNOTFOUND: myMessageBox(" LINEERR_TARGETNOTFOUND"); break; case LINEERR_TARGETSELF: myMessageBox(" LINEERR_TARGETSELF"); break; case LINEERR_UNINITIALIZED: myMessageBox(" LINEERR_UNINITIALIZED"); break; case LINEERR_USERUSERINFOTOOBIG: myMessageBox(" LINEERR_USERUSERINFOTOOBIG"); break; case LINEERR_REINIT: myMessageBox(" LINEERR_REINIT"); break; case LINEERR_ADDRESSBLOCKED: myMessageBox(" LINEERR_ADDRESSBLOCKED"); break; case LINEERR_BILLINGREJECTED: myMessageBox(" LINEERR_BILLINGREJECTED"); break; case LINEERR_INVALFEATURE: myMessageBox(" LINEERR_INVALFEATURE"); break; case LINEERR_NOMULTIPLEINSTANCE: myMessageBox(" LINEERR_NOMULTIPLEINSTANCE"); break; default: break; } //end switch break; case LINE_REQUEST: switch (dwParam1) { case LINEREQUESTMODE_MAKECALL: break; case LINEREQUESTMODE_MEDIACALL: break; case LINEREQUESTMODE_DROP: break; default: break; } //end switch break; default: break; } //end switch return; } /* LineCallBackProc */ //////////////////////////////////////////////////////////////////// // ProcessTAPIError - print TAPI error message //////////////////////////////////////////////////////////////////// void ProcessTAPIError (LONG lrc) { switch (lrc) { case LINEERR_ALLOCATED: myMessageBox(" LINEERR_ALLOCATED"); break; case LINEERR_BADDEVICEID: myMessageBox(" LINEERR_BADDEVICEID"); break; case LINEERR_BEARERMODEUNAVAIL: myMessageBox(" LINEERR_BEARERMODEUNAVAIL"); break; case LINEERR_CALLUNAVAIL: myMessageBox(" LINEERR_CALLUNAVAIL"); break; case LINEERR_COMPLETIONOVERRUN: myMessageBox(" LINEERR_COMPLETIONOVERRUN"); break; case LINEERR_CONFERENCEFULL: myMessageBox(" LINEERR_CONFERENCEFULL"); break; case LINEERR_DIALBILLING: myMessageBox(" LINEERR_DIALBILLING"); break; case LINEERR_DIALDIALTONE: myMessageBox(" LINEERR_DIALDIALTONE"); break; case LINEERR_DIALPROMPT: myMessageBox(" LINEERR_DIALPROMPT"); break; case LINEERR_DIALQUIET: myMessageBox(" LINEERR_DIALQUIET"); break; case LINEERR_INCOMPATIBLEAPIVERSION: myMessageBox(" LINEERR_INCOMPATIBLEAPIVERSION"); break; case LINEERR_INCOMPATIBLEEXTVERSION: myMessageBox(" LINEERR_INCOMPATIBLEEXTVERSION"); break; case LINEERR_INIFILECORRUPT: myMessageBox(" LINEERR_INIFILECORRUPT"); break; case LINEERR_INUSE: myMessageBox(" LINEERR_INUSE"); break; case LINEERR_INVALADDRESS: myMessageBox(" LINEERR_INVALADDRESS"); break; case LINEERR_INVALADDRESSID: myMessageBox(" LINEERR_INVALADDRESSID"); break; case LINEERR_INVALADDRESSMODE: myMessageBox(" LINEERR_INVALADDRESSMODE"); break; case LINEERR_INVALADDRESSSTATE: myMessageBox(" LINEERR_INVALADDRESSSTATE"); break; case LINEERR_INVALAPPHANDLE: myMessageBox(" LINEERR_INVALAPPHANDLE"); break; case LINEERR_INVALAPPNAME: myMessageBox(" LINEERR_INVALAPPNAME"); break; case LINEERR_INVALBEARERMODE: myMessageBox(" LINEERR_INVALBEARERMODE"); break; case LINEERR_INVALCALLCOMPLMODE: myMessageBox(" LINEERR_INVALCALLCOMPLMODE"); break; case LINEERR_INVALCALLHANDLE: myMessageBox(" LINEERR_INVALCALLHANDLE"); break; case LINEERR_INVALCALLPARAMS: myMessageBox(" LINEERR_INVALCALLPARAMS"); break; case LINEERR_INVALCALLPRIVILEGE: myMessageBox(" LINEERR_INVALCALLPRIVILEGE"); break; case LINEERR_INVALCALLSELECT: myMessageBox(" LINEERR_INVALCALLSELECT"); break; case LINEERR_INVALCALLSTATE: myMessageBox(" LINEERR_INVALCALLSTATE"); break; case LINEERR_INVALCALLSTATELIST: myMessageBox(" LINEERR_INVALCALLSTATELIST"); break; case LINEERR_INVALCARD: myMessageBox(" LINEERR_INVALCARD"); break; case LINEERR_INVALCOMPLETIONID: myMessageBox(" LINEERR_INVALCOMPLETIONID"); break; case LINEERR_INVALCONFCALLHANDLE: myMessageBox(" LINEERR_INVALCONFCALLHANDLE"); break; case LINEERR_INVALCONSULTCALLHANDLE: myMessageBox(" LINEERR_INVALCONSULTCALLHANDLE"); break; case LINEERR_INVALCOUNTRYCODE: myMessageBox(" LINEERR_INVALCOUNTRYCODE"); break; case LINEERR_INVALDEVICECLASS: myMessageBox(" LINEERR_INVALDEVICECLASS"); break; case LINEERR_INVALDEVICEHANDLE: myMessageBox(" LINEERR_INVALDEVICEHANDLE"); break; case LINEERR_INVALDIALPARAMS: myMessageBox(" LINEERR_INVALDIALPARAMS"); break; case LINEERR_INVALDIGITLIST: myMessageBox(" LINEERR_INVALDIGITLIST"); break; case LINEERR_INVALDIGITMODE: myMessageBox(" LINEERR_INVALDIGITMODE"); break; case LINEERR_INVALDIGITS: myMessageBox(" LINEERR_INVALDIGITS"); break; case LINEERR_INVALEXTVERSION: myMessageBox(" LINEERR_INVALEXTVERSION"); break; case LINEERR_INVALGROUPID: myMessageBox(" LINEERR_INVALGROUPID"); break; case LINEERR_INVALLINEHANDLE: myMessageBox(" LINEERR_INVALLINEHANDLE"); break; case LINEERR_INVALLINESTATE: myMessageBox(" LINEERR_INVALLINESTATE"); break; case LINEERR_INVALLOCATION: myMessageBox(" LINEERR_INVALLOCATION"); break; case LINEERR_INVALMEDIALIST: myMessageBox(" LINEERR_INVALMEDIALIST"); break; case LINEERR_INVALMEDIAMODE: myMessageBox(" LINEERR_INVALMEDIAMODE"); break; case LINEERR_INVALMESSAGEID: myMessageBox(" LINEERR_INVALMESSAGEID"); break; case LINEERR_INVALPARAM: myMessageBox(" LINEERR_INVALPARAM"); break; case LINEERR_INVALPARKID: myMessageBox(" LINEERR_INVALPARKID"); break; case LINEERR_INVALPARKMODE: myMessageBox(" LINEERR_INVALPARKMODE"); break; case LINEERR_INVALPOINTER: myMessageBox(" LINEERR_INVALPOINTER"); break; case LINEERR_INVALPRIVSELECT: myMessageBox(" LINEERR_INVALPRIVSELECT"); break; case LINEERR_INVALRATE: myMessageBox(" LINEERR_INVALRATE"); break; case LINEERR_INVALREQUESTMODE: myMessageBox(" LINEERR_INVALREQUESTMODE"); break; case LINEERR_INVALTERMINALID: myMessageBox(" LINEERR_INVALTERMINALID"); break; case LINEERR_INVALTERMINALMODE: myMessageBox(" LINEERR_INVALTERMINALMODE"); break; case LINEERR_INVALTIMEOUT: myMessageBox(" LINEERR_INVALTIMEOUT"); break; case LINEERR_INVALTONE: myMessageBox(" LINEERR_INVALTONE"); break; case LINEERR_INVALTONELIST: myMessageBox(" LINEERR_INVALTONELIST"); break; case LINEERR_INVALTONEMODE: myMessageBox(" LINEERR_INVALTONEMODE"); break; case LINEERR_INVALTRANSFERMODE: myMessageBox(" LINEERR_INVALTRANSFERMODE"); break; case LINEERR_LINEMAPPERFAILED: myMessageBox(" LINEERR_LINEMAPPERFAILED"); break; case LINEERR_NOCONFERENCE: myMessageBox(" LINEERR_NOCONFERENCE"); break; case LINEERR_NODEVICE: myMessageBox(" LINEERR_NODEVICE"); break; case LINEERR_NODRIVER: myMessageBox(" LINEERR_NODRIVER"); break; case LINEERR_NOMEM: myMessageBox(" LINEERR_NOMEM"); break; case LINEERR_NOREQUEST: myMessageBox(" LINEERR_NOREQUEST"); break; case LINEERR_NOTOWNER: myMessageBox(" LINEERR_NOTOWNER"); break; case LINEERR_NOTREGISTERED: myMessageBox(" LINEERR_NOTREGISTERED"); break; case LINEERR_OPERATIONFAILED: myMessageBox(" LINEERR_OPERATIONFAILED"); break; case LINEERR_OPERATIONUNAVAIL: myMessageBox(" LINEERR_OPERATIONUNAVAIL"); break; case LINEERR_RATEUNAVAIL: myMessageBox(" LINEERR_RATEUNAVAIL"); break; case LINEERR_RESOURCEUNAVAIL: myMessageBox(" LINEERR_RESOURCEUNAVAIL"); break; case LINEERR_REQUESTOVERRUN: myMessageBox(" LINEERR_REQUESTOVERRUN"); break; case LINEERR_STRUCTURETOOSMALL: myMessageBox(" LINEERR_STRUCTURETOOSMALL"); break; case LINEERR_TARGETNOTFOUND: myMessageBox(" LINEERR_TARGETNOTFOUND"); break; case LINEERR_TARGETSELF: myMessageBox(" LINEERR_TARGETSELF"); break; case LINEERR_UNINITIALIZED: myMessageBox(" LINEERR_UNINITIALIZED"); break; case LINEERR_USERUSERINFOTOOBIG: myMessageBox(" LINEERR_USERUSERINFOTOOBIG"); break; case LINEERR_REINIT: myMessageBox(" LINEERR_REINIT"); break; case LINEERR_ADDRESSBLOCKED: myMessageBox(" LINEERR_ADDRESSBLOCKED"); break; case LINEERR_BILLINGREJECTED: myMessageBox(" LINEERR_BILLINGREJECTED"); break; case LINEERR_INVALFEATURE: myMessageBox(" LINEERR_INVALFEATURE"); break; case LINEERR_NOMULTIPLEINSTANCE: myMessageBox(" LINEERR_NOMULTIPLEINSTANCE"); break; default: break; } //end switch } ///////////////////////////////////////////////////////////////////// // myMessageBox - easy message box function //////////////////////////////////////////////////////////////////// void myMessageBox (LPSTR s) { MessageBox (NULL, "Error", s, MB_OK); }