Ignore:
Timestamp:
Apr 6, 2013, 10:16:41 PM (12 years ago)
Author:
Alex Taylor
Message:

Improved logic for generating unique device name.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gui/util/prntobj/prntobj.c

    r25 r26  
    1919
    2020
     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 * ------------------------------------------------------------------------- */
     34ULONG 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 * ------------------------------------------------------------------------- */
    2178int main( int argc, char *argv[] )
    2279{
     
    49106    // Generate a suitable internal device name
    50107    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;
    57111    }
    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;
    74123    }
    75124
     
    86135        printf("Failed to create printer: SplCreateQueue() returned %u", rc);
    87136        SplDeleteDevice( NULL, szDeviceName );
    88         return ( rc );
     137        return rc;
    89138    }
    90139
Note: See TracChangeset for help on using the changeset viewer.