Jump to content

SplPdSendCmd: Difference between revisions

From EDM2
Created page with "SplPdSendCmd is an API exported by port drivers. It is called by a protocol converter to send protocol-specific commands to the printer. SplPdSendCmd does not return any respo..."
 
Ak120 (talk | contribs)
mNo edit summary
 
Line 1: Line 1:
SplPdSendCmd is an API exported by port drivers. It is called by a protocol converter to send protocol-specific commands to the printer. SplPdSendCmd does not return any response data from the printer. This is an optional API.  
SplPdSendCmd is an API exported by port drivers. It is called by a protocol converter to send protocol-specific commands to the printer. SplPdSendCmd does not return any response data from the printer. This is an optional API.


If the port driver exports SplPdSendCmd, the spooler passes the address of this function to the BIDI protocol converter SplProtSendCmd. The purpose is to achieve better performance of query requests.  
If the port driver exports SplPdSendCmd, the spooler passes the address of this function to the BIDI protocol converter SplProtSendCmd. The purpose is to achieve better performance of query requests.


== Syntax ==  
== Syntax ==
  SplPdSendCmd(pszPortName, flOptions, ulCommand, pInData, cbInData);
  SplPdSendCmd(pszPortName, flOptions, ulCommand, pInData, cbInData)


== Parameters ==
== Parameters ==
; pszPortName (PSZ) - input  
; pszPortName (PSZ) - input: Port name.
: Port name.  
:Following is an example of a port name: LPT1
 
:This will be a locally defined port name.
:Following is an example of a port name:  
; flOptions (ULONG) - input : Flags defining how to send the data to the printer.
    LPT1
: All other bits must be clear. Values are as follows:
 
:: FLG_MUSTCOMPLETE - 0x00000001 : If set, the caller does not want to return until the command sequence is sent to the printer.
:This will be a locally defined port name.  
:::If this flag is not set, the caller returns immediately if unable to send the command. For example, the command might not be sent if the printer is being sent a job and the printer cannot accept commands inside a job boundary.
 
:: FLG_SYNCH - 0x00000002 : If set, waits for any current job to finish being sent to the printer before sending this command sequence.
; flOptions (ULONG) - input : Flags defining how to send the data to the printer.  
:: FLG_MORECMDS - 0x00000004 : If set, more SplPdSendCmd calls are necessary to complete the current query or set command.
 
:: FLG_DATACHANNEL - 0x00000008 : If set, the data channel should be used for this command.
: All other bits must be clear. Values are as follows:  
:::The data channel is the channel into the printer on which print job data is sent. Some printers also support a command channel, such as SNMP, which can be used to send commands into the printer.
 
:::However, some commands must be sent to the printer using the data channel instead of the command channel (for example, sending a PJL query requires sending the PJL command via the data channel.)
:;FLG_MUSTCOMPLETE - 0x00000001  
:: FLG_SNMPCHANNEL - 0x00000010 : If set, the SNMP channel should be used for this command.
::If set, the caller does not want to return until the command sequence is sent to the printer.  
:::If this flag is set and there is no SNMP channel available, ERROR_INVALID_PATH(253) is returned.
 
:: FLG_RESERVEDCHANNEL - 0x00000020 : This bit may be used to access a special channel in the port driver. If this flag is set and the port driver does not support a special channel, the default command channel should be used to send this data to the printer.
::If this flag is not set, the caller returns immediately if unable to send the command. For example, the command might not be sent if the printer is being sent a job and the printer cannot accept commands inside a job boundary.  
; ulCommand (ULONG) - input : Generic command code.
 
: This code is given to the port driver for information only. The pInData parameter contains the BIDI software protocol-specific packet to send to the printer.
:;FLG_SYNCH - 0x00000002  
: Current commands are as follows:
::If set, waits for any current job to finish being sent to the printer before sending this command sequence.  
::BIDI_Q_SW(800Ch) : Query BIDI software capabilities.
 
::BIDI_Q_DEVICE(800Dh) : Query printer device characteristics.
:;FLG_MORECMDS - 0x00000004  
::BIDI_Q_INTERPRETER(800Eh) : Query interpreters available in the printer.
::If set, more SplPdSendCmd calls are necessary to complete the current query or set command.  
::BIDI_Q_INPUTBINS(800Fh) : Query input bins.
 
::BIDI_Q_OUTPUTBINS(8010h) : Query output bins.
:;FLG_DATACHANNEL - 0x00000008  
::BIDI_Q_FONTS(8012h) : Query fonts for a particular interpreter.
::If set, the data channel should be used for this command.  
::BIDI_Q_JOBS_COMPLETE(8013h) : Query list of completed jobs.
 
::BIDI_Q_JOBS_QUEUED(8014h) : Query list of queued jobs.
::The data channel is the channel into the printer on which print job data is sent. Some printers also support a command channel, such as SNMP, which can be used to send commands into the printer.  
::BIDI_Q_STATUS(8015h) : Query current status of the print device.
 
::BIDI_Q_STORAGE(8023h) : Return printer storage media.
::However, some commands must be sent to the printer using the data channel instead of the command channel (for example, sending a PJL query requires sending the PJL command via the data channel.)  
; pInData (PVOID) - input : Contains the command sequence to pass to the printer.
 
: This parameter will not be altered by the port driver.
:;FLG_SNMPCHANNEL - 0x00000010  
; cbInData (ULONG) - input : Length of command sequence in pInData, in bytes.
::If set, the SNMP channel should be used for this command.  
 
::If this flag is set and there is no SNMP channel available, ERROR_INVALID_PATH(253) is returned.  
 
:;FLG_RESERVEDCHANNEL - 0x00000020  
::This bit may be used to access a special channel in the port driver. If this flag is set and the port driver does not support a special channel, the default command channel should be used to send this data to the printer.  
 
; ulCommand (ULONG) - input : Generic command code.  
: This code is given to the port driver for information only. The pInData parameter contains the BIDI software protocol-specific packet to send to the printer.  
 
: Current commands are as follows:  
 
::BIDI_Q_SW(800Ch)  
::Query BIDI software capabilities.  
 
::BIDI_Q_DEVICE(800Dh)  
::Query printer device characteristics.  
 
::BIDI_Q_INTERPRETER(800Eh)  
::Query interpreters available in the printer.  
 
::BIDI_Q_INPUTBINS(800Fh)  
::Query input bins.  
 
::BIDI_Q_OUTPUTBINS(8010h)  
::Query output bins.  
 
::BIDI_Q_FONTS(8012h)  
::Query fonts for a particular interpreter.  
 
::BIDI_Q_JOBS_COMPLETE(8013h)  
::Query list of completed jobs.  
 
::BIDI_Q_JOBS_QUEUED(8014h)  
::Query list of queued jobs.  
 
::BIDI_Q_STATUS(8015h)  
::Query current status of the print device.  
 
::BIDI_Q_STORAGE(8023h)  
::Return printer storage media.  
 
; pInData (PVOID) - input  
: Contains the command sequence to pass to the printer.  
 
: This parameter will not be altered by the port driver.  
 
; cbInData (ULONG) - input  
: Length of command sequence in pInData, in bytes.  


== Returns ==
== Returns ==
; rc (ULONG) - returns : Return codes.  
; rc (ULONG) - returns : Return codes.  
* 0 Success  
* 0 Success  
* 2(ERROR_FILE_NOT_FOUND)  
* 2(ERROR_FILE_NOT_FOUND) : The pszPortName given is not a valid port name configured for this port driver.
: The pszPortName given is not a valid port name configured for this port driver.  
* 5(ERROR_ACCESS_DENIED) : Not authorized to access printer port.
* 5(ERROR_ACCESS_DENIED)  
* 8(ERROR_NOT_ENOUGH_MEMORY) : Not enough memory to satisfy request.
: Not authorized to access printer port.  
* 29(ERROR_WRITE_FAULT) : Failure attempting to write to the device. The printer might not have received the command sequence.
* 8(ERROR_NOT_ENOUGH_MEMORY)  
* 87(ERROR_INVALID_PARAMETER) : An invalid buffer was given.
: Not enough memory to satisfy request.  
* 253(ERROR_INVALID_PATH) : Invalid channel requested.
* 29(ERROR_WRITE_FAULT)  
* 683(ERROR_BIDI_NO_SUPPORT) : The printer is not in bidirectional mode, therefore query requests are not honored. The port also may be in the process of being shut down.
: Failure attempting to write to the device. The printer might not have received the command sequence.  
* 87(ERROR_INVALID_PARAMETER)  
: An invalid buffer was given.  
* 253(ERROR_INVALID_PATH)  
: Invalid channel requested.  
* 683(ERROR_BIDI_NO_SUPPORT)  
: The printer is not in bidirectional mode, therefore query requests are not honored. The port also may be in the process of being shut down.  


:0x4013(PMERR_SPL_JOB_PRINTING)  
:0x4013(PMERR_SPL_JOB_PRINTING)  
:A job is being sent to the printer, the printer cannot accept commands while receiving job data, and FLG_MUSTCOMPLETE is clear.  
:A job is being sent to the printer, the printer cannot accept commands while receiving job data, and FLG_MUSTCOMPLETE is clear.  


:0x403D(PMERR_SPL_CNV_NOT_INIT)  
:0x403D(PMERR_SPL_CNV_NOT_INIT) :The protocol converter or port driver has not been initialized for this port.
:The protocol converter or port driver has not been initialized for this port.  
 


== Sample ==
== Sample ==
Line 128: Line 70:
rc = SplPdSendCmd(pszPortName, flOptions,
rc = SplPdSendCmd(pszPortName, flOptions,
       ulCommand, pInData, cbInData);
       ulCommand, pInData, cbInData);
</pre>
</pre>


== Remarks ==
== Remarks ==
The caller will only wait for a response inside the protocol converter, because the protocol converter is the only part of the system that can match a command with the printer's response.


The caller will only wait for a response inside the protocol converter, because the protocol converter is the only part of the system that can match a command with the printer's response.
If the last SplPdSendCmd has FLG_MORECMDS set and no new SplPdSendCmd is issued for the port driver's timeout, then the port driver should allow a job to be sent. This can happen only when there is a problem with the protocol converter.
 
If the last SplPdSendCmd has FLG_MORECMDS set and no new SplPdSendCmd is issued for the port driver's timeout, then the port driver should allow a job to be sent. This can happen only when there is a problem with the protocol converter.  
 


[[Category:Spl]]
[[Category:Spl]]

Latest revision as of 18:38, 2 July 2023

SplPdSendCmd is an API exported by port drivers. It is called by a protocol converter to send protocol-specific commands to the printer. SplPdSendCmd does not return any response data from the printer. This is an optional API.

If the port driver exports SplPdSendCmd, the spooler passes the address of this function to the BIDI protocol converter SplProtSendCmd. The purpose is to achieve better performance of query requests.

Syntax

SplPdSendCmd(pszPortName, flOptions, ulCommand, pInData, cbInData)

Parameters

pszPortName (PSZ) - input
Port name.
Following is an example of a port name: LPT1
This will be a locally defined port name.
flOptions (ULONG) - input
Flags defining how to send the data to the printer.
All other bits must be clear. Values are as follows:
FLG_MUSTCOMPLETE - 0x00000001 : If set, the caller does not want to return until the command sequence is sent to the printer.
If this flag is not set, the caller returns immediately if unable to send the command. For example, the command might not be sent if the printer is being sent a job and the printer cannot accept commands inside a job boundary.
FLG_SYNCH - 0x00000002 : If set, waits for any current job to finish being sent to the printer before sending this command sequence.
FLG_MORECMDS - 0x00000004 : If set, more SplPdSendCmd calls are necessary to complete the current query or set command.
FLG_DATACHANNEL - 0x00000008 : If set, the data channel should be used for this command.
The data channel is the channel into the printer on which print job data is sent. Some printers also support a command channel, such as SNMP, which can be used to send commands into the printer.
However, some commands must be sent to the printer using the data channel instead of the command channel (for example, sending a PJL query requires sending the PJL command via the data channel.)
FLG_SNMPCHANNEL - 0x00000010 : If set, the SNMP channel should be used for this command.
If this flag is set and there is no SNMP channel available, ERROR_INVALID_PATH(253) is returned.
FLG_RESERVEDCHANNEL - 0x00000020 : This bit may be used to access a special channel in the port driver. If this flag is set and the port driver does not support a special channel, the default command channel should be used to send this data to the printer.
ulCommand (ULONG) - input
Generic command code.
This code is given to the port driver for information only. The pInData parameter contains the BIDI software protocol-specific packet to send to the printer.
Current commands are as follows:
BIDI_Q_SW(800Ch) : Query BIDI software capabilities.
BIDI_Q_DEVICE(800Dh) : Query printer device characteristics.
BIDI_Q_INTERPRETER(800Eh) : Query interpreters available in the printer.
BIDI_Q_INPUTBINS(800Fh) : Query input bins.
BIDI_Q_OUTPUTBINS(8010h) : Query output bins.
BIDI_Q_FONTS(8012h) : Query fonts for a particular interpreter.
BIDI_Q_JOBS_COMPLETE(8013h) : Query list of completed jobs.
BIDI_Q_JOBS_QUEUED(8014h) : Query list of queued jobs.
BIDI_Q_STATUS(8015h) : Query current status of the print device.
BIDI_Q_STORAGE(8023h) : Return printer storage media.
pInData (PVOID) - input
Contains the command sequence to pass to the printer.
This parameter will not be altered by the port driver.
cbInData (ULONG) - input
Length of command sequence in pInData, in bytes.

Returns

rc (ULONG) - returns
Return codes.
  • 0 Success
  • 2(ERROR_FILE_NOT_FOUND) : The pszPortName given is not a valid port name configured for this port driver.
  • 5(ERROR_ACCESS_DENIED) : Not authorized to access printer port.
  • 8(ERROR_NOT_ENOUGH_MEMORY) : Not enough memory to satisfy request.
  • 29(ERROR_WRITE_FAULT) : Failure attempting to write to the device. The printer might not have received the command sequence.
  • 87(ERROR_INVALID_PARAMETER) : An invalid buffer was given.
  • 253(ERROR_INVALID_PATH) : Invalid channel requested.
  • 683(ERROR_BIDI_NO_SUPPORT) : The printer is not in bidirectional mode, therefore query requests are not honored. The port also may be in the process of being shut down.
0x4013(PMERR_SPL_JOB_PRINTING)
A job is being sent to the printer, the printer cannot accept commands while receiving job data, and FLG_MUSTCOMPLETE is clear.
0x403D(PMERR_SPL_CNV_NOT_INIT) :The protocol converter or port driver has not been initialized for this port.

Sample

#define INCL_SPL
#define INCL_SPLBIDI
#include <os2.h>

PSZ      pszPortName;  /*  Port name. */
ULONG    flOptions;    /*  Flags defining how to send the data to the printer. */
ULONG    ulCommand;    /*  Generic command code. */
PVOID    pInData;      /*  Contains the command sequence to pass to the printer. */
ULONG    cbInData;     /*  Length of command sequence in pInData, in bytes. */
ULONG    rc;           /*  Return codes. */

rc = SplPdSendCmd(pszPortName, flOptions,
       ulCommand, pInData, cbInData);

Remarks

The caller will only wait for a response inside the protocol converter, because the protocol converter is the only part of the system that can match a command with the printer's response.

If the last SplPdSendCmd has FLG_MORECMDS set and no new SplPdSendCmd is issued for the port driver's timeout, then the port driver should allow a job to be sent. This can happen only when there is a problem with the protocol converter.