1 /*________________________________ epson-net-lpr.c _________________________________*/
\r
3 /* 1 2 3 4 5 6 7 8 */
\r
4 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/
\r
5 /*******************************************|********************************************/
\r
7 * Copyright (c) 2009 Seiko Epson Corporation All rights reserved.
\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
16 /*******************************************|********************************************/
\r
18 /* LPR protocol Module */
\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
35 /*******************************************|********************************************/
\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
48 /*----------------------------- Local Macro Definitions -------------------------------*/
\r
49 /*******************************************|********************************************/
\r
50 #ifdef EPS_LOG_MODULE_LPR
\r
51 #define EPS_LOG_MODULE EPS_LOG_MODULE_LPR
\r
53 #define EPS_LOG_MODULE 0
\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
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
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
70 /*---------------------------- ESC/P-R Lib Global Variables --------------------------*/
\r
71 /*******************************************|********************************************/
\r
73 /*** Extern Function */
\r
74 extern EPS_NET_FUNC epsNetFnc;
\r
75 extern EPS_CMN_FUNC epsCmnFnc;
\r
77 /*** Print Job Structure */
\r
78 /*** -------------------------------------------------------------------------------*/
\r
79 extern EPS_PRINT_JOB printJob;
\r
81 static EPS_SNMP_FUNCS snmp;
\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
92 /*-------------------------------- LPR Local Variables -------------------------------*/
\r
93 /*******************************************|********************************************/
\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
100 static EPS_INT16 GetJobId (void );
\r
103 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
104 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
105 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
106 /*-------------------- Public Functions ---------------------*/
\r
107 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
108 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
109 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
110 void lprSetupSTFunctions (
\r
112 const EPS_PRINTER_INN* printer
\r
117 snmpSetupSTFunctions(&snmp, printer);
\r
123 EPS_UINT16 lprGetDefautiPort (
\r
128 return LPR_PORT_NUM;
\r
132 /*******************************************|********************************************/
\r
134 /* Function name: lprFindStart() */
\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
143 /* Return value: */
\r
144 /* EPS_ERR_NONE - Success */
\r
145 /* EPS_ERR_COMM_ERROR - Communication Error */
\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
151 /*******************************************|********************************************/
\r
152 EPS_ERR_CODE lprFindStart(
\r
155 const EPS_INT8* address,
\r
160 EPS_RETURN( snmpFindStart(sock, address, multi) )
\r
164 /*******************************************|********************************************/
\r
166 /* Function name: lprFind() */
\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
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
182 /* Receive discover messasge. Get printer name. */
\r
184 /*******************************************|********************************************/
\r
185 EPS_ERR_CODE lprFind (
\r
188 EPS_PRINTER_INN** printer
\r
192 EPS_RETURN( snmpFind(sock, LPR_PORT_NUM, EPS_PROTOCOL_LPR, printer) )
\r
196 /*******************************************|********************************************/
\r
198 /* Function name: lprFindEnd() */
\r
202 /* Name: Type: Description: */
\r
203 /* sock EPS_SOCKET I: Discover Socket */
\r
205 /* Return value: */
\r
206 /* EPS_ERR_NONE - Success */
\r
207 /* EPS_ERR_COMM_ERROR - Close socket failed */
\r
210 /* close discover process. */
\r
212 /*******************************************|********************************************/
\r
213 EPS_ERR_CODE lprFindEnd (
\r
219 EPS_RETURN( snmpFindEnd(sock) )
\r
223 /*******************************************|********************************************/
\r
225 /* Function name: lprProbePrinterByID() */
\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
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
241 /* Probe printer by ID String. */
\r
243 /*******************************************|********************************************/
\r
244 EPS_ERR_CODE lprProbePrinterByID (
\r
246 EPS_INT8* printerUUID,
\r
247 EPS_UINT32 timeout,
\r
248 EPS_PRINTER_INN** printer
\r
252 EPS_RETURN( snmpProbeByID(printerUUID, LPR_PORT_NUM, EPS_PROTOCOL_LPR, timeout, printer) )
\r
256 /*******************************************|********************************************/
\r
258 /* Function name: lprStartJob() */
\r
262 /* Name: Type: Description: */
\r
263 /* printer EPS_PRINTER_INN* I: pointer to printer Structure */
\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
271 /* Open socekt & Send start job messasge. */
\r
273 /*******************************************|********************************************/
\r
274 EPS_ERR_CODE lprStartJob(
\r
279 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
280 EPS_PRINT_JOB_LPR *lprPrintJob = NULL;
\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
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
294 /* Establish Connection & send start job message */
\r
295 ret = StartDataSession( lprPrintJob, printJob.printer );
\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
306 printJob.hProtInfo = (EPS_HANDLE)lprPrintJob;
\r
310 if( EPS_ERR_NONE != ret ){
\r
311 if( EPS_INVALID_SOCKET != lprPrintJob->socStat ){
\r
312 snmpCloseSocket( &lprPrintJob->socStat );
\r
315 if( EPS_INVALID_SOCKET != lprPrintJob->socData ){
\r
316 epsNetFnc.close( lprPrintJob->socData );
\r
317 lprPrintJob->socData = EPS_INVALID_SOCKET;
\r
319 EPS_SAFE_RELEASE( lprPrintJob );
\r
321 printJob.hProtInfo = NULL;
\r
328 /*******************************************|********************************************/
\r
330 /* Function name: lprRestartJob() */
\r
334 /* Name: Type: Description: */
\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
344 /* Open socekt & Send start job messasge. */
\r
346 /*******************************************|********************************************/
\r
347 EPS_ERR_CODE lprRestartJob(
\r
352 EPS_PRINT_JOB_LPR *lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;
\r
356 if( NULL == lprPrintJob ){
\r
357 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )
\r
360 /* Establish Connection & send start job message */
\r
361 EPS_RETURN( StartDataSession( lprPrintJob, printJob.printer ) )
\r
365 /*******************************************|********************************************/
\r
367 /* Function name: lprWritePrintData() */
\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
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
382 /* Called from SendCommand, Send print data. */
\r
384 /*******************************************|********************************************/
\r
385 EPS_ERR_CODE lprWritePrintData(
\r
387 const EPS_UINT8* buffer,
\r
388 EPS_UINT32 bufferlen,
\r
389 EPS_UINT32* sendlen
\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
399 if( !lprPrintJob ){
\r
400 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )
\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
406 sentSize = epsNetFnc.send(lprPrintJob->socData, (char*)buffer, (EPS_INT32)bufferlen, timeout);
\r
408 if( EPS_SOCKET_ERROR == sentSize ){
\r
410 ret = EPS_ERR_COMM_ERROR;
\r
411 } else if( EPS_SOCKET_TIMEOUT == sentSize ){
\r
413 ret = EPS_COM_TINEOUT;
\r
415 *sendlen = (EPS_UINT32)sentSize;
\r
422 /*******************************************|********************************************/
\r
424 /* Function name: lprEndJob() */
\r
428 /* Name: Type: Description: */
\r
431 /* Return value: */
\r
432 /* EPS_ERR_NONE - Success */
\r
433 /* EPS_ERR_JOB_NOT_INITIALIZED - JOB is NOT initialized */
\r
436 /* Send endjob messasge & Close connection. */
\r
438 /*******************************************|********************************************/
\r
439 EPS_ERR_CODE lprEndJob()
\r
441 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
442 EPS_PRINT_JOB_LPR* lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;
\r
446 if( !lprPrintJob ){
\r
447 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )
\r
450 /* Close SendData Session */
\r
451 EndDataSession(lprPrintJob);
\r
453 if( EPS_IS_BI_PROTOCOL(printJob.printer->protocol) ){
\r
454 snmpCloseSocket( &lprPrintJob->socStat );
\r
457 EPS_SAFE_RELEASE( printJob.hProtInfo );
\r
463 /*******************************************|********************************************/
\r
465 /* Function name: lprResetPrinter() */
\r
469 /* Name: Type: Description: */
\r
472 /* Return value: */
\r
473 /* EPS_ERR_NONE - Success */
\r
474 /* EPS_ERR_JOB_NOT_INITIALIZED - JOB is NOT initialized */
\r
477 /* Send endjob messasge & Close connection. */
\r
479 /*******************************************|********************************************/
\r
480 EPS_ERR_CODE lprResetPrinter(
\r
485 EPS_PRINT_JOB_LPR* lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;
\r
489 if( NULL == printJob.hProtInfo || NULL == printJob.printer){
\r
490 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )
\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
500 lprPrintJob->reseted = TRUE;
\r
502 /* Close SendData Session */
\r
503 EPS_RETURN( EndDataSession(lprPrintJob) )
\r
507 /*******************************************|********************************************/
\r
509 /* Function name: lprStartPage() */
\r
513 /* Name: Type: Description: */
\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
523 /* Open socekt & Send start job messasge. */
\r
525 /*******************************************|********************************************/
\r
526 EPS_ERR_CODE lprStartPage(
\r
531 EPS_PRINT_JOB_LPR *lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;
\r
535 if( NULL == lprPrintJob ){
\r
536 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )
\r
539 ((EPS_PRINT_JOB_LPR*)printJob.hProtInfo)->pageend = FALSE;
\r
541 /* Establish Connection & send start job message */
\r
542 EPS_RETURN( StartDataSession( lprPrintJob, printJob.printer ) )
\r
546 /*******************************************|********************************************/
\r
548 /* Function name: lprEndPage() */
\r
552 /* Name: Type: Description: */
\r
555 /* Return value: */
\r
556 /* EPS_ERR_NONE - Success */
\r
557 /* EPS_ERR_JOB_NOT_INITIALIZED - JOB is NOT initialized */
\r
560 /* Send endjob messasge & Close connection. */
\r
562 /*******************************************|********************************************/
\r
563 EPS_ERR_CODE lprEndPage(
\r
568 EPS_PRINT_JOB_LPR *lprPrintJob = (EPS_PRINT_JOB_LPR*)printJob.hProtInfo;
\r
572 if( NULL == printJob.hProtInfo ){
\r
573 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )
\r
576 lprPrintJob->pageend = TRUE;
\r
578 /* Close SendData Session */
\r
579 EPS_RETURN( EndDataSession(lprPrintJob) )
\r
583 /*******************************************|********************************************/
\r
585 /* Function name: lprGetStatus() */
\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
595 /* Return value: */
\r
596 /* EPS_ERR_NONE - Success */
\r
597 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
600 /* Get Printer status by SNMP. */
\r
602 /*******************************************|********************************************/
\r
603 EPS_ERR_CODE lprGetStatus(
\r
605 EPS_STATUS_INFO* pstInfo,
\r
606 EPS_BOOL* pIoStatus,
\r
607 EPS_BOOL* pCancelling
\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
616 if( !EPS_IS_BI_PROTOCOL(printer->protocol) ){
\r
617 EPS_RETURN( EPS_ERR_NEED_BIDIRECT );
\r
620 memset(pstInfo, -1, sizeof(EPS_STATUS_INFO));
\r
622 /*** Get Printer status by SNMP */
\r
623 ret = snmpOpenSocket( &sock );
\r
624 if( EPS_ERR_NONE != ret ){
\r
628 ret = snmp.GetStatus(sock, printer->location, pstInfo );
\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
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
645 *pIoStatus = FALSE;
\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
656 *pCancelling = TRUE;
\r
658 } else if( pstInfo->nCancel == EPS_CAREQ_CANCEL ){
\r
659 /* cancel request from printer */
\r
660 *pCancelling = TRUE;
\r
662 *pCancelling = FALSE;
\r
665 *pCancelling = FALSE;
\r
668 *pIoStatus = FALSE;
\r
669 *pCancelling = FALSE;
\r
673 snmpCloseSocket( &sock );
\r
679 /*******************************************|********************************************/
\r
681 /* Function name: lprGetJobStatus() */
\r
685 /* Name: Type: Description: */
\r
686 /* pstInfo EPS_STATUS_INFO* O: retrieve printer satus */
\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
694 /* Get Printer status by SNMP. It is possible to use in Job. */
\r
696 /*******************************************|********************************************/
\r
697 EPS_ERR_CODE lprGetJobStatus(
\r
699 EPS_STATUS_INFO* pstInfo
\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
707 /* Initialize variables */
\r
708 memset(pstInfo, 0, sizeof(EPS_STATUS_INFO));
\r
710 if( !lprPrintJob ){
\r
711 EPS_RETURN( EPS_ERR_JOB_NOT_INITIALIZED )
\r
714 /*** Get Printer status by SNMP */
\r
715 EPS_RETURN( snmp.GetStatus( lprPrintJob->socStat, printer->location, pstInfo ) )
\r
719 /*******************************************|********************************************/
\r
721 /* Function name: lprGetInkInfo() */
\r
725 /* Name: Type: Description: */
\r
726 /* status EPS_STATUS_INFO* O: retrieve printer satus */
\r
728 /* Return value: */
\r
729 /* EPS_ERR_NONE - Success */
\r
730 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
733 /* Get Ink information. */
\r
735 /*******************************************|********************************************/
\r
736 EPS_ERR_CODE lprGetInkInfo(
\r
738 EPS_STATUS_INFO* pstInfo
\r
741 EPS_PRINTER_INN* printer = printJob.printer;
\r
744 EPS_RETURN( snmp.GetInkInfo(printer->location, pstInfo ) )
\r
748 /*******************************************|********************************************/
\r
750 /* Function name: lprGetPMString() */
\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
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
766 /* Sends request to printer for supported media. Parses response and stores */
\r
767 /* PM String : pString */
\r
769 /*******************************************|********************************************/
\r
770 EPS_ERR_CODE lprGetPMString(
\r
772 const EPS_PRINTER_INN* printer,
\r
774 EPS_UINT8* pString,
\r
779 EPS_RETURN( snmp.GetPMString(printer, type, pString, bufSize) )
\r
783 /*******************************************|********************************************/
\r
785 /* Function name: lprMechCommand() */
\r
789 /* Name: Type: Description: */
\r
790 /* Command EPS_INT32 I: Command Code */
\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
798 /* Sends mechanincal commands to the printer. */
\r
800 /*******************************************|********************************************/
\r
801 EPS_ERR_CODE lprMechCommand (
\r
803 const EPS_PRINTER_INN* printer,
\r
808 EPS_RETURN( snmp.MechCommand(printer, Command) )
\r
812 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
813 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
814 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
815 /*-------------------- Local Functions ---------------------*/
\r
816 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
817 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
818 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
820 /*******************************************|********************************************/
\r
822 /* Function name: StartDataSession() */
\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
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
837 /* Starts a print job. Establish Connection, Send StartJob message. */
\r
839 /*******************************************|********************************************/
\r
840 static EPS_ERR_CODE StartDataSession(
\r
842 EPS_PRINT_JOB_LPR* lprPrintJob,
\r
843 const EPS_PRINTER_INN* printer
\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
852 EPS_INT8* buffer = NULL;
\r
853 const char pqueue[16] = "P1";
\r
857 if(EPS_INVALID_SOCKET != lprPrintJob->socData){
\r
858 /* Already established */
\r
859 EPS_RETURN( EPS_ERR_NONE )
\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
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
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
883 /* -------------------------------------------------------------------------------- */
\r
884 /* COMMAND: PRINTJOB */
\r
885 /* +----+-------+----+ */
\r
886 /* | 02 | Queue | LF | */
\r
887 /* +----+-------+----+ */
\r
888 sprintf(buffer, "\x02%s\n", pqueue);
\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
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
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
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
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
937 /* -------------------------------------------------------------------------------- */
\r
938 /* ADD CONTENT OF CONTROLFILE */
\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
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
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
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
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
981 lprPrintJob->reseted = FALSE;
\r
982 lprPrintJob->pageend = FALSE;
\r
983 /*printJob.hProtInfo = (EPS_HANDLE)lprPrintJob;*/
\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
992 EPS_SAFE_RELEASE( buffer );
\r
998 /*******************************************|********************************************/
\r
1000 /* Function name: EndDataSession() */
\r
1004 /* Name: Type: Description: */
\r
1005 /* lprPrintJob EPS_PRINT_JOB_LPR* IO : LPR Job information */
\r
1007 /* Return value: */
\r
1008 /* EPS_ERR_NONE - Success */
\r
1009 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
1011 /* Description: */
\r
1012 /* Send EndJob line to printer, shutdown/close socket. */
\r
1014 /*******************************************|********************************************/
\r
1015 static EPS_ERR_CODE EndDataSession(
\r
1017 EPS_PRINT_JOB_LPR* lprPrintJob
\r
1020 EPS_ERR_CODE ret = EPS_ERR_NONE; /* Used for error handling */
\r
1024 if( EPS_INVALID_SOCKET != lprPrintJob->socData){
\r
1025 #if 0 /* This command is ineffectual. */
\r
1026 /* -------------------------------------------------------------------------------- */
\r
1027 /* COMMAND: End Job */
\r
1031 EPS_INT8 buffer[LPR_MAX_BUF];
\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
1036 ret = EPS_ERR_COMM_ERROR;
\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
1045 ret = epsNetFnc.close(lprPrintJob->socData);
\r
1046 lprPrintJob->socData = EPS_INVALID_SOCKET;
\r
1053 /*******************************************|********************************************/
\r
1055 /* Function name: GetJobId() */
\r
1061 /* Return value: */
\r
1062 /* EPS_INT16 : JobID */
\r
1064 /* Description: */
\r
1065 /* Generate LPR job ID (value is between from 1 to 999). */
\r
1067 /*******************************************|********************************************/
\r
1068 static EPS_INT16 GetJobId(
\r
1073 static EPS_INT16 nJobId = 0;
\r
1075 nJobId++; /* next number but */
\r
1076 if(nJobId > 999){ /* keep cnt between 0 and 999 */
\r
1083 /*_______________________________ epson-net-lpr.c ________________________________*/
\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