📄 sitemanager.cpp
字号:
startsWith(str, _T("Default local dir: ")) ||
startsWith(str, _T("Default local folder: ")))
pSite->LocalDir = str;
else if (startsWith(str, _T("Remote Dir: ")) ||
startsWith(str, _T("Default remote dir: ")) ||
startsWith(str, _T("Default remote folder: ")))
pSite->RemoteDir = str;
else if (startsWith(str, _T("Firewall Bypass: ")))
pSite->bFirewallBypass = _ttoi(str);
else if (startsWith(str, _T("Dont Save Pass: ")))
pSite->bPassDontSave = _ttoi(str);
else if (startsWith(str, _T("Server Type: ")))
pSite->nServerType = _ttoi(str);
else if (startsWith(str, _T("Comments: ")))
pSite->Comments = str;
else if (startsWith(str, _T("LogonType: ")))
pSite->nLogonType = _ttoi(str);
else if (str == _T("Uses passive mode"))
pSite->nPasv = 1;
else if (startsWith(str, _T("Protocol Type: ")))
{
if (str == _T("ftps"))
pSite->nServerType = 1;
else if (str == _T("ftps2"))
pSite->nServerType = 2;
else if (str == _T("ftps3"))
pSite->nServerType = 4;
else if (str == _T("sftp"))
pSite->nServerType = 3;
}
} while (ar.ReadString(str));
if (pSite->bPassDontSave)
pSite->Pass = "";
if (pSite->name == _T(""))
pSite->name = pSite->Host;
if (pSite->nLogonType == -1)
if (pSite->User != _T("anonymous") && pSite->User != _T(""))
pSite->nLogonType = 1;
else
pSite->nLogonType = 0;
if (pSite->nLogonType == 1 && pSite->User == _T(""))
{
delete pSite;
AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE, MB_ICONSTOP);
return;
}
if (!pSite->nPort || pSite->Host=="")
{
delete pSite;
AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE, MB_ICONSTOP);
return;
}
HTREEITEM hParent=m_cTree.GetRootItem();
folder.TrimRight( _T("\\") );
folder.TrimLeft( _T("\\") );
folder.Replace( _T("\\\\"), _T("\\"));
while (folder!="")
{
CString segment;
int pos=folder.Find( _T("\\") );
if (pos==-1)
{
segment=folder;
folder="";
}
else
{
segment=folder.Left(pos);
folder=folder.Mid(pos+1);
}
HTREEITEM hItem=m_cTree.GetChildItem(hParent);
while (hItem)
{
if (!m_cTree.GetItemText(hItem).CompareNoCase(segment))
break;
hItem=m_cTree.GetNextSiblingItem(hItem);
}
if (!hItem)
{
hItem=m_cTree.InsertItem(segment, hParent, TVI_SORT);
pSite->name = segment;
pSite->NodeType = FOLDER;
m_cTree.SetItemData(hItem, DWORD(pSite));
}
if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS) || m_cTree.GetRootItem()==hParent)
m_cTree.Expand(hParent, TVE_EXPAND);
hParent=hItem;
}
CString newname = pSite->name;
HTREEITEM child=m_cTree.GetChildItem(hParent);
int i=2;
while (child)
{
CString name2=newname;
name2.MakeLower();
CString childstr=m_cTree.GetItemText(child);
childstr.MakeLower();
if (childstr==name2)
{
child=m_cTree.GetChildItem(hParent);
newname.Format(_T("%s (%d)"), pSite->name, i);
i++;
continue;
}
child=m_cTree.GetNextSiblingItem(child);
}
HTREEITEM item=m_cTree.InsertItem(newname, 2, 2, hParent, TVI_SORT);
pSite->name = newname;
pSite->NodeType=SITE;
m_cTree.SetItemData(item, (DWORD)pSite);
if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
m_cTree.Expand(hParent, TVE_EXPAND);
}
else
{ //URL list
t_SiteManagerItem *pSite=new t_SiteManagerItem;
pSite->nPort=0;
pSite->bFirewallBypass=0;
pSite->bPassDontSave=0;
pos=str.Find('/');
if (pos!=-1)
{
pSite->RemoteDir=str.Mid(pos+1);
str=str.Left(pos);
if (str=="")
{
delete pSite;
AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE,MB_ICONSTOP);
return;
}
}
pos=str.ReverseFind('@');
if (pos!=-1)
{
CString tmp=str.Left(pos);
int pos2=tmp.ReverseFind(':');
if (pos2==-1)
{
delete pSite;
AfxMessageBox(IDS_ERRORMSG_CANTIMPORTFILE,MB_ICONSTOP);
return;
}
str=str.Mid(pos+1);
pSite->User=tmp.Left(pos2);
pSite->Pass=tmp.Mid(pos2+1);
}
pos=str.ReverseFind(':');
if (pos!=-1)
{
pSite->nPort=_ttoi(str.Mid(pos+1));
str=str.Left(pos);
}
if (!pSite->nPort)
{
pSite->nPort=21;
}
if (pSite->User=="")
pSite->nLogonType=0;
else
pSite->nLogonType=1;
pSite->Host=str;
pSite->name = str;
HTREEITEM hParent=m_cTree.GetRootItem();
CString newname = pSite->name;
HTREEITEM child=m_cTree.GetChildItem(hParent);
int i=2;
while (child)
{
CString name2=newname;
name2.MakeLower();
CString childstr=m_cTree.GetItemText(child);
childstr.MakeLower();
if (childstr==name2)
{
child=m_cTree.GetChildItem(hParent);
newname.Format(_T("%s (%d)"), pSite->name, i);
i++;
continue;
}
child=m_cTree.GetNextSiblingItem(child);
}
HTREEITEM item=m_cTree.InsertItem(newname, 2, 2, hParent, TVI_SORT);
pSite->name=newname;
pSite->NodeType=SITE;
m_cTree.SetItemData(item, (DWORD)pSite);
if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
m_cTree.Expand(hParent, TVE_EXPAND);
}
}
m_cTree.Expand(m_cTree.GetRootItem(), TVE_EXPAND);
CString msg;
msg.Format(IDS_STATUSMSG_FILEIMPORTED,filename);
AfxMessageBox(msg, MB_ICONINFORMATION);
}
void CSiteManager::ImportXML(CMarkupSTL *pMarkup, HTREEITEM &parent)
{
while (pMarkup->FindChildElem())
{
if (pMarkup->GetChildTagName()==_T("Folder") )
{
CString name=pMarkup->GetChildAttrib( _T("Name") );
HTREEITEM child=m_cTree.GetChildItem(parent);
int i=2;
//Iterate parent's children, looking for one that has the same name as the one we are importing.
while (child)
{
CString name2=name;
name2.MakeLower();
CString childstr=m_cTree.GetItemText(child);
childstr.MakeLower();
if (childstr==name2)
break;
child=m_cTree.GetNextSiblingItem(child);
}
HTREEITEM hItem;
if (!child) //We didn't find one, insert one
{
hItem=m_cTree.InsertItem(name, parent, TVI_SORT);
t_SiteManagerItem *pFolder=new t_SiteManagerItem;
pFolder->name = name;
pFolder->NodeType = FOLDER;
m_cTree.SetItemData(hItem, (DWORD)pFolder);
}
else //We found one, so we will update it
hItem=child;
pMarkup->IntoElem();
ImportXML(pMarkup, hItem);
pMarkup->OutOfElem();
if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
m_cTree.Expand(hItem, TVE_EXPAND);
}
else if (pMarkup->GetChildTagName()==_T("Site") )
{
t_SiteManagerItem *site=GetDataXML(pMarkup);
if (site)
{
CString name=pMarkup->GetChildAttrib( _T("Name") );
CString newname=name;
HTREEITEM child=m_cTree.GetChildItem(parent);
int i=2;
while (child)
{
CString name2=newname;
name2.MakeLower();
CString childstr=m_cTree.GetItemText(child);
childstr.MakeLower();
if (childstr==name2)
{
child=m_cTree.GetChildItem(parent);
newname.Format(_T("%s (%d)"), name, i);
i++;
continue;
}
child=m_cTree.GetNextSiblingItem(child);
}
HTREEITEM item=m_cTree.InsertItem(newname, 2, 2, parent, TVI_SORT);
site->name = newname;
site->NodeType = SITE;
m_cTree.SetItemData(item, (DWORD)site);
if (!COptions::GetOptionVal(OPTION_SITEMANAGERNOEXPANDFOLDERS))
m_cTree.Expand(item, TVE_EXPAND);
if (_ttoi(pMarkup->GetChildAttrib( _T("DefaultSite") )))
m_DefaultSite=item;
}
}
}
}
int CSiteManager::AddAndShow(t_server &server)
{
m_addserver=server;
m_bAddServer=TRUE;
return DoModal();
}
int CSiteManager::ImportAndShow(CString FileToImport)
{
m_FileToImport=FileToImport;
return DoModal();
}
void CSiteManager::OnClose()
{
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;
}
CDialog::OnClose();
}
void CSiteManager::SaveSingleSite(CString name, t_SiteManagerItem *site)
{
name.TrimLeft( _T("\\") );
SetKey(name,"Host",site->Host);
CString str;
str.Format(_T("%d"), site->nPort);
SetKey(name,"Port",str);
SetKey(name,"User",site->User);
SetKey(name, "Account", site->Account);
SetKey(name,"Remote Dir",site->RemoteDir);
SetKey(name,"Local Dir",site->LocalDir);
if (_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)) || site->bPassDontSave)
SetKey(name, _T("Pass"), _T(""));
else
SetKey(name, "Pass", CCrypt::encrypt(site->Pass));
str.Format(_T("%d"), site->nLogonType+1);
SetKey(name,"Logontype",str);
str=site->bFirewallBypass?"1":"0";
SetKey(name,"FW Bypass",str);
str=site->bPassDontSave?"1":"0";
SetKey(name,"Dont Save Pass",str);
str.Format(_T("%d"), site->nServerType);
SetKey(name,"Server Type",str);
str.Format(_T("%d"), site->nPasv);
SetKey(name, "Pasv Mode", str);
str.Format(_T("%d"), site->nTimeZoneOffset);
SetKey(name, "Time Zone Offset", str);
str.Format(_T("%d"), site->nTimeZoneOffset2);
SetKey(name, "Time Zone Offset Minutes", str);
SetKey(name, "Comments", site->Comments);
str.Format(_T("%d"), site->nUTF8);
SetKey(name, "UTF8", str);
}
void CSiteManager::SaveSingleSiteXML(CMarkupSTL *pMarkup, t_SiteManagerItem *site)
{
pMarkup->AddChildAttrib( _T("Host"), site->Host);
pMarkup->AddChildAttrib( _T("Port"), site->nPort);
pMarkup->AddChildAttrib( _T("User"), site->User);
pMarkup->AddChildAttrib( _T("Account"), site->Account);
pMarkup->AddChildAttrib( _T("RemoteDir"), site->RemoteDir);
pMarkup->AddChildAttrib( _T("LocalDir"), site->LocalDir);
if (_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)) || site->bPassDontSave)
pMarkup->AddChildAttrib( _T("Pass"), _T(""));
else
pMarkup->AddChildAttrib( _T("Pass"), CCrypt::encrypt(site->Pass));
pMarkup->AddChildAttrib( _T("Logontype"), site->nLogonType);
pMarkup->AddChildAttrib( _T("FWBypass"), site->bFirewallBypass);
pMarkup->AddChildAttrib( _T("DontSavePass"), site->bPassDontSave);
pMarkup->AddChildAttrib( _T("ServerType"), site->nServerType);
pMarkup->AddChildAttrib( _T("PasvMode"), site->nPasv);
pMarkup->AddChildAttrib( _T("TimeZoneOffset"), site->nTimeZoneOffset);
pMarkup->AddChildAttrib( _T("TimeZoneOffsetMinutes"), site->nTimeZoneOffset2);
pMarkup->AddChildAttrib( _T("Comments"), site->Comments);
pMarkup->AddChildAttrib( _T("UTF8"), site->nUTF8);
}
void CSiteManager::OnPassdontsave()
{
UpdateData(TRUE);
m_PassCtrl.EnableWindow(!m_bPassDontSave);
m_Pass="";
UpdateData(FALSE);
}
//
// Read Sites from the Windows Registry
//
// Parameters:
// substring - registry subkey which contains the set of sites to read.
// parent - parent to which the sites and folders found within given
// Registry key are children.
//
void CSiteManager::ReadTree(CString substring, const LPVOID &parent, LPVOID lpData, LPVOID lpDefault,
BUILDSITETREEPROC_NEW_ITEM NewItemProc, BUILDSITETREEPROC_NEW_FOLDER NewFolderProc,
BUILDSITETREEPROC_AFTER AfterProc)
{
substring.TrimLeft( _T("\\") );
substring.TrimRight( _T("\\") );
HKEY key;
HKEY hRootKey = HKEY_CURRENT_USER;
if (RegOpenKey(HKEY_CURRENT_USER,"Software\\FileZilla\\Site Manager\\"+substring,&key) != ERROR_SUCCESS)
{
if (RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\FileZilla\\Site Manager\\"+substring,&key) != ERROR_SUCCESS)
return;
hRootKey = HKEY_LOCAL_MACHINE;
}
TCHAR buffer[1000];
int index=0;
unsigned char value[1000];
DWORD length=1000;
CString value2=value;
value[0]=0;
RegQueryValueEx(key, _T(""), 0, 0, value, &length);
if (!_tcscmp((LPCTSTR)value, _T("Folder") ) || substring=="")
{
CString name;
if (substring.ReverseFind( '\\' )!=-1)
name=substring.Mid(substring.ReverseFind( '\\' )+1);
else
name=substring;
LPVOID item = parent;
if (substring!="")
{
if (NewFolderProc)
NewFolderProc( lpData, name, item);
}
length=1000;
while(RegEnumKeyEx(key, index, buffer, &length, 0, 0, 0, 0)==ERROR_SUCCESS)
{
ReadTree(substring+"\\"+buffer, item, lpData, lpDefault, NewItemProc, NewFolderProc, AfterProc);
index++;
length=1000;
}
if (AfterProc)
AfterProc(lpData, name, item);
}
else
{
CString name;
if (substring.ReverseFind('\\')!=-1)
name = substring.Mid(substring.ReverseFind('\\')+1);
else
name = substring;
t_SiteManagerItem *site = GetData(hRootKey, substring);
if (site)
{
site->name = name;
site->NodeType = SITE;
if (NewItemProc)
NewItemProc(lpData, name, parent, site, GetKey(hRootKey, substring, "Default Site")=="1", lpDefault);
}
index++;
length = 1000;
}
RegCloseKey(key);
}
//
// Read Sites from the XML Markup
//
// Parameters:
// pMarkup - pointer to CMarkup object preset to be pointing to the first item
// in a set of sites (either a <Sites> or <Folder> tag)
// parent - parent to which the sites and folders found under the current
// branch are children.
//
void CSiteManager::ReadTreeXML(CMarkupSTL *pMarkup, const LPVOID &parent, LPVOID lpData, LPVOID lpDefault, BUILDSITETREEPROC_NEW_ITEM NewItemProc,
BUILDSITETREEPROC_NEW_FOLDER NewFolderProc, BUILDSITETREEPROC_AFTER AfterProc)
{
while (pMarkup->FindChildElem())
{
if (pMarkup->GetChildTagName()==_T("Folder") )
{
LPVOID item = parent;
CString name=pMarkup->GetChildAttrib( _T("Name") );
if (NewFolderProc)
NewFolderProc(lpData, name, item);
pMarkup->IntoElem();
ReadTreeXML(pMarkup, item, lpData, lpDefault, NewItemProc, NewFolderProc, AfterProc);
pMarkup->OutOfElem();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -