1// ShareProperties.cpp : implementation file 2// 3 4#include "stdafx.h" 5 6#include "FileSharing.h" 7#include "ShareProperties.h" 8#include "BrowseFolders.h" 9#include "DomainUsers.h" 10 11#ifdef _DEBUG 12#define new DEBUG_NEW 13#undef THIS_FILE 14static char THIS_FILE[] = __FILE__; 15#endif 16 17extern bt_fileShare_t fileShares[]; 18extern unsigned int authServerIP; 19 20 21///////////////////////////////////////////////////////////////////////////// 22// CShareProperties dialog 23 24 25CShareProperties::CShareProperties(CWnd* pParent /*=NULL*/) 26 : CDialog(CShareProperties::IDD, pParent) 27{ 28 //{{AFX_DATA_INIT(CShareProperties) 29 m_bLinks = FALSE; 30 m_bReadWrite = FALSE; 31 m_shareName = _T(""); 32 m_sharePath = _T(""); 33 //}}AFX_DATA_INIT 34} 35 36 37void CShareProperties::DoDataExchange(CDataExchange* pDX) 38{ 39 CDialog::DoDataExchange(pDX); 40 //{{AFX_DATA_MAP(CShareProperties) 41 DDX_Control(pDX, IDC_SHARE_ADD, m_addBtn); 42 DDX_Control(pDX, IDC_SHARE_REMOVE, m_removeBtn); 43 DDX_Control(pDX, IDC_DOMAIN_USERS, m_userList); 44 DDX_Control(pDX, IDC_DOMAIN_HEADING, m_domainHeading); 45 DDX_Control(pDX, IDC_OPTIONS_HEADING, m_optionsHeading); 46 DDX_Control(pDX, IDC_SHARE_NAME, m_nameCtrl); 47 DDX_Control(pDX, IDOK, m_okayBtn); 48 DDX_Control(pDX, IDC_SHARE_HEADING, m_heading); 49 DDX_Check(pDX, IDC_SHARE_LINKS, m_bLinks); 50 DDX_Check(pDX, IDC_SHARE_WRITE, m_bReadWrite); 51 DDX_Text(pDX, IDC_SHARE_NAME, m_shareName); 52 DDX_Text(pDX, IDC_SHARE_PATH, m_sharePath); 53 //}}AFX_DATA_MAP 54} 55 56 57BEGIN_MESSAGE_MAP(CShareProperties, CDialog) 58 //{{AFX_MSG_MAP(CShareProperties) 59 ON_BN_CLICKED(IDC_SHARE_BROWSE, OnShareBrowse) 60 ON_EN_CHANGE(IDC_SHARE_NAME, OnChangeShareName) 61 ON_EN_CHANGE(IDC_SHARE_PATH, OnChangeSharePath) 62 ON_NOTIFY(NM_CLICK, IDC_DOMAIN_USERS, OnClickDomainUsers) 63 ON_BN_CLICKED(IDC_SHARE_ADD, OnShareAdd) 64 ON_BN_CLICKED(IDC_SHARE_REMOVE, OnShareRemove) 65 //}}AFX_MSG_MAP 66END_MESSAGE_MAP() 67 68///////////////////////////////////////////////////////////////////////////// 69// CShareProperties message handlers 70 71BOOL CShareProperties::OnInitDialog() 72{ 73 m_shareName = fileShares[m_nIndex].name; 74 m_sharePath = fileShares[m_nIndex].path; 75 m_bReadWrite = !fileShares[m_nIndex].readOnly; 76 m_bLinks = FALSE; 77 78 CDialog::OnInitDialog(); 79 SetWindowText(fileShares[m_nIndex].name); 80 m_heading.SetWindowText(fileShares[m_nIndex].name); 81 82 m_hBoldFont = InitializeControlFont("Tahoma", FW_BOLD, 8); 83 m_heading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0)); 84 m_optionsHeading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0)); 85 m_domainHeading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0)); 86 87 m_userList.SetExtendedStyle(LVS_EX_FULLROWSELECT); 88 m_userList.InsertColumn(0, "User or Group", LVCFMT_LEFT, 175); 89 m_userList.InsertColumn(1, "Access", LVCFMT_LEFT, 100); 90 91 m_nameCtrl.SetSel(0, -1); 92 m_nameCtrl.SetFocus(); 93 94 m_okayBtn.EnableWindow(!m_shareName.IsEmpty() && !m_sharePath.IsEmpty()); 95 m_addBtn.EnableWindow(authServerIP != 0); 96 97 CBitmap user, group; 98 user.LoadBitmap(IDB_USER); 99 group.LoadBitmap(IDB_GROUP); 100 101 m_images.Create(16, 16, FALSE, 2, 0); 102 m_images.Add(&user, (COLORREF) 0); 103 m_images.Add(&group, (COLORREF) 0); 104 m_userList.SetImageList(&m_images, LVSIL_SMALL); 105 106 AddUserList(); 107 108 return FALSE; 109} 110 111void CShareProperties::OnShareBrowse() 112{ 113 CBrowseFolders browser; 114 CWaitCursor wait; 115 if (browser.SelectFolder(m_sharePath) == IDOK) 116 { 117 m_sharePath = browser.GetPath(); 118 UpdateData(FALSE); 119 } 120} 121 122void CShareProperties::OnChangeShareName() 123{ 124 UpdateData(TRUE); 125 m_okayBtn.EnableWindow(!m_shareName.IsEmpty()); 126} 127 128void CShareProperties::OnChangeSharePath() 129{ 130 UpdateData(TRUE); 131 m_okayBtn.EnableWindow(!m_sharePath.IsEmpty()); 132} 133 134void CShareProperties::OnOK() 135{ 136 CDialog::OnOK(); 137 138 strcpy(fileShares[m_nIndex].name, m_shareName); 139 strcpy(fileShares[m_nIndex].path, m_sharePath); 140 fileShares[m_nIndex].readOnly = !m_bReadWrite; 141 fileShares[m_nIndex].followLinks = m_bLinks ? 1 : 0; 142} 143 144int CShareProperties::ShowProperties(int nIndex) 145{ 146 m_nIndex = nIndex; 147 return DoModal(); 148} 149 150void CShareProperties::AddUserList() 151{ 152 bt_user_rights *ur; 153 int nItem; 154 155 if (fileShares[m_nIndex].security != BT_AUTH_NONE) 156 for (ur = fileShares[m_nIndex].rights; ur; ur = ur->next) 157 { 158 char access[50]; 159 access[0] = 0; 160 if (ur->rights & BT_RIGHTS_READ) 161 strcat(access, "Read "); 162 if (ur->rights & BT_RIGHTS_WRITE) 163 strcat(access, "Write"); 164 165 nItem = m_userList.InsertItem(0, ur->user, ur->isGroup ? 1 : 0); 166 m_userList.SetItemText(nItem, 1, access); 167 } 168} 169 170void CShareProperties::OnClickDomainUsers(NMHDR* pNMHDR, LRESULT* pResult) 171{ 172 *pResult = 0; 173 m_removeBtn.EnableWindow(GetSelectedListItem(&m_userList) != -1); 174} 175 176void CShareProperties::OnShareAdd() 177{ 178 CDomainUsers users; 179 char access[50]; 180 int nItem; 181 182 if (users.DoModal() == IDOK) 183 { 184 CString user = users.GetUser(); 185 int nRights = users.GetRights(); 186 bool isGroup = users.IsGroup(); 187 188 SaveUserRights(LPCTSTR(user), nRights, isGroup); 189 190 access[0] = 0; 191 if (nRights & BT_RIGHTS_READ) 192 strcat(access, "Read "); 193 if (nRights & BT_RIGHTS_WRITE) 194 strcat(access, "Write"); 195 196 nItem = m_userList.InsertItem(0, user, isGroup ? 1 : 0); 197 m_userList.SetItemText(nItem, 1, access); 198 } 199} 200 201void CShareProperties::OnShareRemove() 202{ 203 bt_user_rights *ur, *lastUR; 204 int nItem = GetSelectedListItem(&m_userList); 205 CString user = m_userList.GetItemText(nItem, 0); 206 207 lastUR = NULL; 208 for (ur = fileShares[m_nIndex].rights; ur; ur = ur->next) 209 if (strcmp(ur->user, user) == 0) 210 { 211 if (lastUR) 212 lastUR->next = ur->next; 213 else 214 fileShares[m_nIndex].rights = ur->next; 215 216 free(ur); 217 m_userList.DeleteItem(nItem); 218 break; 219 } 220 else 221 lastUR = ur; 222} 223 224void CShareProperties::SaveUserRights(const char *user, int rights, bool isGroup) 225{ 226 bt_user_rights *ur; 227 228 if (user == NULL || rights == 0) 229 return; 230 231 for (ur = fileShares[m_nIndex].rights; ur; ur = ur->next) 232 if (strcmp(ur->user, user) == 0) 233 { 234 ur->rights = rights; 235 return; 236 } 237 238 ur = (bt_user_rights *) malloc(sizeof(bt_user_rights)); 239 if (ur) 240 { 241 ur->user = (char *) malloc(strlen(user) + 1); 242 if (ur->user) 243 { 244 strcpy(ur->user, user); 245 ur->rights = rights; 246 ur->isGroup = isGroup; 247 ur->next = fileShares[m_nIndex].rights; 248 fileShares[m_nIndex].rights = ur; 249 } 250 else 251 free(ur); 252 } 253} 254