📄 ussdsampledlg.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 + -