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

📄 ussdsampledlg.cpp

📁 Sending USSD message using TAPI Windows Mobile
💻 CPP
字号:
// USSDSampleDlg.cpp : implementation file
//

#include "stdafx.h"
#include "USSDSample.h"
#include "USSDSampleDlg.h"
#include "USSDRecordDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

void FAR PASCAL CUSSDSampleDlg::lineCallback(DWORD hDevice,DWORD dwMsg,DWORD dwCallbackInstance,
											 DWORD dwParam1,DWORD dwParam2,DWORD dwParam3)
{
	switch(dwMsg)
	{
		case LINE_DEVSPECIFIC:
		{
			if(dwParam1 == LINE_USSD)
			{
				DWORD	dwMessageId	= dwParam2;
			}

			break;
		}
		case LINE_REPLY:
		{
			CString		strError;

			switch(dwParam2)
			{
				case 0:								strError	= TEXT("");								break;
				case LINEERR_INVALLINEHANDLE:		strError	= TEXT("LINEERR_INVALLINEHANDLE");		break;
				case LINEERR_NOMEM:					strError	= TEXT("LINEERR_NOMEM");				break;
				case LINEERR_OPERATIONUNAVAIL:		strError	= TEXT("LINEERR_OPERATIONUNAVAIL");		break;
				case LINEERR_OPERATIONFAILED:		strError	= TEXT("LINEERR_OPERATIONFAILED");		break;
				case LINEERR_RESOURCEUNAVAIL:		strError	= TEXT("LINEERR_RESOURCEUNAVAIL");		break;
				case LINEERR_INVALPOINTER:			strError	= TEXT("LINEERR_INVALPOINTER");			break;
				case LINEERR_INVALPARAM:			strError	= TEXT("LINEERR_INVALPARAM");			break;
				case LINEERR_UNINITIALIZED:			strError	= TEXT("LINEERR_UNINITIALIZED");		break;
				default:							strError.Format(TEXT("Error: %x"),dwParam2);		break;
			}

			if(strError.GetLength() > 0)
				AfxMessageBox(strError);

			break;
		}
	}
}

// CUSSDSampleDlg dialog

CUSSDSampleDlg::CUSSDSampleDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CUSSDSampleDlg::IDD, pParent)
{
	m_hIcon				= AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_hLineApp			= NULL;
	m_dwDevices			= 0;
	m_dwCellularId		= 0;
	m_dwLowAPIVersion	= 0;
	m_hCellularLine		= NULL;
	m_dwAPIVersion		= TAPI_CURRENT_VERSION;
	m_dwExtVersion		= 0;
	m_dwMessageId		= 0;
}

void CUSSDSampleDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_USSD, m_wndUssd);
}

BEGIN_MESSAGE_MAP(CUSSDSampleDlg, CDialog)
	ON_WM_SIZE()

	//}}AFX_MSG_MAP
	ON_WM_DESTROY()
	ON_COMMAND(ID_ABOUT, &CUSSDSampleDlg::OnMenuAbout)
	ON_COMMAND(ID_MENU_ADD, &CUSSDSampleDlg::OnMenuAdd)
	ON_COMMAND(ID_MENU_DELETE, &CUSSDSampleDlg::OnMenuDelete)
	ON_COMMAND(ID_MENU_EDIT, &CUSSDSampleDlg::OnMenuEdit)
	ON_NOTIFY(NM_DBLCLK, IDC_USSD, &CUSSDSampleDlg::OnNMDblclkUssd)
	ON_COMMAND(ID_MENU_SEND, &CUSSDSampleDlg::OnMenuSend)
END_MESSAGE_MAP()


// CUSSDSampleDlg message handlers

BOOL CUSSDSampleDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	SHMENUBARINFO info; 
	
	info.cbSize			= sizeof(info); 
	info.hwndParent		= m_hWnd; 
	info.dwFlags		= SHCMBF_HMENU | SHCMBF_HIDESIPBUTTON; 
	info.nToolBarId		= IDR_MENU; 
	info.hInstRes		= ::AfxGetInstanceHandle(); 
	info.nBmpId			= 0; 
	info.cBmpImages		= 0; 
	
	SHCreateMenuBar(&info);

	m_wndUssd.ModifyStyle(0,LVS_REPORT);
	m_wndUssd.SetExtendedStyle(LVS_EX_FULLROWSELECT);

	m_wndUssd.InsertColumn(0,TEXT("USSD Commands"));

	if(0 == InitializeTAPI())
	{
		m_dwCellularId	= GetCellularLineId();
	}

	if(0xFFFFFFFF != m_dwCellularId)
	{
		m_hCellularLine	= OpenTAPILine(m_dwCellularId);

		if(!m_db.Open())
		{
			AfxMessageBox(TEXT("Cannot open USSD database"));
		}
		else
		{
			PopulateUssdData(&m_wndUssd);
		}
	}
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CUSSDSampleDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType,cx,cy);

	if(m_wndUssd.GetSafeHwnd())
	{
		m_wndUssd.SetWindowPos(NULL,DRA::SCALEX(X_OFFSET),DRA::SCALEY(Y_OFFSET),
			DRA::SCALEX(cx - X_OFFSET * 2),DRA::SCALEY(cy - Y_OFFSET * 2),SWP_NOZORDER);

		CRect	rc;

		m_wndUssd.GetClientRect(&rc);
		m_wndUssd.SetColumnWidth(0,rc.Width());
	}
}

void CUSSDSampleDlg::OnMenuSend()
{
	POSITION	pos		= m_wndUssd.GetFirstSelectedItemPosition();

	if(!pos)
		return;

	int			nItem	= m_wndUssd.GetNextSelectedItem(pos);
	CEOID		oid		= m_wndUssd.GetItemData(nItem);
	CUssdRecord	rec;

	m_db.MoveTo(oid);
	m_db.Read(oid,rec);
	
	SendUSSDCommand((TCHAR*)rec.GetData(),m_hCellularLine);
}

void CUSSDSampleDlg::SendUSSDCommand(TCHAR* lpszCommand,HLINE hCellularLine)
{
	LONG		lError	= lineSendUSSD(hCellularLine,(const BYTE* const)(LPCTSTR)lpszCommand,lstrlen(lpszCommand),0);
	CString		strMessage;

	if(lError < 0)		strMessage.Format(TEXT("Error sending USSD command '%s': %x"),lpszCommand,lError);
	else				strMessage.Format(TEXT("USSD command '%s' successfully sent"),lpszCommand);

	AfxMessageBox(strMessage);
}

long CUSSDSampleDlg::InitializeTAPI()
{
	LINEINITIALIZEEXPARAMS	sLineParam;

	memset(&sLineParam,0,sizeof(LINEINITIALIZEEXPARAMS));

	sLineParam.dwTotalSize	= sizeof(LINEINITIALIZEEXPARAMS);
	sLineParam.dwOptions	= LINEINITIALIZEEXOPTION_USEHIDDENWINDOW; 

	m_dwLowAPIVersion		= TAPI_CURRENT_VERSION;

	long	lReturn	= lineInitializeEx(&m_hLineApp,
									   theApp.m_hInstance,
									   lineCallback,
									   TAPI_FRIENDLY_NAME,
									   &m_dwDevices,
									   &m_dwLowAPIVersion,
									   &sLineParam);

	return lReturn;
}

void CUSSDSampleDlg::ShutdownTAPI()
{
	if(m_hCellularLine)
	{
		lineClose(m_hCellularLine);
	}

	if(m_hLineApp)
	{
		lineShutdown(m_hLineApp);
	}

	m_hLineApp		= NULL;
	m_hCellularLine	= NULL;
}
void CUSSDSampleDlg::OnDestroy()
{
	ShutdownTAPI();

	CDialog::OnDestroy();
}

DWORD CUSSDSampleDlg::GetCellularLineId()
{
	DWORD				dwReturn		= 0xFFFFFFFF;
	long				lResult			= 0;
	LINEEXTENSIONID		sLineExt		= {0};
	LPLINEDEVCAPS		lpLineDevCaps	= NULL;	
	BOOL				bContinue		= TRUE;

	for(DWORD dwLine=0; dwLine<m_dwDevices && bContinue; ++dwLine)
	{
		lResult		= lineNegotiateAPIVersion(m_hLineApp,dwLine,m_dwLowAPIVersion,TAPI_CURRENT_VERSION,&m_dwAPIVersion,&sLineExt);

		if(0 == lResult)
		{
			lpLineDevCaps	= (LPLINEDEVCAPS)LocalAlloc(LPTR,sizeof(LINEDEVCAPS));
			lResult			= LINEERR_STRUCTURETOOSMALL;

			lpLineDevCaps->dwTotalSize	= sizeof(LINEDEVCAPS);
			lpLineDevCaps->dwNeededSize	= sizeof(LINEDEVCAPS);

			while(LINEERR_STRUCTURETOOSMALL == lResult)
			{
				lResult	= lineGetDevCaps(m_hLineApp,dwLine,TAPI_CURRENT_VERSION,0,lpLineDevCaps);

				if(LINEERR_STRUCTURETOOSMALL == lResult || lpLineDevCaps->dwTotalSize < lpLineDevCaps->dwNeededSize)
				{
					lpLineDevCaps	= (LPLINEDEVCAPS)LocalReAlloc(lpLineDevCaps,lpLineDevCaps->dwNeededSize,LMEM_MOVEABLE);
					lResult			= LINEERR_STRUCTURETOOSMALL;

					lpLineDevCaps->dwTotalSize	= lpLineDevCaps->dwNeededSize;
				}
			}

			if(0 == lResult)
			{
				TCHAR szName[512];

				memcpy((PVOID)szName,(PVOID)((BYTE*)lpLineDevCaps + lpLineDevCaps ->dwLineNameOffset), 
					    lpLineDevCaps->dwLineNameSize);

				szName[lpLineDevCaps->dwLineNameSize]	= 0;

				if(_tcscmp(szName,CELLTSP_LINENAME_STRING) == 0)
				{
					dwReturn	= dwLine;
					bContinue	= FALSE;
				}
			}

			LocalFree((HLOCAL)lpLineDevCaps);
		}
	}

	return dwReturn;
}

HLINE CUSSDSampleDlg::OpenTAPILine(DWORD dwLineId)
{
	DWORD	dwMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE;
	HLINE	hLine		= NULL;
	long	lReturn		= lineOpen(m_hLineApp,m_dwCellularId,&hLine,
								   TAPI_CURRENT_VERSION,0,(DWORD)this,
								   LINECALLPRIVILEGE_OWNER,dwMediaMode,0);

	lReturn				= ::lineNegotiateExtVersion(m_hLineApp,m_dwCellularId,m_dwAPIVersion,EXT_API_LOW_VERSION,EXT_API_HIGH_VERSION,&m_dwExtVersion);

	return hLine;
}

void CUSSDSampleDlg::GetUSSDData()
{
	LPBYTE	pData	= new BYTE[100];
	DWORD	dwFlags	= 0;
	
	LONG	lError	= lineGetUSSD(m_hCellularLine,m_dwMessageId,pData,100,&dwFlags);

	if(0 != lError)
	{
		CString		strError;

		strError.Format(TEXT("Error: %x"),lError);

		AfxMessageBox(strError);
	}

	delete[] pData;
}

void CUSSDSampleDlg::SetUSSDMessageId(DWORD dwMessage)
{
	m_dwMessageId	= dwMessage;
}

void  CUSSDSampleDlg::PopulateUssdData(CListCtrl* pList)
{
	pList->DeleteAllItems();

	m_db.MoveFirst();

	CUssdRecord	rec;
	CString		strName;
	CString		strData;
	CString		strText;
	int			nItem	= 0;
	CEOID		oid		= 0;

	while((oid = m_db.Read(rec)))
	{
		strName	= rec.GetName();
		strData	= rec.GetData();

		strText.Format(TEXT("%s (%s)"),strName,strData);

		nItem	= pList->InsertItem(nItem,strText);

		pList->SetItemData(nItem,oid);
	}
}

void CUSSDSampleDlg::OnMenuAbout()
{
	AfxMessageBox(TEXT("USSD Sample\r\nKrishnaraj Varma\r\nhttp://www.krvarma.com\r\nvarma@krvarma.com"));
}

void CUSSDSampleDlg::OnMenuAdd()
{
	CUSSDRecordDlg		dlgAdd;

	if(IDOK == dlgAdd.DoModal())
	{
		CUssdRecord	rec;

		rec.Initialize(dlgAdd.m_strName,dlgAdd.m_strCommand);

		m_db.Write(rec);

		PopulateUssdData(&m_wndUssd);
	}
}

void CUSSDSampleDlg::OnMenuDelete()
{
	POSITION	pos		= m_wndUssd.GetFirstSelectedItemPosition();

	if(!pos)
		return;

	int			nItem	= m_wndUssd.GetNextSelectedItem(pos);
	CEOID		oid		= m_wndUssd.GetItemData(nItem);
	CUssdRecord	rec;

	m_db.MoveTo(oid);
	m_db.Read(oid,rec);

	CString				strMessage;

	strMessage.Format(TEXT("Are you sure to delete (%s - %s)"),rec.GetName(),rec.GetData());

	if(AfxMessageBox(strMessage,MB_YESNO | MB_ICONQUESTION) == IDYES)
	{
		m_db.Delete(oid);

		PopulateUssdData(&m_wndUssd);
	}
}

void CUSSDSampleDlg::OnMenuEdit()
{
	POSITION	pos		= m_wndUssd.GetFirstSelectedItemPosition();

	if(!pos)
		return;

	int			nItem	= m_wndUssd.GetNextSelectedItem(pos);
	CEOID		oid		= m_wndUssd.GetItemData(nItem);

	CUSSDRecordDlg		dlgEdit;
	CUssdRecord			rec;

	m_db.MoveTo(oid);
	m_db.Read(oid,rec);

	CString		strName(rec.GetName());
	CString		strCommand(rec.GetData());

	dlgEdit.SetEditMode(TRUE);
	dlgEdit.m_strName		= strName;
	dlgEdit.m_strCommand	= strCommand;

	if(IDOK == dlgEdit.DoModal())
	{
		rec.Initialize(dlgEdit.m_strName,dlgEdit.m_strCommand);

		m_db.Write(oid,rec);

		PopulateUssdData(&m_wndUssd);
	}
}

void CUSSDSampleDlg::OnNMDblclkUssd(NMHDR *pNMHDR, LRESULT *pResult)
{
	*pResult = 0;

	POSITION	pos		= m_wndUssd.GetFirstSelectedItemPosition();

	if(!pos)	OnMenuAdd();
	else		OnMenuSend();
}

⌨️ 快捷键说明

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