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