mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-25 17:36:18 +03:00
Handle Sane option strings as Unicode strings
The Sane documentation seems to imply that these option strings contain Latin-1 text, not byte data, so we decode it and present it to the user that way.
This commit is contained in:
parent
fb2ccb15a7
commit
e49cba9b32
33
Sane/_sane.c
33
Sane/_sane.c
|
@ -243,7 +243,11 @@ SaneDev_get_options(SaneDevObject *self, PyObject *args)
|
||||||
constraint=PyList_New(0);
|
constraint=PyList_New(0);
|
||||||
for(j=0; d->constraint.string_list[j]!=NULL; j++)
|
for(j=0; d->constraint.string_list[j]!=NULL; j++)
|
||||||
PyList_Append(constraint,
|
PyList_Append(constraint,
|
||||||
PyBytes_FromString(d->constraint.string_list[j]));
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
PyUnicode_DecodeLatin1(d->constraint.string_list[j], strlen(d->constraint.string_list[j]), NULL));
|
||||||
|
#else
|
||||||
|
PyString_FromString(d->constraint.string_list[j]));
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
value=Py_BuildValue("isssiiiiO", i, d->name, d->title, d->desc,
|
value=Py_BuildValue("isssiiiiO", i, d->name, d->title, d->desc,
|
||||||
|
@ -294,7 +298,11 @@ SaneDev_get_option(SaneDevObject *self, PyObject *args)
|
||||||
value=Py_BuildValue("d", SANE_UNFIX((*((SANE_Fixed*)v))) );
|
value=Py_BuildValue("d", SANE_UNFIX((*((SANE_Fixed*)v))) );
|
||||||
break;
|
break;
|
||||||
case(SANE_TYPE_STRING):
|
case(SANE_TYPE_STRING):
|
||||||
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
value=PyUnicode_DecodeLatin1((const char *) v, strlen((const char *) v), NULL);
|
||||||
|
#else
|
||||||
value=Py_BuildValue("s", v);
|
value=Py_BuildValue("s", v);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case(SANE_TYPE_BUTTON):
|
case(SANE_TYPE_BUTTON):
|
||||||
case(SANE_TYPE_GROUP):
|
case(SANE_TYPE_GROUP):
|
||||||
|
@ -355,14 +363,33 @@ SaneDev_set_option(SaneDevObject *self, PyObject *args)
|
||||||
*( (SANE_Fixed*)v) = SANE_FIX(PyFloat_AsDouble(value));
|
*( (SANE_Fixed*)v) = SANE_FIX(PyFloat_AsDouble(value));
|
||||||
break;
|
break;
|
||||||
case(SANE_TYPE_STRING):
|
case(SANE_TYPE_STRING):
|
||||||
if (!PyBytes_Check(value))
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
if (!PyUnicode_Check(value))
|
||||||
{
|
{
|
||||||
PyErr_SetString(PyExc_TypeError, "SANE_STRING requires a string");
|
PyErr_SetString(PyExc_TypeError, "SANE_STRING requires a string");
|
||||||
free(v);
|
free(v);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
strncpy(v, PyBytes_AsString(value), d->size-1);
|
{
|
||||||
|
PyObject *encoded = PyUnicode_AsLatin1String(value);
|
||||||
|
|
||||||
|
if (!encoded)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
strncpy(v, PyBytes_AsString(encoded), d->size-1);
|
||||||
|
((char*)v)[d->size-1] = 0;
|
||||||
|
Py_DECREF(encoded);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (!PyString_Check(value))
|
||||||
|
{
|
||||||
|
PyErr_SetString(PyExc_TypeError, "SANE_STRING requires a string");
|
||||||
|
free(v);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strncpy(v, PyString_AsString(value), d->size-1);
|
||||||
((char*)v)[d->size-1] = 0;
|
((char*)v)[d->size-1] = 0;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case(SANE_TYPE_BUTTON):
|
case(SANE_TYPE_BUTTON):
|
||||||
case(SANE_TYPE_GROUP):
|
case(SANE_TYPE_GROUP):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user