[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41855] trunk/blender/source/blender: bytestring support for py/rna - this is so py can access data which

Campbell Barton ideasman42 at gmail.com
Tue Nov 15 08:09:43 CET 2011


Revision: 41855
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41855
Author:   campbellbarton
Date:     2011-11-15 07:09:41 +0000 (Tue, 15 Nov 2011)
Log Message:
-----------
bytestring support for py/rna - this is so py can access data which
isn't meant to be accessed as unicode text.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/python/intern/bpy_props.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-11-15 07:00:01 UTC (rev 41854)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-11-15 07:09:41 UTC (rev 41855)
@@ -271,7 +271,7 @@
 {
 	if (but->rnaprop) {
 		const int subtype= RNA_property_subtype(but->rnaprop);
-		return !(ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME));
+		return !(ELEM4(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME, PROP_BYTESTRING));
 	}
 	else {
 		return !(but->flag & UI_BUT_NO_UTF8);

Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h	2011-11-15 07:00:01 UTC (rev 41854)
+++ trunk/blender/source/blender/makesrna/RNA_types.h	2011-11-15 07:09:41 UTC (rev 41855)
@@ -108,7 +108,9 @@
 	PROP_FILEPATH = 1,
 	PROP_DIRPATH = 2,
 	PROP_FILENAME = 3,
-	PROP_TRANSLATE = 4, /* a string which should be translated */
+	PROP_BYTESTRING = 4, /* a string which should be represented as bytes
+	                      * in python, still NULL terminated though. */
+	PROP_TRANSLATE = 5, /* a string which should be translated */
 
 	/* numbers */
 	PROP_UNSIGNED = 13,

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-11-15 07:00:01 UTC (rev 41854)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-11-15 07:09:41 UTC (rev 41855)
@@ -1816,6 +1816,7 @@
 		case PROP_FILEPATH: return "PROP_FILEPATH";
 		case PROP_FILENAME: return "PROP_FILENAME";
 		case PROP_DIRPATH: return "PROP_DIRPATH";
+		case PROP_BYTESTRING: return "PROP_BYTESTRING";
 		case PROP_TRANSLATE: return "PROP_TRANSLATE";
 		case PROP_UNSIGNED: return "PROP_UNSIGNED";
 		case PROP_PERCENTAGE: return "PROP_PERCENTAGE";

Modified: trunk/blender/source/blender/python/intern/bpy_props.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_props.c	2011-11-15 07:00:01 UTC (rev 41854)
+++ trunk/blender/source/blender/python/intern/bpy_props.c	2011-11-15 07:09:41 UTC (rev 41855)
@@ -74,6 +74,7 @@
 	{PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""},
 	{PROP_DIRPATH, "DIR_PATH", 0, "Directory Path", ""},
 	{PROP_FILENAME, "FILENAME", 0, "Filename", ""},
+	{PROP_BYTESTRING, "BYTE_STRING", 0, "Byte String", ""},
 	{PROP_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
 
 	{PROP_NONE, "NONE", 0, "None", ""},

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2011-11-15 07:00:01 UTC (rev 41854)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2011-11-15 07:09:41 UTC (rev 41855)
@@ -1328,14 +1328,22 @@
 		buf= RNA_property_string_get_alloc(ptr, prop, buf_fixed, sizeof(buf_fixed), &buf_len);
 #ifdef USE_STRING_COERCE
 		/* only file paths get special treatment, they may contain non utf-8 chars */
-		if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
+		if (subtype == PROP_BYTESTRING) {
+			ret= PyBytes_FromStringAndSize(buf, buf_len);
+		}
+		else if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
 			ret= PyC_UnicodeFromByteAndSize(buf, buf_len);
 		}
 		else {
 			ret= PyUnicode_FromStringAndSize(buf, buf_len);
 		}
 #else // USE_STRING_COERCE
-		ret= PyUnicode_FromStringAndSize(buf, buf_len);
+		if (subtype == PROP_BYTESTRING) {
+			ret= PyBytes_FromStringAndSize(buf, buf_len);
+		}
+		else {
+			ret= PyUnicode_FromStringAndSize(buf, buf_len);
+		}
 #endif // USE_STRING_COERCE
 		if (buf_fixed != buf) {
 			MEM_freeN((void *)buf);
@@ -1534,53 +1542,91 @@
 		}
 		case PROP_STRING:
 		{
+			int subtype= RNA_property_subtype(prop);
 			const char *param;
-#ifdef USE_STRING_COERCE
-			PyObject *value_coerce= NULL;
-			int subtype= RNA_property_subtype(prop);
-			if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
-				/* TODO, get size */
-				param= PyC_UnicodeAsByte(value, &value_coerce);
+
+			if (subtype == PROP_BYTESTRING) {
+
+				/* Byte String */
+
+				param= PyBytes_AsString(value);
+
+				if (param==NULL) {
+					if (PyBytes_Check(value)) {
+						/* there was an error assigning a string type,
+						 * rather than setting a new error, prefix the existing one
+						 */
+						PyC_Err_Format_Prefix(PyExc_TypeError,
+						                      "%.200s %.200s.%.200s error assigning bytes",
+						                      error_prefix, RNA_struct_identifier(ptr->type),
+						                      RNA_property_identifier(prop));
+					}
+					else {
+						PyErr_Format(PyExc_TypeError,
+						             "%.200s %.200s.%.200s expected a bytes type, not %.200s",
+						             error_prefix, RNA_struct_identifier(ptr->type),
+						             RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
+					}
+
+					return -1;
+				}
+				else {
+					/* same as unicode */
+					if (data)   *((char**)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
+					else        RNA_property_string_set(ptr, prop, param);
+				}
 			}
 			else {
-				param= _PyUnicode_AsString(value);
+
+				/* Unicode String */
+
+#ifdef USE_STRING_COERCE
+				PyObject *value_coerce= NULL;
+				if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
+					/* TODO, get size */
+					param= PyC_UnicodeAsByte(value, &value_coerce);
+				}
+				else {
+					param= _PyUnicode_AsString(value);
 #ifdef WITH_INTERNATIONAL
-				if (subtype == PROP_TRANSLATE) {
-					param= IFACE_(param);
-				}
+					if (subtype == PROP_TRANSLATE) {
+						param= IFACE_(param);
+					}
 #endif // WITH_INTERNATIONAL
 
-			}
+				}
 #else // USE_STRING_COERCE
-			param= _PyUnicode_AsString(value);
+				param= _PyUnicode_AsString(value);
 #endif // USE_STRING_COERCE
 
-			if (param==NULL) {
-				if (PyUnicode_Check(value)) {
-					/* there was an error assigning a string type,
-					 * rather than setting a new error, prefix the existing one
-					 */
-					PyC_Err_Format_Prefix(PyExc_TypeError,
-					                      "%.200s %.200s.%.200s error assigning string",
-										  error_prefix, RNA_struct_identifier(ptr->type),
-										  RNA_property_identifier(prop));
+				if (param==NULL) {
+					if (PyUnicode_Check(value)) {
+						/* there was an error assigning a string type,
+						 * rather than setting a new error, prefix the existing one
+						 */
+						PyC_Err_Format_Prefix(PyExc_TypeError,
+						                      "%.200s %.200s.%.200s error assigning string",
+						                      error_prefix, RNA_struct_identifier(ptr->type),
+						                      RNA_property_identifier(prop));
+					}
+					else {
+						PyErr_Format(PyExc_TypeError,
+						             "%.200s %.200s.%.200s expected a string type, not %.200s",
+						             error_prefix, RNA_struct_identifier(ptr->type),
+						             RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
+					}
+
+					return -1;
 				}
 				else {
-					PyErr_Format(PyExc_TypeError,
-								 "%.200s %.200s.%.200s expected a string type, not %.200s",
-								 error_prefix, RNA_struct_identifier(ptr->type),
-								 RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
+					/* same as bytes */
+					if (data)   *((char**)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
+					else        RNA_property_string_set(ptr, prop, param);
 				}
-
-				return -1;
-			}
-			else {
-				if (data)   *((char**)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
-				else        RNA_property_string_set(ptr, prop, param);
-			}
 #ifdef USE_STRING_COERCE
-			Py_XDECREF(value_coerce);
+				Py_XDECREF(value_coerce);
 #endif // USE_STRING_COERCE
+			}
 			break;
 		}
 		case PROP_ENUM:
@@ -2751,7 +2797,7 @@
 	if (rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
 		return -1;
 	}
-#endif // USE_STRING_COERCE
+#endif // USE_PEDANTIC_WRITE
 
 	if (group==NULL) {
 		PyErr_SetString(PyExc_TypeError, "bpy_struct[key]= val: id properties not supported for this type");
@@ -3440,7 +3486,7 @@
 	if (rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
 		return -1;
 	}
-#endif // USE_STRING_COERCE
+#endif // USE_PEDANTIC_WRITE
 
 	if (name == NULL) {
 		PyErr_SetString(PyExc_AttributeError, "bpy_struct: __setattr__ must be a string");
@@ -3600,7 +3646,7 @@
 	if (rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
 		return -1;
 	}
-#endif // USE_STRING_COERCE
+#endif // USE_PEDANTIC_WRITE
 
 	if (name == NULL) {
 		PyErr_SetString(PyExc_AttributeError, "bpy_prop: __setattr__ must be a string");
@@ -4450,14 +4496,22 @@
 				data_ch= *(char **)data;
 
 #ifdef USE_STRING_COERCE
-			if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
+			if (subtype == PROP_BYTESTRING) {
+				ret= PyBytes_FromString(data_ch);
+			}
+			else if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
 				ret= PyC_UnicodeFromByte(data_ch);
 			}
 			else {
 				ret= PyUnicode_FromString(data_ch);
 			}
 #else
-			ret= PyUnicode_FromString(data_ch);
+			if (subtype == PROP_BYTESTRING) {
+				ret= PyBytes_FromString(buf);
+			}
+			else {
+				ret= PyUnicode_FromString(data_ch);
+			}
 #endif
 
 #ifdef USE_STRING_COERCE




More information about the Bf-blender-cvs mailing list