genesys: Use proper containers for device lists

merge-requests/76/head
Povilas Kanapickas 2019-05-25 11:15:37 +03:00
rodzic 5a90b7bb8f
commit 9c2fdeeb3d
2 zmienionych plików z 57 dodań i 128 usunięć

Wyświetl plik

@ -70,11 +70,12 @@
#include <vector> #include <vector>
static SANE_Int num_devices = 0; static SANE_Int num_devices = 0;
static Genesys_Device *first_dev = 0;
StaticInit<std::list<Genesys_Scanner>> s_scanners; StaticInit<std::list<Genesys_Scanner>> s_scanners;
StaticInit<std::vector<SANE_Device>> s_sane_devices;
StaticInit<std::vector<SANE_Device*>> s_sane_devices_ptrs;
StaticInit<std::list<Genesys_Device>> s_devices;
static SANE_Device **devlist = 0;
/* Array of newly attached devices */ /* Array of newly attached devices */
static Genesys_Device **new_dev = 0; static Genesys_Device **new_dev = 0;
/* Length of new_dev array */ /* Length of new_dev array */
@ -5037,7 +5038,6 @@ static char *calibration_filename(Genesys_Device *currdev)
char *tmpstr; char *tmpstr;
char *ptr; char *ptr;
char filename[80]; char filename[80];
Genesys_Device *dev;
unsigned int count; unsigned int count;
unsigned int i; unsigned int i;
@ -5079,11 +5079,9 @@ static char *calibration_filename(Genesys_Device *currdev)
/* count models of the same names if several scanners attached */ /* count models of the same names if several scanners attached */
if(num_devices>1) if(num_devices>1)
{ {
for (dev = first_dev; dev; dev = dev->next) for (const auto& dev : *s_devices) {
{ if (dev.model->model_id == currdev->model->model_id) {
if (dev->model->model_id == currdev->model->model_id) count++;
{
count++;
} }
} }
} }
@ -5762,17 +5760,6 @@ check_present (SANE_String_Const devname) noexcept
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
} }
/** @brief add a scanner device
* Insert the given device into the backend list of devices.
* @param dev device to add
*/
static void add_device(Genesys_Device *dev)
{
++num_devices;
dev->next = first_dev;
first_dev = dev;
}
static SANE_Status static SANE_Status
attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait) attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
{ {
@ -5793,12 +5780,10 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
for (dev = first_dev; dev; dev = dev->next) for (auto& dev : *s_devices) {
{ if (strcmp(dev.file_name, devname) == 0) {
if (strcmp (dev->file_name, devname) == 0)
{
if (devp) if (devp)
*devp = dev; *devp = &dev;
DBG(DBG_info, "%s: device `%s' was already in device list\n", __func__, devname); DBG(DBG_info, "%s: device `%s' was already in device list\n", __func__, devname);
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
} }
@ -5838,30 +5823,33 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
} }
} }
bool found_dev = false;
for (i = 0; i < MAX_SCANNERS && genesys_usb_device_list[i].model != 0; i++) for (i = 0; i < MAX_SCANNERS && genesys_usb_device_list[i].model != 0; i++)
{ {
if (vendor == genesys_usb_device_list[i].vendor && if (vendor == genesys_usb_device_list[i].vendor &&
product == genesys_usb_device_list[i].product) product == genesys_usb_device_list[i].product)
{ {
dev = new Genesys_Device; found_dev = true;
break; break;
} }
} }
if (!dev) if (!found_dev) {
{
DBG(DBG_error, "%s: vendor 0x%xd product 0x%xd is not supported by this backend\n", __func__, DBG(DBG_error, "%s: vendor 0x%xd product 0x%xd is not supported by this backend\n", __func__,
vendor, product); vendor, product);
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
dev->file_name = strdup (devname); char* new_devname = strdup (devname);
if (!dev->file_name) if (!new_devname) {
{ return SANE_STATUS_NO_MEM;
delete dev;
return SANE_STATUS_NO_MEM;
} }
++num_devices; // TODO: use s_devices.size()
s_devices->push_back(Genesys_Device());
dev = &s_devices->back();
dev->file_name = new_devname;
dev->model = genesys_usb_device_list[i].model; dev->model = genesys_usb_device_list[i].model;
dev->vendorId = genesys_usb_device_list[i].vendor; dev->vendorId = genesys_usb_device_list[i].vendor;
dev->productId = genesys_usb_device_list[i].product; dev->productId = genesys_usb_device_list[i].product;
@ -5870,7 +5858,6 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
DBG(DBG_info, "%s: found %s flatbed scanner %s at %s\n", __func__, dev->model->vendor, DBG(DBG_info, "%s: found %s flatbed scanner %s at %s\n", __func__, dev->model->vendor,
dev->model->model, dev->file_name); dev->model->model, dev->file_name);
add_device(dev);
if (devp) if (devp)
*devp = dev; *devp = dev;
@ -6283,6 +6270,9 @@ sane_init_impl(SANE_Int * version_code, SANE_Auth_Callback authorize)
sanei_magic_init(); sanei_magic_init();
s_scanners.init(); s_scanners.init();
s_devices.init();
s_sane_devices.init();
s_sane_devices_ptrs.init();
genesys_init_sensor_tables(); genesys_init_sensor_tables();
DBG(DBG_info, "%s: %s endian machine\n", __func__, DBG(DBG_info, "%s: %s endian machine\n", __func__,
@ -6295,8 +6285,6 @@ sane_init_impl(SANE_Int * version_code, SANE_Auth_Callback authorize)
/* set up to no devices at first */ /* set up to no devices at first */
num_devices = 0; num_devices = 0;
first_dev = 0;
devlist = 0;
/* cold-plug case :detection of allready connected scanners */ /* cold-plug case :detection of allready connected scanners */
status = probe_genesys_devices (); status = probe_genesys_devices ();
@ -6318,18 +6306,7 @@ extern "C" SANE_Status sane_init(SANE_Int * version_code, SANE_Auth_Callback aut
void void
sane_exit_impl(void) sane_exit_impl(void)
{ {
Genesys_Device *dev, *next;
DBGSTART; DBGSTART;
for (dev = first_dev; dev; dev = next)
{
next = dev->next;
delete dev;
}
first_dev = 0;
if (devlist)
free (devlist);
devlist = 0;
sanei_usb_exit(); sanei_usb_exit();
@ -6346,10 +6323,6 @@ void sane_exit()
SANE_Status SANE_Status
sane_get_devices_impl(const SANE_Device *** device_list, SANE_Bool local_only) sane_get_devices_impl(const SANE_Device *** device_list, SANE_Bool local_only)
{ {
Genesys_Device *dev, *prev;
SANE_Int index;
SANE_Device *sane_device;
DBG(DBG_proc, "%s: start: local_only = %s\n", __func__, DBG(DBG_proc, "%s: start: local_only = %s\n", __func__,
local_only == SANE_TRUE ? "true" : "false"); local_only == SANE_TRUE ? "true" : "false");
@ -6357,75 +6330,31 @@ sane_get_devices_impl(const SANE_Device *** device_list, SANE_Bool local_only)
sanei_usb_scan_devices (); sanei_usb_scan_devices ();
probe_genesys_devices (); probe_genesys_devices ();
if (devlist) s_sane_devices->clear();
free (devlist); s_sane_devices_ptrs->clear();
s_sane_devices->reserve(num_devices);
s_sane_devices_ptrs->reserve(num_devices + 1);
devlist = (SANE_Device**) malloc((num_devices + 1) * sizeof (devlist[0])); for (auto dev_it = s_devices->begin(); dev_it != s_devices->end();) {
if (!devlist) present = SANE_FALSE;
return SANE_STATUS_NO_MEM; sanei_usb_find_devices(dev_it->vendorId, dev_it->productId, check_present);
if (present) {
prev = NULL; s_sane_devices->emplace_back();
index = 0; auto& sane_device = s_sane_devices->back();
dev = first_dev; sane_device.name = dev_it->file_name;
while (dev != NULL) sane_device.vendor = dev_it->model->vendor;
{ sane_device.model = dev_it->model->model;
/* check if device removed */ sane_device.type = "flatbed scanner";
present = SANE_FALSE; s_sane_devices_ptrs->push_back(&sane_device);
sanei_usb_find_devices (dev->vendorId, dev->productId, check_present); dev_it++;
if (present) } else {
{ dev_it = s_devices->erase(dev_it);
sane_device = (SANE_Device*) malloc(sizeof (*sane_device)); num_devices -= 1;
if (!sane_device) }
return SANE_STATUS_NO_MEM;
sane_device->name = dev->file_name;
sane_device->vendor = dev->model->vendor;
sane_device->model = dev->model->model;
sane_device->type = strdup ("flatbed scanner");
devlist[index] = sane_device;
index++;
prev = dev;
dev = dev->next;
}
else
{
/* remove device from internal list */
/* case 1 : removed device is first_dev */
if (prev == NULL)
{
/* test for another dev */
if (dev->next == NULL)
{
/* empty the whole list */
delete dev;
first_dev = NULL;
num_devices = 0;
dev = NULL;
}
else
{
/* assign new start */
first_dev = dev->next;
num_devices--;
delete dev;
dev = first_dev;
}
}
/* case 2 : removed device is not first_dev */
else
{
/* link previous dev to next dev */
prev->next = dev->next;
delete dev;
num_devices--;
/* next loop */
dev = prev->next;
}
}
} }
devlist[index] = 0; s_sane_devices_ptrs->push_back(nullptr);
*((SANE_Device ***)device_list) = devlist; *((SANE_Device ***)device_list) = s_sane_devices_ptrs->data();
DBGCOMPLETED; DBGCOMPLETED;
@ -6455,9 +6384,12 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
if (devicename[0] && strcmp ("genesys", devicename) != 0) if (devicename[0] && strcmp ("genesys", devicename) != 0)
{ {
/* search for the given devicename in the device list */ /* search for the given devicename in the device list */
for (dev = first_dev; dev; dev = dev->next) for (auto& d : *s_devices) {
if (strcmp (dev->file_name, devicename) == 0) if (strcmp(d.file_name, devicename) == 0) {
break; dev = &d;
break;
}
}
if (!dev) if (!dev)
{ {
@ -6469,12 +6401,11 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
} }
else else
{ {
/* empty devicename or "genesys" -> use first device */ // empty devicename or "genesys" -> use first device
dev = first_dev; if (!s_devices->empty()) {
if (dev) dev = &s_devices->front();
{ devicename = dev->file_name;
devicename = dev->file_name; DBG(DBG_info, "%s: empty devicename, trying `%s'\n", __func__, devicename);
DBG(DBG_info, "%s: empty devicename, trying `%s'\n", __func__, devicename);
} }
} }

Wyświetl plik

@ -971,8 +971,6 @@ struct Genesys_Device
std::list<Genesys_Calibration_Cache> calibration_cache; std::list<Genesys_Calibration_Cache> calibration_cache;
Genesys_Device* next = nullptr;
// used red line-distance shift // used red line-distance shift
SANE_Int ld_shift_r = 0; SANE_Int ld_shift_r = 0;
// used green line-distance shift // used green line-distance shift