* some small cleanup

* fFirstPage should be of type off_t



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24532 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Karsten Heimrich 2008-03-23 16:01:03 +00:00
parent e26a4ce3e9
commit 96d23158ea
2 changed files with 85 additions and 46 deletions

View File

@ -56,7 +56,7 @@ public:
class PrintJobReader {
BFile fJobFile; // the job file
int32 fNumberOfPages; // the number of pages in the job file
int32 fFirstPage; // the page number of the first page
off_t fFirstPage; // the page number of the first page
BMessage fJobSettings; // the settings extracted from the job file
off_t* fPageIndex; // start positions of pages in the job file
@ -80,7 +80,7 @@ public:
float GetScale() const;
// retrieve page
status_t GetPage(int no, PrintJobPage& pjp);
status_t GetPage(int32 no, PrintJobPage& pjp);
};
#endif

View File

@ -27,12 +27,18 @@ THE SOFTWARE.
*/
#include <stdio.h>
#include <Picture.h>
#include <PrintJob.h>
#include "PrintJobReader.h"
// Implementation of PrintJobPage
#include <stdio.h>
#include <Picture.h>
#include <PrintJob.h>
// #pragma mark --- PrintJobPage
PrintJobPage::PrintJobPage()
: fNextPicture(-1)
@ -42,6 +48,7 @@ PrintJobPage::PrintJobPage()
{
}
PrintJobPage::PrintJobPage(const PrintJobPage& copy)
: fJobFile(copy.fJobFile)
, fNextPicture(copy.fNextPicture)
@ -51,7 +58,9 @@ PrintJobPage::PrintJobPage(const PrintJobPage& copy)
{
}
PrintJobPage& PrintJobPage::operator=(const PrintJobPage& copy) {
PrintJobPage& PrintJobPage::operator=(const PrintJobPage& copy)
{
if (this != &copy) {
fJobFile = copy.fJobFile;
fNextPicture = copy.fNextPicture;
@ -62,42 +71,56 @@ PrintJobPage& PrintJobPage::operator=(const PrintJobPage& copy) {
return *this;
}
PrintJobPage::PrintJobPage(BFile* jobFile, off_t start)
: fJobFile(*jobFile)
, fPicture(0)
, fStatus(B_ERROR)
{
off_t size;
if (fJobFile.GetSize(&size) != B_OK || start > size) return;
if (fJobFile.Seek(start, SEEK_SET) != start) return;
if (fJobFile.Read(&fNumberOfPictures, sizeof(fNumberOfPictures)) == sizeof(fNumberOfPictures)) {
fJobFile.Seek(40 + sizeof(off_t), SEEK_CUR);
if (fJobFile.GetSize(&size) != B_OK || start > size)
return;
if (fJobFile.Seek(start, SEEK_SET) != start)
return;
off_t nextPage;
if (fJobFile.Read(&fNumberOfPictures, sizeof(int32)) == sizeof(int32)) {
// (sizeof(int32) * 10) == padding in _page_header_
fJobFile.Seek(sizeof(off_t) + sizeof(int32) * 10, SEEK_CUR);
fNextPicture = fJobFile.Position();
fStatus = B_OK;
}
}
status_t PrintJobPage::InitCheck() const {
status_t PrintJobPage::InitCheck() const
{
return fStatus;
}
status_t PrintJobPage::NextPicture(BPicture& picture, BPoint& point, BRect& rect) {
if (fPicture >= fNumberOfPictures) return B_ERROR;
fPicture ++;
status_t PrintJobPage::NextPicture(BPicture& picture, BPoint& point, BRect& rect)
{
if (fPicture >= fNumberOfPictures)
return B_ERROR;
fPicture++;
fJobFile.Seek(fNextPicture, SEEK_SET);
fJobFile.Read(&point, sizeof(point));
fJobFile.Read(&rect, sizeof(rect));
fJobFile.Read(&point, sizeof(BPoint));
fJobFile.Read(&rect, sizeof(BRect));
status_t rc = picture.Unflatten(&fJobFile);
fNextPicture = fJobFile.Position();
if (rc != B_OK) {
if (rc != B_OK)
fPicture = fNumberOfPictures;
}
return rc;
}
// Implementation of PrintJobReader
// # pragma mark --- PrintJobReader
PrintJobReader::PrintJobReader(BFile* jobFile)
: fJobFile(*jobFile)
@ -110,71 +133,87 @@ PrintJobReader::PrintJobReader(BFile* jobFile)
BPrintJob::print_file_header header;
#endif
fJobFile.Seek(0, SEEK_SET);
if (fJobFile.Read(&header, sizeof(header)) == sizeof(header) &&
fJobSettings.Unflatten(&fJobFile) == B_OK) {
fNumberOfPages = header.page_count;
fFirstPage = header.first_page;
BuildPageIndex();
if (fJobFile.Read(&header, sizeof(header)) == sizeof(header)) {
if (fJobSettings.Unflatten(&fJobFile) == B_OK) {
fNumberOfPages = header.page_count;
fFirstPage = header.first_page;
fPageIndex = new off_t[fNumberOfPages];
BuildPageIndex();
}
}
}
PrintJobReader::~PrintJobReader() {
PrintJobReader::~PrintJobReader()
{
delete[] fPageIndex;
}
status_t PrintJobReader::InitCheck() const {
status_t PrintJobReader::InitCheck() const
{
return fNumberOfPages > 0 ? B_OK : B_ERROR;
}
void PrintJobReader::BuildPageIndex() {
fPageIndex = new off_t[fNumberOfPages];
for (int page = 0; page < fNumberOfPages; page ++) {
int32 pictures;
off_t next_page;
// add position to page index
void PrintJobReader::BuildPageIndex()
{
off_t next_page;
int32 number_of_pictures;
for (int32 page = 0; page < fNumberOfPages; ++page) {
fPageIndex[page] = fJobFile.Position();
// determine start position of next page
if (fJobFile.Read(&pictures, sizeof(pictures)) == sizeof(pictures) &&
fJobFile.Read(&next_page, sizeof(next_page)) == sizeof(next_page) &&
fPageIndex[page] < next_page) {
if (fJobFile.Read(&number_of_pictures, sizeof(int32)) == sizeof(int32)
&& fJobFile.Read(&next_page, sizeof(off_t)) == sizeof(off_t)
&& fPageIndex[page] < next_page) {
fJobFile.Seek(next_page, SEEK_SET);
} else {
fNumberOfPages = 0; delete fPageIndex; fPageIndex = NULL;
fNumberOfPages = 0;
delete fPageIndex;
fPageIndex = NULL;
return;
}
}
}
status_t PrintJobReader::GetPage(int page, PrintJobPage& pjp) {
status_t PrintJobReader::GetPage(int32 page, PrintJobPage& pjp)
{
if (0 <= page && page < fNumberOfPages) {
PrintJobPage p(&fJobFile, fPageIndex[page]);
if (p.InitCheck() == B_OK) {
pjp = p; return B_OK;
pjp = p;
return B_OK;
}
}
return B_ERROR;
}
BRect PrintJobReader::PaperRect() const {
BRect PrintJobReader::PaperRect() const
{
BRect r;
fJobSettings.FindRect("paper_rect", &r);
return r;
}
BRect PrintJobReader::PrintableRect() const {
BRect PrintJobReader::PrintableRect() const
{
BRect r;
fJobSettings.FindRect("printable_rect", &r);
return r;
}
void PrintJobReader::GetResolution(int32 *xdpi, int32 *ydpi) const {
void PrintJobReader::GetResolution(int32 *xdpi, int32 *ydpi) const
{
fJobSettings.FindInt32("xres", xdpi);
fJobSettings.FindInt32("yres", ydpi);
}
float PrintJobReader::GetScale() const {
float PrintJobReader::GetScale() const
{
float scale = 1.0;
fJobSettings.FindFloat("scale", &scale);
return scale;