/*
 * Copyright 2009, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef	_PRINTSESSION_H
#define	_PRINTSESSION_H


#include <Picture.h>


class BFile;
class BView;

struct print_file_header {
	int32	version;
	int32	page_count;
	off_t	first_page;

	int32	_reserved[3];
} _PACKED;

struct _page_header_;


class BPrintJob {
public:
	// Values returned by PrinterType()
	enum {
		B_BW_PRINTER = 0,
		B_COLOR_PRINTER
	};


								BPrintJob(const char* name);
	virtual						~BPrintJob();

			void				BeginJob();
			void				CommitJob();
			status_t			ConfigJob();
			void				CancelJob();

			status_t			ConfigPage();
			void				SpoolPage();

			bool				CanContinue();

	virtual	void				DrawView(BView* view, BRect rect,
									BPoint where);

			BMessage*			Settings(); // TODO: const
			void				SetSettings(BMessage* archive);
			bool				IsSettingsMessageValid(
									BMessage* archive) const;

			BRect				PaperRect();
			BRect				PrintableRect();
			void				GetResolution(int32* xDPI, int32* yDPI);

			int32				FirstPage(); // TODO: const
			int32				LastPage(); // TODO: const
			int32				PrinterType(void* type = NULL) const;


private:
	// FBC padding and forbidden methods
	virtual void				_ReservedPrintJob1();
	virtual void				_ReservedPrintJob2();
	virtual void				_ReservedPrintJob3();
	virtual void				_ReservedPrintJob4();

								BPrintJob(const BPrintJob& other);
			BPrintJob&			operator=(const BPrintJob& other);

private:
			void				_RecurseView(BView* view, BPoint origin,
									BPicture* picture, BRect rect);
			void				_GetMangledName(char* buffer,
									size_t bufferSize) const;
			void				_HandlePageSetup(BMessage* setup);
			bool				_HandlePrintSetup(BMessage* setup);

			void				_NewPage();
			void				_EndLastPage();

			void				_AddSetupSpec();
			void				_AddPicture(BPicture& picture, BRect& rect,
									BPoint& where);

			char*				_GetCurrentPrinterName() const;
			void				_LoadDefaultSettings();

private:
			char*				fPrintJobName;

			int32				_unused;

			BFile*				fSpoolFile;
			print_file_header	fSpoolFileHeader;
			BRect				fPaperSize;
			BRect				fUsableSize;
			status_t			fError;
			char				fSpoolFileName[256];
			BMessage*			fSetupMessage;
			BMessage*			fDefaultSetupMessage;
			char				fAbort;
			int32				fFirstPage;
			int32				fLastPage;
			short				fXResolution;
			short				fYResolution;
			_page_header_*		fCurrentPageHeader;
			off_t				fCurrentPageHeaderOffset;

			uint32				_reserved[2];
};

#endif // _PRINTSESSION_H