📄 sitemanager.cpp
字号:
}
}
else
{
if (m_KeysToDelete.empty())
break;
CString str=current+"\\"+pMarkup->GetChildAttrib( _T("Name") );
str.TrimLeft( _T("\\") );
for (std::list<CString>::iterator iter=m_KeysToDelete.begin(); iter!=m_KeysToDelete.end(); iter++)
if (*iter==str)
{
VERIFY(pMarkup->RemoveChildElem());
m_KeysToDelete.erase(iter);
break;
}
if (m_KeysToDelete.empty())
break;
res=pMarkup->FindChildElem();
while (!res && current!="")
{
int pos=current.ReverseFind('\\');
if (pos==-1)
current="";
else
current=current.Left(pos);
pMarkup->OutOfElem();
res=pMarkup->FindChildElem();
}
}
}
VERIFY(pMarkup->RestorePos( _T("PREDELETE") ));
HTREEITEM item=m_cTree.GetChildItem(TVI_ROOT);
CString path="";
//Save the sites, old items will be overwritten.
while(item)
{
t_SiteManagerItem *pSite=0;
if (m_cTree.ItemHasChildren(item))
{
item=m_cTree.GetChildItem(item);
pSite = reinterpret_cast<t_SiteManagerItem *>(m_cTree.GetItemData(item));
ASSERT(pSite);
//Find a entry in the XML file with the same name
BOOL res=pMarkup->FindChildElem();
while (res)
{
if (!pMarkup->GetChildAttrib( _T("Name") ).CollateNoCase(m_cTree.GetItemText(item)))
break;
res=pMarkup->FindChildElem();
}
if (!res)
{
pMarkup->AddChildElem((pSite->NodeType == SITE) ? _T("Site") : _T("Folder") );
pMarkup->AddChildAttrib(_T("Name"), m_cTree.GetItemText(item));
}
else
{
CString name=(pSite->NodeType == SITE) ? _T("Site") : _T("Folder");
if (pMarkup->GetTagName()!=name)
{
pMarkup->RemoveChildElem();
pMarkup->AddChildElem((pSite->NodeType == SITE) ? _T("Site") : _T("Folder") );
pMarkup->AddChildAttrib(_T("Name"), m_cTree.GetItemText(item));
}
}
if (pSite->NodeType == SITE)
{
SaveSingleSiteXML(pMarkup, pSite);
pMarkup->SetChildAttrib( _T("DefaultSite"), (item==m_DefaultSite) ? _T("1") : _T("0") );
}
pMarkup->IntoElem();
if (path!="")
path+="/"+m_cTree.GetItemText(item);
else
path=m_cTree.GetItemText(item);
continue;
}
HTREEITEM parent=m_cTree.GetParentItem(item);
pSite = reinterpret_cast<t_SiteManagerItem *>(m_cTree.GetItemData(item));
if (pSite)
delete pSite;
m_cTree.DeleteItem(item);
item=parent;
int pos=path.ReverseFind('/');
if (pos!=-1)
path=path.Left(pos);
else
path="";
pMarkup->OutOfElem();
pMarkup->ResetChildPos();
}
}
void CSiteManager::OnCancel()
{
m_cTree.SetRedraw(FALSE);
HTREEITEM item=m_cTree.GetChildItem(TVI_ROOT);
while(item)
{
if (m_cTree.ItemHasChildren(item))
{
item=m_cTree.GetChildItem(item);
continue;
}
t_SiteManagerItem *site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
if (site)
delete site;
HTREEITEM parent=m_cTree.GetParentItem(item);
m_cTree.DeleteItem(item);
item=parent;
}
m_cTree.SetRedraw(TRUE);
CDialog::OnCancel();
}
void CSiteManager::OnRadio()
{
UpdateData(TRUE);
if (!m_Logontype)
{
m_User="anonymous";
m_Pass=COptions::GetOption(OPTION_ANONPWD);
}
else
{
HTREEITEM item=m_cTree.GetSelectedItem();
ASSERT(item);
t_SiteManagerItem *site=(t_SiteManagerItem*)m_cTree.GetItemData(item);
ASSERT(site);
m_User=site->User;
if (!m_bPassDontSave)
m_Pass=site->Pass;
else
m_Pass="";
}
UpdateData(FALSE);
SetCtrlState();
}
void CSiteManager::OnExit()
{
m_cTree.SetRedraw(FALSE);
if (CheckValid())
{
SaveData();
CDialog::OnCancel();
OnClose();
}
m_cTree.SetRedraw(TRUE);
}
void CSiteManager::OnKillfocusHost()
{
UpdateData(TRUE);
t_SiteManagerItem *data=(t_SiteManagerItem *)m_cTree.GetItemData(m_cTree.GetSelectedItem());
int pos=m_Host.Find(':');
if (pos!=-1)
{
int pos2=m_Host.Find('/');
if (pos2!=-1 && pos2==(pos+1))
{
int pos3=m_Host.Find('/',pos2+1);
if (pos3!=-1 && pos3==(pos2+1))
{
if (pos==3)
{
CString tmp=m_Host.Left(pos+3);
tmp.MakeLower();
if (tmp!="ftp://")
{
return;
}
else
{
m_Host=m_Host.Right(m_Host.GetLength()-pos-3);
}
}
else if (pos==4)
{
CString tmp=m_Host.Left(pos+3);
tmp.MakeLower();
if (tmp=="ftps://")
{
m_cServerType.SetCurSel(1);
m_Host=m_Host.Right(m_Host.GetLength()-pos-3);
}
else if (tmp=="sftp://")
{
m_cServerType.SetCurSel(3);
m_Host=m_Host.Right(m_Host.GetLength()-pos-3);
}
else
return;
}
}
}
}
pos=m_Host.Find('/');
if (pos!=-1)
{
if (m_Host.GetLength()>(pos+1) && m_Host[pos+1]==' ')
data->RemoteDir=m_Host.Right(m_Host.GetLength()-pos);
else
data->RemoteDir=m_Host.Right(m_Host.GetLength()-pos-1);
CServerPath path(data->RemoteDir);
data->RemoteDir = path.GetPath();
m_Host=m_Host.Left(pos);
if (m_Host=="")
{
return;
}
}
pos=m_Host.ReverseFind('@');
if (pos!=-1)
{
CString tmp=m_Host.Left(pos);
int pos2=tmp.Find(':');
if (pos2==-1)
{
return;
}
m_Host=m_Host.Right(m_Host.GetLength()-pos-1);
m_User=tmp.Left(pos2);
m_Pass=tmp.Right(tmp.GetLength()-pos2-1);
m_Logontype=1;
SetCtrlState();
}
int pos2 = m_Host.ReverseFind(']');
pos = m_Host.ReverseFind(':');
if (pos > pos2)
{
m_Port = m_Host.Right(m_Host.GetLength()-pos-1);
m_Host = m_Host.Left(pos);
}
UpdateData(FALSE);
}
void CSiteManager::OnSitemanagerSaveexit()
{
OnExit();
}
BOOL ReadString(CArchive &ar,CString &str)
{
if (!ar.ReadString(str))
return FALSE;
int pos=str.Find( _T(": ") );
if (pos==-1)
return FALSE;
str=str.Mid(pos+2);
return TRUE;
}
void CSiteManager::OnSitemanagerFileImport()
{
if (!CheckValid())
return;
CString str;
str.LoadString(IDS_SITEMANAGER_XMLFILES);
CFileDialog dlg(TRUE, _T("xml"), _T("FTP Sites"), OFN_FILEMUSTEXIST, str);
if (dlg.DoModal()==IDOK)
{
Import(dlg.GetPathName());
}
}
void CSiteManager::OnSitemanagerFileExportAsurllist()
{
if (!CheckValid())
return;
USES_CONVERSION;
CString str;
str.LoadString(IDS_SITEMANAGER_TEXTFILES);
CFileDialog dlg(FALSE, _T("txt"), _T("FTP Sites"), OFN_OVERWRITEPROMPT, str);
if (dlg.DoModal()==IDOK)
{
CFile file;
if (!file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite))
{
AfxMessageBox(IDS_ERRORMSG_CANTCREATEFILE,MB_ICONSTOP);
return;
}
HTREEITEM item=m_cTree.GetRootItem();
while (item)
{
while(m_cTree.ItemHasChildren(item))
item=m_cTree.GetChildItem(item);
t_SiteManagerItem *site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
ASSERT(site);
if (site->NodeType == SITE)
{
CString url, tmp;
if (site->nLogonType)
{
url = site->User + ":" + site->Pass + "@";
}
url+=site->Host;
tmp.Format(_T("%d"), site->nPort);
if (tmp!="21")
url+=":"+tmp;
if (site->RemoteDir != "")
url += "/" + site->RemoteDir;
url += "\r\n";
LPCSTR lpszAscii = T2CA(url);
file.Write(lpszAscii, strlen(lpszAscii));
}
HTREEITEM item2 = m_cTree.GetNextSiblingItem(item);
while (!item2)
{
item = m_cTree.GetParentItem(item);
item2 = m_cTree.GetNextSiblingItem(item);
if (!item)
break;
}
item=item2;
}
file.Close();
}
}
void CSiteManager::OnSitemanagerFileExportWithalldetails()
{
USES_CONVERSION;
if (!CheckValid())
return;
CString str;
str.LoadString(IDS_SITEMANAGER_XMLFILES);
CFileDialog dlg(FALSE, _T("xml"), _T("FTP Sites"), OFN_OVERWRITEPROMPT, str);
if (dlg.DoModal()==IDOK)
{
CMarkupSTL markup;
markup.AddElem( _T("FileZilla") );
markup.AddChildElem( _T("Sites") );
markup.IntoElem();
HTREEITEM item=m_cTree.GetRootItem();
while (item)
{
while(m_cTree.ItemHasChildren(item))
{
if (item!=m_cTree.GetRootItem())
{
markup.AddChildElem( _T("Folder") );
markup.AddChildAttrib( _T("Name"), m_cTree.GetItemText(item));
markup.IntoElem();
}
item=m_cTree.GetChildItem(item);
}
t_SiteManagerItem *site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
ASSERT(site);
if (site->NodeType == SITE)
{
markup.AddChildElem( _T("Site") );
markup.AddChildAttrib(_T("Name"), m_cTree.GetItemText(item));
SaveSingleSiteXML(&markup, site);
}
else
{
markup.AddChildElem( _T("Folder") );
markup.AddChildAttrib( _T("Name"), m_cTree.GetItemText(item));
}
HTREEITEM item2=m_cTree.GetNextSiblingItem(item);
while (!item2)
{
markup.OutOfElem();
item=m_cTree.GetParentItem(item);
item2=m_cTree.GetNextSiblingItem(item);
if (!item)
break;
}
item=item2;
}
if (!markup.Save(dlg.GetPathName()))
AfxMessageBox(IDS_ERRORMSG_CANTCREATEFILE,MB_ICONSTOP);
}
}
static bool startsWith(CString &str, CString start)
{
bool res = str.Left(start.GetLength()) == start;
if (res)
str = str.Mid(start.GetLength());
return res;
}
void CSiteManager::Import(CString filename)
{
//First try to read it as XML file
CMarkupSTL markup;
if (markup.Load(filename))
{
if (markup.FindChildElem( _T("Sites") ))
{
markup.IntoElem();
HTREEITEM item=m_cTree.GetRootItem();
ImportXML(&markup, item);
m_cTree.Expand(m_cTree.GetRootItem(), TVE_EXPAND);
CString msg;
msg.Format(IDS_STATUSMSG_FILEIMPORTED, filename);
AfxMessageBox(msg,MB_ICONINFORMATION);
}
else
AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE, MB_ICONSTOP);
return;
}
CFile file;
if (!file.Open(filename,CFile::modeRead|CFile::shareDenyWrite))
{
AfxMessageBox(IDS_ERRORMSG_CANTOPENFILE,MB_ICONSTOP);
return;
}
CArchive ar(&file,CArchive::load );
CString str;
while (ar.ReadString(str))
{
if (str=="")
continue;
int pos;
if ((pos=str.Find( _T(": ") ))!=-1)
{ //Server list with details
t_SiteManagerItem *pSite = new t_SiteManagerItem;
pSite->nServerType = 0;
pSite->nPort = 21;
pSite->nLogonType = -1;
CString folder;
do
{
if (str=="")
break;
if (startsWith(str, _T("Name: ")) ||
startsWith(str, _T("Site Label:")))
pSite->name = str;
else if (startsWith(str, _T("Folder: ")))
folder = str;
else if (startsWith(str, _T("Host: ")) ||
startsWith(str, _T("HostName: ")))
pSite->Host = str;
else if (startsWith(str, _T("Port: ")))
pSite->nPort = _ttoi(str);
else if (startsWith(str, _T("User: ")) ||
startsWith(str, _T("User Name: ")) ||
startsWith(str, _T("Username: ")))
pSite->User = str;
else if (startsWith(str, _T("Pass: ")) ||
startsWith(str, _T("Password: ")))
pSite->Pass = str;
else if (startsWith(str, _T("Local Dir: ")) ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -