1// ManageQueue.cpp : implementation file 2// 3 4#include "stdafx.h" 5 6#include "FileSharing.h" 7#include "ManageQueue.h" 8 9#ifdef _DEBUG 10#define new DEBUG_NEW 11#undef THIS_FILE 12static char THIS_FILE[] = __FILE__; 13#endif 14 15///////////////////////////////////////////////////////////////////////////// 16// CManageQueue dialog 17 18 19CManageQueue::CManageQueue(CWnd* pParent /*=NULL*/) 20 : CDialog(CManageQueue::IDD, pParent) 21{ 22 //{{AFX_DATA_INIT(CManageQueue) 23 // NOTE: the ClassWizard will add member initialization here 24 //}}AFX_DATA_INIT 25} 26 27 28void CManageQueue::DoDataExchange(CDataExchange* pDX) 29{ 30 CDialog::DoDataExchange(pDX); 31 //{{AFX_DATA_MAP(CManageQueue) 32 DDX_Control(pDX, IDC_PAUSE_JOB, m_pauseBtn); 33 DDX_Control(pDX, IDC_REMOVE_JOB, m_removeBtn); 34 DDX_Control(pDX, IDC_QUEUE_LIST, m_queue); 35 //}}AFX_DATA_MAP 36} 37 38 39BEGIN_MESSAGE_MAP(CManageQueue, CDialog) 40 //{{AFX_MSG_MAP(CManageQueue) 41 ON_WM_TIMER() 42 ON_NOTIFY(NM_CLICK, IDC_QUEUE_LIST, OnClickQueueList) 43 ON_BN_CLICKED(IDC_PAUSE_JOB, OnPauseJob) 44 ON_BN_CLICKED(IDC_REMOVE_JOB, OnRemoveJob) 45 ON_WM_DESTROY() 46 //}}AFX_MSG_MAP 47END_MESSAGE_MAP() 48 49///////////////////////////////////////////////////////////////////////////// 50// CManageQueue message handlers 51 52int CManageQueue::ShowQueue(bt_printer *printer) 53{ 54 this->printer = printer; 55 return DoModal(); 56} 57 58BOOL CManageQueue::OnInitDialog() 59{ 60 CDialog::OnInitDialog(); 61 SetWindowText(CString(printer->printerName) + " Queue"); 62 63 m_queue.SetExtendedStyle(LVS_EX_FULLROWSELECT); 64 m_queue.InsertColumn(0, "Document Name", LVCFMT_LEFT, 190); 65 m_queue.InsertColumn(1, "Status", LVCFMT_LEFT, 90); 66 m_queue.InsertColumn(2, "Submitted By", LVCFMT_LEFT, 110); 67 m_queue.InsertColumn(3, "Size", LVCFMT_RIGHT, 70); 68 m_queue.InsertColumn(4, "Submitted On", LVCFMT_LEFT, 170); 69 m_queue.InsertColumn(5, "Submitted From", LVCFMT_LEFT, 120); 70 71 BuildJobList(); 72 return TRUE; 73} 74 75void CManageQueue::OnTimer(UINT nIDEvent) 76{ 77 CDialog::OnTimer(nIDEvent); 78} 79 80void CManageQueue::OnClickQueueList(NMHDR* pNMHDR, LRESULT* pResult) 81{ 82 *pResult = 0; 83 84 int nItem = GetSelectedListItem(&m_queue); 85 if (nItem != -1) 86 { 87 CString status = m_queue.GetItemText(nItem, 1); 88 if (status == "Paused...") 89 m_pauseBtn.SetWindowText("&Continue"); 90 else 91 m_pauseBtn.SetWindowText("&Pause"); 92 } 93} 94 95void CManageQueue::OnPauseJob() 96{ 97 int nItem = GetSelectedListItem(&m_queue); 98 if (nItem != -1) 99 { 100 bt_print_job *printJob = (bt_print_job *) m_queue.GetItemData(nItem); 101 if (printJob) 102 { 103 CString status = m_queue.GetItemText(nItem, 1); 104 if (status == "Paused...") 105 { 106 WritePrivateProfileString("PrintJob", "Status", "Scheduling...", printJob->jobFile); 107 m_queue.SetItemText(nItem, 1, "Scheduling..."); 108 m_pauseBtn.SetWindowText("&Pause"); 109 } 110 else 111 { 112 WritePrivateProfileString("PrintJob", "Status", "Paused...", printJob->jobFile); 113 m_queue.SetItemText(nItem, 1, "Paused..."); 114 m_pauseBtn.SetWindowText("&Continue"); 115 } 116 } 117 } 118 119 m_queue.SetFocus(); 120} 121 122void CManageQueue::OnRemoveJob() 123{ 124 char dataFile[B_PATH_NAME_LENGTH]; 125 int nItem = GetSelectedListItem(&m_queue); 126 if (nItem != -1) 127 { 128 bt_print_job *printJob = (bt_print_job *) m_queue.GetItemData(nItem); 129 if (printJob) 130 { 131 GetPrivateProfileString("PrintJob", "DataFile", "", dataFile, sizeof(dataFile), printJob->jobFile); 132 remove(dataFile); 133 remove(printJob->jobFile); 134 } 135 } 136} 137 138void CManageQueue::OnDestroy() 139{ 140 CDialog::OnDestroy(); 141 142 bt_print_job *job = rootJob, *nextJob; 143 while (job) 144 { 145 nextJob = job->next; 146 free(job); 147 job = nextJob; 148 } 149} 150 151void CManageQueue::BuildJobList() 152{ 153 bt_print_job *job; 154 struct _finddata_t fileInfo; 155 char path[B_PATH_NAME_LENGTH]; 156 long int finder, result; 157 158 rootJob = NULL; 159 160 sprintf(path, "%s\\*.job", printer->spoolDir); 161 finder = result = _findfirst(path, &fileInfo); 162 while (result != -1) 163 { 164 // Create the fully-qualified path to this print job file, then check 165 // its status. 166 sprintf(path, "%s\\%s", printer->spoolDir, fileInfo.name); 167 job = AddPrintJob(printer, path); 168 job->next = rootJob; 169 rootJob = job; 170 171 // Get the next print job. 172 result = _findnext(finder, &fileInfo); 173 } 174} 175 176bt_print_job *CManageQueue::AddPrintJob(bt_printer *printer, char *path) 177{ 178 bt_print_job *job; 179 struct stat st; 180 char dataFile[B_PATH_NAME_LENGTH]; 181 char buffer[B_FILE_NAME_LENGTH]; 182 int nItem; 183 184 job = new bt_print_job; 185 job->next = NULL; 186 187 strcpy(job->jobFile, path); 188 189 GetPrivateProfileString("PrintJob", "JobName", "Untitled", job->jobName, sizeof(job->jobName), path); 190 nItem = m_queue.InsertItem(0, job->jobName); 191 m_queue.SetItemData(nItem, (DWORD)(LPVOID) job); 192 193 GetPrivateProfileString("PrintJob", "Status", "", job->status, sizeof(job->status), path); 194 m_queue.SetItemText(nItem, 1, job->status); 195 196 GetPrivateProfileString("PrintJob", "User", "Unknown", job->sourceUser, sizeof(job->sourceUser), path); 197 m_queue.SetItemText(nItem, 2, job->sourceUser); 198 199 GetPrivateProfileString("PrintJob", "DataFile", "", buffer, sizeof(buffer), path); 200 sprintf(dataFile, "%s\\%s", printer->spoolDir, buffer); 201 if (stat(dataFile, &st) == 0) 202 { 203 if (st.st_size > 1024 * 1024) 204 sprintf(buffer, "%.2f MB", (float) st.st_size / (1024.0 * 1024.0)); 205 else if (st.st_size > 1024) 206 sprintf(buffer, "%d KB", st.st_size / 1024); 207 else 208 sprintf(buffer, "%d", st.st_size); 209 210 m_queue.SetItemText(nItem, 3, buffer); 211 212 struct tm *time = localtime(&st.st_ctime); 213 strftime(buffer, sizeof(buffer), "%a %b %d, %Y at %I:%M %p", time); 214 m_queue.SetItemText(nItem, 4, buffer); 215 } 216 217 GetPrivateProfileString("PrintJob", "Source", "Unknown", buffer, sizeof(buffer), path); 218 m_queue.SetItemText(nItem, 5, buffer); 219 job->sourceAddr = inet_addr(buffer); 220 221 return job; 222} 223