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

📄 queuectrl.cpp

📁 一个FTP下载的源代码。代码质量非常高
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			if (apiiter->bActive)
				continue; //Skip active instances
			if (apiiter->pTransferApi->IsConnected() == FZ_REPLY_OK) 
			{
				t_server server;
				if (apiiter->pTransferApi->GetCurrentServer(server)==FZ_REPLY_OK)
					if (server == iter->transferFile.server)
					{
						nMatchingApiIndex = apiiter - m_TransferApiArray.begin();
						break;
					}
					else
						nConnectedApiIndex = apiiter - m_TransferApiArray.begin();
				else
					nUnconnectedApiIndex = apiiter - m_TransferApiArray.begin();
			}
			else
				nUnconnectedApiIndex = apiiter - m_TransferApiArray.begin();
		}

		nApiIndex = -1;
		if (nMatchingApiIndex != -1)
			nApiIndex = nMatchingApiIndex;
		else if (!m_RetryServerList.StillWait(iter->transferFile.server))
			if (nUnconnectedApiIndex != -1)
				nApiIndex = nUnconnectedApiIndex;
			else
				nApiIndex = nConnectedApiIndex;
		
		if (nApiIndex == -1)
			continue;

		api = m_TransferApiArray[nApiIndex];
		
		if (api.pLastActiveTime)
			delete api.pLastActiveTime;
		api.pLastActiveTime = 0;
		api.bActive = TRUE;
		m_TransferApiArray[nApiIndex] = api;


		iter->status.Format(IDS_QUEUESTATUS_TRANSFERRING);
		
		iter->bActive = TRUE;
		
		//Create the progress control
		iter->pProgressControl = new CTextProgressCtrl;
		if (iter->pProgressControl->Create(WS_VISIBLE|WS_CHILD|WS_BORDER, CRect(1, 1, 1, 1), this, 0))
		{
			iter->pProgressControl->SetRange(0,100); //Set the range to between 0 and 100
			iter->pProgressControl->SetStep(1); // Set the step amount
			iter->pProgressControl->ShowWindow(SW_HIDE);
		}
		else
		{
			delete iter->pProgressControl;
			iter->pProgressControl = NULL;
		}
		
		const CQueueData queueData = *iter;
		m_QueueItems.erase(iter);
		iter = m_QueueItems.insert(m_QueueItems.begin() + m_nActiveCount, queueData);
		
		m_nActiveCount++;
		SetItemCount(m_QueueItems.size() + m_nActiveCount);
		
		iter->pTransferApi = api.pTransferApi;
		if (api.pTransferApi->IsConnected() == FZ_REPLY_OK)
		{
			t_server server;
			if (api.pTransferApi->GetCurrentServer(server) == FZ_REPLY_OK)
			{
				if (server== iter->transferFile.server)
				{
					iter->nState = QUEUESTATE_TRANSFER;
					int res = api.pTransferApi->FileTransfer(iter->transferFile);
					if (res == FZ_REPLY_WOULDBLOCK)
					{
						iter->status.Format(IDS_QUEUESTATUS_TRANSFERRING);
						ServerDataMapIter->second.nCurrentActive++;
						if (ServerDataMapIter->second.nCurrentActive>ServerDataMapIter->second.nActiveMax)
							ServerDataMapIter->second.nActiveMax++;
						return 1;
					}
					else if (res!=FZ_REPLY_NOTCONNECTED)
						return -2;
				}
				else
				{
					iter->nState = QUEUESTATE_DISCONNECT;
					int res = api.pTransferApi->Disconnect();
					if (res == FZ_REPLY_WOULDBLOCK)
					{
						iter->status.Format(IDS_STATUSMSG_CONNECTING, (iter->transferFile.server.name!="")?iter->transferFile.server.name:iter->transferFile.server.host);
						return 1;
					}
					else if (res!=FZ_REPLY_NOTCONNECTED)
						return -2;
				}
			}
		}
		
		iter->nState = QUEUESTATE_CONNECT;
		if (api.pTransferApi->Connect(iter->transferFile.server) != FZ_REPLY_WOULDBLOCK)
			return -2;
		iter->status.Format(IDS_STATUSMSG_CONNECTING, (iter->transferFile.server.name!="")?iter->transferFile.server.name:iter->transferFile.server.host);
		return 1;
	}
	return 0;
}

void CQueueCtrl::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	CMenu menu;
	menu.LoadMenu(IDR_QUEUECONTEXTMENU);

	CMenu* pPopup = menu.GetSubMenu(0);
	ASSERT(pPopup != NULL);
	CWnd* pWndPopupOwner = this;

	BOOL selected = FALSE;
	for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!(iter->nListItemState & LVIS_SELECTED))
			continue;
		if (!selected)
			selected = TRUE;
		
		int nIndex = iter - m_QueueItems.begin();
		
		if (nIndex < m_nActiveCount)
		{
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOTOP, MF_GRAYED);
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOBOTTOM, MF_GRAYED);
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_REMOVEFROMQUEUE, MF_GRAYED);
		}
		if (nIndex >= FindValidIndex(1)-m_QueueItems.begin())
		{
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOTOP, MF_GRAYED);
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOBOTTOM, MF_GRAYED);
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
		}
		if (nIndex==(FindValidIndex(1)-m_QueueItems.begin()-1))
		{
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
		}
		if (nIndex == m_nActiveCount)
		{
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
		}
			
		if (!iter->priority)
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_PAUSE, MF_GRAYED);
		
		if (!iter->bPaused)
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESUME, MF_GRAYED);
		
		if (iter->priority || iter->bPaused)
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESETSTATUS, MF_GRAYED);
		
		if (iter->priority==1 && nIndex == FindValidIndex(2)-m_QueueItems.begin())
		{
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
		}
		if (iter->priority==2 && nIndex == (FindValidIndex(2)-m_QueueItems.begin()-1))
		{
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
		}
	}

	if (!selected)
	{
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_PROCESSQUEUE, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_REMOVEFROMQUEUE, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOTOP, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOBOTTOM, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESETSTATUS, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_PAUSE, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESUME, MF_GRAYED);
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_ABORT, MF_GRAYED);
	}
	else
		if (FindValidIndex(1) == m_QueueItems.begin())
			pPopup->EnableMenuItem(ID_QUEUECONTEXT_PROCESSQUEUE, MF_GRAYED);

	if (DoProcessQueue()==1 || m_QueueItems.empty())
		pPopup->EnableMenuItem(ID_QUEUECONTEXT_PROCESSQUEUE, MF_GRAYED);
	
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
		pWndPopupOwner);
}

void CQueueCtrl::OnQueuecontextMovedown() 
{
	std::list<int> list;
	for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!(iter->nListItemState & LVIS_SELECTED))
			continue;

		int nIndex = iter - m_QueueItems.begin();

		if (iter->bActive)
			continue;
		if (iter->priority==1 && nIndex>=(FindValidIndex(1) - m_QueueItems.begin() - 1))
			continue;
		if (iter->priority==2 && nIndex>=(FindValidIndex(2) - m_QueueItems.begin() - 1))
			continue;
		if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
			continue;
		list.push_front(nIndex);
	}
	for (std::list<int>::iterator listiter = list.begin(); listiter != list.end(); listiter++)
	{
		CQueueData data = m_QueueItems[*listiter];
		m_QueueItems[*listiter] = m_QueueItems[*listiter + 1];
		m_QueueItems[*listiter + 1] = data;
	}
	RedrawItems(0, GetItemCount() - 1);
}

void CQueueCtrl::OnQueuecontextMovetobottom() 
{
	std::list<int> list;
	for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!(iter->nListItemState & LVIS_SELECTED))
			continue;

		int nIndex = iter - m_QueueItems.begin();
	
		if (iter->bActive)
			continue;
		if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
			continue;
		list.push_front(nIndex);
	}
	int offset2=0;
	int offset=0;
	for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
	{
		CQueueData data = m_QueueItems[*listiter];
		m_QueueItems.erase(m_QueueItems.begin() + *listiter);

		if (data.priority==1)
			m_QueueItems.insert(FindValidIndex(1) - offset++, data);
		else
			m_QueueItems.insert(FindValidIndex(2) - offset2++, data);
	}
	SetItemCount(m_QueueItems.size() + m_nActiveCount);
}

void CQueueCtrl::OnQueuecontextMovetotop() 
{
	std::list<int> list;
	for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!(iter->nListItemState & LVIS_SELECTED))
			continue;

		int nIndex = iter - m_QueueItems.begin();

		if (iter->bActive)
			continue;
		if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
			continue;
		list.push_back(nIndex);
	}

	int offset = FindValidIndex(2) - m_QueueItems.begin();
	int offset2 = m_nActiveCount;
	for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
	{
		CQueueData data = m_QueueItems[*listiter];
		m_QueueItems.erase(m_QueueItems.begin() + *listiter);

		if (data.priority==1)
			m_QueueItems.insert(m_QueueItems.begin() + offset++, data);
		else
			m_QueueItems.insert(m_QueueItems.begin() + offset2++, data);
	}
	SetItemCount(m_QueueItems.size() + m_nActiveCount);
}

void CQueueCtrl::OnQueuecontextMoveup() 
{
	std::list<int> list;
	for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!(iter->nListItemState & LVIS_SELECTED))
			continue;

		int nIndex = iter - m_QueueItems.begin();
	
		if (iter->bActive)
			continue;
		if (nIndex <= m_nActiveCount)
			continue;
		if (iter->priority == 1 && nIndex == FindValidIndex(2) - m_QueueItems.begin())
			continue;
		if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
			continue;
		if (nIndex == 1)
			m_bMayUsePrimaryConnection = FALSE;
		list.push_back(nIndex);		
	}
	for (std::list<int>::iterator listiter = list.begin(); listiter != list.end(); listiter++)
	{
		CQueueData data = m_QueueItems[*listiter];
		m_QueueItems[*listiter] = m_QueueItems[*listiter - 1];
		m_QueueItems[*listiter - 1] = data;
	}
	SetItemCount(m_QueueItems.size() + m_nActiveCount);
}

void CQueueCtrl::OnQueuecontextProcessqueue() 
{
	CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, GetParentFrame());
	pMainFrame->TransferQueue(1);
}

void CQueueCtrl::OnQueuecontextRemovefromqueue() 
{
	std::list<int> list;
	for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!(iter->nListItemState & LVIS_SELECTED))
			continue;
		
		if (iter == m_QueueItems.begin())
			m_bMayUsePrimaryConnection = FALSE;

		if (iter->bActive)
			continue;
		
		list.push_front(iter - m_QueueItems.begin());
	}
	for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
		m_QueueItems.erase(m_QueueItems.begin() + *listiter);

	SetItemCount(m_QueueItems.size() + m_nActiveCount);

	UpdateStatusbar();
}

t_QueueVector::iterator CQueueCtrl::FindValidIndex(int type)
{
	t_QueueVector::iterator iter = m_QueueItems.end();
	
	if (type == 1)
	{
		for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
			if (iter->priority == 0)
				break;
	}
	else if (type == 2)
		for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
			if (!iter->bActive && iter->priority != 2)
				break;
	return iter;
}

t_QueueVector::const_iterator CQueueCtrl::FindValidIndex(int type) const
{
	t_QueueVector::const_iterator iter = m_QueueItems.end();
	
	if (type == 1)
		for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
			if (iter->priority == 0)
				break;
	else if (type == 2)
		for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
			if (!iter->bActive)
				break;
	return iter;
}

void CQueueCtrl::OnQueuecontextResetstatus() 
{
	std::list<int> list;
	std::list<CQueueData> list2;
	for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
	{
		if (!(iter->nListItemState & LVIS_SELECTED))
			continue;
		
		int nIndex = iter - m_QueueItems.begin();
	
		if (iter->priority || iter->bPaused)
			continue;
		list.push_front(nIndex);
		list2.push_front(m_QueueItems[nIndex]);
	}
	for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
		m_QueueItems.erase(m_QueueItems.begin() + *listiter);
	for (std::list<CQueueData>::iterator iter2=list2.begin(); iter2!=list2.end(); iter2++)
	{
		iter2->action = "";
		iter2->retrycount = 0;
		iter2->bTransferStarted = FALSE;
		AddItem(*iter2);
	}
	UpdateStatusbar();
}

#define VK_A 65
void CQueueCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if (nChar==46)
		OnQueuecontextRemovefromqueue();
	else if(GetKeyState( VK_CONTROL )&128 && nChar == VK_A )
	{
		for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
			iter->nListItemState = LVIS_SELECTED;
		RedrawItems(0, GetItemCount() - 1);
		return;
	}
			
	
	CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CQueueCtrl::ReloadHeader()
{
	ReloadHeaderItem(0, IDS_HEADER_LOCALNAME);
	ReloadHeaderItem(1, IDS_HEADER_SIZE);
	ReloadHeaderItem(2, IDS_HEADER_DIRECTION);
	ReloadHeaderItem(3, IDS_HEADER_REMOTENAME);
	ReloadHeaderItem(4, IDS_HEADER_HOST);
	ReloadHeaderItem(5, IDS_HEADER_STATUS);
}

void CQueueCtrl::ReloadHeaderItem(int nIndex, UINT nID)
{
	CHeaderCtrl *header = GetHeaderCtrl();
	TCHAR text[100];

⌨️ 快捷键说明

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