Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generate a device ID if expected fields are missing #234

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
91 changes: 73 additions & 18 deletions pappl/device-usb.c
Expand Up @@ -362,12 +362,12 @@ pappl_usb_find(
if (device->handle)
{
// Build the device URI...
const char *make, // Pointer to make
*model, // Pointer to model
*serial = NULL; // Pointer to serial number
char *ptr, // Pointer into device ID
copy_did[1024], // Copy of device ID
temp[256]; // Temporary string for serial #
char *make, // Pointer to make
*model, // Pointer to model
*serial; // Pointer to serial number
char tmp[256], // Temporary string for serial #
copy_did[1024]; // Copy of device ID
char *ptr = copy_did; // Pointer into device ID

papplCopyString(copy_did, device_id, sizeof(copy_did));

Expand All @@ -388,36 +388,91 @@ pappl_usb_find(
else if ((serial = strstr(copy_did, "SN:")) != NULL)
serial += 3;

if (serial)
// Likely an empty or malformed device ID
if (!make && !model)
{
if ((ptr = strchr(serial, ';')) != NULL)
*ptr = '\0';
}
else
{
int length = libusb_get_string_descriptor_ascii(device->handle, devdesc.iSerialNumber, (unsigned char *)temp, sizeof(temp) - 1);
int length;

if (serial)
{
// Copy serial number if it's in the device ID
if ((ptr = strchr(serial, ';')) != NULL)
*ptr = '\0';
papplCopyString(tmp, serial, sizeof(tmp));
}

papplCopyString(ptr, "MFG:Unknown;", sizeof(copy_did)/* - (ptr - copy_did)*/);
make = ptr + 4;

length = libusb_get_string_descriptor_ascii(device->handle, devdesc.iManufacturer, (unsigned char *)make, sizeof(copy_did) - (make - copy_did));
if (length > 0)
{
temp[length] = '\0';
serial = temp;
ptr = make + length;
*ptr ++ = ';';
}
else
ptr = make + 8;

papplCopyString(ptr, "MDL:Unknown;", sizeof(copy_did) - (ptr - copy_did));
model = ptr + 4;

length = libusb_get_string_descriptor_ascii(device->handle, devdesc.iProduct, (unsigned char *)model, sizeof(copy_did) - (model - copy_did));
if (length > 0)
{
ptr = model + length;
*ptr ++ = ';';
}
else
ptr = model + 8;

papplCopyString(ptr, "SN:;", sizeof(copy_did) - (ptr - copy_did));

if (serial)
{
serial = ptr + 3;
length = papplCopyString(serial, tmp, sizeof(copy_did) - (serial - copy_did));
serial[length] = ';';
serial[length + 1] = '\0';
}
else
{
serial = ptr + 3;
length = libusb_get_string_descriptor_ascii(device->handle, devdesc.iSerialNumber, (unsigned char *)serial, sizeof(copy_did) - (serial - copy_did));
if (length > 0)
{
serial[length] = ';';
serial[length + 1] = '\0';
}
else
serial = NULL;
}

papplCopyString(device_id, copy_did, sizeof(device_id));
}

if (make)
{
if ((ptr = strchr(make, ';')) != NULL)
*ptr = '\0';
}
else
make = "Unknown";

if (model)
{
if ((ptr = strchr(model, ';')) != NULL)
*ptr = '\0';
}

if (serial)
{
if ((ptr = strchr(serial, ';')) != NULL)
*ptr = '\0';
}
else
model = "Unknown";
{
int length = libusb_get_string_descriptor_ascii(device->handle, devdesc.iSerialNumber, (unsigned char *)tmp, sizeof(tmp));
if (length > 0)
serial = tmp;
}

if (serial)
httpAssembleURIf(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri), "usb", NULL, make, 0, "/%s?serial=%s", model, serial);
Expand Down