亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? tapiline.cpp

?? 簡(jiǎn)單的Tapi例子
?? CPP
字號(hào):
// TapiLine.cpp : implementation file
//

#include "stdafx.h"
#include "dialer.h"
#include "TapiLine.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


// A pointer to my class because TAPI needs a callback
CTapiLine* CTapiLine::MyThis = NULL;


/////////////////////////////////////////////////////////////////////////////
// CTapiLine

CTapiLine::CTapiLine()
{
	MyThis = this;
	m_LineHandle = NULL;
}

void CTapiLine::Create(HWND& hWnd)
{
	m_hWnd = hWnd;
	m_hInst =(HINSTANCE)::GetWindowLong(m_hWnd, GWL_HINSTANCE);

	// Set the necessary properties to null
	SetProp( m_hWnd, "HCALL", NULL );
	SetProp( m_hWnd, "HLINE", NULL );
	SetProp( m_hWnd, "HCOMM", NULL );
}


CTapiLine::~CTapiLine()
{
	// drop the saved properties
	RemoveProp( m_hWnd, "HCALL" );
	RemoveProp( m_hWnd, "HLINE" );
	RemoveProp( m_hWnd, "HCOMM" );
}

// ***********************************************
// This routine places the actual call
//
LONG CTapiLine::DialCall( LPTSTR PhoneNumber )
{
	LONG	retcode =  0;			// local returns
	DWORD	i;						// counter for lines
	DWORD	RetApiVersion;			// return version
	LINEEXTENSIONID	ExtensionID;	// struc for API call

	//
	// make sure you have a phone number
	if( lstrlen( PhoneNumber ) < 1 )
		return( ERRORS );	

	// Initialize the line, register the callback
	if( m_LineHandle == NULL ) {
		retcode = ::lineInitialize( &m_LineHandle, m_hInst, 
								(LINECALLBACK)lineCallbackFunc, 
								"MSM TAPI", &m_dwLines );
		if( retcode < 0 )  {
			TapiStatus("Tapi error..." );
			return (retcode);
		}
		else
			TapiStatus("Tapi initialized..." );
	}
	//
	// go through all the lines to get API and properties
	// if you find one that has the right properties, 
	// jump out and continue to next section of code
	//
	m_hLine = (HLINE)GetProp( m_hWnd, "HLINE" );
	if( m_hLine == NULL )
	{
		for( i=0; i < m_dwLines; i++ )
		{
			// Negotiate the API Version for each line
			retcode = ::lineNegotiateAPIVersion(	m_LineHandle, i, 
												EARLY_TAPI_VERSION, 
												WIN95TAPIVERSION,
												&RetApiVersion,
												&ExtensionID );

			retcode = ::lineOpen( m_LineHandle, i, &m_hLine, 
				                RetApiVersion, 0, (DWORD)m_hWnd,
                                LINECALLPRIVILEGE_MONITOR | 
					            LINECALLPRIVILEGE_OWNER,
					            LINEMEDIAMODE_DATAMODEM, 
								NULL );
			if( retcode == 0 )
				break;
		}
		if( retcode != 0 )
			return( ERRORS );
	}
	//
	// found a good line
	SetProp( m_hWnd, "HLINE",(HANDLE)(HLINE)m_hLine );

	//
	// now set of properties of the line for outbound dialing
	memset( &m_LineParams, 0, sizeof( LINECALLPARAMS ) );
	m_LineParams.dwTotalSize = sizeof( LINECALLPARAMS );
	m_LineParams.dwMinRate = 9600;	// setting data rates
	m_LineParams.dwMaxRate = 28800;	//
    m_LineParams.dwBearerMode = LINEBEARERMODE_VOICE; 
	m_LineParams.dwMediaMode  = LINEMEDIAMODE_DATAMODEM;
	//
	// finally place the call!
	retcode = ::lineMakeCall( m_hLine, &m_hCall, 
							PhoneNumber, 0, 
							&m_LineParams );
	if( retcode < 0 ) 
			return (retcode);	// tell'em how it turned out!
	else
		Delay(5000);	// make a 5 secs delay... or according to ur needs 
	return( retcode );	// tell'em how it turned out!
}

//
//  FUNCTION: lineCallbackFunc(..)
//
//  PURPOSE: Receive asynchronous TAPI events
//
void CALLBACK CTapiLine::lineCallbackFunc(
    DWORD dwDevice, DWORD dwMessage, DWORD dwCallbackInstance, 
    DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
{
	MyThis->SetCallbackParams(
							dwDevice, dwMessage, 
							dwCallbackInstance, 
							dwParam1, dwParam2, 
							dwParam3);
}

void CTapiLine::SetCallbackParams(
							DWORD dwDevice, DWORD dwMessage, 
							DWORD dwCallbackInstance, 
							DWORD dwParam1, DWORD dwParam2, 
							DWORD dwParam3)
{
	m_dwDevice = dwDevice;
	m_dwMessage = dwMessage;
	m_dwCallbackInstance = dwCallbackInstance;
	m_dwParam1 = dwParam1;
	m_dwParam2 = dwParam2; 
	m_dwParam3 = dwParam3;
	
	// Load our own Override here because thats the virtual function...
	TapiCallBack();		
}	

// *******************************************
// The callback to handle TAPI messages
//
// This routine handles all messages generated by TAPI services.
// Most of these messages are ignored here or just passsed on to
// the main dialog for posting to the progress window.
//
void CTapiLine::TapiCallBack()
{   
	
    switch (m_dwMessage) 
        { 
        case LINE_LINEDEVSTATE:	// we'll ignore these for now...
            switch (m_dwParam1)
            {
            	case LINEDEVSTATE_REINIT:
					TapiStatus("LINEDEVSTATE_REINIT..." );
            		break;
            	case LINEDEVSTATE_RINGING:
					TapiStatus("LINEDEVSTATE_RINGING..." );
            		break;
            } 
			break; // LINE_LINEDEVSTATE:

        case LINE_CALLSTATE:	// review the call state messages
            HandleCallState();
            break;
       
       case LINE_CLOSE: // the line has been closed!
			{
			TapiStatus("LINE_CLOSED..." );

			break; 
			}
       case LINE_REPLY:	// pass on TAPI_REPLY messages
		{
			TapiStatus("Line Reply..." );
			::PostMessage( m_hWnd, WM_TAPI_LINE_REPLY, 
							m_dwParam2,  
							(LPARAM)(HCALL)m_dwDevice );
            break;
		}
        //
		// other messages that we'll ignore here
		//
        case LINE_REQUEST:
        case LINE_ADDRESSSTATE:
            break;
        case LINE_CALLINFO:
            break;
        case LINE_DEVSPECIFIC:
            break;
        case LINE_DEVSPECIFICFEATURE:
            break;
        case LINE_GATHERDIGITS:
            break;
        case LINE_GENERATE:
            break;
        case LINE_MONITORDIGITS:
            break;
        case LINE_MONITORMEDIA:
            break;
        case LINE_MONITORTONE:
            break;
        } /* switch */ 
        
} /* TapiCallBack() */

void CTapiLine::HandleCallState()
{
	    // Error if this CALLSTATE doesn't apply to our call in progress.
    if ((HCALL) m_dwDevice != m_hCall) {
		TapiStatus("LINE_CALLSTATE: Unknown device ID ...");
        return;
    }

	switch( m_dwParam1 )
	{
        case LINECALLSTATE_IDLE:
			{
			TapiStatus("Line is idle...");
			::SendMessage(m_hWnd, WM_TAPI_IDLE, 0, 0); 
			HangupCall();
			break;
			}													     
		case LINECALLSTATE_ACCEPTED:	// just pass message on...
			{
			SetVarProps( (HWND)m_dwCallbackInstance, m_dwDevice );
			::PostMessage( m_hWnd, WM_TAPI_CALL_ACCEPTED, 
							0,  (LPARAM)(HCALL)m_dwDevice );
		 	break;
			}
		case LINECALLSTATE_PROCEEDING:	// post progress message
			{
			SetVarProps( (HWND)m_dwCallbackInstance, m_dwDevice );
			::PostMessage( m_hWnd, WM_TAPI_CALL_PROCEEDING, 
							0,  (LPARAM)(HCALL)m_dwDevice );
			break;
			}
		case LINECALLSTATE_CONNECTED:	// hey, we got through!
			{
				LineStateConnected();
				break;
			}
		case LINECALLSTATE_OFFERING:	// pass it on
			{
			TapiStatus("LINECALLSTATE_OFFERING...");
			break;
			}
		case LINECALLSTATE_DIALTONE:
			{
			TapiStatus("Dial Tone...");
            break;
			}
        case LINECALLSTATE_DIALING:		// pass it on
			{
			TapiStatus("Dialing...");
			::SendMessage(m_hWnd, WM_TAPI_DIALING, 0, 0); 
            break;
			}
        case LINECALLSTATE_BUSY:
			{
			TapiStatus("Line busy, shutting down...");
            HangupCall();
            break;
			}
        case LINECALLSTATE_SPECIALINFO:
			{
			TapiStatus("Special Info, probably couldn't dial number...");
            HangupCall();
            break;
			}
        case LINECALLSTATE_DISCONNECTED:
        {
            LPSTR pszReasonDisconnected;

            switch (m_dwParam2)
            {
                case LINEDISCONNECTMODE_NORMAL:
                    pszReasonDisconnected = "Remote Party Disconnected";
					::SendMessage(m_hWnd, WM_TAPI_DISCONNECT, 0, 0); 
                    break;
                case LINEDISCONNECTMODE_UNKNOWN:
                    pszReasonDisconnected = "Disconnected: Unknown reason";
                    break;

                case LINEDISCONNECTMODE_REJECT:
                    pszReasonDisconnected = "Remote Party rejected call";
                    break;

                case LINEDISCONNECTMODE_PICKUP:
                    pszReasonDisconnected = 
                        "Disconnected: Local phone picked up";
                    break;

                case LINEDISCONNECTMODE_FORWARDED:
                    pszReasonDisconnected = "Disconnected: Forwarded";
                    break;

                case LINEDISCONNECTMODE_BUSY:
                    pszReasonDisconnected = "Disconnected: Busy";
                    break;

                case LINEDISCONNECTMODE_NOANSWER:
                    pszReasonDisconnected = "Disconnected: No Answer";
                    break;

                case LINEDISCONNECTMODE_BADADDRESS:
                    pszReasonDisconnected = "Disconnected: Bad Address";
                    break;

                case LINEDISCONNECTMODE_UNREACHABLE:
                    pszReasonDisconnected = "Disconnected: Unreachable";
                    break;

                case LINEDISCONNECTMODE_CONGESTION:
                    pszReasonDisconnected = "Disconnected: Congestion";
                    break;

                case LINEDISCONNECTMODE_INCOMPATIBLE:
                    pszReasonDisconnected = "Disconnected: Incompatible";
                    break;

                case LINEDISCONNECTMODE_UNAVAIL:
                    pszReasonDisconnected = "Disconnected: Unavail";
                    break;

                case LINEDISCONNECTMODE_NODIALTONE:
                    pszReasonDisconnected = "Disconnected: No Dial Tone";
                    break;

                default:
                    pszReasonDisconnected = 
                        "Disconnected: LINECALLSTATE; Bad Reason";
                    break;

            }
			TapiStatus(pszReasonDisconnected);
            HangupCall();
            break;
        }
	}	/* switch */ 
}

LONG CTapiLine::LineStateConnected()
{
	TapiStatus("Hey I am connected!");
	//
	// local vars for processing
	LPVARSTRING lpVarStringStruct = NULL;
	size_t sizeofVarStringStruct = sizeof( VARSTRING ) + 1024;

	long lreturn;
	// get the comm handle.  Be sure to drop this handle when
	// the call is done or you'll get device unavailable errors
	// and have to REBOOT!
	lpVarStringStruct = ( LPVARSTRING )LocalAlloc( 0, sizeofVarStringStruct );
	do
	{
		memset( lpVarStringStruct, 0, sizeofVarStringStruct );
		lpVarStringStruct->dwTotalSize = (DWORD)sizeofVarStringStruct;
		lreturn = lineGetID( 0, 0, (HCALL)m_dwDevice, LINECALLSELECT_CALL, lpVarStringStruct, "comm/datamodem" );
	} while( lreturn != 0 );
	//
	// get comm device handle and save it to properties area
	m_hComm = *( (LPHANDLE )( ( LPBYTE )lpVarStringStruct + lpVarStringStruct->dwStringOffset ) );
	SetProp( (HWND)m_dwCallbackInstance, "HCOMM", m_hComm );
	SetVarProps( (HWND)m_dwCallbackInstance, m_dwDevice );
	//
	// tell main dialog we got through
	::SendMessage(m_hWnd, WM_TAPI_CONNECT, 
					  TAPI_LINECALLSTATE_CONNECTED, 
					  (LPARAM)(HANDLE)m_hComm );
	LocalFree( lpVarStringStruct ); // drop mem space

	return lreturn;
}

//
//  FUNCTION: LONG HangupCall()
//
//  PURPOSE: Hangup the call in progress if it exists.
//
LONG CTapiLine::HangupCall()
{         

	LONG retcode = 0;		// some local stuff

	TapiStatus("Stopping Call in progress...");	
	//
	// try to get the handles	
	m_hCall = (HCALL)GetProp( m_hWnd, "HCALL" );
	m_hComm = (HANDLE)GetProp( m_hWnd, "HCOMM" );
	//
	// if we have a comm handle, drop it	
	if( m_hComm != NULL )
	{
		CloseHandle( m_hComm );
		SetProp( m_hWnd, "HCALL", NULL );
	}
	//
	// if we have a call handle, drop it
	if( m_hCall != NULL )
	{
		retcode = lineDrop( m_hCall, NULL, 0 );
		TapiStatus("Call Dropped...");
		SetProp( m_hWnd, "HCALL", NULL );
	}

	LINECALLINFO LineCallInfo;
	//
	// load call info into structure
	memset( &LineCallInfo, 0, sizeof( LINECALLINFO ) );
	LineCallInfo.dwTotalSize = sizeof( LINECALLINFO );
	lineGetCallInfo( (HCALL)m_dwDevice, &LineCallInfo );
	//
	// deallocate the call
	retcode = lineDeallocateCall( (HCALL)m_dwDevice );
	TapiStatus("Call deallocated...");
	//
	// call went idle, do cleanup
	m_hLine = (HLINE)GetProp( m_hWnd, "HLINE" ); 
	//
	// if we have a live line, close it
	if( m_hLine != NULL )
	{
		retcode = lineClose( m_hLine );
		TapiStatus("Line Closed...");
		SetProp( m_hWnd, "HLINE", (HANDLE)NULL );
	}
	TapiStatus("Call stopped...");
    return retcode;
}

// ***************************************************
// get line handle from LINECALLINFO structure
//
void CTapiLine::SetVarProps(HWND hWnd, DWORD hDevice )
{
	LINECALLINFO LineCallInfo;

	memset( &LineCallInfo, 0, sizeof( LINECALLINFO ) );
	SetProp( hWnd, "HCALL", (HANDLE)(HCALL)hDevice );
	LineCallInfo.dwTotalSize = sizeof( LINECALLINFO );
	lineGetCallInfo( (HCALL)hDevice, &LineCallInfo );
 	SetProp(m_hWnd, "HLINE", (HANDLE)(HLINE)LineCallInfo.hLine );
	return;
}

void CTapiLine::TapiStatus(LPSTR lpszError, BOOL bShowMsgBox)
{
	strcpy(m_szMessage, lpszError);

	::SendMessage(m_hWnd, WM_TAPI_STATUS, 0, 0); 
	
	// Give some delay if u want it ok..
	Delay(400);

	// u wanna show it using dialog box.. 
	if(bShowMsgBox)
		AfxMessageBox(m_szMessage);
	
	// output it in the debugger
	OutputDebugString(m_szMessage);
	OutputDebugString("\n");
}

void CTapiLine::Delay(UINT lFactor)
{
	MSG msg;
	DWORD dwTimeStarted;
	dwTimeStarted = GetTickCount();

	// get control of message loop
    while(GetTickCount() - dwTimeStarted < lFactor)
	{ 
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		
	}
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩日欧美一区二区三区| 欧洲国内综合视频| 麻豆久久久久久| 亚洲人成网站色在线观看| 日韩欧美国产精品| 日韩一区二区精品葵司在线| 欧美一区国产二区| 911精品国产一区二区在线| 欧美高清视频不卡网| 色老头久久综合| 欧美日韩国产色站一区二区三区| 欧美色精品天天在线观看视频| 欧美日韩一区 二区 三区 久久精品| 在线免费观看一区| 在线播放中文字幕一区| 制服丝袜亚洲色图| 日韩精品一区二区三区蜜臀 | 久久久亚洲精品一区二区三区| 日韩一二三四区| 精品国产一区二区亚洲人成毛片| 久久久影视传媒| 中文字幕一区日韩精品欧美| 亚洲人成网站影音先锋播放| 天使萌一区二区三区免费观看| 亚洲成av人在线观看| 麻豆91免费观看| 国产精品 日产精品 欧美精品| 成人白浆超碰人人人人| 在线看国产日韩| 欧美一级二级三级乱码| 国产欧美日韩卡一| 一区二区三区四区亚洲| 日韩精品久久久久久| 国产成人免费av在线| 色噜噜夜夜夜综合网| 欧美精品在线一区二区三区| 久久综合色8888| 国产精品久久久久天堂| 一区二区久久久久久| 黄一区二区三区| 色综合天天综合给合国产| 777午夜精品免费视频| 久久久久国产成人精品亚洲午夜| 国产精品初高中害羞小美女文| 亚洲国产精品久久久久婷婷884| 蜜臀91精品一区二区三区| 99久久久国产精品| 欧美一区二区三区在线看| 国产精品久久久久久久蜜臀| 婷婷中文字幕一区三区| 成人福利视频在线| 欧美一区欧美二区| 亚洲美女免费在线| 国内精品久久久久影院一蜜桃| 色哟哟国产精品| 国产午夜精品理论片a级大结局 | 激情五月婷婷综合| 色综合中文字幕国产| 久久综合色播五月| 日韩激情视频网站| 91天堂素人约啪| 久久综合色天天久久综合图片| 亚洲一级片在线观看| 高清不卡一区二区| 日韩欧美成人激情| 午夜电影一区二区三区| 色综合久久久久综合99| 久久久久99精品国产片| 日本不卡在线视频| 欧美伊人久久大香线蕉综合69| 亚洲国产精品黑人久久久| 蓝色福利精品导航| 欧美性受xxxx| 综合久久久久久| 国产二区国产一区在线观看| 欧美一区永久视频免费观看| 亚洲女厕所小便bbb| 国产xxx精品视频大全| 日韩精品一区二区在线| 日本免费在线视频不卡一不卡二| 色国产综合视频| 亚洲三级小视频| 精品写真视频在线观看| 欧美午夜精品免费| 亚洲精品福利视频网站| 99久久精品情趣| 亚洲国产成人自拍| 国产精品一二三| 久久久久久影视| 国产一区不卡精品| 精品国产乱码久久久久久蜜臀 | 亚洲123区在线观看| 91黄视频在线观看| 亚洲免费资源在线播放| 91污片在线观看| 亚洲精选在线视频| 日本久久电影网| 亚洲精品国产成人久久av盗摄| 99精品国产视频| 亚洲欧美一区二区久久| 99国产精品国产精品久久| 国产精品超碰97尤物18| 91免费国产在线观看| 亚洲人精品一区| 在线观看www91| 亚洲国产欧美日韩另类综合 | 国产不卡视频在线观看| 国产亚洲欧美日韩日本| 日韩午夜在线观看| 亚洲一区在线播放| 欧美剧在线免费观看网站| 免费看欧美女人艹b| 日韩欧美国产1| 国产一区二区免费在线| 日本一区二区三区在线不卡 | 国产欧美精品在线观看| 国v精品久久久网| 亚洲图片欧美激情| 欧美性淫爽ww久久久久无| 日韩高清中文字幕一区| 欧美电影免费观看完整版 | 日韩欧美一区二区免费| 久久91精品国产91久久小草| 欧美精品一区二区三区很污很色的 | 国产欧美日产一区| 91在线一区二区三区| 亚洲一区二区精品久久av| 日韩一级二级三级| 国产精品亚洲综合一区在线观看| 国产精品天干天干在线综合| 色婷婷激情久久| 蜜桃精品视频在线| 中文字幕欧美国产| 欧美中文一区二区三区| 精品一区二区三区在线播放| 一区二区三区蜜桃| 亚洲美女区一区| 欧美电视剧在线看免费| 成人亚洲精品久久久久软件| 亚洲综合在线免费观看| 欧美精品日日鲁夜夜添| 国产乱妇无码大片在线观看| 亚洲欧美国产77777| 日韩欧美中文字幕公布| 成人精品视频.| 亚洲成人黄色小说| 中文字幕欧美日本乱码一线二线| 欧美性大战久久| 国产成人av一区二区三区在线 | 久久精品在线免费观看| 色偷偷久久人人79超碰人人澡| 日本免费在线视频不卡一不卡二| 国产精品色婷婷久久58| 制服丝袜成人动漫| 不卡影院免费观看| 久久国产乱子精品免费女| 亚洲视频一二三区| 久久综合久久综合九色| 在线观看成人小视频| 国产成a人亚洲精| 三级成人在线视频| 亚洲同性gay激情无套| 精品国产电影一区二区| 欧美日韩国产一二三| 成人av午夜电影| 久久66热re国产| 亚洲成人免费看| 17c精品麻豆一区二区免费| 精品奇米国产一区二区三区| 色视频一区二区| 成人午夜视频免费看| 麻豆91在线观看| 日日夜夜精品视频天天综合网| 国产精品伦理在线| 精品国产制服丝袜高跟| 在线播放亚洲一区| 色狠狠桃花综合| 99视频有精品| 国产精品一区二区在线播放| 日日夜夜免费精品视频| 亚洲最大成人综合| 亚洲欧美自拍偷拍| 国产欧美精品日韩区二区麻豆天美| 欧美一区二区在线免费播放| 在线观看一区二区精品视频| 91在线一区二区三区| 成人午夜av电影| 国产老妇另类xxxxx| 麻豆精品精品国产自在97香蕉| 亚洲第四色夜色| 夜夜亚洲天天久久| 亚洲免费伊人电影| 中文字幕一区日韩精品欧美| 国产日韩欧美不卡在线| 久久久久久久久久久99999| 欧美mv和日韩mv国产网站| 欧美一级黄色录像| 欧美一区二区成人6969| 91精品国产综合久久久蜜臀粉嫩 | 亚洲一区二区精品视频|