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
@@ -1,5 +1,7 @@
1
- package rhomobile;
1
+ package com.rho.rubyext;
2
2
 
3
+ import com.rho.RhoEmptyLogger;
4
+ import com.rho.RhoLogger;
3
5
  import com.xruby.runtime.builtin.RubyArray;
4
6
  import com.xruby.runtime.builtin.RubyString;
5
7
  import com.xruby.runtime.builtin.RubyHash;
@@ -10,6 +12,8 @@ import javax.microedition.pim.*;
10
12
 
11
13
  //@RubyLevelClass(name="Phonebook")
12
14
  public class RhoPhonebook extends RubyBasic {
15
+ private static final RhoLogger LOG = RhoLogger.RHO_STRIP_LOG ? new RhoEmptyLogger() :
16
+ new RhoLogger("Phonebook");
13
17
 
14
18
  private ContactList m_contactList;
15
19
 
@@ -339,13 +343,6 @@ public class RhoPhonebook extends RubyBasic {
339
343
  return RubyConstant.QTRUE;
340
344
  }
341
345
 
342
- public static RubyValue getfirstPhonebookRecord(RubyValue arg0) {
343
- return RubyConstant.QNIL;
344
- }
345
- public static RubyValue getnextPhonebookRecord(RubyValue arg0) {
346
- return RubyConstant.QNIL;
347
- }
348
-
349
346
  public static void initMethods( RubyClass klass){
350
347
  klass.defineAllocMethod(new RubyNoArgMethod(){
351
348
  protected RubyValue run(RubyValue receiver, RubyBlock block ) {
@@ -353,63 +350,123 @@ public class RhoPhonebook extends RubyBasic {
353
350
  });
354
351
 
355
352
  klass.getSingletonClass().defineMethod("openPhonebook", new RubyNoArgMethod() {
356
- protected RubyValue run(RubyValue receiver, RubyBlock block) {
357
- return RhoPhonebook.openPhonebook();
353
+ protected RubyValue run(RubyValue receiver, RubyBlock block)
354
+ {
355
+ try {
356
+ return RhoPhonebook.openPhonebook();
357
+ } catch(Exception e) {
358
+ LOG.ERROR("openPhonebook failed", e);
359
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
360
+ }
361
+
358
362
  }
359
363
  });
360
364
  klass.getSingletonClass().defineMethod("closePhonebook", new RubyOneArgMethod() {
361
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
362
- return RhoPhonebook.closePhonebook(arg0);
365
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block)
366
+ {
367
+ try {
368
+ return RhoPhonebook.closePhonebook(arg0);
369
+ } catch(Exception e) {
370
+ LOG.ERROR("closePhonebook failed", e);
371
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
372
+ }
373
+
363
374
  }
364
375
  });
365
376
  klass.getSingletonClass().defineMethod("getallPhonebookRecords", new RubyOneArgMethod() {
366
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
367
- return RhoPhonebook.getallPhonebookRecords(arg0);
377
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block)
378
+ {
379
+ try {
380
+ return RhoPhonebook.getallPhonebookRecords(arg0);
381
+ } catch(Exception e) {
382
+ LOG.ERROR("getallPhonebookRecords failed", e);
383
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
384
+ }
385
+
368
386
  }
369
387
  });
370
388
  klass.getSingletonClass().defineMethod("openPhonebookRecord", new RubyTwoArgMethod() {
371
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block) {
372
- return RhoPhonebook.openPhonebookRecord(arg0, arg1);
389
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block)
390
+ {
391
+ try {
392
+ return RhoPhonebook.openPhonebookRecord(arg0, arg1);
393
+ } catch(Exception e) {
394
+ LOG.ERROR("openPhonebookRecord failed", e);
395
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
396
+ }
397
+
373
398
  }
374
399
  });
375
400
  klass.getSingletonClass().defineMethod("getPhonebookRecord", new RubyTwoArgMethod() {
376
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block) {
377
- return RhoPhonebook.getPhonebookRecord(arg0, arg1);
378
- }
379
- });
380
- klass.getSingletonClass().defineMethod("getfirstPhonebookRecord", new RubyOneArgMethod() {
381
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
382
- return RhoPhonebook.getfirstPhonebookRecord(arg0);
383
- }
384
- });
385
- klass.getSingletonClass().defineMethod("getnextPhonebookRecord", new RubyOneArgMethod() {
386
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
387
- return RhoPhonebook.getnextPhonebookRecord(arg0);
401
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block)
402
+ {
403
+ try {
404
+ return RhoPhonebook.getPhonebookRecord(arg0, arg1);
405
+ } catch(Exception e) {
406
+ LOG.ERROR("getPhonebookRecord failed", e);
407
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
408
+ }
409
+
388
410
  }
389
411
  });
390
412
  klass.getSingletonClass().defineMethod("createRecord", new RubyOneArgMethod() {
391
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
392
- return RhoPhonebook.createRecord(arg0);
413
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block)
414
+ {
415
+ try {
416
+ return RhoPhonebook.createRecord(arg0);
417
+ } catch(Exception e) {
418
+ LOG.ERROR("createRecord failed", e);
419
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
420
+ }
421
+
393
422
  }
394
423
  });
395
424
  klass.getSingletonClass().defineMethod("setRecordValue", new RubyVarArgMethod() {
396
- protected RubyValue run(RubyValue receiver, RubyArray ar, RubyBlock block) {
397
- return RhoPhonebook.setRecordValue(ar);
425
+ protected RubyValue run(RubyValue receiver, RubyArray ar, RubyBlock block)
426
+ {
427
+ try {
428
+ return RhoPhonebook.setRecordValue(ar);
429
+ } catch(Exception e) {
430
+ LOG.ERROR("setRecordValue failed", e);
431
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
432
+ }
433
+
398
434
  }
399
435
  });
400
436
  klass.getSingletonClass().defineMethod("addRecord", new RubyTwoArgMethod() {
401
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block) {
402
- return RhoPhonebook.addRecord(arg0, arg1);
437
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block)
438
+ {
439
+ try {
440
+ return RhoPhonebook.addRecord(arg0, arg1);
441
+ } catch(Exception e) {
442
+ LOG.ERROR("addRecord failed", e);
443
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
444
+ }
445
+
403
446
  }
404
447
  });
405
448
  klass.getSingletonClass().defineMethod("saveRecord", new RubyTwoArgMethod() {
406
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block) {
407
- return RhoPhonebook.saveRecord(arg0, arg1);
449
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block)
450
+ {
451
+ try {
452
+ return RhoPhonebook.saveRecord(arg0, arg1);
453
+ } catch(Exception e) {
454
+ LOG.ERROR("saveRecord failed", e);
455
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
456
+ }
457
+
408
458
  }
409
459
  });
410
460
  klass.getSingletonClass().defineMethod("deleteRecord", new RubyTwoArgMethod() {
411
- protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block) {
412
- return RhoPhonebook.deleteRecord(arg0, arg1);
461
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyValue arg1, RubyBlock block)
462
+ {
463
+ try {
464
+ return RhoPhonebook.deleteRecord(arg0, arg1);
465
+ } catch(Exception e) {
466
+ LOG.ERROR("deleteRecord failed", e);
467
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
468
+ }
469
+
413
470
  }
414
471
  });
415
472
 
@@ -13,6 +13,7 @@ import com.xruby.runtime.builtin.ObjectFactory;
13
13
  import com.xruby.runtime.lang.*;
14
14
  import com.rho.RhoRubyHelper;
15
15
  import net.rim.device.api.system.DeviceInfo;
16
+ import net.rim.device.api.system.Backlight;
16
17
 
17
18
  public class System {
18
19
 
@@ -109,12 +110,32 @@ public class System {
109
110
  });
110
111
  klass.getSingletonClass().defineMethod("exit", new RubyNoArgMethod() {
111
112
  protected RubyValue run(RubyValue receiver, RubyBlock block) {
112
- synchronized(RhodesApplication.getInstance().getEventLock()) {
113
+ //synchronized(RhodesApplication.getInstance().getEventLock()) {
113
114
  RhodesApplication.getInstance().close();
114
115
  return RubyConstant.QNIL;
116
+ //}
117
+ }
118
+ });
119
+
120
+ klass.getSingletonClass().defineMethod( "set_sleeping", new RubyOneArgMethod(){
121
+ protected RubyValue run(RubyValue receiver, RubyValue arg1, RubyBlock block )
122
+ {
123
+ try {
124
+ RubyValue ret = !Backlight.isEnabled() ? RubyConstant.QTRUE : RubyConstant.QFALSE;
125
+
126
+ if ( arg1 != RubyConstant.QTRUE )
127
+ Backlight.enable(true, 255);
128
+ else
129
+ Backlight.enable(false, Backlight.getTimeoutDefault());
130
+
131
+ return ret;
132
+ } catch(Exception e) {
133
+ LOG.ERROR("set_sleeping failed", e);
134
+ throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
115
135
  }
116
136
  }
117
137
  });
138
+
118
139
  }
119
140
 
120
141
  //@RubyLevelMethod(name="get_property", module=true)
@@ -46,6 +46,26 @@ public class PushListeningThread extends Thread {
46
46
  }
47
47
  }
48
48
 
49
+ public static boolean isMDSPushEnabled()
50
+ {
51
+ if ( !RhoConf.getInstance().isExist("push_options") )
52
+ return true;
53
+
54
+ String strOptions = RhoConf.getInstance().getString("push_options");
55
+
56
+ return strOptions.indexOf("mds") >= 0;
57
+ }
58
+
59
+ public static boolean isPushServiceEnabled()
60
+ {
61
+ if ( !RhoConf.getInstance().isExist("push_options") )
62
+ return true;
63
+
64
+ String strOptions = RhoConf.getInstance().getString("push_options");
65
+
66
+ return strOptions.indexOf("push_service") >= 0;
67
+ }
68
+
49
69
  public void run()
50
70
  {
51
71
 
@@ -179,7 +199,7 @@ public class PushListeningThread extends Thread {
179
199
  }
180
200
  }
181
201
 
182
- private String[] split(String original, String separator) {
202
+ private static String[] split(String original, String separator) {
183
203
  Vector nodes = new Vector();
184
204
  // Parse nodes into vector
185
205
  int index = original.indexOf(separator);
@@ -202,7 +222,7 @@ public class PushListeningThread extends Thread {
202
222
  return result;
203
223
  }
204
224
 
205
- private String[] splitOnce(String original, String separator) {
225
+ private static String[] splitOnce(String original, String separator) {
206
226
  String[] result;
207
227
  int index = original.indexOf(separator);
208
228
  if (index>=0) {
@@ -216,19 +236,19 @@ public class PushListeningThread extends Thread {
216
236
  return result;
217
237
  }
218
238
 
219
- private void showPopup(String message) {
239
+ private static void showPopup(String message) {
220
240
  com.rho.rubyext.Alert.showPopup(message);
221
241
  }
222
242
 
223
- private void vibrate(String duration) {
243
+ private static void vibrate(String duration) {
224
244
  com.rho.rubyext.Alert.vibrate(duration);
225
245
  }
226
246
 
227
- private void play_file(String file_name, String media_type) {
247
+ private static void play_file(String file_name, String media_type) {
228
248
  com.rho.rubyext.Alert.play_file(file_name, media_type);
229
249
  }
230
250
 
231
- private void processPushMessage(final byte[] data, int nLen)
251
+ public static void processPushMessage(final byte[] data, int nLen)
232
252
  {
233
253
  /* Application.getApplication().invokeLater(new Runnable()
234
254
  {
@@ -52,7 +52,7 @@ import com.xruby.runtime.lang.RubyProgram;
52
52
  /**
53
53
  *
54
54
  */
55
- final public class RhodesApplication extends UiApplication implements SystemListener, ISyncStatusListener//, FileSystemListener
55
+ final public class RhodesApplication extends RhodesApplicationPlatform implements SystemListener, ISyncStatusListener
56
56
  {
57
57
  // Menu Labels
58
58
  public static final String LABEL_HOME = "Home";
@@ -69,6 +69,7 @@ final public class RhodesApplication extends UiApplication implements SystemList
69
69
  private static final RhoLogger LOG = RhoLogger.RHO_STRIP_LOG ? new RhoEmptyLogger() :
70
70
  new RhoLogger("RhodesApplication");
71
71
 
72
+
72
73
  class CKeyListener implements KeyListener{
73
74
 
74
75
  public boolean keyChar(char key, int status, int time) {
@@ -402,6 +403,7 @@ final public class RhodesApplication extends UiApplication implements SystemList
402
403
  void doClose(){
403
404
  LOG.TRACE("Rhodes DO CLOSE ***--------------------------***");
404
405
 
406
+ onPlatformClose();
405
407
  if ( _pushListeningThread != null )
406
408
  _pushListeningThread.stop();
407
409
 
@@ -512,6 +514,8 @@ final public class RhodesApplication extends UiApplication implements SystemList
512
514
  navigateHome();
513
515
  }
514
516
 
517
+ onPlatformActivate();
518
+
515
519
  LOG.TRACE("Rhodes end activate ***--------------------------***");
516
520
  }
517
521
 
@@ -1001,10 +1005,11 @@ final public class RhodesApplication extends UiApplication implements SystemList
1001
1005
 
1002
1006
  try {
1003
1007
  RhoClassFactory.getNetworkAccess().configure();
1008
+
1004
1009
  } catch(IOException exc) {
1005
1010
  LOG.ERROR(exc.getMessage());
1006
1011
  }
1007
-
1012
+
1008
1013
  PrimaryResourceFetchThread.Create(this);
1009
1014
  LOG.INFO("RHODES STARTUP COMPLETED: ***----------------------------------*** " );
1010
1015
 
@@ -1154,8 +1159,14 @@ final public class RhodesApplication extends UiApplication implements SystemList
1154
1159
  navigateUrl(strStartPage);
1155
1160
  }
1156
1161
 
1157
- public void close() {
1158
- _mainScreen.close();
1162
+ public void close()
1163
+ {
1164
+ this.invokeLater(new Runnable() {
1165
+ public void run()
1166
+ {
1167
+ _mainScreen.close();
1168
+ }
1169
+ });
1159
1170
  }
1160
1171
 
1161
1172
  public void processConnection(HttpConnection connection, Object e)
@@ -1209,10 +1220,13 @@ final public class RhodesApplication extends UiApplication implements SystemList
1209
1220
  return;
1210
1221
  }
1211
1222
 
1212
- if (com.rho.Capabilities.ENABLE_PUSH)
1223
+ if ( com.rho.Capabilities.ENABLE_PUSH )
1213
1224
  {
1214
- _pushListeningThread = new PushListeningThread();
1215
- _pushListeningThread.start();
1225
+ if ( PushListeningThread.isMDSPushEnabled() )
1226
+ {
1227
+ _pushListeningThread = new PushListeningThread();
1228
+ _pushListeningThread.start();
1229
+ }
1216
1230
  }
1217
1231
 
1218
1232
  while( !m_bExit )
@@ -0,0 +1,528 @@
1
+ package rhomobile.bluetooth;
2
+
3
+ import rhomobile.RhodesApplication;
4
+
5
+ import net.rim.device.api.bluetooth.BluetoothSerialPort;
6
+ import net.rim.device.api.bluetooth.BluetoothSerialPortInfo;
7
+ import net.rim.device.api.io.http.HttpHeaders;
8
+ import net.rim.device.api.system.DeviceInfo;
9
+ import net.rim.device.api.ui.UiApplication;
10
+ import net.rim.device.api.ui.container.MainScreen;
11
+
12
+ import com.rho.RhoEmptyLogger;
13
+ import com.rho.RhoLogger;
14
+ import com.xruby.runtime.builtin.ObjectFactory;
15
+ import com.xruby.runtime.builtin.RubyArray;
16
+ import com.xruby.runtime.builtin.RubyFixnum;
17
+ import com.xruby.runtime.builtin.RubyInteger;
18
+ import com.xruby.runtime.builtin.RubyString;
19
+ import com.xruby.runtime.lang.*;
20
+
21
+
22
+ public class BluetoothManager /*extends RubyBasic*/ implements BluetoothScreen.BluetoothScreenCallback, BluetoothPort.BluetoothPortListener {
23
+
24
+ private static final RhoLogger LOG = RhoLogger.RHO_STRIP_LOG ? new RhoEmptyLogger() :
25
+ new RhoLogger("Bluetooth");
26
+
27
+
28
+ public static String BT_OK = "OK";
29
+ public static String BT_CANCEL = "CANCEL";
30
+ public static String BT_ERROR = "ERROR";
31
+
32
+ public static String BT_ROLE_SERVER = "ROLE_SERVER";
33
+ public static String BT_ROLE_CLIENT = "ROLE_CLIENT";
34
+
35
+ public static String BT_SESSION_INPUT_DATA_RECEIVED = "SESSION_INPUT_DATA_RECEIVED";
36
+ public static String BT_SESSION_DISCONNECT = "SESSION_DISCONNECT";
37
+
38
+ private static BluetoothManager ourBluetoothManager = null;
39
+
40
+ private String mCreateSessionCallback = null;
41
+ private String mSessionCallback = null;
42
+ private String mConnectedDeviceName = null;
43
+ private String mLocalDeviceName = null;
44
+ private BluetoothScreen mScreen = null;
45
+ private BluetoothSerialPortInfo[] mDevices = null;
46
+ private BluetoothPort mPort = null;
47
+
48
+
49
+
50
+ public static void rhoLogInfo(String msg) {
51
+ LOG.INFO(msg);
52
+ //LOG.ERROR(msg);
53
+ }
54
+
55
+ public static void rhoLogError(String msg) {
56
+ LOG.ERROR(msg);
57
+ }
58
+
59
+ public static BluetoothManager getInstance() {
60
+ if (ourBluetoothManager == null) {
61
+ ourBluetoothManager = new BluetoothManager();
62
+ ourBluetoothManager.init();
63
+ }
64
+ return ourBluetoothManager;
65
+ }
66
+
67
+ private void init() {
68
+ mLocalDeviceName = "Blackberry device";//DeviceInfo.getDeviceName();
69
+ mScreen = null;
70
+ mPort = null;
71
+ }
72
+
73
+ private void freeAll() {
74
+ if (mScreen != null) {
75
+ rhoPopScreen(mScreen);
76
+ mScreen = null;
77
+ }
78
+ }
79
+
80
+ public static void rhoPushScreen(MainScreen screen) {
81
+ RhodesApplication app = (RhodesApplication)UiApplication.getUiApplication();
82
+ final MainScreen scr = screen;
83
+ app.invokeLater(new Runnable()
84
+ {
85
+ public void run()
86
+ {
87
+ UiApplication app = UiApplication.getUiApplication();
88
+ app.pushScreen(scr);
89
+ app.requestForeground();
90
+ }
91
+ });
92
+ }
93
+
94
+ public static void rhoPopScreen(MainScreen screen) {
95
+ RhodesApplication app = (RhodesApplication)UiApplication.getUiApplication();
96
+ final MainScreen scr = screen;
97
+ app.invokeLater(new Runnable()
98
+ {
99
+ public void run()
100
+ {
101
+ UiApplication app = UiApplication.getUiApplication();
102
+ app.popScreen(scr);
103
+ app.requestForeground();
104
+ }
105
+ });
106
+ }
107
+
108
+ public void closeBluetoothScreenSilent() {
109
+ RhodesApplication app = (RhodesApplication)UiApplication.getUiApplication();
110
+ final BluetoothScreen scr = mScreen;
111
+ mScreen = null;
112
+ if (scr != null) {
113
+ app.invokeLater(new Runnable()
114
+ {
115
+ public void run()
116
+ {
117
+ if (scr != null) {
118
+ scr.closeSilent();
119
+ }
120
+ }
121
+ });
122
+ }
123
+ }
124
+
125
+ // BluetoothScreenCallback
126
+ public void onBluetoothScreenCancel() {
127
+ rhoLogInfo("onBluetoothScreenCancel()");
128
+ if (mPort != null) {
129
+ mPort.disconnect();
130
+ mPort = null;
131
+ }
132
+ fireCreateSessionCallback(BT_CANCEL, "");
133
+ mScreen = null;
134
+ }
135
+
136
+ // BluetoothScreenCallback
137
+ public void onBluetoothScreenSelect(int index) {
138
+ rhoLogInfo("onBluetoothScreenSelect("+String.valueOf(index)+")");
139
+ UiApplication app = UiApplication.getUiApplication();
140
+ final int i = index;
141
+ app.invokeLater(new Runnable()
142
+ {
143
+ public void run()
144
+ {
145
+ getInstance().mPort = new BluetoothPort(mDevices[i], getInstance());
146
+ }
147
+ });
148
+ mScreen = null;
149
+ }
150
+
151
+ // BluetoothPortListener
152
+ public void onBluetoothPortDisconnect() {
153
+ fireSessionCallback(mPort.getConnectedDeviceName(), BT_SESSION_DISCONNECT);
154
+ }
155
+
156
+ // BluetoothPortListener
157
+ public void onBluetoothPortError() {
158
+ fireSessionCallback(mPort.getConnectedDeviceName(), BT_ERROR);
159
+ }
160
+
161
+ // BluetoothPortListener
162
+ public void onBluetoothPortDataReceived() {
163
+ fireSessionCallback(mPort.getConnectedDeviceName(), BT_SESSION_INPUT_DATA_RECEIVED);
164
+ }
165
+
166
+ // BluetoothPortListener
167
+ public void onBluetoothPortConnected(boolean success) {
168
+ if (success) {
169
+ fireCreateSessionCallback(BT_OK, mPort.getConnectedDeviceName());
170
+ }
171
+ else {
172
+ fireCreateSessionCallback(BT_ERROR, mPort.getConnectedDeviceName());
173
+ }
174
+ closeBluetoothScreenSilent();
175
+ }
176
+
177
+ private void fireCreateSessionCallback(String status, String connected_device_name) {
178
+ String body = "&status=";
179
+ body += status;
180
+ body += "&connected_device_name=";
181
+ body += connected_device_name;
182
+ if (mCreateSessionCallback != null) {
183
+ rhoLogInfo("fire Create Session Callback status="+status+", connected_device_name="+connected_device_name);
184
+ fireRhodeCallback(mCreateSessionCallback, body);
185
+ }
186
+ else {
187
+ rhoLogError("fire Create Session Callback ERROR - Create Session callback not defined");
188
+ }
189
+ }
190
+
191
+ private void fireSessionCallback(String connected_device_name, String event_type) {
192
+ String body = "&connected_device_name=";
193
+ body += connected_device_name;
194
+ body += "&event_type=";
195
+ body += event_type;
196
+ if (mSessionCallback != null) {
197
+ rhoLogInfo("fire Session Callback connected_device_name="+connected_device_name+", event="+event_type);
198
+ fireRhodeCallback(mSessionCallback, body);
199
+ }
200
+ else {
201
+ rhoLogError("fire Session Callback ERROR - Session callback not defined");
202
+ }
203
+ }
204
+
205
+ private void fireRhodeCallback(String callback_url, String body) {
206
+ RhodesApplication app = (RhodesApplication)UiApplication.getUiApplication();
207
+ HttpHeaders headers = new HttpHeaders();
208
+ headers.addProperty("Content-Type", "application/x-www-form-urlencoded");
209
+ app.postUrl(callback_url, body, headers);
210
+ }
211
+
212
+
213
+ public static int is_bluetooth_available() {
214
+ return BluetoothSerialPort.isSupported()?1:0;
215
+ }
216
+
217
+ public static void off_bluetooth() {
218
+ rhoLogInfo("off_bluetooth()");
219
+ getInstance().freeAll();
220
+ ourBluetoothManager = null;
221
+ }
222
+
223
+ public static void set_device_name(String device_name) {
224
+ getInstance().mLocalDeviceName = device_name;
225
+ }
226
+
227
+ public static String get_device_name() {
228
+ return getInstance().mLocalDeviceName;
229
+ }
230
+ public static String get_last_error() {
231
+ return BT_OK;
232
+ }
233
+
234
+ public static String create_session(String role, String callback_url) {
235
+ rhoLogInfo("create_session("+role+", "+callback_url+")");
236
+ getInstance().mCreateSessionCallback = callback_url;
237
+ if (BT_ROLE_CLIENT.equals(role)) {
238
+ // client
239
+ if (is_bluetooth_available() != 0) {
240
+ getInstance().mDevices = BluetoothSerialPort.getSerialPortInfo();
241
+ int count = getInstance().mDevices.length;
242
+ String devices[] = new String[count];
243
+ int i;
244
+ for (i = 0; i < count; i++) {
245
+ devices[i] = getInstance().mDevices[i].getDeviceName();
246
+ }
247
+ getInstance().mScreen = new BluetoothScreen(BluetoothScreen.BLUETOOTH_SCREEN_TYPE_CLIENT, devices, getInstance());
248
+ }
249
+ else {
250
+ getInstance().mScreen = new BluetoothScreen(BluetoothScreen.BLUETOOTH_SCREEN_TYPE_UNSUPPORTED, null, getInstance());
251
+ }
252
+ rhoPushScreen(getInstance().mScreen);
253
+ }
254
+ else {
255
+ // server
256
+ if (is_bluetooth_available() != 0) {
257
+ getInstance().mPort = new BluetoothPort(null, getInstance());
258
+ getInstance().mScreen = new BluetoothScreen(BluetoothScreen.BLUETOOTH_SCREEN_TYPE_SERVER, null, getInstance());
259
+ rhoPushScreen(getInstance().mScreen);
260
+ getInstance().mPort.startListenThread();
261
+ }
262
+ else {
263
+ getInstance().mScreen = new BluetoothScreen(BluetoothScreen.BLUETOOTH_SCREEN_TYPE_UNSUPPORTED, null, getInstance());
264
+ rhoPushScreen(getInstance().mScreen);
265
+ }
266
+ }
267
+ return BT_OK;
268
+ }
269
+
270
+ public static void session_set_callback(String connected_device_name, String callback_url) {
271
+ rhoLogInfo("session_set_callback("+connected_device_name+", "+callback_url+")");
272
+ getInstance().mSessionCallback = callback_url;
273
+ }
274
+
275
+ public static void session_disconnect(String connected_device_name) {
276
+ rhoLogInfo("session_disconnect("+connected_device_name+")");
277
+ if (getInstance().mPort != null) {
278
+ getInstance().mPort.disconnect();
279
+ getInstance().mPort = null;
280
+ }
281
+ else {
282
+ getInstance().fireSessionCallback("", BT_ERROR);
283
+ }
284
+ }
285
+
286
+ public static int session_get_status(String connected_device_name) {
287
+ rhoLogInfo("session_get_status("+connected_device_name+")");
288
+ if (getInstance().mPort != null) {
289
+ int status = getInstance().mPort.getStatus();
290
+ rhoLogInfo("session_get_status() return = "+String.valueOf(status));
291
+ return status;
292
+ }
293
+ else {
294
+ getInstance().fireSessionCallback("", BT_ERROR);
295
+ }
296
+ return 0;
297
+ }
298
+
299
+ public static String session_read_string(String connected_device_name) {
300
+ rhoLogInfo("session_read_string("+connected_device_name+")");
301
+ if (getInstance().mPort != null) {
302
+ byte[] data = getInstance().mPort.readData();
303
+ String str = new String(data,0,data.length);
304
+ rhoLogInfo("session_read_string() return = ["+str+"]");
305
+ return str;
306
+ }
307
+ else {
308
+ getInstance().fireSessionCallback("", BT_ERROR);
309
+ }
310
+ return "";
311
+ }
312
+
313
+ public static void session_write_string(String connected_device_name, String str) {
314
+ rhoLogInfo("session_write_string("+connected_device_name+", "+str+")");
315
+ if (getInstance().mPort != null) {
316
+ byte[] data = str.getBytes();
317
+ getInstance().mPort.writeData(data);
318
+ }
319
+ else {
320
+ getInstance().fireSessionCallback("", BT_ERROR);
321
+ }
322
+ }
323
+
324
+ public static byte[] session_read_data(String connected_device_name) {
325
+ rhoLogInfo("session_read_data()");
326
+ if (getInstance().mPort != null) {
327
+ return getInstance().mPort.readData();
328
+ }
329
+ else {
330
+ getInstance().fireSessionCallback("", BT_ERROR);
331
+ }
332
+ byte[] m = new byte[0];
333
+ return m;
334
+ }
335
+
336
+ public static void session_write_data(String connected_device_name, byte[] data) {
337
+ rhoLogInfo("session_write_data()");
338
+ if (getInstance().mPort != null) {
339
+ getInstance().mPort.writeData(data);
340
+ }
341
+ else {
342
+ getInstance().fireSessionCallback("", BT_ERROR);
343
+ }
344
+ }
345
+
346
+
347
+ public static void initMethods(RubyClass klass) {
348
+
349
+ klass.getSingletonClass().defineMethod("is_bluetooth_available", new RubyNoArgMethod() {
350
+ protected RubyValue run(RubyValue receiver, RubyBlock block) {
351
+ RubyValue res = RubyConstant.QFALSE;
352
+ if (is_bluetooth_available() != 0) {
353
+ res = RubyConstant.QTRUE;
354
+ }
355
+ return res;
356
+ }
357
+ });
358
+ klass.getSingletonClass().defineMethod("off_bluetooth", new RubyNoArgMethod() {
359
+ protected RubyValue run(RubyValue receiver, RubyBlock block) {
360
+ off_bluetooth();
361
+ return RubyConstant.QNIL;
362
+ }
363
+ });
364
+
365
+ klass.getSingletonClass().defineMethod("set_device_name", new RubyOneArgMethod() {
366
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
367
+ if ( arg0 instanceof RubyString )
368
+ {
369
+ String device_name = arg0.toString();
370
+ set_device_name(device_name);
371
+ }
372
+ else {
373
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.set_device_name: wrong argument type.Should be String");
374
+ }
375
+ return RubyConstant.QNIL;
376
+ }
377
+ });
378
+ klass.getSingletonClass().defineMethod("get_device_name", new RubyNoArgMethod() {
379
+ protected RubyValue run(RubyValue receiver, RubyBlock block) {
380
+ return ObjectFactory.createString(get_device_name());
381
+ }
382
+ });
383
+ klass.getSingletonClass().defineMethod("get_last_error", new RubyNoArgMethod() {
384
+ protected RubyValue run(RubyValue receiver, RubyBlock block) {
385
+ return ObjectFactory.createString(get_last_error());
386
+ }
387
+ });
388
+ klass.getSingletonClass().defineMethod("create_session", new RubyTwoArgMethod() {
389
+ protected RubyValue run(RubyValue receiver, RubyValue arg1, RubyValue arg2, RubyBlock block) {
390
+ if ( (arg1 instanceof RubyString) && (arg2 instanceof RubyString) )
391
+ {
392
+ String role = arg1.toString();
393
+ String callback_url = arg2.toString();
394
+ return ObjectFactory.createString(create_session(role, callback_url));
395
+ }
396
+ else {
397
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.create_session: wrong argument type.Should be String");
398
+ }
399
+ }
400
+ });
401
+
402
+ klass.getSingletonClass().defineMethod("session_set_callback", new RubyTwoArgMethod() {
403
+ protected RubyValue run(RubyValue receiver, RubyValue arg1, RubyValue arg2, RubyBlock block) {
404
+ if ( (arg1 instanceof RubyString) && (arg2 instanceof RubyString) )
405
+ {
406
+ String connected_device_name = arg1.toString();
407
+ String callback_url = arg2.toString();
408
+ session_set_callback(connected_device_name, callback_url);
409
+ }
410
+ else {
411
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.session_set_callback: wrong argument type.Should be String");
412
+ }
413
+ return RubyConstant.QNIL;
414
+ }
415
+ });
416
+ klass.getSingletonClass().defineMethod("session_disconnect", new RubyOneArgMethod() {
417
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
418
+ if ( arg0 instanceof RubyString )
419
+ {
420
+ String connected_device_name = arg0.toString();
421
+ session_disconnect(connected_device_name);
422
+ }
423
+ else {
424
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.session_disconnect: wrong argument type.Should be String");
425
+ }
426
+ return RubyConstant.QNIL;
427
+ }
428
+ });
429
+ klass.getSingletonClass().defineMethod("session_get_status", new RubyOneArgMethod() {
430
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
431
+ if ( arg0 instanceof RubyString )
432
+ {
433
+ String connected_device_name = arg0.toString();
434
+ int status = session_get_status(connected_device_name);
435
+ return ObjectFactory.createInteger(status);
436
+ }
437
+ else {
438
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.session_get_status: wrong argument type.Should be String");
439
+ }
440
+ }
441
+ });
442
+ klass.getSingletonClass().defineMethod("session_read_string", new RubyOneArgMethod() {
443
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
444
+ if ( arg0 instanceof RubyString )
445
+ {
446
+ String connected_device_name = arg0.toString();
447
+ String str = session_read_string(connected_device_name);
448
+ return ObjectFactory.createString(str);
449
+ }
450
+ else {
451
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.session_read_string: wrong argument type.Should be String");
452
+ }
453
+ }
454
+ });
455
+ klass.getSingletonClass().defineMethod("session_write_string", new RubyTwoArgMethod() {
456
+ protected RubyValue run(RubyValue receiver, RubyValue arg1, RubyValue arg2, RubyBlock block) {
457
+ if ( (arg1 instanceof RubyString) && (arg2 instanceof RubyString) )
458
+ {
459
+ String connected_device_name = arg1.toString();
460
+ String str = arg2.toString();
461
+ session_write_string(connected_device_name, str);
462
+ }
463
+ else {
464
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.session_write_string: wrong argument type.Should be String");
465
+ }
466
+ return RubyConstant.QNIL;
467
+ }
468
+ });
469
+ klass.getSingletonClass().defineMethod("session_read_data", new RubyOneArgMethod() {
470
+ protected RubyValue run(RubyValue receiver, RubyValue arg0, RubyBlock block) {
471
+ if ( arg0 instanceof RubyString )
472
+ {
473
+ String connected_device_name = arg0.toString();
474
+ byte[] data = session_read_data(connected_device_name);
475
+ RubyArray ruby_ar = ObjectFactory.createArray(data.length, data.length, false);
476
+ int i;
477
+ for (i = 0; i < data.length; i++) {
478
+ ruby_ar.and(ObjectFactory.createFixnum(data[i]));
479
+ }
480
+ return ruby_ar;
481
+ }
482
+ else {
483
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in session_read_data: wrong argument type.Should be String");
484
+ }
485
+ }
486
+ });
487
+ klass.getSingletonClass().defineMethod("session_write_data", new RubyTwoArgMethod() {
488
+ protected RubyValue run(RubyValue receiver, RubyValue arg1, RubyValue arg2, RubyBlock block) {
489
+ if ( (arg1 instanceof RubyString) && (arg2 instanceof RubyArray) )
490
+ {
491
+ String connected_device_name = arg1.toString();
492
+ RubyArray ruby_ar = (RubyArray)arg2;
493
+ int i;
494
+ byte[] data = new byte[ruby_ar.size()];
495
+ for (i = 0; i < ruby_ar.size(); i++) {
496
+ RubyValue num = ruby_ar.get(i);
497
+ int b = 0;
498
+ if (num instanceof RubyFixnum) {
499
+ RubyFixnum rv = (RubyFixnum)num;
500
+ b = rv.toInt();
501
+ }
502
+ else {
503
+ if (num instanceof RubyInteger) {
504
+ RubyInteger rv = (RubyInteger)num;
505
+ b = rv.toInt();
506
+ }
507
+ else {
508
+ if (num instanceof RubySymbol) {
509
+ RubySymbol rv = (RubySymbol)num;
510
+ b = rv.toInt();
511
+ }
512
+ else {
513
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.session_write_data: wrong argument type.Should be Array of Fixnums or Integers");
514
+ }
515
+ }
516
+ }
517
+ data[i] = (byte)b;
518
+ }
519
+ session_write_data(connected_device_name, data);
520
+ }
521
+ else {
522
+ throw new RubyException(RubyRuntime.ArgumentErrorClass, "in RhoBluetooth.session_write_data: wrong argument type.Should be String second should be Array");
523
+ }
524
+ return RubyConstant.QNIL;
525
+ }
526
+ });
527
+ }
528
+ }