Added comments.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3768 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -166,6 +166,8 @@ Printer::Printer(const BDirectory* node, Resource* res)
|
|||||||
|
|
||||||
// Add us to the global list of known printer definitions
|
// Add us to the global list of known printer definitions
|
||||||
sPrinters.AddItem(this);
|
sPrinters.AddItem(this);
|
||||||
|
|
||||||
|
ResetJobStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
Printer::~Printer()
|
Printer::~Printer()
|
||||||
@@ -388,6 +390,15 @@ status_t Printer::LoadPrinterAddon(image_id& id)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// AddCurrentPrinter
|
||||||
|
//
|
||||||
|
// Add printer name to message.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// msg - message.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
void Printer::AddCurrentPrinter(BMessage* msg)
|
void Printer::AddCurrentPrinter(BMessage* msg)
|
||||||
{
|
{
|
||||||
BString name;
|
BString name;
|
||||||
@@ -399,6 +410,15 @@ void Printer::AddCurrentPrinter(BMessage* msg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// MessageReceived
|
||||||
|
//
|
||||||
|
// Handle scripting messages.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// msg - message.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
void Printer::MessageReceived(BMessage* msg)
|
void Printer::MessageReceived(BMessage* msg)
|
||||||
{
|
{
|
||||||
switch(msg->what) {
|
switch(msg->what) {
|
||||||
@@ -416,11 +436,46 @@ void Printer::MessageReceived(BMessage* msg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// GetName
|
||||||
|
//
|
||||||
|
// Get the name from spool directory.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// name - the name of the printer.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
void Printer::GetName(BString& name) {
|
void Printer::GetName(BString& name) {
|
||||||
if (B_OK != SpoolDir()->ReadAttrString(PSRV_PRINTER_ATTR_PRT_NAME, &name))
|
if (B_OK != SpoolDir()->ReadAttrString(PSRV_PRINTER_ATTR_PRT_NAME, &name))
|
||||||
name = "Unknown Printer";
|
name = "Unknown Printer";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// ResetJobStatus
|
||||||
|
//
|
||||||
|
// Reset status of "processing" jobs to "waiting" at print_server start.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
void Printer::ResetJobStatus() {
|
||||||
|
if (fPrinter.Lock()) {
|
||||||
|
const int32 n = fPrinter.CountJobs();
|
||||||
|
for (int32 i = 0; i < n; i ++) {
|
||||||
|
Job* job = fPrinter.JobAt(i);
|
||||||
|
if (job->Status() == kProcessing) job->SetStatus(kWaiting);
|
||||||
|
}
|
||||||
|
fPrinter.Unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// HasCurrentPrinter
|
||||||
|
//
|
||||||
|
// Try to read the printer name from job file.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// name - the printer name.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if successful.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
bool Printer::HasCurrentPrinter(BString& name) {
|
bool Printer::HasCurrentPrinter(BString& name) {
|
||||||
BMessage settings;
|
BMessage settings;
|
||||||
// read settings from spool file and get printer name
|
// read settings from spool file and get printer name
|
||||||
@@ -431,6 +486,17 @@ bool Printer::HasCurrentPrinter(BString& name) {
|
|||||||
settings.FindString(PSRV_FIELD_CURRENT_PRINTER, &name) == B_OK;
|
settings.FindString(PSRV_FIELD_CURRENT_PRINTER, &name) == B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// MoveJob
|
||||||
|
//
|
||||||
|
// Try to move job to another printer folder.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// name - the printer folder name.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if successful.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
bool Printer::MoveJob(const BString& name) {
|
bool Printer::MoveJob(const BString& name) {
|
||||||
BPath file(&fJob->EntryRef());
|
BPath file(&fJob->EntryRef());
|
||||||
BPath path;
|
BPath path;
|
||||||
@@ -442,6 +508,20 @@ bool Printer::MoveJob(const BString& name) {
|
|||||||
return entry.MoveTo(&dir) == B_OK;
|
return entry.MoveTo(&dir) == B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// FindSpooledJob
|
||||||
|
//
|
||||||
|
// Looks if there is a job waiting to be processed and moves
|
||||||
|
// jobs to the proper printer folder.
|
||||||
|
//
|
||||||
|
// Note:
|
||||||
|
// Our implementation of BPrintJob moves jobs to the
|
||||||
|
// proper printer folder.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if there is a job present in fJob.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
bool Printer::FindSpooledJob() {
|
bool Printer::FindSpooledJob() {
|
||||||
BString name2;
|
BString name2;
|
||||||
GetName(name2);
|
GetName(name2);
|
||||||
@@ -450,9 +530,11 @@ bool Printer::FindSpooledJob() {
|
|||||||
if (fJob) {
|
if (fJob) {
|
||||||
BString name;
|
BString name;
|
||||||
if (HasCurrentPrinter(name) && name != name2 && MoveJob(name)) {
|
if (HasCurrentPrinter(name) && name != name2 && MoveJob(name)) {
|
||||||
|
// job in wrong printer folder moved to apropriate one
|
||||||
fJob->SetStatus(kUnknown, false); // so that fPrinter.GetNextJob skips it
|
fJob->SetStatus(kUnknown, false); // so that fPrinter.GetNextJob skips it
|
||||||
fJob->Release();
|
fJob->Release();
|
||||||
} else {
|
} else {
|
||||||
|
// job found
|
||||||
fJob->SetPrinter(this);
|
fJob->SetPrinter(this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -461,6 +543,18 @@ bool Printer::FindSpooledJob() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// PrintSpooledJob
|
||||||
|
//
|
||||||
|
// Loads the printer add-on and calls its take_job function with
|
||||||
|
// the spool file as argument.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// spoolFile - the spool file.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// B_OK if successful.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
status_t Printer::PrintSpooledJob(BFile* spoolFile)
|
status_t Printer::PrintSpooledJob(BFile* spoolFile)
|
||||||
{
|
{
|
||||||
take_job_func_t func;
|
take_job_func_t func;
|
||||||
@@ -491,6 +585,15 @@ status_t Printer::PrintSpooledJob(BFile* spoolFile)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// PrintThread
|
||||||
|
//
|
||||||
|
// Loads the printer add-on and calls its take_job function with
|
||||||
|
// the spool file as argument.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// job - the spool job.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
void Printer::PrintThread(Job* job) {
|
void Printer::PrintThread(Job* job) {
|
||||||
// Wait until resource is available
|
// Wait until resource is available
|
||||||
fResource->Lock();
|
fResource->Lock();
|
||||||
@@ -514,12 +617,29 @@ void Printer::PrintThread(Job* job) {
|
|||||||
be_app_messenger.SendMessage(PSRV_PRINT_SPOOLED_JOB);
|
be_app_messenger.SendMessage(PSRV_PRINT_SPOOLED_JOB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// print_thread
|
||||||
|
//
|
||||||
|
// Print thread entry, calls PrintThread with spool job.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// data - spool job.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// 0 always.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
status_t Printer::print_thread(void* data) {
|
status_t Printer::print_thread(void* data) {
|
||||||
Job* job = static_cast<Job*>(data);
|
Job* job = static_cast<Job*>(data);
|
||||||
job->GetPrinter()->PrintThread(job);
|
job->GetPrinter()->PrintThread(job);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// StartPrintThread
|
||||||
|
//
|
||||||
|
// Sets the status of the current spool job to "processing" and
|
||||||
|
// starts the print_thread.
|
||||||
|
// ---------------------------------------------------------------
|
||||||
void Printer::StartPrintThread() {
|
void Printer::StartPrintThread() {
|
||||||
Acquire();
|
Acquire();
|
||||||
thread_id tid = spawn_thread(print_thread, "print", B_NORMAL_PRIORITY, (void*)fJob);
|
thread_id tid = spawn_thread(print_thread, "print", B_NORMAL_PRIORITY, (void*)fJob);
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ private:
|
|||||||
// Accessor
|
// Accessor
|
||||||
BDirectory* SpoolDir() { return fPrinter.GetSpoolDir(); }
|
BDirectory* SpoolDir() { return fPrinter.GetSpoolDir(); }
|
||||||
|
|
||||||
|
void ResetJobStatus();
|
||||||
bool HasCurrentPrinter(BString& name);
|
bool HasCurrentPrinter(BString& name);
|
||||||
bool MoveJob(const BString& name);
|
bool MoveJob(const BString& name);
|
||||||
// Get next spooled job if any
|
// Get next spooled job if any
|
||||||
|
|||||||
Reference in New Issue
Block a user