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