www.pudn.com > agsm2-1.2_src.zip > ScAdnPage.cpp


// ScAdnPage.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "agsm2.h" 
#include "ScAdnPage.h" 
#include "agsm2Dlg.h" 
#include "PcScCtrl.h" 
#include "Helper.h" 
#include "PBDialog.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CScAdnPage property page 
 
IMPLEMENT_DYNCREATE(CScAdnPage, CScPropertyPage) 
 
CScAdnPage::CScAdnPage() : CScPropertyPage(CScAdnPage::IDD) 
{ 
	//{{AFX_DATA_INIT(CScAdnPage) 
	//}}AFX_DATA_INIT 
} 
 
CScAdnPage::CScAdnPage(UINT  nIDCaption ) : CScPropertyPage(CScAdnPage::IDD,nIDCaption ) 
{ 
	//{{AFX_DATA_INIT(CScAdnPage) 
	//}}AFX_DATA_INIT 
} 
 
 
CScAdnPage::~CScAdnPage() 
{ 
} 
 
void CScAdnPage::DoDataExchange(CDataExchange* pDX) 
{ 
	CScPropertyPage::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CScAdnPage) 
	DDX_Control(pDX, IDC_LIST_ADN, m_AdnListCtrl); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CScAdnPage, CScPropertyPage) 
	//{{AFX_MSG_MAP(CScAdnPage) 
	ON_WM_CONTEXTMENU() 
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_ADN, OnDblclkListAdn) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CScAdnPage message handlers 
 
BOOL CScAdnPage::OnInitDialog()  
{ 
	CScPropertyPage::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	m_AdnListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT| 
									LVS_EX_GRIDLINES| 
									LVS_EX_HEADERDRAGDROP); 
	CString pos((LPCSTR)IDS_STRING_POS); 
	CString name((LPCSTR)IDS_STRING_NAME); 
	CString phone((LPCSTR)IDS_STRING_PHONE); 
	m_AdnListCtrl.InsertColumn(0,pos,LVCFMT_LEFT,40); 
	m_AdnListCtrl.InsertColumn(1,name,LVCFMT_LEFT,100); 
	m_AdnListCtrl.InsertColumn(2,phone,LVCFMT_LEFT,200); 
	char buf[8]; 
	for(int i=1; i<256; i++) 
	{ 
		sprintf(buf,"%d",i); 
		m_AdnListCtrl.AddItem(i-1,0,buf); 
	} 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
BOOL CScAdnPage::OnApply()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	SC_OPERATION curOp = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_CurOperation; 
	TRACE(_T("CScAdnPage::OnApply %d\n"),curOp); 
	switch(curOp) 
	{ 
		case SC_READ: 
			ReadRecord(); 
			break; 
		case SC_WRITE: 
			WriteRecord(); 
			break; 
		case SC_MOVEUP: 
			m_AdnListCtrl.MoveUp(); 
			break; 
		case SC_MOVEDOWN: 
			m_AdnListCtrl.MoveDown(); 
			break; 
		case SC_IMPORT: 
			break; 
		case SC_EXPORT: 
			break; 
		case SC_PRINT: 
			break; 
		default: 
			break; 
	} 
	return CScPropertyPage::OnApply(); 
} 
 
void CScAdnPage::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_AdnListCtrl.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_AdnListCtrl.GetSelectedCount(); 
			int nItem = -1; 
			ReadProgress.SetRange(0,(SHORT)nSelected); 
			ReadProgress.ShowWindow(SW_SHOW); 
			for (i=1; i<=nSelected; i++) 
			{ 
				nItem = m_AdnListCtrl.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 CScAdnPage::WriteRecord(int n) 
{ 
	TRACE("Write Record\n"); 
	int iRet; 
	if(n == -1) 
		iRet = AfxMessageBox(IDS_STRING128,MB_YESNO);    
	else 
		iRet = AfxMessageBox(IDS_STRING129,MB_YESNO);  
	if(iRet == IDNO) 
		return; 
 
	CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader; 
	try{ 
		BeginWaitCursor(); 
		SelectCurFile(); 
		CProgressCtrl &ReadProgress = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_RWProgress; 
		int itemCount = m_AdnListCtrl.GetItemCount(); 
		int from = 0, to = 0, i; 
 
		if(n == -1)//write all records 
		{ 
			ReadProgress.SetRange(0,(SHORT)m_NumOfRecs); 
			ReadProgress.ShowWindow(SW_SHOW); 
			from = 1; to = m_NumOfRecs; 
			for(i=from; i <= to && i<=itemCount; i++) 
			{ 
				WriteRecordN(i,FALSE); 
				ReadProgress.SetPos(i); 
			} 
			//Beep(1000,50); 
			//((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_globalStatusStr = _T("³É¹¦Ð´Èë"); 
			ReadProgress.ShowWindow(SW_HIDE); 
			//((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->UpdateData(FALSE); 
		}else if( n == -2){//selected  
			int nSelected = m_AdnListCtrl.GetSelectedCount(); 
			int nItem = -1; 
			ReadProgress.SetRange(0,(SHORT)nSelected); 
			ReadProgress.ShowWindow(SW_SHOW); 
			for (i=1; i<=nSelected; i++) 
			{ 
				nItem = m_AdnListCtrl.GetNextItem(nItem, LVNI_SELECTED); 
				ASSERT(nItem != -1); 
				WriteRecordN(nItem+1,FALSE); 
				ReadProgress.SetPos(i); 
			} 
			ReadProgress.ShowWindow(SW_HIDE); 
		}else{//individual 
			WriteRecordN(n,FALSE); 
		} 
		EndWaitCursor(); 
	}catch(LONG e) 
	{ 
		if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000) 
			AfxMessageBox(ScReader.FormatErrMsg(e)); 
		else 
			Helper::ShowLastError(e); 
	} 
} 
 
void CScAdnPage::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_AdnListCtrl.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_AdnListCtrl.GetFirstSelectedItemPosition(); 
		TRACE("HotItem %d\n",pos); 
		if(pos) 
		{ 
			if( m_AdnListCtrl.GetItemText((int)pos-1,1).IsEmpty() || 
				m_AdnListCtrl.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()); 
 
} 
 
 
void CScAdnPage::OnDblclkListAdn(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	TRACE("OnDblclkListAdn\n"); 
	EditRecord(); 
	*pResult = 0; 
} 
 
void CScAdnPage::Paste() 
{ 
	if ( !OpenClipboard() ) 
	{ 
		AfxMessageBox( "Cannot open the Clipboard" ); 
		return; 
	} 
	/* get text from the clipboard */ 
	HANDLE hClipData; 
	LPVOID lpClipData; 
	if (!(hClipData = GetClipboardData(CF_TEXT))) { 
		AfxMessageBox( "Cannot get Clipboard data" ); 
		CloseClipboard(); 
		return; 
	} 
	if (!(lpClipData = GlobalLock(hClipData))) { 
		AfxMessageBox( "Out of Memory" ); 
		CloseClipboard(); 
		return; 
	} 
	int len = strlen((char *)lpClipData)+1; 
	char *buf = (char *)malloc(len); 
	char *buf_base = buf; 
	memcpy(buf,lpClipData,len); 
	int ret; 
	char buf1[16],buf2[16],buf3[64]; 
	UINT nSelectedCount = m_AdnListCtrl.GetSelectedCount(); 
	POSITION pos = m_AdnListCtrl.GetFirstSelectedItemPosition(); 
	UINT nPasted = 0; 
	while(*buf) 
	{ 
		ret = sscanf(buf,"%3[0-9],%14[^,],%40[0-9*#]",buf1,buf2,buf3); 
		if(ret != 3) 
			ret = sscanf(buf,"%3[0-9],%14[^,],%40[+0-9*#]",buf1,buf2,buf3); 
		if(ret == 3) 
		{ 
			if(nSelectedCount == 0) 
			{ 
				int i = m_AdnListCtrl.GetItemCount(); 
				sprintf(buf1,"%d",i); 
				m_AdnListCtrl.AddItem(i,0,buf1); 
				m_AdnListCtrl.AddItem(i,1,buf2); 
				m_AdnListCtrl.AddItem(i,2,buf3); 
				 
			}else{ 
				if(nPasted < nSelectedCount) 
				{ 
//					AddItem((int)(pos+nPasted-1),0,buf1); 
					m_AdnListCtrl.AddItem((int)(pos+nPasted-1),1,buf2); 
					m_AdnListCtrl.AddItem((int)(pos+nPasted-1),2,buf3); 
					nPasted++; 
				}else 
					break; 
			} 
			buf = strstr(buf,"\r\n"); 
			if(buf) 
				buf += 2; 
			else 
				break; 
		}else 
			break; 
	} 
	free(buf_base); 
	GlobalUnlock(hClipData); 
	CloseClipboard(); 
 
} 
 
BOOL CScAdnPage::CanPaste() 
{ 
	if ( !OpenClipboard() ) 
	{ 
		AfxMessageBox( "Cannot open the Clipboard" ); 
		return FALSE; 
	} 
	/* get text from the clipboard */ 
	HANDLE hClipData; 
	LPVOID lpClipData; 
	if (!(hClipData = GetClipboardData(CF_TEXT))) { 
		//AfxMessageBox( "Cannot get Clipboard data" ); 
		CloseClipboard(); 
		return FALSE; 
	} 
	if (!(lpClipData = GlobalLock(hClipData))) { 
		AfxMessageBox( "Out of Memory" ); 
		CloseClipboard(); 
		return FALSE; 
	} 
	int len = strlen((char *)lpClipData)+1; 
	char *buf = (char *)malloc(len); 
	memcpy(buf,lpClipData,len); 
	char buf1[16],buf2[16],buf3[64]; 
	int ret = sscanf(buf,"%3[0-9],%14[^,],%40[0-9*#]",buf1,buf2,buf3); 
	if(ret != 3) 
		ret = sscanf(buf,"%3[0-9],%14[^,],+%40[0-9*#]",buf1,buf2,buf3); 
	free(buf); 
	GlobalUnlock(hClipData); 
	CloseClipboard(); 
	return ret == 3; 
} 
 
void CScAdnPage::EditRecord() 
{ 
	POSITION pos = m_AdnListCtrl.GetFirstSelectedItemPosition(); 
	TRACE("HotItem %d\n",pos); 
	if(pos) 
	{ 
		CPBDialog dlg; 
		dlg.m_editName = m_AdnListCtrl.GetItemText((int)pos-1,1); 
		dlg.m_editPhone = m_AdnListCtrl.GetItemText((int)pos-1,2); 
		dlg.DoModal(); 
		TRACE("name=%s\n",dlg.m_editName); 
		TRACE("phone=%s\n",dlg.m_editPhone); 
		m_AdnListCtrl.AddItem((int)pos-1,1,dlg.m_editName); 
		m_AdnListCtrl.AddItem((int)pos-1,2,dlg.m_editPhone); 
	} 
 
} 
 
BOOL CScAdnPage::PreTranslateMessage(MSG* pMsg)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	HACCEL hAccelTable = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_hAccelTable; 
	TranslateAccelerator(GetSafeHwnd(), hAccelTable, pMsg); 
	return CScPropertyPage::PreTranslateMessage(pMsg); 
} 
 
CScListCtrl* CScAdnPage::GetListCtrl() 
{ 
	return &m_AdnListCtrl; 
} 
 
void CScAdnPage::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); 
		//http://support.microsoft.com/kb/q141487/ 
		//CString title((LPCSTR)IDS_STRING_LND); 
		 
		//if(m_psp.pszTitle && title == m_psp.pszTitle )//LND 
		//	ScReader.Select(0x6f44,resApdu); 
		//else 
		//	ScReader.Select(0x6f3a,resApdu); 
		ScReader.Select(m_FileId,resApdu); 
 
		m_FileSize = (m_pResData[2]<<8)|m_pResData[3]; 
		m_Sof = (StructOfFile)m_pResData[13]; 
		m_RecordLen = m_pResData[14]; 
		m_NumOfRecs = m_FileSize/m_RecordLen; 
	}catch (LONG) 
	{ 
		throw; 
	} 
} 
 
void CScAdnPage::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); 
		CString cstrName = Helper::Gsm11EncStrToCStr(pRecData,(int)(m_RecordLen-14)); 
		CString phonenum = Helper::PhoneNumToAscii(&pRecData[m_RecordLen-15+2], 
							pRecData[m_RecordLen-15+1]); 
		CString cstrNum; 
		cstrNum.Format("%d",n); 
		if(newRecord) 
			m_AdnListCtrl.AddItem(nItem,0,cstrNum); 
		m_AdnListCtrl.AddItem(nItem,1,cstrName); 
		m_AdnListCtrl.AddItem(nItem,2,phonenum); 
		void *ItemData = (void *)((SCLIST_ITEMDATA *)m_AdnListCtrl.GetItemData(nItem))->ItemData; 
		if(ItemData) 
			free(ItemData); 
		((SCLIST_ITEMDATA *)m_AdnListCtrl.GetItemData(nItem))->ItemData = (DWORD)pRecData; 
		((SCLIST_ITEMDATA *)m_AdnListCtrl.GetItemData(nItem))->dirty = FALSE; 
		m_AdnListCtrl.Update(nItem); 
	}catch(LONG){ 
		throw; 
	} 
} 
 
void CScAdnPage::WriteRecordN(int n,BOOL newRecord) 
{ 
	try{ 
		int nItem = n-1; 
		CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader; 
		LPBYTE pRecData = (LPBYTE)malloc(m_RecordLen); 
 
		CString strName = m_AdnListCtrl.GetItemText(nItem,1); 
		CString strPhoneNum = m_AdnListCtrl.GetItemText(nItem,2); 
		TRACE("=============Write to card %d================\n",n); 
		TRACE("name=%s\n",strName); 
		TRACE("phone=%s\n",strPhoneNum); 
		Helper::CStrToGsm11EncStr(strName,pRecData,m_RecordLen-14); 
		Helper::CStrToCalledPartyBcd(strPhoneNum,pRecData+m_RecordLen-14,14); 
		if(m_Sof == EF_CYCLIC) 
			ScReader.UpdateRecord(0,RRM_PreviousRecord,pRecData,(UCHAR)m_RecordLen); 
		else 
			ScReader.UpdateRecord(n,RRM_Absolute,pRecData,(UCHAR)m_RecordLen); 
		((SCLIST_ITEMDATA *)m_AdnListCtrl.GetItemData(nItem))->dirty = FALSE; 
		free(pRecData); 
	}catch(LONG) 
	{ 
		throw; 
	} 
} 
 
void CScAdnPage::SetFileId(USHORT id) 
{ 
	m_FileId = id; 
 
}