#include "stdafx.h"
#include "FileSharing.h"
#include "ShareProperties.h"
#include "BrowseFolders.h"
#include "DomainUsers.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern bt_fileShare_t fileShares[];
extern unsigned int authServerIP;
CShareProperties::CShareProperties(CWnd* pParent )
: CDialog(CShareProperties::IDD, pParent)
{
m_bLinks = FALSE;
m_bReadWrite = FALSE;
m_shareName = _T("");
m_sharePath = _T("");
}
void CShareProperties::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SHARE_ADD, m_addBtn);
DDX_Control(pDX, IDC_SHARE_REMOVE, m_removeBtn);
DDX_Control(pDX, IDC_DOMAIN_USERS, m_userList);
DDX_Control(pDX, IDC_DOMAIN_HEADING, m_domainHeading);
DDX_Control(pDX, IDC_OPTIONS_HEADING, m_optionsHeading);
DDX_Control(pDX, IDC_SHARE_NAME, m_nameCtrl);
DDX_Control(pDX, IDOK, m_okayBtn);
DDX_Control(pDX, IDC_SHARE_HEADING, m_heading);
DDX_Check(pDX, IDC_SHARE_LINKS, m_bLinks);
DDX_Check(pDX, IDC_SHARE_WRITE, m_bReadWrite);
DDX_Text(pDX, IDC_SHARE_NAME, m_shareName);
DDX_Text(pDX, IDC_SHARE_PATH, m_sharePath);
}
BEGIN_MESSAGE_MAP(CShareProperties, CDialog)
ON_BN_CLICKED(IDC_SHARE_BROWSE, OnShareBrowse)
ON_EN_CHANGE(IDC_SHARE_NAME, OnChangeShareName)
ON_EN_CHANGE(IDC_SHARE_PATH, OnChangeSharePath)
ON_NOTIFY(NM_CLICK, IDC_DOMAIN_USERS, OnClickDomainUsers)
ON_BN_CLICKED(IDC_SHARE_ADD, OnShareAdd)
ON_BN_CLICKED(IDC_SHARE_REMOVE, OnShareRemove)
END_MESSAGE_MAP()
BOOL CShareProperties::OnInitDialog()
{
m_shareName = fileShares[m_nIndex].name;
m_sharePath = fileShares[m_nIndex].path;
m_bReadWrite = !fileShares[m_nIndex].readOnly;
m_bLinks = FALSE;
CDialog::OnInitDialog();
SetWindowText(fileShares[m_nIndex].name);
m_heading.SetWindowText(fileShares[m_nIndex].name);
m_hBoldFont = InitializeControlFont("Tahoma", FW_BOLD, 8);
m_heading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0));
m_optionsHeading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0));
m_domainHeading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0));
m_userList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_userList.InsertColumn(0, "User or Group", LVCFMT_LEFT, 175);
m_userList.InsertColumn(1, "Access", LVCFMT_LEFT, 100);
m_nameCtrl.SetSel(0, -1);
m_nameCtrl.SetFocus();
m_okayBtn.EnableWindow(!m_shareName.IsEmpty() && !m_sharePath.IsEmpty());
m_addBtn.EnableWindow(authServerIP != 0);
CBitmap user, group;
user.LoadBitmap(IDB_USER);
group.LoadBitmap(IDB_GROUP);
m_images.Create(16, 16, FALSE, 2, 0);
m_images.Add(&user, (COLORREF) 0);
m_images.Add(&group, (COLORREF) 0);
m_userList.SetImageList(&m_images, LVSIL_SMALL);
AddUserList();
return FALSE;
}
void CShareProperties::OnShareBrowse()
{
CBrowseFolders browser;
CWaitCursor wait;
if (browser.SelectFolder(m_sharePath) == IDOK)
{
m_sharePath = browser.GetPath();
UpdateData(FALSE);
}
}
void CShareProperties::OnChangeShareName()
{
UpdateData(TRUE);
m_okayBtn.EnableWindow(!m_shareName.IsEmpty());
}
void CShareProperties::OnChangeSharePath()
{
UpdateData(TRUE);
m_okayBtn.EnableWindow(!m_sharePath.IsEmpty());
}
void CShareProperties::OnOK()
{
CDialog::OnOK();
strcpy(fileShares[m_nIndex].name, m_shareName);
strcpy(fileShares[m_nIndex].path, m_sharePath);
fileShares[m_nIndex].readOnly = !m_bReadWrite;
fileShares[m_nIndex].followLinks = m_bLinks ? 1 : 0;
}
int CShareProperties::ShowProperties(int nIndex)
{
m_nIndex = nIndex;
return DoModal();
}
void CShareProperties::AddUserList()
{
bt_user_rights *ur;
int nItem;
if (fileShares[m_nIndex].security != BT_AUTH_NONE)
for (ur = fileShares[m_nIndex].rights; ur; ur = ur->next)
{
char access[50];
access[0] = 0;
if (ur->rights & BT_RIGHTS_READ)
strcat(access, "Read ");
if (ur->rights & BT_RIGHTS_WRITE)
strcat(access, "Write");
nItem = m_userList.InsertItem(0, ur->user, ur->isGroup ? 1 : 0);
m_userList.SetItemText(nItem, 1, access);
}
}
void CShareProperties::OnClickDomainUsers(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
m_removeBtn.EnableWindow(GetSelectedListItem(&m_userList) != -1);
}
void CShareProperties::OnShareAdd()
{
CDomainUsers users;
char access[50];
int nItem;
if (users.DoModal() == IDOK)
{
CString user = users.GetUser();
int nRights = users.GetRights();
bool isGroup = users.IsGroup();
SaveUserRights(LPCTSTR(user), nRights, isGroup);
access[0] = 0;
if (nRights & BT_RIGHTS_READ)
strcat(access, "Read ");
if (nRights & BT_RIGHTS_WRITE)
strcat(access, "Write");
nItem = m_userList.InsertItem(0, user, isGroup ? 1 : 0);
m_userList.SetItemText(nItem, 1, access);
}
}
void CShareProperties::OnShareRemove()
{
bt_user_rights *ur, *lastUR;
int nItem = GetSelectedListItem(&m_userList);
CString user = m_userList.GetItemText(nItem, 0);
lastUR = NULL;
for (ur = fileShares[m_nIndex].rights; ur; ur = ur->next)
if (strcmp(ur->user, user) == 0)
{
if (lastUR)
lastUR->next = ur->next;
else
fileShares[m_nIndex].rights = ur->next;
free(ur);
m_userList.DeleteItem(nItem);
break;
}
else
lastUR = ur;
}
void CShareProperties::SaveUserRights(const char *user, int rights, bool isGroup)
{
bt_user_rights *ur;
if (user == NULL || rights == 0)
return;
for (ur = fileShares[m_nIndex].rights; ur; ur = ur->next)
if (strcmp(ur->user, user) == 0)
{
ur->rights = rights;
return;
}
ur = (bt_user_rights *) malloc(sizeof(bt_user_rights));
if (ur)
{
ur->user = (char *) malloc(strlen(user) + 1);
if (ur->user)
{
strcpy(ur->user, user);
ur->rights = rights;
ur->isGroup = isGroup;
ur->next = fileShares[m_nIndex].rights;
fileShares[m_nIndex].rights = ur;
}
else
free(ur);
}
}