rhodes 3.3.0.beta.1 → 3.3.0.beta.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +1 -0
- data/Manifest.txt +7906 -0
- data/doc/build.txt +46 -0
- data/doc/device-caps.txt +65 -0
- data/platform/bb/RubyVM/src/com/rho/RhoLogger.java +1 -1
- data/platform/bb/RubyVM/src/com/rho/net/RhoConnection.java +34 -0
- data/platform/bb/RubyVM/src/com/rho/net/URI.java +6 -0
- data/platform/bb/rhodes/platform/5.0/com/rho/BrowserAdapter5.java +1 -1
- data/platform/bb/rhodes/src/com/rho/BrowserAdapter.java +3 -1
- data/platform/bb/rhodes/src/com/rho/BrowserAdapter5.java +1 -1
- data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +3 -0
- data/platform/iphone/Classes/AppManager/AppManager.m +4 -5
- data/platform/iphone/Classes/Camera/PickImageDelegate.m +20 -8
- data/platform/iphone/Info.plist +1 -1
- data/platform/shared/common/RhodesApp.cpp +32 -0
- data/platform/shared/net/URI.cpp +5 -0
- data/platform/symbian/rholib/rholib.pro +1 -0
- data/rhomobile-debug-1.0.6.gem +0 -0
- data/version +1 -1
- metadata +6 -4
data/doc/build.txt
CHANGED
@@ -1174,3 +1174,49 @@ So if you change icon of application, you have to restart device/simulator(unins
|
|
1174
1174
|
|
1175
1175
|
### Symbian
|
1176
1176
|
You can change icon for your Symbian application replacing icon.svg which is in your application icon folder with a new one.
|
1177
|
+
|
1178
|
+
## Upgrade application
|
1179
|
+
Rhodes 3.3 support application code upgrade for iPhone(non AppStore distribution) and Windows Mobile.
|
1180
|
+
|
1181
|
+
### Prepare application package
|
1182
|
+
|
1183
|
+
To prepare upgrade package for iPhone run in application folder:
|
1184
|
+
|
1185
|
+
:::term
|
1186
|
+
$ rake build:iphone:upgrade_package
|
1187
|
+
|
1188
|
+
Application package will be placed to <app_root>/bin/target/iphone
|
1189
|
+
|
1190
|
+
To prepare upgrade package for Windows Mobile run in application folder:
|
1191
|
+
|
1192
|
+
:::term
|
1193
|
+
$ rake build:wm:upgrade_package
|
1194
|
+
|
1195
|
+
Application package will be placed to <app_root>/bin/target/wmp6
|
1196
|
+
|
1197
|
+
### Upgrade package from running application
|
1198
|
+
|
1199
|
+
Download package:
|
1200
|
+
:::ruby
|
1201
|
+
if !::Rho::RhoSupport.rhobundle_download(url_to_package, url_for(:action => :httpdownload_callback))
|
1202
|
+
render :action =>:error
|
1203
|
+
else
|
1204
|
+
render :action => :wait_download, :back => '/app'
|
1205
|
+
end
|
1206
|
+
|
1207
|
+
Unzip and replace package:
|
1208
|
+
:::ruby
|
1209
|
+
if System.unzip_file(::Rho::RhoSupport.rhobundle_getfilename())==0
|
1210
|
+
System.replace_current_bundle( File.dirname(::Rho::RhoSupport.rhobundle_getfilename()) )
|
1211
|
+
render :action => :wait_replace, :back => '/app'
|
1212
|
+
else
|
1213
|
+
WebView.navigate url_for :action => :error
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
Application will restart automatically.
|
1217
|
+
|
1218
|
+
NOTE: On iPhone application has to be manually started.
|
1219
|
+
|
1220
|
+
|
1221
|
+
### Sample
|
1222
|
+
See [Reload bundle demo](http://github.com/rhomobile/ReloadBundleDemo) for more information.
|
data/doc/device-caps.txt
CHANGED
@@ -627,6 +627,71 @@ In callback:
|
|
627
627
|
### Sample
|
628
628
|
See controller and view in the /app/BarcodeRecognizer folder of the [System API Samples application](http://github.com/rhomobile/rhodes-system-api-samples/tree/master/app/BarcodeRecognizer/controller.rb) for more information.
|
629
629
|
|
630
|
+
## Barcode for Motorola devices
|
631
|
+
Rhodes 3.3 and RhoElements 2.0 support Motorola barcode scanner devices. Install RhoElements gem or RhoStudio and start developing for Motorola Windows Mobile, Windows CE and Android(ET1) devices .
|
632
|
+
|
633
|
+
To enable add to build.yml:
|
634
|
+
|
635
|
+
capabilities:
|
636
|
+
-motorola
|
637
|
+
|
638
|
+
extensions: ["barcode-moto"]
|
639
|
+
|
640
|
+
Barcode API :
|
641
|
+
|
642
|
+
Get a list of scanners present on the device. Return array of hashes ('name','id'):
|
643
|
+
|
644
|
+
:::ruby
|
645
|
+
Barcode.enumerate
|
646
|
+
|
647
|
+
Enables the scanner. barcode_callback get the same parameters as Barcode.take_barcode:
|
648
|
+
|
649
|
+
:::ruby
|
650
|
+
Barcode.enable(url_for(:action => :barcode_callback), {:name=>name_from_enumerate})
|
651
|
+
|
652
|
+
Callback parameters:
|
653
|
+
|
654
|
+
* "status" - "ok" or "cancel"
|
655
|
+
* "barcode" - recognized barcode string
|
656
|
+
|
657
|
+
Disables the currently enabled scanner. This reverts the scanner to its default state and flushes any current decoder settings
|
658
|
+
|
659
|
+
:::ruby
|
660
|
+
Barcode.disable
|
661
|
+
|
662
|
+
Performs a soft trigger start. If the scan does not result in a decode it is necessary to perform a soft stop before another soft start
|
663
|
+
|
664
|
+
:::ruby
|
665
|
+
Barcode.start
|
666
|
+
|
667
|
+
Performs a soft trigger stop
|
668
|
+
|
669
|
+
:::ruby
|
670
|
+
Barcode.stop
|
671
|
+
|
672
|
+
Enables the scanner and start scanner. Before callback is called scanner is disabled:
|
673
|
+
|
674
|
+
:::ruby
|
675
|
+
Barcode.take_barcode(url_for(:action => :barcode_callback), {:name=>name_from_enumerate})
|
676
|
+
|
677
|
+
Callback parameters:
|
678
|
+
|
679
|
+
* "status" - "ok" or "cancel"
|
680
|
+
* "barcode" - recognized barcode string
|
681
|
+
|
682
|
+
### Sample
|
683
|
+
See controller and view in the /app/BarcodeRecognizerMoto folder of the [System API Samples application](http://github.com/rhomobile/rhodes-system-api-samples/tree/master/app/BarcodeRecognizerMoto/controller.rb) for more information.
|
684
|
+
|
685
|
+
## WebKit browser for Motorola devices
|
686
|
+
Rhodes 3.3 and RhoElements 2.0 support Motorola WebKit browser for Windows Mobile, Windows CE and Android (ET1) devices.
|
687
|
+
|
688
|
+
To enable: install RhoElements gem or RhoStudio and add to build.yml
|
689
|
+
|
690
|
+
capabilities:
|
691
|
+
-motorola
|
692
|
+
|
693
|
+
extensions: ["webkit-browser"]
|
694
|
+
|
630
695
|
## Signature Capture
|
631
696
|
|
632
697
|
The Signature Capture API allow take a signature and save it as an image:
|
@@ -164,7 +164,7 @@ public class RhoLogger {
|
|
164
164
|
makeStringSize(m_category,15) + "| ";
|
165
165
|
}
|
166
166
|
|
167
|
-
|
167
|
+
public void logMessage( int severity, String msg ){
|
168
168
|
logMessage(severity, msg, null, false );
|
169
169
|
}
|
170
170
|
private void logMessage( int severity, String msg, Throwable e ){
|
@@ -683,6 +683,9 @@ public class RhoConnection implements IHttpConnection {
|
|
683
683
|
}else if ( model.equalsIgnoreCase("resetDBOnSyncUserChanged") ){
|
684
684
|
RhoAppAdapter.resetDBOnSyncUserChanged();
|
685
685
|
return true;
|
686
|
+
}else if ( model.equalsIgnoreCase("logger") ){
|
687
|
+
processLogger();
|
688
|
+
return true;
|
686
689
|
}
|
687
690
|
|
688
691
|
}else if ( application.equalsIgnoreCase("shared") )
|
@@ -690,6 +693,37 @@ public class RhoConnection implements IHttpConnection {
|
|
690
693
|
|
691
694
|
return false;
|
692
695
|
}
|
696
|
+
|
697
|
+
void processLogger()
|
698
|
+
{
|
699
|
+
int nLevel = 0;
|
700
|
+
String strMsg = "", strCategory = "";
|
701
|
+
|
702
|
+
Tokenizer oTokenizer = new Tokenizer(uri.getQueryString(), "&");
|
703
|
+
while (oTokenizer.hasMoreTokens())
|
704
|
+
{
|
705
|
+
String tok = oTokenizer.nextToken();
|
706
|
+
if (tok.length() == 0)
|
707
|
+
continue;
|
708
|
+
|
709
|
+
if ( tok.startsWith("level=") )
|
710
|
+
{
|
711
|
+
String strLevel = tok.substring(6);
|
712
|
+
nLevel = Integer.parseInt(strLevel);
|
713
|
+
}else if ( tok.startsWith("msg=") )
|
714
|
+
{
|
715
|
+
strMsg = URI.urlDecode(tok.substring(4));
|
716
|
+
}else if ( tok.startsWith( "cat=") )
|
717
|
+
{
|
718
|
+
strCategory = URI.urlDecode(tok.substring(4));
|
719
|
+
}
|
720
|
+
}
|
721
|
+
|
722
|
+
RhoLogger log = new RhoLogger(strCategory);
|
723
|
+
log.logMessage(nLevel, strMsg );
|
724
|
+
|
725
|
+
respondOK();
|
726
|
+
}
|
693
727
|
|
694
728
|
void showGeoLocation(){
|
695
729
|
String location = "";
|
@@ -1306,6 +1306,12 @@ import com.rho.Tokenizer;
|
|
1306
1306
|
for (int index=0; index < len ; index++)
|
1307
1307
|
{
|
1308
1308
|
char c1 = fullPath.charAt(index);
|
1309
|
+
if (c1 == '+')
|
1310
|
+
{
|
1311
|
+
sb.append(' ');
|
1312
|
+
continue;
|
1313
|
+
}
|
1314
|
+
|
1309
1315
|
if (c1 != '%')
|
1310
1316
|
{
|
1311
1317
|
sb.append(c1);
|
@@ -102,7 +102,7 @@ public class BrowserAdapter5 implements IBrowserAdapter
|
|
102
102
|
if ( url.startsWith("http:/") && !url.startsWith("http://") )
|
103
103
|
url = RhodesApp.getInstance().getHomeUrl() + url.substring(5);
|
104
104
|
|
105
|
-
if ( RhodesApp.getInstance().isRhodesAppUrl(url)
|
105
|
+
if ( RhodesApp.getInstance().isRhodesAppUrl(url) ) //|| URI.isLocalData(url) )
|
106
106
|
{
|
107
107
|
HttpConnection connection = Utilities.makeConnection(url, request.getHeaders(), null, null);
|
108
108
|
|
@@ -275,7 +275,9 @@ public class BrowserAdapter implements RenderingApplication, IBrowserAdapter
|
|
275
275
|
|
276
276
|
try
|
277
277
|
{
|
278
|
-
if (
|
278
|
+
if ( URI.isLocalData(url) )
|
279
|
+
SecondaryResourceFetchThread.enqueue(resource, referrer);
|
280
|
+
else if (referrer == null || /*URI.isLocalData(url) ||*/ !m_bLoadImageAsync)
|
279
281
|
{
|
280
282
|
boolean bLocalHost = RhodesApp.getInstance().isRhodesAppUrl(url);
|
281
283
|
if ( bLocalHost && m_connResource!= null)
|
@@ -102,7 +102,7 @@ public class BrowserAdapter5 implements IBrowserAdapter
|
|
102
102
|
if ( url.startsWith("http:/") && !url.startsWith("http://") )
|
103
103
|
url = RhodesApp.getInstance().getHomeUrl() + url.substring(5);
|
104
104
|
|
105
|
-
if ( RhodesApp.getInstance().isRhodesAppUrl(url)
|
105
|
+
if ( RhodesApp.getInstance().isRhodesAppUrl(url) ) //|| URI.isLocalData(url) )
|
106
106
|
{
|
107
107
|
HttpConnection connection = Utilities.makeConnection(url, request.getHeaders(), null, null);
|
108
108
|
|
@@ -210,6 +210,9 @@ public class NetworkAccess implements INetworkAccess {
|
|
210
210
|
return new RhoConnection(uri);
|
211
211
|
}
|
212
212
|
|
213
|
+
if ( URI.isLocalData(url) )
|
214
|
+
return new BBHttpConnection((HttpConnection)Connector.open(url));
|
215
|
+
|
213
216
|
int fragment = url.indexOf('#');
|
214
217
|
if (-1 != fragment) {
|
215
218
|
url = url.substring(0, fragment);
|
@@ -609,13 +609,12 @@ int rho_sysimpl_get_property(char* szPropName, VALUE* resValue)
|
|
609
609
|
return 1;
|
610
610
|
}
|
611
611
|
#endif
|
612
|
-
|
613
|
-
NSString *version = [device systemVersion];
|
614
|
-
if ([version length] >= 2 && [[version substringToIndex:2] isEqualToString:@"4."])
|
612
|
+
if (get_scale() > 1.2) {
|
615
613
|
*resValue = rho_ruby_create_double(RHO_IPHONE4_PPI);
|
616
|
-
|
614
|
+
}
|
615
|
+
else {
|
617
616
|
*resValue = rho_ruby_create_double(RHO_IPHONE_PPI);
|
618
|
-
|
617
|
+
}
|
619
618
|
return 1;
|
620
619
|
}
|
621
620
|
else if (strcasecmp("device_name", szPropName) == 0) {
|
@@ -403,21 +403,21 @@ VALUE get_camera_info(const char* camera_type) {
|
|
403
403
|
w = 1600;
|
404
404
|
h = 1200;
|
405
405
|
}
|
406
|
-
}
|
406
|
+
} else
|
407
407
|
if ([platform isEqualToString:@"iPhone1,2"]) {
|
408
408
|
// iPhone 3G
|
409
409
|
if (!isFront) {
|
410
410
|
w = 1600;
|
411
411
|
h = 1200;
|
412
412
|
}
|
413
|
-
}
|
413
|
+
} else
|
414
414
|
if ([platform hasPrefix:@"iPhone2"]) {
|
415
415
|
// iPhone 3GS
|
416
416
|
if (!isFront) {
|
417
417
|
w = 2048;
|
418
418
|
h = 1536;
|
419
419
|
}
|
420
|
-
}
|
420
|
+
} else
|
421
421
|
if ([platform hasPrefix:@"iPhone3"]) {
|
422
422
|
// iPhone 4
|
423
423
|
if (!isFront) {
|
@@ -428,18 +428,30 @@ VALUE get_camera_info(const char* camera_type) {
|
|
428
428
|
w = 640;
|
429
429
|
h = 480;
|
430
430
|
}
|
431
|
-
}
|
431
|
+
} else
|
432
432
|
if ([platform hasPrefix:@"iPhone4"]) {
|
433
|
-
// iPhone
|
433
|
+
// iPhone 4S
|
434
434
|
if (!isFront) {
|
435
|
-
w =
|
436
|
-
h =
|
435
|
+
w = 2448;
|
436
|
+
h = 3264;
|
437
437
|
}
|
438
438
|
else {
|
439
439
|
w = 640;
|
440
440
|
h = 480;
|
441
441
|
}
|
442
|
-
}
|
442
|
+
} else
|
443
|
+
if ([platform hasPrefix:@"iPhone"]) {
|
444
|
+
// iPhone 5 ?
|
445
|
+
if (!isFront) {
|
446
|
+
w = 2448;
|
447
|
+
h = 3264;
|
448
|
+
}
|
449
|
+
else {
|
450
|
+
w = 640;
|
451
|
+
h = 480;
|
452
|
+
}
|
453
|
+
} else
|
454
|
+
|
443
455
|
|
444
456
|
if ([platform isEqualToString:@"iPod1,1"]) {
|
445
457
|
// iPod Touch 1
|
data/platform/iphone/Info.plist
CHANGED
@@ -43,6 +43,7 @@
|
|
43
43
|
#include "rubyext/GeoLocation.h"
|
44
44
|
#include "common/app_build_configs.h"
|
45
45
|
#include "unzip/unzip.h"
|
46
|
+
#include "common/Tokenizer.h"
|
46
47
|
|
47
48
|
#include <algorithm>
|
48
49
|
|
@@ -664,6 +665,36 @@ static void callback_syncdb(void *arg, String const &/*query*/ )
|
|
664
665
|
rho_http_sendresponse(arg, "");
|
665
666
|
}
|
666
667
|
|
668
|
+
static void callback_logger(void *arg, String const &query )
|
669
|
+
{
|
670
|
+
int nLevel = 0;
|
671
|
+
String strMsg, strCategory;
|
672
|
+
|
673
|
+
CTokenizer oTokenizer(query, "&");
|
674
|
+
while (oTokenizer.hasMoreTokens())
|
675
|
+
{
|
676
|
+
String tok = oTokenizer.nextToken();
|
677
|
+
if (tok.length() == 0)
|
678
|
+
continue;
|
679
|
+
|
680
|
+
if ( String_startsWith( tok, "level=") )
|
681
|
+
{
|
682
|
+
String strLevel = tok.substr(6);
|
683
|
+
convertFromStringA( strLevel.c_str(), nLevel );
|
684
|
+
}else if ( String_startsWith( tok, "msg=") )
|
685
|
+
{
|
686
|
+
strMsg = rho::net::URI::urlDecode(tok.substr(4));
|
687
|
+
}else if ( String_startsWith( tok, "cat=") )
|
688
|
+
{
|
689
|
+
strCategory = rho::net::URI::urlDecode(tok.substr(4));
|
690
|
+
}
|
691
|
+
}
|
692
|
+
|
693
|
+
rhoPlainLog( "", 0, nLevel, strCategory.c_str(), strMsg.c_str() );
|
694
|
+
|
695
|
+
rho_http_sendresponse(arg, "");
|
696
|
+
}
|
697
|
+
|
667
698
|
static void callback_redirect_to(void *arg, String const &strQuery )
|
668
699
|
{
|
669
700
|
size_t nUrl = strQuery.find("url=");
|
@@ -761,6 +792,7 @@ void CRhodesApp::initHttpServer()
|
|
761
792
|
m_httpServer->register_uri("/system/loadserversources", callback_loadserversources);
|
762
793
|
m_httpServer->register_uri("/system/resetDBOnSyncUserChanged", callback_resetDBOnSyncUserChanged);
|
763
794
|
m_httpServer->register_uri("/system/loadallsyncsources", callback_loadallsyncsources);
|
795
|
+
m_httpServer->register_uri("/system/logger", callback_logger);
|
764
796
|
}
|
765
797
|
|
766
798
|
const char* CRhodesApp::getFreeListeningPort()
|
data/platform/shared/net/URI.cpp
CHANGED
@@ -230,6 +230,11 @@ String URI::urlEncode(const String& fullPath)
|
|
230
230
|
/*static*/ void URI::urlDecode(const String &url, String& ret )
|
231
231
|
{
|
232
232
|
for (const char *s = url.c_str(); *s != '\0'; ++s) {
|
233
|
+
if (*s == '+') {
|
234
|
+
ret.push_back(' ');
|
235
|
+
continue;
|
236
|
+
}
|
237
|
+
|
233
238
|
if (*s != '%') {
|
234
239
|
ret.push_back(*s);
|
235
240
|
continue;
|
@@ -28,6 +28,7 @@ SOURCES += \
|
|
28
28
|
../../shared/common/RhodesApp.cpp \
|
29
29
|
../../shared/common/RhoConf.cpp \
|
30
30
|
../../shared/common/AppMenu.cpp \
|
31
|
+
../../shared/common/BundleManager.cpp \
|
31
32
|
../../shared/logging/RhoPlainLog.cpp \
|
32
33
|
../../shared/logging/RhoLogSink.cpp \
|
33
34
|
../../shared/logging/RhoLogConf.cpp \
|
Binary file
|
data/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.3.0.beta.
|
1
|
+
3.3.0.beta.2
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rhodes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 62196471
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 3
|
9
9
|
- 0
|
10
10
|
- beta
|
11
|
-
-
|
12
|
-
version: 3.3.0.beta.
|
11
|
+
- 2
|
12
|
+
version: 3.3.0.beta.2
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Rhomobile
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-12-
|
20
|
+
date: 2011-12-27 00:00:00 -08:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -1063,6 +1063,7 @@ files:
|
|
1063
1063
|
- lib/test/rho_stubs.rb
|
1064
1064
|
- lib/test/syncdb.sqlite
|
1065
1065
|
- LICENSE
|
1066
|
+
- Manifest.txt
|
1066
1067
|
- platform/android/build/android.rake
|
1067
1068
|
- platform/android/build/android_tools.rb
|
1068
1069
|
- platform/android/build/androidcommon.rb
|
@@ -4942,6 +4943,7 @@ files:
|
|
4942
4943
|
- res/icons/rhosim.psd
|
4943
4944
|
- rhobuild.yml.example
|
4944
4945
|
- rhodes.gemspec
|
4946
|
+
- rhomobile-debug-1.0.6.gem
|
4945
4947
|
- rhomobile-debug.gemspec
|
4946
4948
|
- spec/framework_spec/app/application.rb
|
4947
4949
|
- spec/framework_spec/app/index.erb
|