1 /*
2  *   CANON BJ command filter for the Common UNIX Printing System.
3  *
4  *
5  * Contents:
6  *
7  *   main() - Main entry and command processing.
8  */
9 
10 /*
11  * Include necessary headers...
12  */
13 
14 #include <cups/cups.h>
15 #include <ctype.h>
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <strings.h>
19 
20 
21 /*
22  * Macros...
23  */
24 
25 #define pwrite(s,n) fwrite((s), 1, (n), stdout)
26 
27 
28 /*
29  * 'main()' - Main entry and processing of driver.
30  */
31 
32 int			/* O - Exit status */
main(int argc,char * argv[])33 main(int  argc,		/* I - Number of command-line arguments */
34      char *argv[])	/* I - Command-line arguments */
35 {
36   FILE	*fp;		/* Command file */
37   char	line[1024],	/* Line from file */
38 	*lineptr;	/* Pointer into line */
39   int	feedpage;	/* Feed the page */
40 
41 
42  /*
43   * Check for valid arguments...
44   */
45 
46   if (argc < 6 || argc > 7)
47   {
48    /*
49     * We don't have the correct number of arguments; write an error message
50     * and return.
51     */
52 
53     fputs("ERROR: commandtocanon job-id user title copies options [file]\n", stderr);
54     return (1);
55   }
56 
57  /*
58   * Open the command file as needed...
59   */
60 
61   if (argc == 7)
62   {
63     if ((fp = fopen(argv[6], "r")) == NULL)
64     {
65       perror("ERROR: Unable to open command file - ");
66       return (1);
67     }
68   }
69   else
70     fp = stdin;
71 
72  /*
73   * Reset the printer and initiate BJL mode
74   */
75 
76   pwrite("\x1b\x5b\x4b\x02\x00\x00\x1f" "BJLSTART\x0a", 16);
77   feedpage = 0;
78 
79  /*
80   * Read the commands from the file and send the appropriate commands...
81   */
82 
83   while (fgets(line, sizeof(line), fp) != NULL)
84   {
85    /*
86     * Drop trailing newline...
87     */
88 
89     lineptr = line + strlen(line) - 1;
90     if (*lineptr == '\n')
91       *lineptr = '\0';
92 
93    /*
94     * Skip leading whitespace...
95     */
96 
97     for (lineptr = line; isspace(*lineptr); lineptr ++);
98 
99    /*
100     * Skip comments and blank lines...
101     */
102 
103     if (*lineptr == '#' || !*lineptr)
104       continue;
105 
106    /*
107     * Parse the command...
108     */
109 
110     if (strncasecmp(lineptr, "Clean", 5) == 0)
111     {
112      /*
113       * Clean heads...
114       */
115 
116       char *what;
117 
118       for (what = lineptr + 6; isspace(*what); what ++);
119 
120       if (*what == 0)                   pwrite("@Cleaning=1ALL\x0a", 15);
121       if (!strncasecmp(what,"all",3))   pwrite("@Cleaning=1ALL\x0a", 15);
122       if (!strncasecmp(what,"black",5)) pwrite("@Cleaning=1K\x0a", 13);
123 
124     }
125     else if (strncasecmp(lineptr, "PrintAlignmentPage", 18) == 0)
126     {
127      /*
128       * Print alignment page...
129       */
130 
131       int phase;
132 
133       phase = atoi(lineptr + 18);
134 
135       if (phase==0) pwrite("@TestPrint=Auto\x0a", 16);
136       if (phase==1) pwrite("@TestPrint=Manual1\x0a", 19);
137       if (phase==2) pwrite("@TestPrint=Manual2\x0a", 19);
138 
139       feedpage = 0;
140     }
141     else if (strncasecmp(lineptr, "PrintSelfTestPage", 17) == 0)
142     {
143      /*
144       * Print version info and nozzle check...
145       */
146 
147       pwrite("@TestPrint=NozzleCheck\x0a", 23);
148 
149       feedpage = 0;
150     }
151     else if (strncasecmp(lineptr, "ReportLevels", 12) == 0)
152     {
153      /*
154       * Report ink levels...
155       */
156 
157     }
158     else if (strncasecmp(lineptr, "SetAlignment", 12) == 0)
159     {
160      /*
161       * Set head alignment...
162       */
163 
164     }
165     else
166       fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr);
167   }
168 
169  /*
170   * Exit remote mode...
171   */
172 
173   pwrite("BJLEND\x0a", 7);
174 
175  /*
176   * Eject the page as needed...
177   */
178 
179   if (feedpage)
180   {
181     putchar(13);
182     putchar(10);
183     putchar(12);
184   }
185 
186  /*
187   * Close the command file and return...
188   */
189 
190   if (fp != stdin)
191     fclose(fp);
192 
193   return (0);
194 }
195 
196 
197 /*
198  */
199