#include <devices/printer.h>
#include <intuition/intuition.h>

union printerIO {
	struct IOStdReq		ios;
	struct IODRPReq		iodrp;
	struct IOPrtCmdReq	iopc;
};

long OpenPrinter(union printerIO *request)
{
	return (long) OpenDevice("printer.device", 0L, (struct IORequest *) request, 0L);
}

long ClosePrinter(union printerIO *request)
{
	CloseDevice((struct IORequest *) request);
	return 0L;
}

long PrintString(union printerIO *request, char *string)
{
	request->ios.io_Command	= CMD_WRITE;
	request->ios.io_Data	= (APTR) string;
	request->ios.io_Length	= -1L;

	return (long) DoIO((struct IORequest *) request);
}

long PrintRaw(union printerIO *request, char *buffer, long count)
{
	request->ios.io_Command	= PRD_RAWWRITE;
	request->ios.io_Data	= (APTR) buffer;
	request->ios.io_Length	= count;

	return (long) DoIO((struct IORequest *) request);
}

long PrintCommand(union printerIO *request, long command,
			long p0, long p1, long p2, long p3)
{
	request->iopc.io_Command	= PRD_PRTCOMMAND;
	request->iopc.io_PrtCommand	= command;
	request->iopc.io_Parm0		= p0;
	request->iopc.io_Parm1		= p1;
	request->iopc.io_Parm2		= p2;
	request->iopc.io_Parm3		= p3;

	return (long) DoIO((struct IORequest *) request);
}

long DumpRPort(union printerIO *request, struct RastPort *rastPort,
		struct ColorMap *colorMap, ULONG modes,
		UWORD sx, UWORD sy, UWORD sw, UWORD sh,
		LONG dc, LONG dr,
		UWORD s)
{
	request->iodrp.io_Command	= PRD_DUMPRPORT;
	request->iodrp.io_RastPort	= rastPort;
	request->iodrp.io_ColorMap	= colorMap;
	request->iodrp.io_Modes		= modes;
	request->iodrp.io_SrcX		= sx;
	request->iodrp.io_SrcY		= sy;
	request->iodrp.io_SrcWidth	= sw;
	request->iodrp.io_SrcHeight	= sh;
	request->iodrp.io_DestCols	= dc;
	request->iodrp.io_DestRows	= dr;
	request->iodrp.io_Special	= s;

	return (long) DoIO((struct IORequest *) request);
}
