[13] | 1 | Using RPUPortQuery & RPUPortSet
|
---|
| 2 | ===============================
|
---|
[3] | 3 |
|
---|
[13] | 4 | These functions return or accept a buffer (passed as a REXX string) which
|
---|
| 5 | contains the current port configuration data as raw bytes. The format of
|
---|
| 6 | this data depends on the port driver which controls the particular port
|
---|
| 7 | being queried or set.
|
---|
| 8 |
|
---|
| 9 | The data formats for several common port drivers are described below.
|
---|
| 10 |
|
---|
| 11 | NOTE: All data must be in raw byte (or 'character') form. This is the form
|
---|
| 12 | outputted by functions like D2C() or X2C().
|
---|
| 13 |
|
---|
| 14 | In addition, multi-byte integer values like (U)LONG and (U)SHORT must
|
---|
| 15 | be passed in little-endian order.
|
---|
| 16 |
|
---|
| 17 | i.e.
|
---|
| 18 | To convert <number> to USHORT: ushort = REVERSE( X2C( D2X( number, 4 )))
|
---|
| 19 | To convert <number> to ULONG: ulong = REVERSE( X2C( D2X( number, 8 )))
|
---|
| 20 |
|
---|
| 21 |
|
---|
| 22 | SERIAL.PDR, PARALLEL.PDR
|
---|
| 23 | ------------------------
|
---|
| 24 |
|
---|
[3] | 25 | The standard serial and parallel port drivers do not support the SplPdSet API.
|
---|
| 26 |
|
---|
| 27 |
|
---|
[13] | 28 | PAR1284.PDR
|
---|
| 29 | -----------
|
---|
| 30 |
|
---|
| 31 | The high-speed BIDI parallel port (PAR1284) driver uses a data structure with
|
---|
| 32 | the following format (information taken from IBM DDK headers):
|
---|
| 33 |
|
---|
| 34 | typedef struct _PORTSETTINGS{
|
---|
[3] | 35 | ULONG signature; /* Must be 0x52464E49 ('INFR') */
|
---|
| 36 | ULONG ulVersion; /* Must be 0x00000001 */
|
---|
| 37 | ULONG flStatus; /* Status flags: */
|
---|
| 38 | /* 0x00000001 BIDI_Q_PORT set (bidi enabled)*/
|
---|
| 39 | /* 0x00000002 Set after 1st attempt at bidi */
|
---|
| 40 | /* 0x00000004 Port connected to print queue */
|
---|
| 41 | /* 0x00000008 Port already open */
|
---|
| 42 | /* 0x00000010 Port open in progress */
|
---|
| 43 | /* 0x00000020 SplPdOpen being processed */
|
---|
| 44 | /* 0x00000040 SplPdClose being processed */
|
---|
| 45 | /* 0x00000080 XlateCmd has more alerts left */
|
---|
| 46 | /* 0x00000100 New printer or powered off */
|
---|
| 47 | /* 0x00000200 Set when deviceId was checked */
|
---|
| 48 | /* after first good write to a */
|
---|
| 49 | /* unidirectional printer. */
|
---|
| 50 | /* 0x00000400 Set when last write was sent */
|
---|
| 51 | /* using ECP mode cmd channel. */
|
---|
| 52 | /* 0x00000800 Set when printer put in bidi */
|
---|
| 53 | /* mode and DeviceID received. */
|
---|
| 54 | /* 0x00001000 Set when CommStatChange alert */
|
---|
| 55 | /* was posted to spooler. */
|
---|
| 56 | /* Cleared after BIDI_Q_PORT */
|
---|
| 57 | /* 0x00002000 Set when CommStatChange alert */
|
---|
| 58 | /* should not be set */
|
---|
| 59 | /* 0x00004000 Set when port has a network */
|
---|
| 60 | /* connection */
|
---|
| 61 | ULONG flBidiCapabilities; /* PRTPORT.flBidiCapabilities _CAPS_ */
|
---|
| 62 | ULONG flBidiProtocol; /* PRTPORT.flBidiProtocol _TYPE_ */
|
---|
| 63 | ULONG flJob; /* PRTSW.flJob flags */
|
---|
| 64 | ULONG flDevice; /* PRTSW.flDevice flags */
|
---|
| 65 | ULONG ulModeSelected; /* Mode selected by user(see PARMODE_) */
|
---|
| 66 | ULONG ulCurrentMode; /* Current mode of port(see CURMODE_) */
|
---|
| 67 | BOOL fShareAccess; /* Share port with DOS/Windows */
|
---|
| 68 | ULONG ulPrintTimeOut; /* Seconds to continue to retry job */
|
---|
| 69 | /* write request in SplPdWrite(). */
|
---|
| 70 | /* Default: 45 seconds */
|
---|
| 71 | ULONG ulNoQueryTimeOut; /* Seconds from last query until */
|
---|
| 72 | /* port drops printer connection */
|
---|
| 73 | /* Default: 180 seconds */
|
---|
| 74 | ULONG ulNoJobTimeOut; /* Seconds from last job sent until */
|
---|
| 75 | /* port drops printer connection */
|
---|
| 76 | /* NOTE: Connection can be dropped */
|
---|
| 77 | /* sooner if PDR receives */
|
---|
| 78 | /* BIDI_NOTIFY_ENDJOBCONNECT */
|
---|
| 79 | /* This is used if we lose */
|
---|
| 80 | /* a job acknowledgement so */
|
---|
| 81 | /* that other Apps can use the */
|
---|
| 82 | /* infrared port. */
|
---|
| 83 | /* Default: 300 seconds */
|
---|
| 84 | /* */
|
---|
| 85 | PPTIMEOUTCHANNEL TimeOut; /* Read and Write timeouts */
|
---|
| 86 | /* */
|
---|
| 87 | /* */
|
---|
| 88 | /* The following ulpsz fields are */
|
---|
| 89 | /* offsets from the beginning of */
|
---|
| 90 | /* this PORTSETTINGS structure to */
|
---|
| 91 | /* the variable length strings. */
|
---|
| 92 | /* This allows us to pass the buffer */
|
---|
| 93 | /* intact to PrtQuery and PrtSet, */
|
---|
| 94 | /* even across the network. */
|
---|
| 95 | /* All strings are packed immediately */
|
---|
| 96 | /* after the fixed-length PORTSETTINGS */
|
---|
| 97 | /* structure. */
|
---|
| 98 | /* */
|
---|
| 99 | /* An offset of 0 means no string */
|
---|
| 100 | /* */
|
---|
| 101 | ULONG ulpszPortName; /* -> name of port info is for */
|
---|
| 102 | ULONG ulpszDeviceID; /* -> 1284 deviceID for printer on port */
|
---|
| 103 | } PORTSETTINGS, *PPORTSETTINGS;
|
---|
| 104 |
|
---|
[13] | 105 | /* Structure for setting timeouts */
|
---|
| 106 | /* */
|
---|
| 107 | /* This port driver will assume that bidi capable printers can accept */
|
---|
| 108 | /* data at a reasonable rate, so the WriteIdle timeout will default to a */
|
---|
| 109 | /* small value(like 15 seconds). The actual WriteTimeout specified by */
|
---|
| 110 | /* the user can be larger, and our PdWrite API will handle retrying */
|
---|
| 111 | /* requests that do not complete. However, we will always have a */
|
---|
| 112 | /* ParReadThread for each bidi port, and this read will typically be */
|
---|
| 113 | /* queued up after the write. When a write completes(even if only */
|
---|
| 114 | /* partial buffer was sent), the queued read request will reverse the */
|
---|
| 115 | /* channel and check for data coming from the printer. This read must */
|
---|
| 116 | /* not take a long time(to avoid performance degradation for writes). */
|
---|
| 117 | /* */
|
---|
| 118 | /* We set a small ReadInterrupt timeout( about 200 ms default ) so that */
|
---|
| 119 | /* if no data is waiting to be read, the read request returns and lets */
|
---|
| 120 | /* the write request be processed. */
|
---|
| 121 | /* */
|
---|
| 122 | /* We set a longer ReadIdle timeout( 1000 ms ) to attempt to get the */
|
---|
| 123 | /* entire buffer from the peripheral if there is data waiting to be sent */
|
---|
| 124 | /* to the host. */
|
---|
| 125 | /* */
|
---|
| 126 | /* For now, we set the WriteIdle and WriteInterrupt timeouts to be the */
|
---|
| 127 | /* same. This means we will always return within the WriteIdle timeout */
|
---|
| 128 | /* value specified. */
|
---|
| 129 | /* */
|
---|
[3] | 130 | typedef struct _PPTIMEOUTCHANNEL{
|
---|
| 131 | ULONG ulReadIdleTimeOut; // millisecs DD has to complete entire Read
|
---|
| 132 | ULONG ulReadIntTimeOut; // millisecs DD waits for Read interrupt
|
---|
| 133 | ULONG ulWriteIdleTimeOut; // millisecs DD has to complete entire Write
|
---|
| 134 | ULONG ulWriteIntTimeOut; // millisecs DD waits for Write interrupt
|
---|
| 135 | ULONG ulLogChannel; // 1=use data channel, 2=use address channel
|
---|
| 136 | } PPTIMEOUTCHANNEL, *PPPTIMEOUTCHANNEL;
|
---|
| 137 |
|
---|
[13] | 138 | (Refer to the header file wpshell\src\wpsh\par1284\pdrtypes.h from the IBM
|
---|
| 139 | DDK for more information.)
|
---|
[3] | 140 |
|
---|
| 141 |
|
---|
[13] | 142 | CUPS.PDR
|
---|
| 143 | --------
|
---|
[3] | 144 |
|
---|
[13] | 145 | The eCups port driver (CUPS.PDR) uses the following port settings structure:
|
---|
[3] | 146 |
|
---|
| 147 | typedef struct _PORTSETTINGS {
|
---|
| 148 | CHAR szHost[ 65 ]; // CUPS server hostname/IP
|
---|
| 149 | CHAR szQueue[ 65 ]; // CUPS printer queue name
|
---|
| 150 | } PORTSETTINGS, *PPORTSETTINGS;
|
---|
| 151 |
|
---|
[13] | 152 | (At least version 1.04 of CUPS.PDR is required.)
|
---|
[3] | 153 |
|
---|
| 154 |
|
---|
[13] | 155 | SMB.PDR
|
---|
| 156 | -------
|
---|
[3] | 157 |
|
---|
[13] | 158 | The Samba port driver (SMB.PDR) takes a single 256-byte buffer. This
|
---|
| 159 | buffer must take the following format:
|
---|
[3] | 160 |
|
---|
[13] | 161 | host#printer#workgroup#userid#copies#password
|
---|
| 162 |
|
---|
| 163 | All fields are required; those whose values are unspecified must be left
|
---|
| 164 | empty. (Replace each field name above with its corresponding value.)
|
---|
| 165 | The buffer is padded with 0 bytes to a length of 256 as needed.
|
---|
| 166 |
|
---|
| 167 | The 'password' field is a hexadecimal string; all others are standard
|
---|
| 168 | character strings.
|
---|
| 169 |
|
---|
| 170 | For example, to set the following configuration:
|
---|
| 171 | host: PRINTSRV
|
---|
| 172 | printer: LJET01
|
---|
| 173 | workgroup: <none>
|
---|
| 174 | userid: mrmuffin
|
---|
| 175 | password: blueberry
|
---|
| 176 | copies: 1
|
---|
| 177 |
|
---|
| 178 | In REXX:
|
---|
| 179 | params = 'PRINTSRV#LJET01##mrmuffin#1#626C75656265727279'
|
---|
| 180 | IF LENGTH( params <= 256 ) THEN DO
|
---|
| 181 | buffer = params || COPIES('00'x, 256 - LENGTH( params ))
|
---|
| 182 | CALL RPUPortSet 'SMB', buffer
|
---|
| 183 | END
|
---|
| 184 |
|
---|