mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 07:57:27 +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); | ||||
| 	      for(j=0; d->constraint.string_list[j]!=NULL; j++) | ||||
| 		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; | ||||
| 	    } | ||||
| 	  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))) ); | ||||
|       break; | ||||
|     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); | ||||
| #endif | ||||
|       break; | ||||
|     case(SANE_TYPE_BUTTON): | ||||
|     case(SANE_TYPE_GROUP): | ||||
|  | @ -355,14 +363,33 @@ SaneDev_set_option(SaneDevObject *self, PyObject *args) | |||
|       *( (SANE_Fixed*)v) = SANE_FIX(PyFloat_AsDouble(value)); | ||||
|       break; | ||||
|     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"); | ||||
| 	  free(v); | ||||
| 	  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; | ||||
| #endif | ||||
|       break; | ||||
|     case(SANE_TYPE_BUTTON):  | ||||
|     case(SANE_TYPE_GROUP): | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user