www.pudn.com > fpdumpw.zip > FPDUMPWDlg.cpp


// FPDUMPWDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "FPDUMPW.h" 
#include "FPDUMPWDlg.h" 
#include "aspiw32.h" 
#include "DialogSettings.h" 
#include  
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
CString strFileName; 
BYTE	HostAdapterID = 0; 
BYTE	TargetID = 3; 
BYTE	LUN = 0; 
// 后台线程 
UINT DumpWatcher( LPVOID pParam ) 
{ 
	IsWatcherRunning = TRUE; 
	bCancelWatcher = FALSE; 
	CWnd *pDialog; 
	CButton *pbtnSetting; 
	CButton *pbtnClose; 
	pDialog = AfxGetMainWnd(); 
	pbtnSetting = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_SETTINGS)); 
	pbtnSetting->EnableWindow(FALSE); 
	pbtnClose = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_CLOSE)); 
	pbtnClose->EnableWindow(FALSE); 
 
	//	::MessageBox(NULL,strFileName,"MESSAGE",MB_OK); 
	// 1. Wait until tape is ready... 
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"等待磁带机就绪..."); 
	for (;;) 
	{ 
		if (bCancelWatcher) goto ExitLoop; 
		if (IO_ALL_TEST_UNIT_READY(HostAdapterID,TargetID,LUN)==SS_COMP) break; 
	} 
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"磁带机已经就绪"); 
 
	// 2. Load the tape 
	if (bCancelWatcher) goto ExitLoop; 
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"正在装载磁带..."); 
	if (IO_TAPE_LOAD(HostAdapterID,TargetID,LUN,0,1,1)!=SS_COMP) 
	{ 
		pDialog->SetDlgItemText(IDC_DUMPSTATUS,"装载磁带出错"); 
		goto ExitLoop; 
	} 
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"装载磁带完成"); 
 
	// 3. read files 
	if (bCancelWatcher) goto ExitLoop; 
	{ 
		CString strFileNameEx; 
		char szTag[12]; 
		int nStatus = 1; // 1 头,2 身体,3 尾 
		int n = 1; 
		int block = 0; 
		FILE *fp = NULL; 
 
		for (;;) 
		{ 
			BYTE	buf[2048]; 
			int		nBlockLen; 
			BOOLEAN	bFileMark; 
			BOOLEAN bILI; 
			BOOLEAN bEOM; 
			BOOLEAN bValid; 
			BYTE	bSenseKey; 
			for (;;) 
			{ 
				if (bCancelWatcher) goto ExitLoop; 
				if (IO_ALL_TEST_UNIT_READY(HostAdapterID,TargetID,LUN)==SS_COMP) break; 
			} 
			if (bCancelWatcher) goto ExitLoop; 
			IO_TAPE_READ(HostAdapterID,TargetID,LUN,2048,&(buf[0]),&nBlockLen,&bFileMark,&bEOM,&bILI,&bValid,&bSenseKey); 
			if (bValid==0) 
			{ 
				pDialog->SetDlgItemText(IDC_DUMPSTATUS,"读磁带的过程中发生了无法预料的错误"); 
				fclose(fp); 
				fp = NULL; 
				goto ExitLoop; 
			} 
			if (nBlockLen>0) 
			{ 
				if (nBlockLen<=2048) 
				{ 
					if (fp==NULL) 
					{ 
						switch(nStatus) 
						{ 
						case 1: 
							sprintf(szTag,".H%2.2d",n); 
							break; 
						case 2: 
							sprintf(szTag,".D%2.2d",n); 
							break; 
						case 3: 
							sprintf(szTag,".E%2.2d",n); 
							break; 
						} 
						strFileNameEx = strFileName+ CString(szTag); 
 
						pDialog->SetDlgItemText(IDC_DUMPSTATUS,CString("正在创建文件")+strFileNameEx); 
 
						fp = fopen(strFileNameEx,"wb"); 
						if (fp==NULL) 
						{ 
							pDialog->SetDlgItemText(IDC_DUMPSTATUS,CString("无法创建文件")+strFileNameEx); 
							goto ExitLoop2; 
						} 
					} 
					fwrite(&(buf[0]),1,nBlockLen,fp); 
				} else 
				{ 
					pDialog->SetDlgItemText(IDC_DUMPSTATUS,"磁带数据缓冲区太小"); 
					fclose(fp); 
					fp = NULL; 
					goto ExitLoop; 
				} 
			} 
			if (bSenseKey==8) 
			{ 
				if (fp!=NULL) 
				{ 
					fclose(fp); 
					fp = NULL; 
				} 
				pDialog->SetDlgItemText(IDC_DUMPSTATUS,"读磁带顺利结束"); 
				goto ExitLoop2; 
			} 
			if ((bFileMark)&&(fp!=NULL)) 
			{ 
				nStatus = (nStatus % 3) + 1; 
				fclose(fp); 
				fp = NULL; 
			} 
		} 
	} 
ExitLoop: 
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"用户中断了读磁带"); 
ExitLoop2: 
	pbtnSetting = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_SETTINGS)); 
	pbtnSetting->EnableWindow(TRUE); 
	pbtnClose = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_CLOSE)); 
	pbtnClose->EnableWindow(TRUE); 
	IsWatcherRunning = FALSE; 
	return 0; 
} 
 
// 信号灯 
BOOLEAN		 bCancelWatcher; 
CWinThread		*pDumpWatcher; 
BOOLEAN		 IsWatcherRunning = FALSE; 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFPDUMPWDlg dialog 
 
CFPDUMPWDlg::CFPDUMPWDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CFPDUMPWDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CFPDUMPWDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CFPDUMPWDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CFPDUMPWDlg) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CFPDUMPWDlg, CDialog) 
	//{{AFX_MSG_MAP(CFPDUMPWDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_DUMP_START, OnDumpStart) 
	ON_BN_CLICKED(IDC_DUMP_CANCEL, OnDumpCancel) 
	ON_WM_CLOSE() 
	ON_BN_CLICKED(IDC_DUMP_SETTINGS, OnDumpSettings) 
	ON_BN_CLICKED(IDC_DUMP_CLOSE, OnDumpClose) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFPDUMPWDlg message handlers 
 
BOOL CFPDUMPWDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// 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 
	 
	// TODO: Add extra initialization here 
	pDumpWatcher	= NULL; 
	if (!LoadASPIManager()) 
	{ 
		MessageBox("无法载入ASPI管理模块,程序无法继续","严重错误",MB_ICONERROR); 
		EndDialog(FALSE); 
	} 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CFPDUMPWDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CFPDUMPWDlg::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(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CFPDUMPWDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CFPDUMPWDlg::OnDumpStart()  
{ 
	// TODO: Add your control notification handler code here 
	CString strDir; 
	CString strName; 
	GetDlgItemText(IDC_EDIT1,strDir); 
	GetDlgItemText(IDC_EDIT2,strName); 
	strDir.TrimLeft(); 
	strDir.TrimRight(); 
	strName.TrimLeft(); 
	strName.TrimRight(); 
	if ((strDir.GetLength()!=0)&&(strDir.Right(1)!=CString("\\"))) 
	{ 
		strDir += CString("\\"); 
	} 
 
	strFileName = strDir + strName; 
	if (strFileName.GetLength()==0) 
	{ 
		MessageBox("子目录名和存盘名不能全部为空","参数错误",MB_ICONERROR); 
		return ; 
	} 
	if (strDir.GetLength()>0) 
	{ 
		CString strSearch = strDir + "*.*"; 
		struct _finddata_t fileinfo; 
		CString strPath = strDir.Left(strDir.GetLength()-1); 
		long handle; 
	// 判断子目录是否存在 
		handle = _findfirst(strSearch,&fileinfo); 
		if (handle==-1) 
		{ 
			int nRes = MessageBox("子目录不存在,是否要创建?","参数错误",MB_ICONERROR|MB_YESNO); 
			if (nRes==IDYES) 
			{ 
				if (-1==_mkdir(strPath)) 
				{ 
					MessageBox("无法创建子目录?","参数错误",MB_ICONERROR|MB_OK); 
				} 
			} 
		} else 
		{ 
			_findclose(handle); 
		} 
	} 
 
	// 判断文件是否存在 
	FILE *fp; 
	CString strFirstFileName; 
	strFirstFileName = strFileName + ".D01"; 
	fp = fopen((LPCSTR)strFirstFileName,"rb"); 
	if (fp!=NULL)  
	{ 
		fclose(fp); 
		if (IDNO==MessageBox("文件已存在,要覆盖吗?","文件名重复",MB_YESNO)) 
			return ; 
	} 
 
	pDumpWatcher = AfxBeginThread(DumpWatcher,NULL); 
} 
 
void CFPDUMPWDlg::OnDumpCancel()  
{ 
	// TODO: Add your control notification handler code here 
	if (!IsWatcherRunning) 
		return; 
	bCancelWatcher	= TRUE; 
//	WaitForSingleObject(pDumpWatcher->m_hThread,INFINITE); 
//	pDumpWatcher=NULL; 
} 
 
void CFPDUMPWDlg::OnClose()  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	CDialog::OnClose(); 
} 
 
void CFPDUMPWDlg::OnDumpSettings()  
{ 
	// TODO: Add your control notification handler code here 
 
	CDialogSettings myDialogSettings; 
	myDialogSettings.m_HostAdapterID = HostAdapterID; 
	myDialogSettings.m_TargetID		 = TargetID; 
	myDialogSettings.m_LUN			 = LUN; 
 
	if (IDOK==myDialogSettings.DoModal()) 
	{ 
		HostAdapterID = myDialogSettings.m_HostAdapterID; 
		TargetID      = myDialogSettings.m_TargetID; 
		LUN			  = myDialogSettings.m_LUN; 
	} 
} 
 
void CFPDUMPWDlg::OnDumpClose()  
{ 
	// TODO: Add your control notification handler code here 
	EndDialog(0); 
} 
 
void CFPDUMPWDlg::OnOK()  
{ 
	// TODO: Add extra validation here 
	return; 
//	CDialog::OnOK(); 
} 
 
void CFPDUMPWDlg::OnCancel()  
{ 
	// TODO: Add extra cleanup here 
	if (IsWatcherRunning) 
		return; 
	CDialog::OnCancel(); 
}