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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to