⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dialring.cpp

📁 通信增值服务,上网接听电话
💻 CPP
字号:
// DialRing.cpp : implementation file
//

#include "stdafx.h"
#include "netpro.h"
#include "ras.h"
#include "raserror.h"
#include "tapiutils.h"
#include "DialDlg.h"
#include "DialRing.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDialRing dialog
UINT unMsg;
//HWND g_hWnd;
CDialRing* MyDialRing;
extern CSystemStatus SystemStatus;


CDialRing::CDialRing(CWnd* pParent /*=NULL*/)
	: CDialog(CDialRing::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDialRing)
	m_pDialDlg=(CDialDlg*)pParent;
	m_cStatus = _T("");
	//}}AFX_DATA_INIT
	m_bDirection = TRUE;
	unMsg = RegisterWindowMessageA( RASDIALEVENT );
	if (unMsg == 0)
		unMsg = WM_RASDIALEVENT; 
	hRasConn=NULL;
	MyDialRing = this;
	m_ptapiObj=NULL;
	IsQuit = FALSE;
	m_pThread = NULL;
	m_bInHangupCall = FALSE;

}

void CDialRing::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDialRing)
	DDX_Control(pDX, IDC_STATIC_DIALING, m_cDialingIcon);
	DDX_Text(pDX, IDC_STASTATUS, m_cStatus);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDialRing, CDialog)
	//{{AFX_MSG_MAP(CDialRing)
	ON_WM_TIMER()
	ON_WM_QUERYDRAGICON()
	ON_WM_PAINT()
	ON_WM_NCDESTROY()
	//}}AFX_MSG_MAP
	//ON_MESSAGE(WM_RASDIALEVENTARRIVED,OnDialEventArrived)
	ON_MESSAGE(WM_RASDIALEVENTARRIVED,OnDialMessageReceived)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDialRing message handlers

BOOL CDialRing::OnInitDialog() 
{
	CDialog::OnInitDialog();
	m_hIcon = AfxGetApp()->LoadIcon(IDI_DLGDIALING0);
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	CString s;
	s.LoadString(IDS_DIAL);
	SetWindowText(s);
	m_iIconType = IDI_DIALING2;
	m_Timer=SetTimer(100,500,NULL);
	m_hDialUp=CreateEvent(NULL,FALSE,FALSE,NULL);
	if(!m_pDialDlg->m_cJMPNum.IsEmpty())
	{
    	if(m_pDialDlg->m_bOnJMP==TRUE)
		{
			m_pThread=AfxBeginThread(DivertLineCallThread,this);
		}else{
		IsQuit = FALSE;
		SetEvent(m_hDialUp);
		}
	}
	else{
	    SystemStatus.bDialWinOnCancel=TRUE;
		IsQuit = FALSE;
		SetEvent(m_hDialUp);
	}

	//g_hWnd = m_hWnd;
	// TODO: Add extra initialization here
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

VOID CALLBACK CDialRing::RasDialFunc( UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError )
{
	/*::PostMessage( MyDialRing->GetSafeHwnd(),
				WM_RASDIALEVENTARRIVED,
                 (WPARAM) rasconnstate,
                 (LPARAM) dwError );*/
	MyDialRing->ProcessDialEventArrived(rasconnstate,dwError);

}
UINT CDialRing::ProcessDialEventArrived(WPARAM wParam,LPARAM lParam)
{
	return PostMessage(WM_RASDIALEVENTARRIVED,wParam,lParam);

}

UINT CDialRing::OnDialEventArrived(WPARAM wParam,LPARAM lParam)
{
	RASCONNSTATE rasconnstate;
	DWORD dwError,dwRet;
	rasconnstate = (RASCONNSTATE) wParam; // connection state about to be entered 
	dwError = (DWORD) lParam;             // error that may have occurred 
	char szBuf[128];
	if(dwError)
	{
		//Error Process
		dwRet = dwError;
             if ( dwRet != 0 )  
			 {
		      if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
		      wsprintf( (LPSTR)szBuf, "Undefined RAS Dial Error (%ld).", dwRet );
			  if(dwRet!=631)//631:port disconnected by user
			  ::MessageBox( GetSafeHwnd(),(LPSTR)szBuf, "Error", MB_OK | MB_ICONSTOP );
			  OnCancel();
			  return TRUE;
			 }
	}
	else
	{
		switch(rasconnstate)
		{
		case RASCS_OpenPort:
		case RASCS_PortOpened: 
		case RASCS_ConnectDevice:
		case RASCS_DeviceConnected: 
		case RASCS_AllDevicesConnected:
			      m_cStatus.LoadString(IDS_DIALING_UP);//="正在拨号上网...";
				  break;

		case RASCS_Authenticate:
		case RASCS_AuthNotify:
		case RASCS_AuthRetry: 
		case RASCS_AuthCallback: 
		case RASCS_AuthChangePassword: 
		case RASCS_AuthProject:
		case RASCS_AuthLinkSpeed: 
		case RASCS_AuthAck: 
		case RASCS_ReAuthenticate:
			m_cStatus.LoadString(IDS_AUTHENTICATING);// = "正在验证用户名和密码...";
			break;
		case RASCS_Authenticated: 
		case RASCS_PrepareForCallback: 
		case RASCS_WaitForModemReset:
		case RASCS_WaitForCallback:
		case RASCS_Projected:

		case RASCS_StartAuthentication:    // Windows 95 only 
		case RASCS_CallbackComplete:       // Windows 95 only 
			break;
		case RASCS_LogonNetwork:           // Windows 95 only 
			m_cStatus.LoadString(IDS_LOGONNETWORK);// = "正在验证用户名和密码...";
			break;

		case RASCS_SubEntryConnected:
		case RASCS_SubEntryDisconnected:
 
		case RASCS_Interactive:
		case RASCS_RetryAuthentication:
		case RASCS_CallbackSetByCaller:
		case RASCS_PasswordExpired: 
 			break;
 
		case RASCS_Connected:
			m_cStatus = "OK";
			//TerminateThread(m_pDialDlg->m_pThread->m_hThread,100);
			m_pDialDlg->m_IsDialUpSucc = TRUE;
			m_pDialDlg->m_DialStatus=2;
			KillTimer(m_Timer);
			CDialog::OnOK();
			break;
		case RASCS_Disconnected:
			m_cStatus.LoadString(IDS_DISCONNECTING_RAS);// = "正在断开网络";
			CDialog::OnCancel();
		default:
			;

		}
	}
	//UpdateData(FALSE);
	return TRUE;
 
}

void CDialRing::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnTimer(nIDEvent);
	if(WaitForSingleObject(m_hDialUp,0)==WAIT_OBJECT_0)
	{
	if(IsQuit)
		OnCancel();
	else{
/*		if(m_pThread){
			delete m_pThread;
			m_pThread = NULL;
		}
*/
		RasDialUp();
	}
	}

    switch(m_pDialDlg->m_DialStatus )
	{
	 case 0:
        m_cStatus="正在登记遇忙转移";
		break;
     case 1:
       /*
	    ras[0].dwSize = sizeof( RASCONN );
	    dSize = sizeof( ras );   // Get active RAS - Connection
	    dwRet = RasEnumConnections( ras, &dSize, &dNumber );
	    if ( dwRet == 0 )
		{
	     if(dNumber!=0)
		 {
         rasconnstatus.dwSize=sizeof(rasconnstatus);
		 RasGetConnectStatus(ras[0].hrasconn,&rasconnstatus);
		 switch(rasconnstatus.rasconnstate)) 
		 { 
		   case RASCS_Connected:
			 m_cStatus ="已经拨号上网";
		     break;
		   case 
			 m_cStatus ="正在拨号上网";
		 
		 }
		}*/
  //     m_cStatus="正在拨号上网...";
		break;
	 default :
//        m_cStatus="";
		 break;
	}

	if(m_bDirection){
		if((++m_iIconType)==IDI_DIALING3)
			m_bDirection=(!m_bDirection);
	}else{
		if((--m_iIconType)==IDI_DIALING0)
			m_bDirection=(!m_bDirection);
	}
	m_cDialingIcon.SetIcon(AfxGetApp()->LoadIcon(m_iIconType));
	SetIcon(AfxGetApp()->LoadIcon(m_iIconType+(IDI_DLGDIALING0-IDI_DIALING0)),FALSE);
	UpdateData(FALSE);
}

HCURSOR CDialRing::OnQueryDragIcon() 
{
	// TODO: Add your message handler code here and/or call default
	
	return CDialog::OnQueryDragIcon();
}

void CDialRing::OnPaint() 
{
		if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
	
	// Do not call CDialog::OnPaint() for painting messages
}

void CDialRing::OnCancel() 
{
	KillTimer(m_Timer);
	if(!m_pDialDlg->m_cJMPNum.IsEmpty())
	{
    	if(m_pDialDlg->m_bOnJMP==TRUE)
		{
			if(m_pThread){
					TerminateThread(m_pThread->m_hThread,100);
					DWORD exitCode;
					if(GetExitCodeThread(m_pThread->m_hThread, &exitCode)){
						if(exitCode==STILL_ACTIVE){
							TRACE0("Terminated Divert Line Call Thread Failed\n");
							//TerminateThread(m_pThread->m_hThread,100);
						}
					}else{
						TRACE1("GetExitCodeThread() of TAPI thread Error %d",GetLastError());
					}

					if(m_ptapiObj!=NULL)
					{
					EnableWindow(FALSE);
					m_ptapiObj->HangupCall();
					if(m_ptapiObj){
						 delete m_ptapiObj;
						 m_ptapiObj=NULL;
						}
					}
				
				/*
				delete m_pThread;
				m_pThread = NULL;
				*/
				
			}
		}
	}

	if(hRasConn)
	{
		RasHangUp(hRasConn);
		hRasConn=NULL;
		Sleep(500);
	}
	/*	if(RasHangupAll()==FALSE)
	 {  
		OutputDebugString("RasHangupAll() Failed");
	 }
	*/
	m_pDialDlg->m_DialStatus=2;
	CDialog::OnCancel();
}

void CDialRing::OnNcDestroy() 
{
	CDialog::OnNcDestroy();
	
	// delete this;
	
}

BOOL CDialRing::RasDialUp()
{
	int sel;
	RASDIALPARAMS params;
	BOOL p=TRUE;
	DWORD dwRet;
	hRasConn = NULL;
	char  szBuf[256];
	if(m_pDialDlg->m_bOnDial==TRUE)
	{
	 ::RasHangupAll();
	 sel=m_pDialDlg->m_Diallist.GetCurSel();
	 memset(&params, '\0',sizeof(params));
	 params.dwSize=sizeof(RASDIALPARAMS);
	 if (sel >=0) 
	 {
		     m_pDialDlg->m_Diallist.GetLBText(sel, params.szEntryName);
     	     TRACE("%s\n",params.szEntryName);
			 RasGetEntryDialParams(NULL, &params, &p);
	         strcpy(params.szPhoneNumber,m_pDialDlg->m_cTelNum);
             strcpy(params.szUserName,m_pDialDlg->m_cUserName);
			 strcpy(params.szPassword,m_pDialDlg->m_cPassword);
             m_pDialDlg->m_DialStatus=1;
			 dwRet = RasDial( NULL, NULL, &params, 0L, (RASDIALFUNC) RasDialFunc, &hRasConn );
             if ( dwRet != 0 )  
			 {
		      if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
		      wsprintf( (LPSTR)szBuf, "Undefined RAS Dial Error (%ld).", dwRet );
	          RasHangUp( hRasConn );
			  hRasConn = NULL;
		      ::MessageBox( GetSafeHwnd(),(LPSTR)szBuf, "Error", MB_OK | MB_ICONSTOP );
			  OnCancel();
	          return FALSE;
			 }
	
	 }
	 else
	 {
		 OnCancel();
		 return FALSE;
	 }
	}else{
			KillTimer(m_Timer);
			if(!m_pDialDlg->m_cJMPNum.IsEmpty())
			{
    			if(m_pDialDlg->m_bOnJMP==TRUE)
				{
					if(m_pThread){
						DWORD exitCode;
						if(GetExitCodeThread(m_pThread->m_hThread, &exitCode)){
							if(exitCode==STILL_ACTIVE){
								TerminateThread(m_pThread->m_hThread,100);
								Sleep(100);
							}
						}else{
							TRACE1("GetExitCodeThread() of TAPI thread Error %d",GetLastError());
						}
						if(m_ptapiObj!=NULL)
						{
						 m_ptapiObj->HangupCall();
						 delete m_ptapiObj;
						 m_ptapiObj=NULL;
						}

					}
				}
			}
			CDialog::OnOK();
			return TRUE;
	}
    return TRUE;

}

UINT CDialRing::OnDialMessageReceived(WPARAM wParam,LPARAM lParam)
{
	return OnDialEventArrived(wParam,lParam);
}

BOOL CDialRing::DivertLineCall()
{
		  m_bInHangupCall = FALSE;

	      m_pDialDlg->m_DialStatus=0;
		  RasHangupAll();
		  ASSERT(!m_ptapiObj);
		  m_ptapiObj=new CTapiConnection;
	      strcpy(m_ptapiObj->m_szPhoneNumber,m_pDialDlg->m_cJMPNum);
		  SystemStatus.m_dwDialStatus=0;
	      if(!m_ptapiObj->Create(m_ptapiObj->m_szPhoneNumber))
		  {
		    OutputDebugString("Create TAPI Dial call failed.\n");
			//  m_ptapiObj->DisplayCommFail("Create Failed");
            AfxMessageBox(IDS_SIGN_DIVERTLINE_FAIL);
			  goto deal_err;
		  }
          if (!m_ptapiObj->DialCall(m_ptapiObj->m_szPhoneNumber))
		  {
			// m_ptapiObj->DisplayCommFail("Dial call failed.\n");
		    OutputDebugString("Dial call failed.\n");
            AfxMessageBox(IDS_SIGN_DIVERTLINE_FAIL);
			  goto deal_err;
		  }
	      else
		  {
			  m_bInHangupCall = TRUE;
			  EnableWindow(FALSE);
			  m_ptapiObj->HangupCall();
			  delete m_ptapiObj;
			  m_ptapiObj=NULL;
			  EnableWindow(TRUE);
			  return TRUE;
		  }

      
  Sleep(1000);
	deal_err:
			m_bInHangupCall = TRUE;

	        m_ptapiObj->HangupCall();
            delete m_ptapiObj;
			m_ptapiObj=NULL;
			return FALSE;
	return FALSE;
}

UINT	CDialRing::DivertLineCallThread(LPVOID pParam)
{
	TRACE0("\nDivert line call thread start");
	CDialRing* pDlg=(CDialRing*)pParam;
	pDlg->m_pDialDlg->m_IsDialUpSucc=FALSE;
	if(!pDlg->DivertLineCall())
	{	
		pDlg->m_pDialDlg->m_IsDialUpSucc=FALSE;
		pDlg->IsQuit = TRUE;
	}
//	pDlg->m_DialStatus=2;
    SetEvent(pDlg->m_hDialUp);
	TRACE0("\nDivert line call thread end");
	AfxEndThread(100);
    return 1;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -