home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 217 / DPCS0306DVD.ISO / Toolkit / Internet / FileZilla / Server / FileZilla_Server-0.9.11.exe / source / interface / UsersDlgSharedFolders.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2005-11-13  |  17.3 KB  |  618 lines

  1. // FileZilla Server - a Windows ftp server
  2.  
  3. // Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
  4.  
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9.  
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14.  
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. #include "stdafx.h"
  20. #include "FileZilla server.h"
  21. #include "UsersDlgSharedFolders.h"
  22. #include "misc\sbdestination.h"
  23. #include "entersomething.h"
  24. #include "UsersDlg.h"
  25.  
  26. #if defined(_DEBUG) && !defined(MMGR)
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31.  
  32. /////////////////////////////////////////////////////////////////////////////
  33. // Dialogfeld CUsersDlgSharedFolders 
  34.  
  35. CUsersDlgSharedFolders::CUsersDlgSharedFolders(CUsersDlg* pOwner) 
  36.     : CSAPrefsSubDlg(IDD)
  37. {
  38.     m_pOwner = pOwner;
  39.     
  40.     //{{AFX_DATA_INIT(CUsersDlgSharedFolders)
  41.     m_bDirsCreate = FALSE;
  42.     m_bDirsDelete = FALSE;
  43.     m_bDirsList = FALSE;
  44.     m_bDirsSubdirs = FALSE;
  45.     m_bFilesAppend = FALSE;
  46.     m_bFilesDelete = FALSE;
  47.     m_bFilesRead = FALSE;
  48.     m_bFilesWrite = FALSE;
  49.     //}}AFX_DATA_INIT
  50.  
  51.     m_pUser = 0;
  52. }
  53.  
  54. CUsersDlgSharedFolders::~CUsersDlgSharedFolders()
  55. {
  56. }
  57.  
  58.  
  59. void CUsersDlgSharedFolders::DoDataExchange(CDataExchange* pDX)
  60. {
  61.     CSAPrefsSubDlg::DoDataExchange(pDX);
  62.     //{{AFX_DATA_MAP(CUsersDlgSharedFolders)
  63.     DDX_Control(pDX, IDC_DIRS_CREATE, m_cDirsCreate);
  64.     DDX_Control(pDX, IDC_DIRS_DELETE, m_cDirsDelete);
  65.     DDX_Control(pDX, IDC_DIRS_LIST, m_cDirsList);
  66.     DDX_Control(pDX, IDC_DIRS_SUBDIRS, m_cDirsSubdirs);
  67.     DDX_Control(pDX, IDC_FILES_READ, m_cFilesRead);
  68.     DDX_Control(pDX, IDC_FILES_WRITE, m_cFilesWrite);
  69.     DDX_Control(pDX, IDC_FILES_DELETE, m_cFilesDelete);
  70.     DDX_Control(pDX, IDC_FILES_APPEND, m_cFilesAppend);
  71.     DDX_Control(pDX, IDC_DIRS, m_cDirs);
  72.     DDX_Check(pDX, IDC_DIRS_CREATE, m_bDirsCreate);
  73.     DDX_Check(pDX, IDC_DIRS_DELETE, m_bDirsDelete);
  74.     DDX_Check(pDX, IDC_DIRS_LIST, m_bDirsList);
  75.     DDX_Check(pDX, IDC_DIRS_SUBDIRS, m_bDirsSubdirs);
  76.     DDX_Check(pDX, IDC_FILES_APPEND, m_bFilesAppend);
  77.     DDX_Check(pDX, IDC_FILES_DELETE, m_bFilesDelete);
  78.     DDX_Check(pDX, IDC_FILES_READ, m_bFilesRead);
  79.     DDX_Check(pDX, IDC_FILES_WRITE, m_bFilesWrite);
  80.     //}}AFX_DATA_MAP
  81. }
  82.  
  83.  
  84. BEGIN_MESSAGE_MAP(CUsersDlgSharedFolders, CSAPrefsSubDlg)
  85.     //{{AFX_MSG_MAP(CUsersDlgSharedFolders)
  86.     ON_WM_CONTEXTMENU()
  87.     ON_NOTIFY(LVN_ITEMCHANGED, IDC_DIRS, OnItemchangedDirs)
  88.     ON_NOTIFY(LVN_ITEMCHANGING, IDC_DIRS, OnItemchangingDirs)
  89.     ON_COMMAND(ID_DIRMENU_ADD, OnDirmenuAdd)
  90.     ON_COMMAND(ID_DIRMENU_REMOVE, OnDirmenuRemove)
  91.     ON_COMMAND(ID_DIRMENU_RENAME, OnDirmenuRename)
  92.     ON_COMMAND(ID_DIRMENU_SETASHOMEDIR, OnDirmenuSetashomedir)
  93.     ON_COMMAND(ID_DIRMENU_EDITALIASES, OnDirmenuEditAliases)
  94.     ON_NOTIFY(LVN_ENDLABELEDIT, IDC_DIRS, OnEndlabeleditDirs)
  95.     ON_NOTIFY(NM_DBLCLK, IDC_DIRS, OnDblclkDirs)
  96.     ON_BN_CLICKED(IDC_FILES_WRITE, OnFilesWrite)
  97.     ON_BN_CLICKED(IDC_DIRADD, OnDiradd)
  98.     ON_BN_CLICKED(IDC_DIRREMOVE, OnDirremove)
  99.     ON_BN_CLICKED(IDC_DIRRENAME, OnDirrename)
  100.     ON_BN_CLICKED(IDC_DIRSETASHOME, OnDirsetashome)
  101.     //}}AFX_MSG_MAP
  102. END_MESSAGE_MAP()
  103.  
  104. /////////////////////////////////////////////////////////////////////////////
  105. // Behandlungsroutinen fⁿr Nachrichten CUsersDlgSharedFolders 
  106.  
  107. BOOL CUsersDlgSharedFolders::OnInitDialog() 
  108. {
  109.     CSAPrefsSubDlg::OnInitDialog();
  110.     
  111.     m_cDirs.InsertColumn(0, "Directories", LVCFMT_LEFT, 120);
  112.     m_cDirs.InsertColumn(1, "Aliases", LVCFMT_LEFT, 200);
  113.     UpdateData(FALSE);
  114.     
  115.     m_imagelist.Create( 16, 16, ILC_MASK, 3, 3 );
  116.     HICON icon;
  117.     icon = AfxGetApp()->LoadIcon(IDI_EMPTY);
  118.     m_imagelist.Add(icon);
  119.     DestroyIcon(icon);
  120.     icon = AfxGetApp()->LoadIcon(IDI_HOME);
  121.     m_imagelist.Add(icon);
  122.     DestroyIcon(icon);
  123.     
  124.     m_cDirs.SetImageList(&m_imagelist, LVSIL_SMALL);
  125.  
  126.     m_cDirs.SetExtendedStyle(LVS_EX_FULLROWSELECT);
  127.  
  128.     SetCtrlState();
  129.  
  130.     return TRUE;  // return TRUE unless you set the focus to a control
  131.                   // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurⁿckgeben
  132. }
  133.  
  134. CString CUsersDlgSharedFolders::Validate()
  135. {
  136.     //TODO: check for homedir
  137.     
  138.     UpdateData(TRUE);
  139.     return _T("");
  140. }
  141.  
  142. void CUsersDlgSharedFolders::OnContextMenu(CWnd* pWnd, CPoint point) 
  143. {
  144.     if (pWnd==&m_cDirs)
  145.     {
  146.         CMenu menu;
  147.         menu.LoadMenu(IDR_DIRCONTEXT);
  148.  
  149.         CMenu* pPopup = menu.GetSubMenu(0);
  150.         ASSERT(pPopup != NULL);
  151.         CWnd* pWndPopupOwner = this;
  152.         //while (pWndPopupOwner->GetStyle() & WS_CHILD)
  153.         //    pWndPopupOwner = pWndPopupOwner->GetParent();
  154.         
  155.         if (!m_cDirs.GetFirstSelectedItemPosition())
  156.         {
  157.             pPopup->EnableMenuItem(ID_DIRMENU_REMOVE, MF_GRAYED);
  158.             pPopup->EnableMenuItem(ID_DIRMENU_RENAME, MF_GRAYED);
  159.             pPopup->EnableMenuItem(ID_DIRMENU_SETASHOMEDIR, MF_GRAYED);
  160.             pPopup->EnableMenuItem(ID_DIRMENU_EDITALIASES, MF_GRAYED);
  161.         }
  162.         if (point.x == -1)
  163.             GetCursorPos(&point);
  164.         pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  165.             pWndPopupOwner);
  166.     }
  167. }
  168.  
  169. void CUsersDlgSharedFolders::OnItemchangedDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  170. {
  171.     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  172.     t_user *pUser = m_pOwner->GetCurrentUser();
  173.     if (!pUser)
  174.         return;
  175.     
  176.     int nItem = pNMListView->iItem;
  177.     POSITION selpos=m_cDirs.GetFirstSelectedItemPosition();
  178.     if (selpos)
  179.     {
  180.         if (m_cDirs.GetNextSelectedItem(selpos) != nItem)
  181.             return;
  182.     }
  183.     int index=pNMListView->lParam;
  184.     if (nItem!=-1)
  185.     {
  186.         m_bFilesRead = pUser->permissions[index].bFileRead;
  187.         m_bFilesWrite = pUser->permissions[index].bFileWrite;
  188.         m_bFilesDelete = pUser->permissions[index].bFileDelete;
  189.         m_bFilesAppend = pUser->permissions[index].bFileAppend;
  190.         m_bDirsCreate = pUser->permissions[index].bDirCreate;
  191.         m_bDirsDelete = pUser->permissions[index].bDirDelete;
  192.         m_bDirsList = pUser->permissions[index].bDirList;
  193.         m_bDirsSubdirs = pUser->permissions[index].bDirSubdirs;
  194.     }
  195.     UpdateData(FALSE);
  196.  
  197.     SetCtrlState();    
  198.     *pResult = 0;
  199. }
  200.  
  201. void CUsersDlgSharedFolders::OnItemchangingDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  202. {
  203.     *pResult = 0;
  204.     UpdateData(TRUE);
  205.     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  206.     t_user *pUser = m_pOwner->GetCurrentUser();
  207.     if (!pUser)
  208.         return;
  209.         
  210.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  211.     if (selpos)
  212.     {
  213.         int item = m_cDirs.GetNextSelectedItem(selpos);
  214.         int index = m_cDirs.GetItemData(item);
  215.         pUser->permissions[index].bFileRead = m_bFilesRead;
  216.         pUser->permissions[index].bFileWrite = m_bFilesWrite;
  217.         pUser->permissions[index].bFileDelete = m_bFilesDelete;
  218.         pUser->permissions[index].bFileAppend = m_bFilesAppend;
  219.         pUser->permissions[index].bDirCreate = m_bDirsCreate;
  220.         pUser->permissions[index].bDirDelete = m_bDirsDelete;
  221.         pUser->permissions[index].bDirList = m_bDirsList;
  222.         pUser->permissions[index].bDirSubdirs = m_bDirsSubdirs;
  223.     }
  224. }
  225.  
  226. void CUsersDlgSharedFolders::SetCtrlState()
  227. {
  228.     t_user *pUser = m_pOwner->GetCurrentUser();
  229.     if (!pUser)
  230.     {
  231.         m_cDirs.EnableWindow(FALSE);
  232.         m_cFilesRead.EnableWindow(FALSE);
  233.         m_cFilesWrite.EnableWindow(FALSE);
  234.         m_cFilesDelete.EnableWindow(FALSE);
  235.         m_cFilesAppend.EnableWindow(FALSE);
  236.         m_cDirsCreate.EnableWindow(FALSE);
  237.         m_cDirsDelete.EnableWindow(FALSE);
  238.         m_cDirsList.EnableWindow(FALSE);
  239.         m_cDirsSubdirs.EnableWindow(FALSE);
  240.         GetDlgItem(IDC_DIRADD)->EnableWindow(FALSE);
  241.         GetDlgItem(IDC_DIRREMOVE)->EnableWindow(FALSE);
  242.         GetDlgItem(IDC_DIRRENAME)->EnableWindow(FALSE);
  243.         GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(FALSE);
  244.  
  245.         m_bFilesAppend = m_bFilesDelete = m_bFilesRead = m_bFilesWrite = FALSE;
  246.         m_bDirsCreate = m_bDirsDelete = m_bDirsList = m_bDirsSubdirs = FALSE;
  247.         UpdateData(FALSE);
  248.     }
  249.     else
  250.     {
  251.         m_cDirs.EnableWindow(TRUE);
  252.         GetDlgItem(IDC_DIRADD)->EnableWindow(TRUE);
  253.         
  254.         if (m_cDirs.GetFirstSelectedItemPosition())
  255.         {
  256.             m_cFilesRead.EnableWindow(TRUE);
  257.             m_cFilesWrite.EnableWindow(TRUE);
  258.             m_cFilesDelete.EnableWindow(TRUE);
  259.             if (m_bFilesWrite)
  260.                 m_cFilesAppend.EnableWindow(TRUE);
  261.             else
  262.                 m_cFilesAppend.EnableWindow(FALSE);
  263.             m_cDirsCreate.EnableWindow(TRUE);
  264.             m_cDirsDelete.EnableWindow(TRUE);
  265.             m_cDirsList.EnableWindow(TRUE);
  266.             m_cDirsSubdirs.EnableWindow(TRUE);
  267.             GetDlgItem(IDC_DIRREMOVE)->EnableWindow(TRUE);
  268.             GetDlgItem(IDC_DIRRENAME)->EnableWindow(TRUE);
  269.             GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(TRUE);
  270.         }
  271.         else
  272.         {
  273.             m_bFilesAppend = m_bFilesDelete = m_bFilesRead = m_bFilesWrite = FALSE;
  274.             m_bDirsCreate = m_bDirsDelete = m_bDirsList = m_bDirsSubdirs = FALSE;
  275.             UpdateData(FALSE);
  276.             m_cFilesRead.EnableWindow(FALSE);
  277.             m_cFilesWrite.EnableWindow(FALSE);
  278.             m_cFilesDelete.EnableWindow(FALSE);
  279.             m_cFilesAppend.EnableWindow(FALSE);
  280.             m_cDirsCreate.EnableWindow(FALSE);
  281.             m_cDirsDelete.EnableWindow(FALSE);
  282.             m_cDirsList.EnableWindow(FALSE);
  283.             m_cDirsSubdirs.EnableWindow(FALSE);
  284.             GetDlgItem(IDC_DIRREMOVE)->EnableWindow(FALSE);
  285.             GetDlgItem(IDC_DIRRENAME)->EnableWindow(FALSE);
  286.             GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(FALSE);
  287.         }
  288.     }
  289. }
  290.  
  291. void CUsersDlgSharedFolders::OnDirmenuAdd() 
  292. {
  293.     t_user *pUser = m_pOwner->GetCurrentUser();
  294.     if (!pUser)
  295.         return;
  296.     
  297.     t_directory dir;
  298.     dir.bFileRead = dir.bDirList = dir.bDirSubdirs = TRUE;
  299.     dir.bDirCreate = dir.bDirDelete = 
  300.         dir.bFileAppend = dir.bFileDelete = 
  301.         dir.bAutoCreate = dir.bFileWrite = 
  302.         dir.bIsHome = FALSE;
  303.     dir.dir="";
  304.     if (pUser->group == "" && !m_cDirs.GetItemCount())
  305.         dir.bIsHome = TRUE;
  306.     else
  307.         dir.bIsHome = FALSE;
  308.  
  309.     pUser->permissions.push_back(dir);
  310.     int nItem=m_cDirs.InsertItem(LVIF_TEXT |LVIF_PARAM|LVIF_IMAGE, 0, "<new directory>", 0, 0, dir.bIsHome?1:0, pUser->permissions.size()-1);
  311.     m_cDirs.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
  312.     m_cDirs.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
  313.     m_cDirs.SetFocus();
  314.     OnDblclkDirs(0, 0);    
  315. }
  316.  
  317. void CUsersDlgSharedFolders::OnDirmenuRemove() 
  318. {
  319.     t_user *pUser = m_pOwner->GetCurrentUser();
  320.     if (!pUser)
  321.         return;
  322.  
  323.     POSITION selpos;
  324.     selpos = m_cDirs.GetFirstSelectedItemPosition();
  325.     if (!selpos)
  326.         return;
  327.     int nItem=m_cDirs.GetNextSelectedItem(selpos);
  328.     int index=m_cDirs.GetItemData(nItem);
  329.     m_cDirs.DeleteItem(nItem);
  330.     int i=0;
  331.     for (std::vector<t_directory>::iterator iter = pUser->permissions.begin(); iter!=pUser->permissions.end(); iter++, i++)
  332.         if (i==index)
  333.         {
  334.             pUser->permissions.erase(iter);
  335.             break;
  336.         }
  337.     for (i=0;i<m_cDirs.GetItemCount();i++)
  338.     {
  339.         int data=m_cDirs.GetItemData(i);
  340.         if (data>index)
  341.         {
  342.             m_cDirs.SetItemData(i, data-1);
  343.         }
  344.     }
  345.     SetCtrlState();
  346. }
  347.  
  348. void CUsersDlgSharedFolders::OnDirmenuRename() 
  349. {
  350.     t_user *pUser = m_pOwner->GetCurrentUser();
  351.     if (!pUser)
  352.         return;
  353.  
  354.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  355.     if (!selpos)
  356.         return;
  357.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  358.     
  359.     m_cDirs.SetFocus();
  360.     m_cDirs.EditLabel(nItem);
  361. }
  362.  
  363. void CUsersDlgSharedFolders::OnDirmenuSetashomedir() 
  364. {
  365.     t_user *pUser = m_pOwner->GetCurrentUser();
  366.     if (!pUser)
  367.         return;
  368.  
  369.     POSITION selpos;
  370.     selpos=m_cDirs.GetFirstSelectedItemPosition();
  371.     if (!selpos)
  372.         return;
  373.     int nItem=m_cDirs.GetNextSelectedItem(selpos);
  374.     
  375.     for (unsigned int j=0; j<pUser->permissions.size(); j++)
  376.     {
  377.         LVITEM item;
  378.         memset(&item,0,sizeof(item));
  379.         item.mask=LVIF_IMAGE|LVIF_PARAM;
  380.         item.iItem=j;
  381.         m_cDirs.GetItem(&item);
  382.         item.iImage = (j==(unsigned int)nItem)?1:0;
  383.         pUser->permissions[item.lParam].bIsHome=0;
  384.         m_cDirs.SetItem(&item);
  385.     }
  386.     int index = m_cDirs.GetItemData(nItem);
  387.     pUser->permissions[index].bIsHome = 1;
  388. }
  389.  
  390. void CUsersDlgSharedFolders::OnEndlabeleditDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  391. {
  392.     LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  393.     if (pDispInfo->item.pszText)
  394.     {
  395.         if (pDispInfo->item.pszText[0]==0)
  396.         {
  397.             AfxMessageBox("Please select a folder!");
  398.             *pResult=FALSE;
  399.         }
  400.         else
  401.         {
  402.             t_user *pUser = m_pOwner->GetCurrentUser();
  403.             if (!pUser)
  404.                 return;
  405.             pUser->permissions[pDispInfo->item.lParam].dir = pDispInfo->item.pszText;
  406.             *pResult=TRUE;
  407.         }    
  408.     }
  409.     else
  410.     {
  411.         if (m_cDirs.GetItemText(pDispInfo->item.iItem,0)=="")
  412.         {
  413.             t_user *pUser = m_pOwner->GetCurrentUser();
  414.             if (!pUser)
  415.                 return;
  416.             
  417.             m_cDirs.DeleteItem(pDispInfo->item.iItem);
  418.             int i=0;
  419.             for (std::vector<t_directory>::iterator iter=pUser->permissions.begin(); iter!=pUser->permissions.end(); iter++, i++)
  420.                 if (i==pDispInfo->item.lParam)
  421.                 {
  422.                     pUser->permissions.erase(iter);
  423.                     break;
  424.                 }
  425.         }
  426.     }
  427. }
  428.  
  429. void CUsersDlgSharedFolders::OnDblclkDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  430. {
  431.     t_user *pUser = m_pOwner->GetCurrentUser();
  432.     if (!pUser)
  433.         return;
  434.     
  435.     NMITEMACTIVATE *pItemActivate = (NMITEMACTIVATE *)pNMHDR;
  436.  
  437.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  438.     if (!selpos)
  439.         return;
  440.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  441.     int index = m_cDirs.GetItemData(nItem);
  442.  
  443.     if (!pItemActivate || !pItemActivate->iSubItem)
  444.     {
  445.         if (m_pOwner->IsLocalConnection())
  446.         {
  447.             CSBDestination sb(m_hWnd, IDS_BROWSEFORFOLDER);
  448.             sb.SetFlags(BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT);
  449.             sb.SetInitialSelection(m_cDirs.GetItemText(nItem,0));
  450.             if (sb.SelectFolder())
  451.             {
  452.                 m_cDirs.SetItemText(nItem, 0, sb.GetSelectedFolder());
  453.                 pUser->permissions[index].dir = sb.GetSelectedFolder();
  454.             }
  455.         }
  456.         else
  457.         {
  458.             m_cDirs.SetFocus();
  459.             m_cDirs.EditLabel(nItem);
  460.         }
  461.     }
  462.     else
  463.         OnDirmenuEditAliases();
  464.     
  465.     if (pResult)
  466.         *pResult = 0;
  467. }
  468.  
  469. void CUsersDlgSharedFolders::OnFilesWrite() 
  470. {
  471.     UpdateData(TRUE);
  472.     SetCtrlState();    
  473. }
  474.  
  475. void CUsersDlgSharedFolders::OnDiradd() 
  476. {
  477.     OnDirmenuAdd();    
  478. }
  479.  
  480. void CUsersDlgSharedFolders::OnDirremove() 
  481. {
  482.     OnDirmenuRemove();    
  483. }
  484.  
  485. void CUsersDlgSharedFolders::OnDirrename() 
  486. {
  487.     OnDirmenuRename();    
  488. }
  489.  
  490. void CUsersDlgSharedFolders::OnDirsetashome() 
  491. {
  492.     OnDirmenuSetashomedir();    
  493. }
  494.  
  495. BOOL CUsersDlgSharedFolders::PreTranslateMessage(MSG* pMsg) 
  496. {
  497.     if (pMsg->message==WM_KEYDOWN)
  498.     {
  499.         if (pMsg->wParam==VK_F2)
  500.         {
  501.             if (GetFocus() == &m_cDirs)
  502.             {
  503.                 if (m_cDirs.GetEditControl())
  504.                     return TRUE;
  505.                 OnDirmenuRename();
  506.             }
  507.             return TRUE;
  508.         }
  509.     }
  510.     return CSAPrefsSubDlg::PreTranslateMessage(pMsg);
  511. }
  512.  
  513. BOOL CUsersDlgSharedFolders::DisplayUser(t_user *pUser)
  514. {
  515.     m_pUser = pUser;
  516.  
  517.     if (!pUser)
  518.     {
  519.         m_cDirs.DeleteAllItems();
  520.         m_bFilesRead = m_bFilesWrite = m_bFilesDelete = m_bFilesAppend = FALSE;
  521.         m_bDirsCreate = m_bDirsList = m_bDirsDelete = m_bDirsSubdirs = FALSE;
  522.         return TRUE;
  523.     }
  524.     
  525.     UpdateData(FALSE);
  526.     
  527.     //Fill the dirs list
  528.     m_cDirs.DeleteAllItems();
  529.     for (unsigned int j=0; j<pUser->permissions.size(); j++)
  530.     {
  531.         int nItem = m_cDirs.InsertItem(j, pUser->permissions[j].dir);
  532.         LVITEM item;
  533.         memset(&item,0,sizeof(item));
  534.         item.mask = LVIF_IMAGE | LVIF_PARAM;
  535.         item.iItem = nItem;
  536.         m_cDirs.GetItem(&item);
  537.         item.lParam = j;
  538.         item.iImage = pUser->permissions[j].bIsHome?1:0;
  539.         m_cDirs.SetItem(&item);
  540.  
  541.         CString aliases;
  542.         for (std::list<CString>::const_iterator iter = pUser->permissions[j].aliases.begin(); iter != pUser->permissions[j].aliases.end(); iter++)
  543.             aliases += *iter + "|";
  544.         aliases.TrimRight('|');
  545.         m_cDirs.SetItemText(nItem, 1, aliases);
  546.     }
  547.  
  548.     return TRUE;
  549. }
  550.  
  551. BOOL CUsersDlgSharedFolders::SaveUser(t_user *pUser)
  552. {
  553.     if (!pUser)
  554.         return FALSE;
  555.     
  556.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  557.     if (selpos)
  558.     {
  559.         int item = m_cDirs.GetNextSelectedItem(selpos);
  560.         int index = m_cDirs.GetItemData(item);
  561.         pUser->permissions[index].bFileRead = m_bFilesRead;
  562.         pUser->permissions[index].bFileWrite = m_bFilesWrite;
  563.         pUser->permissions[index].bFileDelete = m_bFilesDelete;
  564.         pUser->permissions[index].bFileAppend = m_bFilesAppend;
  565.         pUser->permissions[index].bDirCreate = m_bDirsCreate;
  566.         pUser->permissions[index].bDirDelete = m_bDirsDelete;
  567.         pUser->permissions[index].bDirList = m_bDirsList;
  568.         pUser->permissions[index].bDirSubdirs = m_bDirsSubdirs;
  569.     }        
  570.     return TRUE;
  571. }
  572.  
  573. void CUsersDlgSharedFolders::OnDirmenuEditAliases()
  574. {
  575.     t_user *pUser = m_pOwner->GetCurrentUser();
  576.     if (!pUser)
  577.         return;
  578.     
  579.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  580.     if (!selpos)
  581.         return;
  582.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  583.     int index = m_cDirs.GetItemData(nItem);
  584.  
  585.     if (pUser->permissions[index].bIsHome)
  586.     {
  587.         AfxMessageBox("Can't set aliases for home dir, this would create a recursive directory structure.");
  588.         return;
  589.     }
  590.  
  591.     CEnterSomething dlg(IDS_SHAREDFOLDERS_ENTERALIASES, IDD_ENTERSOMETHING_LARGE);
  592.     CString aliases;
  593.     for (std::list<CString>::const_iterator iter = pUser->permissions[index].aliases.begin(); iter != pUser->permissions[index].aliases.end(); iter++)
  594.         aliases += *iter + "|";
  595.     dlg.m_String = m_cDirs.GetItemText(nItem, 1);
  596.     dlg.allowEmpty = true;
  597.     if (dlg.DoModal() == IDOK)
  598.     {
  599.         CString aliases = dlg.m_String;
  600.         while (aliases.Replace("||", "|"));
  601.         aliases.TrimLeft("|");
  602.         aliases.TrimRight("|");
  603.         m_cDirs.SetItemText(nItem, 1, aliases);
  604.         
  605.         pUser->permissions[index].aliases.clear();
  606.         aliases += "|";
  607.         int pos;
  608.         do 
  609.         {
  610.             pos = aliases.Find("|");
  611.  
  612.             CString alias = aliases.Left(pos);
  613.             if (alias != "")
  614.                 pUser->permissions[index].aliases.push_back(alias);
  615.             aliases = aliases.Mid(pos + 1);
  616.         } while (pos != -1);
  617.     }
  618. }