rhodes 2.0.0.beta4 → 2.0.0.beta6
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +1 -0
- data/lib/rhodes/generator.rb +1 -0
- data/platform/android/Rhodes/jni/src/webview.cpp +4 -7
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +11 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/WebView.java +4 -4
- data/platform/android/build/android.rake +1 -1
- data/platform/android/build/androidcommon.rb +5 -2
- data/platform/iphone/Classes/Rhodes.m +6 -2
- data/platform/shared/json/JSONIterator.cpp +66 -0
- data/platform/shared/json/JSONIterator.h +2 -0
- data/platform/shared/json/RJSONTokener.c +1 -1
- data/platform/shared/ruby/ext/rho/rhosupport.c +2 -0
- data/platform/shared/ruby/thread_pthread.c +5 -0
- data/platform/shared/rubyJVM/src/com/rho/rjson/RJSONTokener.java +17 -0
- data/platform/shared/rubyJVM/src/com/rho/sync/JSONEntry.java +5 -0
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncSource.java +4 -4
- data/platform/shared/sync/SyncSource.cpp +7 -8
- data/rhodes.gemspec +1 -1
- metadata +3 -2
data/Manifest.txt
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../res/generators/rhogen'
|
@@ -62,19 +62,16 @@ RHO_GLOBAL int rho_webview_active_tab()
|
|
62
62
|
|
63
63
|
RHO_GLOBAL const char* rho_webview_execute_js(const char* js, int index)
|
64
64
|
{
|
65
|
-
static std::string result;
|
66
|
-
|
67
65
|
JNIEnv *env = jnienv();
|
68
66
|
jclass cls = getJNIClass(RHODES_JAVA_CLASS_WEB_VIEW);
|
69
67
|
if (!cls) return NULL;
|
70
|
-
jmethodID mid = getJNIClassStaticMethod(env, cls, "executeJs", "(Ljava/lang/String;I)
|
68
|
+
jmethodID mid = getJNIClassStaticMethod(env, cls, "executeJs", "(Ljava/lang/String;I)V");
|
71
69
|
if (!mid) return NULL;
|
72
70
|
|
73
|
-
jstring objJs = rho_cast<jstring>(js);
|
74
|
-
|
71
|
+
jstring objJs = rho_cast<jstring>(env, js);
|
72
|
+
env->CallStaticObjectMethod(cls, mid, objJs, index);
|
75
73
|
env->DeleteLocalRef(objJs);
|
76
|
-
|
77
|
-
return (char*)result.c_str();
|
74
|
+
return "";
|
78
75
|
}
|
79
76
|
|
80
77
|
RHO_GLOBAL void rho_webview_full_screen_mode(int enable)
|
@@ -62,6 +62,7 @@ import android.view.View;
|
|
62
62
|
import android.view.Window;
|
63
63
|
import android.view.WindowManager;
|
64
64
|
import android.view.ViewGroup.LayoutParams;
|
65
|
+
import android.webkit.JsResult;
|
65
66
|
import android.webkit.WebChromeClient;
|
66
67
|
import android.webkit.WebSettings;
|
67
68
|
import android.webkit.WebView;
|
@@ -363,6 +364,16 @@ public class Rhodes extends Activity {
|
|
363
364
|
}
|
364
365
|
super.onProgressChanged(view, newProgress);
|
365
366
|
}
|
367
|
+
|
368
|
+
@Override
|
369
|
+
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
|
370
|
+
return false;
|
371
|
+
}
|
372
|
+
|
373
|
+
@Override
|
374
|
+
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
|
375
|
+
return false;
|
376
|
+
}
|
366
377
|
});
|
367
378
|
|
368
379
|
return w;
|
@@ -20,6 +20,7 @@
|
|
20
20
|
*/
|
21
21
|
package com.rhomobile.rhodes;
|
22
22
|
|
23
|
+
import android.net.Uri;
|
23
24
|
import android.webkit.CookieManager;
|
24
25
|
|
25
26
|
public class WebView {
|
@@ -85,7 +86,8 @@ public class WebView {
|
|
85
86
|
private String cookie;
|
86
87
|
|
87
88
|
public SetCookieTask(String u, String c) {
|
88
|
-
|
89
|
+
Uri uri = Uri.parse(u);
|
90
|
+
url = uri.getScheme() + "://" + uri.getHost() + "/" + uri.getPath();
|
89
91
|
cookie = c;
|
90
92
|
}
|
91
93
|
|
@@ -135,15 +137,13 @@ public class WebView {
|
|
135
137
|
return 0;
|
136
138
|
}
|
137
139
|
|
138
|
-
public static
|
140
|
+
public static void executeJs(String js, int index) {
|
139
141
|
try {
|
140
142
|
Rhodes.performOnUiThread(new NavigateTask("javascript:" + js, index), false);
|
141
143
|
}
|
142
144
|
catch (Exception e) {
|
143
145
|
reportFail("executeJs", e);
|
144
146
|
}
|
145
|
-
|
146
|
-
return "";
|
147
147
|
}
|
148
148
|
|
149
149
|
public static void setCookie(String url, String cookie) {
|
@@ -709,7 +709,7 @@ namespace "build" do
|
|
709
709
|
f.puts "public class NativeLibraries {"
|
710
710
|
f.puts " public static void load() {"
|
711
711
|
f.puts " // Load native .so libraries"
|
712
|
-
Dir.glob($extensionsdir + "/lib*.so").each do |lib|
|
712
|
+
Dir.glob($extensionsdir + "/lib*.so").reverse.each do |lib|
|
713
713
|
libname = File.basename(lib).gsub(/^lib/, '').gsub(/\.so$/, '')
|
714
714
|
f.puts " System.loadLibrary(\"#{libname}\");"
|
715
715
|
end
|
@@ -163,7 +163,7 @@ def cc_link(outname, objects, additional = nil, deps = nil)
|
|
163
163
|
args << "-Wl,-z,defs"
|
164
164
|
args << "-shared"
|
165
165
|
args << "-fPIC"
|
166
|
-
args << "-Wl,-soname,#{outname}"
|
166
|
+
args << "-Wl,-soname,#{File.basename(outname)}"
|
167
167
|
args << "-o"
|
168
168
|
args << outname
|
169
169
|
args += objects
|
@@ -172,9 +172,12 @@ def cc_link(outname, objects, additional = nil, deps = nil)
|
|
172
172
|
args << "-Wl,-rpath-link=#{$ndksysroot}/usr/lib"
|
173
173
|
args << "#{$ndksysroot}/usr/lib/libstdc++.so"
|
174
174
|
args << "#{$ndksysroot}/usr/lib/libsupc++.so" unless USE_STLPORT
|
175
|
-
|
175
|
+
libgccdir = File.join($ndktools, "lib/gcc/arm-eabi", $ndkgccver)
|
176
|
+
libgccdir = File.join(libgccdir, "interwork") if $ndkgccver == "4.2.1"
|
177
|
+
args << "#{libgccdir}/libgcc.a" if $ndkgccver != "4.2.1"
|
176
178
|
args << "#{$ndksysroot}/usr/lib/libc.so"
|
177
179
|
args << "#{$ndksysroot}/usr/lib/libm.so"
|
180
|
+
args << "#{libgccdir}/libgcc.a" if $ndkgccver == "4.2.1"
|
178
181
|
cc_run($gccbin, args)
|
179
182
|
end
|
180
183
|
|
@@ -137,11 +137,15 @@ static Rhodes *instance = NULL;
|
|
137
137
|
}
|
138
138
|
|
139
139
|
- (void)setCookie:(NSString*)cookie forUrl:(NSString*)url {
|
140
|
-
[
|
140
|
+
NSURL *parsed = [NSURL URLWithString:url];
|
141
|
+
NSString *basicUrl = [NSString stringWithFormat:@"%@://%@/%@", parsed.scheme, parsed.host, parsed.path];
|
142
|
+
[cookies setObject:cookie forKey:basicUrl];
|
141
143
|
}
|
142
144
|
|
143
145
|
- (NSString*)cookie:(NSString*)url {
|
144
|
-
|
146
|
+
NSURL *parsed = [NSURL URLWithString:url];
|
147
|
+
NSString *basicUrl = [NSString stringWithFormat:@"%@://%@/%@", parsed.scheme, parsed.host, parsed.path];
|
148
|
+
NSString *c = [cookies objectForKey:basicUrl];
|
145
149
|
return c;
|
146
150
|
}
|
147
151
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "JSONIterator.h"
|
2
2
|
|
3
3
|
#include "json/json.h"
|
4
|
+
#include "ruby/ext/rho/rhoruby.h"
|
4
5
|
|
5
6
|
#if defined(OS_WINCE) || defined (OS_WINDOWS)
|
6
7
|
#define rho_atoi64 _atoi64
|
@@ -242,5 +243,70 @@ CJSONEntry CJSONEntry::getEntry(const char* name)const
|
|
242
243
|
return CJSONEntry(obj);
|
243
244
|
}
|
244
245
|
|
246
|
+
/*static*/ String CJSONEntry::quoteValue(const String& strValue)
|
247
|
+
{
|
248
|
+
int pos = 0, start_offset = 0;
|
249
|
+
unsigned char c;
|
250
|
+
String strRes = "\"";
|
251
|
+
const char* str = strValue.c_str();
|
252
|
+
do
|
253
|
+
{
|
254
|
+
c = str[pos];
|
255
|
+
switch(c) {
|
256
|
+
case '\0':
|
257
|
+
break;
|
258
|
+
case '\b':
|
259
|
+
case '\n':
|
260
|
+
case '\r':
|
261
|
+
case '\t':
|
262
|
+
case '"':
|
263
|
+
case '\\':
|
264
|
+
case '/':
|
265
|
+
if(pos - start_offset > 0)
|
266
|
+
strRes.append(str + start_offset, pos - start_offset);
|
267
|
+
|
268
|
+
if(c == '\b') strRes.append( "\\b", 2 );
|
269
|
+
else if(c == '\n') strRes.append( "\\n", 2);
|
270
|
+
else if(c == '\r') strRes.append( "\\r", 2);
|
271
|
+
else if(c == '\t') strRes.append( "\\t", 2);
|
272
|
+
else if(c == '"') strRes.append( "\\\"", 2);
|
273
|
+
else if(c == '\\') strRes.append( "\\\\", 2);
|
274
|
+
else if(c == '/') strRes.append( "\\/", 2);
|
275
|
+
|
276
|
+
start_offset = ++pos;
|
277
|
+
break;
|
278
|
+
default:
|
279
|
+
if(c < ' ')
|
280
|
+
{
|
281
|
+
if(pos - start_offset > 0)
|
282
|
+
strRes.append( str + start_offset, pos - start_offset);
|
283
|
+
|
284
|
+
char buf[128];
|
285
|
+
int nSize = snprintf(buf, 128, "\\u00%c%c", json_hex_chars[c >> 4], json_hex_chars[c & 0xf]);
|
286
|
+
strRes.append(buf, nSize);
|
287
|
+
|
288
|
+
start_offset = ++pos;
|
289
|
+
}else
|
290
|
+
pos++;
|
291
|
+
}
|
292
|
+
} while(c);
|
293
|
+
|
294
|
+
if ( strRes.length() == 1 )
|
295
|
+
return "\"" + strValue + "\"";
|
296
|
+
|
297
|
+
if ( pos - start_offset > 0 )
|
298
|
+
strRes.append( str + start_offset, pos - start_offset);
|
299
|
+
|
300
|
+
strRes.append("\"");
|
301
|
+
return strRes;
|
302
|
+
}
|
303
|
+
|
245
304
|
}
|
246
305
|
}
|
306
|
+
|
307
|
+
extern "C" VALUE rho_json_quote_value(VALUE v,VALUE str)
|
308
|
+
{
|
309
|
+
rho::String strRes = rho::json::CJSONEntry::quoteValue(getStringFromValue(str));
|
310
|
+
|
311
|
+
return rho_ruby_create_string(strRes.c_str());
|
312
|
+
}
|
@@ -545,6 +545,7 @@ static void Init_RhoLog(){
|
|
545
545
|
static VALUE rb_RhoModule;
|
546
546
|
static VALUE rb_RhoJSON;
|
547
547
|
extern VALUE rho_json_parse(VALUE,VALUE);
|
548
|
+
extern VALUE rho_json_quote_value(VALUE,VALUE);
|
548
549
|
static void Init_RhoJSON()
|
549
550
|
{
|
550
551
|
|
@@ -554,6 +555,7 @@ static void Init_RhoJSON()
|
|
554
555
|
rb_RhoJSON = rb_define_class_under(rb_RhoModule, "JSON", rb_cObject);
|
555
556
|
|
556
557
|
rb_define_singleton_method(rb_RhoJSON, "parse", rho_json_parse, 1);
|
558
|
+
rb_define_singleton_method(rb_RhoJSON, "quote_value", rho_json_quote_value, 1);
|
557
559
|
}
|
558
560
|
|
559
561
|
const char* rho_ruby_internal_getMessageText(const char* szName)
|
@@ -17,6 +17,9 @@
|
|
17
17
|
#include <sys/resource.h>
|
18
18
|
#endif
|
19
19
|
|
20
|
+
void *rho_nativethread_start();
|
21
|
+
void rho_nativethread_end(void *arg);
|
22
|
+
|
20
23
|
/*static*/ void native_mutex_lock(pthread_mutex_t *lock);
|
21
24
|
/*static*/ void native_mutex_unlock(pthread_mutex_t *lock);
|
22
25
|
static int native_mutex_trylock(pthread_mutex_t *lock);
|
@@ -350,8 +353,10 @@ thread_start_func_1(void *th_ptr)
|
|
350
353
|
rb_thread_t *th = th_ptr;
|
351
354
|
VALUE stack_start;
|
352
355
|
|
356
|
+
void *p = rho_nativethread_start();
|
353
357
|
/* run */
|
354
358
|
thread_start_func_2(th, &stack_start, rb_ia64_bsp());
|
359
|
+
rho_nativethread_end(p);
|
355
360
|
}
|
356
361
|
#if USE_THREAD_CACHE
|
357
362
|
if (1) {
|
@@ -225,6 +225,23 @@ public class RJSONTokener extends JSONTokener
|
|
225
225
|
throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
|
226
226
|
}
|
227
227
|
}
|
228
|
+
});
|
229
|
+
|
230
|
+
klass.getSingletonClass().defineMethod("quote_value", new RubyOneArgMethod(){
|
231
|
+
protected RubyValue run(RubyValue receiver, RubyValue arg, RubyBlock block )
|
232
|
+
{
|
233
|
+
try {
|
234
|
+
String str = arg.toStr();
|
235
|
+
|
236
|
+
String strRes = JSONObject.quote(str);
|
237
|
+
|
238
|
+
return ObjectFactory.createString(strRes);
|
239
|
+
} catch(Exception e) {
|
240
|
+
LOG.ERROR("parse failed", e);
|
241
|
+
throw (e instanceof RubyException ? (RubyException)e : new RubyException(e.getMessage()));
|
242
|
+
}
|
243
|
+
}
|
228
244
|
});
|
245
|
+
|
229
246
|
}
|
230
247
|
}
|
@@ -272,7 +272,7 @@ class SyncSource
|
|
272
272
|
|
273
273
|
m_arMultipartItems.removeAllElements();
|
274
274
|
m_arBlobAttrs.removeAllElements();
|
275
|
-
String strBody = "{\"source_name\"
|
275
|
+
String strBody = "{\"source_name\":" + JSONEntry.quoteValue(getName()) + ",\"client_id\":" + JSONEntry.quoteValue(getSync().getClientID());
|
276
276
|
boolean bSend = false;
|
277
277
|
int i = 0;
|
278
278
|
for( i = 0; i < 3 && getSync().isContinueSync(); i++ )
|
@@ -289,7 +289,7 @@ class SyncSource
|
|
289
289
|
if ( strBlobAttrs.length() > 0 )
|
290
290
|
strBlobAttrs += ",";
|
291
291
|
|
292
|
-
strBlobAttrs +=
|
292
|
+
strBlobAttrs += JSONEntry.quoteValue((String)m_arBlobAttrs.elementAt(j));
|
293
293
|
}
|
294
294
|
|
295
295
|
if ( strBlobAttrs.length() > 0 )
|
@@ -398,7 +398,7 @@ class SyncSource
|
|
398
398
|
}
|
399
399
|
|
400
400
|
bFirst = true;
|
401
|
-
strBody +=
|
401
|
+
strBody += JSONEntry.quoteValue(strObject);
|
402
402
|
strCurObject = strObject;
|
403
403
|
}
|
404
404
|
|
@@ -410,7 +410,7 @@ class SyncSource
|
|
410
410
|
if ( bFirst )
|
411
411
|
strBody += ":{";
|
412
412
|
|
413
|
-
strBody +=
|
413
|
+
strBody += JSONEntry.quoteValue(strAttrib) + ":" + JSONEntry.quoteValue(value);
|
414
414
|
bFirst = false;
|
415
415
|
}
|
416
416
|
}
|
@@ -42,7 +42,7 @@ CSyncSource::CSyncSource(CSyncEngine& syncEngine, db::CDBAdapter& db ) : m_sync
|
|
42
42
|
|
43
43
|
m_nCurPageCount = 0;
|
44
44
|
m_nInserted = 0;
|
45
|
-
m_nDeleted = 0;
|
45
|
+
m_nDeleted = 0;
|
46
46
|
m_nTotalCount = 0;
|
47
47
|
m_bGetAtLeastOnePage = false;
|
48
48
|
|
@@ -176,7 +176,7 @@ void CSyncSource::doSyncClientChanges()
|
|
176
176
|
|
177
177
|
m_arMultipartItems.removeAllElements();
|
178
178
|
m_arBlobAttrs.removeAllElements();
|
179
|
-
String strBody = "{\"source_name\"
|
179
|
+
String strBody = "{\"source_name\":" + CJSONEntry::quoteValue(getName()) + ",\"client_id\":" + CJSONEntry::quoteValue(getSync().getClientID());
|
180
180
|
boolean bSend = false;
|
181
181
|
int i = 0;
|
182
182
|
for( i = 0; i < 3 && getSync().isContinueSync(); i++ )
|
@@ -193,7 +193,7 @@ void CSyncSource::doSyncClientChanges()
|
|
193
193
|
if ( strBlobAttrs.length() > 0 )
|
194
194
|
strBlobAttrs += ",";
|
195
195
|
|
196
|
-
strBlobAttrs +=
|
196
|
+
strBlobAttrs += CJSONEntry::quoteValue(m_arBlobAttrs.elementAt(j));
|
197
197
|
}
|
198
198
|
|
199
199
|
if ( strBlobAttrs.length() > 0 )
|
@@ -252,7 +252,7 @@ void CSyncSource::doSyncClientChanges()
|
|
252
252
|
m_arMultipartItems.removeAllElements();
|
253
253
|
m_arBlobAttrs.removeAllElements();
|
254
254
|
}
|
255
|
-
|
255
|
+
/*
|
256
256
|
static void escapeDoubleQuotes(String& str)
|
257
257
|
{
|
258
258
|
const char* szQuote = strchr(str.c_str(), '\"');
|
@@ -265,7 +265,7 @@ static void escapeDoubleQuotes(String& str)
|
|
265
265
|
else
|
266
266
|
szQuote = 0;
|
267
267
|
}
|
268
|
-
}
|
268
|
+
}*/
|
269
269
|
|
270
270
|
//{"source_name":"SampleAdapter","client_id":1,"create":{"1":{"brand":"Apple","name":"iPhone","price":"199.99"}}}
|
271
271
|
//{"source_name":"SampleAdapter","client_id":1,"update":{"1":{"brand":"Apple","name":"iPhone","price":"199.99"}}}
|
@@ -317,7 +317,7 @@ void CSyncSource::makePushBody_Ver3(String& strBody, const String& strUpdateType
|
|
317
317
|
}
|
318
318
|
|
319
319
|
bFirst = true;
|
320
|
-
strBody +=
|
320
|
+
strBody += CJSONEntry::quoteValue(strObject);
|
321
321
|
strCurObject = strObject;
|
322
322
|
}
|
323
323
|
|
@@ -329,8 +329,7 @@ void CSyncSource::makePushBody_Ver3(String& strBody, const String& strUpdateType
|
|
329
329
|
if ( bFirst )
|
330
330
|
strBody += ":{";
|
331
331
|
|
332
|
-
|
333
|
-
strBody += "\"" + strAttrib + "\":\"" + value + "\"";
|
332
|
+
strBody += CJSONEntry::quoteValue(strAttrib) + ":" + CJSONEntry::quoteValue(value);
|
334
333
|
bFirst = false;
|
335
334
|
}
|
336
335
|
}
|
data/rhodes.gemspec
CHANGED
@@ -3,7 +3,7 @@ require "lib/rhodes.rb"
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = %q{rhodes}
|
6
|
-
s.version = '2.0.0.
|
6
|
+
s.version = '2.0.0.beta6'
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.authors = ["Rhomobile"]
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 2
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.0.
|
9
|
+
- beta6
|
10
|
+
version: 2.0.0.beta6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Rhomobile
|
@@ -327,6 +327,7 @@ files:
|
|
327
327
|
- lib/framework/singleton.rb
|
328
328
|
- lib/framework/time.rb
|
329
329
|
- lib/framework/version.rb
|
330
|
+
- lib/rhodes/generator.rb
|
330
331
|
- lib/rhodes.rb
|
331
332
|
- lib/test/apps/rhoconfig.txt
|
332
333
|
- lib/test/framework_test.rb
|