cocoa 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -0
  3. data/VERSION +1 -1
  4. data/cocoa.gemspec +11 -5
  5. data/examples/table_view.rb +72 -0
  6. data/lib/cocoa/bindings/CAConstraint.rb +2 -2
  7. data/lib/cocoa/bindings/CALayer.rb +6 -6
  8. data/lib/cocoa/bindings/CAMediaTimingFunction.rb +1 -1
  9. data/lib/cocoa/bindings/CAOpenGLLayer.rb +2 -2
  10. data/lib/cocoa/bindings/CARenderer.rb +2 -2
  11. data/lib/cocoa/bindings/CATransaction.rb +1 -1
  12. data/lib/cocoa/bindings/CIImage.rb +2 -2
  13. data/lib/cocoa/bindings/NSATSTypesetter.rb +21 -21
  14. data/lib/cocoa/bindings/NSAffineTransform.rb +2 -2
  15. data/lib/cocoa/bindings/NSAlert.rb +2 -2
  16. data/lib/cocoa/bindings/NSAnimation.rb +3 -3
  17. data/lib/cocoa/bindings/NSAnimationContext.rb +1 -1
  18. data/lib/cocoa/bindings/NSAppleEventDescriptor.rb +8 -8
  19. data/lib/cocoa/bindings/NSAppleEventManager.rb +3 -3
  20. data/lib/cocoa/bindings/NSAppleScript.rb +2 -2
  21. data/lib/cocoa/bindings/NSApplication.rb +19 -19
  22. data/lib/cocoa/bindings/NSArchiver.rb +3 -3
  23. data/lib/cocoa/bindings/NSArray.rb +21 -21
  24. data/lib/cocoa/bindings/NSArrayController.rb +2 -2
  25. data/lib/cocoa/bindings/NSAssertionHandler.rb +2 -2
  26. data/lib/cocoa/bindings/NSAttributedString.rb +29 -29
  27. data/lib/cocoa/bindings/NSBezierPath.rb +15 -15
  28. data/lib/cocoa/bindings/NSBitmapImageRep.rb +16 -16
  29. data/lib/cocoa/bindings/NSBrowser.rb +16 -16
  30. data/lib/cocoa/bindings/NSBundle.rb +14 -14
  31. data/lib/cocoa/bindings/NSButton.rb +2 -2
  32. data/lib/cocoa/bindings/NSButtonCell.rb +6 -6
  33. data/lib/cocoa/bindings/NSByteCountFormatter.rb +1 -1
  34. data/lib/cocoa/bindings/NSCache.rb +1 -1
  35. data/lib/cocoa/bindings/NSCachedImageRep.rb +2 -2
  36. data/lib/cocoa/bindings/NSCachedURLResponse.rb +1 -1
  37. data/lib/cocoa/bindings/NSCalendar.rb +4 -4
  38. data/lib/cocoa/bindings/NSCalendarDate.rb +7 -7
  39. data/lib/cocoa/bindings/NSCell.rb +21 -21
  40. data/lib/cocoa/bindings/NSClassDescription.rb +1 -1
  41. data/lib/cocoa/bindings/NSCoder.rb +20 -20
  42. data/lib/cocoa/bindings/NSCollectionView.rb +3 -3
  43. data/lib/cocoa/bindings/NSColor.rb +17 -17
  44. data/lib/cocoa/bindings/NSColorList.rb +3 -3
  45. data/lib/cocoa/bindings/NSColorPanel.rb +1 -1
  46. data/lib/cocoa/bindings/NSColorPicker.rb +2 -2
  47. data/lib/cocoa/bindings/NSComboBox.rb +1 -1
  48. data/lib/cocoa/bindings/NSComboBoxCell.rb +1 -1
  49. data/lib/cocoa/bindings/NSComparisonPredicate.rb +2 -2
  50. data/lib/cocoa/bindings/NSCompoundPredicate.rb +1 -1
  51. data/lib/cocoa/bindings/NSConditionLock.rb +1 -1
  52. data/lib/cocoa/bindings/NSConnection.rb +6 -6
  53. data/lib/cocoa/bindings/NSControl.rb +2 -2
  54. data/lib/cocoa/bindings/NSController.rb +1 -1
  55. data/lib/cocoa/bindings/NSCursor.rb +1 -1
  56. data/lib/cocoa/bindings/NSCustomImageRep.rb +2 -2
  57. data/lib/cocoa/bindings/NSData.rb +12 -12
  58. data/lib/cocoa/bindings/NSDataDetector.rb +2 -2
  59. data/lib/cocoa/bindings/NSDate.rb +5 -5
  60. data/lib/cocoa/bindings/NSDateFormatter.rb +4 -4
  61. data/lib/cocoa/bindings/NSDecimalNumber.rb +10 -10
  62. data/lib/cocoa/bindings/NSDecimalNumberHandler.rb +2 -2
  63. data/lib/cocoa/bindings/NSDictionary.rb +12 -12
  64. data/lib/cocoa/bindings/NSDistantObject.rb +4 -4
  65. data/lib/cocoa/bindings/NSDistributedNotificationCenter.rb +3 -3
  66. data/lib/cocoa/bindings/NSDocument.rb +41 -41
  67. data/lib/cocoa/bindings/NSDocumentController.rb +16 -16
  68. data/lib/cocoa/bindings/NSDraggingItem.rb +1 -1
  69. data/lib/cocoa/bindings/NSDraggingSession.rb +1 -1
  70. data/lib/cocoa/bindings/NSDrawer.rb +1 -1
  71. data/lib/cocoa/bindings/NSError.rb +2 -2
  72. data/lib/cocoa/bindings/NSEvent.rb +9 -9
  73. data/lib/cocoa/bindings/NSException.rb +3 -3
  74. data/lib/cocoa/bindings/NSExpression.rb +8 -8
  75. data/lib/cocoa/bindings/NSFileCoordinator.rb +4 -4
  76. data/lib/cocoa/bindings/NSFileHandle.rb +4 -4
  77. data/lib/cocoa/bindings/NSFileManager.rb +39 -39
  78. data/lib/cocoa/bindings/NSFileVersion.rb +4 -4
  79. data/lib/cocoa/bindings/NSFileWrapper.rb +6 -6
  80. data/lib/cocoa/bindings/NSFont.rb +4 -4
  81. data/lib/cocoa/bindings/NSFontCollection.rb +5 -5
  82. data/lib/cocoa/bindings/NSFontDescriptor.rb +1 -1
  83. data/lib/cocoa/bindings/NSFontManager.rb +10 -10
  84. data/lib/cocoa/bindings/NSFontPanel.rb +1 -1
  85. data/lib/cocoa/bindings/NSForm.rb +1 -1
  86. data/lib/cocoa/bindings/NSFormatter.rb +3 -3
  87. data/lib/cocoa/bindings/NSGlyphGenerator.rb +1 -1
  88. data/lib/cocoa/bindings/NSGlyphInfo.rb +3 -3
  89. data/lib/cocoa/bindings/NSGradient.rb +7 -7
  90. data/lib/cocoa/bindings/NSGraphicsContext.rb +1 -1
  91. data/lib/cocoa/bindings/NSHTTPCookie.rb +1 -1
  92. data/lib/cocoa/bindings/NSHTTPCookieStorage.rb +1 -1
  93. data/lib/cocoa/bindings/NSHTTPURLResponse.rb +1 -1
  94. data/lib/cocoa/bindings/NSHashTable.rb +2 -2
  95. data/lib/cocoa/bindings/NSHelpManager.rb +4 -4
  96. data/lib/cocoa/bindings/NSImage.rb +11 -11
  97. data/lib/cocoa/bindings/NSImageRep.rb +2 -2
  98. data/lib/cocoa/bindings/NSIndexPath.rb +2 -2
  99. data/lib/cocoa/bindings/NSIndexSet.rb +9 -9
  100. data/lib/cocoa/bindings/NSIndexSpecifier.rb +1 -1
  101. data/lib/cocoa/bindings/NSInputManager.rb +2 -2
  102. data/lib/cocoa/bindings/NSInputServer.rb +1 -1
  103. data/lib/cocoa/bindings/NSInputStream.rb +2 -2
  104. data/lib/cocoa/bindings/NSInvocation.rb +2 -2
  105. data/lib/cocoa/bindings/NSInvocationOperation.rb +1 -1
  106. data/lib/cocoa/bindings/NSJSONSerialization.rb +4 -4
  107. data/lib/cocoa/bindings/NSKeyedArchiver.rb +12 -12
  108. data/lib/cocoa/bindings/NSKeyedUnarchiver.rb +3 -3
  109. data/lib/cocoa/bindings/NSLayoutConstraint.rb +2 -2
  110. data/lib/cocoa/bindings/NSLayoutManager.rb +59 -59
  111. data/lib/cocoa/bindings/NSLinguisticTagger.rb +8 -8
  112. data/lib/cocoa/bindings/NSLocale.rb +1 -1
  113. data/lib/cocoa/bindings/NSMachBootstrapServer.rb +2 -2
  114. data/lib/cocoa/bindings/NSMachPort.rb +4 -4
  115. data/lib/cocoa/bindings/NSMapTable.rb +4 -4
  116. data/lib/cocoa/bindings/NSMatrix.rb +20 -20
  117. data/lib/cocoa/bindings/NSMenu.rb +7 -7
  118. data/lib/cocoa/bindings/NSMenuItem.rb +1 -1
  119. data/lib/cocoa/bindings/NSMenuItemCell.rb +6 -6
  120. data/lib/cocoa/bindings/NSMessagePortNameServer.rb +1 -1
  121. data/lib/cocoa/bindings/NSMetadataQuery.rb +1 -1
  122. data/lib/cocoa/bindings/NSMutableArray.rb +12 -12
  123. data/lib/cocoa/bindings/NSMutableAttributedString.rb +11 -11
  124. data/lib/cocoa/bindings/NSMutableData.rb +2 -2
  125. data/lib/cocoa/bindings/NSMutableDictionary.rb +2 -2
  126. data/lib/cocoa/bindings/NSMutableIndexSet.rb +1 -1
  127. data/lib/cocoa/bindings/NSMutableOrderedSet.rb +11 -11
  128. data/lib/cocoa/bindings/NSMutableString.rb +3 -3
  129. data/lib/cocoa/bindings/NSMutableURLRequest.rb +2 -2
  130. data/lib/cocoa/bindings/NSNameSpecifier.rb +1 -1
  131. data/lib/cocoa/bindings/NSNetService.rb +4 -4
  132. data/lib/cocoa/bindings/NSNetServiceBrowser.rb +3 -3
  133. data/lib/cocoa/bindings/NSNib.rb +4 -4
  134. data/lib/cocoa/bindings/NSNibConnector.rb +1 -1
  135. data/lib/cocoa/bindings/NSNotification.rb +1 -1
  136. data/lib/cocoa/bindings/NSNotificationCenter.rb +4 -4
  137. data/lib/cocoa/bindings/NSNotificationQueue.rb +2 -2
  138. data/lib/cocoa/bindings/NSNumberFormatter.rb +2 -2
  139. data/lib/cocoa/bindings/NSObject.rb +142 -142
  140. data/lib/cocoa/bindings/NSObjectController.rb +1 -1
  141. data/lib/cocoa/bindings/NSOpenGLContext.rb +8 -8
  142. data/lib/cocoa/bindings/NSOpenGLLayer.rb +2 -2
  143. data/lib/cocoa/bindings/NSOpenGLPixelBuffer.rb +1 -1
  144. data/lib/cocoa/bindings/NSOpenGLPixelFormat.rb +1 -1
  145. data/lib/cocoa/bindings/NSOpenGLView.rb +1 -1
  146. data/lib/cocoa/bindings/NSOpenPanel.rb +3 -3
  147. data/lib/cocoa/bindings/NSOperationQueue.rb +1 -1
  148. data/lib/cocoa/bindings/NSOrderedSet.rb +21 -21
  149. data/lib/cocoa/bindings/NSOrthography.rb +2 -2
  150. data/lib/cocoa/bindings/NSOutlineView.rb +7 -7
  151. data/lib/cocoa/bindings/NSOutputStream.rb +7 -7
  152. data/lib/cocoa/bindings/NSPageLayout.rb +1 -1
  153. data/lib/cocoa/bindings/NSPasteboard.rb +9 -9
  154. data/lib/cocoa/bindings/NSPasteboardItem.rb +4 -4
  155. data/lib/cocoa/bindings/NSPathCell.rb +4 -4
  156. data/lib/cocoa/bindings/NSPathControl.rb +1 -1
  157. data/lib/cocoa/bindings/NSPersistentDocument.rb +4 -4
  158. data/lib/cocoa/bindings/NSPointerArray.rb +2 -2
  159. data/lib/cocoa/bindings/NSPopUpButton.rb +3 -3
  160. data/lib/cocoa/bindings/NSPopUpButtonCell.rb +5 -5
  161. data/lib/cocoa/bindings/NSPopover.rb +1 -1
  162. data/lib/cocoa/bindings/NSPort.rb +5 -5
  163. data/lib/cocoa/bindings/NSPortCoder.rb +2 -2
  164. data/lib/cocoa/bindings/NSPortMessage.rb +1 -1
  165. data/lib/cocoa/bindings/NSPortNameServer.rb +2 -2
  166. data/lib/cocoa/bindings/NSPositionalSpecifier.rb +1 -1
  167. data/lib/cocoa/bindings/NSPredicate.rb +2 -2
  168. data/lib/cocoa/bindings/NSPredicateEditorRowTemplate.rb +2 -2
  169. data/lib/cocoa/bindings/NSPrintOperation.rb +4 -4
  170. data/lib/cocoa/bindings/NSPrintPanel.rb +1 -1
  171. data/lib/cocoa/bindings/NSPrinter.rb +9 -9
  172. data/lib/cocoa/bindings/NSPropertyListSerialization.rb +7 -7
  173. data/lib/cocoa/bindings/NSProtocolChecker.rb +2 -2
  174. data/lib/cocoa/bindings/NSRangeSpecifier.rb +1 -1
  175. data/lib/cocoa/bindings/NSRegularExpression.rb +10 -10
  176. data/lib/cocoa/bindings/NSRelativeSpecifier.rb +1 -1
  177. data/lib/cocoa/bindings/NSResponder.rb +5 -5
  178. data/lib/cocoa/bindings/NSRuleEditor.rb +4 -4
  179. data/lib/cocoa/bindings/NSRulerMarker.rb +2 -2
  180. data/lib/cocoa/bindings/NSRulerView.rb +4 -4
  181. data/lib/cocoa/bindings/NSRunLoop.rb +7 -7
  182. data/lib/cocoa/bindings/NSSavePanel.rb +3 -3
  183. data/lib/cocoa/bindings/NSScanner.rb +4 -4
  184. data/lib/cocoa/bindings/NSScreen.rb +1 -1
  185. data/lib/cocoa/bindings/NSScriptClassDescription.rb +1 -1
  186. data/lib/cocoa/bindings/NSScriptCoercionHandler.rb +2 -2
  187. data/lib/cocoa/bindings/NSScriptCommandDescription.rb +1 -1
  188. data/lib/cocoa/bindings/NSScriptObjectSpecifier.rb +3 -3
  189. data/lib/cocoa/bindings/NSScriptSuiteRegistry.rb +2 -2
  190. data/lib/cocoa/bindings/NSScrollView.rb +3 -3
  191. data/lib/cocoa/bindings/NSScroller.rb +4 -4
  192. data/lib/cocoa/bindings/NSSegmentedCell.rb +10 -10
  193. data/lib/cocoa/bindings/NSSegmentedControl.rb +7 -7
  194. data/lib/cocoa/bindings/NSSet.rb +9 -9
  195. data/lib/cocoa/bindings/NSSharingService.rb +1 -1
  196. data/lib/cocoa/bindings/NSSharingServicePicker.rb +1 -1
  197. data/lib/cocoa/bindings/NSSliderCell.rb +1 -1
  198. data/lib/cocoa/bindings/NSSocketPort.rb +3 -3
  199. data/lib/cocoa/bindings/NSSocketPortNameServer.rb +2 -2
  200. data/lib/cocoa/bindings/NSSortDescriptor.rb +3 -3
  201. data/lib/cocoa/bindings/NSSound.rb +2 -2
  202. data/lib/cocoa/bindings/NSSpecifierTest.rb +1 -1
  203. data/lib/cocoa/bindings/NSSpeechSynthesizer.rb +3 -3
  204. data/lib/cocoa/bindings/NSSpellChecker.rb +15 -15
  205. data/lib/cocoa/bindings/NSSpellServer.rb +2 -2
  206. data/lib/cocoa/bindings/NSSplitView.rb +2 -2
  207. data/lib/cocoa/bindings/NSStatusItem.rb +1 -1
  208. data/lib/cocoa/bindings/NSStream.rb +4 -4
  209. data/lib/cocoa/bindings/NSString.rb +39 -39
  210. data/lib/cocoa/bindings/NSTabView.rb +1 -1
  211. data/lib/cocoa/bindings/NSTabViewItem.rb +1 -1
  212. data/lib/cocoa/bindings/NSTableHeaderCell.rb +1 -1
  213. data/lib/cocoa/bindings/NSTableView.rb +25 -25
  214. data/lib/cocoa/bindings/NSTask.rb +1 -1
  215. data/lib/cocoa/bindings/NSText.rb +4 -4
  216. data/lib/cocoa/bindings/NSTextAlternatives.rb +1 -1
  217. data/lib/cocoa/bindings/NSTextBlock.rb +9 -9
  218. data/lib/cocoa/bindings/NSTextCheckingResult.rb +12 -12
  219. data/lib/cocoa/bindings/NSTextContainer.rb +1 -1
  220. data/lib/cocoa/bindings/NSTextList.rb +1 -1
  221. data/lib/cocoa/bindings/NSTextStorage.rb +1 -1
  222. data/lib/cocoa/bindings/NSTextTab.rb +2 -2
  223. data/lib/cocoa/bindings/NSTextTable.rb +3 -3
  224. data/lib/cocoa/bindings/NSTextTableBlock.rb +1 -1
  225. data/lib/cocoa/bindings/NSTextView.rb +27 -27
  226. data/lib/cocoa/bindings/NSThread.rb +2 -2
  227. data/lib/cocoa/bindings/NSTimeZone.rb +3 -3
  228. data/lib/cocoa/bindings/NSTimer.rb +3 -3
  229. data/lib/cocoa/bindings/NSToolbar.rb +1 -1
  230. data/lib/cocoa/bindings/NSTrackingArea.rb +1 -1
  231. data/lib/cocoa/bindings/NSTreeController.rb +4 -4
  232. data/lib/cocoa/bindings/NSTreeNode.rb +1 -1
  233. data/lib/cocoa/bindings/NSTypesetter.rb +24 -24
  234. data/lib/cocoa/bindings/NSURL.rb +18 -18
  235. data/lib/cocoa/bindings/NSURLAuthenticationChallenge.rb +2 -2
  236. data/lib/cocoa/bindings/NSURLCache.rb +2 -2
  237. data/lib/cocoa/bindings/NSURLConnection.rb +6 -6
  238. data/lib/cocoa/bindings/NSURLCredential.rb +4 -4
  239. data/lib/cocoa/bindings/NSURLCredentialStorage.rb +3 -3
  240. data/lib/cocoa/bindings/NSURLDownload.rb +3 -3
  241. data/lib/cocoa/bindings/NSURLHandle.rb +3 -3
  242. data/lib/cocoa/bindings/NSURLProtectionSpace.rb +2 -2
  243. data/lib/cocoa/bindings/NSURLProtocol.rb +5 -5
  244. data/lib/cocoa/bindings/NSURLRequest.rb +2 -2
  245. data/lib/cocoa/bindings/NSURLResponse.rb +1 -1
  246. data/lib/cocoa/bindings/NSUbiquitousKeyValueStore.rb +8 -8
  247. data/lib/cocoa/bindings/NSUnarchiver.rb +3 -3
  248. data/lib/cocoa/bindings/NSUndoManager.rb +1 -1
  249. data/lib/cocoa/bindings/NSUniqueIDSpecifier.rb +1 -1
  250. data/lib/cocoa/bindings/NSUserAppleScriptTask.rb +1 -1
  251. data/lib/cocoa/bindings/NSUserAutomatorTask.rb +1 -1
  252. data/lib/cocoa/bindings/NSUserDefaults.rb +9 -9
  253. data/lib/cocoa/bindings/NSUserDefaultsController.rb +1 -1
  254. data/lib/cocoa/bindings/NSUserScriptTask.rb +1 -1
  255. data/lib/cocoa/bindings/NSUserUnixTask.rb +1 -1
  256. data/lib/cocoa/bindings/NSValue.rb +3 -3
  257. data/lib/cocoa/bindings/NSValueTransformer.rb +1 -1
  258. data/lib/cocoa/bindings/NSView.rb +34 -34
  259. data/lib/cocoa/bindings/NSViewController.rb +2 -2
  260. data/lib/cocoa/bindings/NSWhoseSpecifier.rb +1 -1
  261. data/lib/cocoa/bindings/NSWindow.rb +22 -22
  262. data/lib/cocoa/bindings/NSWindowController.rb +2 -2
  263. data/lib/cocoa/bindings/NSWorkspace.rb +18 -18
  264. data/lib/cocoa/bindings/NSXMLDTD.rb +6 -6
  265. data/lib/cocoa/bindings/NSXMLDocument.rb +9 -9
  266. data/lib/cocoa/bindings/NSXMLElement.rb +7 -7
  267. data/lib/cocoa/bindings/NSXMLNode.rb +8 -8
  268. data/lib/cocoa/bindings/NSXPCConnection.rb +1 -1
  269. data/lib/cocoa/bindings/NSXPCInterface.rb +4 -4
  270. data/lib/cocoa/extensions.rb +7 -4
  271. data/lib/cocoa/helpers.rb +99 -179
  272. data/lib/cocoa/objc.rb +63 -217
  273. data/lib/cocoa/objc/method_def.rb +314 -0
  274. data/lib/cocoa/structs/NSRange.rb +3 -0
  275. data/lib/cocoa/structs/NSRect.rb +3 -0
  276. data/spec/cocoa/cocoa_spec.rb +99 -0
  277. data/spec/spec_helper.rb +1 -0
  278. data/tasks/generate.rake +6 -4
  279. metadata +37 -37
@@ -1,22 +1,28 @@
1
+
2
+ require 'cocoa/objc/method_def'
3
+
1
4
  module ObjC
2
5
  extend FFI::Library
3
6
 
4
7
  ffi_lib 'objc'
5
8
 
6
9
  attach_function :sel_registerName, [:string], :pointer
7
- attach_function :objc_msgSend, [:pointer, :pointer, :varargs], :pointer
8
10
  attach_function :objc_getClass, [:string], :pointer
9
11
  attach_function :objc_allocateClassPair, [:pointer, :string, :int], :pointer
10
12
  attach_function :objc_registerClassPair, [:pointer], :void
11
13
 
12
- def self.msgSend( id, selector, *args )
13
- selector = sel_registerName(selector) if selector.is_a? String
14
- objc_msgSend( id, selector, *args )
14
+ MethodDef::TYPES.values.uniq.each do |type|
15
+ name = "objc_msgSend_#{type}".to_sym
16
+ attach_function name, :objc_msgSend, [:pointer, :pointer, :varargs], type
17
+ define_singleton_method "msgSend_#{type}".to_sym do |id, selector, *args|
18
+ selector = sel_registerName(selector) if selector.is_a? String
19
+ send(name, id, selector, *args )
20
+ end
15
21
  end
16
22
 
17
23
  def self.msgSend_stret( return_type, id, selector, *args )
18
24
  selector = sel_registerName(selector) if selector.is_a? String
19
- method = "objc_msgSend_stret_for_#{return_type.name.underscore}".to_sym
25
+ method = "objc_msgSend_stret_for_#{return_type.name.underscore.gsub('/','_')}".to_sym
20
26
  unless respond_to? method
21
27
  attach_function method, :objc_msgSend_stret, [:pointer, :pointer, :varargs], return_type.by_value
22
28
  end
@@ -25,11 +31,11 @@ module ObjC
25
31
 
26
32
  def self.String_to_NSString( string )
27
33
  nsstring_class = objc_getClass("NSString")
28
- msgSend(nsstring_class, "stringWithUTF8String:", :string, string )
34
+ msgSend_pointer(nsstring_class, "stringWithUTF8String:", :string, string )
29
35
  end
30
36
 
31
37
  def self.NSString_to_String( nsstring_pointer )
32
- c_string = msgSend( nsstring_pointer, "UTF8String")
38
+ c_string = msgSend_pointer( nsstring_pointer, "UTF8String")
33
39
  if c_string.null?
34
40
  return "(NULL)"
35
41
  else
@@ -37,172 +43,73 @@ module ObjC
37
43
  end
38
44
  end
39
45
 
46
+ def self.smart_constantize ret,klass_name
47
+ begin
48
+ Cocoa.const_get(klass_name)
49
+ rescue
50
+ _superclass = ObjC.msgSend_pointer(ret,'superclass')
51
+ superclass_name = ObjC::NSString_to_String(Cocoa::NSStringFromClass(_superclass))
52
+ superclass_name = if superclass_name =~ /^__NSCF/
53
+ "NS#{klass_name[6..-1]}"
54
+ elsif superclass_name[0]=='_'
55
+ if superklass = Cocoa::const_get(NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend_pointer(ret,"superclass"))))
56
+ superklass.name.split('::').last
57
+ else
58
+ "FIX_#{superclass_name}"
59
+ end
60
+ else
61
+ superclass_name
62
+ end
63
+ superclass = Cocoa::const_get(superclass_name) rescue smart_constantize(_superclass,superclass_name)
64
+ proxy = Class.new(superclass)
65
+ Cocoa.const_set(klass_name, proxy)
66
+ klass = Cocoa.const_get(klass_name)
67
+ superclass.inherited(klass)
68
+ klass
69
+ end
70
+ end
71
+
40
72
  def self.object_to_instance ret
41
- klass_name = NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend(ret,"class")))
73
+ klass_name = NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend_pointer(ret,"class")))
42
74
  return self if klass_name == '(NULL)'
43
75
  instance = begin
44
- ("Cocoa::"+klass_name).constantize.new(true)
76
+ Cocoa::const_get(klass_name).new(true)
45
77
  rescue
46
78
  klass_name = if klass_name =~ /^__NSCF/
47
79
  "NS#{klass_name[6..-1]}"
48
80
  elsif klass_name[0]=='_'
49
- "FIX_#{klass_name}"
81
+ if superklass = Cocoa::const_get(NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend_pointer(ret,"superclass"))))
82
+ superklass.name.split('::').last
83
+ else
84
+ "FIX_#{klass_name}"
85
+ end
50
86
  else
51
87
  klass_name
52
88
  end
53
- klass = begin
54
- Cocoa.const_get(klass_name)
55
- rescue => e
56
- superclass_name = NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend(ret,'superclass')))
57
- superclass = "Cocoa::#{superclass_name}".constantize
58
- proxy = Class.new(superclass)
59
- Cocoa.const_set(klass_name, proxy)
60
- klass = ("Cocoa::"+klass_name).constantize
61
- superclass.inherited(klass)
62
- klass
63
- end
89
+ klass = smart_constantize(ret,klass_name)
64
90
  klass.new(true)
65
91
  end
66
92
  instance.object = ret
67
93
  instance
68
94
  end
69
95
 
70
- def self.translate_retval method,ret,type
96
+ def self.ffi_to_ruby_value method,ffi_value,type
71
97
  case type
72
98
  when '@'
73
- return nil if ret.address == 0
74
- return ret if method == :NSStringFromClass
75
- object_to_instance ret
99
+ return nil if ffi_value.address == 0
100
+ return ffi_value if method == :NSStringFromClass
101
+ ObjC.object_to_instance(ffi_value)
102
+ when '^v', 'Q', 'q', 'D', 'd', 'B', 'I', 'i'
103
+ ffi_value
104
+ when /^\^{([^=]*)=.*}$/
105
+ return nil if ffi_value.address == 0
106
+ ObjC.object_to_instance(ffi_value)
107
+ when '*'
108
+ ffi_value.read_string
76
109
  when '#'
77
- ret
110
+ ffi_value
78
111
  when /^{([^=]*)=.*}$/
79
- ret
80
- when /^\^{[^=]*=.*}$/
81
- return nil if ret.address == 0
82
- object_to_instance ret
83
- else
84
- raise type
85
- end
86
- end
87
-
88
- def self.fixed_args args,params={},types=[],options={}
89
- if options[:variadic]
90
- _types = (types.dup*args.size)
91
- args
92
- else
93
- _types = types.dup
94
- ([args.first]+params.values)
95
- end.map do |arg|
96
- type = _types.shift
97
- case arg
98
- when TrueClass, FalseClass
99
- [:bool,arg]
100
- when Fixnum, Bignum
101
- case type
102
- when 'q'
103
- [:long_long,arg]
104
- when 'Q'
105
- [:ulong_long,arg]
106
- when 'd'
107
- [:double,arg]
108
- else
109
- raise type.inspect
110
- end
111
- when Float
112
- [:double,arg]
113
- when String
114
- [:pointer,ObjC.String_to_NSString(arg)]
115
- when NilClass
116
- [:pointer,nil]
117
- when Symbol
118
- [:pointer,ObjC.sel_registerName("#{arg}:")]
119
- when Cocoa::NSObject
120
- [:pointer,arg.object]
121
- when FFI::Struct
122
- [arg.class.by_value,arg]
123
- when FFI::Pointer
124
- [:pointer,arg]
125
- else
126
- raise ArgumentError.new("#{arg.class.name}: #{arg.inspect}")
127
- end
128
- end.flatten
129
- end
130
-
131
- def self.apple_type_to_ffi type
132
- # TODO: These are just stubbed on guess - check'em'all
133
- case type
134
- when 'C'
135
- :uchar
136
- when '@'
137
- :pointer
138
- when '#'
139
- :pointer
140
- when 'Q'
141
- :int
142
- when ':'
143
- :pointer
144
- when 'I'
145
- :int
146
- when 'L'
147
- :int
148
- when 'd'
149
- :double
150
- when 'f'
151
- :float
152
- when 'i'
153
- :int
154
- when 's'
155
- :int
156
- when 'q'
157
- :long_long
158
- when 'S'
159
- :int
160
- when /^\^/
161
- :pointer
162
- when 'B'
163
- :bool
164
- when 'v'
165
- :void
166
- when '[5*]'
167
- :void
168
- when /^{[^=]*=.*}$/
169
- begin
170
- /^{_*([^=]*)=.*}$/.match(type)[1].constantize.by_value
171
- rescue => e
172
- begin
173
- "Cocoa::#{/^{_*([^=]*)=.*}$/.match(type)[1]}".constantize.by_value
174
- rescue => e
175
- match = /^{_*([^=]*)=(.*)}$/.match(type)
176
- klass = begin
177
- Cocoa.const_get(match[1])
178
- rescue
179
- # puts "defining struct Cocoa::#{match[1]} as #{match[2]}"
180
- # this stuff doesnt work with jruby
181
- klass = Class.new(FFI::Struct)
182
- Cocoa.const_set(match[1], klass)
183
- name = 'a'
184
- layout = []
185
- match[2].each_char do |c|
186
- case c
187
- when 'd'
188
- layout << name.to_sym
189
- name = name.next
190
- layout << :double
191
- end
192
- end
193
- klass = "Cocoa::#{match[1]}".constantize
194
- klass.layout *layout
195
- klass
196
- end
197
- klass.by_ref
198
- end
199
- end
200
- when nil
201
- :void
202
- when '*' # character string
203
- :pointer
204
- when '@?'
205
- :pointer
112
+ ffi_value
206
113
  else
207
114
  raise type.inspect
208
115
  end
@@ -212,76 +119,15 @@ module ObjC
212
119
  case type
213
120
  when nil
214
121
  default
215
- when '@'
216
- type
217
- when 'v'
122
+ when '@', 'v', 'q', 'Q', '^v'
218
123
  type
219
124
  when /^{([^=]*)=.*}$/
220
125
  type
126
+ when /^\^{([^=]*)=.*}$/
127
+ type
221
128
  else
222
129
  raise type.inspect
223
130
  end
224
131
  end
225
132
 
226
- def self.call_arguments params,args
227
- fixed_args = []
228
- args.each_with_index do |arg,i|
229
- case params[:types][i]
230
- when '@'
231
- fixed_args << arg
232
- when 'd'
233
- if arg.is_a?(Fixnum)
234
- fixed_args << arg.to_f
235
- else
236
- raise ArgumentError.new("float expected, got #{arg.class.name}") unless arg.is_a?(Float)
237
- fixed_args << arg
238
- end
239
- when 'I'
240
- raise ArgumentError unless arg.is_a?(Fixnum)
241
- fixed_args << arg
242
- when 'Q'
243
- raise ArgumentError.new(arg.inspect) unless arg.is_a?(Fixnum)
244
- fixed_args << arg
245
- when 'q'
246
- raise ArgumentError unless arg.is_a?(Fixnum)
247
- fixed_args << arg
248
- when '#'
249
- raise ArgumentError unless arg.is_a?(FFI::Pointer)
250
- fixed_args << arg
251
- when /^{[^=]*=.*}$/
252
- raise ArgumentError.new(arg.inspect) unless arg.kind_of?(FFI::Struct)
253
- fixed_args << arg
254
- when /^\^{([^=]*)=.*}$/
255
- case arg
256
- when FFI::Pointer
257
- fixed_args << arg
258
- when Array
259
- raise ArgumentError unless $1 == '__CFArray'
260
- fixed_args << NSArray.arrayWithObjects(arg).object
261
- else
262
- match = $1
263
- if arg.class.name =~ /^Cocoa::/ # "Cocoa::#{$1}".constantize
264
- fixed_args << arg.object
265
- elsif arg.is_a?(NilClass)
266
- fixed_args << FFI::MemoryPointer::NULL
267
- elsif arg.is_a?(String) && match == '__CFString'
268
- fixed_args << Cocoa::String_to_NSString(arg)
269
- else
270
- raise ArgumentError.new("expected #{params[:types][i]} got #{arg.class.name} (#{match})")
271
- end
272
- end
273
- when '^d'
274
- raise ArgumentError unless arg.is_a?(Array)
275
- arr = FFI::MemoryPointer.new(:double,arg.size)
276
- arr.write_array_of_double(arg)
277
- fixed_args << arr
278
- when '^v'
279
- raise ArgumentError unless arg.is_a?(NilClass)
280
- fixed_args << FFI::MemoryPointer::NULL
281
- else
282
- raise params[:types][i]
283
- end
284
- end
285
- fixed_args
286
- end
287
133
  end
@@ -0,0 +1,314 @@
1
+ module ObjC
2
+ class MethodDef
3
+ attr_accessor :name,:names,:types,:return_type
4
+
5
+ TYPES = {
6
+ 'c' => :char,
7
+ 'i' => :int,
8
+ 's' => :short,
9
+ 'l' => :long,
10
+ 'q' => :long_long,
11
+ 'C' => :uchar,
12
+ 'I' => :uint,
13
+ 'S' => :ushort,
14
+ 'L' => :ulong,
15
+ 'Q' => :ulong_long,
16
+ 'f' => :float,
17
+ 'd' => :double,
18
+ 'B' => :bool,
19
+ 'v' => :void,
20
+ '*' => :pointer, # :string?
21
+ '@' => :pointer,
22
+ '#' => :pointer,
23
+ ':' => :pointer,
24
+ # [array type] - An array
25
+ # {name=type...} - A structure
26
+ # (name=type...) - A union
27
+ # bnum - A bit field of num bits
28
+ # ^type - A pointer to type
29
+ # ? - An unknown type (among other things, this code is used for function pointers)
30
+ }
31
+
32
+ def initialize name,options
33
+ @name = name.to_sym
34
+ @names = options[:names].map(&:to_sym)
35
+ @types = options[:types]
36
+ @return_type = options[:retval]
37
+ @variadic = options[:variadic]
38
+ end
39
+
40
+ def variadic?
41
+ @variadic
42
+ end
43
+
44
+ def ffi_types
45
+ @ffi_types ||= types.map do |type|
46
+ TYPES[type] || case type
47
+ when '@?'
48
+ :pointer
49
+ when '^v', /^\^/, '^?', '^I'
50
+ :pointer
51
+ when /^{([^=]*)=(.*)}$/
52
+ begin
53
+ Cocoa::const_get($1).by_value
54
+ rescue
55
+ # this stuff doesnt work with jruby
56
+ attribs = $2
57
+ klass_name = /^{_*([^=]*)=.*}$/.match(type)[1]
58
+ klass = begin
59
+ Cocoa.const_get(klass_name)
60
+ rescue
61
+ klass = Class.new(FFI::Struct)
62
+ Cocoa.const_set($1, klass)
63
+ name = 'a'
64
+ layout = []
65
+ attribs.each_char do |c|
66
+ layout << name.to_sym
67
+ name = name.next
68
+ layout << case c
69
+ when '^', '?'
70
+ :pointer
71
+ when 'v'
72
+ :pointer
73
+ else
74
+ TYPES[c]
75
+ end
76
+ end
77
+ klass = Cocoa::const_get($1)
78
+ klass.layout *layout
79
+ klass
80
+ end
81
+ klass.by_ref
82
+ end
83
+ when /^\^{([^=]*)=.*}$/
84
+ :pointer
85
+ else
86
+ raise type.inspect
87
+ end
88
+ end
89
+ end
90
+
91
+ def ffi_return_type
92
+ @ffi_return_type ||= TYPES[return_type] || case return_type
93
+ when nil
94
+ :void
95
+ when 'v'
96
+ :void
97
+ when /^\^/
98
+ :pointer
99
+ when '[5*]'
100
+ :void
101
+ when /^{[^=]*=.*}$/
102
+ begin
103
+ /^{_*([^=]*)=.*}$/.match(return_type)[1].constantize.by_value
104
+ rescue => e
105
+ begin
106
+ "Cocoa::#{/^{_*([^=]*)=.*}$/.match(return_type)[1]}".constantize.by_value
107
+ rescue => e
108
+ match = /^{_*([^=]*)=(.*)}$/.match(return_type)
109
+ klass = begin
110
+ Cocoa.const_get(match[1])
111
+ rescue
112
+ # puts "defining struct Cocoa::#{match[1]} as #{match[2]}"
113
+ # this stuff doesnt work with jruby
114
+ klass = Class.new(FFI::Struct)
115
+ Cocoa.const_set(match[1], klass)
116
+ name = 'a'
117
+ layout = []
118
+ match[2].each_char do |c|
119
+ case c
120
+ when 'd'
121
+ layout << name.to_sym
122
+ name = name.next
123
+ layout << :double
124
+ end
125
+ end
126
+ klass = "Cocoa::#{match[1]}".constantize
127
+ klass.layout *layout
128
+ klass
129
+ end
130
+ klass.by_ref
131
+ end
132
+ end
133
+ when nil
134
+ :void
135
+ when '@?'
136
+ :pointer
137
+ else
138
+ raise self.inspect
139
+ end
140
+ end
141
+
142
+ def objc_types
143
+ ObjC.objc_type(@return_value,'v')+'@:'+@types.map{ |type| ObjC.objc_type(type) }.join
144
+ end
145
+
146
+ def ffi_casted values
147
+ i = -1
148
+ values.map do |value|
149
+ i += 1
150
+ case value
151
+ when TrueClass, FalseClass
152
+ [:bool,value]
153
+ when Fixnum, Bignum
154
+ [TYPES[types[i]],value]
155
+ when Float
156
+ [:double,value]
157
+ when String
158
+ [:pointer,ObjC.String_to_NSString(value)]
159
+ when NilClass
160
+ [:pointer,nil]
161
+ when Symbol
162
+ [:pointer,ObjC.sel_registerName("#{value}:")]
163
+ when Cocoa::NSObject
164
+ [:pointer,value.object]
165
+ when FFI::Struct
166
+ [value.class.by_value,value]
167
+ when FFI::Pointer
168
+ [:pointer,value]
169
+ else
170
+ raise ArgumentError.new(value.inspect)
171
+ end
172
+ end.flatten
173
+ end
174
+
175
+ def call_arguments args
176
+ fixed_args = []
177
+ args.each_with_index do |arg,i|
178
+ case types[i]
179
+ when '@'
180
+ fixed_args << arg
181
+ when 'd'
182
+ if arg.is_a?(Fixnum)
183
+ fixed_args << arg.to_f
184
+ else
185
+ raise ArgumentError.new("float expected, got #{arg.class.name}") unless arg.is_a?(Float)
186
+ fixed_args << arg
187
+ end
188
+ when 'I'
189
+ raise ArgumentError unless arg.is_a?(Fixnum)
190
+ fixed_args << arg
191
+ when 'Q', 'q'
192
+ raise ArgumentError.new(arg.inspect) unless arg.is_a?(Fixnum)
193
+ fixed_args << arg
194
+ when '#'
195
+ raise ArgumentError unless arg.is_a?(FFI::Pointer)
196
+ fixed_args << arg
197
+ when /^{[^=]*=.*}$/
198
+ raise ArgumentError.new(arg.inspect) unless arg.kind_of?(FFI::Struct)
199
+ fixed_args << arg
200
+ when /^\^{([^=]*)=.*}$/
201
+ case arg
202
+ when FFI::Pointer
203
+ fixed_args << arg
204
+ when Array
205
+ raise ArgumentError unless $1 == '__CFArray'
206
+ fixed_args << NSArray.arrayWithObjects(arg).object
207
+ else
208
+ match = $1
209
+ if arg.class.name =~ /^Cocoa::/ # "Cocoa::#{$1}".constantize
210
+ fixed_args << arg.object
211
+ elsif arg.is_a?(NilClass)
212
+ fixed_args << FFI::MemoryPointer::NULL
213
+ elsif arg.is_a?(String) && match == '__CFString'
214
+ fixed_args << Cocoa::String_to_NSString(arg)
215
+ else
216
+ raise ArgumentError.new("expected #{params[:types][i]} got #{arg.class.name} (#{match})")
217
+ end
218
+ end
219
+ when '^d'
220
+ raise ArgumentError unless arg.is_a?(Array)
221
+ arr = FFI::MemoryPointer.new(:double,arg.size)
222
+ arr.write_array_of_double(arg)
223
+ fixed_args << arr
224
+ when '^v'
225
+ raise ArgumentError unless arg.is_a?(NilClass)
226
+ fixed_args << FFI::MemoryPointer::NULL
227
+ else
228
+ raise types[i]
229
+ end
230
+ end
231
+ fixed_args
232
+ end
233
+
234
+ def selector
235
+ @selector ||= begin
236
+ if types.size > 0
237
+ "#{name}#{(['']+names).join(':')}:"
238
+ else
239
+ name.to_s
240
+ end
241
+ end
242
+ end
243
+
244
+ def ruby_return_value this,ffi_value
245
+ case return_type
246
+ when 'v'
247
+ this
248
+ else
249
+ ObjC.ffi_to_ruby_value name,ffi_value,return_type
250
+ end
251
+ end
252
+
253
+ def call this, object, *args
254
+ values = if @types.size == 0
255
+ []
256
+ elsif @types.size == 1
257
+ args
258
+ else
259
+ [args.first] + args.last.values
260
+ end
261
+
262
+ # TODO: BUG: cascadeTopLeftFromPoint struggles with msgSend_stret
263
+ if return_type =~ /^{([^=]*)=.*}$/ && name != :cascadeTopLeftFromPoint
264
+ struct = Cocoa.const_get($1.sub(/^_NS/,'NS'))
265
+ ObjC.msgSend_stret(struct,object,selector,*ffi_casted(values))
266
+ else
267
+ ret = if ffi_return_type.is_a?(FFI::StructByValue)
268
+ ObjC.send(:msgSend_pointer,object,selector,*ffi_casted(values))
269
+ else
270
+ ObjC.send("msgSend_#{ffi_return_type}".to_sym,object,selector,*ffi_casted(values))
271
+ end
272
+ return if name == :cascadeTopLeftFromPoint
273
+ return ret if name == :NSStringFromClass
274
+ ruby_return_value(this,ret)
275
+ end
276
+ end
277
+
278
+ def callback instance, params, args
279
+ keys = params.select{ |param| param.first == :key }.map{ |param| param.last }
280
+
281
+ ret = if params.size > 0 && params.last.first == :rest
282
+ args = args.map{ |arg| Cocoa::instance_for(arg) }
283
+ instance.send(name, args.first, Hash[*names.zip(args[1..-1]).flatten])
284
+ elsif keys.size > 0
285
+ args = args.map{ |arg| Cocoa::instance_for(arg) }
286
+ instance.send(name, args.first, Hash[*keys.zip(args[1..-1]).flatten])
287
+ else
288
+ instance.send(name, *args.map{ |arg| Cocoa::instance_for(arg) })
289
+ end
290
+ ffi_return_value(ret)
291
+ end
292
+
293
+ def ffi_return_value value
294
+ case return_type
295
+ when '@'
296
+ case value
297
+ when NilClass
298
+ nil
299
+ when String
300
+ Cocoa::NSString.stringWithString(value).object
301
+ else
302
+ raise value.inspect
303
+ end
304
+ when 'q', 'Q', 'd', 'B'
305
+ value
306
+ when 'v'
307
+ nil
308
+ else
309
+ raise inspect
310
+ end
311
+ end
312
+
313
+ end
314
+ end