⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queuectrl.cpp

📁 一个FTP下载的源代码。代码质量非常高
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	HDITEM item;
	memset(&item, 0, sizeof(HDITEM));
	item.cchTextMax = 100;
	item.mask = HDI_TEXT;
	item.pszText = text;
	header->GetItem(nIndex, &item);
	CString str;
	str.LoadString(nID);
	_tcscpy(text, str);
	header->SetItem(nIndex, &item);
}

void CQueueCtrl::OnDropFiles(HDROP hDropInfo) 
{
	//End of a file drag&drop operation
	m_bMayUsePrimaryConnection=FALSE;
	CMainFrame *pMainFrame=DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
	if (!((CFtpListCtrl *)pMainFrame->GetFtpPane()->GetListCtrl())->GetItemCount())
	{
		DragFinish(hDropInfo);
		return;
	}
	int dropcount=DragQueryFile(hDropInfo, 0xFFFFFFFF, 0, 0);
	for (int i=0;i<dropcount;i++)
	{
		int len=DragQueryFile(hDropInfo, i, 0, 0) + 1;
		LPTSTR name = new TCHAR[len];
		DragQueryFile(hDropInfo, i, name, len);
		CFileStatus64 status;
		GetStatus64(name, status);
		CString name2 = name;
		if (status.m_attribute&0x10)
		{
			CString filename = name;
			if (filename.ReverseFind('\\')!=-1)
				filename=filename.Right(filename.GetLength()-filename.ReverseFind('\\')-1);
			((CFtpListCtrl *)pMainFrame->GetFtpPane()->GetListCtrl())->UploadDir(name2+"\\*.*",filename+"\\",FALSE);
		}
		else
		{
			ASSERT(name2.ReverseFind('\\')!=-1);
			CString filename=name2.Mid(name2.ReverseFind('\\')+1);
			CString path=name2.Left(name2.ReverseFind('\\'));
			pMainFrame->AddQueueItem(FALSE,filename,"",path,CServerPath(),FALSE);
		}
		delete [] name;
	}
	DragFinish(hDropInfo);
}

int CQueueCtrl::DoProcessQueue() const
{	
	return m_nProcessQueue;
}

void CQueueCtrl::UpdateStatusbar()
{
	BOOL bUnknown=FALSE;
	__int64 size=0;
	for (t_QueueVector::const_iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (iter->priority || iter->bPaused)
			if (iter->transferFile.size >= 0)
				size += iter->transferFile.size;
			else
				bUnknown = TRUE;
	}

	CMainFrame *pMainFrame=DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
	CString str;
	CString tmp;
	CString sizestr;
	if (size<(1024*10))
	{
		sizestr.LoadString(IDS_SIZE_BYTES);
		str.Format(ID_INDICATOR_QUEUESIZE,size,sizestr+(bUnknown?"+":""));
	}
	else if (size<(1024*1024*10))
	{
		sizestr.LoadString(IDS_SIZE_KBS);
		str.Format(ID_INDICATOR_QUEUESIZE,size/1024,sizestr+(bUnknown?"+":""));
	}
	else
	{
		sizestr.LoadString(IDS_SIZE_MBS);
		str.Format(ID_INDICATOR_QUEUESIZE,size/1024/1024,sizestr+(bUnknown?"+":""));
	}
	if (!pMainFrame->m_wndStatusBar.GetSafeHwnd())
		return;
	int res=pMainFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_QUEUESIZE);
	pMainFrame->m_wndStatusBar.GetStatusBarCtrl().SetText(str,pMainFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_QUEUESIZE),0);

	HFONT hFont = (HFONT)pMainFrame->m_wndStatusBar.SendMessage(WM_GETFONT);
	CClientDC dcScreen(NULL);
	HGDIOBJ hOldFont = NULL;
	if (hFont != NULL)
		hOldFont = dcScreen.SelectObject(hFont);
	int cx=dcScreen.GetTextExtent(str).cx;
	pMainFrame->m_wndStatusBar.SetPaneInfo(pMainFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_QUEUESIZE),ID_INDICATOR_QUEUESIZE,SBPS_NORMAL,cx);
	if (hOldFont != NULL)
		dcScreen.SelectObject(hOldFont);
}

void CQueueCtrl::TransferQueue(int nPriority)
{
	if (nPriority<1 || nPriority>2)
		return;
	if (FindValidIndex(1) == m_QueueItems.begin())
		return;
	int nOldProcessQueue = m_nProcessQueue;
	if (nPriority<m_nProcessQueue || !m_nProcessQueue)
		m_nProcessQueue = nPriority;
	//if (!nOldProcessQueue)
	{
		int nApiIndex=-1;
		int res;
		do
		{
			res = TransferNextFile(nApiIndex);
			if (res==-1)
				ProcessReply(FZ_REPLY_ERROR, nApiIndex);
			else if (res==-2)
				ProcessReply(FZ_REPLY_ERROR|FZ_REPLY_CRITICALERROR, nApiIndex);
		} while (res==1);
	}
	ASSERT(Validate());
}

void CQueueCtrl::StopProcessing()
{
	m_bMayUsePrimaryConnection=FALSE;
	
	CMainFrame *pMainFrame=DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());

	BOOL bCancelMainTransfer = FALSE;

	t_QueueVector::iterator iter;
	for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!iter->bActive)
			break;
		
		if (!iter->pTransferApi)
			bCancelMainTransfer = TRUE;
		else
			iter->pTransferApi->Cancel();
		iter->bStop = TRUE;
	}
	for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (iter->priority==2 && !iter->bActive)
			iter->priority = 1;
	}
	if (m_nProcessQueue && m_QueueItems.size())
	{
		for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
		{
			if (iter->bActive)
				iter->priority = 2;
			else
				break;
		}
		if (!m_nActiveCount)
			if (((CFtpListCtrl *)pMainFrame->GetFtpPane()->GetListCtrl())->HasUnsureEntries())
				pMainFrame->m_pCommandQueue->List(FZ_LIST_USECACHE|FZ_LIST_EXACT);
	}
	else
	{
		if (((CFtpListCtrl *)pMainFrame->GetFtpPane()->GetListCtrl())->HasUnsureEntries())
			pMainFrame->m_pCommandQueue->List(FZ_LIST_USECACHE|FZ_LIST_EXACT);
	}
	RedrawItems(0, m_QueueItems.size() + m_nActiveCount);

	m_nProcessQueue = 0;

	if (bCancelMainTransfer)
		pMainFrame->m_pCommandQueue->Cancel();
}

void CQueueCtrl::Export()
{
	CFileDialog dlg(FALSE, _T("xml"), _T("Transfer Queue"), OFN_OVERWRITEPROMPT, _T("XML files (*.xml)|*.xml||"), this);
	if (dlg.DoModal()!=IDOK)
		return;
	
	CMarkupSTL markup;
	markup.AddElem( _T("FileZilla") );
	markup.AddChildElem( _T("TransferQueue") );
	markup.IntoElem();
	
	for (t_QueueVector::const_iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!iter->priority && !iter->bPaused)
			break;
		
		markup.AddChildElem( _T("QueueItem") );
		markup.IntoElem();

		markup.AddChildElem( _T("File") );
		markup.AddChildAttrib( _T("Localfile"), iter->transferFile.localfile);
		markup.AddChildAttrib( _T("Size"), iter->transferFile.size);
		markup.AddChildAttrib( _T("Remotefile"), iter->transferFile.remotefile);
		markup.AddChildAttrib( _T("Remotepath"), iter->transferFile.remotepath.GetSafePath());
		
		markup.AddChildElem( _T("Data") );
		markup.AddChildAttrib( _T("Transfermode"), iter->transferFile.nType);
		markup.AddChildAttrib( _T("Get"), iter->transferFile.get?1:0);
		markup.AddChildAttrib( _T("RetryCount"), iter->retrycount);
		markup.AddChildAttrib( _T("Open"), iter->nOpen);
		
		COptions::SaveServer(&markup, iter->transferFile.server);
		
		markup.OutOfElem();
	}

	if (!markup.Save(dlg.GetPathName()))
	{
		CString str;
		str.Format(IDS_ERRORMSG_FILEOPENFAILED,dlg.GetPathName());
		AfxMessageBox(str,MB_ICONEXCLAMATION);
		return;
	}
}

void CQueueCtrl::Import()
{
	CFileDialog dlg(TRUE, _T("xml"), _T("Transfer Queue"), OFN_FILEMUSTEXIST, _T("XML files (*.xml)|*.xml|Text files (*.txt)|*.txt||"), this);
	if (dlg.DoModal()!=IDOK)
		return;

	//First try to load the file as XML file
	CMarkupSTL markup;
	if (markup.Load(dlg.GetPathName()))
	{
		if (markup.FindChildElem( _T("TransferQueue") ))
		{
			markup.IntoElem();
			while (markup.FindChildElem( _T("QueueItem") ))
			{
				markup.IntoElem();
				t_transferfile transferfile;
				
				if (!markup.FindChildElem( _T("File") ))
				{
					markup.OutOfElem();
					continue;
				}
				
				transferfile.localfile=markup.GetChildAttrib( _T("Localfile") );
				transferfile.remotefile=markup.GetChildAttrib( _T("Remotefile") );
				transferfile.remotepath.SetSafePath(markup.GetChildAttrib( _T("Remotepath") ));
				transferfile.size=_ttoi64(markup.GetChildAttrib( _T("Size") ));
				
				markup.ResetChildPos();
				if (!markup.FindChildElem( _T("Data") ))
				{
					markup.OutOfElem();
					continue;
				}
				
				CQueueData queueData;
				
				queueData.retrycount=_ttoi(markup.GetChildAttrib( _T("RetryCount") ));
				transferfile.nType=_ttoi(markup.GetChildAttrib( _T("Transfermode") ));
				transferfile.get=_ttoi(markup.GetChildAttrib( _T("Get") ));
				queueData.nOpen=_ttoi(markup.GetChildAttrib( _T("Open") ));
				
				markup.ResetChildPos();
				if (!COptions::LoadServer(&markup, transferfile.server))
				{
					markup.OutOfElem();
					continue;
				}

				markup.OutOfElem();
				
				if (transferfile.localfile=="" || transferfile.remotefile=="" || transferfile.remotepath.IsEmpty())
				{
					AfxMessageBox( _T("Error, can't reload queue item!") );
				}
				else
				{
					queueData.transferFile = transferfile;
					int index2=AddItem(queueData);
				}
				
			}
			markup.OutOfElem();
			markup.RemoveChildElem();
		}
		else
		{
			CString str;
			str.Format(IDS_ERRORMSG_FILEOPENFAILED,dlg.GetPathName());
			AfxMessageBox(str,MB_ICONEXCLAMATION);
			return;
		}
		return;
	}

	//Loading file as XML file failed, now try to load it as text file
	CFile file;
	if (!file.Open(dlg.GetPathName(), CFile::modeRead|CFile::shareDenyWrite))
	{
		CString str;
		str.Format(IDS_ERRORMSG_FILEOPENFAILED,dlg.GetPathName());
		AfxMessageBox(str,MB_ICONEXCLAMATION);
		return;
	}
	CArchive ar(&file,CArchive::load);
	CString str;

	while (ar.ReadString(str))
	{
		if (str=="")
			continue;
		CString name, folder="\\";
		t_transferfile transferfile;
		CQueueData queueData;
		transferfile.get = TRUE;
		do
		{
			if (str=="")
				break;
			if (str.Left(15)=="Transfer type: ")
			{
				str=str.Mid(15);
				if (str=="Upload")
					transferfile.get=FALSE;
				else if (str=="Download")
					transferfile.get=TRUE;
				else
				{
					AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE, MB_ICONSTOP);
					file.Close();
					return;
				}
			}
			else if (str.Left(12)=="Local file: ")
			{
				str=str.Mid(12);
				transferfile.localfile=str;
			}
			else if (str.Left(6)=="Size: ")
			{
				str=str.Mid(6);
				transferfile.size=_ttoi64(str);
			}
			else if (str.Left(13)=="Remote file: ")
			{
				str=str.Mid(13);
				transferfile.remotefile=str;
			}
			else if (str.Left(13)=="Remote path: ")
			{
				str=str.Mid(13);
				if (!transferfile.remotepath.SetSafePath(str))
				{
					AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE,MB_ICONSTOP);
					file.Close();
					return;
				}
			}
			else if (str.Left(15)=="Transfer mode: ")
			{
				str=str.Mid(15);
				transferfile.nType=_ttoi(str);
			}
			else if (str.Left(13)=="Server Type: ")
			{
				str=str.Mid(13);
				transferfile.server.nServerType=_ttoi(str);
			}
			else if (str.Left(6)=="Host: ")
			{
				str=str.Mid(6);
				transferfile.server.host=str;
			}
			else if (str.Left(6)=="Port: ")
			{
				str=str.Mid(6);
				transferfile.server.port=_ttoi(str);
			}
			else if (str.Left(6)=="User: ")
			{
				str=str.Mid(6);
				transferfile.server.user=str;
			}
			else if (str.Left(6)=="Pass: ")
			{
				str=str.Mid(6);
				transferfile.server.pass=CCrypt::decrypt(str);
			}
			else if (str.Left(17)=="Firewall Bypass: ")
			{
				str=str.Mid(17);
				transferfile.server.fwbypass=_ttoi(str);
			}
			else if (str.Left(21)=="Open after transfer: ")
			{
				str=str.Mid(21);
				queueData.nOpen=_ttoi(str);
			}
		} while (ar.ReadString(str));
		if (transferfile.localfile=="" || transferfile.remotefile=="" || transferfile.remotepath.IsEmpty() ||
			transferfile.server.host=="" || transferfile.server.port<1 || transferfile.server.port>65535 || transferfile.server.user=="")
		{
			file.Close();
			AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE,MB_ICONSTOP);
			return;
		}
		queueData.transferFile = transferfile;
		AddItem(queueData);
	}
	CString msg;
	msg.Format(IDS_STATUSMSG_FILEIMPORTED,dlg.GetPathName());
	AfxMessageBox(msg,MB_ICONINFORMATION);
}

void CQueueCtrl::EditFile(const CQueueData &queueData)
{
	if (queueData.nOpen==3)
	{
		//Delete file
		DeleteFile(queueData.transferFile.localfile);
	}
	else if (queueData.nOpen==1 || queueData.nOpen==2)
	{
		DWORD ThreadID;
		CQueueData *pQueueData = new CQueueData;
		*pQueueData = queueData;
		pQueueData->pTransferStatus = 0;
		pQueueData->pProgressControl = 0;
		HANDLE hThreadHandle;
		DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &hThreadHandle, 0, FALSE, DUPLICATE_SAME_ACCESS);
		pQueueData->retrycount=(int)hThreadHandle;
		CreateThread(0, 0, ViewEditThreadProc, pQueueData, 0, &ThreadID);
	}
}

DWORD CQueueCtrl::ViewEditThreadProc(LPVOID lpParameter)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -