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.
- data/CHANGELOG +7 -0
- data/README.textile +4 -5
- data/Rakefile +8 -1
- data/lib/build/jake.rb +22 -16
- data/lib/extensions/rhoxml/rexml/cdata.rb +67 -0
- data/lib/extensions/rhoxml/rexml/document.rb +2 -116
- data/lib/extensions/rhoxml/rexml/element.rb +1 -1
- data/lib/extensions/rhoxml/rexml/text.rb +117 -0
- data/lib/framework/rho/render.rb +19 -11
- data/lib/framework/rho/rho.rb +17 -10
- data/lib/framework/rho/rhobluetooth.rb +103 -0
- data/lib/framework/rho/rhocontroller.rb +2 -0
- data/lib/framework/rho/rhoevent.rb +43 -0
- data/lib/framework/rho/rhoevent_bb.rb +80 -0
- data/lib/framework/rho/rhoevent_c.rb +47 -0
- data/lib/framework/rhodes.rb +2 -2
- data/lib/framework/rhom/rhom_db_adapter.rb +2 -1
- data/lib/framework/rhom/rhom_model.rb +9 -3
- data/lib/framework/rhom/rhom_object_factory.rb +46 -22
- data/lib/framework/rhom/rhom_source.rb +12 -10
- data/lib/framework/version.rb +2 -2
- data/lib/rhodes.rb +2 -2
- data/platform/android/Rhodes/AndroidManifest.xml +23 -2
- data/platform/android/Rhodes/gen/com/rhomobile/rhodes/R.java +54 -38
- data/platform/android/Rhodes/jni/include/rhodes.h +3 -0
- data/platform/android/Rhodes/jni/include/rhodes/JNIRhodes.h +2 -2
- data/platform/android/Rhodes/jni/include/rhodes/details/rhojava.inc +4 -0
- data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesService.h +16 -0
- data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_bluetooth_RhoBluetoothManager.h +21 -0
- data/platform/android/Rhodes/jni/src/bluetooth.cpp +169 -0
- data/platform/android/Rhodes/jni/src/callbacks.cpp +10 -0
- data/platform/android/Rhodes/jni/src/event.cpp +429 -0
- data/platform/android/Rhodes/jni/src/fileapi.cpp +51 -1
- data/platform/android/Rhodes/jni/src/rhodes.cpp +16 -0
- data/platform/android/Rhodes/jni/src/sslimpl.cpp +3 -0
- data/platform/android/Rhodes/res/layout/bt_device_list.xml +42 -0
- data/platform/android/Rhodes/res/layout/bt_device_name.xml +7 -0
- data/platform/android/Rhodes/res/values/strings.xml +8 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java +14 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Capabilities.java +2 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Push.java +7 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java +58 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushService.java +53 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +8 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +144 -3
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/IRhoBluetoothManager.java +66 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothDeviceListActivity.java +201 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManager.java +139 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerNew.java +401 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerOld.java +136 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothSession.java +457 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/UUIDHelper.java +71 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +12 -7
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/Event.java +19 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java +261 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +4 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +2 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/uri/MailUriHandler.java +10 -2
- data/platform/android/build/RhodesSRC_build.files +33 -22
- data/platform/android/build/android.rake +198 -27
- data/platform/android/build/librhodes_build.files +3 -1
- data/platform/android/build/libruby_build.files +4 -1
- data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBResult.java +2 -2
- data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBRowResult.java +1 -1
- data/platform/bb/Hsqldb/src/org/hsqldb/Expression.java +7 -4
- data/platform/bb/Hsqldb/src/org/hsqldb/Like.java +3 -3
- data/platform/bb/Hsqldb/src/org/hsqldb/Table.java +3 -1
- data/platform/bb/Hsqldb/src/org/hsqldb/Tokenizer.java +1 -1
- data/platform/bb/RubyVM/RubyVM.jdp +1 -0
- data/platform/bb/RubyVM/src/com/rho/RhoConf.java +108 -1
- data/platform/bb/RubyVM/src/com/rho/RhoLogConf.java +7 -1
- data/platform/bb/RubyVM/src/com/rho/RhoRuby.java +7 -4
- data/platform/bb/RubyVM/src/com/rho/ThreadQueue.java +7 -1
- data/platform/bb/RubyVM/src/com/rho/net/AsyncHttp.java +1 -1
- data/platform/bb/RubyVM/src/com/rho/net/NetRequest.java +21 -23
- data/platform/bb/RubyVM/src/com/rho/net/RhoConnection.java +19 -10
- data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +8 -0
- data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +3 -0
- data/platform/bb/RubyVM/src/com/rho/sync/SyncThread.java +14 -17
- data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyFile.java +7 -5
- data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RhoSupport.java +2 -0
- data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyRuntime.java +10 -1
- data/platform/bb/RubyVM/src/j2me/io/File.java +7 -6
- data/platform/bb/build/RubyVM_build.files +412 -412
- data/platform/bb/build/bb.rake +42 -18
- data/platform/bb/build/hsqldb_build.files +151 -151
- data/platform/bb/build/rhodes_build.files +44 -40
- data/platform/bb/rhodes/platform/5.0/com/rho/BrowserAdapter5.java +2 -0
- data/platform/bb/rhodes/platform/5.0/com/rho/RhodesApplicationPlatform.java +237 -0
- data/platform/bb/rhodes/platform/common/com/rho/RhodesApplicationPlatform.java +14 -0
- data/platform/bb/rhodes/rhodes.jdp +6 -1
- data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +7 -1
- data/platform/bb/rhodes/src/com/rho/RhodesApplicationPlatform.java +14 -0
- data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +62 -76
- data/platform/bb/rhodes/src/com/rho/rubyext/RhoCalendar.java +660 -0
- data/platform/bb/rhodes/src/{rhomobile → com/rho/rubyext}/RhoPhonebook.java +95 -38
- data/platform/bb/rhodes/src/com/rho/rubyext/System.java +22 -1
- data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +26 -6
- data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +21 -7
- data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothManager.java +528 -0
- data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothPort.java +281 -0
- data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothScreen.java +119 -0
- data/platform/bb/rhodes/src/rhomobile/camera/CameraFilesListener.java +2 -2
- data/platform/iphone/Classes/AppManager/AppManager.m +70 -7
- data/platform/iphone/Classes/Bluetooth/Bluetooth.h +72 -0
- data/platform/iphone/Classes/Bluetooth/Bluetooth.m +414 -0
- data/platform/iphone/Classes/Event/Event.h +12 -0
- data/platform/iphone/Classes/Event/Event.m +300 -0
- data/platform/iphone/Classes/LogOptionsController.h +2 -1
- data/platform/iphone/Classes/LogOptionsController.m +1 -1
- data/platform/iphone/Classes/LogViewController.h +2 -1
- data/platform/iphone/Classes/MapView/MapViewController.h +2 -1
- data/platform/iphone/Classes/RhoViewController.h +16 -0
- data/platform/iphone/Classes/RhoViewController.m +20 -0
- data/platform/iphone/Classes/Rhodes.h +12 -0
- data/platform/iphone/Classes/Rhodes.m +34 -6
- data/platform/iphone/Classes/Signature/SignatureViewController.h +2 -2
- data/platform/iphone/Classes/Signature/SignatureViewController.m +0 -10
- data/platform/iphone/Classes/SimpleMainView.h +2 -2
- data/platform/iphone/Classes/SimpleMainView.m +5 -14
- data/platform/iphone/Classes/SplashViewController.h +2 -2
- data/platform/iphone/Classes/TabbedMainView.h +2 -2
- data/platform/iphone/Classes/TabbedMainView.m +5 -10
- data/platform/iphone/Info.plist +5 -5
- data/platform/iphone/rhorubylib/rhorubylib.xcodeproj/project.pbxproj +39 -0
- data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +47 -4
- data/platform/osx/Rhodes Debugger/NoodleLineNumberView.m +3 -2
- data/platform/shared/common/AutoPointer.h +3 -0
- data/platform/shared/common/RhoConf.cpp +2 -1
- data/platform/shared/common/RhoThread.h +1 -1
- data/platform/shared/common/RhoTime.h +3 -3
- data/platform/shared/common/RhodesApp.cpp +75 -23
- data/platform/shared/common/RhodesApp.h +4 -0
- data/platform/shared/common/RhodesAppBase.h +2 -0
- data/platform/shared/common/ThreadQueue.cpp +23 -18
- data/platform/shared/common/ThreadQueue.h +2 -0
- data/platform/shared/db/res/db/syncdb.schema +39 -39
- data/platform/shared/logging/RhoLogConf.cpp +58 -3
- data/platform/shared/logging/RhoLogConf.h +3 -1
- data/platform/shared/net/CURLNetRequest.cpp +17 -6
- data/platform/shared/net/HttpServer.cpp +125 -25
- data/platform/shared/net/HttpServer.h +4 -3
- data/platform/shared/ruby/ext/bluetooth/bluetooth.i +56 -0
- data/platform/shared/ruby/ext/bluetooth/bluetooth_wrap.c +2563 -0
- data/platform/shared/ruby/ext/calendar/calendar.i +28 -0
- data/platform/shared/ruby/ext/calendar/calendar_wrap.c +2251 -0
- data/platform/shared/ruby/ext/calendar/event.h +41 -0
- data/platform/shared/ruby/ext/calendar/event.i +28 -0
- data/platform/shared/ruby/ext/calendar/event_wrap.c +2151 -0
- data/platform/shared/ruby/ext/rho/rhoruby.c +103 -3
- data/platform/shared/ruby/ext/rho/rhoruby.h +16 -2
- data/platform/shared/ruby/ext/rhoconf/rhoconf.i +12 -0
- data/platform/shared/ruby/ext/rhoconf/rhoconf_wrap.c +101 -0
- data/platform/shared/ruby/ext/system/system.i +14 -0
- data/platform/shared/ruby/ext/system/system_wrap.c +2568 -2208
- data/platform/shared/ruby/main.c +8 -0
- data/platform/shared/rubyext/GeoLocation.cpp +6 -3
- data/platform/shared/rubyext/System.cpp +14 -0
- data/platform/shared/sync/SyncEngine.cpp +9 -1
- data/platform/shared/sync/SyncNotify.cpp +16 -8
- data/platform/shared/sync/SyncNotify.h +1 -0
- data/platform/shared/sync/SyncThread.cpp +7 -12
- data/platform/shared/sync/SyncThread.h +5 -3
- data/platform/wm/build/wm.rake +7 -1
- data/platform/wm/rhodes/Alert.cpp +1 -1
- data/platform/wm/rhodes/MainWindow.cpp +28 -0
- data/platform/wm/rhodes/MainWindow.h +9 -0
- data/platform/wm/rhodes/OutlookApp.cpp +72 -0
- data/platform/wm/rhodes/OutlookApp.h +22 -0
- data/platform/wm/rhodes/Rhodes.cpp +8 -0
- data/platform/wm/rhodes/Rhodes.rc +31 -0
- data/platform/wm/rhodes/bluetooth/Bluetooth.cpp +1274 -0
- data/platform/wm/rhodes/bluetooth/Bluetooth.h +321 -0
- data/platform/wm/rhodes/phonebook/NativeAddressBook.cpp +37 -70
- data/platform/wm/rhodes/phonebook/NativeAddressBook.h +0 -4
- data/platform/wm/rhodes/resource.h +8 -1
- data/platform/wm/rhodes/rho/net/NetRequest.cpp +4 -0
- data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +6 -4
- data/platform/wm/rhodes/rho/rubyext/calendar.cpp +487 -0
- data/platform/wm/rhodes/rhodes.vcproj +28 -11
- data/platform/wm/rhodes/stdafx.h +1 -0
- data/platform/wm/rubylib/rubylib.vcproj +32 -0
- data/rakefile.rb +8 -1
- data/res/generators/templates/application/Rakefile +1 -1
- data/res/generators/templates/application/app/layout.erb +4 -1
- data/res/generators/templates/application/build.yml +0 -1
- data/res/generators/templates/application/public/css/iphone.css +2 -2
- data/res/generators/templates/application/public/jqtouch/jqtouch-iphone.css +9 -0
- data/res/generators/templates/application/public/jqtouch/jqtouch.css +1 -5
- data/res/generators/templates/application/public/jqtouch/jqtouch.js +3 -2
- data/rhodes.gemspec +1 -1
- data/spec/perfomance_spec/app/Benchmark/benchmark.rb +4 -0
- data/spec/perfomance_spec/app/Benchmark/bulk_results.erb +13 -0
- data/spec/perfomance_spec/app/Benchmark/controller.rb +178 -0
- data/spec/perfomance_spec/app/Benchmark/create_results.erb +13 -0
- data/spec/perfomance_spec/app/Benchmark/customers.erb +35 -0
- data/spec/perfomance_spec/app/Benchmark/index.erb +9 -0
- data/spec/perfomance_spec/app/Benchmark/products.erb +25 -0
- data/spec/perfomance_spec/app/Benchmark/search_results.erb +13 -0
- data/spec/perfomance_spec/app/Customer/customer.rb +6 -0
- data/spec/perfomance_spec/app/Perftest/index.erb +5 -0
- data/spec/perfomance_spec/app/Product/index.erb +25 -0
- data/spec/perfomance_spec/app/Product/product.rb +6 -0
- data/spec/perfomance_spec/app/helpers/application_helper.rb +126 -0
- data/spec/perfomance_spec/app/helpers/browser_helper.rb +18 -0
- data/spec/perfomance_spec/rhoconfig.txt +1 -1
- data/spec/phone_spec/app/Account_s/account_s.rb +5 -2
- data/spec/phone_spec/app/Case/case.rb +1 -0
- data/spec/phone_spec/app/Case_s/case_s.rb +2 -0
- data/spec/phone_spec/app/Data/perftest.json +35 -0
- data/spec/phone_spec/app/Data/testCDATA.xml +11 -0
- data/spec/phone_spec/app/Product/product.rb +1 -1
- data/spec/phone_spec/app/{Spec → spec}/asynchttp_spec.rb +66 -17
- data/spec/phone_spec/app/{Spec → spec}/barcode_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/blobsync_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/bsearch_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/bulksync_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/contacts_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/crypt_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/date_spec.rb +0 -0
- data/spec/phone_spec/app/spec/events_spec.rb +199 -0
- data/spec/phone_spec/app/{Spec → spec}/fixtures/client_info.txt +0 -0
- data/spec/phone_spec/app/{Spec → spec}/fixtures/object_values.txt +0 -0
- data/spec/phone_spec/app/{Spec → spec}/json_spec.rb +11 -2
- data/spec/phone_spec/app/{Spec → spec}/mapview_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/nativebar_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/navbar_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/pagination/fixtures/object_values.txt +0 -0
- data/spec/phone_spec/app/{Spec → spec}/rho_controller_spec.rb +5 -0
- data/spec/phone_spec/app/{Spec → spec}/rho_spec.rb +48 -0
- data/spec/phone_spec/app/{Spec → spec}/rhofile_spec.rb +9 -6
- data/spec/phone_spec/app/{Spec → spec}/rhom_object_spec.rb +188 -9
- data/spec/phone_spec/app/{Spec → spec}/syncengine_spec.rb +0 -0
- data/spec/phone_spec/app/{Spec → spec}/xml_spec.rb +15 -0
- data/spec/phone_spec/app/{Spec → spec}/xruby_spec.rb +0 -0
- data/spec/phone_spec/app/spec_runner.rb +4 -1
- data/spec/phone_spec/build.yml +2 -1
- metadata +95 -31
- data/platform/bb/rhodes/platform/5.0/com/rho/RhoMainScreen.java +0 -36
- data/platform/bb/rhodes/platform/6.0/com/rho/BrowserAdapter5.java +0 -155
- 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
|
{
|