[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