1// PrinterProperties.cpp : implementation file
2//
3
4#include "stdafx.h"
5#include "winspool.h"
6
7#include "FileSharing.h"
8#include "PrinterProperties.h"
9#include "BrowseFolders.h"
10#include "DomainUsers.h"
11#include "ManageQueue.h"
12#include "printing.h"
13
14#ifdef _DEBUG
15#define new DEBUG_NEW
16#undef THIS_FILE
17static char THIS_FILE[] = __FILE__;
18#endif
19
20extern bt_printer sharedPrinters[];
21extern unsigned int authServerIP;
22
23
24/////////////////////////////////////////////////////////////////////////////
25// CPrinterProperties dialog
26
27
28CPrinterProperties::CPrinterProperties(CWnd* pParent /*=NULL*/)
29	: CDialog(CPrinterProperties::IDD, pParent)
30{
31	//{{AFX_DATA_INIT(CPrinterProperties)
32	m_printerName = _T("");
33	m_queuePath = _T("");
34	//}}AFX_DATA_INIT
35}
36
37
38void CPrinterProperties::DoDataExchange(CDataExchange* pDX)
39{
40	CDialog::DoDataExchange(pDX);
41	//{{AFX_DATA_MAP(CPrinterProperties)
42	DDX_Control(pDX, IDC_PRINTER_TYPE, m_printerType);
43	DDX_Control(pDX, IDC_PRINTER_NAME, m_nameCtrl);
44	DDX_Control(pDX, IDOK, m_okayBtn);
45	DDX_Control(pDX, IDC_PRINTER_REMOVE, m_removeBtn);
46	DDX_Control(pDX, IDC_PRINTER_HEADING, m_heading);
47	DDX_Control(pDX, IDC_DOMAIN_HEADING, m_domainHeading);
48	DDX_Control(pDX, IDC_PRINTER_DEVICE, m_device);
49	DDX_Control(pDX, IDC_PRINTER_ADD, m_addBtn);
50	DDX_Control(pDX, IDC_DOMAIN_USERS, m_userList);
51	DDX_Text(pDX, IDC_PRINTER_NAME, m_printerName);
52	DDX_Text(pDX, IDC_QUEUE_PATH, m_queuePath);
53	//}}AFX_DATA_MAP
54	DDX_Control(pDX, IDC_PRINTER_MODEL, m_printerModel);
55}
56
57
58BEGIN_MESSAGE_MAP(CPrinterProperties, CDialog)
59	//{{AFX_MSG_MAP(CPrinterProperties)
60	ON_NOTIFY(NM_CLICK, IDC_DOMAIN_USERS, OnClickDomainUsers)
61	ON_BN_CLICKED(IDC_PRINTER_ADD, OnPrinterAdd)
62	ON_BN_CLICKED(IDC_PRINTER_REMOVE, OnPrinterRemove)
63	ON_BN_CLICKED(IDC_MANAGE, OnManage)
64	//}}AFX_MSG_MAP
65	ON_BN_CLICKED(IDC_PRINTER_BROWSE, OnBnClickedPrinterBrowse)
66	ON_CBN_SELCHANGE(IDC_PRINTER_TYPE, OnCbnSelchangePrinterType)
67END_MESSAGE_MAP()
68
69/////////////////////////////////////////////////////////////////////////////
70// CPrinterProperties message handlers
71
72int CPrinterProperties::ShowProperties(int nIndex)
73{
74	m_nIndex = nIndex;
75	return DoModal();
76}
77
78BOOL CPrinterProperties::OnInitDialog()
79{
80	m_printerName = sharedPrinters[m_nIndex].printerName;
81	m_queuePath = sharedPrinters[m_nIndex].spoolDir;
82
83	CDialog::OnInitDialog();
84	SetWindowText(sharedPrinters[m_nIndex].printerName);
85	m_heading.SetWindowText(sharedPrinters[m_nIndex].printerName);
86
87	m_hBoldFont = InitializeControlFont("Tahoma", FW_BOLD, 8);
88	m_heading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0));
89	m_domainHeading.SendMessage(WM_SETFONT, (WPARAM) m_hBoldFont, MAKELPARAM(TRUE, 0));
90
91	m_userList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
92	m_userList.InsertColumn(0, "User or Group", LVCFMT_LEFT, 175);
93	m_userList.InsertColumn(1, "Access", LVCFMT_LEFT, 100);
94
95	m_nameCtrl.SetSel(0, -1);
96	m_nameCtrl.SetFocus();
97
98	m_okayBtn.EnableWindow(!m_printerName.IsEmpty() && !m_queuePath.IsEmpty());
99	m_addBtn.EnableWindow(authServerIP != 0);
100
101	CBitmap user, group;
102	user.LoadBitmap(IDB_USER);
103	group.LoadBitmap(IDB_GROUP);
104
105	m_images.Create(16, 16, FALSE, 2, 0);
106	m_images.Add(&user, (COLORREF) 0);
107	m_images.Add(&group, (COLORREF) 0);
108	m_userList.SetImageList(&m_images, LVSIL_SMALL);
109
110	AddUserList();
111	BuildPrinterList();
112	m_device.SelectString(-1, sharedPrinters[m_nIndex].deviceName);
113
114	m_printerType.AddString(PRT_TYPE_LASERJET);
115	m_printerType.AddString(PRT_TYPE_INKJET);
116	m_printerType.AddString(PRT_TYPE_POSTSCRIPT);
117	m_printerType.AddString(PRT_TYPE_EPSON_STYLUS);
118
119	if (m_printerType.SelectString(-1, sharedPrinters[m_nIndex].deviceType) == CB_ERR)
120		m_printerType.SelectString(-1, PRT_TYPE_LASERJET);
121
122	OnCbnSelchangePrinterType();
123	return FALSE;
124}
125
126void CPrinterProperties::AddUserList()
127{
128	bt_user_rights *ur;
129	int nItem;
130
131	if (sharedPrinters[m_nIndex].security != BT_AUTH_NONE)
132		for (ur = sharedPrinters[m_nIndex].rights; ur; ur = ur->next)
133		{
134			char access[50];
135			access[0] = 0;
136			if (ur->rights & BT_RIGHTS_PRINT)
137				strcpy(access, "Print");
138
139			nItem = m_userList.InsertItem(0, ur->user, ur->isGroup ? 1 : 0);
140			m_userList.SetItemText(nItem, 1, access);
141		}
142}
143
144void CPrinterProperties::BuildPrinterList()
145{
146	PRINTER_INFO_1 netPrinters[BT_MAX_PRINTER_SHARES];
147	PRINTER_INFO_5 printers[BT_MAX_PRINTER_SHARES];
148	DWORD bytesCopied, structsCopied;
149	int i;
150
151	if (EnumPrinters(PRINTER_ENUM_NAME, NULL, 5, (LPBYTE) printers, sizeof(printers), &bytesCopied, &structsCopied))
152		for (i = 0; i < structsCopied; i++)
153			m_device.AddString(printers[i].pPrinterName);
154
155	if (EnumPrinters(PRINTER_ENUM_CONNECTIONS, NULL, 1, (LPBYTE) netPrinters, sizeof(netPrinters), &bytesCopied, &structsCopied))
156		for (i = 0; i < structsCopied; i++)
157			m_device.AddString(netPrinters[i].pName);
158}
159
160void CPrinterProperties::OnClickDomainUsers(NMHDR* pNMHDR, LRESULT* pResult)
161{
162	*pResult = 0;
163	m_removeBtn.EnableWindow(GetSelectedListItem(&m_userList) != -1);
164}
165
166void CPrinterProperties::OnPrinterAdd()
167{
168	CDomainUsers users;
169	char access[50];
170	int nItem;
171
172	if (users.ShowUsers(true) == IDOK)
173	{
174		CString user = users.GetUser();
175		int nRights = users.GetRights();
176		bool isGroup = users.IsGroup();
177
178		SaveUserRights(LPCTSTR(user), nRights, isGroup);
179
180		access[0] = 0;
181		if (nRights & BT_RIGHTS_PRINT)
182			strcpy(access, "Print");
183
184		nItem = m_userList.InsertItem(0, user, isGroup ? 1 : 0);
185		m_userList.SetItemText(nItem, 1, access);
186	}
187}
188
189void CPrinterProperties::OnPrinterRemove()
190{
191	bt_user_rights *ur, *lastUR;
192	int nItem = GetSelectedListItem(&m_userList);
193	CString user = m_userList.GetItemText(nItem, 0);
194
195	lastUR = NULL;
196	for (ur = sharedPrinters[m_nIndex].rights; ur; ur = ur->next)
197		if (strcmp(ur->user, user) == 0)
198		{
199			if (lastUR)
200				lastUR->next = ur->next;
201			else
202				sharedPrinters[m_nIndex].rights = ur->next;
203
204			free(ur);
205			m_userList.DeleteItem(nItem);
206			break;
207		}
208		else
209			lastUR = ur;
210}
211
212void CPrinterProperties::SaveUserRights(const char *user, int rights, bool isGroup)
213{
214	bt_user_rights *ur;
215
216	if (user == NULL || rights == 0)
217		return;
218
219	for (ur = sharedPrinters[m_nIndex].rights; ur; ur = ur->next)
220		if (strcmp(ur->user, user) == 0)
221		{
222			ur->rights = rights;
223			return;
224		}
225
226	ur = (bt_user_rights *) malloc(sizeof(bt_user_rights));
227	if (ur)
228	{
229		ur->user = (char *) malloc(strlen(user) + 1);
230		if (ur->user)
231		{
232			strcpy(ur->user, user);
233			ur->rights = rights;
234			ur->isGroup = isGroup;
235			ur->next = sharedPrinters[m_nIndex].rights;
236			sharedPrinters[m_nIndex].rights = ur;
237		}
238		else
239			free(ur);
240	}
241}
242
243void CPrinterProperties::OnOK()
244{
245	CString itemName;
246	int item;
247
248	CDialog::OnOK();
249
250	strcpy(sharedPrinters[m_nIndex].printerName, m_printerName);
251	strcpy(sharedPrinters[m_nIndex].spoolDir, m_queuePath);
252
253	item = m_device.GetCurSel();
254	m_device.GetLBText(item, itemName);
255	strcpy(sharedPrinters[m_nIndex].deviceName, itemName);
256
257	item = m_printerType.GetCurSel();
258	m_printerType.GetLBText(item, itemName);
259	strcpy(sharedPrinters[m_nIndex].deviceType, itemName);
260}
261
262void CPrinterProperties::OnManage()
263{
264	CManageQueue queueDlg;
265	queueDlg.ShowQueue(&sharedPrinters[m_nIndex]);
266}
267
268void CPrinterProperties::OnBnClickedPrinterBrowse()
269{
270	CBrowseFolders browser;
271	CWaitCursor wait;
272	if (browser.SelectFolder(m_queuePath) == IDOK)
273	{
274		m_queuePath = browser.GetPath();
275		UpdateData(FALSE);
276	}
277}
278
279void CPrinterProperties::OnCbnSelchangePrinterType()
280{
281	CString itemName;
282	int item;
283
284	UpdateData(TRUE);
285	m_printerModel.ResetContent();
286
287	item = m_printerType.GetCurSel();
288	m_printerType.GetLBText(item, itemName);
289	if (itemName.CompareNoCase(PRT_TYPE_LASERJET) == 0)
290		m_printerModel.EnableWindow(FALSE);
291	else
292	{
293		m_printerModel.EnableWindow(TRUE);
294
295	}
296}
297