📄 scsmspage.cpp
字号:
// ScSmsPage.cpp : implementation file
//
#include "stdafx.h"
#include "agsm2.h"
#include "ScSmsPage.h"
#include "agsm2Dlg.h"
#include "Helper.h"
#include "SMSDialog.h"
#include "ref/csv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScSmsPage property page
IMPLEMENT_DYNCREATE(CScSmsPage, CScPropertyPage)
CScSmsPage::CScSmsPage() : CScPropertyPage(CScSmsPage::IDD)
{
//{{AFX_DATA_INIT(CScSmsPage)
//}}AFX_DATA_INIT
}
CScSmsPage::~CScSmsPage()
{
}
void CScSmsPage::DoDataExchange(CDataExchange* pDX)
{
CScPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScSmsPage)
DDX_Control(pDX, IDC_LIST_SMS, m_SmsListCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScSmsPage, CScPropertyPage)
//{{AFX_MSG_MAP(CScSmsPage)
ON_WM_CONTEXTMENU()
ON_NOTIFY(NM_DBLCLK, IDC_LIST_SMS, OnDblclkListSms)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScSmsPage message handlers
BOOL CScSmsPage::OnApply()
{
// TODO: Add your specialized code here and/or call the base class
SC_OPERATION curOp = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_CurOperation;
TRACE(_T("CScSmsPage::OnApply %d\n"),curOp);
switch(curOp)
{
case SC_READ:
break;
case SC_WRITE:
break;
case SC_IMPORT:
break;
case SC_EXPORT:
break;
case SC_PRINT:
break;
default:
break;
}
return CScPropertyPage::OnApply();
}
BOOL CScSmsPage::OnInitDialog()
{
CScPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
m_SmsListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|
LVS_EX_GRIDLINES|
LVS_EX_HEADERDRAGDROP);
CString pos((LPCSTR)IDS_STRING_POS);
CString from((LPCSTR)IDS_STRING_FROM);
CString content((LPCSTR)IDS_STRING_CONTENT);
CString date((LPCSTR)IDS_STRING_DATE);
CString state((LPCSTR)IDS_STRING_STATE);
m_SmsListCtrl.InsertColumn(0,pos,LVCFMT_LEFT,40);
m_SmsListCtrl.InsertColumn(1,from,LVCFMT_LEFT,80);
m_SmsListCtrl.InsertColumn(2,content,LVCFMT_LEFT,200);
m_SmsListCtrl.InsertColumn(3,date,LVCFMT_LEFT,100);
m_SmsListCtrl.InsertColumn(4,state,LVCFMT_LEFT,80);
char buf[8];
for(int i=1; i<20; i++)
{
sprintf(buf,"%d",i);
m_SmsListCtrl.AddItem(i-1,0,buf);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CScSmsPage::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
TRACE("OnContextMenu\n");
CMenu menu;
VERIFY(menu.LoadMenu(IDR_POPUP_MENU));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
if(m_SmsListCtrl.GetSelectedCount() == 0)
{
pPopup->EnableMenuItem(ID_MENUITEM_EDIT,MF_GRAYED);
pPopup->EnableMenuItem(ID_MENUITEM_CUT,MF_GRAYED);
pPopup->EnableMenuItem(ID_MENUITEM_COPY,MF_GRAYED);
pPopup->EnableMenuItem(ID_MENUITEM_DELETE,MF_GRAYED);
}else{
POSITION pos = m_SmsListCtrl.GetFirstSelectedItemPosition();
TRACE("HotItem %d\n",pos);
if(pos)
{
if( m_SmsListCtrl.GetItemText((int)pos-1,1).IsEmpty() ||
m_SmsListCtrl.GetItemText((int)pos-1,2).IsEmpty() )
{
pPopup->EnableMenuItem(ID_MENUITEM_CUT,MF_GRAYED);
pPopup->EnableMenuItem(ID_MENUITEM_COPY,MF_GRAYED);
pPopup->EnableMenuItem(ID_MENUITEM_DELETE,MF_GRAYED);
}
}
}
if(CanPaste() == FALSE)
{
pPopup->EnableMenuItem(ID_MENUITEM_PASTE,MF_GRAYED);
}
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, AfxGetMainWnd());
}
CScListCtrl* CScSmsPage::GetListCtrl()
{
return &m_SmsListCtrl;
}
void CScSmsPage::ReadRecord(int n)
{
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
int from = 0, to = 0, i;
try{
BeginWaitCursor();
SelectCurFile();
CProgressCtrl &ReadProgress = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_RWProgress;
if(n == -1)//read all records
{
ReadProgress.SetRange(0,(SHORT)m_NumOfRecs);
ReadProgress.ShowWindow(SW_SHOW);
m_SmsListCtrl.DeleteAllItems();
from =1; to = m_NumOfRecs;
for(i =from; i<= to; i++)
{
ReadRecordN(i,TRUE);
ReadProgress.SetPos(i);
}
//Beep(1000,50);
ReadProgress.ShowWindow(SW_HIDE);
}else if(n == -2){
int nSelected = m_SmsListCtrl.GetSelectedCount();
int nItem = -1;
ReadProgress.SetRange(0,(SHORT)nSelected);
ReadProgress.ShowWindow(SW_SHOW);
for (i=1; i<=nSelected; i++)
{
nItem = m_SmsListCtrl.GetNextItem(nItem, LVNI_SELECTED);
ASSERT(nItem != -1);
ReadRecordN(nItem+1,FALSE);
ReadProgress.SetPos(i);
}
ReadProgress.ShowWindow(SW_HIDE);
}else{
ReadRecordN(n,FALSE);
}
EndWaitCursor();
}
catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
void CScSmsPage::SelectCurFile()
{
RESAPDU resApdu;
resApdu.data = m_pResData;
resApdu.len = sizeof(m_pResData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = FALSE;
ScReader.Select(0x3f00,resApdu);
resApdu.len = sizeof(m_pResData);
ScReader.Select(0x7f10,resApdu);
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(m_pResData);
ScReader.Select(0x6f3c,resApdu);
m_FileSize = (m_pResData[2]<<8)|m_pResData[3];
m_RecordLen = m_pResData[14];
m_NumOfRecs = m_FileSize/m_RecordLen;
}catch (LONG)
{
throw;
}
}
void CScSmsPage::ReadRecordN(int n, BOOL newRecord)
{
try{
int nItem = n - 1;
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
LPBYTE pRecData = (LPBYTE)malloc(m_RecordLen+2);
RESAPDU resApdu;
resApdu.data = pRecData;
resApdu.len = m_RecordLen+2;
ScReader.ReadRecord((UCHAR)n,RRM_Absolute,resApdu);
//todo
// int len = m_RecordLen+2;
// LPSTR pStr = Helper::BinToHex(pRecData,len);
CString cstrNum;
cstrNum.Format("%d",n);
if(newRecord)
m_SmsListCtrl.AddItem(nItem,0,cstrNum);
// free(pStr);
m_SmsListCtrl.AddItem(nItem,4,Helper::UCharToSmsStatus(pRecData[0]));
//SMS and the PDU format http://www.dreamfabric.com/sms/
int smsc_len = pRecData[1];
if(smsc_len < 12)//have meaning data.
{
UCHAR mr = 0;
UCHAR vp = 7;//
UCHAR pdu = *(pRecData + 2 + smsc_len);
if((pdu & 0x03) == 1)//SMS-SUBMIT (MS ==> SMSC)
{
mr = 1;
if((pdu & 0x18) == 0)
vp = 0;
else if((pdu & 0x18) == 0x10)
vp = 1;
}
LPBYTE oa_a = pRecData+2+smsc_len + mr + 2;
int oa_len;
CString oa_phonenum;
if(*oa_a == 0xd0)//for Alphanumeric address type
{
oa_len = pRecData[2+smsc_len+mr+1] / 2;
oa_phonenum = Helper::Gsm11Enc7bitToCStr(oa_a+1,oa_len);
oa_len += 1;
}else{
oa_len = (pRecData[2+smsc_len+mr+1]+1)/2 + 1;
oa_phonenum = Helper::PhoneNumToAscii(
oa_a,
oa_len);
}
m_SmsListCtrl.AddItem(nItem,1,oa_phonenum);
LPBYTE udl_a = oa_a + oa_len + 2 + vp;
int udl = *udl_a;
UCHAR encoding = *(oa_a+oa_len+1);
CString cstr;
if((encoding&0xe8) == 0x08){//UCS2
cstr = Helper::Gsm11UCS2ToCStr(udl_a+1, udl);
}else if((encoding&0xec) == 0x00 || (encoding&0xf4) == 0xf0){//7bit default alphabet
cstr = Helper::Gsm11Enc7bitToCStr(udl_a+1,udl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -