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); 
}