- Get data from CFData objects as Python strings and vv.
- Started on supporting CFPropertyLists.
diff --git a/Mac/Modules/cf/cfscan.py b/Mac/Modules/cf/cfscan.py
index be11dba..d6613ae 100644
--- a/Mac/Modules/cf/cfscan.py
+++ b/Mac/Modules/cf/cfscan.py
@@ -15,6 +15,7 @@
 		"CFDictionaryRef", "CFMutableDictionaryRef",
 		"CFStringRef", "CFMutableStringRef",
 		"CFURLRef",
+##		"CFPropertyListRef",
 		)
 # ADD object typenames here
 
@@ -31,7 +32,7 @@
 ##		"CFNumber.h",
 ##		"CFPlugIn.h",
 ##		"CFPreferences.h",
-##		"CFPropertyList.h",
+		"CFPropertyList.h",
 ##		"CFSet.h",
 		"CFString.h",
 ##		"CFStringEncodingExt.h",
@@ -130,6 +131,9 @@
 			([("CFURLRef", "baseURL", "InMode")],
 			 [("OptionalCFURLRef", "*", "*")]),
 			 
+			# We handle CFPropertyListRef objects as plain CFTypeRef
+			([("CFPropertyListRef", "*", "*")],
+			 [("CFTypeRef", "*", "*")]),
 			]
 			
 if __name__ == "__main__":
diff --git a/Mac/Modules/cf/cfsupport.py b/Mac/Modules/cf/cfsupport.py
index d690441..b2ff3e1 100644
--- a/Mac/Modules/cf/cfsupport.py
+++ b/Mac/Modules/cf/cfsupport.py
@@ -49,6 +49,7 @@
 #include <CFDictionary.h>
 #include <CFString.h>
 #include <CFURL.h>
+#include <CFPropertyList.h>
 #else
 #include <CoreServices/CoreServices.h>
 #endif
@@ -195,6 +196,7 @@
 CFMutableStringRef = OpaqueByValueType("CFMutableStringRef", "CFMutableStringRefObj")
 CFURLRef = OpaqueByValueType("CFURLRef", "CFURLRefObj")
 OptionalCFURLRef  = OpaqueByValueType("CFURLRef", "OptionalCFURLRefObj")
+##CFPropertyListRef = OpaqueByValueType("CFPropertyListRef", "CFTypeRefObj")
 # ADD object type here
 
 # Our (opaque) objects
@@ -301,6 +303,18 @@
 class CFDataRefObjectDefinition(MyGlobalObjectDefinition):
 	basechain = "&CFTypeRefObj_chain"
 	
+	def outputCheckConvertArg(self):
+		Out("""
+		if (v == Py_None) { *p_itself = NULL; return 1; }
+		if (PyString_Check(v)) {
+		    char *cStr;
+		    int cLen;
+		    if( PyString_AsStringAndSize(v, &cStr, &cLen) < 0 ) return 0;
+		    *p_itself = CFDataCreate((CFAllocatorRef)NULL, (unsigned char *)cStr, cLen);
+		    return 1;
+		}
+		""")
+
 	def outputRepr(self):
 		Output()
 		Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
@@ -491,6 +505,21 @@
 return PyCF_CF2Python(_self->ob_itself);
 """
 
+# Get data from CFDataRef
+getasdata_body = """
+int size = CFDataGetLength(_self->ob_itself);
+char *data = (char *)CFDataGetBytePtr(_self->ob_itself);
+
+_res = (PyObject *)PyString_FromStringAndSize(data, size);
+return _res;
+"""
+
+f = ManualGenerator("CFDataGetData", getasdata_body);
+f.docstring = lambda: "() -> (string _rv)"
+CFDataRef_object.add(f)
+
+
+
 f = ManualGenerator("toPython", toPython_body);
 f.docstring = lambda: "() -> (python_object)"
 CFTypeRef_object.add(f)