diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/nw/nwscript/ps40db.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to '')
-rw-r--r-- | private/nw/nwscript/ps40db.c | 597 |
1 files changed, 597 insertions, 0 deletions
diff --git a/private/nw/nwscript/ps40db.c b/private/nw/nwscript/ps40db.c new file mode 100644 index 000000000..9eae6aa09 --- /dev/null +++ b/private/nw/nwscript/ps40db.c @@ -0,0 +1,597 @@ +/*++ + +Copyright (c) 1995 Microsoft Corporation + +Module Name: + + psndsdb.c + +Abstract: + + Read the Print Configuration Attributes + + $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\PS40DB.C $ +* +* Rev 1.4 10 Apr 1996 14:23:28 terryt +* Hotfix for 21181hq +* +* Rev 1.4 12 Mar 1996 19:55:22 terryt +* Relative NDS names and merge +* +* Rev 1.3 04 Jan 1996 18:57:36 terryt +* Bug fixes reported by MS +* +* Rev 1.2 22 Dec 1995 14:26:22 terryt +* Add Microsoft headers +* +* Rev 1.1 20 Nov 1995 15:09:46 terryt +* Context and capture changes +* +* Rev 1.0 15 Nov 1995 18:07:52 terryt +* Initial revision. + +--*/ +#include "common.h" + +extern DWORD SwapLong(DWORD number); +extern char *TYPED_USER_NAME; + +unsigned int +PS40GetJobName( + unsigned int NDSCaptureFlag, + unsigned short SearchFlag, + unsigned char *pOwner, + unsigned char *pJobName, + PPS_JOB_RECORD pJobRecord, + unsigned char GetDefault + ); + +#include <pshpack1.h> +#define NWPS_JOB_NAME_SIZE 32 /* 31 bytes and a '\0' */ +#define NWPS_FORM_NAME_SIZE 12 /* 12 bytes and a '\0' */ +#define NWPS_BANNER_NAME_SIZE 12 /* 12 bytes and a '\0' */ +#define NWPS_BANNER_FILE_SIZE 12 /* 12 bytes and a '\0' */ +#define NWPS_DEVI_NAME_SIZE 32 /* 32 bytes and a '\0' */ +#define NWPS_MODE_NAME_SIZE 32 /* 32 bytes and a '\0' */ +#define NWPS_BIND_NAME_SIZE 48 +#define NWPS_MAX_NAME_SIZE 514 +/* +// NWPS_Job_Old_Db_Hdr is the first record in the 4.0 PrnConDB database. +// It contains the following information about the database: +// The version number, +// the number of NWPS_Job_Rec records in PrnConDB, +// the name of the default print job configuration and +// the name of the job record owner. +*/ +typedef struct { + char text[ 76 ]; /* Printcon database. Version 4.0 */ + char DefaultJobName[ 32 ]; /* Name of default Job */ + char Owner[ 256 ]; /* owner of the job record */ + WORD NumberOfRecords; /* # of NWPS_Job_Rec's in PrnConDB */ + WORD NumberOfBlocks; /* # of 50-(NWPS_Job_Name_Rec) blocks */ + BYTE MajorVersion; /* 4 */ + BYTE MinorVersion; /* 0 */ +} PRINTCON_40_HEADER; + +#define PRINTCON_40_HEADER_SIZE sizeof(PRINTCON_40_HEADER) + +/* +// NWPS_Job_41_Db_Hdr is the first record in the 4.1 PrnConDB database. +// It contains the following information about the database: +// The version number, +// the number of NWPS_Job_Rec records in PrnConDB, +// the name of the default print job configuration and +// the name of the job record owner IN UNICODE. +*/ +typedef struct { + char text[ 76 ]; /* Printcon database. Version 4.1 */ + char DefaultJobName[ 32 ]; /* Name of default Job */ + char unused[ 256 ]; /* no longer used. */ + WORD NumberOfRecords; /* # of NWPS_Job_Rec's in PrnConDB */ + WORD NumberOfBlocks; /* # of 50-(NWPS_Job_Name_Rec) blocks */ + BYTE MajorVersion; /* 4 */ + BYTE MinorVersion; /* 1 unicode defaultPJOwner etc. */ + WORD Owner[ 256 ]; /* owner of the default job record */ +} PRINTCON_41_HEADER; + +#define PRINTCON_41_HEADER_SIZE sizeof(PRINTCON_41_HEADER) + +/* +// NWPS_Job_Name_Rec is the type of record found in the +// second section of the PrnConDB database. Each one of +// these records contains the name of each NWPS_Job_Rec +// and a pointer to their location in the third section of +// the database. There is space set aside in this second +// section for fifty NWPS_Job_Name_Rec records; if this +// limit is exceeded then another fifty-record block following +// the first one is allocated after the third section of the +// database is moved down to make room for the expansion. +*/ +typedef struct { + char JobName[ NWPS_JOB_NAME_SIZE ]; /* 1 - 31 chars long + 0 */ + long JobRecordOffset; /* Offset of the record + // (from the beginning + // of the 3rd section for 4.0 + // databases and from the start + // of the file for pre-4.0) + */ +} JOB_NAME_AREA; + +#define JOB_NAME_AREA_SIZE sizeof(JOB_NAME_AREA) + +typedef struct { + union { + struct { + DWORD DataType : 1; /* 0=Byte stream 1 = Text */ + DWORD FormFeed : 1; /* 0 = FF; 1 = suppress FF */ + DWORD NotifyWhenDone : 1; /* 0 = no, 1 = yes */ + DWORD BannerFlag : 1; /* 0 = no, 1 = yes */ + DWORD AutoEndCap : 1; /* 0 = no, 1 = yes */ + DWORD TimeOutFlag: 1; /* 0 = no, 1 = yes */ + DWORD SystemType : 3; /* 0 = bindery 1 = NDS */ + DWORD Destination: 3; /* 0 = queue 1 = printer */ + DWORD unknown : 20; + }; + DWORD PrintJobFlags; + }; + + WORD NumberOfCopies; /* 1 - 65,000 */ + WORD TimeoutCount; /* 1 - 1,000 */ + BYTE TabSize; /* 1 - 18 */ + BYTE LocalPrinter; /* 0=Lpt1, 1=Lpt2, 2=Lpt3 etc. */ + char FormName[ NWPS_FORM_NAME_SIZE + 2 ]; /* 1-12 chars */ + char Name[ NWPS_BANNER_NAME_SIZE + 2 ]; /* 1-12 chars */ + char BannerName[ NWPS_BANNER_FILE_SIZE + 2 ]; /* 1-12 chars */ + char Device[ NWPS_DEVI_NAME_SIZE + 2 ]; /* 1-32 chars */ + char Mode[ NWPS_MODE_NAME_SIZE + 2 ]; /* 1-32 chars */ + union { + struct { + /* pad structures on even boundries */ + char Server[ NWPS_BIND_NAME_SIZE + 2 ]; /* 2-48 chars */ + char QueueName[ NWPS_BIND_NAME_SIZE + 2 ]; /* 1-48 chars */ + char PrintServer[ NWPS_BIND_NAME_SIZE + 2 ]; /* 1-48 chars */ + } NonDS; + char DSObjectName[ NWPS_MAX_NAME_SIZE ]; + } u; + BYTE reserved[390]; /* Adds up to 1024 total (was 1026) */ +} JOB_RECORD_AREA; + +#define JOB_RECORD_AREA_SIZE sizeof(JOB_RECORD_AREA) + + +#include <poppack.h> + + + +/*++ +******************************************************************* + + PS40JobGetDefault + +Routine Description: + + Get the default print job configuration from 40. + +Arguments: + NDSCaptureFlag + 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 +PS40JobGetDefault( + unsigned int NDSCaptureFlag, + unsigned short SearchFlag, + unsigned char *pOwner, + unsigned char *pJobName, + PPS_JOB_RECORD pJobRecord + ) +{ + return PS40GetJobName( + NDSCaptureFlag, + SearchFlag, + pOwner, + pJobName, + pJobRecord, + TRUE); +} + + +/*++ +******************************************************************* + + PS40JobRead + +Routine Description: + + Get the print job configuration from 40. + +Arguments: + + NDSCaptureFlag = + 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 +PS40JobRead( + unsigned int NDSCaptureFlag, + unsigned char *pOwner, + unsigned char *pJobName, + PPS_JOB_RECORD pJobRecord + ) +{ + return PS40GetJobName( + NDSCaptureFlag, + 0, + pOwner, + pJobName, + pJobRecord, + FALSE); +} + + +/*++ +******************************************************************* + + PS40GetJobName + +Routine Description: + + Common routine to get the print job configuration from 40. + +Arguments: + NDSCaptureFlag = + 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 +PS40GetJobName( + unsigned int NDSCaptureFlag, + unsigned short SearchFlag, + unsigned char *pOwner, + unsigned char *pJobName, + PPS_JOB_RECORD pJobRecord, + unsigned char GetDefault + ) +{ + unsigned char *pSearchJobName; + unsigned long ObjectId; + HANDLE stream = NULL; + unsigned int Count; + unsigned int Bytes; + unsigned int RetCode = 0; + unsigned int ConnectionNumber; + JOB_NAME_AREA JobNameArea; + JOB_RECORD_AREA JobRecord; + PRINTCON_40_HEADER PrintConHeader; + unsigned int Version40 = FALSE; + unsigned int ConnectionHandle; + unsigned char MailDirPath[NCP_MAX_PATH_LENGTH]; + unsigned char TempJobName[32]; + PBYTE JobContext = NULL; + unsigned FileSize; + + // BUGBUG Printer names can be used instead of queues + // Must lookup "default print queue" if NT doesn't + + if ( NDSCaptureFlag ) { + + if ( !GetDefault ) { + JobContext = strchr( pJobName, ':' ); + if ( JobContext ) { + *JobContext = '\0'; + strncpy( TempJobName, pJobName, 32 ); + *JobContext++ = ':'; + pJobName = TempJobName; + } + } + + if ( JobContext ) { + if (NDSfopenStream ( JobContext, "Print Job Configuration", &stream, + &FileSize )) { + RetCode = PS_ERR_OPENING_DB; + goto CommonExit; + } + } + else { + if (NDSfopenStream ( TYPED_USER_NAME, "Print Job Configuration", + &stream, &FileSize)) { + PBYTE p; + + for ( p = TYPED_USER_NAME; p ; p = strchr ( p, '.' ) ) + { + p++; + + if ( *p == 'O' && *(p+1) == 'U' && *(p+2) == '=' ) + break; + + if ( *p == 'O' && *(p+1) == '=' ) + break; + } + if (NDSfopenStream ( p, "Print Job Configuration", &stream, + &FileSize)) { + RetCode = PS_ERR_OPENING_DB; + goto CommonExit; + } + } + } + } + else { + + if (!CGetDefaultConnectionID (&ConnectionHandle)) { + RetCode = PS_ERR_OPENING_DB; + goto CommonExit; + } + + 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/PRINTJOB.DAT", SwapLong(ObjectId)); + stream = CreateFileA( NTNWtoUNCFormat( MailDirPath ), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL ); + if (stream == INVALID_HANDLE_VALUE) { + + sprintf(MailDirPath, "SYS:PUBLIC/PRINTJOB.DAT"); + + stream = CreateFileA( NTNWtoUNCFormat(MailDirPath), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL ); + + if (stream == INVALID_HANDLE_VALUE) { + RetCode = PS_ERR_OPENING_DB; + goto CommonExit; + } + } + } + + if ( !ReadFile( stream, (PBYTE) &PrintConHeader, PRINTCON_40_HEADER_SIZE, &Bytes, NULL ) ) { + RetCode = PS_ERR_INTERNAL_ERROR; + goto CommonExit; + } + + if (Bytes < PRINTCON_40_HEADER_SIZE) { + if ( !( NDSCaptureFlag && Bytes) ) { // BUGBUG + RetCode = PS_ERR_INTERNAL_ERROR; + goto CommonExit; + } + } + + /** Check the version number **/ + + if ( PrintConHeader.MajorVersion != 4 ) { + RetCode = PS_ERR_BAD_VERSION; + goto CommonExit; + } + + if ( PrintConHeader.MinorVersion == 0 ) { + Version40 = TRUE; + } + + /** Get the name we are looking for **/ + + if (GetDefault) { + if (PrintConHeader.DefaultJobName[0] == 0) { + RetCode = PS_ERR_GETTING_DEFAULT; + goto CommonExit; + } + pSearchJobName = PrintConHeader.DefaultJobName; + } + else { + pSearchJobName = pJobName; + } + + if ( !Version40 ) { + SetFilePointer( stream, PRINTCON_41_HEADER_SIZE, NULL, FILE_BEGIN ); + } + + Count = 0; + + /** Go through all of the job entry to look for the name **/ + + while (Count < PrintConHeader.NumberOfRecords) { + if ( !ReadFile( stream, (PBYTE) &JobNameArea, JOB_NAME_AREA_SIZE, &Bytes, NULL) ) { + RetCode = PS_ERR_INTERNAL_ERROR; + goto CommonExit; + } + + if (Bytes < JOB_NAME_AREA_SIZE) { + if ( !( NDSCaptureFlag && Bytes) ) { // BUGBUG + 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 > PrintConHeader.NumberOfRecords) { + if (GetDefault) { + RetCode = PS_ERR_GETTING_DEFAULT; + } + else { + RetCode = PS_ERR_READING_RECORD; + } + goto CommonExit; + } + + /* + * The Job offset starts at the beginning of the third section. + * The third section starts after the Header and after the + * 50 record blocks. + */ + if ( Version40 ) { + SetFilePointer( stream, + PRINTCON_40_HEADER_SIZE + + ( PrintConHeader.NumberOfBlocks * 50) * JOB_NAME_AREA_SIZE + + JobNameArea.JobRecordOffset, + NULL, + FILE_BEGIN ); + } + else { + SetFilePointer( stream, + PRINTCON_41_HEADER_SIZE + + ( PrintConHeader.NumberOfBlocks * 50) * JOB_NAME_AREA_SIZE + + JobNameArea.JobRecordOffset, + NULL, + FILE_BEGIN ); + } + + memset((PBYTE)&JobRecord, 0, sizeof(JobRecord)); + + if ( !ReadFile( stream, (PBYTE) &JobRecord, JOB_RECORD_AREA_SIZE, &Bytes, NULL) ) { + RetCode = PS_ERR_READING_RECORD; + goto CommonExit; + } + + if (Bytes < JOB_RECORD_AREA_SIZE) { + if ( !( NDSCaptureFlag && Bytes) ) { // BUGBUG + 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; + } + if (JobRecord.Destination) { + pJobRecord->PrintJobFlag |= PS_JOB_DS_PRINTER; + } + if ( JobRecord.SystemType ) { + pJobRecord->PrintJobFlag |= PS_JOB_ENV_DS; + } + + 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); + + if ( JobRecord.SystemType ) { + ConvertUnicodeToAscii( JobRecord.u.DSObjectName ); + strcpy(pJobRecord->u.DSObjectName, JobRecord.u.DSObjectName); + } + else { + strcpy(pJobRecord->u.NonDS.PrintQueue, JobRecord.u.NonDS.QueueName); + strcpy(pJobRecord->u.NonDS.FileServer, JobRecord.u.NonDS.Server); + } + + if (GetDefault && pJobName) { + strcpy(pJobName, JobNameArea.JobName); + } + + if (pOwner) { + *pOwner = 0; + } + +CommonExit: + if (stream != NULL) { + if ( NDSCaptureFlag ) + CloseHandle( stream ); + else + fclose( stream ); + } + + return RetCode; +} |