kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch 'genesys-remove-manual-alloc' into 'master'
genesys: Remove manual allocations See merge request sane-project/backends!112merge-requests/114/head
commit
a3e492d6d5
|
@ -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;
|
||||
|
||||
|
@ -4349,21 +4357,16 @@ SANE_Range *range=NULL;
|
|||
* @param currdev current scanner device
|
||||
* @return an allocated string containing a file name
|
||||
*/
|
||||
static char *calibration_filename(Genesys_Device *currdev)
|
||||
static std::string calibration_filename(Genesys_Device *currdev)
|
||||
{
|
||||
char *tmpstr;
|
||||
std::string ret;
|
||||
ret.resize(PATH_MAX);
|
||||
|
||||
char *ptr;
|
||||
char filename[80];
|
||||
unsigned int count;
|
||||
unsigned int i;
|
||||
|
||||
/* allocate space for result */
|
||||
tmpstr = (char*) malloc(PATH_MAX);
|
||||
if(tmpstr==NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* first compute the DIR where we can store cache:
|
||||
* 1 - home dir
|
||||
* 2 - $TMPDIR
|
||||
|
@ -4402,7 +4405,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)
|
||||
|
@ -4417,23 +4420,29 @@ static char *calibration_filename(Genesys_Device *currdev)
|
|||
}
|
||||
|
||||
/* build final final name : store dir + filename */
|
||||
if (NULL == ptr)
|
||||
{
|
||||
snprintf (tmpstr, PATH_MAX, "%s", filename);
|
||||
if (ptr == nullptr) {
|
||||
int size = std::snprintf(&ret.front(), ret.size(), "%s", filename);
|
||||
ret.resize(size);
|
||||
}
|
||||
else
|
||||
{
|
||||
int size = 0;
|
||||
#ifdef HAVE_MKDIR
|
||||
/* make sure .sane directory exists in existing store dir */
|
||||
snprintf (tmpstr, PATH_MAX, "%s%c.sane", ptr, PATH_SEP);
|
||||
mkdir(tmpstr,0700);
|
||||
/* make sure .sane directory exists in existing store dir */
|
||||
size = std::snprintf(&ret.front(), ret.size(), "%s%c.sane", ptr, PATH_SEP);
|
||||
ret.resize(size);
|
||||
mkdir(ret.c_str(), 0700);
|
||||
|
||||
ret.resize(PATH_MAX);
|
||||
#endif
|
||||
snprintf (tmpstr, PATH_MAX, "%s%c.sane%c%s", ptr, PATH_SEP, PATH_SEP, filename);
|
||||
size = std::snprintf(&ret.front(), ret.size(), "%s%c.sane%c%s",
|
||||
ptr, PATH_SEP, PATH_SEP, filename);
|
||||
ret.resize(size);
|
||||
}
|
||||
|
||||
DBG(DBG_info, "%s: calibration filename >%s<\n", __func__, tmpstr);
|
||||
DBG(DBG_info, "%s: calibration filename >%s<\n", __func__, ret.c_str());
|
||||
|
||||
return tmpstr;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -5068,12 +5077,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 +5123,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 +5133,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 +5416,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 +5469,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 +5480,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";
|
||||
|
@ -5504,7 +5514,6 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
|
|||
{
|
||||
DBG_HELPER_ARGS(dbg, "devicename = %s", devicename);
|
||||
Genesys_Device *dev = nullptr;
|
||||
char *tmpstr;
|
||||
|
||||
/* devicename="" or devicename="genesys" are default values that use
|
||||
* first available device
|
||||
|
@ -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();
|
||||
|
||||
|
||||
|
@ -5592,12 +5600,11 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
|
|||
/* here is the place to fetch a stored calibration cache */
|
||||
if (s->dev->force_calibration == 0)
|
||||
{
|
||||
tmpstr=calibration_filename(s->dev);
|
||||
s->calibration_file = tmpstr;
|
||||
s->dev->calib_file = tmpstr;
|
||||
auto path = calibration_filename(s->dev);
|
||||
s->calibration_file = path;
|
||||
s->dev->calib_file = path;
|
||||
DBG(DBG_info, "%s: Calibration filename set to:\n", __func__);
|
||||
DBG(DBG_info, "%s: >%s<\n", __func__, s->dev->calib_file.c_str());
|
||||
free(tmpstr);
|
||||
|
||||
catch_all_exceptions(__func__, [&]()
|
||||
{
|
||||
|
|
|
@ -50,9 +50,6 @@
|
|||
Genesys_Device::~Genesys_Device()
|
||||
{
|
||||
clear();
|
||||
|
||||
if (file_name != nullptr)
|
||||
free(file_name);
|
||||
}
|
||||
|
||||
void Genesys_Device::clear()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue