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