rhodes 2.1.0 → 2.2.0.beta.1

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 (241) hide show
  1. data/CHANGELOG +7 -0
  2. data/README.textile +4 -5
  3. data/Rakefile +8 -1
  4. data/lib/build/jake.rb +22 -16
  5. data/lib/extensions/rhoxml/rexml/cdata.rb +67 -0
  6. data/lib/extensions/rhoxml/rexml/document.rb +2 -116
  7. data/lib/extensions/rhoxml/rexml/element.rb +1 -1
  8. data/lib/extensions/rhoxml/rexml/text.rb +117 -0
  9. data/lib/framework/rho/render.rb +19 -11
  10. data/lib/framework/rho/rho.rb +17 -10
  11. data/lib/framework/rho/rhobluetooth.rb +103 -0
  12. data/lib/framework/rho/rhocontroller.rb +2 -0
  13. data/lib/framework/rho/rhoevent.rb +43 -0
  14. data/lib/framework/rho/rhoevent_bb.rb +80 -0
  15. data/lib/framework/rho/rhoevent_c.rb +47 -0
  16. data/lib/framework/rhodes.rb +2 -2
  17. data/lib/framework/rhom/rhom_db_adapter.rb +2 -1
  18. data/lib/framework/rhom/rhom_model.rb +9 -3
  19. data/lib/framework/rhom/rhom_object_factory.rb +46 -22
  20. data/lib/framework/rhom/rhom_source.rb +12 -10
  21. data/lib/framework/version.rb +2 -2
  22. data/lib/rhodes.rb +2 -2
  23. data/platform/android/Rhodes/AndroidManifest.xml +23 -2
  24. data/platform/android/Rhodes/gen/com/rhomobile/rhodes/R.java +54 -38
  25. data/platform/android/Rhodes/jni/include/rhodes.h +3 -0
  26. data/platform/android/Rhodes/jni/include/rhodes/JNIRhodes.h +2 -2
  27. data/platform/android/Rhodes/jni/include/rhodes/details/rhojava.inc +4 -0
  28. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesService.h +16 -0
  29. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_bluetooth_RhoBluetoothManager.h +21 -0
  30. data/platform/android/Rhodes/jni/src/bluetooth.cpp +169 -0
  31. data/platform/android/Rhodes/jni/src/callbacks.cpp +10 -0
  32. data/platform/android/Rhodes/jni/src/event.cpp +429 -0
  33. data/platform/android/Rhodes/jni/src/fileapi.cpp +51 -1
  34. data/platform/android/Rhodes/jni/src/rhodes.cpp +16 -0
  35. data/platform/android/Rhodes/jni/src/sslimpl.cpp +3 -0
  36. data/platform/android/Rhodes/res/layout/bt_device_list.xml +42 -0
  37. data/platform/android/Rhodes/res/layout/bt_device_name.xml +7 -0
  38. data/platform/android/Rhodes/res/values/strings.xml +8 -0
  39. data/platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java +14 -0
  40. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Capabilities.java +2 -0
  41. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Push.java +7 -0
  42. data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java +58 -0
  43. data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushService.java +53 -0
  44. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +8 -0
  45. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +144 -3
  46. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/IRhoBluetoothManager.java +66 -0
  47. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothDeviceListActivity.java +201 -0
  48. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManager.java +139 -0
  49. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerNew.java +401 -0
  50. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerOld.java +136 -0
  51. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothSession.java +457 -0
  52. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/UUIDHelper.java +71 -0
  53. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +12 -7
  54. data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/Event.java +19 -0
  55. data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java +261 -0
  56. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +4 -2
  57. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +2 -2
  58. data/platform/android/Rhodes/src/com/rhomobile/rhodes/uri/MailUriHandler.java +10 -2
  59. data/platform/android/build/RhodesSRC_build.files +33 -22
  60. data/platform/android/build/android.rake +198 -27
  61. data/platform/android/build/librhodes_build.files +3 -1
  62. data/platform/android/build/libruby_build.files +4 -1
  63. data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBResult.java +2 -2
  64. data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBRowResult.java +1 -1
  65. data/platform/bb/Hsqldb/src/org/hsqldb/Expression.java +7 -4
  66. data/platform/bb/Hsqldb/src/org/hsqldb/Like.java +3 -3
  67. data/platform/bb/Hsqldb/src/org/hsqldb/Table.java +3 -1
  68. data/platform/bb/Hsqldb/src/org/hsqldb/Tokenizer.java +1 -1
  69. data/platform/bb/RubyVM/RubyVM.jdp +1 -0
  70. data/platform/bb/RubyVM/src/com/rho/RhoConf.java +108 -1
  71. data/platform/bb/RubyVM/src/com/rho/RhoLogConf.java +7 -1
  72. data/platform/bb/RubyVM/src/com/rho/RhoRuby.java +7 -4
  73. data/platform/bb/RubyVM/src/com/rho/ThreadQueue.java +7 -1
  74. data/platform/bb/RubyVM/src/com/rho/net/AsyncHttp.java +1 -1
  75. data/platform/bb/RubyVM/src/com/rho/net/NetRequest.java +21 -23
  76. data/platform/bb/RubyVM/src/com/rho/net/RhoConnection.java +19 -10
  77. data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +8 -0
  78. data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +3 -0
  79. data/platform/bb/RubyVM/src/com/rho/sync/SyncThread.java +14 -17
  80. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyFile.java +7 -5
  81. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RhoSupport.java +2 -0
  82. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyRuntime.java +10 -1
  83. data/platform/bb/RubyVM/src/j2me/io/File.java +7 -6
  84. data/platform/bb/build/RubyVM_build.files +412 -412
  85. data/platform/bb/build/bb.rake +42 -18
  86. data/platform/bb/build/hsqldb_build.files +151 -151
  87. data/platform/bb/build/rhodes_build.files +44 -40
  88. data/platform/bb/rhodes/platform/5.0/com/rho/BrowserAdapter5.java +2 -0
  89. data/platform/bb/rhodes/platform/5.0/com/rho/RhodesApplicationPlatform.java +237 -0
  90. data/platform/bb/rhodes/platform/common/com/rho/RhodesApplicationPlatform.java +14 -0
  91. data/platform/bb/rhodes/rhodes.jdp +6 -1
  92. data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +7 -1
  93. data/platform/bb/rhodes/src/com/rho/RhodesApplicationPlatform.java +14 -0
  94. data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +62 -76
  95. data/platform/bb/rhodes/src/com/rho/rubyext/RhoCalendar.java +660 -0
  96. data/platform/bb/rhodes/src/{rhomobile → com/rho/rubyext}/RhoPhonebook.java +95 -38
  97. data/platform/bb/rhodes/src/com/rho/rubyext/System.java +22 -1
  98. data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +26 -6
  99. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +21 -7
  100. data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothManager.java +528 -0
  101. data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothPort.java +281 -0
  102. data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothScreen.java +119 -0
  103. data/platform/bb/rhodes/src/rhomobile/camera/CameraFilesListener.java +2 -2
  104. data/platform/iphone/Classes/AppManager/AppManager.m +70 -7
  105. data/platform/iphone/Classes/Bluetooth/Bluetooth.h +72 -0
  106. data/platform/iphone/Classes/Bluetooth/Bluetooth.m +414 -0
  107. data/platform/iphone/Classes/Event/Event.h +12 -0
  108. data/platform/iphone/Classes/Event/Event.m +300 -0
  109. data/platform/iphone/Classes/LogOptionsController.h +2 -1
  110. data/platform/iphone/Classes/LogOptionsController.m +1 -1
  111. data/platform/iphone/Classes/LogViewController.h +2 -1
  112. data/platform/iphone/Classes/MapView/MapViewController.h +2 -1
  113. data/platform/iphone/Classes/RhoViewController.h +16 -0
  114. data/platform/iphone/Classes/RhoViewController.m +20 -0
  115. data/platform/iphone/Classes/Rhodes.h +12 -0
  116. data/platform/iphone/Classes/Rhodes.m +34 -6
  117. data/platform/iphone/Classes/Signature/SignatureViewController.h +2 -2
  118. data/platform/iphone/Classes/Signature/SignatureViewController.m +0 -10
  119. data/platform/iphone/Classes/SimpleMainView.h +2 -2
  120. data/platform/iphone/Classes/SimpleMainView.m +5 -14
  121. data/platform/iphone/Classes/SplashViewController.h +2 -2
  122. data/platform/iphone/Classes/TabbedMainView.h +2 -2
  123. data/platform/iphone/Classes/TabbedMainView.m +5 -10
  124. data/platform/iphone/Info.plist +5 -5
  125. data/platform/iphone/rhorubylib/rhorubylib.xcodeproj/project.pbxproj +39 -0
  126. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +47 -4
  127. data/platform/osx/Rhodes Debugger/NoodleLineNumberView.m +3 -2
  128. data/platform/shared/common/AutoPointer.h +3 -0
  129. data/platform/shared/common/RhoConf.cpp +2 -1
  130. data/platform/shared/common/RhoThread.h +1 -1
  131. data/platform/shared/common/RhoTime.h +3 -3
  132. data/platform/shared/common/RhodesApp.cpp +75 -23
  133. data/platform/shared/common/RhodesApp.h +4 -0
  134. data/platform/shared/common/RhodesAppBase.h +2 -0
  135. data/platform/shared/common/ThreadQueue.cpp +23 -18
  136. data/platform/shared/common/ThreadQueue.h +2 -0
  137. data/platform/shared/db/res/db/syncdb.schema +39 -39
  138. data/platform/shared/logging/RhoLogConf.cpp +58 -3
  139. data/platform/shared/logging/RhoLogConf.h +3 -1
  140. data/platform/shared/net/CURLNetRequest.cpp +17 -6
  141. data/platform/shared/net/HttpServer.cpp +125 -25
  142. data/platform/shared/net/HttpServer.h +4 -3
  143. data/platform/shared/ruby/ext/bluetooth/bluetooth.i +56 -0
  144. data/platform/shared/ruby/ext/bluetooth/bluetooth_wrap.c +2563 -0
  145. data/platform/shared/ruby/ext/calendar/calendar.i +28 -0
  146. data/platform/shared/ruby/ext/calendar/calendar_wrap.c +2251 -0
  147. data/platform/shared/ruby/ext/calendar/event.h +41 -0
  148. data/platform/shared/ruby/ext/calendar/event.i +28 -0
  149. data/platform/shared/ruby/ext/calendar/event_wrap.c +2151 -0
  150. data/platform/shared/ruby/ext/rho/rhoruby.c +103 -3
  151. data/platform/shared/ruby/ext/rho/rhoruby.h +16 -2
  152. data/platform/shared/ruby/ext/rhoconf/rhoconf.i +12 -0
  153. data/platform/shared/ruby/ext/rhoconf/rhoconf_wrap.c +101 -0
  154. data/platform/shared/ruby/ext/system/system.i +14 -0
  155. data/platform/shared/ruby/ext/system/system_wrap.c +2568 -2208
  156. data/platform/shared/ruby/main.c +8 -0
  157. data/platform/shared/rubyext/GeoLocation.cpp +6 -3
  158. data/platform/shared/rubyext/System.cpp +14 -0
  159. data/platform/shared/sync/SyncEngine.cpp +9 -1
  160. data/platform/shared/sync/SyncNotify.cpp +16 -8
  161. data/platform/shared/sync/SyncNotify.h +1 -0
  162. data/platform/shared/sync/SyncThread.cpp +7 -12
  163. data/platform/shared/sync/SyncThread.h +5 -3
  164. data/platform/wm/build/wm.rake +7 -1
  165. data/platform/wm/rhodes/Alert.cpp +1 -1
  166. data/platform/wm/rhodes/MainWindow.cpp +28 -0
  167. data/platform/wm/rhodes/MainWindow.h +9 -0
  168. data/platform/wm/rhodes/OutlookApp.cpp +72 -0
  169. data/platform/wm/rhodes/OutlookApp.h +22 -0
  170. data/platform/wm/rhodes/Rhodes.cpp +8 -0
  171. data/platform/wm/rhodes/Rhodes.rc +31 -0
  172. data/platform/wm/rhodes/bluetooth/Bluetooth.cpp +1274 -0
  173. data/platform/wm/rhodes/bluetooth/Bluetooth.h +321 -0
  174. data/platform/wm/rhodes/phonebook/NativeAddressBook.cpp +37 -70
  175. data/platform/wm/rhodes/phonebook/NativeAddressBook.h +0 -4
  176. data/platform/wm/rhodes/resource.h +8 -1
  177. data/platform/wm/rhodes/rho/net/NetRequest.cpp +4 -0
  178. data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +6 -4
  179. data/platform/wm/rhodes/rho/rubyext/calendar.cpp +487 -0
  180. data/platform/wm/rhodes/rhodes.vcproj +28 -11
  181. data/platform/wm/rhodes/stdafx.h +1 -0
  182. data/platform/wm/rubylib/rubylib.vcproj +32 -0
  183. data/rakefile.rb +8 -1
  184. data/res/generators/templates/application/Rakefile +1 -1
  185. data/res/generators/templates/application/app/layout.erb +4 -1
  186. data/res/generators/templates/application/build.yml +0 -1
  187. data/res/generators/templates/application/public/css/iphone.css +2 -2
  188. data/res/generators/templates/application/public/jqtouch/jqtouch-iphone.css +9 -0
  189. data/res/generators/templates/application/public/jqtouch/jqtouch.css +1 -5
  190. data/res/generators/templates/application/public/jqtouch/jqtouch.js +3 -2
  191. data/rhodes.gemspec +1 -1
  192. data/spec/perfomance_spec/app/Benchmark/benchmark.rb +4 -0
  193. data/spec/perfomance_spec/app/Benchmark/bulk_results.erb +13 -0
  194. data/spec/perfomance_spec/app/Benchmark/controller.rb +178 -0
  195. data/spec/perfomance_spec/app/Benchmark/create_results.erb +13 -0
  196. data/spec/perfomance_spec/app/Benchmark/customers.erb +35 -0
  197. data/spec/perfomance_spec/app/Benchmark/index.erb +9 -0
  198. data/spec/perfomance_spec/app/Benchmark/products.erb +25 -0
  199. data/spec/perfomance_spec/app/Benchmark/search_results.erb +13 -0
  200. data/spec/perfomance_spec/app/Customer/customer.rb +6 -0
  201. data/spec/perfomance_spec/app/Perftest/index.erb +5 -0
  202. data/spec/perfomance_spec/app/Product/index.erb +25 -0
  203. data/spec/perfomance_spec/app/Product/product.rb +6 -0
  204. data/spec/perfomance_spec/app/helpers/application_helper.rb +126 -0
  205. data/spec/perfomance_spec/app/helpers/browser_helper.rb +18 -0
  206. data/spec/perfomance_spec/rhoconfig.txt +1 -1
  207. data/spec/phone_spec/app/Account_s/account_s.rb +5 -2
  208. data/spec/phone_spec/app/Case/case.rb +1 -0
  209. data/spec/phone_spec/app/Case_s/case_s.rb +2 -0
  210. data/spec/phone_spec/app/Data/perftest.json +35 -0
  211. data/spec/phone_spec/app/Data/testCDATA.xml +11 -0
  212. data/spec/phone_spec/app/Product/product.rb +1 -1
  213. data/spec/phone_spec/app/{Spec → spec}/asynchttp_spec.rb +66 -17
  214. data/spec/phone_spec/app/{Spec → spec}/barcode_spec.rb +0 -0
  215. data/spec/phone_spec/app/{Spec → spec}/blobsync_spec.rb +0 -0
  216. data/spec/phone_spec/app/{Spec → spec}/bsearch_spec.rb +0 -0
  217. data/spec/phone_spec/app/{Spec → spec}/bulksync_spec.rb +0 -0
  218. data/spec/phone_spec/app/{Spec → spec}/contacts_spec.rb +0 -0
  219. data/spec/phone_spec/app/{Spec → spec}/crypt_spec.rb +0 -0
  220. data/spec/phone_spec/app/{Spec → spec}/date_spec.rb +0 -0
  221. data/spec/phone_spec/app/spec/events_spec.rb +199 -0
  222. data/spec/phone_spec/app/{Spec → spec}/fixtures/client_info.txt +0 -0
  223. data/spec/phone_spec/app/{Spec → spec}/fixtures/object_values.txt +0 -0
  224. data/spec/phone_spec/app/{Spec → spec}/json_spec.rb +11 -2
  225. data/spec/phone_spec/app/{Spec → spec}/mapview_spec.rb +0 -0
  226. data/spec/phone_spec/app/{Spec → spec}/nativebar_spec.rb +0 -0
  227. data/spec/phone_spec/app/{Spec → spec}/navbar_spec.rb +0 -0
  228. data/spec/phone_spec/app/{Spec → spec}/pagination/fixtures/object_values.txt +0 -0
  229. data/spec/phone_spec/app/{Spec → spec}/rho_controller_spec.rb +5 -0
  230. data/spec/phone_spec/app/{Spec → spec}/rho_spec.rb +48 -0
  231. data/spec/phone_spec/app/{Spec → spec}/rhofile_spec.rb +9 -6
  232. data/spec/phone_spec/app/{Spec → spec}/rhom_object_spec.rb +188 -9
  233. data/spec/phone_spec/app/{Spec → spec}/syncengine_spec.rb +0 -0
  234. data/spec/phone_spec/app/{Spec → spec}/xml_spec.rb +15 -0
  235. data/spec/phone_spec/app/{Spec → spec}/xruby_spec.rb +0 -0
  236. data/spec/phone_spec/app/spec_runner.rb +4 -1
  237. data/spec/phone_spec/build.yml +2 -1
  238. metadata +95 -31
  239. data/platform/bb/rhodes/platform/5.0/com/rho/RhoMainScreen.java +0 -36
  240. data/platform/bb/rhodes/platform/6.0/com/rho/BrowserAdapter5.java +0 -155
  241. data/platform/bb/rhodes/platform/6.0/com/rho/RhoMainScreen.java +0 -36
@@ -0,0 +1,72 @@
1
+ //
2
+ // Bluetooth.h
3
+ // rhorunner
4
+ //
5
+ // Created by Soldatenkov Dmitry on 27/07/10.
6
+ // Copyright 2010 Rhomobile. All rights reserved.
7
+ //
8
+
9
+ #import <UIKit/UIKit.h>
10
+ #import <Foundation/Foundation.h>
11
+ #import <GameKit/GameKit.h>
12
+
13
+
14
+
15
+
16
+ @interface RhoBluetoothManager : NSObject <GKPeerPickerControllerDelegate, GKSessionDelegate> {
17
+ GKSession *session;
18
+
19
+ NSString* connectionCallbackURL;
20
+ NSString* sessionCallbackURL;
21
+
22
+ NSString* deviceName;
23
+ NSString* connectedDeviceName;
24
+ NSString* connectedDeviceID;
25
+
26
+ NSMutableArray* packets;
27
+ }
28
+
29
+ @property(nonatomic, retain) GKSession *session;
30
+ @property(nonatomic, copy) NSString *deviceName;
31
+ @property(nonatomic, copy) NSString *connectedDeviceName;
32
+ @property(nonatomic, copy) NSString *connectedDeviceID;
33
+ @property (readwrite, copy) NSString *connectionCallbackURL;
34
+ @property (readwrite, copy) NSString *sessionCallbackURL;
35
+ @property(nonatomic, retain) NSMutableArray *packets;
36
+
37
+
38
+ + (RhoBluetoothManager*)sharedInstance;
39
+
40
+ // Peer Picker Related Methods
41
+ - (void)startPicker:(NSString*)callback;
42
+
43
+ // GKPeerPickerControllerDelegate Methods
44
+ - (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker;
45
+ - (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type;
46
+ - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session;
47
+
48
+ // Session Related Methods
49
+ - (void)invalidateSession:(GKSession *)msession;
50
+
51
+ // Data Send/Receive Methods
52
+ - (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context;
53
+ - (void)sendData:(GKSession *)session withData:(void *)data ofLength:(int)length reliable:(BOOL)howtosend;
54
+
55
+ // GKSessionDelegate Methods
56
+ - (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state;
57
+
58
+
59
+ - (void)fireConnectionCallback:(NSString*)status connected_device_name:(NSString*)connected_device_name;
60
+ - (void)fireSessionCallback:(NSString*)connected_device_name event_type:(NSString*)event_type;
61
+
62
+ - (int)readFromPackets:(void*)buf length:(int)length;
63
+ - (void)addToPackets:(void*)buf length:(int)length;
64
+ - (void)clearPackets;
65
+ - (int)getPacketsSize;
66
+
67
+ - (NSString*)readString;
68
+ - (void)sendString:(NSString*)string;
69
+
70
+ - (void)sendData:(void*)buf length:(int)length;
71
+
72
+ @end
@@ -0,0 +1,414 @@
1
+ //
2
+ // BluetoothManager.m
3
+ // rhorunner
4
+ //
5
+ // Created by Soldatenkov Dmitry on 27/07/10.
6
+ // Copyright 2010 Rhomobile. All rights reserved.
7
+ //
8
+
9
+ #import "Rhodes.h"
10
+ #import "Bluetooth.h"
11
+ #import "AppManager.h"
12
+ #import "common/RhodesApp.h"
13
+ #include "ruby/ext/rho/rhoruby.h"
14
+
15
+
16
+
17
+ #define BTC_OK "OK"
18
+ #define BTC_CANCEL "CANCEL"
19
+ #define BTC_ERROR "ERROR"
20
+
21
+ #define BT_OK @BTC_OK
22
+ #define BT_CANCEL @BTC_CANCEL
23
+ #define BT_ERROR @BTC_ERROR
24
+
25
+ #define BT_ROLE_SERVER @"ROLE_SERVER"
26
+ #define BT_ROLE_CLIENT @"ROLE_CLIENT"
27
+
28
+ #define BT_SESSION_INPUT_DATA_RECEIVED @"SESSION_INPUT_DATA_RECEIVED"
29
+ #define BT_SESSION_DISCONNECT @"SESSION_DISCONNECT"
30
+
31
+ // session id must be equal on each device
32
+ #define BT_RHOMOBILE_SESSION_ID @"RhomobileBluetoothSession"
33
+
34
+
35
+ #define kMaxPacketSize 1024
36
+
37
+
38
+ @implementation RhoBluetoothManager
39
+
40
+
41
+ static RhoBluetoothManager *instance = NULL;
42
+
43
+ + (RhoBluetoothManager*)sharedInstance {
44
+ if (instance == NULL) {
45
+ instance = [[RhoBluetoothManager alloc] init];
46
+ instance.session = nil;
47
+ instance.deviceName = [[UIDevice currentDevice] name];
48
+ instance.connectedDeviceName = nil;
49
+ instance.connectedDeviceID = nil;
50
+ instance.connectionCallbackURL = nil;
51
+ instance.sessionCallbackURL = nil;
52
+ instance.packets = [NSMutableArray arrayWithCapacity:128];
53
+ }
54
+ return instance;
55
+ }
56
+
57
+ - (void)dealloc {
58
+ [self invalidateSession:self.session];
59
+ self.session = nil;
60
+ self.deviceName = nil;
61
+ self.connectedDeviceName = nil;
62
+
63
+ [super dealloc];
64
+ }
65
+
66
+
67
+ @synthesize session, deviceName, connectedDeviceName, connectedDeviceID, connectionCallbackURL, sessionCallbackURL, packets;
68
+
69
+
70
+ #pragma mark -
71
+ #pragma mark Peer Picker Related Methods
72
+
73
+ -(void)startPicker:(NSString*)role {
74
+ GKPeerPickerController* picker;
75
+ picker = [[GKPeerPickerController alloc] init]; // note: picker is released in various picker delegate methods when picker use is done.
76
+ picker.delegate = self;
77
+ [picker show]; // show the Peer Picker
78
+ }
79
+
80
+ #pragma mark GKPeerPickerControllerDelegate Methods
81
+
82
+ - (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker {
83
+ // Peer Picker automatically dismisses on user cancel. No need to programmatically dismiss.
84
+
85
+ // autorelease the picker.
86
+ picker.delegate = nil;
87
+ [picker autorelease];
88
+
89
+ // invalidate and release game session if one is around.
90
+ if(self.session != nil) {
91
+ [self invalidateSession:self.session];
92
+ self.session = nil;
93
+ }
94
+ [self fireConnectionCallback:BT_CANCEL connected_device_name:@""];
95
+ }
96
+
97
+ - (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type {
98
+ // session id - identifier for session
99
+ // display name - name for display on other devices
100
+
101
+ GKSession *msession = [[GKSession alloc] initWithSessionID:BT_RHOMOBILE_SESSION_ID displayName:deviceName sessionMode:GKSessionModePeer];
102
+ return [msession autorelease]; // peer picker retains a reference, so autorelease ours so we don't leak.
103
+ }
104
+
105
+ - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)csession {
106
+ // Remember the current peer.
107
+ self.connectedDeviceID = peerID;
108
+ self.connectedDeviceName = [csession displayNameForPeer:peerID]; // copy
109
+
110
+ // Make sure we have a reference to the game session and it is set up
111
+ self.session = csession; // retain
112
+ self.session.delegate = self;
113
+ [self.session setDataReceiveHandler:self withContext:NULL];
114
+
115
+ // Done with the Peer Picker so dismiss it.
116
+ [picker dismiss];
117
+ picker.delegate = nil;
118
+ [picker autorelease];
119
+
120
+ [self fireConnectionCallback:BT_OK connected_device_name:self.connectedDeviceName];
121
+
122
+ }
123
+
124
+
125
+ #pragma mark -
126
+ #pragma mark Session Related Methods
127
+
128
+ - (void)invalidateSession:(GKSession *)msession {
129
+ if(msession != nil) {
130
+ [msession disconnectFromAllPeers];
131
+ msession.available = NO;
132
+ [msession setDataReceiveHandler: nil withContext: NULL];
133
+ msession.delegate = nil;
134
+ }
135
+ }
136
+
137
+
138
+
139
+ #pragma mark Data Send/Receive Methods
140
+
141
+ - (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context {
142
+ static int lastPacketTime = -1;
143
+
144
+ unsigned char *incomingPacket = (unsigned char *)[data bytes];
145
+ int incomingPacketSize= [data length];
146
+
147
+ [self addToPackets:incomingPacket length:incomingPacketSize];
148
+ [self fireSessionCallback:connectedDeviceName event_type:BT_SESSION_INPUT_DATA_RECEIVED];
149
+ }
150
+
151
+ - (void)sendData:(GKSession *)session withData:(void *)data ofLength:(int)length reliable:(BOOL)howtosend {
152
+ // the packet we'll send is resued
153
+ static unsigned char networkPacket[kMaxPacketSize];
154
+
155
+ unsigned char* indata = (unsigned char*)data;
156
+ int size = length;
157
+ while (size > 0) {
158
+ int send_size = size;
159
+ if (send_size > kMaxPacketSize) {
160
+ send_size = kMaxPacketSize;
161
+ }
162
+ memcpy( &networkPacket[0], indata, send_size );
163
+ NSData *packet = [NSData dataWithBytes: networkPacket length: (length)];
164
+ if(howtosend == YES) {
165
+ //[self.session sendData:packet toPeers:[NSArray arrayWithObject:self.connectedDeviceID] withDataMode:GKSendDataReliable error:nil];
166
+ [self.session sendDataToAllPeers:packet withDataMode:GKSendDataReliable error:nil];
167
+ } else {
168
+ //[self.session sendData:packet toPeers:[NSArray arrayWithObject:self.connectedDeviceID] withDataMode:GKSendDataUnreliable error:nil];
169
+ [self.session sendDataToAllPeers:packet withDataMode:GKSendDataUnreliable error:nil];
170
+ }
171
+ size -= send_size;
172
+ indata += send_size;
173
+ }
174
+ }
175
+
176
+ - (void)sendNSData:(NSData*)cdata {
177
+ [self sendData:self.session withData:[cdata bytes] ofLength:[cdata length] reliable:YES];
178
+ }
179
+
180
+ #pragma mark GKSessionDelegate Methods
181
+
182
+ // we've gotten a state change in the session
183
+ - (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
184
+
185
+ if(state == GKPeerStateDisconnected) {
186
+ // We've been disconnected from the other peer.
187
+ [self fireSessionCallback:connectedDeviceName event_type:BT_SESSION_DISCONNECT];
188
+
189
+ }
190
+ }
191
+
192
+ - (void)fireConnectionCallback:(NSString*)status connected_device_name:(NSString*)connected_device_name {
193
+ if (connectionCallbackURL == nil) {
194
+ return;
195
+ }
196
+ NSString* strBody = @"";
197
+ strBody = [strBody stringByAppendingString:@"&status="];
198
+ strBody = [strBody stringByAppendingString:status];
199
+ strBody = [strBody stringByAppendingString:@"&connected_device_name="];
200
+ strBody = [strBody stringByAppendingString:connected_device_name];
201
+ rho_net_request_with_data(rho_http_normalizeurl([connectionCallbackURL UTF8String]), [strBody UTF8String]);
202
+ }
203
+
204
+ - (void)fireSessionCallback:(NSString*)connected_device_name event_type:(NSString*)event_type {
205
+ if (sessionCallbackURL == nil) {
206
+ return;
207
+ }
208
+ NSString* strBody = @"";
209
+ strBody = [strBody stringByAppendingString:@"&connected_device_name="];
210
+ strBody = [strBody stringByAppendingString:connected_device_name];
211
+ strBody = [strBody stringByAppendingString:@"&event_type="];
212
+ strBody = [strBody stringByAppendingString:event_type];
213
+ rho_net_request_with_data(rho_http_normalizeurl([sessionCallbackURL UTF8String]), [strBody UTF8String]);
214
+ }
215
+
216
+
217
+ - (void)startConnect:(NSString*)callback {
218
+ self.session = nil;
219
+ self.connectedDeviceName = nil;
220
+ self.connectedDeviceID = nil;
221
+
222
+ self.connectionCallbackURL = callback;
223
+ [self performSelectorOnMainThread:@selector(startPicker:) withObject:BT_ROLE_SERVER waitUntilDone:NO];
224
+ }
225
+
226
+
227
+ - (int)readFromPackets:(void*)buf length:(int)length {
228
+ unsigned char *dst = (unsigned char *)buf;
229
+ int packets_size = [self getPacketsSize];
230
+ int readed_size = 0;
231
+ while ((readed_size < length) && (readed_size < packets_size) && ([self.packets count] > 0)) {
232
+ NSData* data = [self.packets objectAtIndex:0];
233
+ if ([data length] <= (length-readed_size)) {
234
+ int to_read = [data length];
235
+ // read data and remove packet
236
+ [data getBytes:dst length:to_read];
237
+ dst+= to_read;
238
+ readed_size += to_read;
239
+ [self.packets removeObjectAtIndex:0];
240
+ }
241
+ else {
242
+ // read part of packet + reduce packet size
243
+ int to_read = length-readed_size;
244
+ [data getBytes:dst length:to_read];
245
+ dst+= to_read;
246
+ readed_size += to_read;
247
+ NSData* udata = [data subdataWithRange:NSMakeRange(to_read, [data length]-to_read)];
248
+ [self.packets removeObjectAtIndex:0];
249
+ [self.packets insertObject:udata atIndex:0];
250
+ }
251
+ }
252
+ return readed_size;
253
+ }
254
+
255
+ - (void)addToPackets:(void*)buf length:(int)length {
256
+ NSData* data = [NSData dataWithBytes:buf length:length];
257
+ [self.packets addObject:data];
258
+ }
259
+
260
+ - (void)clearPackets {
261
+ [self.packets removeAllObjects];
262
+ }
263
+
264
+ - (int)getPacketsSize {
265
+ int size =0;
266
+ int i;
267
+ for (i = 0; i < self.packets.count; i++) {
268
+ NSData* data = [self.packets objectAtIndex:i];
269
+ size += [data length];
270
+ }
271
+ return size;
272
+ }
273
+
274
+ - (NSString*)readString {
275
+ int length = 0;
276
+ [self readFromPackets:&length length:4];
277
+ char* buf = (char*)malloc(length+2);
278
+ [self readFromPackets:buf length:length];
279
+ buf[length] = 0;
280
+ buf[length+1] = 0;
281
+ NSString* s = [NSString stringWithUTF8String:buf];
282
+ free(buf);
283
+ return s;
284
+ }
285
+
286
+ - (void)sendString:(NSString*)string {
287
+ if (self.session == nil) {
288
+ return;
289
+ }
290
+ const char* sbuf = [string UTF8String];
291
+ int length = strlen(sbuf);
292
+
293
+ char* buf = malloc(length+5);
294
+ char* dst = buf;
295
+ *((int*)dst) = length;
296
+ dst += 4;
297
+ memcpy(dst, sbuf, length);
298
+
299
+ //[self sendData:self.session withData:(void*)buf ofLength:(4+length) reliable:YES];
300
+ NSData* data = [NSData dataWithBytes:buf length:(4+length)];
301
+ [self performSelectorOnMainThread:@selector(sendNSData:) withObject:data waitUntilDone:NO];
302
+ free(buf);
303
+ }
304
+
305
+ - (void)sendData:(void*)buf length:(int)length {
306
+ if (self.session == nil) {
307
+ return;
308
+ }
309
+ //[self sendData:self.session withData:buf ofLength:length reliable:YES];
310
+ NSData* data = [NSData dataWithBytes:buf length:(length)];
311
+ [self performSelectorOnMainThread:@selector(sendNSData:) withObject:data waitUntilDone:NO];
312
+ }
313
+
314
+ - (void)doDisconnectCommand:(NSString*)object {
315
+ if (self.session == nil) {
316
+ return;
317
+ }
318
+ [self invalidateSession:self.session];
319
+ self.session = nil;
320
+ [self fireSessionCallback:connectedDeviceName event_type:BT_SESSION_DISCONNECT];
321
+ self.sessionCallbackURL = nil;
322
+ }
323
+
324
+ - (void)doDisconnect {
325
+ [self performSelectorOnMainThread:@selector(doDisconnectCommand:) withObject:nil waitUntilDone:NO];
326
+ }
327
+
328
+ - (void)doBluetoothOffCommand:(NSString*)object {
329
+ [self doDisconnectCommand:nil];
330
+ instance = NULL;
331
+ }
332
+
333
+ - (void)doBluetoothOff {
334
+ [self performSelectorOnMainThread:@selector(doBluetoothOffCommand:) withObject:nil waitUntilDone:NO];
335
+ }
336
+
337
+ @end
338
+
339
+
340
+
341
+ int rho_bluetooth_is_bluetooth_available() {
342
+ return 1;
343
+ }
344
+
345
+ void rho_bluetooth_off_bluetooth() {
346
+ [[RhoBluetoothManager sharedInstance] doBluetoothOff];
347
+ }
348
+
349
+ void rho_bluetooth_set_device_name(const char* device_name) {
350
+ NSString* newname = [NSString stringWithUTF8String:device_name];
351
+ [RhoBluetoothManager sharedInstance].deviceName = newname;
352
+ }
353
+
354
+ const char* rho_bluetooth_get_device_name() {
355
+ return [[RhoBluetoothManager sharedInstance].deviceName UTF8String];
356
+ }
357
+
358
+ const char* rho_bluetooth_get_last_error() {
359
+ return BTC_OK;
360
+ }
361
+
362
+ const char* rho_bluetooth_create_session(const char* role, const char* callback_url) {
363
+ //NSString* role = [NSString stringWithUTF8String:role];
364
+ NSString* callback = [NSString stringWithUTF8String:callback_url];
365
+ [[RhoBluetoothManager sharedInstance] startConnect:callback];
366
+ return BTC_OK;
367
+ }
368
+
369
+ void rho_bluetooth_session_set_callback(const char* connected_device_name, const char* callback_url) {
370
+ NSString* callback = [NSString stringWithUTF8String:callback_url];
371
+ [RhoBluetoothManager sharedInstance].sessionCallbackURL = callback;
372
+ }
373
+
374
+ void rho_bluetooth_session_disconnect(const char* connected_device_name) {
375
+ [[RhoBluetoothManager sharedInstance] doDisconnect];
376
+ }
377
+
378
+ int rho_bluetooth_session_get_status(const char* connected_device_name) {
379
+ return [[RhoBluetoothManager sharedInstance] getPacketsSize];
380
+ }
381
+
382
+ const char* rho_bluetooth_session_read_string(const char* connected_device_name) {
383
+ NSString* s = [[RhoBluetoothManager sharedInstance] readString];
384
+ return [s UTF8String];
385
+ }
386
+
387
+ void rho_bluetooth_session_write_string(const char* connected_device_name, const char* str) {
388
+ NSString* s = [NSString stringWithUTF8String:str];
389
+ [[RhoBluetoothManager sharedInstance] sendString:s];
390
+ }
391
+
392
+ VALUE rho_bluetooth_session_read_data(const char* connected_device_name) {
393
+ int size = [[RhoBluetoothManager sharedInstance] getPacketsSize];
394
+ unsigned char* buf = malloc(size);
395
+ [[RhoBluetoothManager sharedInstance] readFromPackets:buf length:size];
396
+ VALUE val = rho_ruby_create_byte_array(buf, size);
397
+ free(buf);
398
+ return val;
399
+ }
400
+
401
+ void rho_bluetooth_session_write_data(const char* connected_device_name, VALUE data) {
402
+ int size = rho_ruby_unpack_byte_array(data, 0, 0);
403
+ if (size <= 0) {
404
+ return;
405
+ }
406
+ unsigned char* buf = malloc(size);
407
+ size = rho_ruby_unpack_byte_array(data, buf, size);
408
+ [[RhoBluetoothManager sharedInstance] sendData:buf length:size];
409
+ free(buf);
410
+ }
411
+
412
+
413
+
414
+