📄 sitemanager.cpp
字号:
name2.MakeLower();
CString childstr=m_cTree.GetItemText(child);
childstr.MakeLower();
if (childstr==name2)
{
child=m_cTree.GetChildItem(hParent);
newname.Format(_T("%s (%d)"), 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;
name=str;
HTREEITEM hParent=m_cTree.GetRootItem();
CString newname=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)"), 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,"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);
}
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("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);
}
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;
if (RegOpenKey(HKEY_CURRENT_USER,"Software\\FileZilla\\Site Manager\\"+substring,&key)==ERROR_SUCCESS)
{
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(substring);
if (site)
{
site->name = name;
site->NodeType = SITE;
if ( NewItemProc)
NewItemProc( lpData, name, parent, site, GetKey(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();
if (AfterProc)
AfterProc(lpData, name, item);
}
else if (pMarkup->GetChildTagName()==_T("Site") )
{
t_SiteManagerItem *site=GetDataXML(pMarkup);
if (site)
{
site->NodeType = SITE;
CString name=pMarkup->GetChildAttrib( _T("Name") );
if ( NewItemProc)
NewItemProc(lpData, name, parent, site, _ttoi(pMarkup->GetChildAttrib( _T("DefaultSite") ))?1:0, lpDefault);
}
}
}
}
void CSiteManager::OnSelchangingSitemanagertree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
if (!CheckValid())
{
*pResult = 1;
return;
}
pNMTreeView->itemNew;
pNMTreeView->itemOld;
*pResult = 0;
}
void CSiteManager::OnSelchangedSitemanagertree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
t_SiteManagerItem *pSiteManagerItem = (t_SiteManagerItem *)pNMTreeView->itemNew.lParam;
ASSERT(pSiteManagerItem);
if (pSiteManagerItem->NodeType == SITE)
{
DisplaySite(pSiteManagerItem);
}
else
DisplaySite(0);
*pResult = 0;
}
void CSiteManager::DisplaySite(t_SiteManagerItem *site)
{
if (site && site->NodeType == SITE)
{
m_Host=site->Host;
m_Port.Format( _T("%d"), site->nPort);
m_Logontype=site->nLogonType;
if (site->bPassDontSave)
site->Pass="";
if (m_Logontype)
{
m_User=site->User;
m_Pass=site->Pass;
}
else
{
m_User="anonymous";
m_Pass="anon@";
}
m_bFwBypass=site->bFirewallBypass;
m_bPassDontSave=site->bPassDontSave;
m_nDefault=(m_cTree.GetSelectedItem()==m_DefaultSite)?0:-1;
m_cServerType.SetCurSel(site->nServerType);
m_nServerType=site->nServerType;
CWnd *pComments = GetDlgItem(IDC_SITEMANAGER_COMMENTS);
if (pComments)
pComments->SetWindowText(site->Comments);
}
else
{
m_Host="";
m_Port="";
m_User="";
m_Pass="";
m_Logontype=-1;
m_bFwBypass=0;
m_nDefault=-1;
m_cServerType.SetCurSel(-1);
CWnd *pComments = GetDlgItem(IDC_SITEMANAGER_COMMENTS);
if (pComments)
pComments->SetWindowText(_T(""));
}
UpdateData(FALSE);
SetCtrlState();
}
void CSiteManager::OnItemexpandedSitemanagertree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
int image=(pNMTreeView->itemNew.state&TVIS_EXPANDED)?1:0;
m_cTree.SetItemImage(pNMTreeView->itemNew.hItem,image,image);
*pResult = 0;
}
BOOL CSiteManager::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message==WM_KEYDOWN)
{
CEdit *edit=m_cTree.GetEditControl();
if (edit) //Send key messages to the edit field
{
if (pMsg->wParam==VK_RETURN || pMsg->wParam==VK_ESCAPE)
{
edit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
return TRUE;
}
}
else if (pMsg->wParam==VK_F2)
{
HTREEITEM item=m_cTree.GetSelectedItem();
if (!item)
return TRUE;
if (!m_cTree.GetParentItem(item))
return TRUE;
m_cTree.EditLabel(item);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -