📄 sitemanager.cpp
字号:
site->NodeType = SITE;
m_cTree.SetItemData(item,(DWORD)site);
m_cTree.SelectItem(item);
DisplaySite(site);
m_cTree.SetFocus();
m_cTree.EditLabel(item);
m_bAddServer = FALSE;
}
m_hcArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
m_hcNo = AfxGetApp()->LoadStandardCursor(IDC_NO);
if (m_FileToImport!="")
Import(m_FileToImport);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zur點kgeben
}
void CSiteManager::OnNew()
{
if (!CheckValid())
return;
HTREEITEM parent=m_cTree.GetSelectedItem();
if (!parent)
parent=m_cTree.GetRootItem();
ASSERT(m_cTree.GetItemData(parent));
if (((t_SiteManagerItem *)m_cTree.GetItemData(parent))->NodeType==SITE)
parent=m_cTree.GetParentItem(parent);
ASSERT(m_cTree.GetItemData(parent) && ((t_SiteManagerItem *)m_cTree.GetItemData(parent))->NodeType==FOLDER);
CString name;
name.Format(IDS_SITEMANAGER_NEWFTPSITE);
HTREEITEM child=m_cTree.GetChildItem(parent);
int i=2;
while (child)
{
CString name2=name;
name2.MakeLower();
CString childstr=m_cTree.GetItemText(child);
childstr.MakeLower();
if (childstr==name2)
{
child=m_cTree.GetChildItem(parent);
name.Format(IDS_SITEMANAGER_NEWFTPSITEWITHNUM,i);
i++;
continue;
}
child=m_cTree.GetNextItem(child,TVGN_NEXT);
}
HTREEITEM item=m_cTree.InsertItem(name,2,2,parent,TVI_SORT);
m_cTree.Expand(parent, TVE_EXPAND);
t_SiteManagerItem *site=new t_SiteManagerItem;
site->nPort = 21;
site->nLogonType = 0;
site->bFirewallBypass=FALSE;
site->bPassDontSave=FALSE;
site->nServerType=0;
site->name=name;
site->NodeType=SITE;
m_cTree.SetItemData(item,(DWORD)site);
// Re-sort with folders first if that option is selected. This must come AFTER the SetItemData command above.
if (COptions::GetOptionVal(OPTION_SORTSITEMANAGERFOLDERSFIRST))
{
TVSORTCB pMy_Sort;
pMy_Sort.hParent = parent;
pMy_Sort.lpfnCompare = SortFoldersFirst;
pMy_Sort.lParam = (LPARAM) &m_cTree;
m_cTree.SortChildrenCB(&pMy_Sort);
}
m_cTree.SelectItem(item);
DisplaySite(site);
m_cTree.EditLabel(item);
}
/*
* CheckValid()
*
* Returns:
* TRUE - if Currently selected tree item is a folder or a site with complete data.
* FALSE - if Currently selected tree item is a site without complete data.
*/
BOOL CSiteManager::CheckValid()
{
HTREEITEM olditem=m_cTree.GetSelectedItem();
UpdateData(true);
if (!olditem)
return TRUE;
t_SiteManagerItem *data=(t_SiteManagerItem *)m_cTree.GetItemData(olditem);
ASSERT(data);
if (!data)
return FALSE;
if (data->NodeType == FOLDER)
return TRUE;
else if (data->NodeType == SITE)
{
CString str;
CString str2;
if (m_Host=="")
{
m_cTree.SelectItem(olditem);
AfxMessageBox(IDS_ERRORMSG_HOSTNEEDED,MB_ICONEXCLAMATION);
m_HostCtrl.SetFocus();
return FALSE;
}
if (m_Port=="")
{
m_cTree.SelectItem(olditem);
AfxMessageBox(IDS_ERRORMSG_PORTNEEDED,MB_ICONEXCLAMATION);
m_PortCtrl.SetFocus();
return FALSE;
}
else if (!_ttoi(m_Port))
{
m_cTree.SelectItem(olditem);
AfxMessageBox(IDS_ERRORMSG_PORTNEEDED,MB_ICONEXCLAMATION);
m_PortCtrl.SetFocus();
return FALSE;
}
if (m_Logontype==-1)
{
m_cTree.SelectItem(olditem);
AfxMessageBox(IDS_ERRORMSG_SITEMANAGERNEEDLOGONTYPE,MB_ICONEXCLAMATION);
m_LogontypeCtrl.SetFocus();
return FALSE;
}
else if (m_Logontype)
{
if (m_User=="")
{
m_cTree.SelectItem(olditem);
AfxMessageBox(IDS_ERRORMSG_SITEMANAGERNEEDUSER,MB_ICONEXCLAMATION);
m_UserCtrl.SetFocus();
return FALSE;
}
if (m_Logontype == 2 && m_Account == _T(""))
{
m_cTree.SelectItem(olditem);
AfxMessageBox(_T("Please enter an account"), MB_ICONEXCLAMATION);
m_AccountCtrl.SetFocus();
return FALSE;
}
/* if (m_Pass=="")
{
m_cTree.SelectItem(olditem);
AfxMessageBox(IDS_ERRORMSG_SITEMANAGERNEEDPASS,MB_ICONEXCLAMATION);
m_PassCtrl.SetFocus();
return FALSE;
} */
}
if (m_cServerType.GetCurSel()==CB_ERR)
m_cServerType.SetCurSel(0);
UpdateData(FALSE);
t_SiteManagerItem *site=(t_SiteManagerItem*)m_cTree.GetItemData(olditem);
ASSERT(site);
site->Host=m_Host;
site->nPort=_ttoi(m_Port);
site->nLogonType = m_Logontype;
if (m_Logontype)
{
site->User = m_User;
site->Pass = m_Pass;
site->Account = m_Account;
}
site->bFirewallBypass=m_bFwBypass;
site->bPassDontSave=m_bPassDontSave;
if (m_bPassDontSave)
site->Pass=""; //Ensure that the pass doesn't get saved
site->nServerType=m_cServerType.GetCurSel();
CWnd *pComments = GetDlgItem(IDC_SITEMANAGER_COMMENTS);
if (pComments)
pComments->GetWindowText(site->Comments);
if (!m_nDefault)
m_DefaultSite=olditem;
}
return TRUE;
}
t_SiteManagerItem *CSiteManager::GetData(HKEY hRootKey, CString Name)
{
t_SiteManagerItem *site = new t_SiteManagerItem;
site->Host = GetKey(hRootKey, Name, "Host");
site->nPort = _ttoi(GetKey(hRootKey, Name, "Port"));
site->User = GetKey(hRootKey, Name, "User");
site->Account = GetKey(hRootKey, Name, "Account");
site->Pass = CCrypt::decrypt(GetKey(hRootKey, Name, "Pass"));
site->nLogonType = _ttoi(GetKey(hRootKey, Name, "Logontype"))-1;
site->RemoteDir = GetKey(hRootKey, Name, "Remote Dir");
site->LocalDir = GetKey(hRootKey, Name, "Local Dir");
site->bFirewallBypass = _ttoi(GetKey(hRootKey, Name, "FW Bypass"));
site->bPassDontSave = _ttoi(GetKey(hRootKey, Name, "Dont Save Pass"));
site->nServerType = _ttoi(GetKey(hRootKey, Name, "Server Type"));
site->nPasv = _ttoi(GetKey(hRootKey, Name, "Pasv Mode"));
site->nTimeZoneOffset = _ttoi(GetKey(hRootKey, Name, "Time Zone Offset"));
if (site->nTimeZoneOffset < -24 || site->nTimeZoneOffset > 24)
site->nTimeZoneOffset = 0;
site->nTimeZoneOffset2 = _ttoi(GetKey(hRootKey, Name, "Time Zone Offset Minutes"));
if (site->nTimeZoneOffset2 < -59 || site->nTimeZoneOffset2 > 59)
site->nTimeZoneOffset2 = 0;
site->nUTF8 = _ttoi(GetKey(hRootKey, Name, "UTF8"));
if (site->nUTF8 < 0 || site->nUTF8 > 2)
site->nUTF8 = 0;
site->Comments = GetKey(hRootKey, Name, "Comments");
site->name = Name;
if (site->Host=="" || !site->nPort || site->nLogonType==-1)
{
delete site;
return 0;
}
return site;
}
t_SiteManagerItem *CSiteManager::GetDataXML(CMarkupSTL *pMarkup)
{
t_SiteManagerItem *site = new t_SiteManagerItem;
site->Host = pMarkup->GetChildAttrib( _T("Host") );
site->nPort = _ttoi(pMarkup->GetChildAttrib( _T("Port") ));
site->User = pMarkup->GetChildAttrib( _T("User") );
site->Account = pMarkup->GetChildAttrib( _T("Account") );
site->Pass = CCrypt::decrypt(pMarkup->GetChildAttrib( _T("Pass") ));
site->nLogonType = _ttoi(pMarkup->GetChildAttrib( _T("Logontype") ));
site->RemoteDir = pMarkup->GetChildAttrib( _T("RemoteDir") );
site->LocalDir = pMarkup->GetChildAttrib( _T("LocalDir") );
site->bFirewallBypass = _ttoi(pMarkup->GetChildAttrib( _T("FWBypass") ));
site->bPassDontSave = _ttoi(pMarkup->GetChildAttrib( _T("DontSavePass") ));
site->nServerType = _ttoi(pMarkup->GetChildAttrib( _T("ServerType") ));
site->name = pMarkup->GetChildAttrib( _T("Name") );
site->nPasv = _ttoi(pMarkup->GetChildAttrib(_T("PasvMode")));
site->nTimeZoneOffset = _ttoi(pMarkup->GetChildAttrib(_T("TimeZoneOffset")));
if (site->nTimeZoneOffset < -24 || site->nTimeZoneOffset > 24)
site->nTimeZoneOffset = 0;
site->nTimeZoneOffset2 = _ttoi(pMarkup->GetChildAttrib(_T("TimeZoneOffsetMinutes")));
if (site->nTimeZoneOffset2 < -59 || site->nTimeZoneOffset2 > 59)
site->nTimeZoneOffset2 = 0;
site->nUTF8 = _ttoi(pMarkup->GetChildAttrib(_T("UTF8")));
if (site->nUTF8 < 0 || site->nUTF8 > 2)
site->nUTF8 = 0;
site->Comments = pMarkup->GetChildAttrib(_T("Comments"));
if (site->Host=="" || !site->nPort || site->nLogonType==-1)
{
delete site;
return 0;
}
return site;
}
void CSiteManager::SetCtrlState()
{
bool bItemIsSite = false;
HTREEITEM item = m_cTree.GetSelectedItem();
t_SiteManagerItem *data = 0;
if (item)
data = (t_SiteManagerItem*)m_cTree.GetItemData(item);
if (data)
if (data->NodeType == SITE)
bItemIsSite = true;
if (bItemIsSite)
{
m_DeleteCtrl.EnableWindow(TRUE);
m_HostCtrl.EnableWindow(TRUE);
m_PortCtrl.EnableWindow(TRUE);
m_UserCtrl.EnableWindow(TRUE);
m_AccountCtrl.EnableWindow(TRUE);
m_PassCtrl.EnableWindow(TRUE);
m_LogontypeCtrl.EnableWindow(TRUE);
m_LogontypeCtrl2.EnableWindow(TRUE);
m_LogontypeCtrl3.EnableWindow(TRUE);
m_ConnectCtrl.EnableWindow(TRUE);
m_FwBypassCtrl.EnableWindow(TRUE);
m_UserCtrl.SetReadOnly(m_Logontype ? FALSE : TRUE);
m_PassCtrl.SetReadOnly(m_Logontype ? FALSE : TRUE);
m_AccountCtrl.SetReadOnly(m_Logontype != 2);
m_PassCtrl.EnableWindow((!m_bPassDontSave || !m_Logontype) && !_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)));
m_cDefault.EnableWindow(TRUE);
m_cPassDontSave.EnableWindow((m_Logontype && !_ttoi(COptions::GetOption(OPTION_RUNINSECUREMODE)))?TRUE:FALSE);
m_cServerType.EnableWindow(TRUE);
GetDlgItem(IDC_SITEMANAGER_ADVANCED)->EnableWindow(TRUE);
GetDlgItem(IDC_SITEMANAGER_COPY)->EnableWindow(TRUE);
GetDlgItem(IDC_SITEMANAGER_RENAME)->EnableWindow(TRUE);
GetDlgItem(IDC_SITEMANAGER_COMMENTS)->EnableWindow(TRUE);
}
else
{
if (item && m_cTree.GetParentItem(item))
{
m_DeleteCtrl.EnableWindow(TRUE);
GetDlgItem(IDC_SITEMANAGER_RENAME)->EnableWindow(TRUE);
}
else
{
m_DeleteCtrl.EnableWindow(FALSE);
GetDlgItem(IDC_SITEMANAGER_RENAME)->EnableWindow(FALSE);
}
m_HostCtrl.EnableWindow(FALSE);
m_PortCtrl.EnableWindow(FALSE);
m_UserCtrl.EnableWindow(FALSE);
m_AccountCtrl.EnableWindow(FALSE);
m_PassCtrl.EnableWindow(FALSE);
m_LogontypeCtrl.EnableWindow(FALSE);
m_LogontypeCtrl2.EnableWindow(FALSE);
m_LogontypeCtrl3.EnableWindow(FALSE);
m_ConnectCtrl.EnableWindow(FALSE);
m_FwBypassCtrl.EnableWindow(FALSE);
m_cDefault.EnableWindow(FALSE);
m_cPassDontSave.EnableWindow(FALSE);
m_cServerType.EnableWindow(FALSE);
GetDlgItem(IDC_SITEMANAGER_ADVANCED)->EnableWindow(FALSE);
GetDlgItem(IDC_SITEMANAGER_COPY)->EnableWindow(FALSE);
GetDlgItem(IDC_SITEMANAGER_COMMENTS)->EnableWindow(FALSE);
UpdateData(false);
}
}
void CSiteManager::OnDelete()
{
HTREEITEM item=m_cTree.GetSelectedItem();
if (!item)
return;
if (!m_cTree.GetParentItem(item))
return;
HTREEITEM parent=m_cTree.GetParentItem(item);
CString path;
while (m_cTree.GetParentItem(item))
{
path=m_cTree.GetItemText(item)+"\\"+path;
item=m_cTree.GetParentItem(item);
}
path.TrimRight( _T("\\") );
m_KeysToDelete.push_back(path);
item=m_cTree.GetSelectedItem();
while(item!=parent)
{
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);
if (m_DefaultSite==item)
m_DefaultSite=m_cTree.GetRootItem();
m_cTree.DeleteItem(item);
item=parent;
}
m_cTree.SelectItem(parent);
}
void CSiteManager::SaveData()
{
CMarkupSTL *pMarkup;
if (COptions::LockXML(&pMarkup))
{
SaveDataXML(pMarkup);
COptions::UnlockXML();
}
HTREEITEM item=m_cTree.GetChildItem(TVI_ROOT);
CString path="";
//Only delete the old items that have been renamed or removed
//Don't delete complete sitemanager key so that crashes while saving would not be fatal
for (std::list<CString>::iterator iter=m_KeysToDelete.begin(); iter!=m_KeysToDelete.end(); iter++)
RegDeleteKeyEx("Software\\FileZilla\\Site Manager\\"+*iter);
m_KeysToDelete.clear();
//Save the sites, old items will be overwritten.
while(item)
{
t_SiteManagerItem *site=0;
if (m_cTree.ItemHasChildren(item))
{
item=m_cTree.GetChildItem(item);
path+="\\"+m_cTree.GetItemText(item);
continue;
}
site=(t_SiteManagerItem *)m_cTree.GetItemData(item);
ASSERT(site);
if (site->NodeType == SITE)
{
SetKey(path,"Default Site",(item==m_DefaultSite)?"1":"0");
SaveSingleSite(path,site);
}
else if (path!="")
SetKey(path,"","Folder");
delete site;
HTREEITEM parent=m_cTree.GetParentItem(item);
m_cTree.DeleteItem(item);
item=parent;
int pos=path.ReverseFind('\\');
if (pos!=-1)
path=path.Left(pos);
else
path="";
}
}
void CSiteManager::SaveDataXML(CMarkupSTL *pMarkup)
{
pMarkup->ResetPos();
if (!pMarkup->FindChildElem( _T("Sites") ))
pMarkup->AddChildElem( _T("Sites") );
pMarkup->IntoElem();
//Only delete the old items that have been renamed or removed
//Don't delete complete sitemanager key so that crashes while saving would not be fatal
pMarkup->SavePos( _T("PREDELETE") );
CString current;
BOOL res=pMarkup->FindChildElem();
while (res)
{
if (pMarkup->GetChildTagName()==_T("Folder"))
{
if (current!="")
current+="\\"+pMarkup->GetChildAttrib( _T("Name") );
else
current=pMarkup->GetChildAttrib( _T("Name") );
if (m_KeysToDelete.empty())
break;
std::list<CString>::iterator iter;
for (iter=m_KeysToDelete.begin(); iter!=m_KeysToDelete.end(); iter++)
if (*iter==current)
{
VERIFY(pMarkup->RemoveChildElem());
m_KeysToDelete.erase(iter);
break;
}
if (m_KeysToDelete.empty())
break;
if (iter==m_KeysToDelete.end())
pMarkup->IntoElem();
else
{
int pos=current.ReverseFind('\\');
if (pos==-1)
current="";
else
current=current.Left(pos);
}
res=pMarkup->FindChildElem();
while (!res && current!="")
{
int pos=current.ReverseFind('\\');
if (pos==-1)
current="";
else
current=current.Left(pos);
pMarkup->OutOfElem();
res=pMarkup->FindChildElem();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -