/* * Module Name: * capture.c * Copyright (c) 1995 Microsoft Corporation * * Abstract: * * SYNTAX (Command line) * - Usage: Capture [/Options] * * Author : Congpa You (Congpay) * * Revision history : * - 05/24/94 congpay Created */ #include "common.h" extern char *RemoveSpaces (char * buffer); typedef struct _CAPTURE_PARAMS { UCHAR nLPT; char serverName[MAX_NAME_LEN]; char queueName[MAX_QUEUE_NAME_LEN]; char bannerUserName[MAX_BANNER_USER_NAME]; char filePath[_MAX_PATH]; unsigned int NDSCapture; NETWARE_CAPTURE_FLAGS_RW captureFlagsRW; }CAPTURE_PARAMS, *PCAPTURE_PARAMS; /* Local Functions*/ void UpcaseArg(int argc, char ** argv); int IsShowOption (int argc, char ** argv); int IsServerSpecified (int argc, char ** argv); int IsNoOption (char * option); int IsQuestionMark (int argc, char ** argv); int IsValidOption (char *input, char *option, char *shortoption); void ShowCapture(void); void GetJobNameFromArg (int argc, char ** argv, char *jobName); int InitCaptureParams (unsigned int conn, char *jobName, PCAPTURE_PARAMS pCaptureParams); int ReadArguments (int argc, char ** argv, char *jobName, PCAPTURE_PARAMS pCaptureParams); int CStartCapture(unsigned int conn, PCAPTURE_PARAMS pCaptureParams); int GetPrinterDefaultQueue( PCAPTURE_PARAMS, PBYTE ); void Capture (char ** argv, unsigned int argc) { char jobName[MAX_JOB_NAME_LEN]=""; CAPTURE_PARAMS captureParams; unsigned int conn; UpcaseArg(argc, argv); memset( (PBYTE)&captureParams, 0, sizeof(captureParams) ); captureParams.nLPT = 0; captureParams.serverName[0] = 0; captureParams.queueName[0] = 0; captureParams.bannerUserName[0] = 0; captureParams.filePath[0] = 0; if ( fNDS ) { captureParams.NDSCapture = TRUE; } else { captureParams.NDSCapture = FALSE; } if ( IsServerSpecified( argc, argv ) ) captureParams.NDSCapture = FALSE; // If the option is show, show the current capture settings. if (IsShowOption (argc, argv)) { ShowCapture(); return; } // If the option is ?, show the usage. if (IsQuestionMark(argc, argv)) { DisplayMessage(IDR_CAPTURE_USAGE); return; } // If /Job=jobname is in the parameter, get the jobname. GetJobNameFromArg (argc, argv, jobName); if (!CGetDefaultConnectionID (&conn) || !InitCaptureParams (conn, jobName, &captureParams) || !ReadArguments (argc, argv, jobName, &captureParams)) return; // Terminate old capture. EndCapture ((unsigned char) captureParams.nLPT); (void) CStartCapture(conn, &captureParams); return; } void UpcaseArg(int argc, char ** argv) { int i; for (i = 0; i < argc ; i++) _strupr (argv[i]); } /* Return TRUE if input is /Show option. FALSE otherwise. */ int IsShowOption (int argc,char ** argv) { int bIsShowOption = FALSE; char * p; if (argc == 2) { p = argv[1]; while ((*p == '/') || (*p == '\\') || (*p == '-')) p++; if (!strncmp (p, __SHOW__, max (2, strlen(p)))) bIsShowOption = TRUE; } return(bIsShowOption); } /* Return TRUE if input is /? option. FALSE otherwise. */ int IsQuestionMark (int argc, char ** argv) { int bIsQuestionMark = FALSE; char * p; if (argc == 2) { p = argv[1]; while ((*p == '/') || (*p == '\\') || (*p == '-')) p++; if (*p == '?') bIsQuestionMark = TRUE; } return(bIsQuestionMark); } int IsNoOption (char * option) { int bIsNoOption = FALSE; char * p; p = option; while ((*p == '/') || (*p == '\\') || (*p == '-')) p++; if (!strncmp (p, __OPT_NO__, max (1, strlen(p)))) bIsNoOption = TRUE; return(bIsNoOption); } /* Return TRUE if the input match option or shortoption. FALSE otherwise. */ int IsValidOption (char *input, char *option, char *shortoption) { int bValideInput = FALSE; while ((*input == '/') || (*input == '\\') || (*input == '-')) input++; if (!strcmp (input, shortoption)) { bValideInput = TRUE; } else if (!strcmp (input, option)) { bValideInput = TRUE; } return(bValideInput); } void GetJobNameFromArg (int argc, char ** argv, char *jobName) { int i; char *pEqual; for (i = 0; i < argc; i++) { if (pEqual = strchr (argv[i], '=')) { *pEqual = 0; if (IsValidOption (argv[i], __JOB__, __SHORT_FOR_JOB__) && *(pEqual+1) != 0 && strlen (pEqual+1) < MAX_JOB_NAME_LEN) strcpy (jobName, pEqual+1); *pEqual = '='; } } return; } int IsServerSpecified (int argc, char ** argv) { int i; for (i = 0; i < argc; i++) { if (IsValidOption (argv[i], __SERVER__, __SHORT_FOR_SERVER__)) return TRUE; } return FALSE; } /* Initialize the capture flags with job config or default value. */ int InitCaptureParams (unsigned int conn, char *jobName, PCAPTURE_PARAMS pCaptureParams) { PS_JOB_RECORD psJobRecord; unsigned int iRet = 0; // Get job configuration. if (jobName[0] == 0) { // Get Default Job Name. if ( Is40Server( conn ) ) { iRet = PS40JobGetDefault( pCaptureParams->NDSCapture, 0, NULL, jobName, &psJobRecord ); } else { iRet = PSJobGetDefault( conn, 0, NULL, jobName, &psJobRecord ); } if ( iRet ) { if (iRet == PS_ERR_OPENING_DB || iRet == PS_ERR_GETTING_DEFAULT) { pCaptureParams->nLPT = 1; pCaptureParams->bannerUserName[0]=0; pCaptureParams->serverName[0]=0; pCaptureParams->queueName[0]=0; pCaptureParams->filePath[0]=0; pCaptureParams->captureFlagsRW.JobControlFlags = 0; pCaptureParams->captureFlagsRW.TabSize = 8; pCaptureParams->captureFlagsRW.NumCopies = 1; pCaptureParams->captureFlagsRW.PrintFlags = DEFAULT_PRINT_FLAGS; pCaptureParams->captureFlagsRW.FormName[0] = 0; pCaptureParams->captureFlagsRW.FormType = 0; pCaptureParams->captureFlagsRW.FlushCaptureTimeout = 0; pCaptureParams->captureFlagsRW.FlushCaptureOnClose = 0; strcpy (pCaptureParams->captureFlagsRW.BannerText, DEFAULT_BANNER_TEXT); return(TRUE); } else { DisplayError (iRet, "PSJobGetDefault"); return(FALSE); } } } else { if ( Is40Server( conn ) ) { iRet = PS40JobRead( pCaptureParams->NDSCapture, NULL, jobName, &psJobRecord); } else { iRet = PSJobRead(conn, NULL, jobName, &psJobRecord); } if ( iRet ) { if ( ( iRet == PS_ERR_READING_RECORD) || ( iRet == PS_ERR_OPENING_DB) ) DisplayMessage(IDR_JOB_NOT_FOUND, jobName); else DisplayError (iRet, "PSJobRead"); return(FALSE); } } pCaptureParams->captureFlagsRW.JobControlFlags = 0; pCaptureParams->captureFlagsRW.TabSize = psJobRecord.TabSize; pCaptureParams->captureFlagsRW.NumCopies = psJobRecord.Copies; pCaptureParams->captureFlagsRW.PrintFlags = ((psJobRecord.PrintJobFlag & PS_JOB_EXPAND_TABS)? 0 : CAPTURE_FLAG_EXPAND_TABS) +((psJobRecord.PrintJobFlag & PS_JOB_NO_FORMFEED)? CAPTURE_FLAG_NO_FORMFEED : 0) +((psJobRecord.PrintJobFlag & PS_JOB_NOTIFY)? CAPTURE_FLAG_NOTIFY : 0) +((psJobRecord.PrintJobFlag & PS_JOB_PRINT_BANNER)? CAPTURE_FLAG_PRINT_BANNER : 0); pCaptureParams->captureFlagsRW.FormType = 0; pCaptureParams->captureFlagsRW.FlushCaptureTimeout = psJobRecord.TimeOutCount; pCaptureParams->captureFlagsRW.FlushCaptureOnClose = !(psJobRecord.PrintJobFlag & PS_JOB_AUTO_END); strcpy (pCaptureParams->captureFlagsRW.FormName, psJobRecord.FormName); strcpy (pCaptureParams->captureFlagsRW.BannerText, (psJobRecord.BannerName[0] == 0)? DEFAULT_BANNER_TEXT : psJobRecord.BannerName); pCaptureParams->nLPT = psJobRecord.LocalPrinter; strcpy (pCaptureParams->bannerUserName, psJobRecord.Name); if ( psJobRecord.PrintJobFlag & PS_JOB_ENV_DS ) { strcpy (pCaptureParams->serverName, ""); if ( psJobRecord.PrintJobFlag & PS_JOB_DS_PRINTER ) GetPrinterDefaultQueue( pCaptureParams, psJobRecord.u.DSObjectName ); else strcpy (pCaptureParams->queueName, psJobRecord.u.DSObjectName ); } else { strcpy (pCaptureParams->serverName, psJobRecord.u.NonDS.FileServer); strcpy (pCaptureParams->queueName, psJobRecord.u.NonDS.PrintQueue); } pCaptureParams->filePath[0]=0; return(TRUE); } int ReadArguments (int argc, char ** argv, char *jobName, PCAPTURE_PARAMS pCaptureParams) { int i, fValidOption = TRUE, fValidParam = TRUE; char *pEqual = NULL; for (i = 1; i < argc; i++) { if (IsNoOption(argv[i])) { if (i != argc - 1) { i++; if (IsValidOption (argv[i], __NOTIFY__, __SHORT_FOR_NOTIFY__)) { pCaptureParams->captureFlagsRW.PrintFlags &= (0xFF-CAPTURE_FLAG_NOTIFY); } else if (IsValidOption (argv[i], __AUTOENDCAP__, __SHORT_FOR_AUTOENDCAP__)) { pCaptureParams->captureFlagsRW.FlushCaptureOnClose = 1; } else if (IsValidOption (argv[i], __TABS__, __SHORT_FOR_TABS__)) { pCaptureParams->captureFlagsRW.PrintFlags &= (0xFF - CAPTURE_FLAG_EXPAND_TABS); } else if (IsValidOption (argv[i], __BANNER__, __SHORT_FOR_BANNER__)) { pCaptureParams->captureFlagsRW.PrintFlags &= (0xFF - CAPTURE_FLAG_PRINT_BANNER); } else if (IsValidOption (argv[i], __FORMFEED__, __SHORT_FOR_FORMFEED__)) { pCaptureParams->captureFlagsRW.PrintFlags |= CAPTURE_FLAG_NO_FORMFEED; } else { i--; fValidOption = FALSE; break; } } else { fValidOption = FALSE; break; } } else if (IsValidOption (argv[i], __NOTIFY__, __SHORT_FOR_NOTIFY__)) { pCaptureParams->captureFlagsRW.PrintFlags |= CAPTURE_FLAG_NOTIFY; } else if (IsValidOption (argv[i], __NONOTIFY__, __SHORT_FOR_NONOTIFY__)) { pCaptureParams->captureFlagsRW.PrintFlags &= (0xFF - CAPTURE_FLAG_NOTIFY); } else if (IsValidOption (argv[i], __AUTOENDCAP__, __SHORT_FOR_AUTOENDCAP__)) { pCaptureParams->captureFlagsRW.FlushCaptureOnClose = 0; } else if (IsValidOption (argv[i], __NOAUTOENDCAP__, __SHORT_FOR_NOAUTOENDCAP__)) { pCaptureParams->captureFlagsRW.FlushCaptureOnClose = 1; } else if (IsValidOption (argv[i], __NOTABS__, __SHORT_FOR_NOTABS__)) { pCaptureParams->captureFlagsRW.PrintFlags &= (0xFF - CAPTURE_FLAG_EXPAND_TABS); } else if (IsValidOption (argv[i], __NOBANNER__, __SHORT_FOR_NOBANNER__)) { pCaptureParams->captureFlagsRW.PrintFlags &= (0xFF - CAPTURE_FLAG_PRINT_BANNER); } else if (IsValidOption (argv[i], __FORMFEED__, __SHORT_FOR_FORMFEED__)) { pCaptureParams->captureFlagsRW.PrintFlags &= (0xFF - CAPTURE_FLAG_NO_FORMFEED); } else if (IsValidOption (argv[i], __NOFORMFEED__, __SHORT_FOR_NOFORMFEED__)) { pCaptureParams->captureFlagsRW.PrintFlags |= CAPTURE_FLAG_NO_FORMFEED; } else if (IsValidOption (argv[i], __KEEP__, __SHORT_FOR_KEEP__)) { pCaptureParams->captureFlagsRW.PrintFlags |= CAPTURE_FLAG_KEEP; } else { // All other valid options should have '=' sign in it. // Except for LX LPX LPTX // pEqual = strchr (argv[i], '='); // Optionally a ':' works too if (pEqual == NULL ) { pEqual = strchr (argv[i], ':'); } if (pEqual != NULL) *pEqual = 0; if (IsValidOption (argv[i], __TIMEOUT__, __SHORT_FOR_TIMEOUT__)) { if (pEqual == NULL || *(pEqual+1) == 0) { DisplayMessage(IDR_TIME_OUT_EXPECTED); fValidParam = FALSE; break; } pCaptureParams->captureFlagsRW.FlushCaptureTimeout = atoi (pEqual+1); if (pCaptureParams->captureFlagsRW.FlushCaptureTimeout > 1000) { DisplayMessage(IDR_TIMEOUT_OUTOF_RANGE); fValidParam = FALSE; break; } } else if (IsValidOption (argv[i], __LOCAL__, __SHORT_FOR_LOCAL__)) { if (pEqual == NULL || *(pEqual+1) == 0) { DisplayMessage(IDR_LPT_NUMBER_EXPECTED); fValidParam = FALSE; break; } pCaptureParams->nLPT = (unsigned char) atoi (pEqual+1); if (pCaptureParams->nLPT < 1 || pCaptureParams->nLPT > 3) { DisplayMessage(IDR_INVALID_LPT_NUMBER); fValidParam = FALSE; break; } } else if (IsValidOption (argv[i], __LOCAL_3__, __LOCAL_2__)) { if (pEqual == NULL || *(pEqual+1) == 0) { DisplayMessage(IDR_LPT_NUMBER_EXPECTED); fValidParam = FALSE; break; } pCaptureParams->nLPT = (unsigned char) atoi (pEqual+1); if (pCaptureParams->nLPT < 1 || pCaptureParams->nLPT > 3) { DisplayMessage(IDR_INVALID_LPT_NUMBER); fValidParam = FALSE; break; } } else if (IsValidOption (argv[i], __JOB__, __SHORT_FOR_JOB__)) { if (pEqual == NULL || *(pEqual+1) == 0 || strlen (pEqual+1) > MAX_JOB_NAME_LEN - 1) { fValidOption = FALSE; break; } strcpy (jobName, pEqual+1); } else if (IsValidOption (argv[i], __SERVER__, __SHORT_FOR_SERVER__)) { if (pEqual == NULL || *(pEqual+1) == 0 || strlen (pEqual+1) > MAX_NAME_LEN - 1) { fValidOption = FALSE; break; } pCaptureParams->NDSCapture = FALSE; strcpy (pCaptureParams->serverName, pEqual+1); } else if (IsValidOption (argv[i], __QUEUE__, __SHORT_FOR_QUEUE__)) { if (pEqual == NULL || *(pEqual+1) == 0 || strlen (pEqual+1) > MAX_QUEUE_NAME_LEN - 1) //compatible. { fValidOption = FALSE; break; } strcpy (pCaptureParams->queueName, pEqual+1); } else if (IsValidOption (argv[i], __PRINTER__, __SHORT_FOR_PRINTER__)) { if (pEqual == NULL || *(pEqual+1) == 0 || !pCaptureParams->NDSCapture || strlen (pEqual+1) > MAX_QUEUE_NAME_LEN - 1) //compatible. { fValidOption = FALSE; break; } GetPrinterDefaultQueue( pCaptureParams, pEqual+1 ); } else if (IsValidOption (argv[i], __CREATE__, __SHORT_FOR_CREATE__)) { if (pEqual != NULL) //compatible. { if (strlen (pEqual+1) > _MAX_PATH - 1) { DisplayMessage(IDR_INVALID_PATH_NAME, pEqual+1); fValidParam = FALSE; break; } strcpy (pCaptureParams->filePath, pEqual+1); } } else if (IsValidOption (argv[i], __FORM__, __SHORT_FOR_FORM__)) { int j = 1; int bAllNumbers = TRUE; if (pEqual == NULL || *(pEqual+1) == 0) { DisplayMessage(IDR_FORM_EXPECTED); fValidParam = FALSE; break; } if (strlen (pEqual+1) > 3) // Only allow 3 digits number. { DisplayMessage(IDR_INVALID_FORM_NAME, pEqual+1); fValidParam = FALSE; break; } while (*(pEqual+j) != 0) { if (!isdigit (*(pEqual+j))) { bAllNumbers = FALSE; break; } j++; } if (bAllNumbers) { pCaptureParams->captureFlagsRW.FormType = atoi (pEqual+1); if (pCaptureParams->captureFlagsRW.FormType > 255) { DisplayMessage(IDR_INVALID_FORM_TYPE); fValidParam = FALSE; break; } } else { DisplayMessage(IDR_INVALID_FORM_NAME, pEqual+1); fValidParam = FALSE; break; } } else if (IsValidOption (argv[i], __COPIES__, __SHORT_FOR_COPIES__)) { if (pEqual == NULL || *(pEqual+1) == 0) { DisplayMessage(IDR_COPIES_EXPECTED); fValidParam = FALSE; break; } pCaptureParams->captureFlagsRW.NumCopies = atoi (pEqual+1); if (pCaptureParams->captureFlagsRW.NumCopies < 1 || pCaptureParams->captureFlagsRW.NumCopies > 255) { DisplayMessage(IDR_COPIES_OUTOF_RANGE); fValidParam = FALSE; break; } } else if (IsValidOption (argv[i], __TABS__, __SHORT_FOR_TABS__)) { if (pEqual == NULL || *(pEqual+1) == 0) { DisplayMessage(IDR_TAB_SIZE_EXPECTED); fValidParam = FALSE; break; } pCaptureParams->captureFlagsRW.TabSize = (BYTE) atoi (pEqual+1); if (pCaptureParams->captureFlagsRW.TabSize < 1 || pCaptureParams->captureFlagsRW.TabSize > 18) { DisplayMessage(IDR_TABSIZE_OUTOF_RANGE); fValidParam = FALSE; break; } pCaptureParams->captureFlagsRW.PrintFlags |= CAPTURE_FLAG_EXPAND_TABS; } else if (IsValidOption (argv[i], __NAME__, __SHORT_FOR_NAME__)) { if (pEqual == NULL || *(pEqual+1) == 0 || strlen (pEqual+1) > MAX_BANNER_USER_NAME - 1) { fValidOption = FALSE; break; } strcpy (pCaptureParams->bannerUserName, pEqual+1); } else if (IsValidOption (argv[i], __BANNER__, __SHORT_FOR_BANNER__)) { if (pEqual != NULL) { if (strlen (pEqual+1) > MAX_BANNER_USER_NAME - 1) { DisplayMessage(IDR_INVALID_BANNER, pEqual+1); fValidParam = FALSE; break; } strcpy (pCaptureParams->captureFlagsRW.BannerText, pEqual+1); pCaptureParams->captureFlagsRW.PrintFlags |= CAPTURE_FLAG_PRINT_BANNER; } } // // Kludge for LX LPX LPTX parameters // Note that L:X L=X, etc are also valid // else if ( ( pEqual == NULL ) && ( *(argv[i]) == 'L' ) ) { pEqual = argv[i]; pEqual++; if ( *pEqual == 'P' ) { pEqual++; if ( *pEqual == 'T' ) { pEqual++; } } pCaptureParams->nLPT = (unsigned char) atoi (pEqual); if (pCaptureParams->nLPT < 1 || pCaptureParams->nLPT > 3) { DisplayMessage(IDR_INVALID_LPT_NUMBER); fValidParam = FALSE; break; } } else { fValidOption = FALSE; break; } } } if (fValidOption && fValidParam) { sprintf (pCaptureParams->captureFlagsRW.JobDescription, __JOB_DESCRIPTION__, pCaptureParams->nLPT); return(TRUE); } else { if (!fValidOption) { if (pEqual) *pEqual = '='; DisplayMessage(IDR_UNKNOW_FLAG, argv[i]); } DisplayMessage(IDR_CAPTURE_USAGE); return(FALSE); } } /* Show the capture setting. */ void ShowCapture(void) { unsigned int iRet = 0; int i; char * queueName; for (i = 1; i <= 3; i++ ) { NETWARE_CAPTURE_FLAGS_RW captureFlagsRW; NETWARE_CAPTURE_FLAGS_RO captureFlagsRO; if (iRet = GetCaptureFlags ((unsigned char)i, &captureFlagsRW, &captureFlagsRO)) { DisplayError (iRet, "GetCaptureFlags"); } else { char *serverName; WCHAR timeOut[256]; WCHAR tabs[256]; if (captureFlagsRO.LPTCaptureFlag == 0) { DisplayMessage(IDR_NOT_ACTIVE, i); } else { serverName = captureFlagsRO.ServerName; if ( !CaptureStringsLoaded ) { (void) LoadString( NULL, IDR_DISABLED, __DISABLED__, 256 ); (void) LoadString( NULL, IDR_ENABLED, __ENABLED__, 256 ); (void) LoadString( NULL, IDR_YES, __YES__, 256 ); (void) LoadString( NULL, IDR_NO, __NO__, 256 ); (void) LoadString( NULL, IDR_SECONDS, __SECONDS__, 256 ); (void) LoadString( NULL, IDR_CONVERT_TO_SPACE, __CONVERT_TO_SPACE__, 256 ); (void) LoadString( NULL, IDR_NO_CONVERSION, __NO_CONVERSION__, 256 ); (void) LoadString( NULL, IDR_NOTIFY_USER, __NOTIFY_USER__, 256 ); (void) LoadString( NULL, IDR_NOT_NOTIFY_USER, __NOT_NOTIFY_USER__, 256 ); (void) LoadString( NULL, IDR_NONE, __NONE__, 256 ); } if (captureFlagsRW.FlushCaptureTimeout) wsprintf (timeOut, __SECONDS__, captureFlagsRW.FlushCaptureTimeout); else (void) LoadString( NULL, IDR_DISABLED, timeOut, 256 ); if (captureFlagsRW.PrintFlags & CAPTURE_FLAG_EXPAND_TABS) wsprintf(tabs, __CONVERT_TO_SPACE__, captureFlagsRW.TabSize); else (void) LoadString( NULL, IDR_NO_CONVERSION, tabs, 256 ); queueName = captureFlagsRO.QueueName; if ( fNDS ) { if ( captureFlagsRW.PrintFlags & CAPTURE_FLAG_PRINT_BANNER ) { DisplayMessage(IDR_LPT_STATUS_NDS, i, queueName, captureFlagsRW.PrintFlags & CAPTURE_FLAG_NOTIFY? __NOTIFY_USER__ : __NOT_NOTIFY_USER__, //Notify __DISABLED__, //Capture Defaults captureFlagsRW.FlushCaptureOnClose? __DISABLED__ : __ENABLED__, //AutoEndCap captureFlagsRW.BannerText, //Banner captureFlagsRW.PrintFlags & CAPTURE_FLAG_NO_FORMFEED? __NO__ : __YES__, //Form Feed captureFlagsRW.NumCopies, //Copies tabs, //Tabs captureFlagsRW.FormType, timeOut); //Timeout Counts } else { DisplayMessage(IDR_LPT_STATUS_NO_BANNER_NDS, i, queueName, captureFlagsRW.PrintFlags & CAPTURE_FLAG_NOTIFY? __NOTIFY_USER__ : __NOT_NOTIFY_USER__, //Notify __DISABLED__, //Capture Defaults captureFlagsRW.FlushCaptureOnClose? __DISABLED__ : __ENABLED__, //AutoEndCap __NONE__, //Banner captureFlagsRW.PrintFlags & CAPTURE_FLAG_NO_FORMFEED? __NO__ : __YES__, //Form Feed captureFlagsRW.NumCopies, //Copies tabs, //Tabs captureFlagsRW.FormType, timeOut); //Timeout Counts } } else { if ( captureFlagsRW.PrintFlags & CAPTURE_FLAG_PRINT_BANNER ) { DisplayMessage(IDR_LPT_STATUS, i, serverName, queueName, captureFlagsRW.PrintFlags & CAPTURE_FLAG_NOTIFY? __NOTIFY_USER__ : __NOT_NOTIFY_USER__, //Notify __DISABLED__, //Capture Defaults captureFlagsRW.FlushCaptureOnClose? __DISABLED__ : __ENABLED__, //AutoEndCap captureFlagsRW.BannerText, //Banner captureFlagsRW.PrintFlags & CAPTURE_FLAG_NO_FORMFEED? __NO__ : __YES__, //Form Feed captureFlagsRW.NumCopies, //Copies tabs, //Tabs captureFlagsRW.FormType, timeOut); //Timeout Counts } else { DisplayMessage(IDR_LPT_STATUS_NO_BANNER, i, serverName, queueName, captureFlagsRW.PrintFlags & CAPTURE_FLAG_NOTIFY? __NOTIFY_USER__ : __NOT_NOTIFY_USER__, //Notify __DISABLED__, //Capture Defaults captureFlagsRW.FlushCaptureOnClose? __DISABLED__ : __ENABLED__, //AutoEndCap __NONE__, //Banner captureFlagsRW.PrintFlags & CAPTURE_FLAG_NO_FORMFEED? __NO__ : __YES__, //Form Feed captureFlagsRW.NumCopies, //Copies tabs, //Tabs captureFlagsRW.FormType, timeOut); //Timeout Counts } } } } } } int CStartCapture(unsigned int conn, PCAPTURE_PARAMS pCaptureParams) { unsigned int iRet = 0; unsigned char FullPath[255 + NCP_VOLUME_LENGTH]; unsigned char DirPath[255]; unsigned char VolumeName[NCP_VOLUME_LENGTH]; WORD status; // Get connection handle. if ( !pCaptureParams->NDSCapture ) { if ( pCaptureParams->serverName[0] == 0 ) { if (iRet = GetFileServerName (conn, pCaptureParams->serverName)) { DisplayError (iRet, "GetFileServerName"); return (1); } } else { if (iRet = GetConnectionHandle (pCaptureParams->serverName, &conn)) { if ( iRet = NTLoginToFileServer( pCaptureParams->serverName, "GUEST", "" ) ) { switch ( iRet ) { case ERROR_INVALID_PASSWORD: case ERROR_NO_SUCH_USER: case ERROR_CONNECTION_COUNT_LIMIT: case ERROR_LOGIN_TIME_RESTRICTION: case ERROR_LOGIN_WKSTA_RESTRICTION: case ERROR_ACCOUNT_DISABLED: case ERROR_PASSWORD_EXPIRED: case ERROR_REMOTE_SESSION_LIMIT_EXCEEDED: DisplayMessage( IDR_CAPTURE_FAILED, pCaptureParams->queueName ); DisplayMessage( IDR_ACCESS_DENIED ); break; default: DisplayMessage(IDR_SERVER_NOT_FOUND, pCaptureParams->serverName); } return (1); } else { if (iRet = GetConnectionHandle (pCaptureParams->serverName, &conn)) { DisplayMessage(IDR_SERVER_NOT_FOUND, pCaptureParams->serverName); return (1); } } } } } if (pCaptureParams->filePath[0] != 0) { DisplayMessage(IDR_FILE_CAPTURE_UNSUPPORTED); return (1); } else { if (pCaptureParams->queueName[0] == 0) { if ( pCaptureParams->NDSCapture ) { DisplayMessage(IDR_NO_QUEUE); return (1); } else { // Try to get the default queue ID and name. if (iRet = GetDefaultPrinterQueue (conn, pCaptureParams->serverName, pCaptureParams->queueName)) { DisplayMessage(IDR_NO_PRINTERS, pCaptureParams->serverName); return (1); } } } // Start queue capture. if ( pCaptureParams->NDSCapture ) { char szCanonName[MAX_QUEUE_NAME_LEN]; // Get the full name of the printer queue // The redirectory wants root based names for // everything. iRet = NDSCanonicalizeName( pCaptureParams->queueName, szCanonName, NDS_NAME_CHARS, TRUE ); if ( iRet && ( pCaptureParams->queueName[0] != '.' ) ) { // If that didn't work, see if it's a root // based name without the leading period. strcpy( szCanonName, "." ); strcat( szCanonName, pCaptureParams->queueName ); iRet = NDSCanonicalizeName( szCanonName, szCanonName, MAX_QUEUE_NAME_LEN, TRUE ); } if ( iRet ) iRet = ERROR_BAD_NETPATH; else iRet = StartQueueCapture ( conn, pCaptureParams->nLPT, NDSTREE, szCanonName ); } else { iRet = StartQueueCapture (conn, pCaptureParams->nLPT, pCaptureParams->serverName, pCaptureParams->queueName); } if ( iRet ) { switch ( iRet ) { case ERROR_ACCESS_DENIED: case ERROR_INVALID_PASSWORD: DisplayMessage (IDR_CAPTURE_FAILED, pCaptureParams->queueName); DisplayMessage (IDR_ACCESS_DENIED); break; case ERROR_EXTENDED_ERROR: NTPrintExtendedError(); break; case ERROR_BAD_NET_NAME: case ERROR_BAD_NETPATH: if ( pCaptureParams->NDSCapture ) DisplayMessage (IDR_NDSQUEUE_NOT_EXIST, pCaptureParams->queueName, pCaptureParams->serverName ); else DisplayMessage (IDR_QUEUE_NOT_EXIST, pCaptureParams->queueName, pCaptureParams->serverName ); break; default: DisplayError (iRet, "StartQueueCapture"); break; } return (1); } } if (pCaptureParams->captureFlagsRW.FlushCaptureOnClose == 1) DisplayMessage(IDR_NO_AUTOENDCAP); if ( pCaptureParams->NDSCapture ) DisplayMessage(IDR_NDSSUCCESS_QUEUE, pCaptureParams->nLPT, pCaptureParams->queueName); else DisplayMessage(IDR_SUCCESS_QUEUE, pCaptureParams->nLPT, pCaptureParams->queueName, pCaptureParams->serverName); return(0); } /* * Given an NDS printer name, fill in the default queue name * */ int GetPrinterDefaultQueue( PCAPTURE_PARAMS pCaptureParams, PBYTE PrinterName ) { BYTE Fixup[ MAX_QUEUE_NAME_LEN]; PBYTE ptr; unsigned int iRet; iRet = NDSGetProperty ( PrinterName, "Default Queue", pCaptureParams->queueName, MAX_QUEUE_NAME_LEN, NULL ); if ( iRet ) { /* * Strip off the . in front and add context at end */ ptr = RemoveSpaces (PrinterName); if ( *ptr == '.' ) { ptr++; strncpy( Fixup, ptr, MAX_QUEUE_NAME_LEN ); } else { strncpy( Fixup, ptr, MAX_QUEUE_NAME_LEN ); if ( Fixup[strlen(Fixup)-1] != '.' ) { strcat( Fixup, "." ); } (void) NDSGetContext( Fixup + strlen(Fixup), MAX_QUEUE_NAME_LEN - strlen(Fixup) ); } iRet = NDSGetProperty ( Fixup, "Default Queue", pCaptureParams->queueName, MAX_QUEUE_NAME_LEN, NULL ); if ( !iRet ) ConvertUnicodeToAscii( pCaptureParams->queueName ); } return iRet; }