[PyObjC-svn] r2024 - in trunk/pyobjc/pyobjc-framework-Cocoa: . Doc Examples/AppKit/ClassBrowser Examples/Inject/InjectBrowser Exceptions Lib/CoreFoundation Modules PyObjCTest

[email protected]
Newsgroups gmane.comp.python.pyobjc.cvs
Message-ID <[email protected]>
Author: ronaldoussoren
Date: Tue Nov 18 09:52:31 2008
New Revision: 2024

Log:
Add some more tests, as well as improved C wrappers for a number of functions.

Most interesting changes result in CFRunLoop, CFStream and runloop sources to
work correctly, which should make it possible to write a better Twisted reactor 
for Cocoa programs.


Added:
   trunk/pyobjc/pyobjc-framework-Cocoa/Doc/api-notes-CoreFoundation.txt
   trunk/pyobjc/pyobjc-framework-Cocoa/Doc/api-notes-kvo.txt
   trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopSource.m
   trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFSocket.m
Modified:
   trunk/pyobjc/pyobjc-framework-Cocoa/Examples/AppKit/ClassBrowser/   (props changed)
   trunk/pyobjc/pyobjc-framework-Cocoa/Examples/Inject/InjectBrowser/   (props changed)
   trunk/pyobjc/pyobjc-framework-Cocoa/Exceptions/CoreFoundation.bridgesupport
   trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/PyObjC.bridgesupport
   trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/__init__.py
   trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFBag.m
   trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFReadStream.m
   trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopObserver.m
   trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopTimer.m
   trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFTree.m
   trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfrunloop.py
   trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfsocket.py
   trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstream.py
   trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstring.py
   trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstringtokenizer.py
   trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftimezone.py
   trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftree.py
   trunk/pyobjc/pyobjc-framework-Cocoa/setup.py

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Exceptions/CoreFoundation.bridgesupport
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Exceptions/CoreFoundation.bridgesupport	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Exceptions/CoreFoundation.bridgesupport	Tue Nov 18 09:52:31 2008
@@ -870,7 +870,7 @@
   </function>
   <function name='CFPropertyListCreateFromStream'>
     <retval already_cfretained='true' already_retained='true' />
-    <arg index='4' type_modifier='n' />
+    <arg index='4' type_modifier='o' />
     <arg already_retained='true' index='5' type_modifier='o' />
   </function>
   <function name='CFPropertyListCreateFromXMLData'>
@@ -891,7 +891,7 @@
   </function>
   <function comment='user must pass kCAllocatorNull as the bytesDeallocator!' name='CFReadStreamCreateWithBytesNoCopy'>
     <retval already_cfretained='true' already_retained='true' />
-    <arg c_array_length_in_arg='2' index='1' type='^v' type64='^v'/>
+    <arg c_array_length_in_arg='2' index='1' type='^v' type64='^v' type_modifier='n'/>
   </function>
   <function name='CFReadStreamCreateWithFile'>
     <retval already_cfretained='true' already_retained='true' />
@@ -901,7 +901,7 @@
     <arg index='2' type_modifier='o' />
   </function>
   <function name='CFReadStreamRead'>
-    <arg c_array_length_in_arg='2' index='1' type_modifier='o' type='^v' type64='^v' />
+    <arg c_array_length_in_result='true'  c_array_length_in_arg='2' index='1' type_modifier='o' type='^v' type64='^v' />
   </function>
   <function comment='manual wrapper' name='CFReadStreamSetClient' ignore='true' >
     <arg index='2' type='^?' type64='^?' />
@@ -991,12 +991,14 @@
   <function name='CFSocketCopyPeerAddress'>
     <retval already_cfretained='true' already_retained='true' />
   </function>
-  <function name='CFSocketCopyRegisteredSocketSignature'>
+  <function name='CFSocketRegisterSocketSignature' ignore='true' comment='does not work according to docs' />
+  <function name='CFSocketRegisterValue' ignore='true' comment='does not work according to docs' />
+  <function name='CFSocketCopyRegisteredSocketSignature' ignore='true'  comment='does not workign according to docs'>
     <arg index='0' type_modifier='n' />
     <arg index='3' type_modifier='o' />
     <arg index='4' type_modifier='o' />
   </function>
-  <function name='CFSocketCopyRegisteredValue'>
+  <function name='CFSocketCopyRegisteredValue' ignore='true'  comment='does not workign according to docs'>
     <arg index='0' type_modifier='n' />
     <arg index='3' type='^@' type64='^@' type_modifier='o' />
     <arg index='4' type_modifier='o' />
@@ -1033,10 +1035,10 @@
     <arg index='0' type_modifier='n' />
     <arg index='3' null_accepted='false' type_modifier='n' />
   </function>
-  <function name='CFSocketRegisterValue'>
+  <function name='CFSocketRegisterValue' ignore='true' comment='does not work according to docs'>
     <arg index='0' type_modifier='n' />
   </function>
-  <function name='CFSocketUnregister'>
+  <function name='CFSocketUnregister' ignore='true' comment='does not work according to docs'>
     <arg index='0' type_modifier='n' />
   </function>
   <function name='CFStreamCreateBoundPair'>
@@ -1062,7 +1064,9 @@
   <function name='CFStringAppendCharacters'>
     <arg c_array_length_in_arg='2' comment='Unicode string' index='1' type='r^T' type64='r^T' type_modifier='n' />
   </function>
-  <function name='CFStringAppendFormat' variadic='true' />
+  <function name='CFStringAppendFormat' variadic='true' >
+	  <arg index=2 printf_format='true' />
+  </function>
   <function ignore='true' name='CFStringAppendFormatAndArguments' />
   <function name='CFStringAppendPascalString' ignore='true' comment='Do not use from python'>
     <arg comment='pascal string' index='1' type='*' type64='*' />
@@ -1130,7 +1134,10 @@
   </function>
   <function name='CFStringCreateWithFormat' variadic='true'>
     <retval already_cfretained='true' already_retained='true' />
+    <arg index='2' printf_format='true' />
   </function>
+  <function ignore='true' name='CFShow' />
+  <function ignore='true' name='CFShowStr' />
   <function ignore='true' name='CFStringCreateWithFormatAndArguments' />
   <function name='CFStringCreateWithPascalString' ignore='true' comment='FIXME: Do not use from python'>
     <retval already_cfretained='true' already_retained='true' />
@@ -1211,7 +1218,7 @@
     <retval already_cfretained='true' already_retained='true' />
   </function>
   <function name='CFStringTokenizerGetCurrentSubTokens'>
-	  <arg index='1' type_modifier='o' c_array_length_in_arg='2' c_array_length_in_retval='true' />
+	  <arg index='1' type_modifier='o' c_array_length_in_arg='2' c_array_length_in_result='true' />
   </function>
   <function name='CFStringTokenizerGetCurrentTokenRange' />
   <function name='CFStringTransform'>
@@ -1388,16 +1395,16 @@
     <arg index='1' type_modifier='o' />
   </function>
   <function name='CFURLGetByteRangeForComponent'>
-    <arg index='2' type_modifier='n' />
+    <arg index='2' type_modifier='o' />
   </function>
   <function name='CFURLGetBytes'>
-    <arg c_array_length_in_arg='2' index='1' type_modifier='o' type='^v' type64='^v' />
+    <arg c_array_length_in_arg='2' c_array_length_in_result='true' index='1' type_modifier='o' type='^v' type64='^v' />
   </function>
   <function name='CFURLGetFSRef'>
     <arg index='1' type_modifier='o' />
   </function>
   <function name='CFURLGetFileSystemRepresentation'>
-    <arg c_array_length_in_arg='3' comment='string' index='2' type_modifier='o'  type='^t' type64='^t' />
+    <arg c_array_length_in_arg='3' c_array_delmited_by_null='true' comment='string' index='2' type_modifier='o'  type='^t' type64='^t' />
   </function>
   <function name='CFURLWriteDataAndPropertiesToResource'>
     <arg index='3' type_modifier='o' />
@@ -1445,7 +1452,7 @@
   </function>
   <function comment='fixme' name='CFWriteStreamCreateWithBuffer'>
     <retval already_cfretained='true' already_retained='true' />
-    <arg c_array_length_in_arg='2' comment='buffer must not die until the stream is disposed off' index='1' type='^v' type64='^v'/>
+    <arg c_array_length_in_arg='2' comment='buffer must not die until the stream is disposed off' index='1' type='^v' type64='^v' type_modifier='n' />
   </function>
   <function name='CFWriteStreamCreateWithFile'>
     <retval already_cfretained='true' already_retained='true' />
@@ -1455,7 +1462,7 @@
     <arg index='3' type='^{?=i^v^?^?^?}' type64='^{?=q^v^?^?^?}' />
   </function>
   <function name='CFWriteStreamWrite'>
-    <arg c_array_length_in_arg='2' index='1' type='^v' type64='^v'/>
+    <arg c_array_length_in_arg='2' index='1' type='^v' type64='^v' type_modifier='n' />
   </function>
   <function name='CFXMLCreateStringByEscapingEntities'>
     <retval already_cfretained='true' already_retained='true' />

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/PyObjC.bridgesupport
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/PyObjC.bridgesupport	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/PyObjC.bridgesupport	Tue Nov 18 09:52:31 2008
@@ -9,23 +9,23 @@
   <struct name='CFGregorianUnits' type='{_CFGregorianUnits="years"i"months"i"days"i"hours"i"minutes"i"seconds"d}' type64='{_CFGregorianUnits="years"i"months"i"days"i"hours"i"minutes"i"seconds"d}' />
   <struct name='CFRange' type='{_CFRange="location"i"length"i}' type64='{_CFRange="location"q"length"q}' />
   <struct name='CFSetCallBacks' type='{_CFSetCallBacks="version"i"retain"^?"release"^?"copyDescription"^?"equal"^?"hash"^?}' type64='{_CFSetCallBacks="version"q"retain"^?"release"^?"copyDescription"^?"equal"^?"hash"^?}' />
-  <struct name='CFSocketSignature' type='{_CFSocketSignature="protocolFamily"i"socketType"i"protocol"i"address"^{__CFData}}' type64='{_CFSocketSignature="protocolFamily"i"socketType"i"protocol"i"address"^{__CFData}}' />
+  <struct name='CFSocketSignature' type='{_CFSocketSignature="protocolFamily"i"socketType"i"protocol"i"address"^{__CFData=}}' type64='{_CFSocketSignature="protocolFamily"i"socketType"i"protocol"i"address"}' />
   <struct name='CFStreamError' type='{_CFStreamError="domain"i"error"i}' type64='{_CFStreamError="domain"q"error"i}' />
   <struct name='CFSwappedFloat32' type='{_CFSwappedFloat32="v"I}' type64='{_CFSwappedFloat32="v"I}' />
   <struct name='CFSwappedFloat64' type='{_CFSwappedFloat64="v"Q}' type64='{_CFSwappedFloat64="v"Q}' />
   <struct name='CFTreeContext' type='{_CFTreeContext="version"i"info"^v"retain"^?"release"^?"copyDescription"^?}' type64='{_CFTreeContext="version"q"info"^v"retain"^?"release"^?"copyDescription"^?}' />
   <struct name='CFUUIDBytes' type='{_CFUUIDBytes="byte0"C"byte1"C"byte2"C"byte3"C"byte4"C"byte5"C"byte6"C"byte7"C"byte8"C"byte9"C"byte10"C"byte11"C"byte12"C"byte13"C"byte14"C"byte15"C}' type64='{_CFUUIDBytes="byte0"C"byte1"C"byte2"C"byte3"C"byte4"C"byte5"C"byte6"C"byte7"C"byte8"C"byte9"C"byte10"C"byte11"C"byte12"C"byte13"C"byte14"C"byte15"C}' />
-  <struct name='CFXMLAttributeDeclarationInfo' type='{_CFXMLAttributeDeclarationInfo="attributeName"^{__CFString}"typeString"^{__CFString}"defaultString"^{__CFString}}' type64='{_CFXMLAttributeDeclarationInfo="attributeName"^{__CFString}"typeString"^{__CFString}"defaultString"^{__CFString}}' />
-  <struct name='CFXMLAttributeListDeclarationInfo' type='{_CFXMLAttributeListDeclarationInfo="numberOfAttributes"i"attributes"^{?}}' type64='{_CFXMLAttributeListDeclarationInfo="numberOfAttributes"q"attributes"^{?}}' />
-  <struct name='CFXMLDocumentInfo' type='{_CFXMLDocumentInfo="sourceURL"^{__CFURL}"encoding"I}' type64='{_CFXMLDocumentInfo="sourceURL"^{__CFURL}"encoding"I}' />
-  <struct name='CFXMLDocumentTypeInfo' type='{_CFXMLDocumentTypeInfo="externalID"{?="systemID"^{__CFURL}"publicID"^{__CFString}}}' type64='{_CFXMLDocumentTypeInfo="externalID"{?="systemID"^{__CFURL}"publicID"^{__CFString}}}' />
-  <struct name='CFXMLElementInfo' type='{_CFXMLElementInfo="attributes"^{__CFDictionary}"attributeOrder"^{__CFArray}"isEmpty"C"_reserved"[3c]}' type64='{_CFXMLElementInfo="attributes"^{__CFDictionary}"attributeOrder"^{__CFArray}"isEmpty"C"_reserved"[3c]}' />
-  <struct name='CFXMLElementTypeDeclarationInfo' type='{_CFXMLElementTypeDeclarationInfo="contentDescription"^{__CFString}}' type64='{_CFXMLElementTypeDeclarationInfo="contentDescription"^{__CFString}}' />
-  <struct name='CFXMLEntityInfo' type='{_CFXMLEntityInfo="entityType"i"replacementText"^{__CFString}"entityID"{?="systemID"^{__CFURL}"publicID"^{__CFString}}"notationName"^{__CFString}}' type64='{_CFXMLEntityInfo="entityType"q"replacementText"^{__CFString}"entityID"{?="systemID"^{__CFURL}"publicID"^{__CFString}}"notationName"^{__CFString}}' />
-  <struct name='CFXMLEntityReferenceInfo' type='{_CFXMLEntityReferenceInfo="entityType"i}' type64='{_CFXMLEntityReferenceInfo="entityType"q}' />
-  <struct name='CFXMLExternalID' type='{_CFXMLExternalID="systemID"^{__CFURL}"publicID"^{__CFString}}' type64='{_CFXMLExternalID="systemID"^{__CFURL}"publicID"^{__CFString}}' />
-  <struct name='CFXMLNotationInfo' type='{_CFXMLNotationInfo="externalID"{?="systemID"^{__CFURL}"publicID"^{__CFString}}}' type64='{_CFXMLNotationInfo="externalID"{?="systemID"^{__CFURL}"publicID"^{__CFString}}}' />
-  <struct name='CFXMLProcessingInstructionInfo' type='{_CFXMLProcessingInstructionInfo="dataString"^{__CFString}}' type64='{_CFXMLProcessingInstructionInfo="dataString"^{__CFString}}' />
+  <struct name='CFXMLAttributeDeclarationInfo' type='{_CFXMLAttributeDeclarationInfo="attributeName"^{__CFString=}"typeString"^{__CFString=}"defaultString"^{__CFString=}}' type64='{_CFXMLAttributeDeclarationInfo="attributeName"^{__CFString=}"typeString"^{__CFString=}"defaultString"^{__CFString=}}' />
+  <struct name='CFXMLAttributeListDeclarationInfo' type='{_CFXMLAttributeListDeclarationInfo="numberOfAttributes"i"attributes"^{_CFXMLAttributeDeclarationInfo=^{__CFString=}^{__CFString=}^{__CFString=}}}' type64='{_CFXMLAttributeListDeclarationInfo="numberOfAttributes"q"attributes"^{_CFXMLAttributeDeclarationInfo=^{__CFString=}^{__CFString=}^{__CFString=}}}' />
+  <struct name='CFXMLDocumentInfo' type='{_CFXMLDocumentInfo="sourceURL"^{__CFURL=}"encoding"I}' type64='{_CFXMLDocumentInfo="sourceURL""encoding"I}' />
+  <struct name='CFXMLDocumentTypeInfo' type='{_CFXMLDocumentTypeInfo="externalID"{_CFXMLExternalID=^{__CFURL=}^{__CFString=}}}' type64='{_CFXMLDocumentTypeInfo="externalID"{_CFXMLExternalID=^{__CFString=}}}' />
+  <struct name='CFXMLElementInfo' type='{_CFXMLElementInfo="attributes"^{__CFDictionary=}"attributeOrder"^{__CFArray=}"isEmpty"B}' type64='{_CFXMLElementInfo="attributes""attributeOrder""isEmpty"B}' />
+  <struct name='CFXMLElementTypeDeclarationInfo' type='{_CFXMLElementTypeDeclarationInfo="contentDescription"^{__CFString=}}' type64='{_CFXMLElementTypeDeclarationInfo="contentDescription"^{__CFString=}}' />
+  <struct name='CFXMLEntityInfo' type='{_CFXMLEntityInfo="entityType"i"replacementText"^{__CFString=}"entityID"{_CFXMLExternalID=^{__CFURL=}^{__CFString=}}"notationName"^{__CFString=}}' type64='{_CFXMLEntityInfo="entityType""replacementText"^{__CFString=}"entityID"{_CFXMLExternalID=^{__CFString=}}"notationName"^{__CFString=}}' />
+  <struct name='CFXMLEntityReferenceInfo' type='{_CFXMLEntityReferenceInfo="entityType"i}' type64='{_CFXMLEntityReferenceInfo="entityType"}' />
+  <struct name='CFXMLExternalID' type='{_CFXMLExternalID="systemID"^{__CFURL=}"publicID"^{__CFString=}}' type64='{_CFXMLExternalID="systemID""publicID"^{__CFString=}}' />
+  <struct name='CFXMLNotationInfo' type='{_CFXMLNotationInfo="externalID"{_CFXMLExternalID=^{__CFURL=}^{__CFString=}}}' type64='{_CFXMLNotationInfo="externalID"{_CFXMLExternalID=^{__CFString=}}}' />
+  <struct name='CFXMLProcessingInstructionInfo' type='{_CFXMLProcessingInstructionInfo="dataString"^{__CFString=}}' type64='{_CFXMLProcessingInstructionInfo="dataString"^{__CFString=}}' />
   <cftype gettypeid_func='CFAllocatorGetTypeID' name='CFAllocatorRef' type='^{__CFAllocator=}' type64='^{__CFAllocator=}' />
   <cftype gettypeid_func='CFArrayGetTypeID' name='CFArrayRef' tollfree='NSCFArray' type='^{__CFArray=}' type64='^{__CFArray=}' />
   <cftype gettypeid_func='CFAttributedStringGetTypeID' name='CFAttributedStringRef' tollfree='NSCFAttributedString' type='^{__CFAttributedString=}' type64='^{__CFAttributedString=}' />
@@ -59,7 +59,6 @@
   <cftype gettypeid_func='CFNumberFormatterGetTypeID' name='CFNumberFormatterRef' type='^{__CFNumberFormatter=}' type64='^{__CFNumberFormatter=}' />
   <cftype gettypeid_func='CFNumberGetTypeID' name='CFNumberRef' tollfree='NSCFNumber' type='^{__CFNumber=}' type64='^{__CFNumber=}' />
   <cftype gettypeid_func='CFPlugInInstanceGetTypeID' name='CFPlugInInstanceRef' type='^{__CFPlugInInstance=}' type64='^{__CFPlugInInstance=}' />
-  <cftype gettypeid_func='CFPlugInGetTypeID' name='CFPlugInRef' type='^{__CFBundle=}' type64='^{__CFBundle=}' />
   <cftype gettypeid_func='CFReadStreamGetTypeID' name='CFReadStreamRef' tollfree='NSCFInputStream' type='^{__CFReadStream=}' type64='^{__CFReadStream=}' />
   <cftype gettypeid_func='CFRunLoopObserverGetTypeID' name='CFRunLoopObserverRef' type='^{__CFRunLoopObserver=}' type64='^{__CFRunLoopObserver=}' />
   <cftype gettypeid_func='CFRunLoopGetTypeID' name='CFRunLoopRef' type='^{__CFRunLoop=}' type64='^{__CFRunLoop=}' />
@@ -1344,11 +1343,6 @@
     <retval type='^{__CFBundle=}' />
     <arg type='^{__CFString=}' />
   </function>
-  <function name='CFBundleGetDataPointerForName'>
-    <retval c_array_of_variable_length='true' type='^v' />
-    <arg type='^{__CFBundle=}' />
-    <arg type='^{__CFString=}' />
-  </function>
   <function name='CFBundleGetDevelopmentRegion'>
     <retval type='^{__CFString=}' />
     <arg type='^{__CFBundle=}' />
@@ -1608,7 +1602,7 @@
   </function>
   <function name='CFDataAppendBytes'>
     <arg type='^{__CFData=}' />
-    <arg type='^v' type64='^v' type_modifier='n' c_array_length_in_arg='2' />
+    <arg c_array_length_in_arg='2' type='^v' type64='^v' type_modifier='n' />
     <arg type='l' type64='l' />
   </function>
   <function name='CFDataCreate'>
@@ -2361,7 +2355,7 @@
     <arg type='^{__CFReadStream=}' />
     <arg type='l' type64='l' />
     <arg type='L' type64='L' />
-    <arg type='^i' type64='^i' type_modifier='n' />
+    <arg type='^i' type64='^i' type_modifier='o' />
     <arg already_retained='true' type='^^{__CFString}' type_modifier='o' />
   </function>
   <function name='CFPropertyListCreateFromXMLData'>
@@ -2403,7 +2397,7 @@
   <function name='CFReadStreamCreateWithBytesNoCopy'>
     <retval already_cfretained='true' type='^{__CFReadStream=}' />
     <arg type='^{__CFAllocator=}' />
-    <arg c_array_length_in_arg='2' type='^v' type64='^v' />
+    <arg c_array_length_in_arg='2' type='^v' type64='^v' type_modifier='n' />
     <arg type='l' type64='l' />
     <arg type='^{__CFAllocator=}' />
   </function>
@@ -2440,7 +2434,7 @@
   <function name='CFReadStreamRead'>
     <retval type='l' type64='q' />
     <arg type='^{__CFReadStream=}' />
-    <arg c_array_length_in_arg='2' type='^v' type64='^v' type_modifier='o' />
+    <arg c_array_length_in_arg='2' c_array_length_in_result='true' type='^v' type64='^v' type_modifier='o' />
     <arg type='l' type64='l' />
   </function>
   <function name='CFReadStreamScheduleWithRunLoop'>
@@ -2677,10 +2671,6 @@
     <arg type='@' type64='@' />
     <arg type='^@' type64='^@' type_modifier='o' />
   </function>
-  <function name='CFSetGetValues'>
-    <arg type='^{__CFSet=}' />
-    <arg c_array_of_variable_length='true' type='^@' type64='^@' type_modifier='o' />
-  </function>
   <function name='CFSetRemoveAllValues'>
     <arg type='^{__CFSet=}' />
   </function>
@@ -2696,12 +2686,6 @@
     <arg type='^{__CFSet=}' />
     <arg type='@' type64='@' />
   </function>
-  <function name='CFShow'>
-    <arg type='@' />
-  </function>
-  <function name='CFShowStr'>
-    <arg type='^{__CFString=}' />
-  </function>
   <function name='CFSocketConnectToAddress'>
     <retval type='l' />
     <arg type='^{__CFSocket=}' />
@@ -2716,22 +2700,6 @@
     <retval already_cfretained='true' type='^{__CFData=}' />
     <arg type='^{__CFSocket=}' />
   </function>
-  <function name='CFSocketCopyRegisteredSocketSignature'>
-    <retval type='l' />
-    <arg type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='n' />
-    <arg type='d' />
-    <arg type='^{__CFString=}' />
-    <arg type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='o' />
-    <arg type='^^{__CFData}' type_modifier='o' />
-  </function>
-  <function name='CFSocketCopyRegisteredValue'>
-    <retval type='l' />
-    <arg type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='n' />
-    <arg type='d' />
-    <arg type='^{__CFString=}' />
-    <arg type='^@' type64='^@' type_modifier='o' />
-    <arg type='^^{__CFData}' type_modifier='o' />
-  </function>
   <function name='CFSocketCreateRunLoopSource'>
     <retval already_cfretained='true' type='^{__CFRunLoopSource=}' />
     <arg type='^{__CFAllocator=}' />
@@ -2767,20 +2735,6 @@
     <retval type='B' />
     <arg type='^{__CFSocket=}' />
   </function>
-  <function name='CFSocketRegisterSocketSignature'>
-    <retval type='l' />
-    <arg type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='n' />
-    <arg type='d' />
-    <arg type='^{__CFString=}' />
-    <arg null_accepted='false' type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='n' />
-  </function>
-  <function name='CFSocketRegisterValue'>
-    <retval type='l' />
-    <arg type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='n' />
-    <arg type='d' />
-    <arg type='^{__CFString=}' />
-    <arg type='@' />
-  </function>
   <function name='CFSocketSendData'>
     <retval type='l' />
     <arg type='^{__CFSocket=}' />
@@ -2800,12 +2754,6 @@
     <arg type='^{__CFSocket=}' />
     <arg type='L' type64='L' />
   </function>
-  <function name='CFSocketUnregister'>
-    <retval type='l' />
-    <arg type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='n' />
-    <arg type='d' />
-    <arg type='^{__CFString=}' />
-  </function>
   <function name='CFStreamCreateBoundPair'>
     <arg type='^{__CFAllocator=}' />
     <arg already_retained='true' type='^^{__CFReadStream}' type_modifier='o' />
@@ -2814,7 +2762,7 @@
   </function>
   <function name='CFStreamCreatePairWithPeerSocketSignature'>
     <arg type='^{__CFAllocator=}' />
-    <arg type='^{_CFSocketSignature=iii^{__CFData}}' type_modifier='n' />
+    <arg type='^{_CFSocketSignature=iii^{__CFData=}}' type64='^{_CFSocketSignature=iii^{__CFData=}}' type_modifier='n' />
     <arg type='^^{__CFReadStream}' type_modifier='o' />
     <arg type='^^{__CFWriteStream}' type_modifier='o' />
   </function>
@@ -2848,7 +2796,7 @@
   <function name='CFStringAppendFormat' variadic='true'>
     <arg type='^{__CFString=}' />
     <arg type='^{__CFDictionary=}' />
-    <arg type='^{__CFString=}' />
+    <arg type='^{__CFString=}' printf_format='true' />
   </function>
   <function name='CFStringCapitalize'>
     <arg type='^{__CFString=}' />
@@ -3008,7 +2956,7 @@
     <retval already_cfretained='true' type='^{__CFString=}' />
     <arg type='^{__CFAllocator=}' />
     <arg type='^{__CFDictionary=}' />
-    <arg type='^{__CFString=}' />
+    <arg type='^{__CFString=}' printf_format='true' />
   </function>
   <function name='CFStringCreateWithSubstring'>
     <retval already_cfretained='true' type='^{__CFString=}' />
@@ -3245,7 +3193,7 @@
   <function name='CFStringTokenizerGetCurrentSubTokens'>
     <retval type='l' type64='q' />
     <arg type='^{__CFStringTokenizer=}' />
-    <arg c_array_length_in_arg='2' type='^{_CFRange=ii}' type64='^{_CFRange=ii}' type_modifier='o' />
+    <arg c_array_length_in_result='true' c_array_length_in_arg='2' type='^{_CFRange=ii}' type64='^{_CFRange=ii}' type_modifier='o' />
     <arg type='l' type64='l' />
     <arg type='^{__CFArray=}' />
   </function>
@@ -3637,12 +3585,12 @@
     <retval type='{_CFRange=ii}' type64='{_CFRange=qq}' />
     <arg type='^{__CFURL=}' />
     <arg type='l' />
-    <arg type='^{_CFRange=ii}' type64='^{_CFRange=ii}' type_modifier='n' />
+    <arg type='^{_CFRange=ii}' type64='^{_CFRange=ii}' type_modifier='o' />
   </function>
   <function name='CFURLGetBytes'>
     <retval type='l' type64='q' />
     <arg type='^{__CFURL=}' />
-    <arg c_array_length_in_arg='2' type='^v' type64='^v' type_modifier='o' />
+    <arg c_array_length_in_arg='2' c_array_length_in_result='true' type='^v' type64='^v' type_modifier='o' />
     <arg type='l' type64='l' />
   </function>
   <function name='CFURLGetFSRef'>
@@ -3654,7 +3602,7 @@
     <retval type='B' />
     <arg type='^{__CFURL=}' />
     <arg type='B' />
-    <arg c_array_length_in_arg='3' type='^t' type64='^t' type_modifier='o' />
+    <arg c_array_delmited_by_null='true' c_array_length_in_arg='3' type='^t' type64='^t' type_modifier='o' />
     <arg type='l' type64='l' />
   </function>
   <function name='CFURLGetPortNumber'>
@@ -3842,7 +3790,7 @@
   <function name='CFWriteStreamCreateWithBuffer'>
     <retval already_cfretained='true' type='^{__CFWriteStream=}' />
     <arg type='^{__CFAllocator=}' />
-    <arg c_array_length_in_arg='2' type='^v' type64='^v' />
+    <arg c_array_length_in_arg='2' type='^v' type64='^v' type_modifier='n'/>
     <arg type='l' type64='l' />
   </function>
   <function name='CFWriteStreamCreateWithFile'>
@@ -3884,7 +3832,7 @@
   <function name='CFWriteStreamWrite'>
     <retval type='l' type64='q' />
     <arg type='^{__CFWriteStream=}' />
-    <arg c_array_length_in_arg='2' type='^v' type64='^v' />
+    <arg c_array_length_in_arg='2' type='^v' type64='^v' type_modifier='n'/>
     <arg type='l' type64='l' />
   </function>
   <function name='CFXMLCreateStringByEscapingEntities'>

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/__init__.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/__init__.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Lib/CoreFoundation/__init__.py	Tue Nov 18 09:52:31 2008
@@ -33,8 +33,10 @@
 from CoreFoundation._CFRunLoopTimer import *
 from CoreFoundation._CFWriteStream import *
 from CoreFoundation._CFRunLoopObserver import *
+from CoreFoundation._CFRunLoopSource import *
 from CoreFoundation._CFRunLoopTimer import *
 from CoreFoundation._CFSet import *
+from CoreFoundation._CFSocket import *
 
 #
 # 'Emulation' for CFArray contructors

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFBag.m
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFBag.m	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFBag.m	Tue Nov 18 09:52:31 2008
@@ -84,7 +84,6 @@
 	PyObject* py_allocator;
 	Py_ssize_t count;
 	CFAllocatorRef allocator;
-	int r;
 	CFBagRef bag;
 
 

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFReadStream.m
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFReadStream.m	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFReadStream.m	Tue Nov 18 09:52:31 2008
@@ -63,6 +63,7 @@
 	PyObject* info;
 	CFReadStreamRef stream;
 	CFOptionFlags streamEvents;
+	CFStreamClientContext context;
 
 	if (!PyArg_ParseTuple(args, "OOOO", &py_stream, &py_streamEvents, &callout, &info)) {
 		return NULL;
@@ -75,18 +76,21 @@
 		return NULL;
 	}
 
-	CFStreamClientContext context = mod_CFStreamClientContext;
-	context.info = Py_BuildValue("OO", callout, info);
-	if (context.info == NULL) {
-		return NULL;
+	if (info != PyObjC_NULL) {
+		context = mod_CFStreamClientContext;
+		context.info = Py_BuildValue("OO", callout, info);
+		if (context.info == NULL) {
+			return NULL;
+		}
 	}
 
+
 	Boolean rv = FALSE;
 	PyObjC_DURING
-		if (callout == Py_None) {
+		if (info == PyObjC_NULL) {
 			rv = CFReadStreamSetClient(
 				stream, streamEvents, 
-				NULL, &context);
+				mod_CFReadStreamClientCallBack, NULL);
 		} else {
 			rv = CFReadStreamSetClient(
 				stream, streamEvents, 
@@ -99,8 +103,10 @@
 		PyObjCErr_FromObjC(localException);
 
 	PyObjC_ENDHANDLER
+	if (info != PyObjC_NULL) {
+		Py_DECREF((PyObject*)context.info);
+	}
 
-	Py_DECREF((PyObject*)context.info);
 	if (PyErr_Occurred()) {
 		return NULL;
 	}

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopObserver.m
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopObserver.m	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopObserver.m	Tue Nov 18 09:52:31 2008
@@ -165,6 +165,12 @@
 		return NULL;
 	}
 
+	if (context.info == NULL) {
+		Py_INCREF(PyObjC_NULL);
+		return PyObjC_NULL;
+	}
+
+
 	Py_INCREF(PyTuple_GET_ITEM((PyObject*)context.info, 1));
 	return PyTuple_GET_ITEM((PyObject*)context.info, 1);
 }

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopTimer.m
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopTimer.m	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFRunLoopTimer.m	Tue Nov 18 09:52:31 2008
@@ -167,6 +167,11 @@
 		return NULL;
 	}
 
+	if (context.info == NULL) {
+		Py_INCREF(PyObjC_NULL);
+		return PyObjC_NULL;
+	}
+
 	Py_INCREF(PyTuple_GET_ITEM((PyObject*)context.info, 1));
 	return PyTuple_GET_ITEM((PyObject*)context.info, 1);
 }

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFTree.m
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFTree.m	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/Modules/_CoreFoundation_CFTree.m	Tue Nov 18 09:52:31 2008
@@ -177,6 +177,61 @@
 	return py_tree;
 }
 
+static PyObject*
+mod_CFTreeGetChildren(
+	PyObject* self __attribute__((__unused__)),
+	PyObject* args)
+{
+	PyObject* py_tree;
+	PyObject* py_buffer;
+	CFTreeRef tree;
+	CFIndex count;
+	CFTreeRef* children = NULL;
+	PyObject* result;
+
+	if (!PyArg_ParseTuple(args, "OO", &py_tree, &py_buffer)) {
+		return NULL;
+	}
+
+	if (py_buffer != Py_None) {
+		PyErr_SetString(PyExc_ValueError, "buffer must be None");
+		return NULL;
+	}
+
+	if (PyObjC_PythonToObjC(@encode(CFTreeRef), py_tree, &tree) < 0) {
+		return NULL;
+	}
+
+	PyObjC_DURING
+		count = CFTreeGetChildCount(tree);
+		children = malloc(count * sizeof(CFTreeRef));
+		if (children != NULL) {
+			CFTreeGetChildren(tree, children);
+		}
+
+	PyObjC_HANDLER
+		PyObjCErr_FromObjC(localException);
+
+	PyObjC_ENDHANDLER
+
+	if (children == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+		
+
+	if (PyErr_Occurred()) {
+		if (children) {
+			free(children);
+		}
+		return NULL;
+	}
+
+	result = PyObjC_CArrayToPython(@encode(CFTreeRef), children, count);
+	free(children);
+	return result;
+}
+
 
 static PyMethodDef mod_methods[] = {
         {
@@ -197,6 +252,12 @@
 		METH_VARARGS,
 		NULL
 	},
+	{
+		"CFTreeGetChildren",
+		(PyCFunction)mod_CFTreeGetChildren,
+		METH_VARARGS,
+		NULL,
+	},
 	{ 0, 0, 0, 0 } /* sentinel */
 };
 

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfrunloop.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfrunloop.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfrunloop.py	Tue Nov 18 09:52:31 2008
@@ -58,33 +58,178 @@
         self.failUnless(isinstance(res, (int, long)))
         self.assertEquals(res, kCFRunLoopRunFinished)
 
-        #CFRunLoopRun()
-        self.fail("cfrunloop tests")
+        # CFRunLoopRun is hard to test reliably
+        self.failUnless(hasattr(CoreFoundation, 'CFRunLoopRun'))
 
     def testObserver(self):
-        #CF_EXPORT Boolean CFRunLoopContainsObserver(CFRunLoopRef rl, CFRunLoopObserverRef observer, CFStringRef mode);
-        #CF_EXPORT void CFRunLoopAddObserver(CFRunLoopRef rl, CFRunLoopObserverRef observer, CFStringRef mode);
-        #CF_EXPORT void CFRunLoopRemoveObserver(CFRunLoopRef rl, CFRunLoopObserverRef observer, CFStringRef mode);
-        self.fail("cfrunloopobserver tests")
+
+        rl = CFRunLoopGetCurrent()
+
+        data = {}
+        state = []
+        def callback(observer, activity, info):
+            state.append((observer, activity, info))
+
+        observer = CFRunLoopObserverCreate(None, kCFRunLoopEntry|kCFRunLoopExit,
+                True, 4, callback, data)
+        self.failUnless(isinstance(observer, CFRunLoopObserverRef))
+        ctx = CFRunLoopObserverGetContext(observer)
+        self.failUnless(ctx is data)
+
+        self.assertEquals(CFRunLoopObserverGetActivities(observer), kCFRunLoopEntry|kCFRunLoopExit)
+        self.failUnless(CFRunLoopObserverDoesRepeat(observer) is True)
+        self.assertEquals(CFRunLoopObserverGetOrder(observer), 4)
+        self.failUnless(CFRunLoopObserverIsValid(observer) is True)
+        CFRunLoopObserverInvalidate(observer)
+        self.failUnless(CFRunLoopObserverIsValid(observer) is False)
+        ctx = CFRunLoopObserverGetContext(observer)
+        self.failUnless(ctx is objc.NULL)
+
+
+        observer = CFRunLoopObserverCreate(None, kCFRunLoopEntry|kCFRunLoopExit,
+                True, 4, callback, data)
+        self.failUnless(isinstance(observer, CFRunLoopObserverRef))
+
+        self.failUnless (CFRunLoopContainsObserver(rl, observer, kCFRunLoopDefaultMode) is False)
+        CFRunLoopAddObserver(rl, observer, kCFRunLoopDefaultMode)
+        self.failUnless (CFRunLoopContainsObserver(rl, observer, kCFRunLoopDefaultMode) is True)
+
+        # Use dummy stream to ensure that the runloop actually performs work
+        strval = 'hello world'
+        stream = CFReadStreamCreateWithBytesNoCopy(None,
+                                strval, len(strval), kCFAllocatorNull)
+        self.failUnless(isinstance(stream, CFReadStreamRef))
+
+        CFReadStreamScheduleWithRunLoop(stream, rl, kCFRunLoopDefaultMode)
+        res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, True)
+        CFReadStreamUnscheduleFromRunLoop(stream, rl, kCFRunLoopDefaultMode)
+        
+        self.failIf( len(state) == 0 )
+        for item in state:
+            self.failUnless(item[0] is observer)
+            self.failUnless(item[1] in (kCFRunLoopEntry, kCFRunLoopExit))
+            self.failUnless(item[2] is data)
+
+
+        CFRunLoopRemoveObserver(rl, observer, kCFRunLoopDefaultMode)
+        self.failUnless (CFRunLoopContainsObserver(rl, observer, kCFRunLoopDefaultMode) is False)
 
 
     def testTimer(self):
-        #CF_EXPORT Boolean CFRunLoopContainsTimer(CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode);
-        #CF_EXPORT void CFRunLoopAddTimer(CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode);
-        #CF_EXPORT void CFRunLoopRemoveTimer(CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode);
-        self.fail("cftimer tests")
+        rl = CFRunLoopGetCurrent()
+
+        state = []
+        data = {}
+        def callback(timer, info):
+            state.append((timer, info))
+
+        timer = CFRunLoopTimerCreate(None, 0, 0.5, 0, 0, callback, data)
+
+        r = CFRunLoopTimerGetNextFireDate(timer)
+        self.failUnless(isinstance(r, float))
+
+        CFRunLoopTimerSetNextFireDate(timer, r + 2)
+        r2 = CFRunLoopTimerGetNextFireDate(timer)
+        self.assertEquals(int(r2), int(r + 2))
+
+        r = CFRunLoopTimerGetInterval(timer)
+        self.assertEquals(r, 0.5)
+
+        self.failUnless(CFRunLoopTimerGetContext(timer) is data)
+        self.failUnless(CFRunLoopTimerDoesRepeat(timer) is True)
+        self.assertEquals(CFRunLoopTimerGetOrder(timer), 0)
+        self.failUnless(CFRunLoopTimerIsValid(timer) is True)
+        CFRunLoopTimerInvalidate(timer)
+        self.failUnless(CFRunLoopTimerIsValid(timer) is False)
+        self.failUnless(CFRunLoopTimerGetContext(timer) is objc.NULL)
+
+
+        timer = CFRunLoopTimerCreate(None, 0, 0.5, 0, 0, callback, data)
+        self.failUnless(CFRunLoopContainsTimer(rl, timer, kCFRunLoopDefaultMode) is False)
+        CFRunLoopAddTimer(rl, timer, kCFRunLoopDefaultMode)
+        self.failUnless(CFRunLoopContainsTimer(rl, timer, kCFRunLoopDefaultMode) is True)
+
+        res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 2.0, True)
+
+        CFRunLoopRemoveTimer(rl, timer, kCFRunLoopDefaultMode)
+        self.failUnless(CFRunLoopContainsTimer(rl, timer, kCFRunLoopDefaultMode) is False)
+
+        self.failIf(len(state) < 3)
+        for item in state:
+            self.failUnless(item[0] is timer)
+            self.failUnless(item[1] is data)
 
     def testSource(self):
-        #CF_EXPORT Boolean CFRunLoopContainsSource(CFRunLoopRef rl, CFRunLoopSourceRef source, CFStringRef mode);
-        #CF_EXPORT void CFRunLoopAddSource(CFRunLoopRef rl, CFRunLoopSourceRef source, CFStringRef mode);
-        #CF_EXPORT void CFRunLoopRemoveSource(CFRunLoopRef rl, CFRunLoopSourceRef source, CFStringRef mode);
+        rl = CFRunLoopGetCurrent()
+        
+        state = []
+        data = {}
+        def schedule(info, rl, mode):
+            state.append(['schedule', info, rl, mode])
+        def cancel(info, rl, mode):
+            state.append(['cancel', info, rl, mode])
+        def perform(info):
+            state.append(['perform', info])
+
+        source = CFRunLoopSourceCreate(None, 55, 
+                (0, schedule, cancel, perform, data))
+        self.failUnless(isinstance(source, CFRunLoopSourceRef))
+
+        ctx = CFRunLoopSourceGetContext(source, None)
+        self.failUnless(isinstance(ctx, tuple))
+        self.assertEquals(ctx[0], 0)
+        self.assertEquals(ctx[1], schedule)
+        self.assertEquals(ctx[2], cancel)
+        self.assertEquals(ctx[3], perform)
+        self.assertEquals(ctx[4], data)
+
+        self.assertEquals(CFRunLoopSourceGetOrder(source), 55)
+        self.failUnless(CFRunLoopSourceIsValid(source) is True)
+        CFRunLoopSourceInvalidate(source)
+        self.failUnless(CFRunLoopSourceIsValid(source) is False)
+
+        source = CFRunLoopSourceCreate(None, 55, 
+                (0, schedule, cancel, perform, data))
+        self.failUnless(isinstance(source, CFRunLoopSourceRef))
+
+        self.failUnless(CFRunLoopContainsSource(rl, source, kCFRunLoopDefaultMode) is False)
+        CFRunLoopAddSource(rl, source, kCFRunLoopDefaultMode)
+        self.failUnless(CFRunLoopContainsSource(rl, source, kCFRunLoopDefaultMode) is True)
+        self.failUnless(len(state) == 1)
+        self.failUnless(state[0][0] == 'schedule')
+        self.failUnless(state[0][1] is data)
+        self.failUnless(state[0][2] is rl)
+        self.failUnless(state[0][3] == kCFRunLoopDefaultMode)
+
 
-        self.fail("cfrunloopsource tests")
+        del state[:]
 
+        res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, True)
+        self.failUnless(isinstance(res, (int, long)))
+        self.assertEquals(res, kCFRunLoopRunTimedOut)
 
+        self.assertEquals(len(state), 0)
 
+        CFRunLoopSourceSignal(source)
 
+        res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, True)
+        self.failUnless(isinstance(res, (int, long)))
+        self.assertEquals(res, kCFRunLoopRunHandledSource)
 
+        self.assertEquals(len(state), 1)
+        self.failUnless(state[0][0] == 'perform')
+        self.failUnless(state[0][1] is data)
+
+        del state[:]
+
+        CFRunLoopRemoveSource(rl, source, kCFRunLoopDefaultMode)
+        self.failUnless(CFRunLoopContainsSource(rl, source, kCFRunLoopDefaultMode) is False)
+
+        self.assertEquals(len(state), 1)
+        self.failUnless(state[0][0] == 'cancel')
+        self.failUnless(state[0][1] is data)
+        self.failUnless(state[0][2] is rl)
+        self.failUnless(state[0][3] == kCFRunLoopDefaultMode)
 
 if __name__ == "__main__":
     unittest.main()

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfsocket.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfsocket.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfsocket.py	Tue Nov 18 09:52:31 2008
@@ -1,12 +1,10 @@
 import unittest
+import socket, time, struct
 from CoreFoundation import *
+import CoreFoundation
 
 
 class TestSocket (unittest.TestCase):
-    def testDummy(self):
-        self.fail("CFSocket tests not implemented yet")
-
-
     def testTypeID(self):
         self.failUnless(isinstance(CFSocketGetTypeID(), (int, long)))
 
@@ -44,8 +42,131 @@
         self.failUnless(hasattr(o, 'protocol'))
         self.failUnless(hasattr(o, 'address'))
 
+    def testNameRegistry(self):
+        p1 = CFSocketGetDefaultNameRegistryPortNumber()
+        self.failUnless(isinstance(p1, (int, long)))
+
+        CFSocketSetDefaultNameRegistryPortNumber(p1+1)
+        p2 = CFSocketGetDefaultNameRegistryPortNumber()
+        self.failUnless(isinstance(p2, (int, long)))
+        self.assertEquals(p2, p1+1)
+
+        CFSocketSetDefaultNameRegistryPortNumber(p1)
+
+
+    def testSocketFunctions(self):
+        data = {}
+        state = []
+        def callback(sock, kind, address, data, info):
+            state.append((sock, kind, address, data, info))
+
+        sock = CFSocketCreate(None, socket.AF_INET, socket.SOCK_STREAM, 0,
+                kCFSocketReadCallBack|kCFSocketWriteCallBack,
+                callback, data)
+        self.failUnless(isinstance(sock, CFSocketRef))
+
+        localaddr = struct.pack('>BBHBBBB', 16, socket.AF_INET, 9425, 127, 0, 0, 1)
+        localaddr += '\0' * 8
+        err = CFSocketSetAddress(sock, buffer(localaddr))
+        self.assertEquals(err, kCFSocketSuccess)
+
+
+        sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
+        sock = CFSocketCreateWithNative(None, sd.fileno(),
+                kCFSocketReadCallBack|kCFSocketWriteCallBack,
+                callback, data)
+        self.failUnless(isinstance(sock, CFSocketRef))
+
+        n = CFSocketGetNative(sock)
+        self.failUnless(isinstance(n, (int, long)))
+        self.assertEquals(n, sd.fileno())
+
+
+    
+        ctx = CFSocketGetContext(sock, None)
+        self.failUnless(ctx is data)
+
+        flags = CFSocketGetSocketFlags(sock)
+        self.failUnless(isinstance(flags, (int, long)))
+
+        CFSocketSetSocketFlags(sock, kCFSocketAutomaticallyReenableReadCallBack|kCFSocketAutomaticallyReenableAcceptCallBack)
+        flags2 = CFSocketGetSocketFlags(sock)
+        self.failUnless(isinstance(flags2, (int, long)))
+        self.assertEquals(flags2, kCFSocketAutomaticallyReenableReadCallBack|kCFSocketAutomaticallyReenableAcceptCallBack)
+
+
+        # Note: I don't expect anyone to actually use this api, building
+        # struct sockaddr buffers by hand is madness in python.
+        ip = socket.gethostbyname('www.apple.com')
+        ip = map(int, ip.split('.'))
+
+        sockaddr = struct.pack('>BBHBBBB', 16, socket.AF_INET, 80, *ip)
+        sockaddr += '\0' * 8
+
+        e = CFSocketConnectToAddress(sock, buffer(sockaddr), 1.0)
+        self.failUnless(isinstance(e, (int, long)))
+        self.assertEquals(e, kCFSocketSuccess)
+
+
+        addr = CFSocketCopyPeerAddress(sock)
+        self.failUnless( isinstance(addr, CFDataRef))
+
+        addr = CFSocketCopyAddress(sock)
+        self.failUnless( isinstance(addr, CFDataRef))
+
+
+        CFSocketDisableCallBacks(sock, kCFSocketReadCallBack|kCFSocketAcceptCallBack)
+        CFSocketEnableCallBacks(sock, kCFSocketReadCallBack|kCFSocketAcceptCallBack)
+
+        err = CFSocketSendData(sock, None, buffer("GET / HTTP/1.0"), 1.0)
+        self.assertEquals(err, kCFSocketSuccess)
+
+
+
+        ok = CFSocketIsValid(sock)
+        self.failUnless(ok is True)
+
+        CFSocketInvalidate(sock)
+        ok = CFSocketIsValid(sock)
+        self.failUnless(ok is False)
+
+        localaddr = struct.pack('>BBHBBBB', 16, socket.AF_INET, 9424, 127, 0, 0, 1)
+        localaddr += '\0' * 8
+        signature = CFSocketSignature(
+                socket.AF_INET,
+                socket.SOCK_STREAM,
+                0,
+                buffer(localaddr))
+
+        sock = CFSocketCreateWithSocketSignature(None, signature,
+                kCFSocketReadCallBack|kCFSocketWriteCallBack,
+                callback, data)
+        self.failUnless(isinstance(sock, CFSocketRef))
+        
+        signature = CFSocketSignature(
+                socket.AF_INET,
+                socket.SOCK_STREAM,
+                0,
+                buffer(sockaddr))
+        sock = CFSocketCreateConnectedToSocketSignature(None, signature,
+                kCFSocketReadCallBack|kCFSocketWriteCallBack,
+                callback, data, 1.0)
+        self.failUnless(isinstance(sock, CFSocketRef))
+
+        src = CFSocketCreateRunLoopSource(None, sock, 0)
+        self.failUnless(isinstance(src, CFRunLoopSourceRef))
 
 
+    def testSocketNameServer(self):
+        # The documentation says:
+        #   Name server functionality is currently inoperable in Mac OS X.
+        # 
+        # Therefore these functions are not available from Python
+        self.failIf( hasattr(CoreFoundation, 'CFSocketCopyRegisteredSocketSignature') )
+        self.failIf( hasattr(CoreFoundation, 'CFSocketCopyRegisteredValue') )
+        self.failIf( hasattr(CoreFoundation, 'CFSocketRegisterSocketSignature') )
+        self.failIf( hasattr(CoreFoundation, 'CFSocketRegisterValue') )
+        self.failIf( hasattr(CoreFoundation, 'CFSocketUnregister') )
 
 
 if __name__ == "__main__":

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstream.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstream.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstream.py	Tue Nov 18 09:52:31 2008
@@ -294,17 +294,86 @@
         self.assertEquals(status, kCFStreamStatusNotOpen)
 
     def testReadSocketASync(self):
-        # CFReadStreamSetClient
-        # CFReadStreamScheduleWithRunLoop
-        #CFReadStreamUnscheduleFromRunLoop
-        self.fail("read socket async")
+        rl = CFRunLoopGetCurrent()
+
+        strval = "hello world"
+        readStream = CFReadStreamCreateWithBytesNoCopy(None,
+                strval, len(strval), kCFAllocatorNull)
+        self.failUnless(isinstance(readStream, CFReadStreamRef))
+
+        data = {}
+
+        state = []
+        def callback(stream, kind, info):
+            state.append((stream, kind, info))
+
+        status = CFReadStreamGetStatus(readStream)
+        self.failUnless(isinstance(status, (int, long)))
+        self.assertEquals(status, kCFStreamStatusNotOpen)
+
+        CFReadStreamOpen(readStream)
+         
+        ok = CFReadStreamSetClient(readStream,
+                kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
+                callback, data)
+        self.failUnless(ok)
+
+        CFReadStreamScheduleWithRunLoop(readStream, rl, kCFRunLoopDefaultMode)
+        try:
+            CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, True)
+            CFRunLoopWakeUp(rl)
+        finally:
+            CFReadStreamClose(readStream)
+            CFReadStreamUnscheduleFromRunLoop(readStream, rl, kCFRunLoopDefaultMode)
+            ok = CFReadStreamSetClient(readStream,
+                kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
+                callback, objc.NULL)
+            self.failUnless(ok)
+
+        self.failUnless(len(state) == 1)
+        self.failUnless(state[0][0] is readStream)
+        self.failUnless(state[0][2] is data)
+        self.assertEquals(state[0][1], kCFStreamEventHasBytesAvailable)
+
 
     def testWriteSocketAsync(self):
-        # CFWriteStreamSetClient
-        # CFWriteStreamScheduleWithRunLoop
-        #CFWriteStreamUnscheduleFromRunLoop
-        self.fail("write socket async")
+        rl = CFRunLoopGetCurrent()
+
+        import array
+        a = array.array('c', " "*20)
+
+        writeStream = CFWriteStreamCreateWithBuffer(None, a, 20)
+        self.failUnless(isinstance(writeStream, CFWriteStreamRef))
+
+        r = CFWriteStreamOpen(writeStream)
+        self.failUnless(r is True)
+
+        data = {}
+        state = []
+        def callback(stream, kind, info):
+            state.append((stream, kind, info))
+
+        ok = CFWriteStreamSetClient(writeStream,
+                kCFStreamEventCanAcceptBytes | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
+                callback, data)
+        self.failUnless(ok)
+
+        CFReadStreamScheduleWithRunLoop(writeStream, rl, kCFRunLoopDefaultMode)
+        try:
+            CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, True)
+            CFRunLoopWakeUp(rl)
+        finally:
+            CFReadStreamClose(writeStream)
+            CFReadStreamUnscheduleFromRunLoop(writeStream, rl, kCFRunLoopDefaultMode)
+            ok = CFWriteStreamSetClient(writeStream,
+                kCFStreamEventCanAcceptBytes | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
+                callback, objc.NULL)
+            self.failUnless(ok)
 
+        self.failUnless(len(state) == 1)
+        self.failUnless(state[0][0] is writeStream)
+        self.failUnless(state[0][2] is data)
+        self.assertEquals(state[0][1], kCFStreamEventCanAcceptBytes)
 
 if __name__ == "__main__":
     unittest.main()

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstring.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstring.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstring.py	Tue Nov 18 09:52:31 2008
@@ -1,10 +1,400 @@
-import unittest
+import unittest, array
 from CoreFoundation import *
+import CoreFoundation
 
 
 class TestString (unittest.TestCase):
-    def testDummy(self):
-        self.fail("CFString tests not implemented yet")
+    def testTypeID(self):
+        v = CFStringGetTypeID()
+        self.failUnless(isinstance(v, (int, long)))
+
+    def testNoPascalStrings(self):
+        self.failIf(hasattr(CoreFoundation, 'CFStringCreateWithPascalString'))
+        self.failIf(hasattr(CoreFoundation, 'CFStringCreateWithPascalStringNoCopy'))
+        self.failIf(hasattr(CoreFoundation, 'CFStringGetPascalString'))
+        self.failIf(hasattr(CoreFoundation, 'CFStringGetPascalStringPtr'))
+        self.failIf(hasattr(CoreFoundation, 'CFStringAppendPascalString'))
+
+    def testCreation(self):
+        s = CFStringCreateWithCString(None, "hello world", kCFStringEncodingASCII)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.failUnless(isinstance(s, unicode))
+        self.assertEquals(s, u"hello world")
+
+        s = CFStringCreateWithBytes(None, "hello world", 5, kCFStringEncodingASCII, False)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.failUnless(isinstance(s, unicode))
+        self.assertEquals(s, u"hello")
+
+        s = CFStringCreateWithCharacters(None, u"HELLO", 5)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.failUnless(isinstance(s, unicode))
+        self.assertEquals(s, u"HELLO")
+
+        # NOTE: the deallocator must be kCFAllocatorNull
+        s = CFStringCreateWithCStringNoCopy(None, "hello world", 
+                kCFStringEncodingASCII, kCFAllocatorNull)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.failUnless(isinstance(s, unicode))
+        self.assertEquals(s, u"hello world")
+
+        
+        s = CFStringCreateWithBytesNoCopy(None, "hello world", 5, kCFStringEncodingASCII, False, kCFAllocatorNull)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.failUnless(isinstance(s, unicode))
+        self.assertEquals(s, u"hello")
+
+        s = CFStringCreateWithCharactersNoCopy(None, u"HELLO", 5, kCFAllocatorNull)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.failUnless(isinstance(s, unicode))
+        self.assertEquals(s, u"HELLO")
+
+        del s
+
+        s = CFStringCreateWithSubstring(None,
+                u"Hello world", CFRange(2, 4))
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"Hello world"[2:6])
+
+        s = CFStringCreateCopy(None, u"foo the bar")
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"foo the bar")
+
+        s = CFStringCreateWithFormat(None, None, "hello %s = %d",
+                "foo", 52)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"hello foo = 52")
+
+        self.failIf(hasattr(CoreFoundation, 
+            "CFStringCreateWithFormatAndArguments"))
+
+    def testCreateMutable(self):
+        s = CFStringCreateMutable(None, 0)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"")
+
+        s = CFStringCreateMutableCopy(None, 0, u"foobar")
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"foobar")
+
+        b = array.array('u', u"hello world")
+        s = CFStringCreateMutableWithExternalCharactersNoCopy(
+                None, b, len(b), len(b), kCFAllocatorNull)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"hello world")
+
+        b[0] = u'H'
+
+
+        # The objc_unicode proxy is immutable
+        self.assertEquals(s, u"hello world")
+
+        # The changed string can be accessed directly though:
+        s = s.nsstring()
+        self.assertEquals(s, u"Hello world")
+
+        b2 = array.array('u', u" " * 40)
+        CFStringSetExternalCharactersNoCopy(s, b2, len(s), 40)
+        self.assertEquals(s, ' ' * len(b))
+        b2[0] = u'X'
+        self.assertEquals(s, 'X' + (' ' * (len(b)-1)))
+
+    def testFunctions(self):
+        v = CFStringGetLength(u"bla bla")
+        self.assertEquals(v, 7)
+
+        v = CFStringGetCharacterAtIndex(u"zing", 2)
+        self.failUnless(isinstance(v, unicode))
+        self.failIf(isinstance(v, objc.pyobjc_unicode))
+        self.assertEquals(v, u'n')
+
+        v = CFStringGetCharacters(u"foo", CFRange(0, 3), None)
+        self.failUnless(isinstance(v, unicode))
+        self.failIf(isinstance(v, objc.pyobjc_unicode))
+        self.assertEquals(v, u'foo')
+
+        ok, buf = CFStringGetCString(u"sing along", None, 100, kCFStringEncodingUTF8)
+        self.failUnless(ok)
+
+        # Annoyingly metadata cannot represent the exact interface
+        if '\0' in buf:
+            buf = buf[:buf.index('\0')]
+        self.assertEquals(buf, 'sing along')
+        self.failUnless(isinstance(buf, str))
+
+        s = CFStringGetCStringPtr(u"apenootjes", kCFStringEncodingASCII)
+        if s is not objc.NULL:
+            self.assertEquals(s, "apenootjes")
+            self.failUnless(isinstance(s, str))
+
+        s = CFStringGetCharactersPtr(u"apenootjes")
+        if s is not objc.NULL:
+            self.assertEquals(s, "apenootjes")
+            self.failUnless(isinstance(s, unicode))
+
+        idx, buf, used = CFStringGetBytes(u"apenootjes",
+                CFRange(1, 4), kCFStringEncodingASCII,
+                chr(0), True, None, 50, None)
+        self.assertEquals(idx, 4)
+        self.failUnless(isinstance(buf, str))
+        self.assertEquals(buf, 'peno')
+        self.assertEquals(used, 4)
+
+        s = CFStringCreateFromExternalRepresentation(None,
+                buffer('hello world'), kCFStringEncodingUTF8)
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"hello world")
+
+        data = CFStringCreateExternalRepresentation(None, s, 
+                kCFStringEncodingUTF16BE, chr(0))
+        self.failUnless(isinstance(data, CFDataRef))
+        val = CFDataGetBytes(data, (0, CFDataGetLength(data)), None)
+        self.assertEquals(val, 
+                '\0h\0e\0l\0l\0o\0 \0w\0o\0r\0l\0d')
+
+        v = CFStringGetSmallestEncoding(s)
+        self.failUnless(isinstance(v, (int, long)))
+        v = CFStringGetFastestEncoding(s)
+        self.failUnless(isinstance(v, (int, long)))
+        v = CFStringGetSystemEncoding()
+        self.failUnless(isinstance(v, (int, long)))
+        v = CFStringGetMaximumSizeForEncoding(100, kCFStringEncodingUTF8)
+        self.failUnless(isinstance(v, (int, long)))
+
+        ok, buf = CFStringGetFileSystemRepresentation(u"/path/to/nowhere.txt",
+                None, 100)
+        self.failUnless(ok)
+        if '\0' in buf:
+            buf = buf[:buf.index('\0')]
+        self.assertEquals(buf, '/path/to/nowhere.txt')
+        self.failUnless(isinstance(buf, str))
+
+        idx = CFStringGetMaximumSizeOfFileSystemRepresentation(u"/tmp")
+        self.failUnless(isinstance(idx, (int, long)))
+
+        s = CFStringCreateWithFileSystemRepresentation(None, "/tmp")
+        self.failUnless(isinstance(s, objc.pyobjc_unicode))
+        self.assertEquals(s, u"/tmp")
+        self.assertRaises((TypeError, ValueError),
+                CFStringCreateWithFileSystemRepresentation, None, u"/tmp")
+
+
+        r = CFStringCompareWithOptionsAndLocale(
+                u"aas", u"noot", 
+                CFRange(0, 3),
+                kCFCompareBackwards, CFLocaleCopyCurrent())
+        self.assertEquals(r, kCFCompareLessThan)
+
+        r = CFStringCompareWithOptions(u"aap", u"noot", CFRange(0, 3), 0)
+        self.assertEquals(r, kCFCompareLessThan)
+
+        r = CFStringCompare(u"aap", u"AAP", kCFCompareCaseInsensitive)
+        self.assertEquals(r, kCFCompareEqualTo)
+
+        found, rng = CFStringFindWithOptionsAndLocale(
+                u"the longer string", u"longer",
+                CFRange(0, 17), 0, CFLocaleCopyCurrent(), None)
+        self.failUnless(found is True)
+        self.failUnless(isinstance(rng, CFRange))
+        self.assertEquals(rng, CFRange(4, 6))
+
+        found, rng = CFStringFindWithOptions(
+                u"the longer string", u"longer",
+                CFRange(0, 17), 0, None)
+        self.failUnless(found is True)
+        self.failUnless(isinstance(rng, CFRange))
+        self.assertEquals(rng, CFRange(4, 6))
+
+        arr = CFStringCreateArrayWithFindResults(
+                None, u"word a world a world",
+                u"world", CFRange(0, 20), 0)
+        self.failUnless(isinstance(arr, CFArrayRef))
+        self.assertEquals(len(arr), 2)
+
+        rng = CFStringFind("hello world", "world", 0)
+        self.assertEquals(rng, CFRange(6, 5))
+
+        ok = CFStringHasPrefix(u"hello", u"he")
+        self.failUnless(ok is True)
+        ok = CFStringHasPrefix(u"hello", u"ge")
+        self.failUnless(ok is False)
+
+        ok = CFStringHasSuffix(u"hello", "lo")
+        self.failUnless(ok is True)
+
+        rng = CFStringGetRangeOfComposedCharactersAtIndex(
+                u"hello world", 5)
+        self.failUnless(isinstance(rng, CFRange))
+
+        found, rng = CFStringFindCharacterFromSet("hello  world",
+                CFCharacterSetGetPredefined(kCFCharacterSetWhitespace),
+                CFRange(0, 12), 0, None)
+        self.failUnless(found is True)
+        self.failUnless(isinstance(rng, CFRange))
+
+        lineBeginIndex, lineEndIndex, contentsEndIndex = CFStringGetLineBounds(
+                u"hello\n\nworld", CFRange(0, 12), None, None, None)
+        self.assertEquals(lineBeginIndex, 0)
+        self.assertEquals(lineEndIndex, 12)
+        self.assertEquals(contentsEndIndex, 12)
+
+        paraBeginIndex, paraEndIndex, contentsEndIndex = CFStringGetParagraphBounds(
+                u"hello\n\nworld", CFRange(0, 12), None, None, None)
+        self.assertEquals(paraBeginIndex, 0)
+        self.assertEquals(paraEndIndex, 12)
+        self.assertEquals(contentsEndIndex, 12)
+
+        result = CFStringCreateByCombiningStrings(None,
+                [u"hello", u"world"], "//")
+        self.assertEquals(result, u"hello//world")
+
+        result = CFStringCreateArrayBySeparatingStrings(None,
+                "hello world", " ")
+        self.assertEquals(result, ["hello", "world"])
+
+        v = CFStringGetIntValue(u"1000")
+        self.assertEquals(v, 1000)
+
+        v = CFStringGetDoubleValue(u"1000")
+        self.assertEquals(v, 1000.0)
+
+        v = CFStringGetDoubleValue(u"1000.5")
+        self.assertEquals(v, 1000.5)
+
+    def testMutableFunctions(self):
+        s = CFStringCreateMutable(None, 0)
+        # Ensure that we actually see updates:
+        s = s.nsstring()
+
+        CFStringAppendCharacters(s, u"hel", 3)
+        self.assertEquals(s, u"hel")
+
+        CFStringAppendCString(s, "lo world", kCFStringEncodingUTF8)
+        self.assertEquals(s, u"hello world")
+
+        CFStringAppendFormat(s, None, ": %s = %d", "x", 99)
+        self.assertEquals(s, u"hello world: x = 99")
+
+        self.failIf(hasattr(CoreFoundation, 'CFStringAppendFormatAndArguments'))
+
+        CFStringInsert(s, 2, "--")
+        self.assertEquals(s, u"he--llo world: x = 99")
+
+        CFStringDelete(s, CFRange(0, 8))
+        self.assertEquals(s, u"world: x = 99")
+
+        CFStringReplace(s, CFRange(0, 4), "WOR")
+        self.assertEquals(s, u"WORd: x = 99")
+
+        CFStringReplaceAll(s, "WHOOPS")
+        self.assertEquals(s, u"WHOOPS")
+
+        CFStringReplaceAll(s, u"BLAblaBLAblaBLA")
+        self.assertEquals(s, u"BLAblaBLAblaBLA")
+
+        CFStringFindAndReplace(s, "BL", " fo ", CFRange(0, 15), 0)
+        self.assertEquals(s, " fo Abla fo Abla fo A")
+
+        CFStringReplaceAll(s, u"abc")
+        CFStringPad(s, " ", 9, 0)
+        self.assertEquals(s, u"abc      ")
+
+        CFStringReplaceAll(s, u"abc")
+        CFStringPad(s, ". ", 9, 1)
+        self.assertEquals(s, u"abc . . .")
+
+        CFStringReplaceAll(s, u"abcdef")
+        CFStringPad(s, ". ", 3, 0)
+        self.assertEquals(s, u"abc")
+
+        CFStringReplaceAll(s, u"aHelloaaa")
+        CFStringTrim(s, u'a')
+        self.assertEquals(s, u"Hello")
+
+        CFStringReplaceAll(s, u"* * * *abc * ")
+        CFStringTrim(s, u'* ')
+        self.assertEquals(s, u"*abc ")
+        
+        
+        CFStringReplaceAll(s, u" \tHello world  \t ")
+        CFStringTrimWhitespace(s)
+        self.assertEquals(s, u"Hello world")
+
+
+        CFStringReplaceAll(s, u"AbC")
+        CFStringLowercase(s, CFLocaleCopyCurrent())
+        self.assertEquals(s, u'abc')
+
+        CFStringReplaceAll(s, u"AbC")
+        CFStringUppercase(s, CFLocaleCopyCurrent())
+        self.assertEquals(s, u'ABC')
+
+        CFStringReplaceAll(s, u"hello world")
+        CFStringCapitalize(s, CFLocaleCopyCurrent())
+        self.assertEquals(s, u'Hello World')
+
+        CFStringNormalize(s, kCFStringNormalizationFormKD)
+        self.assertEquals(s, u'Hello World')
+
+        CFStringFold(s, kCFCompareCaseInsensitive, CFLocaleCopyCurrent())
+        self.assertEquals(s, u'hello world')
+
+        CFStringReplaceAll(s, u"A C")
+        ok, rng = CFStringTransform(s, CFRange(0, 3), kCFStringTransformToXMLHex, 
+                                        False)
+        self.assertEquals(s, 'A C') 
+        self.failUnless(ok is True)
+        self.assertEquals(rng, CFRange(0, 3))
+
+    def testStringEncoding(self):
+        ok = CFStringIsEncodingAvailable(kCFStringEncodingUTF8)
+        self.failUnless(ok is True)
+
+        encodings = CFStringGetListOfAvailableEncodings()
+        self.failUnless(isinstance(encodings, objc.varlist))
+        for e in encodings:
+            if e == kCFStringEncodingInvalidId:
+                break
+            self.failUnless(isinstance(e, (int, long)))
+
+        s = CFStringGetNameOfEncoding(kCFStringEncodingUTF8)
+        self.assertEquals(s, 'Unicode (UTF-8)')
+
+        v = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8)
+        self.failUnless(isinstance(v, (int, long)))
+
+        t = CFStringConvertNSStringEncodingToEncoding(v)
+        self.assertEquals(t, kCFStringEncodingUTF8)
+
+        v = CFStringConvertEncodingToWindowsCodepage(kCFStringEncodingISOLatin1)
+        self.failUnless(isinstance(v, (int, long)))
+
+        t = CFStringConvertWindowsCodepageToEncoding(v)
+        self.assertEquals(t, kCFStringEncodingISOLatin1)
+
+        v = CFStringConvertEncodingToIANACharSetName(kCFStringEncodingUTF8)
+        self.failUnless(isinstance(v, unicode))
+        self.assertEquals(v, 'UTF-8')
+
+        t = CFStringConvertIANACharSetNameToEncoding(v)
+        self.assertEquals(t, kCFStringEncodingUTF8)
+
+        v = CFStringGetMostCompatibleMacStringEncoding(kCFStringEncodingWindowsLatin1)
+        self.assertEquals(v, kCFStringEncodingMacRoman)
+
+    
+
+        
+
+
+
+
+
+
+    def testNoInlineBuffer(self):
+        self.failIf(hasattr(CoreFoundation, 'CFStringInlineBuffer'))
+        self.failIf(hasattr(CoreFoundation, 'CFStringInitInlineBuffer'))
+        self.failIf(hasattr(CoreFoundation, 'CFStringGetCharacterFromInlineBuffer'))
 
 
     def testConstants(self):
@@ -58,7 +448,10 @@
         self.failUnless(isinstance(kCFStringTransformStripDiacritics, unicode))
 
 
-
+    def testNoPrivate(self):
+        self.failIf(hasattr(CoreFoundation, 'CFShow'))
+        self.failIf(hasattr(CoreFoundation, 'CFShowStr'))
+        self.failIf(hasattr(CoreFoundation, '__CFStringMakeConstantString'))
 
     def testCFSTR(self):
         v = CFSTR(u"hello")

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstringtokenizer.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstringtokenizer.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cfstringtokenizer.py	Tue Nov 18 09:52:31 2008
@@ -3,8 +3,44 @@
 
 
 class TestStringTokenizer (unittest.TestCase):
-    def testDummy(self):
-        self.fail("CFStringTokenizer tests not implemented yet")
+    def testFunctions(self):
+        s = u"Spring eens over een boom"
+        v = CFStringTokenizerCopyBestStringLanguage(s, (0, len(s)))
+        self.assertEquals(v, 'nl')
+
+        v = CFStringTokenizerGetTypeID()
+        self.failUnless(isinstance(v, (int, long)))
+
+        tok = CFStringTokenizerCreate(
+                None, s, (0, len(s)), kCFStringTokenizerUnitWord, 
+                CFLocaleCopyCurrent())
+        self.failUnless(isinstance(tok, CFStringTokenizerRef))
+
+        v = CFStringTokenizerGoToTokenAtIndex(tok, 2)
+        self.assertEquals(v, kCFStringTokenizerTokenNormal)
+
+        v = CFStringTokenizerGetCurrentTokenRange(tok)
+        self.assertEquals(v, CFRange(0, 6))
+
+        v = CFStringTokenizerAdvanceToNextToken(tok)
+        self.assertEquals(v, kCFStringTokenizerTokenNormal)
+
+        v = CFStringTokenizerGetCurrentTokenRange(tok)
+        self.assertEquals(v, CFRange(7, 4))
+
+        v = CFStringTokenizerCopyCurrentTokenAttribute(tok, kCFStringTokenizerAttributeLanguage)
+        self.failUnless(v is None)
+
+
+        s = u"A dog jumped over a log. And then some more."
+        CFStringTokenizerSetString(tok, s, (0, len(s)))
+
+        subref = []
+        idx, ranges = CFStringTokenizerGetCurrentSubTokens(tok, None, 20, subref)
+        self.assertEquals(idx, 0)
+        self.assertEquals(ranges, ())
+        self.assertEquals(subref, [])
+
 
 
     def testConstants(self):

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftimezone.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftimezone.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftimezone.py	Tue Nov 18 09:52:31 2008
@@ -1,9 +1,9 @@
-import unittest
+import unittest, time
 from CoreFoundation import *
-from Foundation import NSDictionary, NSString
+from Foundation import NSDictionary, NSString, NSMutableDictionary
 
 
-class TestTree (unittest.TestCase):
+class TestTimeZone (unittest.TestCase):
     def testTypeID(self):
         id = CFTimeZoneGetTypeID()
         self.failUnless(isinstance(id, (int, long)))
@@ -36,9 +36,14 @@
             self.failUnless( isinstance(key, unicode) )
             self.failUnless( isinstance(value, unicode) )
 
-        newmap = NSDictionary.dictionaryWithDictionary_({
-                NSString.stringWithString_('AAA'):
-                    NSString.stringWithString_('Europe/Amsterdam')})
+        #newmap = NSDictionary.dictionaryWithDictionary_({
+                #NSString.stringWithString_('AAA'):
+                    #NSString.stringWithString_('Europe/Amsterdam')})
+
+        newmap = NSMutableDictionary.dictionaryWithDictionary_(map)
+        newmap[u'AAA'] = u'Europe/Amsterdam'
+        newmap = newmap.copy()
+
         v = CFTimeZoneSetAbbreviationDictionary(newmap)
         self.failUnless(v is None)
 
@@ -50,8 +55,66 @@
         finally:
             CFTimeZoneSetAbbreviationDictionary(map)
 
-    def testDummy(self):
-        self.fail("CFTimeZone tests are incomplete (start at CFTimeZoneCreate)")
+    def testZoneObject(self):
+        data = open('/usr/share/zoneinfo/posixrules', 'r').read()
+        data = buffer(data)
+        zone = CFTimeZoneCreate(None, u"Europe/Amsterdam", data)
+        self.failUnless(isinstance(zone, CFTimeZoneRef))
+
+        zone = CFTimeZoneCreateWithTimeIntervalFromGMT(None, 3600)
+        self.failUnless(isinstance(zone, CFTimeZoneRef))
+
+        offset = CFTimeZoneGetSecondsFromGMT(zone, time.time())
+        self.assertEquals(offset, 3600)
+
+        zone = CFTimeZoneCreateWithName(None, "Europe/Amsterdam", True)
+        self.failUnless(isinstance(zone, CFTimeZoneRef))
+
+        name = CFTimeZoneGetName(zone)
+        self.assertEquals(name, u"Europe/Amsterdam")
+
+        data = CFTimeZoneGetData(zone)
+        self.failUnless(isinstance(data, CFDataRef))
+
+        abbrev = CFTimeZoneCopyAbbreviation(zone, time.time())
+        self.failUnless(isinstance(abbrev, unicode))
+
+        dt = CFGregorianDate(
+                year = 2008,
+                month = 7,
+                day = 1,
+                hour = 12,
+                minute = 0,
+                second = 0)
+
+        r = CFTimeZoneIsDaylightSavingTime(zone, 
+                CFGregorianDateGetAbsoluteTime(dt, zone))
+        self.failUnless(r is True)
+
+        dt = CFGregorianDate(
+                year = 2008,
+                month = 11,
+                day = 1,
+                hour = 12,
+                minute = 0,
+                second = 0)
+
+        r = CFTimeZoneIsDaylightSavingTime(zone, 
+                CFGregorianDateGetAbsoluteTime(dt, zone))
+        self.failUnless(r is False)
+
+        offset = CFTimeZoneGetDaylightSavingTimeOffset(zone, 
+                CFGregorianDateGetAbsoluteTime(dt, zone))
+        self.failUnless(isinstance(offset, float))
+
+        dt = CFTimeZoneGetNextDaylightSavingTimeTransition(
+                zone, CFGregorianDateGetAbsoluteTime(dt, zone))
+        self.failUnless(isinstance(dt, float))
+
+        nm = CFTimeZoneCopyLocalizedName(zone, 
+                kCFTimeZoneNameStyleShortStandard, CFLocaleCopyCurrent())
+        self.failUnless(isinstance(nm, unicode))
+
 
 
     def testConstants(self):

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftree.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftree.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/PyObjCTest/test_cftree.py	Tue Nov 18 09:52:31 2008
@@ -2,9 +2,6 @@
 import unittest
 
 class TestCFTree (unittest.TestCase):
-    def testDummy(self):
-        self.fail("CFTree tests are not yet complete")
-
     def testCreation(self):
         context = object()
         tree = CFTreeCreate(None, context)
@@ -32,6 +29,107 @@
         self.assertEquals(CFTreeGetContext(CFTreeGetFirstChild(root)), 9)
 
 
+    def testTypeID(self):
+        v = CFTreeGetTypeID()
+        self.failUnless(isinstance(v, (int, long)))
+
+    def testQuerying(self):
+        root = CFTreeCreate(None, "root")
+
+        for child in range(2):
+            CFTreeAppendChild(root, CFTreeCreate(None, child))
+
+        p = CFTreeGetParent(root)
+        self.failUnless(p is None)
+
+        c = CFTreeGetFirstChild(root)
+        self.failUnless(isinstance(c, CFTreeRef))
+        c2 = CFTreeGetChildAtIndex(root, 0)
+        self.failUnless(c is c2)
+
+        p = CFTreeGetParent(c)
+        self.failUnless(p is root)
+
+        s = CFTreeGetNextSibling(c)
+        self.failUnless(isinstance(s, CFTreeRef))
+        p = CFTreeGetParent(s)
+        self.failUnless(p is root)
+        s2 = CFTreeGetChildAtIndex(root, 1)
+        self.failUnless(s is s2)
+
+        s = CFTreeGetNextSibling(s)
+        self.failUnless(s is None)
+
+        cnt = CFTreeGetChildCount(root)
+        self.assertEquals(cnt, 2)
+
+        cnt = CFTreeGetChildCount(c)
+        self.assertEquals(cnt, 0)
+
+        children = CFTreeGetChildren(root, None)
+        self.failUnless(isinstance(children, (list, tuple)))
+        self.assertEquals(len(children), 2)
+
+        r = CFTreeFindRoot(s2)
+        self.failUnless(r is root)
+
+    def testModification(self):
+        root = CFTreeCreate(None, "root")
+
+        for child in range(2):
+            CFTreeAppendChild(root, CFTreeCreate(None, child))
+
+        def applyFunc(node, context):
+            context.append(CFTreeGetContext(node))
+
+        l = []
+        CFTreeApplyFunctionToChildren(root, applyFunc, l)
+        self.assertEquals(len(l), 2)
+
+        preChild = CFTreeCreate(None, "before")
+        postChild = CFTreeCreate(None, "after")
+        CFTreePrependChild(root, preChild)
+        CFTreeAppendChild(root, postChild)
+
+        self.assertEquals(CFTreeGetChildCount(root), 4)
+        n = CFTreeGetChildAtIndex(root, 0)
+        self.failUnless(n is preChild)
+        n = CFTreeGetChildAtIndex(root, 3)
+        self.failUnless(n is postChild)
+
+        s = CFTreeCreate(None, "sibling")
+        CFTreeInsertSibling(preChild, s)
+        n = CFTreeGetChildAtIndex(root, 1)
+        self.failUnless(n is s)
+        self.assertEquals(CFTreeGetChildCount(root), 5)
+
+        CFTreeRemove(s)
+        self.assertEquals(CFTreeGetChildCount(root), 4)
+
+        def compare(left, right, context):
+            left = CFTreeGetContext(left)
+            right = CFTreeGetContext(right)
+            return -cmp(left, right)
+
+        before = []
+        after = []
+        CFTreeApplyFunctionToChildren(root, applyFunc, before)
+        CFTreeSortChildren(root, compare, None)
+        CFTreeApplyFunctionToChildren(root, applyFunc, after)
+
+        before.sort()
+        before.reverse()
+        self.assertEquals(before, after)
+
+        CFTreeRemoveAllChildren(root)
+        self.assertEquals(CFTreeGetChildCount(root), 0)
+
+
+
+
+
+
+
 
 if __name__ == "__main__":
     unittest.main()

Modified: trunk/pyobjc/pyobjc-framework-Cocoa/setup.py
==============================================================================
--- trunk/pyobjc/pyobjc-framework-Cocoa/setup.py	(original)
+++ trunk/pyobjc/pyobjc-framework-Cocoa/setup.py	Tue Nov 18 09:52:31 2008
@@ -118,6 +118,10 @@
                 [ 'Modules/_CoreFoundation_CFSet.m' ],
                 extra_compile_args=CFLAGS,
                 extra_link_args=['-framework', 'CoreFoundation']),
+        Extension('CoreFoundation._CFSocket', 
+                [ 'Modules/_CoreFoundation_CFSocket.m' ],
+                extra_compile_args=CFLAGS,
+                extra_link_args=['-framework', 'CoreFoundation']),
         Extension('CoreFoundation._CFWriteStream', 
                 [ 'Modules/_CoreFoundation_CFWriteStream.m' ],
                 extra_compile_args=CFLAGS,
@@ -126,6 +130,10 @@
                 [ 'Modules/_CoreFoundation_CFRunLoopObserver.m' ],
                 extra_compile_args=CFLAGS,
                 extra_link_args=['-framework', 'CoreFoundation']),
+        Extension('CoreFoundation._CFRunLoopSource', 
+                [ 'Modules/_CoreFoundation_CFRunLoopSource.m' ],
+                extra_compile_args=CFLAGS,
+                extra_link_args=['-framework', 'CoreFoundation']),
         Extension('CoreFoundation._CFRunLoopTimer', 
                 [ 'Modules/_CoreFoundation_CFRunLoopTimer.m' ],
                 extra_compile_args=CFLAGS,

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.