diff options
author | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2008-05-16 23:29:51 +0000 |
---|---|---|
committer | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2008-05-16 23:29:51 +0000 |
commit | 5eb9da713fb99d4a865bbc65169eb1acf9ff08e2 (patch) | |
tree | e20eb1b5de0e23769d18969403d607ffcc2acf65 /backend/ieee1284.c | |
parent | 01ce6322ca3809ac0260c8ef28abbc8255f6e34f (diff) |
Import CUPS 1.4svn-r7585.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@771 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'backend/ieee1284.c')
-rw-r--r-- | backend/ieee1284.c | 441 |
1 files changed, 132 insertions, 309 deletions
diff --git a/backend/ieee1284.c b/backend/ieee1284.c index 463471df5..8b8579d80 100644 --- a/backend/ieee1284.c +++ b/backend/ieee1284.c @@ -68,12 +68,6 @@ backendGetDeviceID( return (-1); #else /* Get the device ID from the specified file descriptor... */ - char *attr, /* 1284 attribute */ - *delim, /* 1284 delimiter */ - *uriptr, /* Pointer into URI */ - manufacturer[256], /* Manufacturer string */ - serial_number[1024]; /* Serial number string */ - int manulen; /* Length of manufacturer string */ # ifdef __linux int length; /* Length of device ID info */ int got_id = 0; @@ -111,82 +105,82 @@ backendGetDeviceID( *device_id = '\0'; # ifdef __linux - if (ioctl(fd, LPIOC_GET_DEVICE_ID(device_id_size), device_id)) - { - /* - * Linux has to implement things differently for every device it seems. - * Since the standard parallel port driver does not provide a simple - * ioctl() to get the 1284 device ID, we have to open the "raw" parallel - * device corresponding to this port and do some negotiation trickery - * to get the current device ID. - */ - - if (uri && !strncmp(uri, "parallel:/dev/", 14)) + if (ioctl(fd, LPIOC_GET_DEVICE_ID(device_id_size), device_id)) { - char devparport[16]; /* /dev/parportN */ - int devparportfd, /* File descriptor for raw device */ - mode; /* Port mode */ - - /* - * Since the Linux parallel backend only supports 4 parallel port - * devices, just grab the trailing digit and use it to construct a - * /dev/parportN filename... + * Linux has to implement things differently for every device it seems. + * Since the standard parallel port driver does not provide a simple + * ioctl() to get the 1284 device ID, we have to open the "raw" parallel + * device corresponding to this port and do some negotiation trickery + * to get the current device ID. */ - snprintf(devparport, sizeof(devparport), "/dev/parport%s", - uri + strlen(uri) - 1); - - if ((devparportfd = open(devparport, O_RDWR | O_NOCTTY)) != -1) + if (uri && !strncmp(uri, "parallel:/dev/", 14)) { + char devparport[16]; /* /dev/parportN */ + int devparportfd, /* File descriptor for raw device */ + mode; /* Port mode */ + + /* - * Claim the device... - */ + * Since the Linux parallel backend only supports 4 parallel port + * devices, just grab the trailing digit and use it to construct a + * /dev/parportN filename... + */ - if (!ioctl(devparportfd, PPCLAIM)) - { - fcntl(devparportfd, F_SETFL, fcntl(devparportfd, F_GETFL) | O_NONBLOCK); + snprintf(devparport, sizeof(devparport), "/dev/parport%s", + uri + strlen(uri) - 1); - mode = IEEE1284_MODE_COMPAT; + if ((devparportfd = open(devparport, O_RDWR | O_NOCTTY)) != -1) + { + /* + * Claim the device... + */ - if (!ioctl(devparportfd, PPNEGOT, &mode)) + if (!ioctl(devparportfd, PPCLAIM)) { - /* - * Put the device into Device ID mode... - */ + fcntl(devparportfd, F_SETFL, fcntl(devparportfd, F_GETFL) | O_NONBLOCK); - mode = IEEE1284_MODE_NIBBLE | IEEE1284_DEVICEID; + mode = IEEE1284_MODE_COMPAT; if (!ioctl(devparportfd, PPNEGOT, &mode)) { /* - * Read the 1284 device ID... + * Put the device into Device ID mode... */ - if ((length = read(devparportfd, device_id, - device_id_size - 1)) >= 2) - { - device_id[length] = '\0'; - got_id = 1; + mode = IEEE1284_MODE_NIBBLE | IEEE1284_DEVICEID; + + if (!ioctl(devparportfd, PPNEGOT, &mode)) + { + /* + * Read the 1284 device ID... + */ + + if ((length = read(devparportfd, device_id, + device_id_size - 1)) >= 2) + { + device_id[length] = '\0'; + got_id = 1; + } } } - } - /* - * Release the device... - */ + /* + * Release the device... + */ - ioctl(devparportfd, PPRELEASE); - } + ioctl(devparportfd, PPRELEASE); + } - close(devparportfd); + close(devparportfd); + } } } - } - else - got_id = 1; + else + got_id = 1; - if (got_id) + if (got_id) { /* * Extract the length of the device ID string from the first two @@ -268,108 +262,57 @@ backendGetDeviceID( if (scheme && uri && uri_size > 32) { - /* - * Look for the serial number field... - */ + int num_values; /* Number of keys and values */ + cups_option_t *values; /* Keys and values in device ID */ + const char *mfg, /* Manufacturer */ + *mdl, /* Model */ + *sern; /* Serial number */ + char temp[256], /* Temporary manufacturer string */ + *tempptr; /* Pointer into temp string */ - if ((attr = strstr(device_id, "SERN:")) != NULL) - attr += 5; - else if ((attr = strstr(device_id, "SERIALNUMBER:")) != NULL) - attr += 13; - else if ((attr = strstr(device_id, ";SN:")) != NULL) - attr += 4; - - if (attr) - { - strlcpy(serial_number, attr, sizeof(serial_number)); - - if ((delim = strchr(serial_number, ';')) != NULL) - *delim = '\0'; - } - else - serial_number[0] = '\0'; /* - * Generate the device URI from the manufacturer, make_model, and - * serial number strings. + * Get the make, model, and serial numbers... */ - snprintf(uri, uri_size, "%s://", scheme); + num_values = _ppdGet1284Values(device_id, &values); - if ((attr = strstr(device_id, "MANUFACTURER:")) != NULL) - attr += 13; - else if ((attr = strstr(device_id, "Manufacturer:")) != NULL) - attr += 13; - else if ((attr = strstr(device_id, "MFG:")) != NULL) - attr += 4; + if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL) + if ((sern = cupsGetOption("SERN", num_values, values)) == NULL) + sern = cupsGetOption("SN", num_values, values); - if (attr) - { - strlcpy(manufacturer, attr, sizeof(manufacturer)); + if ((mfg = cupsGetOption("MANUFACTURER", num_values, values)) == NULL) + mfg = cupsGetOption("MFG", num_values, values); - if ((delim = strchr(manufacturer, ';')) != NULL) - *delim = '\0'; + if ((mdl = cupsGetOption("MODEL", num_values, values)) == NULL) + mdl = cupsGetOption("MDL", num_values, values); - if (!strcasecmp(manufacturer, "Hewlett-Packard")) - strcpy(manufacturer, "HP"); - else if (!strcasecmp(manufacturer, "Lexmark International")) - strcpy(manufacturer, "Lexmark"); + if (mfg) + { + if (!strcasecmp(mfg, "Hewlett-Packard")) + mfg = "HP"; + else if (!strcasecmp(mfg, "Lexmark International")) + mfg = "Lexmark"; } else { - strlcpy(manufacturer, make_model, sizeof(manufacturer)); - - if ((delim = strchr(manufacturer, ' ')) != NULL) - *delim = '\0'; - } - - manulen = strlen(manufacturer); - - for (uriptr = uri + strlen(uri), delim = manufacturer; - *delim && uriptr < (uri + uri_size - 3); - delim ++) - if (*delim == ' ') - { - *uriptr++ = '%'; - *uriptr++ = '2'; - *uriptr++ = '0'; - } - else - *uriptr++ = *delim; - - *uriptr++ = '/'; + strlcpy(temp, make_model, sizeof(temp)); - if (!strncasecmp(make_model, manufacturer, manulen)) - { - delim = make_model + manulen; + if ((tempptr = strchr(temp, ' ')) != NULL) + *tempptr = '\0'; - while (isspace(*delim & 255)) - delim ++; + mfg = temp; } - else - delim = make_model; - for (; *delim && uriptr < (uri + uri_size - 3); delim ++) - if (*delim == ' ') - { - *uriptr++ = '%'; - *uriptr++ = '2'; - *uriptr++ = '0'; - } - else - *uriptr++ = *delim; + /* + * Generate the device URI from the manufacturer, make_model, and + * serial number strings. + */ - if (serial_number[0]) - { - /* - * Add the serial number to the URI... - */ + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, uri_size, scheme, NULL, mfg, 0, + "/%s%s%s", mdl, sern ? "?serial=" : "", sern ? sern : ""); - strlcpy(uriptr, "?serial=", uri_size - (uriptr - uri)); - strlcat(uriptr, serial_number, uri_size - (uriptr - uri)); - } - else - *uriptr = '\0'; + cupsFreeOptions(num_values, values); } return (0); @@ -387,10 +330,11 @@ backendGetMakeModel( char *make_model, /* O - Make/model */ int make_model_size) /* I - Size of buffer */ { - char *attr, /* 1284 attribute */ - *delim, /* 1284 delimiter */ - *mfg, /* Manufacturer string */ - *mdl; /* Model string */ + int num_values; /* Number of keys and values */ + cups_option_t *values; /* Keys and values */ + const char *mfg, /* Manufacturer string */ + *mdl, /* Model string */ + *des; /* Description string */ DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", " @@ -413,63 +357,10 @@ backendGetMakeModel( * Look for the description field... */ - if ((attr = strstr(device_id, "DES:")) != NULL) - attr += 4; - else if ((attr = strstr(device_id, "DESCRIPTION:")) != NULL) - attr += 12; + num_values = _ppdGet1284Values(device_id, &values); - if (attr) - { - /* - * Make sure the description contains something useful, since some - * printer manufacturers (HP) apparently don't follow the standards - * they helped to define... - * - * Here we require the description to be 8 or more characters in length, - * containing at least one space and one letter. - */ - - if ((delim = strchr(attr, ';')) == NULL) - delim = attr + strlen(attr); - - if ((delim - attr) < 8) - attr = NULL; - else - { - char *ptr; /* Pointer into description */ - int letters, /* Number of letters seen */ - spaces; /* Number of spaces seen */ - - - for (ptr = attr, letters = 0, spaces = 0; ptr < delim; ptr ++) - { - if (isspace(*ptr & 255)) - spaces ++; - else if (isalpha(*ptr & 255)) - letters ++; - - if (spaces && letters) - break; - } - - if (!spaces || !letters) - attr = NULL; - } - } - - if ((mfg = strstr(device_id, "MANUFACTURER:")) != NULL) - mfg += 13; - else if ((mfg = strstr(device_id, "Manufacturer:")) != NULL) - mfg += 13; - else if ((mfg = strstr(device_id, "MFG:")) != NULL) - mfg += 4; - - if ((mdl = strstr(device_id, "MODEL:")) != NULL) - mdl += 6; - else if ((mdl = strstr(device_id, "Model:")) != NULL) - mdl += 6; - else if ((mdl = strstr(device_id, "MDL:")) != NULL) - mdl += 4; + if ((mdl = cupsGetOption("MODEL", num_values, values)) == NULL) + mdl = cupsGetOption("MDL", num_values, values); if (mdl) { @@ -477,106 +368,65 @@ backendGetMakeModel( * Build a make-model string from the manufacturer and model attributes... */ - if (mfg) - { - /* - * Skip leading whitespace... - */ - - while (isspace(*mfg & 255)) - mfg ++; + if ((mfg = cupsGetOption("MANUFACTURER", num_values, values)) == NULL) + mfg = cupsGetOption("MFG", num_values, values); + if (!mfg || !strncasecmp(mdl, mfg, strlen(mfg))) + { /* - * Map common bad names to the ones we use for driver selection... + * Just copy the model string, since it has the manufacturer... */ - if (!strncasecmp(mfg, "Hewlett-Packard", 15)) - strlcpy(make_model, "HP", make_model_size); - else if (!strncasecmp(mfg, "Lexmark International", 21)) - strlcpy(make_model, "Lexmark", make_model_size); - else - { - /* - * Use the manufacturer that is supplied... - */ - - strlcpy(make_model, mfg, make_model_size); - - if ((delim = strchr(make_model, ';')) != NULL) - *delim = '\0'; - - /* - * But strip trailing whitespace... - */ - - for (delim = make_model + strlen(make_model) - 1; - delim > make_model && *delim == ' '; - delim --) - *delim = '\0'; - } - - if (!strncasecmp(make_model, mdl, strlen(make_model))) - { - /* - * Just copy model string, since it has the manufacturer... - */ - - strlcpy(make_model, mdl, make_model_size); - } - else - { - /* - * Concatenate the make and model... - */ - - while (isspace(*mdl & 255)) - mdl ++; - - strlcat(make_model, " ", make_model_size); - strlcat(make_model, mdl, make_model_size); - } + _ppdNormalizeMakeAndModel(mdl, make_model, make_model_size); } else { /* - * Just copy model string, since it has the manufacturer... + * Concatenate the make and model... */ - while (isspace(*mdl & 255)) - mdl ++; + char temp[1024]; /* Temporary make and model */ - strlcpy(make_model, mdl, make_model_size); + snprintf(temp, sizeof(temp), "%s %s", mfg, mdl); + _ppdNormalizeMakeAndModel(temp, make_model, make_model_size); } } - else if (attr) + else if ((des = cupsGetOption("DESCRIPTION", num_values, values)) != NULL || + (des = cupsGetOption("DES", num_values, values)) != NULL) { /* - * Use description... + * Make sure the description contains something useful, since some + * printer manufacturers (HP) apparently don't follow the standards + * they helped to define... + * + * Here we require the description to be 8 or more characters in length, + * containing at least one space and one letter. */ - while (isspace(*attr & 255)) - attr ++; - - if (!strncasecmp(attr, "Hewlett-Packard hp ", 19)) + if (strlen(des) >= 8) { - /* - * Check for a common HP bug... - */ + const char *ptr; /* Pointer into description */ + int letters, /* Number of letters seen */ + spaces; /* Number of spaces seen */ - strlcpy(make_model, "HP ", make_model_size); - strlcpy(make_model + 3, attr + 19, make_model_size - 3); - } - else if (!strncasecmp(attr, "Hewlett-Packard ", 16)) - { - strlcpy(make_model, "HP ", make_model_size); - strlcpy(make_model + 3, attr + 16, make_model_size - 3); - } - else - { - strlcpy(make_model, attr, make_model_size); + + for (ptr = des, letters = 0, spaces = 0; *ptr; ptr ++) + { + if (isspace(*ptr & 255)) + spaces ++; + else if (isalpha(*ptr & 255)) + letters ++; + + if (spaces && letters) + break; + } + + if (spaces && letters) + _ppdNormalizeMakeAndModel(des, make_model, make_model_size); } } - else + + if (!make_model[0]) { /* * Use "Unknown" as the printer make and model... @@ -585,36 +435,9 @@ backendGetMakeModel( strlcpy(make_model, "Unknown", make_model_size); } - /* - * Strip trailing data... - */ - - if ((delim = strchr(make_model, ';')) != NULL) - *delim = '\0'; + cupsFreeOptions(num_values, values); - for (delim = make_model + strlen(make_model) - 1; - delim > make_model && *delim == ' '; - delim --) - *delim = '\0'; - - /* - * Strip trailing whitespace... - */ - - for (delim = make_model + strlen(make_model) - 1; delim >= make_model; delim --) - if (isspace(*delim & 255)) - *delim = '\0'; - else - break; - - /* - * Return... - */ - - if (make_model[0]) - return (0); - else - return (-1); + return (0); } |