|
|
|
@ -11,8 +11,6 @@
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
|
|
#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
|
|
|
|
|
|
|
|
|
|
// uncomment next line in order to have verbose dump in DEBUGFILE
|
|
|
|
|
// after print
|
|
|
|
|
|
|
|
|
@ -20,21 +18,19 @@
|
|
|
|
|
|
|
|
|
|
#define DEBUGFILE "/tmp/debugraster.txt"
|
|
|
|
|
|
|
|
|
|
#define FALSE 0
|
|
|
|
|
#define TRUE (!FALSE)
|
|
|
|
|
|
|
|
|
|
struct settings_
|
|
|
|
|
{
|
|
|
|
|
int cashDrawer1;
|
|
|
|
|
int cashDrawer2;
|
|
|
|
|
int cashDrawer1;
|
|
|
|
|
int cashDrawer2;
|
|
|
|
|
int blankSpace;
|
|
|
|
|
int feedDist;
|
|
|
|
|
};
|
|
|
|
|
struct settings_ settings;
|
|
|
|
|
|
|
|
|
|
struct command
|
|
|
|
|
{
|
|
|
|
|
int length;
|
|
|
|
|
char* command;
|
|
|
|
|
int length;
|
|
|
|
|
char* command;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// define printer initialize command
|
|
|
|
@ -50,14 +46,11 @@ static const struct command cashDrawerEject [2] =
|
|
|
|
|
static const struct command rasterModeStartCommand =
|
|
|
|
|
{4,(char[4]){0x1d,0x76,0x30,0}};
|
|
|
|
|
|
|
|
|
|
// define raster flush command
|
|
|
|
|
static const struct command rasterModeFlushCommand =
|
|
|
|
|
{3,(char[3]){0x1b,0x4a,0x15}};
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUGP
|
|
|
|
|
FILE* lfd = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// putchar with debug wrapper
|
|
|
|
|
inline void mputchar(char c)
|
|
|
|
|
{
|
|
|
|
|
unsigned char m = c;
|
|
|
|
@ -68,89 +61,95 @@ inline void mputchar(char c)
|
|
|
|
|
putchar(m);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// procedure to output an array
|
|
|
|
|
inline void outputarray(const char * array, int length)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
for (;i<length;++i)
|
|
|
|
|
mputchar(array[i]);
|
|
|
|
|
int i = 0;
|
|
|
|
|
for (;i<length;++i)
|
|
|
|
|
mputchar(array[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// output a command
|
|
|
|
|
inline void outputCommand(struct command output)
|
|
|
|
|
{
|
|
|
|
|
outputarray(output.command,output.length);
|
|
|
|
|
outputarray(output.command,output.length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline int lo(int val)
|
|
|
|
|
{
|
|
|
|
|
return val & 0xFF;
|
|
|
|
|
return val & 0xFF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline int hi (int val)
|
|
|
|
|
{
|
|
|
|
|
return lo (val>>8);
|
|
|
|
|
return lo (val>>8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// enter raster mode and set up x and y dimensions
|
|
|
|
|
inline void rasterheader(int xsize, int ysize)
|
|
|
|
|
{
|
|
|
|
|
outputCommand(rasterModeStartCommand);
|
|
|
|
|
mputchar(lo(xsize));
|
|
|
|
|
mputchar(hi(xsize));
|
|
|
|
|
mputchar(lo(ysize));
|
|
|
|
|
mputchar(hi(ysize));
|
|
|
|
|
outputCommand(rasterModeStartCommand);
|
|
|
|
|
mputchar(lo(xsize));
|
|
|
|
|
mputchar(hi(xsize));
|
|
|
|
|
mputchar(lo(ysize));
|
|
|
|
|
mputchar(hi(ysize));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// print all unprinted (i.e. flush the buffer)
|
|
|
|
|
// then feed given number of lines
|
|
|
|
|
inline void skiplines(int size)
|
|
|
|
|
{ mputchar(0x1b);
|
|
|
|
|
mputchar(0x4a);
|
|
|
|
|
mputchar(size);
|
|
|
|
|
{
|
|
|
|
|
mputchar(0x1b);
|
|
|
|
|
mputchar(0x4a);
|
|
|
|
|
mputchar(size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// get an option
|
|
|
|
|
inline int getOptionChoiceIndex(const char * choiceName, ppd_file_t * ppd)
|
|
|
|
|
{
|
|
|
|
|
ppd_choice_t * choice;
|
|
|
|
|
ppd_option_t * option;
|
|
|
|
|
ppd_choice_t * choice;
|
|
|
|
|
ppd_option_t * option;
|
|
|
|
|
|
|
|
|
|
choice = ppdFindMarkedChoice(ppd, choiceName);
|
|
|
|
|
choice = ppdFindMarkedChoice(ppd, choiceName);
|
|
|
|
|
|
|
|
|
|
if (choice == NULL)
|
|
|
|
|
{
|
|
|
|
|
if ((option = ppdFindOption(ppd, choiceName)) == NULL) return -1;
|
|
|
|
|
if ((choice = ppdFindChoice(option,option->defchoice)) == NULL) return -1;
|
|
|
|
|
}
|
|
|
|
|
if (choice == NULL)
|
|
|
|
|
{
|
|
|
|
|
if ((option = ppdFindOption(ppd, choiceName)) == NULL) return -1;
|
|
|
|
|
if ((choice = ppdFindChoice(option,option->defchoice)) == NULL) return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return atoi(choice->choice);
|
|
|
|
|
return atoi(choice->choice);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct settings_ settings;
|
|
|
|
|
|
|
|
|
|
inline void initializeSettings(char * commandLineOptionSettings)
|
|
|
|
|
{
|
|
|
|
|
ppd_file_t * ppd = NULL;
|
|
|
|
|
cups_option_t * options = NULL;
|
|
|
|
|
int numOptions = 0;
|
|
|
|
|
ppd_file_t * ppd = NULL;
|
|
|
|
|
cups_option_t * options = NULL;
|
|
|
|
|
int numOptions = 0;
|
|
|
|
|
|
|
|
|
|
ppd = ppdOpenFile(getenv("PPD"));
|
|
|
|
|
ppd = ppdOpenFile(getenv("PPD"));
|
|
|
|
|
|
|
|
|
|
ppdMarkDefaults(ppd);
|
|
|
|
|
ppdMarkDefaults(ppd);
|
|
|
|
|
|
|
|
|
|
numOptions = cupsParseOptions(commandLineOptionSettings, 0, &options);
|
|
|
|
|
if ((numOptions != 0) && (options != NULL))
|
|
|
|
|
{
|
|
|
|
|
cupsMarkOptions(ppd, numOptions, options);
|
|
|
|
|
cupsFreeOptions(numOptions, options);
|
|
|
|
|
}
|
|
|
|
|
numOptions = cupsParseOptions(commandLineOptionSettings, 0, &options);
|
|
|
|
|
if ((numOptions != 0) && (options != NULL))
|
|
|
|
|
{
|
|
|
|
|
cupsMarkOptions(ppd, numOptions, options);
|
|
|
|
|
cupsFreeOptions(numOptions, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset(&settings, 0x00, sizeof(struct settings_));
|
|
|
|
|
memset(&settings, 0x00, sizeof(struct settings_));
|
|
|
|
|
|
|
|
|
|
settings.cashDrawer1 = getOptionChoiceIndex("CashDrawer1Setting", ppd);
|
|
|
|
|
settings.cashDrawer2 = getOptionChoiceIndex("CashDrawer2Setting", ppd);
|
|
|
|
|
settings.blankSpace = getOptionChoiceIndex("BlankSpace" , ppd);
|
|
|
|
|
settings.feedDist = getOptionChoiceIndex("FeedDist" , ppd);
|
|
|
|
|
settings.cashDrawer1 = getOptionChoiceIndex("CashDrawer1Setting", ppd);
|
|
|
|
|
settings.cashDrawer2 = getOptionChoiceIndex("CashDrawer2Setting", ppd);
|
|
|
|
|
settings.blankSpace = getOptionChoiceIndex("BlankSpace" , ppd);
|
|
|
|
|
settings.feedDist = getOptionChoiceIndex("FeedDist" , ppd);
|
|
|
|
|
|
|
|
|
|
ppdClose(ppd);
|
|
|
|
|
ppdClose(ppd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// sent on the beginning of print job
|
|
|
|
|
void jobSetup()
|
|
|
|
|
{
|
|
|
|
|
if ( settings.cashDrawer1==1 )
|
|
|
|
@ -160,6 +159,7 @@ void jobSetup()
|
|
|
|
|
outputCommand(printerInitializeCommand);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// sent at the very end of print job
|
|
|
|
|
void ShutDown()
|
|
|
|
|
{
|
|
|
|
|
if ( settings.cashDrawer1==2 )
|
|
|
|
@ -169,15 +169,17 @@ void ShutDown()
|
|
|
|
|
outputCommand(printerInitializeCommand);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int num_of_feed;
|
|
|
|
|
|
|
|
|
|
// sent at the end of every page
|
|
|
|
|
__sighandler_t old_signal;
|
|
|
|
|
void EndPage()
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i=0; i<settings.feedDist; ++i)
|
|
|
|
|
skiplines(0x18);
|
|
|
|
|
signal(15,old_signal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// sent on job canceling
|
|
|
|
|
void cancelJob(int foo)
|
|
|
|
|
{
|
|
|
|
|
int i=0;
|
|
|
|
@ -187,85 +189,82 @@ void cancelJob(int foo)
|
|
|
|
|
ShutDown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// invoked before starting to print a page
|
|
|
|
|
void pageSetup()
|
|
|
|
|
{
|
|
|
|
|
signal(15,cancelJob);
|
|
|
|
|
old_signal = signal(15,cancelJob);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////
|
|
|
|
|
//////////////////////////////////////////////
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
int fd = 0; /* File descriptor providing CUPS raster data */
|
|
|
|
|
cups_raster_t * ras = NULL; /* Raster stream for printing */
|
|
|
|
|
cups_page_header2_t header; /* CUPS Page header */
|
|
|
|
|
int page = 0; /* Current page */
|
|
|
|
|
|
|
|
|
|
int y = 0; /* Vertical position in page 0 <= y <= header.cupsHeight */
|
|
|
|
|
|
|
|
|
|
unsigned char * rasterData = NULL; /* Pointer to raster data */
|
|
|
|
|
unsigned char * originalRasterDataPtr = NULL; /* Copy of original pointer for freeing buffer */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (argc < 6 || argc > 7)
|
|
|
|
|
{
|
|
|
|
|
fputs("ERROR: rastertozj58 job-id user title copies options [file]\n", stderr);
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (argc == 7)
|
|
|
|
|
{
|
|
|
|
|
if ((fd = open(argv[6], O_RDONLY)) == -1)
|
|
|
|
|
{
|
|
|
|
|
perror("ERROR: Unable to open raster file - ");
|
|
|
|
|
sleep(1);
|
|
|
|
|
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
fd = 0;
|
|
|
|
|
int fd = 0; // File descriptor providing CUPS raster data
|
|
|
|
|
cups_raster_t * ras = NULL; // Raster stream for printing
|
|
|
|
|
cups_page_header2_t header; /* CUPS Page header */
|
|
|
|
|
int page = 0; /* Current page */
|
|
|
|
|
int y = 0; /* Vertical position in page 0 <= y <= header.cupsHeight */
|
|
|
|
|
|
|
|
|
|
unsigned char * rasterData = NULL; /* Pointer to raster data */
|
|
|
|
|
unsigned char * originalRasterDataPtr = NULL; /* Copy of original pointer for freeing buffer */
|
|
|
|
|
|
|
|
|
|
if (argc < 6 || argc > 7)
|
|
|
|
|
{
|
|
|
|
|
fputs("ERROR: rastertozj58 job-id user title copies options [file]\n", stderr);
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (argc == 7)
|
|
|
|
|
{
|
|
|
|
|
if ((fd = open(argv[6], O_RDONLY)) == -1)
|
|
|
|
|
{
|
|
|
|
|
perror("ERROR: Unable to open raster file - ");
|
|
|
|
|
sleep(1);
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
}
|
|
|
|
|
} else
|
|
|
|
|
fd = 0;
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUGP
|
|
|
|
|
lfd = fopen ("/tmp/raster.txt","w");
|
|
|
|
|
#endif
|
|
|
|
|
initializeSettings(argv[5]);
|
|
|
|
|
|
|
|
|
|
jobSetup();
|
|
|
|
|
ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
|
|
|
|
|
page = 0;
|
|
|
|
|
initializeSettings(argv[5]);
|
|
|
|
|
jobSetup();
|
|
|
|
|
ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
|
|
|
|
|
page = 0;
|
|
|
|
|
|
|
|
|
|
while (cupsRasterReadHeader2(ras, &header))
|
|
|
|
|
{
|
|
|
|
|
if ((header.cupsHeight == 0) || (header.cupsBytesPerLine == 0))
|
|
|
|
|
break;
|
|
|
|
|
while (cupsRasterReadHeader2(ras, &header))
|
|
|
|
|
{
|
|
|
|
|
if ((header.cupsHeight == 0) || (header.cupsBytesPerLine == 0))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUGP
|
|
|
|
|
if (lfd) fprintf(lfd,"\nheader.cupsHeight=%d, header.cupsBytesPerLine=%d\n",header.cupsHeight,header.cupsBytesPerLine);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (rasterData == NULL)
|
|
|
|
|
{
|
|
|
|
|
rasterData = malloc(header.cupsBytesPerLine*24);
|
|
|
|
|
if (rasterData == NULL)
|
|
|
|
|
{
|
|
|
|
|
if (rasterData == NULL)
|
|
|
|
|
{
|
|
|
|
|
rasterData = malloc(header.cupsBytesPerLine*24);
|
|
|
|
|
if (rasterData == NULL)
|
|
|
|
|
{
|
|
|
|
|
if (originalRasterDataPtr != NULL) free(originalRasterDataPtr);
|
|
|
|
|
cupsRasterClose(ras);
|
|
|
|
|
if (fd != 0)
|
|
|
|
|
close(fd);
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
originalRasterDataPtr = rasterData; // used to later free the memory
|
|
|
|
|
}
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
originalRasterDataPtr = rasterData; // used to later free the memory
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fprintf(stderr, "PAGE: %d %d\n", ++page, header.NumCopies);
|
|
|
|
|
pageSetup();
|
|
|
|
|
fprintf(stderr, "PAGE: %d %d\n", ++page, header.NumCopies);
|
|
|
|
|
pageSetup();
|
|
|
|
|
|
|
|
|
|
int foo = ( header.cupsWidth > 0x180 ) ? 0x180 : header.cupsWidth;
|
|
|
|
|
foo = (foo+7) & 0xFFFFFFF8;
|
|
|
|
|
int width_size = foo >> 3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUGP
|
|
|
|
|
if (lfd) fprintf(lfd,"\nheader.cupsWidth=%d, foo=%d, width_size=%d\n",header.cupsWidth,foo,width_size);
|
|
|
|
|
#endif
|
|
|
|
@ -311,6 +310,7 @@ int main(int argc, char *argv[])
|
|
|
|
|
#ifdef DEBUGP
|
|
|
|
|
if (lfd) fprintf(lfd,"\nChecked %d bytes of %d for zero\n",j,rest_bytes);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (j>=rest_bytes)
|
|
|
|
|
{
|
|
|
|
|
++zeroy;
|
|
|
|
@ -329,25 +329,27 @@ int main(int argc, char *argv[])
|
|
|
|
|
for(;zeroy>0;--zeroy)
|
|
|
|
|
skiplines(24);
|
|
|
|
|
|
|
|
|
|
EndPage();
|
|
|
|
|
}
|
|
|
|
|
EndPage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ShutDown();
|
|
|
|
|
|
|
|
|
|
if (originalRasterDataPtr != NULL) free(originalRasterDataPtr);
|
|
|
|
|
cupsRasterClose(ras);
|
|
|
|
|
if (fd != 0)
|
|
|
|
|
close(fd);
|
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
|
|
if (page == 0)
|
|
|
|
|
fputs("ERROR: No pages found!\n", stderr);
|
|
|
|
|
else
|
|
|
|
|
fputs("INFO: Ready to print.\n", stderr);
|
|
|
|
|
|
|
|
|
|
if (page == 0)
|
|
|
|
|
fputs("ERROR: No pages found!\n", stderr);
|
|
|
|
|
else
|
|
|
|
|
fputs("INFO: Ready to print.\n", stderr);
|
|
|
|
|
#ifdef DEBUGP
|
|
|
|
|
if (lfd)
|
|
|
|
|
fclose(lfd);
|
|
|
|
|
#endif
|
|
|
|
|
return (page == 0)?EXIT_FAILURE:EXIT_SUCCESS;
|
|
|
|
|
|
|
|
|
|
return (page == 0)?EXIT_FAILURE:EXIT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// end of rastertostar.c
|
|
|
|
|