www.pudn.com > VoiceModem.zip > MYTAPI_.C
#include "comdial.h"
#include "resource.h"
MYTAPI mytapi;
extern HWND hTTYWnd;
/////////////////////////////////////////////////////////////////////
// telephonyInitialize - mega function 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_AUTOMATEDVOICE) {
mytapi.dwLine = i;
break;
}
}
return 0;
done:
// error! clean up and return error code
telephonyShutdown();
return lrc;
}
/////////////////////////////////////////////////////////////////////
// telephonyOpen - open the telephone line device
//
////////////////////////////////////////////////////////////////////
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_AUTOMATEDVOICE,
NULL);
if (lrc)
goto done;
// bool indicates lineOpen called successfully
mytapi.bLineopen = TRUE;
// get the telephony icon and make it ours
myDrawTAPIIcon(hWnd);
// receive all possible status messages for the
// line device and address
lineSetStatusMessages(mytapi.hLine,
mytapi.pLinedevcaps->dwLineStates,
0);
// set ring count for the no-message waiting situation
lineSetNumRings (mytapi.hLine, 0, RINGCNT);
lineGetNumRings(mytapi.hLine, 0, &mytapi.nRingCnt);
// success
return 0;
done:
// error! clean up and return error code
telephonyShutdown();
return lrc;
} // end procedure (telephony initialize)
/////////////////////////////////////////////////////////////////////
// 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);
}
/////////////////////////////////////////////////////////////////////
// mylineGetWaveID - get wave handle
////////////////////////////////////////////////////////////////////
LONG mylineGetWaveID (DWORD dwSelect, LPSTR waveDev)
{
DWORD dwWaveDev;
VARSTRING *vs;
LONG lrc;
DWORD dwSize;
// allocate memory for structure
vs = (VARSTRING *) calloc (1, sizeof(VARSTRING));
// set structure size
vs->dwTotalSize = sizeof(VARSTRING);
do {
// get information into structure
if (dwSelect == LINECALLSELECT_LINE)
lrc = lineGetID(mytapi.hLine, 0L, NULL, dwSelect, vs, waveDev);
if (dwSelect == LINECALLSELECT_CALL)
lrc = lineGetID(mytapi.hLine, 0L, mytapi.hCall, dwSelect, vs, waveDev);
// 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 wave id
dwWaveDev = (DWORD) *((DWORD *)((LPSTR)vs + vs->dwStringOffset));
free (vs);
return dwWaveDev;
} /* end function (mylineGetWaveID) */
/////////////////////////////////////////////////////////////////////
// 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;
}
/////////////////////////////////////////////////////////////////////
// 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;
}
/////////////////////////////////////////////////////////////////////
// telephonyShutdown - mega functions to close line, shut down
// telephony, close modem handle, restore serial device
// configuration, and free up various allocated structures.
////////////////////////////////////////////////////////////////////
void telephonyShutdown()
{
// close line if open
if (mytapi.bLineopen)
lineClose(mytapi.hLine);
// shutdown tapi if initialized
if (mytapi.bInitialized)
lineShutdown(mytapi.hTAPI);
// free up various structures if allocated
if (mytapi.bLinedevcapsalloced)
free (mytapi.pLinedevcaps);
if (mytapi.bLinedevstatusalloced)
free (mytapi.pLinedevstatus);
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.bLinedevstatusalloced = FALSE;
mytapi.bLineopen = FALSE;
mytapi.bInitialized = FALSE;
mytapi.bLinecallinfoalloced = FALSE;
mytapi.bLinecallstatusalloced = FALSE;
mytapi.bWaitForCall = FALSE;
} // end function (telephonyShutdown)
/////////////////////////////////////////////////////////////////////
// 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;
LONG lrc;
switch (dwMessage) {
case LINE_CALLSTATE:
switch (dwParam3) {
case LINECALLPRIVILEGE_MONITOR:
break;
case LINECALLPRIVILEGE_OWNER:
// update local call information
mylineGetCallStatus();
// update menus
hMenu = GetMenu(hTTYWnd);
// 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 ) ;
// save call handle and get device ids
if (mytapi.hCall != (HCALL)dwDevice) {
mytapi.hCall = (HCALL)dwDevice;
mytapi.dwWaveInID = mylineGetWaveID(LINECALLSELECT_CALL, "wave/in");
mytapi.dwWaveOutID = mylineGetWaveID(LINECALLSELECT_CALL, "wave/out");
// FOR DEBUGGING; REMOVE FROM FINAL VERSION
mytapi.dwWaveOutID = 0;
mytapi.dwWaveInID = 0;
}
break;
default:
break;
} //end switch
switch (dwParam1) {
case LINECALLSTATE_IDLE:
// deallocate call resources
lineDeallocateCall (mytapi.hCall);
mytapi.hCall = NULL;
break;
case LINECALLSTATE_OFFERING:
break;
case LINECALLSTATE_CONNECTED:
mytapi.h_waveout =playSound (mytapi.dwWaveOutID,"greeting.wav", hTTYWnd);
mytapi.iPlayState = PLAYSTATE_IDLE;
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD0;
lrc = lineMonitorDigits(mytapi.hCall, LINEDIGITMODE_DTMF);
break;
default:
break;
} //end switch
break;
case LINE_CLOSE:
break;
case LINE_LINEDEVSTATE:
switch (dwParam1) {
case LINEDEVSTATE_RINGING:
mytapi.nRings = dwParam3;
if (mytapi.bWaitForCall && mytapi.nRings == mytapi.nRingCnt) {
// answer incoming calls
lrc = lineAnswer(mytapi.hCall,NULL,0);
if (!(lrc >0 )) {
ProcessTAPIError(lrc);
myMessageBox("Error answering call");
}
mytapi.nRings = 0;
}
break;
}
break;
case LINE_MONITORDIGITS:
switch (dwParam2) {
case LINEDIGITMODE_DTMF:
{
char c;
char name[30];
switch (c = LOBYTE(dwParam1)) {
case '1':
// if in the idle state,
// transition to the password state
switch (mytapi.iPlayState) {
case PLAYSTATE_IDLE:
if (mytapi.h_waveout =playSound (mytapi.dwWaveOutID,"pw.wav", hTTYWnd)) {
mytapi.iPlayState = PLAYSTATE_PASSWORD;
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD0;
}
break;
default:
break;
}
break;
case '2':
// if in the idle state,
// transition to the recording state
switch (mytapi.iPlayState) {
case PLAYSTATE_IDLE:
if (mytapi.h_waveout =playSound (mytapi.dwWaveOutID,"record.wav", hTTYWnd)) {
mytapi.iPlayState = PLAYSTATE_RECORD;
recordMessage (mytapi.dwWaveInID);
}
break;
case PLAYSTATE_PASSWORD:
switch (mytapi.iPlaySubState) {
case PLAYSUBSTATE_PASSWORD2:
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD3;
break;
default:
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD0;
break;
}
break;
default:
break;
}
break;
case '3':
break;
case '4':
break;
case '5':
break;
case '6':
switch (mytapi.iPlayState) {
case PLAYSTATE_PASSWORD:
switch (mytapi.iPlaySubState) {
case PLAYSUBSTATE_PASSWORD0:
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD1;
break;
default:
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD0;
break;
}
break;
default:
break;
}
break;
case '7':
switch (mytapi.iPlayState) {
case PLAYSTATE_PASSWORD:
switch (mytapi.iPlaySubState) {
case PLAYSUBSTATE_PASSWORD1:
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD2;
break;
case PLAYSUBSTATE_PASSWORD3:
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD0;
// begin playing messages
if (mytapi.nMsgCnt > 0) {
mytapi.nPlayCnt = 0;
wsprintf(name, "msg-%d.wav", mytapi.nPlayCnt);
if (mytapi.h_waveout =playSound (mytapi.dwWaveOutID,name, hTTYWnd))
mytapi.iPlayState = PLAYSTATE_PLAYBACK;
} else {
mytapi.h_waveout =playSound (mytapi.dwWaveOutID, "nomsg.wav", hTTYWnd);
}
break;
default:
mytapi.iPlaySubState = PLAYSUBSTATE_PASSWORD0;
break;
}
break;
default:
break;
}
break;
case '8':
break;
case '9':
break;
}
break;
}
case LINEDIGITMODE_DTMFEND:
break;
default:
break;
} //end switch
break;
case LINE_MONITORTONE:
break;
case LINE_REPLY:
if (dwParam2 < 0)
ProcessTAPIError (dwParam2);
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);
}