rhodes 2.1.0 → 2.2.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -135,6 +135,16 @@ RHO_GLOBAL int rho_sysimpl_get_property(char* szPropName, VALUE* resValue)
135
135
  return 0;
136
136
  }
137
137
 
138
+
139
+ RHO_GLOBAL int rho_sys_set_sleeping(int sleeping) {
140
+ JNIEnv *env = jnienv();
141
+ jclass cls = getJNIClass(RHODES_JAVA_CLASS_RHODES_SERVICE);
142
+ if (!cls) return 0;
143
+ jmethodID mid = getJNIClassStaticMethod(env, cls, "rho_sys_set_sleeping", "(I)I");
144
+ if (!mid) return 0;
145
+ return env->CallStaticIntMethod(cls, mid, sleeping);
146
+ }
147
+
138
148
  RHO_GLOBAL VALUE rho_sys_get_locale()
139
149
  {
140
150
  VALUE res;
@@ -0,0 +1,429 @@
1
+ #include "rhodes/JNIRhodes.h"
2
+
3
+ #include <ruby.h>
4
+ #include <ruby/ext/calendar/event.h>
5
+
6
+ #undef DEFAULT_LOGCATEGORY
7
+ #define DEFAULT_LOGCATEGORY "Event"
8
+
9
+ #ifdef RHO_TRACE
10
+ #undef RHO_TRACE
11
+ #endif
12
+
13
+ #ifdef RHO_EVENT_ENABLE_TRACE
14
+ #include <android/log.h>
15
+ #define RHO_TRACE(fmt, ...) __android_log_print(ANDROID_LOG_INFO, "Event", "%s:%d: " fmt, ##__VA_ARGS__)
16
+ #else
17
+ #define RHO_TRACE(...)
18
+ #endif
19
+
20
+ template <typename Out, typename In>
21
+ Out date_cast(In value);
22
+
23
+ template <>
24
+ jobject date_cast<jobject, VALUE>(VALUE rDate)
25
+ {
26
+ if (NIL_P(rDate))
27
+ return NULL;
28
+
29
+ RHO_TRACE("dateFromRuby (1)");
30
+ if (TYPE(rDate) == T_STRING)
31
+ {
32
+ RHO_TRACE("dateFromRuby (1.1)");
33
+ rDate = rb_funcall(rb_cTime, rb_intern("parse"), 1, rDate);
34
+ RHO_TRACE("dateFromRuby (1.2)");
35
+ }
36
+ VALUE cDate = rb_class_of(rDate);
37
+ if (!rb_equal(cDate, rb_cTime))
38
+ rb_raise(rb_eArgError, "Wrong type of parameter: %s (Time expected)", rb_class2name(cDate));
39
+
40
+ RHO_TRACE("dateFromRuby (2)");
41
+ int year = NUM2INT(rb_funcall(rDate, rb_intern("year"), 0)) - 1900;
42
+ RHO_TRACE("dateFromRuby (3)");
43
+ int month = NUM2INT(rb_funcall(rDate, rb_intern("month"), 0)) - 1;
44
+ RHO_TRACE("dateFromRuby (4)");
45
+ int day = NUM2INT(rb_funcall(rDate, rb_intern("day"), 0));
46
+ RHO_TRACE("dateFromRuby (5)");
47
+ int hour = NUM2INT(rb_funcall(rDate, rb_intern("hour"), 0));
48
+ RHO_TRACE("dateFromRuby (6)");
49
+ int minute = NUM2INT(rb_funcall(rDate, rb_intern("min"), 0));
50
+ RHO_TRACE("dateFromRuby (7)");
51
+ int second = NUM2INT(rb_funcall(rDate, rb_intern("sec"), 0));
52
+ RHO_TRACE("dateFromRuby (8)");
53
+
54
+ JNIEnv *env = jnienv();
55
+ jclass cls = getJNIClass(RHODES_JAVA_CLASS_DATE);
56
+ if (!cls) return NULL;
57
+ jmethodID mid = getJNIClassMethod(env, cls, "<init>", "(IIIIII)V");
58
+ if (!mid) return NULL;
59
+
60
+ RHO_TRACE("dateFromRuby (9)");
61
+ jobject jDate = env->NewObject(cls, mid, year, month, day, hour, minute, second);
62
+ return jDate;
63
+ }
64
+
65
+ template <>
66
+ VALUE date_cast<VALUE, jobject>(jobject jDate)
67
+ {
68
+ if (!jDate)
69
+ return Qnil;
70
+
71
+ RHO_TRACE("dateToRuby (1)");
72
+
73
+ JNIEnv *env = jnienv();
74
+ jclass cls = getJNIClass(RHODES_JAVA_CLASS_DATE);
75
+ if (!cls) return Qnil;
76
+ jmethodID midYear = getJNIClassMethod(env, cls, "getYear", "()I");
77
+ if (!midYear) return Qnil;
78
+ jmethodID midMonth = getJNIClassMethod(env, cls, "getMonth", "()I");
79
+ if (!midMonth) return Qnil;
80
+ jmethodID midDay = getJNIClassMethod(env, cls, "getDate", "()I");
81
+ if (!midDay) return Qnil;
82
+ jmethodID midHours = getJNIClassMethod(env, cls, "getHours", "()I");
83
+ if (!midHours) return Qnil;
84
+ jmethodID midMinutes = getJNIClassMethod(env, cls, "getMinutes", "()I");
85
+ if (!midMinutes) return Qnil;
86
+ jmethodID midSeconds = getJNIClassMethod(env, cls, "getSeconds", "()I");
87
+ if (!midSeconds) return Qnil;
88
+
89
+ RHO_TRACE("dateToRuby (2)");
90
+
91
+ int year = env->CallIntMethod(jDate, midYear) + 1900;
92
+ int month = env->CallIntMethod(jDate, midMonth) + 1;
93
+ int day = env->CallIntMethod(jDate, midDay);
94
+ int hour = env->CallIntMethod(jDate, midHours);
95
+ int minute = env->CallIntMethod(jDate, midMinutes);
96
+ int second = env->CallIntMethod(jDate, midSeconds);
97
+
98
+ RHO_TRACE("dateToRuby (3)");
99
+ VALUE rDate = rb_funcall(rb_cTime, rb_intern("mktime"), 7, INT2FIX(year), INT2FIX(month), INT2FIX(day),
100
+ INT2FIX(hour), INT2FIX(minute), INT2FIX(second), INT2FIX(0));
101
+
102
+ RHO_TRACE("dateToRuby (4)");
103
+ return rDate;
104
+ }
105
+
106
+ static jclass clsEvent;
107
+ static jfieldID fidId;
108
+ static jfieldID fidTitle;
109
+ static jfieldID fidStartDate;
110
+ static jfieldID fidEndDate;
111
+ static jfieldID fidLastModified;
112
+ static jfieldID fidLocation;
113
+ static jfieldID fidNotes;
114
+ static jfieldID fidPrivacy;
115
+
116
+ static bool init_event_stuff(JNIEnv *env)
117
+ {
118
+ static bool initialized = false;
119
+ if (initialized)
120
+ return true;
121
+
122
+ clsEvent = getJNIClass(RHODES_JAVA_CLASS_EVENT);
123
+ if (!clsEvent) return false;
124
+ fidId = getJNIClassField(env, clsEvent, "id", "Ljava/lang/String;");
125
+ if (!fidId) return false;
126
+ fidTitle = getJNIClassField(env, clsEvent, "title", "Ljava/lang/String;");
127
+ if (!fidTitle) return false;
128
+ fidStartDate = getJNIClassField(env, clsEvent, "startDate", "Ljava/util/Date;");
129
+ if (!fidStartDate) return false;
130
+ fidEndDate = getJNIClassField(env, clsEvent, "endDate", "Ljava/util/Date;");
131
+ if (!fidEndDate) return false;
132
+ fidLastModified = getJNIClassField(env, clsEvent, "lastModified", "Ljava/util/Date;");
133
+ if (!fidLastModified) return false;
134
+ fidLocation = getJNIClassField(env, clsEvent, "location", "Ljava/lang/String;");
135
+ if (!fidLocation) return false;
136
+ fidNotes = getJNIClassField(env, clsEvent, "notes", "Ljava/lang/String;");
137
+ if (!fidNotes) return false;
138
+ fidPrivacy = getJNIClassField(env, clsEvent, "privacy", "Ljava/lang/String;");
139
+ if (!fidPrivacy) return false;
140
+
141
+ initialized = true;
142
+ return true;
143
+ }
144
+
145
+ template <typename Out, typename In>
146
+ Out event_cast(In value);
147
+
148
+ template <>
149
+ jobject event_cast<jobject, VALUE>(VALUE rEvent)
150
+ {
151
+ if (NIL_P(rEvent))
152
+ return NULL;
153
+
154
+ RHO_TRACE("eventFromRuby (1)");
155
+ JNIEnv *env = jnienv();
156
+ if (!init_event_stuff(env))
157
+ return NULL;
158
+
159
+ RHO_TRACE("eventFromRuby (2)");
160
+ VALUE rId = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_ID));
161
+ if (NIL_P(rId))
162
+ rId = rb_str_new2("");
163
+ Check_Type(rId, T_STRING);
164
+
165
+ RHO_TRACE("eventFromRuby (3)");
166
+ jmethodID mid = getJNIClassMethod(env, clsEvent, "<init>", "(Ljava/lang/String;)V");
167
+ if (!mid) return NULL;
168
+ jobject jEvent = env->NewObject(clsEvent, mid, env->NewStringUTF(RSTRING_PTR(rId)));
169
+ if (!jEvent) return NULL;
170
+
171
+ RHO_TRACE("eventFromRuby (4)");
172
+ VALUE rTitle = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_TITLE));
173
+ if (!NIL_P(rTitle))
174
+ {
175
+ Check_Type(rTitle, T_STRING);
176
+ env->SetObjectField(jEvent, fidTitle, env->NewStringUTF(RSTRING_PTR(rTitle)));
177
+ }
178
+
179
+ RHO_TRACE("eventFromRuby (5)");
180
+ VALUE rStartDate = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_START_DATE));
181
+ if (!NIL_P(rStartDate))
182
+ env->SetObjectField(jEvent, fidStartDate, date_cast<jobject>(rStartDate));
183
+
184
+ RHO_TRACE("eventFromRuby (6)");
185
+ VALUE rEndDate = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_END_DATE));
186
+ if (!NIL_P(rEndDate))
187
+ env->SetObjectField(jEvent, fidEndDate, date_cast<jobject>(rEndDate));
188
+
189
+ RHO_TRACE("eventFromRuby (7)");
190
+ VALUE rLastModified = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_LAST_MODIFIED));
191
+ if (!NIL_P(rLastModified))
192
+ env->SetObjectField(jEvent, fidLastModified, date_cast<jobject>(rLastModified));
193
+
194
+ RHO_TRACE("eventFromRuby (8)");
195
+ VALUE rLocation = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_LOCATION));
196
+ if (!NIL_P(rLocation))
197
+ {
198
+ Check_Type(rLocation, T_STRING);
199
+ env->SetObjectField(jEvent, fidLocation, env->NewStringUTF(RSTRING_PTR(rLocation)));
200
+ }
201
+
202
+ RHO_TRACE("eventFromRuby (9)");
203
+ VALUE rNotes = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_NOTES));
204
+ if (!NIL_P(rNotes))
205
+ {
206
+ Check_Type(rNotes, T_STRING);
207
+ env->SetObjectField(jEvent, fidNotes, env->NewStringUTF(RSTRING_PTR(rNotes)));
208
+ }
209
+
210
+ RHO_TRACE("eventFromRuby (10)");
211
+ VALUE rPrivacy = rb_hash_aref(rEvent, rb_str_new2(RUBY_EV_PRIVACY));
212
+ if (!NIL_P(rPrivacy))
213
+ {
214
+ Check_Type(rPrivacy, T_STRING);
215
+ env->SetObjectField(jEvent, fidPrivacy, env->NewStringUTF(RSTRING_PTR(rPrivacy)));
216
+ }
217
+
218
+ RHO_TRACE("eventFromRuby: return");
219
+ return jEvent;
220
+ }
221
+
222
+ template <>
223
+ VALUE event_cast<VALUE, jobject>(jobject jEvent)
224
+ {
225
+ if (!jEvent)
226
+ return Qnil;
227
+
228
+ RHO_TRACE("eventToRuby (1)");
229
+ JNIEnv *env = jnienv();
230
+ if (!init_event_stuff(env))
231
+ {
232
+ RHO_TRACE("eventToRuby (1.1)");
233
+ return Qnil;
234
+ }
235
+
236
+ RHO_TRACE("eventToRuby (2)");
237
+ VALUE rEvent = rb_hash_new();
238
+
239
+ RHO_TRACE("eventToRuby (3)");
240
+ jstring jId = (jstring)env->GetObjectField(jEvent, fidId);
241
+ std::string s = rho_cast<std::string>(env, jId);
242
+ env->DeleteLocalRef(jId);
243
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_ID), rb_str_new2(s.c_str()));
244
+
245
+ RHO_TRACE("eventToRuby (4)");
246
+ jstring jTitle = (jstring)env->GetObjectField(jEvent, fidTitle);
247
+ s = rho_cast<std::string>(env, jTitle);
248
+ env->DeleteLocalRef(jTitle);
249
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_TITLE), rb_str_new2(s.c_str()));
250
+
251
+ RHO_TRACE("eventToRuby (5)");
252
+ jobject jStartDate = env->GetObjectField(jEvent, fidStartDate);
253
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_START_DATE), date_cast<VALUE>(jStartDate));
254
+ env->DeleteLocalRef(jStartDate);
255
+
256
+ RHO_TRACE("eventToRuby (6)");
257
+ jobject jEndDate = env->GetObjectField(jEvent, fidEndDate);
258
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_END_DATE), date_cast<VALUE>(jEndDate));
259
+ env->DeleteLocalRef(jEndDate);
260
+
261
+ RHO_TRACE("eventToRuby (7)");
262
+ jobject jLastModified = env->GetObjectField(jEvent, fidLastModified);
263
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_LAST_MODIFIED), date_cast<VALUE>(jLastModified));
264
+ env->DeleteLocalRef(jLastModified);
265
+
266
+ RHO_TRACE("eventToRuby (8)");
267
+ jstring jLocation = (jstring)env->GetObjectField(jEvent, fidLocation);
268
+ if (jLocation)
269
+ {
270
+ s = rho_cast<std::string>(env, jLocation);
271
+ env->DeleteLocalRef(jLocation);
272
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_LOCATION), rb_str_new2(s.c_str()));
273
+ }
274
+
275
+ RHO_TRACE("eventToRuby (9)");
276
+ jstring jNotes = (jstring)env->GetObjectField(jEvent, fidNotes);
277
+ if (jNotes)
278
+ {
279
+ s = rho_cast<std::string>(env, jNotes);
280
+ env->DeleteLocalRef(jNotes);
281
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_NOTES), rb_str_new2(s.c_str()));
282
+ }
283
+
284
+ RHO_TRACE("eventToRuby (10)");
285
+ jstring jPrivacy = (jstring)env->GetObjectField(jEvent, fidPrivacy);
286
+ if (jPrivacy)
287
+ {
288
+ s = rho_cast<std::string>(env, jPrivacy);
289
+ env->DeleteLocalRef(jPrivacy);
290
+ rb_hash_aset(rEvent, rb_str_new2(RUBY_EV_PRIVACY), rb_str_new2(s.c_str()));
291
+ }
292
+
293
+ RHO_TRACE("eventToRuby: return");
294
+ return rEvent;
295
+ }
296
+
297
+ RHO_GLOBAL VALUE event_fetch(VALUE rParams)
298
+ {
299
+ JNIEnv *env = jnienv();
300
+ jclass cls = getJNIClass(RHODES_JAVA_CLASS_EVENT_STORE);
301
+ if (!cls) return Qnil;
302
+ jmethodID mid = getJNIClassStaticMethod(env, cls, "fetch", "(Ljava/util/Date;Ljava/util/Date;Z)Ljava/lang/Object;");
303
+ if (!mid) return Qnil;
304
+
305
+ VALUE start_date = rb_hash_aref(rParams, rb_str_new2(RUBY_EV_START_DATE));
306
+ VALUE end_date = rb_hash_aref(rParams, rb_str_new2(RUBY_EV_END_DATE));
307
+ VALUE include_repeating = rb_hash_aref(rParams, rb_str_new2(RUBY_FETCH_include_repeating));
308
+
309
+ RHO_TRACE("event_fetch (1)");
310
+ jobject jStartDate = date_cast<jobject>(start_date);
311
+ RHO_TRACE("event_fetch (2)");
312
+ jobject jEndDate = date_cast<jobject>(end_date);
313
+ RHO_TRACE("event_fetch (3)");
314
+ jobject jRet = env->CallStaticObjectMethod(cls, mid, jStartDate, jEndDate, (jboolean)rho_ruby_get_bool(include_repeating));
315
+ RHO_TRACE("event_fetch (4)");
316
+ env->DeleteLocalRef(jStartDate);
317
+ env->DeleteLocalRef(jEndDate);
318
+
319
+ jclass clsString = getJNIClass(RHODES_JAVA_CLASS_STRING);
320
+ if (!clsString) return Qnil;
321
+ if (env->IsInstanceOf(jRet, clsString))
322
+ {
323
+ std::string error = rho_cast<std::string>(env, (jstring)jRet);
324
+ env->DeleteLocalRef(jRet);
325
+ rb_raise(rb_eRuntimeError, "Can't fetch events: %s", error.c_str());
326
+ return Qnil;
327
+ }
328
+
329
+ jclass clsVector = getJNIClass(RHODES_JAVA_CLASS_VECTOR);
330
+ if (!clsVector) return Qnil;
331
+ jmethodID midSize = getJNIClassMethod(env, clsVector, "size", "()I");
332
+ if (!midSize) return Qnil;
333
+ jmethodID midGet = getJNIClassMethod(env, clsVector, "get", "(I)Ljava/lang/Object;");
334
+ if (!midGet) return Qnil;
335
+
336
+ RHO_TRACE("event_fetch (5)");
337
+ VALUE ret = rb_ary_new();
338
+
339
+ RHO_TRACE("event_fetch (6)");
340
+ for (int i = 0, lim = env->CallIntMethod(jRet, midSize); i != lim; ++i)
341
+ {
342
+ RHO_TRACE("event_fetch (6.1)");
343
+ jobject jEvent = env->CallObjectMethod(jRet, midGet, i);
344
+ RHO_TRACE("event_fetch (6.2)");
345
+ VALUE rEvent = event_cast<VALUE>(jEvent);
346
+ RHO_TRACE("event_fetch (6.3)");
347
+ env->DeleteLocalRef(jEvent);
348
+ RHO_TRACE("event_fetch (6.4)");
349
+ rb_ary_push(ret, rEvent);
350
+ RHO_TRACE("event_fetch (6.5)");
351
+ }
352
+
353
+ RHO_TRACE("event_fetch (7)");
354
+ env->DeleteLocalRef(jRet);
355
+
356
+ return ret;
357
+ }
358
+
359
+ RHO_GLOBAL VALUE event_fetch_by_id(const char *id)
360
+ {
361
+ JNIEnv *env = jnienv();
362
+ jclass cls = getJNIClass(RHODES_JAVA_CLASS_EVENT_STORE);
363
+ if (!cls) return Qnil;
364
+ jmethodID mid = getJNIClassStaticMethod(env, cls, "fetch", "(Ljava/lang/String;)Ljava/lang/Object;");
365
+ if (!mid) return Qnil;
366
+ jclass clsString = getJNIClass(RHODES_JAVA_CLASS_STRING);
367
+ if (!clsString) return Qnil;
368
+
369
+ RHO_TRACE("event_fetch_by_id (1)");
370
+ jstring jId = rho_cast<jstring>(env, id);
371
+ RHO_TRACE("event_fetch_by_id (2)");
372
+ jobject jRet = env->CallStaticObjectMethod(cls, mid, jId);
373
+ RHO_TRACE("event_fetch_by_id (3)");
374
+ if (env->IsInstanceOf(jRet, clsString))
375
+ {
376
+ RHO_TRACE("event_fetch_by_id (3.1)");
377
+ std::string error = rho_cast<std::string>(env, (jstring)jRet);
378
+ RHO_TRACE("event_fetch_by_id (3.2)");
379
+ env->DeleteLocalRef(jRet);
380
+ RHO_TRACE("event_fetch_by_id (3.3)");
381
+ rb_raise(rb_eRuntimeError, "Can't fetch event with id %s: %s", id, error.c_str());
382
+ return Qnil;
383
+ }
384
+ VALUE rEvent = event_cast<VALUE>(jRet);
385
+ RHO_TRACE("event_fetch_by_id (4)");
386
+ env->DeleteLocalRef(jId);
387
+ env->DeleteLocalRef(jRet);
388
+ return rEvent;
389
+ }
390
+
391
+ RHO_GLOBAL void event_save(VALUE rEvent)
392
+ {
393
+ JNIEnv *env = jnienv();
394
+ jclass cls = getJNIClass(RHODES_JAVA_CLASS_EVENT_STORE);
395
+ if (!cls) return;
396
+ jmethodID mid = getJNIClassStaticMethod(env, cls, "save", "(Lcom/rhomobile/rhodes/event/Event;)Ljava/lang/String;");
397
+ if (!mid) return;
398
+
399
+ jobject jEvent = event_cast<jobject>(rEvent);
400
+ jstring jError = (jstring)env->CallStaticObjectMethod(cls, mid, jEvent);
401
+ env->DeleteLocalRef(jEvent);
402
+
403
+ if (jError)
404
+ {
405
+ std::string error = rho_cast<std::string>(env, jError);
406
+ env->DeleteLocalRef(jError);
407
+ rb_raise(rb_eRuntimeError, "Event save failed: %s", error.c_str());
408
+ }
409
+ }
410
+
411
+ RHO_GLOBAL void event_delete(const char *id)
412
+ {
413
+ JNIEnv *env = jnienv();
414
+ jclass cls = getJNIClass(RHODES_JAVA_CLASS_EVENT_STORE);
415
+ if (!cls) return;
416
+ jmethodID mid = getJNIClassStaticMethod(env, cls, "delete", "(Ljava/lang/String;)Ljava/lang/String;");
417
+ if (!mid) return;
418
+
419
+ jstring jId = rho_cast<jstring>(env, id);
420
+ jstring jError = (jstring)env->CallStaticObjectMethod(cls, mid, jId);
421
+ env->DeleteLocalRef(jId);
422
+
423
+ if (jError)
424
+ {
425
+ std::string error = rho_cast<std::string>(env, jError);
426
+ env->DeleteLocalRef(jError);
427
+ rb_raise(rb_eRuntimeError, "Event delete failed: %s", error.c_str());
428
+ }
429
+ }
@@ -108,6 +108,17 @@ static func_write_t real_write;
108
108
 
109
109
  struct stat librhodes_st;
110
110
 
111
+ static bool has_pending_exception()
112
+ {
113
+ JNIEnv *env = jnienv();
114
+ if (env->ExceptionCheck())
115
+ {
116
+ __android_log_print(ANDROID_LOG_ERROR, "fileapi", "ERROR!!! Pending exception exist!");
117
+ return true;
118
+ }
119
+ return false;
120
+ }
121
+
111
122
  RHO_GLOBAL void JNICALL Java_com_rhomobile_rhodes_file_RhoFileApi_updateStatTable
112
123
  (JNIEnv *env, jclass, jstring pathObj, jstring type, jlong size, jlong mtime)
113
124
  {
@@ -397,6 +408,11 @@ RHO_GLOBAL int open(const char *path, int oflag, ...)
397
408
  //RHO_LOG("open: %s: fpath: %s", path, fpath.c_str());
398
409
 
399
410
  bool java_way = need_java_way(fpath);
411
+ if (java_way && has_pending_exception())
412
+ {
413
+ errno = EFAULT;
414
+ return -1;
415
+ }
400
416
  if (java_way && (oflag & (O_WRONLY | O_RDWR)))
401
417
  {
402
418
  //RHO_LOG("open: %s: copy from Android package", path);
@@ -404,6 +420,11 @@ RHO_GLOBAL int open(const char *path, int oflag, ...)
404
420
  jstring relPathObj = rho_cast<jstring>(env, make_rel_path(fpath).c_str());
405
421
  env->CallStaticBooleanMethod(clsFileApi, midCopy, relPathObj);
406
422
  env->DeleteLocalRef(relPathObj);
423
+ if (has_pending_exception())
424
+ {
425
+ errno = EFAULT;
426
+ return -1;
427
+ }
407
428
 
408
429
  java_way = false;
409
430
  }
@@ -416,7 +437,6 @@ RHO_GLOBAL int open(const char *path, int oflag, ...)
416
437
  jobject is = env->CallStaticObjectMethod(clsFileApi, midOpen, relPathObj);
417
438
  env->DeleteLocalRef(relPathObj);
418
439
 
419
- fd = -1;
420
440
  if (is != NULL)
421
441
  {
422
442
  scoped_lock_t guard(rho_fd_mtx);
@@ -433,6 +453,11 @@ RHO_GLOBAL int open(const char *path, int oflag, ...)
433
453
  d.pos = 0;
434
454
  rho_fd_map[fd] = d;
435
455
  }
456
+ else
457
+ {
458
+ errno = EFAULT;
459
+ fd = -1;
460
+ }
436
461
 
437
462
  env->DeleteLocalRef(is);
438
463
  }
@@ -478,6 +503,12 @@ RHO_GLOBAL int close(int fd)
478
503
  if (fd < RHO_FD_BASE)
479
504
  return real_close(fd);
480
505
 
506
+ if (has_pending_exception())
507
+ {
508
+ errno = EFAULT;
509
+ return -1;
510
+ }
511
+
481
512
  jobject is = NULL;
482
513
  {
483
514
  scoped_lock_t guard(rho_fd_mtx);
@@ -510,6 +541,12 @@ RHO_GLOBAL ssize_t read(int fd, void *buf, size_t count)
510
541
  return ret;
511
542
  }
512
543
 
544
+ if (has_pending_exception())
545
+ {
546
+ errno = EFAULT;
547
+ return -1;
548
+ }
549
+
513
550
  jobject is = NULL;
514
551
  {
515
552
  scoped_lock_t guard(rho_fd_mtx);
@@ -668,6 +705,12 @@ RHO_GLOBAL loff_t lseek64(int fd, loff_t offset, int whence)
668
705
  return ret;
669
706
  }
670
707
 
708
+ if (has_pending_exception())
709
+ {
710
+ errno = EFAULT;
711
+ return -1;
712
+ }
713
+
671
714
  jobject is = NULL;
672
715
  loff_t pos = 0;
673
716
 
@@ -802,6 +845,13 @@ RHO_GLOBAL int ftruncate(int fd, off_t offset)
802
845
  static int stat_impl(std::string const &fpath, struct stat *buf)
803
846
  {
804
847
  RHO_LOG("stat_impl: %s", fpath.c_str());
848
+
849
+ if (has_pending_exception())
850
+ {
851
+ errno = EFAULT;
852
+ return -1;
853
+ }
854
+
805
855
  rho_stat_t *rst = rho_stat(fpath);
806
856
  if (!rst)
807
857
  {