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