Changeset 26 for trunk/gui/util/prntobj/prntobj.c
- Timestamp:
- Apr 6, 2013, 10:16:41 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/util/prntobj/prntobj.c
r25 r26 19 19 20 20 21 /* ------------------------------------------------------------------------- * 22 * UniqueDeviceName * 23 * * 24 * Check (and, if necessary, modify) the specified print device name to make * 25 * sure it is unique. * 26 * * 27 * ARGUMENTS: * 28 * PSZ pszName : Pointer to device name buffer (9-byte CHAR buffer) * 29 * * 30 * RETURNS: ULONG * 31 * 0 on success, 1 if no unique name could be generated, or the return * 32 * code from SplEnumDevice() if an error occurred. * 33 * ------------------------------------------------------------------------- */ 34 ULONG UniqueDeviceName( PSZ pszName ) 35 { 36 PBYTE pBuf; 37 PPRDINFO3 pprd3; 38 CHAR szNumber[ MAX_DEVICE_NAME ] = {0}; 39 ULONG i, n, pos, 40 ulNumber = 0, 41 ulAvail = 0, 42 cbBuf = 0; 43 BOOL fUnique = FALSE; 44 SPLERR rc; 45 46 47 rc = SplEnumDevice( NULL, 3, NULL, 0, &ulNumber, &ulAvail, &cbBuf, NULL ); 48 if ( rc == ERROR_MORE_DATA || rc == NERR_BufTooSmall ) { 49 pBuf = malloc( cbBuf ); 50 if ( pBuf ) { 51 rc = SplEnumDevice( NULL, 3, pBuf, cbBuf, &ulNumber, &ulAvail, &cbBuf, NULL ); 52 if ( rc == NO_ERROR ) { 53 n = 1; 54 while ( !fUnique && ( n < 999 )) { // max 999 as a sanity check 55 for ( i = 0; i < ulNumber; i++ ) { 56 pprd3 = (PPRDINFO3) pBuf + i; 57 if ( stricmp( pszName, pprd3->pszPrinterName ) == 0 ) break; 58 } 59 if ( i >= ulNumber ) fUnique = TRUE; 60 else { 61 sprintf( szNumber, "%u", n++ ); 62 pos = strlen( pszName ) - strlen( szNumber ); 63 pszName[ pos ] = '\0'; 64 strncat( pszName, szNumber, MAX_DEVICE_NAME-1 ); 65 } 66 } 67 } 68 free( pBuf ); 69 } 70 } 71 if ( rc == NO_ERROR && !fUnique ) return 1; 72 else return rc; 73 } 74 75 76 /* ------------------------------------------------------------------------- * 77 * ------------------------------------------------------------------------- */ 21 78 int main( int argc, char *argv[] ) 22 79 { … … 49 106 // Generate a suitable internal device name 50 107 strncpy( szDeviceName, pszQueueName, MAX_DEVICE_NAME-1 ); 51 i = 1; 52 len = strlen( szDeviceName ); 53 rc = SplQueryDevice( NULL, szDeviceName, 0, NULL, 0, &cbBuf ); 54 while (( rc != NERR_DestNotFound) && ( i < 10 )) { 55 szDeviceName[len-1] = '0' + i; 56 rc = SplQueryDevice( NULL, szDeviceName, 0, NULL, 0, &cbBuf ); 108 if (( rc = UniqueDeviceName( szDeviceName )) != NO_ERROR ) { 109 printf("Failed to get unique device name: rc=%u\n", rc); 110 return 0; 57 111 } 58 if ( rc == NERR_DestNotFound ) { 59 devinfo.pszPrinterName = szDeviceName; 60 devinfo.pszUserName = NULL; 61 devinfo.pszLogAddr = pszPortName; 62 devinfo.pszComment = pszTitle; 63 devinfo.pszDrivers = pszModel; 64 devinfo.usTimeOut = 45; 65 rc = SplCreateDevice( NULL, 3, &devinfo, sizeof( devinfo )); 66 if ( rc != NO_ERROR ) { 67 printf("Failed to create device: SplCreateDevice() returned %u\n", rc); 68 return ( rc ); 69 } 70 } 71 else { 72 printf("Failed to get unique device name: SplQueryDevice() returned %u\n", rc); 73 return ( rc ); 112 113 devinfo.pszPrinterName = szDeviceName; 114 devinfo.pszUserName = NULL; 115 devinfo.pszLogAddr = pszPortName; 116 devinfo.pszComment = pszTitle; 117 devinfo.pszDrivers = pszModel; 118 devinfo.usTimeOut = 45; 119 rc = SplCreateDevice( NULL, 3, &devinfo, sizeof( devinfo )); 120 if ( rc != NO_ERROR ) { 121 printf("Failed to create device: SplCreateDevice() returned %u\n", rc); 122 return rc; 74 123 } 75 124 … … 86 135 printf("Failed to create printer: SplCreateQueue() returned %u", rc); 87 136 SplDeleteDevice( NULL, szDeviceName ); 88 return ( rc );137 return rc; 89 138 } 90 139
Note:
See TracChangeset
for help on using the changeset viewer.