|
|
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
nwlibs\psdb.c
Abstract:
Read the Print Con database file APIs.
Author:
Shawn Walker (v-swalk) 12-12-1994
Revision History:
--*/ #include "common.h"
extern DWORD SwapLong(DWORD number);
unsigned int PSGetJobName( unsigned int ConnectionHandle, unsigned short SearchFlag, unsigned char *pOwner, unsigned char *pJobName, PPS_JOB_RECORD pJobRecord, unsigned char GetDefault );
#define MAX_JOB_NAME_ENTRY 37
#define O_RDONLY 0x0000 /* open for reading only */
#define O_WRONLY 0x0001 /* open for writing only */
#define O_RDWR 0x0002 /* open for reading and writing */
#define O_APPEND 0x0008 /* writes done at eof */
#define O_CREAT 0x0100 /* create and open file */
#define O_TRUNC 0x0200 /* open and truncate */
#define O_EXCL 0x0400 /* open only if file doesn't already exist */
#define O_TEXT 0x4000 /* file mode is text (translated) */
#define O_BINARY 0x8000 /* file mode is binary (untranslated) */
#define S_IEXEC 0000100 /* execute/search permission, owner */
#define S_IWRITE 0000200 /* write permission, owner */
#define S_IREAD 0000400 /* read permission, owner */
#define S_IFCHR 0020000 /* character special */
#define S_IFDIR 0040000 /* directory */
#define S_IFREG 0100000 /* regular */
#define S_IFMT 0170000 /* file type mask */
#include <pshpack1.h>
typedef struct _PRINTCON_HEADER { unsigned char Text[115]; unsigned char MajorVersion; unsigned char MinorVersion1; unsigned char MinorVersion2; unsigned char DefaultJobName[32]; } PRINTCON_HEADER, *PPRINTCON_HEADER;
#define PRINTCON_HEADER_SIZE sizeof(PRINTCON_HEADER)
typedef struct _JOB_NAME_AREA { unsigned char JobName[32]; unsigned long JobRecordOffset; } JOB_NAME_AREA, *PJOB_NAME_AREA;
#define JOB_NAME_AREA_SIZE sizeof(JOB_NAME_AREA)
typedef struct _JOB_RECORD_AREA { unsigned char ServerName[NCP_BINDERY_OBJECT_NAME_LENGTH]; unsigned char QueueName[NCP_BINDERY_OBJECT_NAME_LENGTH]; unsigned char TabSize; unsigned short NumberOfCopies; unsigned char FormName[40]; unsigned char NotifyWhenDone; //0=No, 1=Yes
unsigned long PrintServerID; unsigned char Name[13]; unsigned char BannerName[13]; unsigned char Device[33]; unsigned char Mode[33]; unsigned char BannerFlag; //0=No Banner, 1=Banner
unsigned char DataType; //1=Byte,0=Stream
unsigned char FormFeed; //0=Don't Suppress FF, 1=Suppress FF
unsigned short TimeoutCount; unsigned char LocalPrinter; //1=LPT1, 2=LPT2, 3=LPT3
unsigned char AutoEndCap; //0=Don't Auto EndCap, 1=Do Auto EndCap
} JOB_RECORD_AREA, *PJOB_RECORD_AREA; #include <poppack.h>
#define JOB_RECORD_AREA_SIZE sizeof(JOB_RECORD_AREA)
/*++
*******************************************************************
PSJobGetDefault
Routine Description:
Get the default print job configuration from the printcon.dat file.
Arguments:
ConnectionHandle = The connection handle to use. SearchFlag = pOwner = pJobName = A pointer to return the default job configuration name. pJobRecord = A pointer to return the default job configuration.
Return Value:
SUCCESSFUL 0x0000 PS_ERR_BAD_VERSION 0x7770 PS_ERR_GETTING_DEFAULT 0x7773 PS_ERR_OPENING_DB 0x7774 PS_ERR_READING_DB 0x7775 PS_ERR_READING_RECORD 0x7776 PS_ERR_INTERNAL_ERROR 0x7779 PS_ERR_NO_DEFAULT_SPECIFIED 0x777B INVALID_CONNECTION 0x8801
******************************************************************* --*/ unsigned int PSJobGetDefault( unsigned int ConnectionHandle, unsigned short SearchFlag, unsigned char *pOwner, unsigned char *pJobName, PPS_JOB_RECORD pJobRecord ) { return PSGetJobName( ConnectionHandle, SearchFlag, pOwner, pJobName, pJobRecord, TRUE); }
/*++
*******************************************************************
PSJobRead
Routine Description:
Get the print job configuration from the printcon.dat file.
Arguments:
ConnectionHandle = The connection handle to use. pOwner = pJobName = A pointer to return the default job configuration name. pJobRecord = A pointer to return the default job configuration.
Return Value:
SUCCESSFUL 0x0000 PS_ERR_BAD_VERSION 0x7770 PS_ERR_GETTING_DEFAULT 0x7773 PS_ERR_OPENING_DB 0x7774 PS_ERR_READING_DB 0x7775 PS_ERR_READING_RECORD 0x7776 PS_ERR_INTERNAL_ERROR 0x7779 PS_ERR_NO_DEFAULT_SPECIFIED 0x777B INVALID_CONNECTION 0x8801
******************************************************************* --*/ unsigned int PSJobRead( unsigned int ConnectionHandle, unsigned char *pOwner, unsigned char *pJobName, PPS_JOB_RECORD pJobRecord ) { return PSGetJobName( ConnectionHandle, 0, pOwner, pJobName, pJobRecord, FALSE); }
/*++
*******************************************************************
PSGetJobName
Routine Description:
Common routine to get the print job configuration from the printcon.dat file.
Arguments:
ConnectionHandle = The connection handle to use. SearchFlag = pOwner = pJobName = A pointer to return the default job configuration name. pJobRecord = A pointer to return the default job configuration. GetDefault = TRUE = get the default job name, FALSE = Don't get the default job name.
Return Value:
SUCCESSFUL 0x0000 PS_ERR_BAD_VERSION 0x7770 PS_ERR_GETTING_DEFAULT 0x7773 PS_ERR_OPENING_DB 0x7774 PS_ERR_READING_DB 0x7775 PS_ERR_READING_RECORD 0x7776 PS_ERR_INTERNAL_ERROR 0x7779 PS_ERR_NO_DEFAULT_SPECIFIED 0x777B INVALID_CONNECTION 0x8801
******************************************************************* --*/ unsigned int PSGetJobName( unsigned int ConnectionHandle, unsigned short SearchFlag, unsigned char *pOwner, unsigned char *pJobName, PPS_JOB_RECORD pJobRecord, unsigned char GetDefault ) { unsigned char *pSearchJobName; unsigned long ObjectId; FILE *stream = NULL; unsigned int Count; unsigned int Bytes; unsigned int RetCode; unsigned int ConnectionNumber; JOB_NAME_AREA JobNameArea; JOB_RECORD_AREA JobRecord; PRINTCON_HEADER PrintConHeader; unsigned char MailDirPath[NCP_MAX_PATH_LENGTH];
/** Get the connection number for this connection **/
RetCode = GetConnectionNumber(ConnectionHandle, &ConnectionNumber); if (RetCode) { goto CommonExit; }
RetCode = GetBinderyObjectID (ConnectionHandle, LOGIN_NAME, OT_USER, &ObjectId); if (RetCode) { goto CommonExit; }
/** Build the path to open the file **/
sprintf(MailDirPath, "SYS:MAIL/%lX/PRINTCON.DAT", SwapLong(ObjectId));
stream = fopen(NTNWtoUNCFormat( MailDirPath), "rb"); if (stream == NULL) { RetCode = PS_ERR_OPENING_DB; goto CommonExit; }
Bytes = fread( (unsigned char *) &PrintConHeader, sizeof( char), PRINTCON_HEADER_SIZE, stream); if (Bytes < PRINTCON_HEADER_SIZE) { RetCode = PS_ERR_INTERNAL_ERROR; goto CommonExit; }
/** Check the version number **/
if ((PrintConHeader.MajorVersion != 3 && PrintConHeader.MajorVersion != 1) || PrintConHeader.MinorVersion1 != 1 || PrintConHeader.MinorVersion2 != 1) {
RetCode = PS_ERR_BAD_VERSION; goto CommonExit; } /** Get the name we are looking for **/
if (GetDefault) { if (PrintConHeader.DefaultJobName[0] == 0) { RetCode = PS_ERR_NO_DEFAULT_SPECIFIED; goto CommonExit; } pSearchJobName = PrintConHeader.DefaultJobName; } else { pSearchJobName = pJobName; }
Count = 0;
/** Go through all of the job entry to look for the name **/
while (Count < MAX_JOB_NAME_ENTRY) { Bytes = fread( (unsigned char *) &JobNameArea, sizeof(unsigned char), JOB_NAME_AREA_SIZE, stream); if (Bytes < JOB_NAME_AREA_SIZE) { RetCode = PS_ERR_INTERNAL_ERROR; goto CommonExit; } Count++;
/** Skip the entry with a null job name **/
if (JobNameArea.JobName[0] == 0) { continue; } /** Is this the job name we are looking for? **/
if (!_strcmpi(pSearchJobName, JobNameArea.JobName)) { break; } }
/** See if we found the job name **/
if (Count > MAX_JOB_NAME_ENTRY) { if (GetDefault) { RetCode = PS_ERR_GETTING_DEFAULT; } else { RetCode = PS_ERR_READING_RECORD; } goto CommonExit; }
if (fseek(stream, JobNameArea.JobRecordOffset, SEEK_SET)) { RetCode = PS_ERR_READING_RECORD; goto CommonExit; }
Bytes = fread( (unsigned char *) &JobRecord, sizeof(unsigned char), JOB_RECORD_AREA_SIZE, stream); if (Bytes < JOB_RECORD_AREA_SIZE) { RetCode = PS_ERR_READING_RECORD; goto CommonExit; }
memset(pJobRecord, 0, PS_JOB_RECORD_SIZE);
if (JobRecord.NotifyWhenDone) { pJobRecord->PrintJobFlag |= PS_JOB_NOTIFY; } if (JobRecord.BannerFlag) { pJobRecord->PrintJobFlag |= PS_JOB_PRINT_BANNER; } if (JobRecord.DataType) { pJobRecord->PrintJobFlag |= PS_JOB_EXPAND_TABS; } if (JobRecord.FormFeed) { pJobRecord->PrintJobFlag |= PS_JOB_NO_FORMFEED; } if (JobRecord.AutoEndCap) { pJobRecord->PrintJobFlag |= PS_JOB_AUTO_END; } if (JobRecord.TimeoutCount) { pJobRecord->PrintJobFlag |= PS_JOB_TIMEOUT; }
pJobRecord->Copies = JobRecord.NumberOfCopies; pJobRecord->TabSize = JobRecord.TabSize; pJobRecord->TimeOutCount = JobRecord.TimeoutCount; pJobRecord->LocalPrinter = JobRecord.LocalPrinter;
strcpy(pJobRecord->Mode, JobRecord.Mode); strcpy(pJobRecord->Device, JobRecord.Device); strcpy(pJobRecord->FormName, JobRecord.FormName); strcpy(pJobRecord->BannerName, JobRecord.BannerName); strcpy(pJobRecord->u.NonDS.PrintQueue, JobRecord.QueueName); strcpy(pJobRecord->u.NonDS.FileServer, JobRecord.ServerName);
if (GetDefault && pJobName) { strcpy(pJobName, JobNameArea.JobName); }
if (pOwner) { *pOwner = 0; }
CommonExit:
if (stream != NULL) { fclose( stream ); }
return RetCode; }
|