[PyObjC-svn] r2024 - in trunk/pyobjc/pyobjc-framework-Cocoa: . Doc Examples/AppKit/ClassBrowser Examples/Inject/InjectBrowser Exceptions Lib/CoreFoundation Modules PyObjCTest
[email protected] Tue, 18 Nov 2008 09:52:31 -0600
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=/