📄 queuectrl.cpp
字号:
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 + -