genesys: Remove manual allocations in device class

merge-requests/112/head
Povilas Kanapickas 2019-08-02 22:38:53 +03:00
rodzic 5bd9ab4941
commit 6b2919db9a
4 zmienionych plików z 30 dodań i 27 usunięć

Wyświetl plik

@ -66,14 +66,22 @@
#include "../include/sane/sanei_magic.h"
#include "genesys_devices.cc"
#include <cstdio>
#include <cstring>
#include <fstream>
#include <list>
#include <exception>
#include <vector>
// Data that we allocate to back SANE_Device objects in s_sane_devices
struct SANE_Device_Data
{
std::string name;
};
StaticInit<std::list<Genesys_Scanner>> s_scanners;
StaticInit<std::vector<SANE_Device>> s_sane_devices;
StaticInit<std::vector<SANE_Device_Data>> s_sane_devices_data;
StaticInit<std::vector<SANE_Device*>> s_sane_devices_ptrs;
StaticInit<std::list<Genesys_Device>> s_devices;
@ -4402,7 +4410,7 @@ static char *calibration_filename(Genesys_Device *currdev)
}
if(count>1)
{
snprintf(filename,sizeof(filename),"%s.cal",currdev->file_name);
std::snprintf(filename, sizeof(filename), "%s.cal", currdev->file_name.c_str());
for(i=0;i<strlen(filename);i++)
{
if(filename[i]==':'||filename[i]==PATH_SEP)
@ -5068,12 +5076,12 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
}
for (auto& dev : *s_devices) {
if (strcmp(dev.file_name, devname) == 0) {
if (devp)
if (dev.file_name == devname) {
if (devp)
*devp = &dev;
DBG(DBG_info, "%s: device `%s' was already in device list\n", __func__, devname);
return SANE_STATUS_GOOD;
}
DBG(DBG_info, "%s: device `%s' was already in device list\n", __func__, devname);
return SANE_STATUS_GOOD;
}
}
DBG(DBG_info, "%s: trying to open device `%s'\n", __func__, devname);
@ -5114,14 +5122,9 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
return SANE_STATUS_INVAL;
}
char* new_devname = strdup (devname);
if (!new_devname) {
return SANE_STATUS_NO_MEM;
}
s_devices->emplace_back();
dev = &s_devices->back();
dev->file_name = new_devname;
dev->file_name = devname;
dev->model = &found_usb_dev->model;
dev->vendorId = found_usb_dev->vendor;
@ -5129,8 +5132,8 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
dev->usb_mode = 0; /* i.e. unset */
dev->already_initialized = SANE_FALSE;
DBG(DBG_info, "%s: found %s flatbed scanner %s at %s\n", __func__, dev->model->vendor,
dev->model->model, dev->file_name);
DBG(DBG_info, "%s: found %s flatbed scanner %s at %s\n", __func__, dev->model->vendor,
dev->model->model, dev->file_name.c_str());
if (devp) {
*devp = dev;
@ -5412,6 +5415,7 @@ sane_init_impl(SANE_Int * version_code, SANE_Auth_Callback authorize)
s_scanners.init();
s_devices.init();
s_sane_devices.init();
s_sane_devices_data.init();
s_sane_devices_ptrs.init();
genesys_init_sensor_tables();
genesys_init_frontend_tables();
@ -5464,8 +5468,10 @@ sane_get_devices_impl(const SANE_Device *** device_list, SANE_Bool local_only)
probe_genesys_devices ();
s_sane_devices->clear();
s_sane_devices_data->clear();
s_sane_devices_ptrs->clear();
s_sane_devices->reserve(s_devices->size());
s_sane_devices_data->reserve(s_devices->size());
s_sane_devices_ptrs->reserve(s_devices->size() + 1);
for (auto dev_it = s_devices->begin(); dev_it != s_devices->end();) {
@ -5473,8 +5479,11 @@ sane_get_devices_impl(const SANE_Device *** device_list, SANE_Bool local_only)
sanei_usb_find_devices(dev_it->vendorId, dev_it->productId, check_present);
if (present) {
s_sane_devices->emplace_back();
s_sane_devices_data->emplace_back();
auto& sane_device = s_sane_devices->back();
sane_device.name = dev_it->file_name;
auto& sane_device_data = s_sane_devices_data->back();
sane_device_data.name = dev_it->file_name;
sane_device.name = sane_device_data.name.c_str();
sane_device.vendor = dev_it->model->vendor;
sane_device.model = dev_it->model->model;
sane_device.type = "flatbed scanner";
@ -5513,7 +5522,7 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
{
/* search for the given devicename in the device list */
for (auto& d : *s_devices) {
if (strcmp(d.file_name, devicename) == 0) {
if (d.file_name == devicename) {
dev = &d;
break;
}
@ -5536,9 +5545,8 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
// empty devicename or "genesys" -> use first device
if (!s_devices->empty()) {
dev = &s_devices->front();
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__, dev->file_name.c_str());
}
}
if (!dev)
@ -5554,8 +5562,8 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
DBG(DBG_error0, " scanner and what does (not) work.\n");
}
dbg.vstatus("open device '%s'", dev->file_name);
dev->usb_dev.open(dev->file_name);
dbg.vstatus("open device '%s'", dev->file_name.c_str());
dev->usb_dev.open(dev->file_name.c_str());
dbg.clear();

Wyświetl plik

@ -50,9 +50,6 @@
Genesys_Device::~Genesys_Device()
{
clear();
if (file_name != nullptr)
free(file_name);
}
void Genesys_Device::clear()

Wyświetl plik

@ -214,7 +214,7 @@ struct Genesys_Device
// 2: USB 2.0
SANE_Int usb_mode = 0;
SANE_String file_name = nullptr;
std::string file_name;
std::string calib_file;
// if enabled, no calibration data will be loaded or saved to files

Wyświetl plik

@ -101,8 +101,6 @@
#include <string>
#include <vector>
#define FREE_IFNOT_NULL(x) if(x!=NULL) { free(x); x=NULL;}
#define GENESYS_RED 0
#define GENESYS_GREEN 1
#define GENESYS_BLUE 2