Some more work on BPrintJob.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13763 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -7,12 +7,16 @@
|
|||||||
Stefano Ceccherini ([email protected])
|
Stefano Ceccherini ([email protected])
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <Alert.h>
|
||||||
|
#include <Application.h>
|
||||||
|
#include <Debug.h>
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
#include <FindDirectory.h>
|
#include <FindDirectory.h>
|
||||||
#include <Messenger.h>
|
#include <Messenger.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
#include <PrintJob.h>
|
#include <PrintJob.h>
|
||||||
|
#include <Roster.h>
|
||||||
#include <View.h>
|
#include <View.h>
|
||||||
|
|
||||||
#include <pr_server.h>
|
#include <pr_server.h>
|
||||||
@@ -46,6 +50,7 @@ BPrintJob::BPrintJob(const char *job_name)
|
|||||||
default_setup_msg(NULL),
|
default_setup_msg(NULL),
|
||||||
m_curPageHeader(NULL)
|
m_curPageHeader(NULL)
|
||||||
{
|
{
|
||||||
|
memset(¤t_header, 0, sizeof(current_header));
|
||||||
if (job_name != NULL)
|
if (job_name != NULL)
|
||||||
print_job_name = strdup(job_name);
|
print_job_name = strdup(job_name);
|
||||||
}
|
}
|
||||||
@@ -85,6 +90,7 @@ BPrintJob::BeginJob()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
stop_the_show = 0;
|
stop_the_show = 0;
|
||||||
|
page_number = 0;
|
||||||
|
|
||||||
strncpy(spool_file_name, path.Path(), sizeof(spool_file_name));
|
strncpy(spool_file_name, path.Path(), sizeof(spool_file_name));
|
||||||
spoolFile = new BFile(spool_file_name, B_READ_WRITE|B_CREATE_FILE);
|
spoolFile = new BFile(spool_file_name, B_READ_WRITE|B_CREATE_FILE);
|
||||||
@@ -96,7 +102,47 @@ BPrintJob::BeginJob()
|
|||||||
void
|
void
|
||||||
BPrintJob::CommitJob()
|
BPrintJob::CommitJob()
|
||||||
{
|
{
|
||||||
// TODO: Implement
|
if (page_number <= 0) {
|
||||||
|
BAlert *alert = new BAlert("Alert", "No Pages to print!", "Okay");
|
||||||
|
alert->Go();
|
||||||
|
CancelJob();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EnsureValidMessenger();
|
||||||
|
BMessage *message = new BMessage(PSRV_GET_ACTIVE_PRINTER);
|
||||||
|
BMessage *reply = new BMessage;
|
||||||
|
|
||||||
|
const char *printerName = NULL;
|
||||||
|
if (sPrintServer->SendMessage(message, reply) < B_OK ||
|
||||||
|
reply->FindString("printer_name", &printerName) < B_OK) {
|
||||||
|
// TODO: Show an alert
|
||||||
|
delete message;
|
||||||
|
delete reply;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete message;
|
||||||
|
delete reply;
|
||||||
|
|
||||||
|
app_info appInfo;
|
||||||
|
be_app->GetAppInfo(&appInfo);
|
||||||
|
|
||||||
|
spoolFile->WriteAttr("_spool/Page Count", B_INT32_TYPE, 0, &page_number, sizeof(int32));
|
||||||
|
spoolFile->WriteAttr("_spool/Description", B_STRING_TYPE, 0, print_job_name, strlen(print_job_name) + 1);
|
||||||
|
spoolFile->WriteAttr("_spool/Printer", B_STRING_TYPE, 0, printerName, strlen(printerName) + 1);
|
||||||
|
spoolFile->WriteAttr("_spool/Status", B_STRING_TYPE, 0, "waiting", strlen("waiting") + 1);
|
||||||
|
spoolFile->WriteAttr("_spool/MimeType", B_STRING_TYPE, 0, appInfo.signature, strlen(appInfo.signature) + 1);
|
||||||
|
|
||||||
|
message = new BMessage(PSRV_PRINT_SPOOLED_JOB);
|
||||||
|
reply = new BMessage;
|
||||||
|
|
||||||
|
message->AddString("JobName", print_job_name);
|
||||||
|
message->AddString("Spool File", spool_file_name);
|
||||||
|
sPrintServer->SendMessage(message, reply);
|
||||||
|
|
||||||
|
delete message;
|
||||||
|
delete reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -142,11 +188,17 @@ BPrintJob::CanContinue()
|
|||||||
void
|
void
|
||||||
BPrintJob::DrawView(BView *view, BRect rect, BPoint where)
|
BPrintJob::DrawView(BView *view, BRect rect, BPoint where)
|
||||||
{
|
{
|
||||||
// TODO: Finish me
|
if (view == NULL)
|
||||||
if (view != NULL) {
|
return;
|
||||||
view->f_is_printing = true;
|
|
||||||
view->Draw(rect);
|
// TODO: Finish me
|
||||||
view->f_is_printing = false;
|
if (view->LockLooper()) {
|
||||||
|
BPicture *picture = new BPicture;
|
||||||
|
RecurseView(view, where, picture, rect);
|
||||||
|
AddPicture(picture, &rect, where);
|
||||||
|
|
||||||
|
view->UnlockLooper();
|
||||||
|
delete picture;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,6 +336,15 @@ void
|
|||||||
BPrintJob::RecurseView(BView *view, BPoint origin,
|
BPrintJob::RecurseView(BView *view, BPoint origin,
|
||||||
BPicture *picture, BRect rect)
|
BPicture *picture, BRect rect)
|
||||||
{
|
{
|
||||||
|
ASSERT(picture != NULL);
|
||||||
|
|
||||||
|
view->AppendToPicture(picture);
|
||||||
|
view->f_is_printing = true;
|
||||||
|
view->Draw(rect);
|
||||||
|
view->f_is_printing = false;
|
||||||
|
view->EndPicture();
|
||||||
|
|
||||||
|
// TODO: call recursively on every view's children.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -324,6 +385,8 @@ BPrintJob::NewPage()
|
|||||||
{
|
{
|
||||||
// TODO: this function could be removed, and its functionality moved
|
// TODO: this function could be removed, and its functionality moved
|
||||||
// to SpoolPage()
|
// to SpoolPage()
|
||||||
|
// TODO: Implement for real
|
||||||
|
page_number++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -344,6 +407,13 @@ BPrintJob::AddSetupSpec()
|
|||||||
void
|
void
|
||||||
BPrintJob::AddPicture(BPicture *picture, BRect *rect, BPoint where)
|
BPrintJob::AddPicture(BPicture *picture, BRect *rect, BPoint where)
|
||||||
{
|
{
|
||||||
|
ASSERT(picture != NULL);
|
||||||
|
ASSERT(spoolFile != NULL);
|
||||||
|
ASSERT(rect != NULL);
|
||||||
|
|
||||||
|
spoolFile->Write(&where, sizeof(where));
|
||||||
|
spoolFile->Write(rect, sizeof(*rect));
|
||||||
|
picture->Flatten(spoolFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user