// DLG_Corp_File.cpp : implementation file // #include "stdafx.h" #include "smsmanager.h" #include "DLG_Corp_File.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // DLG_Corp_File dialog #include "MainFrm.h" #include "UserDlg.h" #include "K_Agent.h" #include "DLG_Corp_File_Add.h" #include "io.h" DLG_Corp_File::DLG_Corp_File(CWnd* pParent /*=NULL*/) : CDialog(DLG_Corp_File::IDD, pParent) { //{{AFX_DATA_INIT(DLG_Corp_File) m_strCorpName = _T(""); m_strCorpID = _T(""); //}}AFX_DATA_INIT m_pDlg = (CDialog *)pParent; m_lDlgType = 0; memset( &m_FileReq , 0 , sizeof(m_FileReq) ); m_pFileData = NULL; m_lUpAllSize = 0; m_lUpUpSize = 0; m_lUpFileID =0; m_lDownAllSize = 0; m_lDownUpSize = 0; m_lDownFileID =0; m_lFileType = 0; } void DLG_Corp_File::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(DLG_Corp_File) DDX_Control(pDX, IDC_CORP_FILE_GDT, m_P_GDT); DDX_Control(pDX, IDC_CORP_FILE_LIST, m_wndList); DDX_Text(pDX, IDC_CORP_FILE_CORPNAME, m_strCorpName); DDX_Text(pDX, IDC_CORP_FILE_CORPID, m_strCorpID); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(DLG_Corp_File, CDialog) //{{AFX_MSG_MAP(DLG_Corp_File) ON_BN_CLICKED(IDC_CORP_FILE_ADD, OnCorpFileAdd) ON_NOTIFY(NM_DBLCLK, IDC_CORP_FILE_LIST, OnDblclkCorpFileList) ON_BN_CLICKED(IDC_CORP_FILE_MODIFY, OnCorpFileModify) ON_BN_CLICKED(IDC_CORP_FILE_DEL, OnCorpFileDel) ON_BN_CLICKED(IDC_CORP_FILE_UPLOAD, OnCorpFileUpload) ON_BN_CLICKED(IDC_CORP_FILE_DOWNLOAD, OnCorpFileDownload) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // DLG_Corp_File message handlers BOOL DLG_Corp_File::OnInitDialog() { CDialog::OnInitDialog(); m_strCorpName = m_FileReq.ret.szCorpName; m_strCorpID.Format( _T("%d") , m_FileReq.ret.lCorpID ); this->UpdateData(false); //初始化List m_Image.Create(16,16,ILC_COLOR16|ILC_MASK,5,5); m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_CORP) ); m_wndList.SubClassWindow2(); m_wndList.SetHeadings(_T("序号,50; 文件类型,100; 签订时间,90; 上传时间,90; 上传用户,80;大小(K),70;是否完整,70;原始文件名,200;备注,200;")); m_wndList.SetGridLines(true); m_wndList.SetImageList(&m_Image,LVSIL_SMALL); for ( int i = 0 ; i< m_FileReq.lCount ; i++ ) { SetListText(m_pFileData[i],-1); //-1为添加 } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void DLG_Corp_File::SetParam(ANS_Corp_File File, ANS_Corp_FileData *pFileData,long lDlgType) { m_FileReq = File; m_pFileData = pFileData; m_lDlgType = lDlgType; } BOOL DLG_Corp_File::ProcessSocket(Socket_Head *pHead) { //查看用户记录 if (pHead->lFuncType == SMSFUNC_CORP_FILE) { ANS_Corp_File * pFile = (ANS_Corp_File *)pHead->pFrame; ANS_Corp_FileData * pFileData = (ANS_Corp_FileData *)(pHead->pFrame+sizeof(ANS_Corp_File)); if ( pFile->lCount < 0 ) //权限不足,返回错误 return true; if ( pFile->ret.lReqType == 1 ) //添加 { if ( pFile->bOK && pFile->lCount>0 ) { SetListText(*pFileData , -1 ); //-1为添加 } } if ( pFile->ret.lReqType == 2 ) //修改 { if ( pFile->bOK && pFile->lCount>0 ) { SetListText(*pFileData , -2 ); //-1为修改资料 } } if ( pFile->ret.lReqType == 3 ) //删除 { if ( pFile->bOK && pFile->lCount>0 ) { long lItem=0; long lCount=m_wndList.GetItemCount(); for ( int i=0 ; ilFileID ) { lItem = i; break; } } if ( i>=lCount ) return true; m_wndList.DeleteItem(lItem); } } if ( pFile->ret.lReqType == 4 ) //上传 { if ( pFile->bOK && pFile->lCount>0 ) { if ( pFile->ret.lAllSize == pFile->ret.lUpSize ) //已上传完毕 { m_P_GDT.SetRange(0,0); //上传完成,关闭滚动条 m_UpFile.Close(); //更新信息 ANS_Corp_FileData FileData={0}; FileData.lFileID = pFile->ret.lFileID; FileData.lFileSize=pFile->ret.lAllSize; FileData.lUploadSize=pFile->ret.lUpSize; _tcscpy(FileData.szFileName , pFile->ret.szCorpName ); ::GetLocalTime(&FileData.tUploadTime); SetListText(FileData , -3 ); //-3为更新上传资料 MessageBox( _T("文件上传完成!") , _T("信息") , MB_ICONINFORMATION ); EnableCtrl(true); } else { m_P_GDT.SetPos(pFile->ret.lUpSize); UpFileNext(); } } } if ( pFile->ret.lReqType == 5 ) //下载 { if ( pFile->bOK && pFile->lCount>0 ) { #define MAXUPFILESIZE 32*1024 //每次下载32K //if ( pFile->ret.lSize <= pFile->ret.lUpSize ) //收到第一帧 if (pFile->ret.lUpSize <= MAXUPFILESIZE) //收到的第一帧 { m_P_GDT.SetRange32(0,pFile->ret.lAllSize); BYTE cRarHead[] = { 0x52,0x61,0x72,0x21,0x1A,0x07,0x00,0xCF,0x90,0x73,0x00,0x00,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; long lRarHeadLen = sizeof(cRarHead); if (memcmp((BYTE*)pFileData, (BYTE*)cRarHead, lRarHeadLen) == 0) { m_lFileType = 0; //rar文件 } else { m_lFileType = 1; //其它文件 } } m_DownFile.Write((BYTE*)pFileData ,pFile->ret.lSize ); //写文件 if ( pFile->ret.lAllSize == pFile->ret.lUpSize ) //下载完成 { m_P_GDT.SetRange(0,0); //上传完成,关闭滚动条 m_DownFile.Close(); EnableCtrl(true); CString strTemp=m_strDownFileName; strTemp.MakeUpper(); //非压缩文件或原文件就是压缩文件的,直接将文件拷到目的文件夹 if (m_lFileType==1 || strTemp.Find(_T(".RAR"))>0 || strTemp.Find(_T(".ZIP"))>0 ) //原来上传的就是压缩文件,无需要再解压 { if ( ! ::CopyFile(m_strDownRarFile,m_strDownFilePath +CString(_T("\\"))+ m_strDownFileName , false ) ) { MessageBox(_T("拷贝文件到目的文件夹失败!") , _T("错误") , MB_ICONWARNING ); return true; } } else { //取当前文件夹 TCHAR szPath[512]={0}; GetCurrentPath(szPath); CString strRar; strRar.Format( _T("%srar.exe") , szPath ); //将文件解压到目的文件夹 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); CString strCmd; strCmd.Format( _T("%s x -y \"%s\" \"%s\"") , strRar,m_strDownRarFile,m_strDownFilePath +CString(_T("\\"))); BOOL b2=CreateProcess(NULL,strCmd.GetBuffer(),NULL,NULL,false,NULL,NULL,NULL,&si,&pi); if ( b2 ) { if ( WaitForSingleObject( pi.hProcess, 50000 ) !=WAIT_TIMEOUT) //等待20秒 { //如果压缩成功,删除原文件 //::DeleteFile( strFileName ); } } Sleep(500); //延时一会 } long lRet = MessageBox(_T("文件下载完成!是否尝试直接打开文件?"), _T("提问"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON1); if (lRet == IDYES) { //下载完成,打开文件 ShellExecute(NULL, _T("open"), m_strDownFileName, NULL, m_strDownFilePath, SW_SHOWNORMAL); } } else { m_P_GDT.SetPos(pFile->ret.lUpSize); } } } return true; } return false; } void DLG_Corp_File::OnCorpFileAdd() { ANS_Corp_FileData FileData={0}; FileData.lCorpType = m_FileReq.ret.lCorpType; FileData.lCorpID = m_FileReq.ret.lCorpID; DLG_Corp_File_Add dlg(this); dlg.SetParam( FileData , true ); if ( dlg.DoModal() == IDOK ) { FileData = dlg.GetParam(); long lSize = sizeof(REQ_Corp_File) + sizeof(ANS_Corp_FileData); BYTE * pData = new BYTE[lSize];memset(pData,0,lSize); REQ_Corp_File * pPayRet = (REQ_Corp_File *)pData; ANS_Corp_FileData * pPayDataRet = (ANS_Corp_FileData *)(pData+sizeof(REQ_Corp_File)); *pPayRet = m_FileReq.ret; pPayRet->lReqType = 1; //添加 *pPayDataRet = FileData; SendFrame(SMSFUNC_CORP_FILE , pData , lSize ); } } void DLG_Corp_File::SetListText(ANS_Corp_FileData FileData, long lType) { CString str; long lItem=0; if ( lType==-1 ) { lItem = m_wndList.GetItemCount(); str.Format( _T("%d") , lItem+1 ); m_wndList.InsertItem( lItem , str , 0 ); } if ( lType==-2 || lType==-3) { long lCount=m_wndList.GetItemCount(); for ( int i=0 ; i=lCount ) return ; } int iTemp=1; if ( lType == -1 || lType == -2 ) { m_wndList.SetItemText( lItem , iTemp++ , FileData.szFileType); str.Format( _T("%04d.%02d.%02d") , FileData.tFileTime.wYear,FileData.tFileTime.wMonth,FileData.tFileTime.wDay ); m_wndList.SetItemText( lItem , iTemp++ , str ); } else { iTemp += 2 ; } if ( lType==-1 || lType == -3 ) { str.Format( _T("%04d.%02d.%02d") , FileData.tUploadTime.wYear,FileData.tUploadTime.wMonth,FileData.tUploadTime.wDay ); m_wndList.SetItemText( lItem , iTemp++ , str ); m_wndList.SetItemText( lItem , iTemp++ , FileData.szUploadUser ); if ( FileData.lFileSize>0 ) str.Format( _T("%d") , FileData.lFileSize/1024 ); else str = _T("0"); m_wndList.SetItemText( lItem , iTemp++ , str ); if ( FileData.lFileSize>0 ) str = FileData.lFileSize == FileData.lUploadSize ? _T(" 是") : _T(" 否"); else str = _T(" 否"); m_wndList.SetItemText( lItem , iTemp++ , str ); m_wndList.SetItemText( lItem , iTemp++ , FileData.szFileName ); } else { iTemp += 5; } if ( lType == -1 || lType == -2 ) { m_wndList.SetItemText( lItem , iTemp++ , FileData.szBZ ); } else { iTemp+=1; } m_wndList.SetItemData( lItem , FileData.lFileID ); } long DLG_Corp_File::GetCurrentSelected() { POSITION pos = m_wndList.GetFirstSelectedItemPosition(); if ( pos ) { return m_wndList.GetNextSelectedItem(pos); } return -1; } void DLG_Corp_File::OnDblclkCorpFileList(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; OnCorpFileModify(); } void DLG_Corp_File::OnCorpFileModify() { long lItem = GetCurrentSelected(); if ( lItem<0 ) return ; ANS_Corp_FileData FileData={0}; FileData.lCorpType = m_FileReq.ret.lCorpType; FileData.lCorpID = m_FileReq.ret.lCorpID; FileData.lFileID = m_wndList.GetItemData(lItem); m_wndList.GetItemText(lItem , 1 , FileData.szFileType , sizeof(FileData.szFileType)-2 ); m_wndList.GetItemText(lItem , 8 , FileData.szBZ , sizeof(FileData.szBZ)-2 ); CString str; str = m_wndList.GetItemText(lItem , 2 ); COleDateTime t; str.Replace( _T(".") , _T("-") ); BOOL btime = t.ParseDateTime(str,VAR_DATEVALUEONLY); if ( t.GetStatus() == COleDateTime::valid ) { t.GetAsSystemTime(FileData.tFileTime); } DLG_Corp_File_Add dlg(this); dlg.SetParam( FileData , false ); if ( dlg.DoModal() == IDOK ) { FileData = dlg.GetParam(); long lSize = sizeof(REQ_Corp_File) + sizeof(ANS_Corp_FileData); BYTE * pData = new BYTE[lSize];memset(pData,0,lSize); REQ_Corp_File * pPayRet = (REQ_Corp_File *)pData; ANS_Corp_FileData * pPayDataRet = (ANS_Corp_FileData *)(pData+sizeof(REQ_Corp_File)); *pPayRet = m_FileReq.ret; pPayRet->lReqType = 2; //修改 *pPayDataRet = FileData; SendFrame(SMSFUNC_CORP_FILE , pData , lSize ); } } void DLG_Corp_File::OnCorpFileDel() { long lItem = GetCurrentSelected(); if ( lItem<0 ) return ; ANS_Corp_FileData FileData={0}; FileData.lCorpType = m_FileReq.ret.lCorpType; FileData.lCorpID = m_FileReq.ret.lCorpID; FileData.lFileID = m_wndList.GetItemData(lItem); CString str,str2; str = m_wndList.GetItemText(lItem , 1 ); str2.Format( _T("确认要删除(%s)文件吗?") , str ); int iRet = MessageBox(str2 , _T("提问") , MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 ); if ( iRet != IDYES ) return ; long lSize = sizeof(REQ_Corp_File) + sizeof(ANS_Corp_FileData); BYTE * pData = new BYTE[lSize];memset(pData,0,lSize); REQ_Corp_File * pPayRet = (REQ_Corp_File *)pData; ANS_Corp_FileData * pPayDataRet = (ANS_Corp_FileData *)(pData+sizeof(REQ_Corp_File)); *pPayRet = m_FileReq.ret; pPayRet->lReqType = 3; //删除 *pPayDataRet = FileData; SendFrame(SMSFUNC_CORP_FILE , pData , lSize ); } void DLG_Corp_File::OnCorpFileUpload() { long lItem = GetCurrentSelected(); if ( lItem<0 ) return ; m_lUpFileID = m_wndList.GetItemData(lItem); CString str = m_wndList.GetItemText(lItem ,6 ); if ( str == _T(" 是") ) { int iRet =MessageBox( _T("所选的文件已上传完整,是否重新上传?") , _T("提问") , MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2); if ( iRet != IDYES ) return ; } #define FILE_FILTER_TEXT \ TEXT("所有文件 (*.*)\0*.*;\0\0") TCHAR szFile[ 256 ]; TCHAR szFileB[ 256 ]; *szFileB = NULL; _stprintf( szFile , _T("*.*") ); OPENFILENAME sOpen; sOpen.lStructSize = sizeof( sOpen ); sOpen.hwndOwner = this->m_hWnd ; sOpen.Flags = OFN_EXPLORER|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY; sOpen.lpstrFilter = FILE_FILTER_TEXT; sOpen.lpstrDefExt = _T("*"); sOpen.lpstrCustomFilter = NULL; sOpen.nMaxCustFilter = 0; sOpen.lpstrFile = szFile; sOpen.nMaxFile = sizeof( szFile ); sOpen.lpstrFileTitle = szFileB; sOpen.nMaxFileTitle = sizeof( szFileB ); sOpen.lpstrInitialDir = NULL; sOpen.lpstrTitle = _T("打开上传的文件"); if ( ::GetOpenFileName( &sOpen ) ) { CString strName = sOpen.lpstrFile; CString strTemp = strName; CString strName2= strName; strTemp.MakeUpper(); if ( strTemp.Find(_T(".RAR"))>0 || strTemp.Find(_T(".ZIP"))>0 ) //已是压缩文件,无需再压缩上传 { } else { //压缩文件 //取当前文件夹 TCHAR szPath[512]={0}; GetCurrentPath(szPath); CString strRar; strRar.Format( _T("%srar.exe") , szPath ); _tcscat(szPath , _T("Temp\\") ); ::CreateDirectory(szPath,NULL); //创建文件夹 _tcscat(szPath , _T("UpLoad.rar") ); if ( _taccess(szPath, 0) != -1 ) { if ( !::DeleteFile(szPath) ) { MessageBox( _T("文件冲突,建议重启后再试!") , _T("错误") , MB_ICONWARNING ); return ; } } CString strRarName = szPath; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); CString strCmd; strCmd.Format( _T("%s a -ep1 \"%s\" \"%s\"") , strRar,strRarName,strName); BOOL b2=CreateProcess(NULL,strCmd.GetBuffer(),NULL,NULL,false,NULL,NULL,NULL,&si,&pi); if ( b2 ) { if ( WaitForSingleObject( pi.hProcess, 50000 ) !=WAIT_TIMEOUT) //等待20秒 { //如果压缩成功,删除原文件 //::DeleteFile( strFileName ); } } Sleep(500); //延时一会 strName2 = strRarName; } //取原始文件名 m_strUpFileName = strName; long lLen = strName.GetLength(); for ( int i=lLen-1 ; i>=0 ; i-- ) { if ( strName.GetAt(i) == '\\' || strName.GetAt(i) == '/' ) { m_strUpFileName = strName.Right(lLen-i-1); break; } } //开始上传 if ( !m_UpFile.Open(strName2 , CFile::modeRead) ) { MessageBox( _T("打开文件错误,建议重启后再试!") , _T("错误") , MB_ICONWARNING ); return ; } m_lUpAllSize=m_UpFile.GetLength(); if ( m_lUpAllSize>2*1024*1024 ) //是否大于2M { m_UpFile.Close(); MessageBox( _T("不能上传超过2M的文件,请先缩小后再上传!") , _T("错误") , MB_ICONWARNING ); return ; } m_lUpUpSize=0; EnableCtrl(false); m_P_GDT.SetRange32(0,m_lUpAllSize); UpFileNext(); } } BOOL DLG_Corp_File::UpFileNext() { #define MAXUPFILESIZE 32*1024 //每次上传32K long lSize = sizeof(REQ_Corp_File) + MAXUPFILESIZE; BYTE * pData = new BYTE[lSize]; memset(pData , 0 , lSize ); REQ_Corp_File * pFile = (REQ_Corp_File * )pData; BYTE * pBuf = pData+sizeof(REQ_Corp_File); pFile->lFileID = m_lUpFileID; pFile->lReqType= 4; //上传 _tcscpy(pFile->szCorpName , m_strUpFileName ); pFile->lAllSize = m_lUpAllSize; DWORD dwRead=0; dwRead = m_UpFile.Read(pBuf , MAXUPFILESIZE ); if ( dwRead >0 ) { m_lUpUpSize += dwRead; pFile->lUpSize= m_lUpUpSize; pFile->lSize = dwRead; SendFrame(SMSFUNC_CORP_FILE , pData , lSize ); return true; } return false; } void DLG_Corp_File::OnCorpFileDownload() { long lItem = GetCurrentSelected(); if ( lItem<0 ) return ; long lFileID = m_wndList.GetItemData(lItem); CString str = m_wndList.GetItemText(lItem ,6 ); if ( str != _T(" 是") ) { MessageBox( _T("所选的文件未上传完整,不能下载!") , _T("错误") , MB_ICONWARNING); return ; } //压缩文件 //取当前文件夹 TCHAR szPath[512]={0}; GetCurrentPath(szPath); _tcscat(szPath , _T("Temp\\") ); ::CreateDirectory(szPath,NULL); //创建文件夹 _tcscat(szPath , _T("DownLoad.rar") ); if ( _taccess(szPath, 0) != -1 ) { if ( !::DeleteFile(szPath) ) { MessageBox( _T("文件冲突,建议重启后再试!") , _T("错误") , MB_ICONWARNING ); return ; } } m_strDownRarFile = szPath; BROWSEINFO BInfo={0}; BInfo.hwndOwner = this->GetSafeHwnd(); BInfo.pszDisplayName = szPath; BInfo.pidlRoot=0; BInfo.lpszTitle = _T("请选择文件保存路径:"); BInfo.ulFlags = BIF_RETURNONLYFSDIRS; //规定只能选择文件夹,其他无效 LPCITEMIDLIST pid = SHBrowseForFolder(&BInfo); if ( pid && SHGetPathFromIDList(pid,szPath) ) { if ( !m_DownFile.Open(m_strDownRarFile , CFile::modeCreate|CFile::modeWrite) ) { MessageBox( _T("创建文件失败,建议重启后再试!") , _T("错误") , MB_ICONWARNING ); return ; } EnableCtrl(false); str = m_wndList.GetItemText(lItem,7); //原始文件名 m_strDownFilePath = szPath; //m_strDownFileName = m_strDownFilePath + _T("\\")+ str; m_strDownFileName = str; //原始文件名 m_lFileType = 0;// 0-rar文件,1-普通文件 REQ_Corp_File * pFile = new REQ_Corp_File; memset(pFile , 0 , sizeof(REQ_Corp_File)); pFile->lFileID = lFileID; pFile->lReqType= 5; //下载 _tcscpy(pFile->szCorpName , str ); SendFrame(SMSFUNC_CORP_FILE , (BYTE*)pFile , sizeof(REQ_Corp_File) ); } } void DLG_Corp_File::EnableCtrl(BOOL b) { GetDlgItem(IDC_CORP_FILE_LIST)->EnableWindow(b); GetDlgItem(IDC_CORP_FILE_ADD)->EnableWindow(b); GetDlgItem(IDC_CORP_FILE_MODIFY)->EnableWindow(b); GetDlgItem(IDC_CORP_FILE_DEL)->EnableWindow(b); GetDlgItem(IDC_CORP_FILE_UPLOAD)->EnableWindow(b); GetDlgItem(IDC_CORP_FILE_DOWNLOAD)->EnableWindow(b); } void DLG_Corp_File::GetCurrentPath(TCHAR *pPath) { if ( m_lDlgType == 1 ) //代理商 { ((CK_Agent*)m_pDlg)->m_pMainFrame->GetCurrentPath(pPath); } else { ((CUserDlg*)m_pDlg)->m_pMainFrame->GetCurrentPath(pPath); } } BOOL DLG_Corp_File::SendFrame(unsigned char lFuncType, unsigned char *pFrame, unsigned long lFrameLen) { if ( m_lDlgType == 1 ) //代理商 { return ((CK_Agent*)m_pDlg)->m_pMainFrame->SendFrame(lFuncType,pFrame,lFrameLen); } else { return ((CUserDlg*)m_pDlg)->m_pMainFrame->SendFrame(lFuncType,pFrame,lFrameLen); } }