mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
360 lines
14 KiB
360 lines
14 KiB
/*
|
|
NETPRD.C -- a program demonstrating the DosPrintDest API functions.
|
|
|
|
Admin or print operator privilege is required to successfully
|
|
execute the Print Destination API functions on a remote server.
|
|
|
|
This program calls DosPrintDestAdd to add a printer to the specified
|
|
server, then manipulates that printer using DosPrintDestControl.
|
|
DosPrintDestGetInfo displays status information about the printer.
|
|
DosPrintDestSetInfo is called to disconnect the printer from the
|
|
computer. DosPrintDestEnum lists all printers on the computer.
|
|
DosPrintDestDel then deletes the print destination.
|
|
|
|
Usage: netprd [-s \\server] [-p printername] [-a address]
|
|
[-l level] [-o operation] [-d driver] [-f flag]
|
|
where: \\server = Name of the server. A servername must be preceded
|
|
by two backslashes (\\).
|
|
printername = Name of the printer.
|
|
address = Logical address, such as LPT1.
|
|
level = Level of detail.
|
|
operation = Integer code for DosPrintDestControl.
|
|
driver = Name of the print driver.
|
|
flag = Flag whether to delete the printer (0 or 1).
|
|
|
|
API Used to...
|
|
=================== ===============================================
|
|
DosPrintDestAdd Add a new print destination
|
|
DosPrintDestControl Control the status of the printer
|
|
DosPrintDestGetInfo Get specific information about a single printer
|
|
DosPrintDestSetInfo Set specific information for a single printer
|
|
DosPrintDestEnum List all printers available
|
|
DosPrintDestDel Delete the print destination
|
|
|
|
This code sample is provided for demonstration purposes only.
|
|
Microsoft makes no warranty, either express or implied,
|
|
as to its usability in any given situation.
|
|
*/
|
|
|
|
#define INCL_BASE
|
|
#include <os2.h> // MS OS/2 base header files
|
|
#include <pmspl.h> // Print definitions
|
|
|
|
#define INCL_NETERRORS
|
|
#include <lan.h> // LAN Manager header files
|
|
|
|
#include <stdio.h> // C run-time header files
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "samples.h" // Internal routine header file
|
|
|
|
#define NEWPORTNAME "LPT1"
|
|
#define NEWPRINTERNAME "PrntDestTest"
|
|
#define NEWDRIVER "IBM4201"
|
|
#define DEFAULT_BUF_SIZE 512
|
|
#define MAX_BUFFER_SIZE 65535
|
|
#define MAX_PDEST 10 // Limit for this program only
|
|
|
|
void DisplayInfo(short sLevel, char *pbBuffer, unsigned short cEntries);
|
|
void Usage(char *pszProgram);
|
|
|
|
void main(int argc, char *argv[])
|
|
{
|
|
char * pbBuffer; // Return data
|
|
char * pszServer = ""; // Server; default to local computer
|
|
char * szNull = ""; // Null string
|
|
char far * pszPrinterName = NEWPRINTERNAME;
|
|
char far * pszLogAddr = NEWPORTNAME;
|
|
char far * pszDriver = NEWDRIVER;
|
|
int iCount; // Index counter
|
|
PRDINFO3 prd3; // Level 3 data structure
|
|
short sLevel = 3; // Level of detail
|
|
unsigned uRet; // Return code
|
|
unsigned short fDone; // Flag successful call
|
|
unsigned short fDelete = TRUE; // Delete flag
|
|
unsigned short cEntriesRead; // Count of entries read
|
|
unsigned short cTotal; // Count of entries available
|
|
unsigned short cbBuffer = 0; // Count of bytes in data buffer
|
|
unsigned short cbBufferNeeded = 0; // Bytes needed for GetInfo call
|
|
unsigned short uControl = PRD_CONT; // DosPrintDestControl operation
|
|
|
|
for (iCount = 1; iCount < argc; iCount++) // Get cmd-line switches
|
|
{
|
|
if ((*argv[iCount] == '-') || (*argv[iCount] == '/'))
|
|
{
|
|
switch (tolower(*(argv[iCount]+1))) // Process switches
|
|
{
|
|
case 's': // -s servername
|
|
pszServer = argv[++iCount];
|
|
break;
|
|
case 'l': // -l level
|
|
sLevel = atoi(argv[++iCount]);
|
|
break;
|
|
case 'p': // -p printername
|
|
pszPrinterName = argv[++iCount];
|
|
break;
|
|
case 'd': // -d drivername
|
|
pszDriver = argv[++iCount];
|
|
break;
|
|
case 'f': // -f flag deletion
|
|
fDelete = atoi(argv[++iCount]);
|
|
break;
|
|
case 'a': // -a address
|
|
pszLogAddr = argv[++iCount];
|
|
break;
|
|
case 'o': // -o operation
|
|
uControl = atoi(argv[++iCount]);
|
|
break;
|
|
case 'h':
|
|
default:
|
|
Usage(argv[0]);
|
|
}
|
|
}
|
|
else
|
|
Usage(argv[0]);
|
|
}
|
|
printf("\nPrint Destination Category API Examples\n");
|
|
|
|
//=======================================================================
|
|
// DosPrintDestAdd
|
|
//
|
|
// This API adds the specified printer to the specified server.
|
|
//=======================================================================
|
|
|
|
memset(&prd3, 0, sizeof(PRDINFO3)); // Initialize memory
|
|
|
|
prd3.pszPrinterName = pszPrinterName; // Set names
|
|
prd3.pszLogAddr = pszLogAddr;
|
|
prd3.pszDrivers = pszDriver;
|
|
|
|
uRet = DosPrintDestAdd(pszServer, // Servername
|
|
3, // Level; must be 3
|
|
(char far *)&prd3, // New printer struct
|
|
sizeof(PRDINFO3)); // Size of buffer
|
|
|
|
printf("DosPrintDestAdd returned %u\n", uRet);
|
|
if (uRet == NERR_Success)
|
|
{
|
|
printf(" %Fs added to ", prd3.pszPrinterName);
|
|
if ((pszServer == NULL) || (*pszServer == '\0'))
|
|
printf("the local computer\n");
|
|
else
|
|
printf(" %s\n", pszServer);
|
|
printf(" Printer port set to %Fs\n", prd3.pszLogAddr);
|
|
}
|
|
|
|
//=======================================================================
|
|
// DosPrintDestControl
|
|
//
|
|
// This API controls a printer destination. It can delete,
|
|
// pause, continue, or restart the printer. If a job is printing at the
|
|
// time the API is executed, that print job receives the new
|
|
// printer status. The print dest name must be a logical address.
|
|
//=======================================================================
|
|
|
|
uRet = DosPrintDestControl(pszServer, // Computername
|
|
pszLogAddr, // Print dest name
|
|
uControl); // Operation
|
|
|
|
printf("DosPrintDestControl returned %u\n", uRet);
|
|
|
|
//=======================================================================
|
|
// DosPrintDestGetInfo
|
|
//
|
|
// This API returns information about the specified print destination.
|
|
//=======================================================================
|
|
|
|
// Call with zero-length buffer, expect NERR_BufTooSmall.
|
|
|
|
uRet = DosPrintDestGetInfo(pszServer, // Servername
|
|
pszPrinterName, // Printername
|
|
sLevel, // Call level
|
|
NULL, // Data buffer
|
|
0, // Size of buffer
|
|
&cbBufferNeeded); // Returns required size
|
|
|
|
if (uRet == NERR_BufTooSmall)
|
|
{
|
|
cbBuffer = cbBufferNeeded;
|
|
pbBuffer = SafeMalloc(cbBuffer); // SafeMalloc() is in SAMPLES.C
|
|
|
|
uRet = DosPrintDestGetInfo(pszServer, // Server name
|
|
pszPrinterName, // Printer name
|
|
sLevel, // Call level
|
|
pbBuffer, // Data buffer
|
|
cbBuffer, // Size of buffer
|
|
&cbBufferNeeded); // Size required
|
|
|
|
printf("DosPrintDestGetInfo returned %u\n", uRet);
|
|
if (uRet == NERR_Success)
|
|
DisplayInfo(sLevel, pbBuffer, 1); // Display buffer
|
|
free(pbBuffer);
|
|
}
|
|
else
|
|
printf("DosPrintDestGetInfo returned %u\n", uRet);
|
|
|
|
//=======================================================================
|
|
// DosPrintDestSetInfo
|
|
//
|
|
// This API allows control over print destination settings.
|
|
// It must be called using level 3 (PRDINFO3).
|
|
//
|
|
// In this example, a single element is set to the desired value.
|
|
// A program can also set all elements by setting the parameter number
|
|
// code to PARMNUM_ALL.
|
|
//
|
|
// Setting the logical address to a null string disconnects this
|
|
// printer from the computer.
|
|
//=======================================================================
|
|
|
|
uRet = DosPrintDestSetInfo(pszServer, // Servername
|
|
pszPrinterName, // Printername
|
|
3, // Level; must be 3
|
|
(char far *)szNull, // Data
|
|
sizeof(szNull), // Size of buffer
|
|
PRD_LOGADDR_PARMNUM); // Parameter number code
|
|
|
|
printf("DosPrintDestSetInfo returned %u", uRet);
|
|
if (uRet)
|
|
printf(": Disconnect failed");
|
|
printf("\n");
|
|
|
|
//========================================================================
|
|
// DosPrintDestEnum
|
|
//
|
|
// This API lists all printers connected to the specified server.
|
|
// Allocate a buffer for the returned data. If the buffer is too small,
|
|
// try again with a bigger buffer, and keep trying until the buffer
|
|
// is large enough or until it cannot be made any larger.
|
|
//========================================================================
|
|
|
|
cbBuffer = DEFAULT_BUF_SIZE;
|
|
pbBuffer = SafeMalloc(cbBuffer); // SafeMalloc() is in SAMPLES.C
|
|
do
|
|
{
|
|
uRet = DosPrintDestEnum (pszServer, // Servername
|
|
sLevel, // Call level
|
|
pbBuffer, // Buffer for info
|
|
cbBuffer, // Size of buffer
|
|
&cEntriesRead, // Count of entries read
|
|
&cTotal); // Count of entries available
|
|
|
|
if (uRet == ERROR_MORE_DATA)
|
|
{
|
|
free(pbBuffer); // Buffer too small
|
|
if (cbBuffer == MAX_BUFFER_SIZE)
|
|
{
|
|
printf("Exceeded buffer size\n");
|
|
exit(1);
|
|
}
|
|
else if (cbBuffer > (MAX_BUFFER_SIZE/2))
|
|
cbBuffer = MAX_BUFFER_SIZE;
|
|
else
|
|
cbBuffer += cbBuffer; // Allocate larger buffer
|
|
pbBuffer = SafeMalloc(cbBuffer);
|
|
fDone = FALSE;
|
|
}
|
|
else
|
|
fDone = TRUE;
|
|
} while (fDone == FALSE); // Loop until buffer big enough or call fails
|
|
|
|
printf("DosPrintDestEnum returned %u\n", uRet);
|
|
printf(" Entries read = %hu out of %hu\n", cEntriesRead, cTotal);
|
|
|
|
if (uRet == NERR_Success)
|
|
DisplayInfo(sLevel, pbBuffer, cEntriesRead);
|
|
free(pbBuffer);
|
|
|
|
//========================================================================
|
|
// DosPrintDestDel
|
|
//
|
|
// This API deletes the print destination.
|
|
//========================================================================
|
|
|
|
if (fDelete == TRUE)
|
|
{
|
|
uRet = DosPrintDestDel(pszServer, // Servername
|
|
pszPrinterName); // Printername
|
|
printf("DosPrintDestDel returned %u\n", uRet);
|
|
}
|
|
exit(0);
|
|
} // End of main
|
|
|
|
//=======================================================================
|
|
// DisplayInfo
|
|
//
|
|
// Displays the print destination information obtained by
|
|
// DosPrintDestGetInfo or DosPrintDestEnum.
|
|
//=======================================================================
|
|
|
|
void DisplayInfo(short sLevel, char *pbBuffer, unsigned short cEntries)
|
|
{
|
|
char * pprd0Info; // Level 0 data
|
|
PPRDINFO pprd1Info; // Pointer to level 1 structure
|
|
PSZ * pprd2Info; // Array of pointers
|
|
PPRDINFO3 pprd3Info; // Pointer to level 3 structure
|
|
unsigned short iCount; // Index counter
|
|
|
|
pprd0Info = (char *) pbBuffer;
|
|
pprd1Info = (PPRDINFO) pbBuffer;
|
|
pprd2Info = (PSZ *) pbBuffer;
|
|
pprd3Info = (PPRDINFO3) pbBuffer;
|
|
|
|
for (iCount = 0; iCount < cEntries; iCount++)
|
|
{
|
|
switch (sLevel)
|
|
{
|
|
case 0:
|
|
printf(" Printer Name: %s\n", pprd0Info);
|
|
pprd0Info += (strlen(pprd0Info) + 1);
|
|
break;
|
|
case 1:
|
|
printf(" Printer Name: %s\n", pprd1Info->szName);
|
|
printf(" User Name : %s\n", pprd1Info->szUserName);
|
|
printf(" Job Id : %hu\n", pprd1Info->uJobId);
|
|
if (pprd1Info->uJobId) // Data valid only while job prints
|
|
{
|
|
printf(" Job Status : 0x%hx\n", pprd1Info->fsStatus);
|
|
printf(" Status Text : %Fs\n", pprd1Info->pszStatus);
|
|
printf(" Time : %hu\n", pprd1Info->time);
|
|
}
|
|
pprd1Info++;
|
|
break;
|
|
case 2:
|
|
printf(" Printer Name: %Fs\n", *pprd2Info++);
|
|
break;
|
|
case 3:
|
|
printf(" Printer Name: %Fs\n", pprd3Info->pszPrinterName);
|
|
printf(" Logical Addr: %Fs\n", pprd3Info->pszLogAddr);
|
|
printf(" Drivers : %Fs\n", pprd3Info->pszDrivers);
|
|
printf(" Comment : %Fs\n", pprd3Info->pszComment);
|
|
printf(" Job Id : %hu\n", pprd3Info->uJobId);
|
|
if (pprd3Info->uJobId)
|
|
{
|
|
printf(" User Name : %Fs\n", pprd3Info->pszUserName);
|
|
printf(" Job Status : 0x%hx\n", pprd3Info->fsStatus);
|
|
printf(" Status Text : %Fs\n", pprd3Info->pszStatus);
|
|
printf(" Print time : %hu\n", pprd3Info->time);
|
|
}
|
|
pprd3Info++;
|
|
break;
|
|
default:
|
|
break;
|
|
} // End switch sLevel
|
|
} // End for loop
|
|
} // End function
|
|
|
|
//=======================================================================
|
|
// Usage
|
|
//
|
|
// Displays possible command-line switches for this sample program.
|
|
//=======================================================================
|
|
|
|
void Usage(char *pszProgram)
|
|
{
|
|
fprintf(stderr, "Usage: %s [-s \\\\server] [-l level]", pszProgram);
|
|
fprintf(stderr, " [-d driver]\n\t[-p printer] [-f flag delete]");
|
|
fprintf(stderr, " [-a address] [-o operation]\n");
|
|
exit(1);
|
|
}
|