[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53681] trunk/blender/source/blender: partial fix for [#32581] Mesh properties API does not allow for zeros in byte array

Campbell Barton ideasman42 at gmail.com
Wed Jan 9 14:25:48 CET 2013


Revision: 53681
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53681
Author:   campbellbarton
Date:     2013-01-09 13:25:46 +0000 (Wed, 09 Jan 2013)
Log Message:
-----------
partial fix for [#32581] Mesh properties API does not allow for zeros in byte array

bmesh access allows zero bytes, support still needs adding via RNA.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c

Modified: trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2013-01-09 13:15:23 UTC (rev 53680)
+++ trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2013-01-09 13:25:46 UTC (rev 53681)
@@ -167,7 +167,7 @@
 	int		i;
 } MIntProperty;
 typedef struct MStringProperty {
-	char	s[256];
+	char	s[255], s_len;
 } MStringProperty;
 
 typedef struct OrigSpaceFace {

Modified: trunk/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2013-01-09 13:15:23 UTC (rev 53680)
+++ trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2013-01-09 13:25:46 UTC (rev 53681)
@@ -1233,6 +1233,26 @@
 	return rna_PolyCustomData_data_path(ptr, "layers_string", CD_PROP_STR);
 }
 
+/* XXX, we dont have propper byte string support yet, so for now use the (bytes + 1)
+ * bmesh API exposes correct python/bytestring access */
+void rna_MeshStringProperty_s_get(PointerRNA *ptr, char *value)
+{
+	MStringProperty *ms = (MStringProperty *)ptr->data;
+	BLI_strncpy(value, ms->s, (int)ms->s_len + 1);
+}
+
+int rna_MeshStringProperty_s_length(PointerRNA *ptr)
+{
+	MStringProperty *ms = (MStringProperty *)ptr->data;
+	return (int)ms->s_len + 1;
+}
+
+void rna_MeshStringProperty_s_set(PointerRNA *ptr, const char *value)
+{
+	MStringProperty *ms = (MStringProperty *)ptr->data;
+	BLI_strncpy(ms->s, value, sizeof(ms->s));
+}
+
 static int rna_Mesh_tot_vert_get(PointerRNA *ptr)
 {
 	Mesh *me = rna_mesh(ptr);
@@ -2161,6 +2181,7 @@
 	/* low level mesh data access, treat as bytes */
 	prop = RNA_def_property(srna, "value", PROP_STRING, PROP_BYTESTRING);
 	RNA_def_property_string_sdna(prop, NULL, "s");
+	RNA_def_property_string_funcs(prop, "rna_MeshStringProperty_s_get", "rna_MeshStringProperty_s_length", "rna_MeshStringProperty_s_set");
 	RNA_def_property_ui_text(prop, "Value", "");
 	RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 }

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2013-01-09 13:15:23 UTC (rev 53680)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2013-01-09 13:25:46 UTC (rev 53681)
@@ -981,7 +981,7 @@
 		case CD_PROP_STR:
 		{
 			MStringProperty *mstring = value;
-			ret = PyBytes_FromStringAndSize(mstring->s, BLI_strnlen(mstring->s, sizeof(mstring->s)));
+			ret = PyBytes_FromStringAndSize(mstring->s, mstring->s_len);
 			break;
 		}
 		case CD_MTEXPOLY:
@@ -1067,13 +1067,17 @@
 		case CD_PROP_STR:
 		{
 			MStringProperty *mstring = value;
-			const char *tmp_val = PyBytes_AsString(py_value);
-			if (UNLIKELY(tmp_val == NULL)) {
+			char *tmp_val;
+			Py_ssize_t tmp_val_len;
+			if (UNLIKELY(PyBytes_AsStringAndSize(py_value, &tmp_val, &tmp_val_len) == -1)) {
 				PyErr_Format(PyExc_TypeError, "expected bytes, not a %.200s", Py_TYPE(py_value)->tp_name);
 				ret = -1;
 			}
 			else {
-				BLI_strncpy(mstring->s, tmp_val, min_ii(PyBytes_Size(py_value), sizeof(mstring->s)));
+				if (tmp_val_len > sizeof(mstring->s))
+					tmp_val_len = sizeof(mstring->s);
+				memcpy(mstring->s, tmp_val, tmp_val_len);
+				mstring->s_len = tmp_val_len;
 			}
 			break;
 		}




More information about the Bf-blender-cvs mailing list