Tizen 2.0 Release
[external/epson-laser-printer-escpage.git] / lib / epson-net-lpr.c
1 /*________________________________   epson-net-lpr.c   _________________________________*/\r
2 \r
3 /*       1         2         3         4         5         6         7         8        */\r
4 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/\r
5 /*******************************************|********************************************/\r
6 /*\r
7  *   Copyright (c) 2009  Seiko Epson Corporation                 All rights reserved.\r
8  *\r
9  *   Copyright protection claimed includes all forms and matters of\r
10  *   copyrightable material and information now allowed by statutory or judicial\r
11  *   law or hereinafter granted, including without limitation, material generated\r
12  *   from the software programs which are displayed on the screen such as icons,\r
13  *   screen display looks, etc.\r
14  *\r
15  */\r
16 /*******************************************|********************************************/\r
17 /*                                                                                      */\r
18 /*                                 LPR protocol Module                                  */\r
19 /*                                                                                      */\r
20 /*                                Public Function Calls                                 */\r
21 /*                              --------------------------                              */\r
22 /*      EPS_ERR_CODE lprFindStart       (sock, address, flg                     );      */\r
23 /*              EPS_ERR_CODE lprFind            (sock, printer                          );      */\r
24 /*      EPS_ERR_CODE lprFindEnd         (sock                                   );      */\r
25 /*      EPS_ERR_CODE lprProbePrinterByID(printerUUID, timeout, printer          );      */\r
26 /*              EPS_ERR_CODE lprStartJob            (printr                                 );      */\r
27 /*      EPS_ERR_CODE lprEndPage         (                                       );      */\r
28 /*      EPS_ERR_CODE lprResetPrinter    (                                       );      */\r
29 /*      EPS_ERR_CODE lprWritePrintData  (buffer, bufferlen, sendlen             );      */\r
30 /*      EPS_ERR_CODE lprGetStatus       (printer, status, ioStatus              );      */\r
31 /*      EPS_ERR_CODE lprGetJobStatus    (pstInfo                                            );      */\r
32 /*      EPS_ERR_CODE lprGetPMString     (printer, pString, bufSize              );      */\r
33 /*      EPS_ERR_CODE lprMechCommand     (printer, Command                       );      */\r
34 /*                                                                                      */\r
35 /*******************************************|********************************************/\r
36 \r
37 \r
38 /*------------------------------------  Includes   -------------------------------------*/\r
39 /*******************************************|********************************************/\r
40 #include "epson-escpr-def.h"\r
41 #include "epson-escpr-err.h"\r
42 #include "epson-escpr-mem.h"\r
43 #include "epson-escpr-services.h"\r
44 #include "epson-protocol.h"\r
45 #include "epson-net-snmp.h"\r
46 #include "epson-net-lpr.h"\r
47 \r
48 /*-----------------------------  Local Macro Definitions -------------------------------*/\r
49 /*******************************************|********************************************/\r
50 #ifdef EPS_LOG_MODULE_LPR\r
51 #define EPS_LOG_MODULE  EPS_LOG_MODULE_LPR\r
52 #else\r
53 #define EPS_LOG_MODULE  0\r
54 #endif\r
55 \r
56 #define LPR_PORT_NUM                    (515)                           /* Protocol port number                         */\r
57 #define LPR_MAX_BUF                             (512)                           /* Communication buffer size            */\r
58 #define LPR_DUMMY_DATA_SIZE             ("1073741824000")       /* Enhanced LPR buffer size                     */\r
59 #define LPR_HOST_NAME           "escpr-lib"         /* LPR print host name              */\r
60 \r
61 #define IS_JOB_ACTIVE                                                                                                                                           \\r
62                 ( (NULL != printJob.printer) && (NULL != printJob.hProtInfo)                                            \\r
63                         && (EPS_PROTOCOL_LPR == EPS_PRT_PROTOCOL(printJob.printer->protocol)) )\r
64 \r
65 #define IS_VALID_DATA_SESSION                                                                                                                           \\r
66                 ( (NULL != printJob.printer) && (NULL != printJob.hProtInfo)                                            \\r
67                         && (EPS_PROTOCOL_LPR == EPS_PRT_PROTOCOL(printJob.printer->protocol))                   \\r
68                         && (EPS_INVALID_SOCKET != ((EPS_PRINT_JOB_LPR*)printJob.hProtInfo)->socData) )\r
69 \r
70 /*----------------------------  ESC/P-R Lib Global Variables  --------------------------*/\r
71 /*******************************************|********************************************/\r
72 \r
73         /*** Extern Function                                                                */\r
74 extern EPS_NET_FUNC    epsNetFnc;\r
75 extern EPS_CMN_FUNC    epsCmnFnc;\r
76 \r
77     /*** Print Job Structure                                                            */\r
78     /*** -------------------------------------------------------------------------------*/\r
79 extern EPS_PRINT_JOB   printJob;\r
80 \r
81 static EPS_SNMP_FUNCS   snmp;\r
82 \r
83 /*---------------------------  Data Structure Declarations   ---------------------------*/\r
84 /*******************************************|********************************************/\r
85 typedef struct _tagEPS_PRINT_JOB_LPR_ {\r
86         EPS_SOCKET      socData;                                        /* LPR socket for send data                 */\r
87         EPS_SOCKET      socStat;                                        /* SNMP socket for check status             */\r
88         EPS_BOOL        reseted;                                        /* reseted                                  */\r
89         EPS_BOOL        pageend;                                        /* page end - start                         */\r
90 } EPS_PRINT_JOB_LPR;\r
91 \r
92 /*--------------------------------  LPR Local Variables  -------------------------------*/\r
93 /*******************************************|********************************************/\r
94 \r
95 /*--------------------------  Local Functions Declaration   ----------------------------*/\r
96 /*******************************************|********************************************/\r
97 static EPS_ERR_CODE StartDataSession    (EPS_PRINT_JOB_LPR*, const EPS_PRINTER_INN*     );\r
98 static EPS_ERR_CODE EndDataSession      (EPS_PRINT_JOB_LPR*                             );    \r
99 \r
100 static EPS_INT16        GetJobId                        (void                                           );\r
101 \r
102 \r
103 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
104 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
105 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
106 /*--------------------              Public Functions               ---------------------*/\r
107 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
108 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
109 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
110 void            lprSetupSTFunctions     (\r
111                                                                  \r
112                  const EPS_PRINTER_INN* printer\r
113                  \r
114 ){\r
115         EPS_LOG_FUNCIN\r
116 \r
117         snmpSetupSTFunctions(&snmp, printer);\r
118 \r
119         EPS_RETURN_VOID\r
120 }\r
121 \r
122 \r
123 EPS_UINT16      lprGetDefautiPort    (\r
124                                                                   \r
125                 void\r
126                 \r
127 ){\r
128         return LPR_PORT_NUM;\r
129 }\r
130 \r
131 \r
132 /*******************************************|********************************************/\r
133 /*                                                                                      */\r
134 /* Function name:     lprFindStart()                                                    */\r
135 /*                                                                                      */\r
136 /* Arguments                                                                            */\r
137 /* ---------                                                                            */\r
138 /* Name:        Type:               Description:                                        */\r
139 /* sock             EPS_SOCKET*         O: send discovery message socket                    */\r
140 /* address              EPS_INT8*           I: Destination address                              */\r
141 /* multi                EPS_BOOL            I: If TRUE, send multicast                          */\r
142 /*                                                                                      */\r
143 /* Return value:                                                                        */\r
144 /*      EPS_ERR_NONE                                    - Success                                       */\r
145 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
146 /*                                                                                      */\r
147 /* Description:                                                                         */\r
148 /*      Sends EPSNET_NUM_DISCOVERIES number of upnp discovery message to find                   */\r
149 /*              devices.  Discovery message is sent more than once because udp is unreliable.   */\r
150 /*                                                                                      */\r
151 /*******************************************|********************************************/\r
152 EPS_ERR_CODE lprFindStart(\r
153 \r
154                 EPS_SOCKET*             sock,\r
155                 const EPS_INT8* address,\r
156                 EPS_BOOL        multi\r
157                 \r
158 ){\r
159         EPS_LOG_FUNCIN\r
160         EPS_RETURN( snmpFindStart(sock, address, multi) )\r
161 }\r
162 \r
163 \r
164 /*******************************************|********************************************/\r
165 /*                                                                                      */\r
166 /* Function name:     lprFind()                                                         */\r
167 /*                                                                                      */\r
168 /* Arguments                                                                            */\r
169 /* ---------                                                                            */\r
170 /* Name:        Type:               Description:                                        */\r
171 /* sock             EPS_SOCKET          I: Discover Socket                                              */\r
172 /* printer              EPS_PRINTER_INN**   O: pointer for found printer structure              */\r
173 /*                                                                                      */\r
174 /* Return value:                                                                        */\r
175 /*      EPS_ERR_NONE                    - Success                                       */\r
176 /*      EPS_ERR_COMM_ERROR              - socket error                                      */\r
177 /*      EPS_ERR_MEMORY_ALLOCATION                                                                                   */\r
178 /*      EPS_ERR_PRINTER_NOT_FOUND       - printer not found                             */\r
179 /*      EPS_ERR_PRINTER_NOT_USEFUL      - received but not usefl                        */\r
180 /*                                                                                      */\r
181 /* Description:                                                                         */\r
182 /*      Receive discover messasge. Get printer name.                                    */\r
183 /*                                                                                      */\r
184 /*******************************************|********************************************/\r
185 EPS_ERR_CODE lprFind     (\r
186                                                   \r
187                 EPS_SOCKET                      sock,\r
188                 EPS_PRINTER_INN**   printer\r
189                 \r
190 ){\r
191         EPS_LOG_FUNCIN\r
192         EPS_RETURN( snmpFind(sock, LPR_PORT_NUM, EPS_PROTOCOL_LPR, printer) )\r
193 }\r
194 \r
195 \r
196 /*******************************************|********************************************/\r
197 /*                                                                                      */\r
198 /* Function name:     lprFindEnd()                                                                      */\r
199 /*                                                                                      */\r
200 /* Arguments                                                                            */\r
201 /* ---------                                                                            */\r
202 /* Name:        Type:               Description:                                        */\r
203 /* sock             EPS_SOCKET          I: Discover Socket                                              */\r
204 /*                                                                                      */\r
205 /* Return value:                                                                        */\r
206 /*      EPS_ERR_NONE                - Success                                           */\r
207 /*      EPS_ERR_COMM_ERROR          - Close socket failed                                       */\r
208 /*                                                                                      */\r
209 /* Description:                                                                         */\r
210 /*      close discover process.                                                                             */\r
211 /*                                                                                      */\r
212 /*******************************************|********************************************/\r
213 EPS_ERR_CODE lprFindEnd  (\r
214                                                   \r
215                 EPS_SOCKET sock\r
216                 \r
217 ){\r
218         EPS_LOG_FUNCIN\r
219         EPS_RETURN( snmpFindEnd(sock) )\r
220 }\r
221 \r
222 \r
223 /*******************************************|********************************************/\r
224 /*                                                                                      */\r
225 /* Function name:   lprProbePrinterByID()                                               */\r
226 /*                                                                                      */\r
227 /* Arguments                                                                            */\r
228 /* ---------                                                                            */\r
229 /* Name:        Type:               Description:                                        */\r
230 /* defstr           EPS_INT8*                   I: ID String of probe target                        */\r
231 /* timeout      EPS_UINT32          I: find timeout                                     */\r
232 /* printer          EPS_PRINTER*                O: Pointer for Alloc Printer infomation structure   */\r
233 /*                                                                                      */\r
234 /* Return value:                                                                        */\r
235 /*      EPS_ERR_NONE                - Success                                           */\r
236 /*      EPS_ERR_COMM_ERROR              - socket failed                                         */\r
237 /*      EPS_ERR_MEMORY_ALLOCATION   - Failed to allocate memory                         */\r
238 /*      EPS_ERR_PRINTER_NOT_FOUND   - printer not found                                 */\r
239 /*                                                                                      */\r
240 /* Description:                                                                         */\r
241 /*     Probe printer by ID String.                                                                      */\r
242 /*                                                                                      */\r
243 /*******************************************|********************************************/\r
244 EPS_ERR_CODE   lprProbePrinterByID (\r
245 \r
246                 EPS_INT8*                       printerUUID,\r
247                 EPS_UINT32                      timeout, \r
248                 EPS_PRINTER_INN**       printer\r
249 \r
250 ){\r
251         EPS_LOG_FUNCIN\r
252         EPS_RETURN( snmpProbeByID(printerUUID, LPR_PORT_NUM, EPS_PROTOCOL_LPR, timeout, printer) )\r
253 }\r
254 \r
255 \r
256 /*******************************************|********************************************/\r
257 /*                                                                                      */\r
258 /* Function name:     lprStartJob()                                                                                                     */\r
259 /*                                                                                      */\r
260 /* Arguments                                                                            */\r
261 /* ---------                                                                            */\r
262 /* Name:        Type:               Description:                                        */\r
263 /* printer              EPS_PRINTER_INN*        I: pointer to printer Structure                                         */\r
264 /*                                                                                      */\r
265 /* Return value:                                                                        */\r
266 /*      EPS_ERR_NONE                    - Success                                       */\r
267 /*      EPS_ERR_MEMORY_ALLOCATION       - Failed to allocate memory                     */\r
268 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
269 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
270 /* Description:                                                                         */\r
271 /*      Open socekt & Send start job messasge.                                          */\r
272 /*                                                                                      */\r
273 /*******************************************|********************************************/\r
274 EPS_ERR_CODE lprStartJob(\r
275 \r
276                 void\r
277 \r
278 ){\r
279         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
280         EPS_PRINT_JOB_LPR *lprPrintJob = NULL;\r
281 \r
282         EPS_LOG_FUNCIN\r
283 \r
284         /* Alloc LPR Job Data */\r
285         lprPrintJob = (EPS_PRINT_JOB_LPR*)EPS_ALLOC( sizeof(EPS_PRINT_JOB_LPR) );\r
286         if( NULL == lprPrintJob ){\r
287                 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )\r
288         }\r
289         memset(lprPrintJob, 0, sizeof(EPS_PRINT_JOB_LPR));\r
290         lprPrintJob->socStat = lprPrintJob->socData = EPS_INVALID_SOCKET;\r
291         lprPrintJob->reseted = FALSE;\r
292         lprPrintJob->pageend = FALSE;\r
293 \r
294         /* Establish Connection & send start job message */\r
295         ret = StartDataSession( lprPrintJob, printJob.printer );\r
296 \r
297         if( EPS_ERR_NONE == ret\r
298                 && EPS_IS_BI_PROTOCOL(printJob.printer->protocol) ){\r
299                 /* create check status */\r
300                 ret = snmpOpenSocket( &(lprPrintJob->socStat) );\r
301                 if( EPS_ERR_NONE != ret ){\r
302                         goto lprStartJob_END;\r
303                 }\r
304         }\r
305 \r
306         printJob.hProtInfo = (EPS_HANDLE)lprPrintJob;\r
307 \r
308 lprStartJob_END:\r
309 \r
310         if( EPS_ERR_NONE != ret ){\r
311                 if( EPS_INVALID_SOCKET != lprPrintJob->socStat ){\r
312                         snmpCloseSocket( &lprPrintJob->socStat );\r
313                 }\r
314 \r
315                 if( EPS_INVALID_SOCKET != lprPrintJob->socData ){\r
316                         epsNetFnc.close( lprPrintJob->socData );\r
317                         lprPrintJob->socData = EPS_INVALID_SOCKET;\r
318                 }\r
319                 EPS_SAFE_RELEASE( lprPrintJob );\r
320 \r
321                 printJob.hProtInfo = NULL;\r
322         }\r
323 \r
324         EPS_RETURN( ret )\r
325 }\r
326 \r
327 \r
328 /*******************************************|********************************************/\r
329 /*                                                                                      */\r
330 /* Function name:     lprRestartJob()                                                                                                   */\r
331 /*                                                                                      */\r
332 /* Arguments                                                                            */\r
333 /* ---------                                                                            */\r
334 /* Name:        Type:               Description:                                        */\r
335 /* N/A                                                                                  */\r
336 /*                                                                                      */\r
337 /* Return value:                                                                        */\r
338 /*      EPS_ERR_NONE                    - Success                                       */\r
339 /*      EPS_ERR_MEMORY_ALLOCATION       - Failed to allocate memory                     */\r
340 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
341 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
342 /*                                                                                      */\r
343 /* Description:                                                                         */\r
344 /*      Open socekt & Send start job messasge.                                          */\r
345 /*                                                                                      */\r
346 /*******************************************|********************************************/\r
347 EPS_ERR_CODE lprRestartJob(\r
348 \r
349                 void\r
350 \r
351 ){\r
352         EPS_PRINT_JOB_LPR *lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;\r
353         \r
354         EPS_LOG_FUNCIN\r
355 \r
356         if( NULL == lprPrintJob ){\r
357                 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )\r
358         }\r
359 \r
360         /* Establish Connection & send start job message */\r
361         EPS_RETURN( StartDataSession( lprPrintJob, printJob.printer ) )\r
362 }\r
363 \r
364 \r
365 /*******************************************|********************************************/\r
366 /*                                                                                      */\r
367 /* Function name:     lprWritePrintData()                                                                                               */\r
368 /*                                                                                      */\r
369 /* Arguments                                                                            */\r
370 /* ---------                                                                            */\r
371 /* Name:        Type:               Description:                                        */\r
372 /* buffer           EPS_UINT8*          I: Print data                                                       */\r
373 /* bufferlen    EPS_INT32               I: Print data length                                                    */\r
374 /* sendlen          EPS_INT32*          O: Sended length                                                                */\r
375 /*                                                                                      */\r
376 /* Return value:                                                                        */\r
377 /*      EPS_ERR_NONE                    - Success                                       */\r
378 /*      EPS_ERR_JOB_NOT_INITIALIZED     - JOB is NOT initialized                                                */\r
379 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
380 /*                                                                                      */\r
381 /* Description:                                                                         */\r
382 /*      Called from SendCommand, Send print data.                                                   */\r
383 /*                                                                                      */\r
384 /*******************************************|********************************************/\r
385 EPS_ERR_CODE lprWritePrintData(\r
386 \r
387                 const EPS_UINT8* buffer, \r
388                 EPS_UINT32 bufferlen, \r
389                 EPS_UINT32* sendlen\r
390                 \r
391 ){\r
392         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
393         EPS_PRINT_JOB_LPR* lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;\r
394         EPS_UINT32 timeout;\r
395         EPS_INT32  sentSize = 0;\r
396 \r
397         EPS_LOG_FUNCIN\r
398 \r
399         if( !lprPrintJob ){\r
400                 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )\r
401         }\r
402 \r
403         /* Send ESC/P-R data                                                                                                                            */\r
404         timeout = (EPS_UINT32)((EPS_IS_BI_PROTOCOL(printJob.printer->protocol))?EPSNET_BAND_SEND_TIMEOUT:EPSNET_BAND_SEND_TIMEOUTL);\r
405                 \r
406         sentSize = epsNetFnc.send(lprPrintJob->socData, (char*)buffer, (EPS_INT32)bufferlen, timeout);\r
407 \r
408         if( EPS_SOCKET_ERROR == sentSize ){\r
409                 *sendlen = 0;\r
410                 ret = EPS_ERR_COMM_ERROR;\r
411         } else if( EPS_SOCKET_TIMEOUT == sentSize ){\r
412                 *sendlen = 0;\r
413                 ret = EPS_COM_TINEOUT;\r
414         } else{\r
415                 *sendlen = (EPS_UINT32)sentSize;\r
416         }\r
417 \r
418         EPS_RETURN( ret )\r
419 }\r
420 \r
421 \r
422 /*******************************************|********************************************/\r
423 /*                                                                                      */\r
424 /* Function name:     lprEndJob()                                                                                                               */\r
425 /*                                                                                      */\r
426 /* Arguments                                                                            */\r
427 /* ---------                                                                            */\r
428 /* Name:        Type:               Description:                                        */\r
429 /* (none)                                                                               */\r
430 /*                                                                                      */\r
431 /* Return value:                                                                        */\r
432 /*      EPS_ERR_NONE                    - Success                                       */\r
433 /*      EPS_ERR_JOB_NOT_INITIALIZED     - JOB is NOT initialized                                                */\r
434 /*                                                                                      */\r
435 /* Description:                                                                         */\r
436 /*      Send endjob messasge & Close connection.                                        */\r
437 /*                                                                                      */\r
438 /*******************************************|********************************************/\r
439 EPS_ERR_CODE lprEndJob()\r
440 {\r
441         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
442         EPS_PRINT_JOB_LPR* lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;\r
443 \r
444         EPS_LOG_FUNCIN\r
445 \r
446         if( !lprPrintJob ){\r
447                 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )\r
448         }\r
449 \r
450         /* Close SendData Session */\r
451         EndDataSession(lprPrintJob);\r
452 \r
453         if( EPS_IS_BI_PROTOCOL(printJob.printer->protocol) ){\r
454                 snmpCloseSocket( &lprPrintJob->socStat );\r
455         }\r
456 \r
457         EPS_SAFE_RELEASE( printJob.hProtInfo );\r
458 \r
459         EPS_RETURN( ret )\r
460 }\r
461 \r
462 \r
463 /*******************************************|********************************************/\r
464 /*                                                                                      */\r
465 /* Function name:     lprResetPrinter()                                                                                                 */\r
466 /*                                                                                      */\r
467 /* Arguments                                                                            */\r
468 /* ---------                                                                            */\r
469 /* Name:        Type:               Description:                                        */\r
470 /* (none)                                                                               */\r
471 /*                                                                                      */\r
472 /* Return value:                                                                        */\r
473 /*      EPS_ERR_NONE                    - Success                                       */\r
474 /*      EPS_ERR_JOB_NOT_INITIALIZED     - JOB is NOT initialized                                                */\r
475 /*                                                                                      */\r
476 /* Description:                                                                         */\r
477 /*      Send endjob messasge & Close connection.                                        */\r
478 /*                                                                                      */\r
479 /*******************************************|********************************************/\r
480 EPS_ERR_CODE lprResetPrinter(\r
481 \r
482                 void\r
483 \r
484 ){\r
485         EPS_PRINT_JOB_LPR* lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;\r
486 \r
487         EPS_LOG_FUNCIN\r
488 \r
489         if( NULL == printJob.hProtInfo || NULL == printJob.printer){\r
490                 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )\r
491         }\r
492 \r
493 /*** If we already successfully called this function once for a given print job,        */\r
494     if(printJob.resetSent != EPS_RESET_SENT \r
495                 && FALSE != printJob.transmittable\r
496                 && TRUE == printJob.sendJS ){\r
497         lprMechCommand(printJob.printer, EPS_CBTCOM_RJ);\r
498     }   \r
499 \r
500         lprPrintJob->reseted = TRUE;\r
501 \r
502         /* Close SendData Session */\r
503         EPS_RETURN( EndDataSession(lprPrintJob) )\r
504 }\r
505 \r
506 \r
507 /*******************************************|********************************************/\r
508 /*                                                                                      */\r
509 /* Function name:     lprStartPage()                                                                                                    */\r
510 /*                                                                                      */\r
511 /* Arguments                                                                            */\r
512 /* ---------                                                                            */\r
513 /* Name:        Type:               Description:                                        */\r
514 /* N/A                                                                                  */\r
515 /*                                                                                      */\r
516 /* Return value:                                                                        */\r
517 /*      EPS_ERR_NONE                    - Success                                       */\r
518 /*      EPS_ERR_MEMORY_ALLOCATION       - Failed to allocate memory                     */\r
519 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
520 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
521 /*                                                                                      */\r
522 /* Description:                                                                         */\r
523 /*      Open socekt & Send start job messasge.                                          */\r
524 /*                                                                                      */\r
525 /*******************************************|********************************************/\r
526 EPS_ERR_CODE lprStartPage(\r
527 \r
528                 void\r
529 \r
530 ){\r
531         EPS_PRINT_JOB_LPR *lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;\r
532         \r
533         EPS_LOG_FUNCIN\r
534 \r
535         if( NULL == lprPrintJob ){\r
536                 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )\r
537         }\r
538 \r
539         ((EPS_PRINT_JOB_LPR*)printJob.hProtInfo)->pageend = FALSE;\r
540 \r
541         /* Establish Connection & send start job message */\r
542         EPS_RETURN( StartDataSession( lprPrintJob, printJob.printer ) )\r
543 }\r
544 \r
545 \r
546 /*******************************************|********************************************/\r
547 /*                                                                                      */\r
548 /* Function name:     lprEndPage()                                                                                                      */\r
549 /*                                                                                      */\r
550 /* Arguments                                                                            */\r
551 /* ---------                                                                            */\r
552 /* Name:        Type:               Description:                                        */\r
553 /* (none)                                                                               */\r
554 /*                                                                                      */\r
555 /* Return value:                                                                        */\r
556 /*      EPS_ERR_NONE                    - Success                                       */\r
557 /*      EPS_ERR_JOB_NOT_INITIALIZED     - JOB is NOT initialized                                                */\r
558 /*                                                                                      */\r
559 /* Description:                                                                         */\r
560 /*      Send endjob messasge & Close connection.                                        */\r
561 /*                                                                                      */\r
562 /*******************************************|********************************************/\r
563 EPS_ERR_CODE lprEndPage(\r
564 \r
565                 void\r
566 \r
567 ){\r
568         EPS_PRINT_JOB_LPR *lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;\r
569 \r
570         EPS_LOG_FUNCIN\r
571 \r
572         if( NULL == printJob.hProtInfo ){\r
573                 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )\r
574         }\r
575 \r
576         lprPrintJob->pageend = TRUE;\r
577 \r
578         /* Close SendData Session */\r
579         EPS_RETURN( EndDataSession(lprPrintJob) )\r
580 }\r
581 \r
582 \r
583 /*******************************************|********************************************/\r
584 /*                                                                                      */\r
585 /* Function name:     lprGetStatus()                                                                                                    */\r
586 /*                                                                                      */\r
587 /* Arguments                                                                            */\r
588 /* ---------                                                                            */\r
589 /* Name:        Type:               Description:                                        */\r
590 /* printer          EPS_PRINTER_INN*    I: Printer data structure                                   */\r
591 /* status               EPS_STATUS_INFO*        O: retrieve printer satus                                                   */\r
592 /* ioStatus             EPS_INT32*              O: It is possible to communicate                                    */\r
593 /* canceling    EPS_BOOL*               O: Cancel processing                                                */\r
594 /*                                                                                      */\r
595 /* Return value:                                                                        */\r
596 /*      EPS_ERR_NONE                    - Success                                       */\r
597 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
598 /*                                                                                      */ \r
599 /* Description:                                                                         */\r
600 /*      Get Printer status by SNMP.                                                                     */\r
601 /*                                                                                      */\r
602 /*******************************************|********************************************/\r
603 EPS_ERR_CODE lprGetStatus(\r
604 \r
605                 EPS_STATUS_INFO*        pstInfo,\r
606                 EPS_BOOL*                               pIoStatus,\r
607                 EPS_BOOL*                               pCancelling\r
608                 \r
609 ){\r
610         EPS_ERR_CODE            ret = EPS_ERR_NONE;\r
611         EPS_PRINTER_INN*        printer = printJob.printer;\r
612         EPS_SOCKET                      sock = EPS_INVALID_SOCKET;\r
613 \r
614         EPS_LOG_FUNCIN\r
615 \r
616         if( !EPS_IS_BI_PROTOCOL(printer->protocol) ){\r
617         EPS_RETURN( EPS_ERR_NEED_BIDIRECT );\r
618         }\r
619 \r
620     memset(pstInfo, -1, sizeof(EPS_STATUS_INFO));\r
621 \r
622         /*** Get Printer status by SNMP                                                     */\r
623         ret = snmpOpenSocket( &sock );\r
624         if( EPS_ERR_NONE != ret ){\r
625                 EPS_RETURN( ret )\r
626         }\r
627 \r
628         ret = snmp.GetStatus(sock, printer->location, pstInfo );\r
629 \r
630         if( !IS_VALID_DATA_SESSION ){\r
631                 /* Another proceessing, or printing after endjob */\r
632                 if(    EPS_ST_WAITING == pstInfo->nState \r
633                         && EPS_PRNERR_NOERROR == pstInfo->nError){\r
634                         pstInfo->nState = EPS_ST_ERROR;\r
635                         pstInfo->nError = EPS_PRNERR_BUSY;\r
636                 }\r
637         }\r
638 \r
639         if(NULL != pIoStatus && NULL != pCancelling){\r
640                 if(EPS_ERR_NONE == ret){\r
641                         if( IS_VALID_DATA_SESSION || pstInfo->nState == EPS_ST_IDLE ||\r
642                                 (IS_JOB_ACTIVE && ((EPS_PRINT_JOB_LPR*)printJob.hProtInfo)->pageend) ){\r
643                                 *pIoStatus = TRUE;\r
644                         } else{\r
645                                 *pIoStatus = FALSE;\r
646                         }\r
647 \r
648                         if( IS_JOB_ACTIVE ){\r
649                                 if( TRUE == ((EPS_PRINT_JOB_LPR*)printJob.hProtInfo)->reseted ){\r
650                                         if(EPS_ST_IDLE == pstInfo->nState){\r
651                                                 /* cancel finished */\r
652                                                 *pCancelling = FALSE;\r
653                                                 ((EPS_PRINT_JOB_LPR*)printJob.hProtInfo)->reseted = FALSE;\r
654                                         } else{\r
655                                                 /* cancelling */\r
656                                                 *pCancelling = TRUE;\r
657                                         }\r
658                                 } else  if( pstInfo->nCancel == EPS_CAREQ_CANCEL ){\r
659                                         /* cancel request from printer */\r
660                                         *pCancelling = TRUE;\r
661                                 } else{\r
662                                         *pCancelling = FALSE;\r
663                                 }\r
664                         } else{\r
665                                 *pCancelling = FALSE;\r
666                         }\r
667                 } else{\r
668                         *pIoStatus      = FALSE;\r
669                         *pCancelling    = FALSE;\r
670                 }\r
671         }\r
672 \r
673         snmpCloseSocket( &sock );\r
674         \r
675         EPS_RETURN( ret )\r
676 }\r
677 \r
678 \r
679 /*******************************************|********************************************/\r
680 /*                                                                                      */\r
681 /* Function name:     lprGetJobStatus()                                                                                         */\r
682 /*                                                                                      */\r
683 /* Arguments                                                                            */\r
684 /* ---------                                                                            */\r
685 /* Name:        Type:               Description:                                        */\r
686 /* pstInfo          EPS_STATUS_INFO*    O: retrieve printer satus                                   */\r
687 /*                                                                                      */\r
688 /* Return value:                                                                        */\r
689 /*      EPS_ERR_NONE                    - Success                                       */\r
690 /*      EPS_ERR_JOB_NOT_INITIALIZED     - JOB is NOT initialized                                                */\r
691 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
692 /*                                                                                      */\r
693 /* Description:                                                                         */\r
694 /*      Get Printer status by SNMP. It is possible to use in Job.                       */\r
695 /*                                                                                      */\r
696 /*******************************************|********************************************/\r
697 EPS_ERR_CODE lprGetJobStatus(\r
698 \r
699                 EPS_STATUS_INFO* pstInfo\r
700                 \r
701 ){\r
702         EPS_PRINT_JOB_LPR*   lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;\r
703         EPS_PRINTER_INN*     printer = (EPS_PRINTER_INN*)printJob.printer;\r
704 \r
705         EPS_LOG_FUNCIN\r
706 \r
707         /* Initialize variables */\r
708         memset(pstInfo, 0, sizeof(EPS_STATUS_INFO));\r
709 \r
710         if( !lprPrintJob ){\r
711                 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )\r
712         }\r
713         \r
714         /*** Get Printer status by SNMP                                                     */\r
715         EPS_RETURN( snmp.GetStatus( lprPrintJob->socStat, printer->location, pstInfo ) )\r
716 }\r
717 \r
718 \r
719 /*******************************************|********************************************/\r
720 /*                                                                                      */\r
721 /* Function name:     lprGetInkInfo()                                                                                                   */\r
722 /*                                                                                      */\r
723 /* Arguments                                                                            */\r
724 /* ---------                                                                            */\r
725 /* Name:        Type:               Description:                                        */\r
726 /* status               EPS_STATUS_INFO*        O: retrieve printer satus                                                   */\r
727 /*                                                                                      */\r
728 /* Return value:                                                                        */\r
729 /*      EPS_ERR_NONE                    - Success                                       */\r
730 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
731 /*                                                                                      */ \r
732 /* Description:                                                                         */\r
733 /*      Get Ink information.                                                                            */\r
734 /*                                                                                      */\r
735 /*******************************************|********************************************/\r
736 EPS_ERR_CODE lprGetInkInfo(\r
737 \r
738                 EPS_STATUS_INFO*        pstInfo\r
739                 \r
740 ){\r
741         EPS_PRINTER_INN*        printer = printJob.printer;\r
742 \r
743         EPS_LOG_FUNCIN\r
744         EPS_RETURN( snmp.GetInkInfo(printer->location, pstInfo ) )\r
745 }\r
746 \r
747 \r
748 /*******************************************|********************************************/\r
749 /*                                                                                      */\r
750 /* Function name:     lprGetPMString()                                                                                          */\r
751 /*                                                                                      */\r
752 /* Arguments                                                                            */\r
753 /* ---------                                                                            */\r
754 /* Name:        Type:               Description:                                        */\r
755 /* printer      EPS_PRINTER_INN*    I: Pointer to a PrinterInfo                         */\r
756 /* pString              EPS_UINT8*                      O: Pointer to PM String                             */\r
757 /* bufSize              EPS_INT32                       I: pString buffer size                              */\r
758 /*                                                                                      */\r
759 /* Return value:                                                                                                                                                */\r
760 /*      EPS_ERR_NONE                                    - Success                                                                               */\r
761 /*      EPS_ERR_MEMORY_ALLOCATION       - Failed to allocate memory                     */\r
762 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
763 /*      EPS_ERR_PROTOCOL_NOT_SUPPORTED  - Unsupported function Error                    */\r
764 /*                                                                                      */\r
765 /* Description:                                                                         */\r
766 /*      Sends request to printer for supported media.  Parses response and stores               */\r
767 /*              PM String : pString                                                             */\r
768 /*                                                                                      */\r
769 /*******************************************|********************************************/\r
770 EPS_ERR_CODE lprGetPMString(\r
771                                                                   \r
772                 const EPS_PRINTER_INN*  printer, \r
773                 EPS_INT32               type,\r
774         EPS_UINT8*              pString,\r
775                 EPS_INT32*              bufSize\r
776 \r
777 ){\r
778         EPS_LOG_FUNCIN\r
779         EPS_RETURN( snmp.GetPMString(printer, type, pString, bufSize) )\r
780 }\r
781 \r
782 \r
783 /*******************************************|********************************************/\r
784 /*                                                                                      */\r
785 /* Function name:   lprMechCommand()                                                    */\r
786 /*                                                                                      */\r
787 /* Arguments                                                                            */\r
788 /* ---------                                                                            */\r
789 /* Name:        Type:               Description:                                        */\r
790 /* Command      EPS_INT32           I: Command Code                                     */\r
791 /*                                                                                      */\r
792 /* Return value:                                                                        */\r
793 /*      EPS_ERR_NONE                    - Mech command executed successfully            */\r
794 /*      EPS_ERR_JOB_NOT_INITIALIZED     - JOB is NOT initialized                                                */\r
795 /*      EPS_ERR_COMM_ERROR              - Mech command execution error                  */\r
796 /*                                                                                      */\r
797 /* Description:                                                                         */\r
798 /*      Sends mechanincal commands to the printer.                                      */\r
799 /*                                                                                      */\r
800 /*******************************************|********************************************/\r
801 EPS_ERR_CODE    lprMechCommand (\r
802 \r
803         const EPS_PRINTER_INN*  printer, \r
804         EPS_INT32   Command\r
805         \r
806 ){\r
807         EPS_LOG_FUNCIN\r
808         EPS_RETURN( snmp.MechCommand(printer, Command) )\r
809 }\r
810 \r
811 \r
812 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
813 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
814 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
815 /*--------------------               Local Functions               ---------------------*/\r
816 /*%%%%%%%%%%%%%%%%%%%%                                             %%%%%%%%%%%%%%%%%%%%%*/\r
817 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
818 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
819 \r
820 /*******************************************|********************************************/\r
821 /*                                                                                      */\r
822 /* Function name:     StartDataSession()                                                                                                */\r
823 /*                                                                                      */\r
824 /* Arguments                                                                            */\r
825 /* ---------                                                                            */\r
826 /* Name:        Type:               Description:                                        */\r
827 /* lprPrintJob  EPS_PRINT_JOB_LPR*  O : LPR Job information                                                     */\r
828 /* printer      EPS_PRINTER_INN*    I : target printer information                                      */\r
829 /*                                                                                      */\r
830 /* Return value:                                                                                                                                                */\r
831 /*              EPS_ERR_NONE                                    - Success                                                                   */\r
832 /*      EPS_ERR_MEMORY_ALLOCATION       - Failed to allocate memory                     */\r
833 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
834 /*      EPS_ERR_PRINTER_ERR_OCCUR       - Printer Error happened                        */\r
835 /*                                                                                      */\r
836 /* Description:                                                                         */\r
837 /*      Starts a print job.  Establish Connection, Send StartJob message.                       */\r
838 /*                                                                                      */\r
839 /*******************************************|********************************************/\r
840 static EPS_ERR_CODE StartDataSession(\r
841 \r
842                 EPS_PRINT_JOB_LPR* lprPrintJob,\r
843                 const EPS_PRINTER_INN* printer\r
844 \r
845 ){\r
846         EPS_ERR_CODE ret = EPS_ERR_NONE;\r
847         EPS_INT16 nJobID = 0;\r
848         EPS_INT8 dname[EPS_NAME_BUFFSIZE+1];\r
849         EPS_INT8 cname[EPS_NAME_BUFFSIZE+1];\r
850         EPS_INT8 controlfile[256];\r
851 \r
852     EPS_INT8* buffer = NULL;\r
853         const char pqueue[16] = "P1";\r
854 \r
855         EPS_LOG_FUNCIN\r
856 \r
857         if(EPS_INVALID_SOCKET != lprPrintJob->socData){\r
858                 /* Already established */\r
859                 EPS_RETURN( EPS_ERR_NONE )\r
860         }\r
861 \r
862         /* Initialize variables */\r
863         buffer = (EPS_INT8*)EPS_ALLOC( LPR_MAX_BUF );\r
864         if( NULL == buffer ){\r
865                 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )\r
866         }\r
867 \r
868         /* create socket */\r
869         lprPrintJob->socData = epsNetFnc.socket(EPS_PF_INET, EPS_SOCK_STREAM, EPS_PROTOCOL_TCP);  \r
870         if( EPS_INVALID_SOCKET == lprPrintJob->socData ){\r
871                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
872                 ret = EPS_ERR_COMM_ERROR;\r
873                 goto StartDataSession_END;\r
874         }\r
875                                \r
876         /* connect to printer */\r
877         if(EPS_SOCKET_SUCCESS != epsNetFnc.connect(lprPrintJob->socData, printer->location, printer->printPort)){\r
878                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
879                 ret = EPS_ERR_COMM_ERROR;\r
880                 goto StartDataSession_END;\r
881         }\r
882 \r
883     /* -------------------------------------------------------------------------------- */\r
884     /* COMMAND: PRINTJOB                                                                                                                                */\r
885     /*      +----+-------+----+                                                                                                                 */\r
886     /*      | 02 | Queue | LF |                                                                                                                 */\r
887     /*      +----+-------+----+                                                                                                                 */\r
888         sprintf(buffer, "\x02%s\n", pqueue);\r
889 \r
890         /* send command*/\r
891         if( epsNetFnc.send(lprPrintJob->socData, buffer, (EPS_INT32)strlen(buffer), EPSNET_SEND_TIMEOUT)\r
892                 != (EPS_INT32)strlen(buffer)){\r
893                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
894                 ret = EPS_ERR_COMM_ERROR;\r
895                 goto StartDataSession_END;\r
896         }\r
897 \r
898         /* receive response */\r
899         if( 0 >= epsNetFnc.receive(lprPrintJob->socData, buffer, LPR_MAX_BUF, EPSNET_RECV_TIMEOUT) \r
900                 || buffer[0] != 0){\r
901                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
902                 ret = EPS_ERR_COMM_ERROR;\r
903                 goto StartDataSession_END;\r
904         }\r
905 \r
906     /* -------------------------------------------------------------------------------- */\r
907     /* SUBCMD: CONTROL FILE                                                                                                                             */\r
908     /*      +----+-------+----+------+----+                                                                                             */\r
909     /*      | 02 | Count | SP | Name | LF |                                                                                             */\r
910     /*      +----+-------+----+------+----+                                                                                             */\r
911     /*      Command code - 2                                                                                                                    */\r
912     /*      Operand 1 - Number of bytes in control file                                                                 */\r
913     /*      Operand 2 - Name of control file                                                                                    */\r
914         nJobID = GetJobId();\r
915         sprintf(dname, "dfA%d%s", nJobID, LPR_HOST_NAME);\r
916     sprintf(cname, "cfA%d%s", nJobID, LPR_HOST_NAME);\r
917         sprintf(controlfile, "H%s\nP%s\nv%s\nU%s\nN%s\n",\r
918             LPR_HOST_NAME, "epson", dname, dname, "epson.prn");\r
919         sprintf(buffer, "\x02%d %s\n", (EPS_UINT32)strlen(controlfile), cname);\r
920 \r
921         /* send command*/\r
922         if( epsNetFnc.send(lprPrintJob->socData, buffer, (EPS_INT32)strlen(buffer), EPSNET_SEND_TIMEOUT)\r
923                 != (EPS_INT32)strlen(buffer)){\r
924                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
925                 ret = EPS_ERR_COMM_ERROR;\r
926                 goto StartDataSession_END;\r
927         }\r
928 \r
929         /* receive response */\r
930         if( 0 >= epsNetFnc.receive(lprPrintJob->socData, buffer, LPR_MAX_BUF, EPSNET_RECV_TIMEOUT) \r
931                 || buffer[0] != 0){\r
932                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
933                 ret = EPS_ERR_COMM_ERROR;\r
934                 goto StartDataSession_END;\r
935         }\r
936 \r
937     /* -------------------------------------------------------------------------------- */\r
938     /* ADD CONTENT OF CONTROLFILE                                                                                                               */\r
939         /* send command*/\r
940         if( epsNetFnc.send(lprPrintJob->socData, controlfile, (EPS_INT32)strlen(controlfile) + 1, EPSNET_SEND_TIMEOUT) \r
941                 != (EPS_INT32)strlen(controlfile)+1){   /* Send '\0'                                                                            */\r
942                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
943                 ret = EPS_ERR_COMM_ERROR;\r
944                 goto StartDataSession_END;\r
945         }\r
946 \r
947         /* receive response */\r
948         if( 0 >= epsNetFnc.receive(lprPrintJob->socData, buffer, LPR_MAX_BUF, EPSNET_RECV_TIMEOUT) \r
949                 || buffer[0] != 0){\r
950                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
951                 ret = EPS_ERR_COMM_ERROR;\r
952                 goto StartDataSession_END;\r
953         }\r
954 \r
955     /* -------------------------------------------------------------------------------- */\r
956     /* SUBCMD: DATA FILE                                                                                                                                */\r
957     /*      +----+-------+----+------+----+                                                                                             */\r
958     /*      | 03 | Count | SP | Name | LF |                                                                                             */\r
959     /*      +----+-------+----+------+----+                                                                                             */\r
960     /*      Command code - 3                                                                                                                    */\r
961     /*      Operand 1 - Number of bytes in data file                                                                    */\r
962     /*      Operand 2 - Name of data file                                                                                               */\r
963         sprintf(buffer, "\x03%s %s\n", LPR_DUMMY_DATA_SIZE, dname);\r
964 \r
965         /* send command*/\r
966         if( epsNetFnc.send(lprPrintJob->socData, buffer, (EPS_INT32)strlen(buffer), EPSNET_SEND_TIMEOUT)\r
967                 != (EPS_INT32)strlen(buffer)){\r
968                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
969                 ret = EPS_ERR_COMM_ERROR;\r
970                 goto StartDataSession_END;\r
971         }\r
972 \r
973         /* receive response */\r
974         if( 0 >= epsNetFnc.receive(lprPrintJob->socData, buffer, LPR_MAX_BUF, EPSNET_RECV_TIMEOUT) \r
975                 || buffer[0] != 0){\r
976                 EPS_DBGPRINT(("StartDataSession ERR\n"));\r
977                 ret = EPS_ERR_COMM_ERROR;\r
978                 goto StartDataSession_END;\r
979         }\r
980 \r
981         lprPrintJob->reseted = FALSE;\r
982         lprPrintJob->pageend = FALSE;\r
983         /*printJob.hProtInfo = (EPS_HANDLE)lprPrintJob;*/\r
984 \r
985 StartDataSession_END:\r
986         if( EPS_ERR_NONE != ret ){\r
987                 if( EPS_INVALID_SOCKET != lprPrintJob->socData ){\r
988                         epsNetFnc.close( lprPrintJob->socData );\r
989                         lprPrintJob->socData = EPS_INVALID_SOCKET;\r
990                 }\r
991         }\r
992         EPS_SAFE_RELEASE( buffer );\r
993 \r
994         EPS_RETURN( ret )\r
995 }\r
996 \r
997 \r
998 /*******************************************|********************************************/\r
999 /*                                                                                      */\r
1000 /* Function name:     EndDataSession()                                                                                                  */\r
1001 /*                                                                                      */\r
1002 /* Arguments                                                                            */\r
1003 /* ---------                                                                            */\r
1004 /* Name:        Type:               Description:                                        */\r
1005 /* lprPrintJob  EPS_PRINT_JOB_LPR*  IO : LPR Job information                                                    */\r
1006 /*                                                                                      */\r
1007 /* Return value:                                                                                                                                                */\r
1008 /*      EPS_ERR_NONE                                - Success                                       */\r
1009 /*      EPS_ERR_COMM_ERROR              - Communication Error                           */\r
1010 /*                                                                                      */\r
1011 /* Description:                                                                         */\r
1012 /*      Send EndJob line to printer, shutdown/close socket.                                     */\r
1013 /*                                                                                      */\r
1014 /*******************************************|********************************************/\r
1015 static EPS_ERR_CODE EndDataSession(\r
1016                                                  \r
1017                 EPS_PRINT_JOB_LPR* lprPrintJob\r
1018                 \r
1019 ){      \r
1020         EPS_ERR_CODE ret = EPS_ERR_NONE;                                                /* Used for error handling */   \r
1021 \r
1022         EPS_LOG_FUNCIN\r
1023 \r
1024         if( EPS_INVALID_SOCKET != lprPrintJob->socData){\r
1025 #if 0 /*        This command is ineffectual. */\r
1026     /* -------------------------------------------------------------------------------- */\r
1027     /* COMMAND: End Job                                                                                                                                 */\r
1028     /*      +----+                                                                                                                                              */\r
1029     /*      | 00 |                                                                                                                                              */\r
1030     /*      +----+                                                                                                                                              */\r
1031                 EPS_INT8 buffer[LPR_MAX_BUF];\r
1032                 buffer[0] = 0x00;\r
1033                 if( epsNetFnc.send(lprPrintJob->socData, buffer, 1, EPSNET_SEND_TIMEOUT) >= 1){\r
1034                         epsNetFnc.receive(lprPrintJob->socData, buffer, LPR_MAX_BUF, EPSNET_RECV_TIMEOUT);\r
1035                 } else{\r
1036                         ret = EPS_ERR_COMM_ERROR;\r
1037                 }\r
1038 #endif\r
1039 \r
1040         /*** If we already successfully called this function once for a given print job,        */\r
1041                 epsNetFnc.shutdown(lprPrintJob->socData, EPS_SHUTDOWN_SEND);\r
1042                 epsNetFnc.shutdown(lprPrintJob->socData, EPS_SHUTDOWN_RECV);\r
1043                 epsNetFnc.shutdown(lprPrintJob->socData, EPS_SHUTDOWN_BOTH);\r
1044 \r
1045                 ret = epsNetFnc.close(lprPrintJob->socData);\r
1046                 lprPrintJob->socData = EPS_INVALID_SOCKET;\r
1047         }\r
1048 \r
1049         EPS_RETURN( ret )\r
1050 }\r
1051 \r
1052 \r
1053 /*******************************************|********************************************/\r
1054 /*                                                                                      */\r
1055 /* Function name:     GetJobId()                                                                                                                */\r
1056 /*                                                                                      */\r
1057 /* Arguments                                                                            */\r
1058 /* ---------                                                                            */\r
1059 /* (none)                                                                                                                       */\r
1060 /*                                                                                      */\r
1061 /* Return value:                                                                        */\r
1062 /*      EPS_INT16       : JobID                                                                                                 */\r
1063 /*                                                                                      */\r
1064 /* Description:                                                                         */\r
1065 /*      Generate LPR job ID (value is between from 1 to 999).                           */\r
1066 /*                                                                                      */\r
1067 /*******************************************|********************************************/\r
1068 static EPS_INT16 GetJobId(\r
1069 \r
1070                 void\r
1071 \r
1072 ){\r
1073         static EPS_INT16 nJobId = 0;\r
1074 \r
1075         nJobId++;                       /* next number but            */\r
1076         if(nJobId > 999){       /* keep cnt between 0 and 999 */\r
1077                 nJobId = 0;\r
1078         }\r
1079 \r
1080         return nJobId;\r
1081 }\r
1082 \r
1083 /*_______________________________    epson-net-lpr.c    ________________________________*/\r
1084 \r
1085 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/\r
1086 /*       1         2         3         4         5         6         7         8        */\r
1087 /*******************************************|********************************************/\r
1088 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
1089 /***** End of File *** End of File *** End of File *** End of File *** End of File ******/\r
1090 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
1091 \r