rhodes 3.2.0.beta.5 → 3.2.0.beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. data/CHANGELOG +3 -0
  2. data/Manifest.txt +10 -1
  3. data/Rakefile +6 -0
  4. data/bin/get-rhodes-info +4 -27
  5. data/bin/set-rhodes-sdk +4 -1
  6. data/doc/build.txt +12 -3
  7. data/doc/extensions.txt +26 -0
  8. data/installer/Rakefile +156 -0
  9. data/installer/ServiceLib.nsh +369 -0
  10. data/installer/jake.rb +478 -0
  11. data/installer/rhostudio.nsi +76 -143
  12. data/lib/extensions/digest-sha1/ext/Rakefile +58 -40
  13. data/lib/extensions/fileutils/fileutils.rb +3 -2
  14. data/lib/extensions/hmac/hmac-md5.rb +11 -0
  15. data/lib/extensions/hmac/hmac-rmd160.rb +11 -0
  16. data/lib/extensions/hmac/hmac-sha1.rb +11 -0
  17. data/lib/extensions/hmac/hmac-sha2.rb +25 -0
  18. data/lib/extensions/hmac/hmac.rb +118 -0
  19. data/lib/extensions/hmac/ruby_hmac.rb +2 -0
  20. data/lib/extensions/net-http/net/http.rb +1 -1
  21. data/lib/framework/rho/render.rb +1 -1
  22. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesActivity.java +1 -6
  23. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesApplication.java +52 -8
  24. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +8 -15
  25. data/platform/android/Rhodes/src/com/rhomobile/rhodes/util/PerformOnUiThread.java +4 -5
  26. data/platform/android/build/android.rake +3 -1
  27. data/platform/iphone/rbuild/iphone.rake +7 -7
  28. data/platform/shared/common/RhodesApp.cpp +18 -14
  29. data/platform/shared/common/RhodesApp.h +1 -0
  30. data/platform/shared/rubyext/System.cpp +3 -0
  31. data/platform/symbian/build/symbian.rake +13 -5
  32. data/platform/wp7/RhoRubyLib/net/NetRequest.cs +9 -1
  33. data/rakefile.rb +6 -0
  34. data/res/generators/templates/application/Rakefile +10 -1
  35. data/res/generators/templates/application/app/layout.erb +1 -1
  36. data/res/generators/templates/application/build.yml +2 -2
  37. data/res/generators/templates/application/public/jqmobile/{jquery.mobile.iphone.css → jquery-mobile-iphone.css} +0 -0
  38. data/res/generators/templates/application/public/js/jqmobile-patch.js +23 -20
  39. data/spec/framework_spec/app/spec/library/digest/sha1/file_spec.rb +3 -3
  40. data/spec/framework_spec/app/spec/library/net/http/http/Proxy_spec.rb +3 -2
  41. data/spec/framework_spec/app/spec/library/net/http/http/copy_spec.rb +1 -1
  42. data/spec/framework_spec/app/spec/library/net/http/http/delete_spec.rb +1 -1
  43. data/spec/framework_spec/app/spec/library/net/http/http/finish_spec.rb +1 -1
  44. data/spec/framework_spec/app/spec/library/net/http/http/fixtures/http_server.rb +18 -12
  45. data/spec/framework_spec/app/spec/library/net/http/http/get_print_spec.rb +2 -2
  46. data/spec/framework_spec/app/spec/library/net/http/http/get_response_spec.rb +2 -2
  47. data/spec/framework_spec/app/spec/library/net/http/http/get_spec.rb +3 -3
  48. data/spec/framework_spec/app/spec/library/net/http/http/head_spec.rb +1 -1
  49. data/spec/framework_spec/app/spec/library/net/http/http/initialize_spec.rb +2 -2
  50. data/spec/framework_spec/app/spec/library/net/http/http/inspect_spec.rb +4 -4
  51. data/spec/framework_spec/app/spec/library/net/http/http/lock_spec.rb +1 -1
  52. data/spec/framework_spec/app/spec/library/net/http/http/mkcol_spec.rb +1 -1
  53. data/spec/framework_spec/app/spec/library/net/http/http/move_spec.rb +1 -1
  54. data/spec/framework_spec/app/spec/library/net/http/http/new_spec.rb +7 -7
  55. data/spec/framework_spec/app/spec/library/net/http/http/newobj_spec.rb +2 -2
  56. data/spec/framework_spec/app/spec/library/net/http/http/options_spec.rb +1 -1
  57. data/spec/framework_spec/app/spec/library/net/http/http/port_spec.rb +2 -2
  58. data/spec/framework_spec/app/spec/library/net/http/http/post_form_spec.rb +1 -1
  59. data/spec/framework_spec/app/spec/library/net/http/http/post_spec.rb +1 -1
  60. data/spec/framework_spec/app/spec/library/net/http/http/propfind_spec.rb +1 -1
  61. data/spec/framework_spec/app/spec/library/net/http/http/proppatch_spec.rb +1 -1
  62. data/spec/framework_spec/app/spec/library/net/http/http/proxy_address_spec.rb +2 -2
  63. data/spec/framework_spec/app/spec/library/net/http/http/proxy_pass_spec.rb +3 -3
  64. data/spec/framework_spec/app/spec/library/net/http/http/proxy_port_spec.rb +3 -3
  65. data/spec/framework_spec/app/spec/library/net/http/http/proxy_user_spec.rb +3 -3
  66. data/spec/framework_spec/app/spec/library/net/http/http/put_spec.rb +1 -1
  67. data/spec/framework_spec/app/spec/library/net/http/http/request_spec.rb +1 -1
  68. data/spec/framework_spec/app/spec/library/net/http/http/send_request_spec.rb +1 -1
  69. data/spec/framework_spec/app/spec/library/net/http/http/set_debug_output_spec.rb +1 -1
  70. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_get.rb +1 -1
  71. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_head.rb +1 -1
  72. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_post.rb +1 -1
  73. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_put.rb +1 -1
  74. data/spec/framework_spec/app/spec/library/net/http/http/shared/started.rb +1 -1
  75. data/spec/framework_spec/app/spec/library/net/http/http/start_spec.rb +8 -8
  76. data/spec/framework_spec/app/spec/library/net/http/http/trace_spec.rb +1 -1
  77. data/spec/framework_spec/app/spec/library/net/http/http/unlock_spec.rb +1 -1
  78. data/spec/framework_spec/app/spec_runner.rb +1 -1
  79. data/spec/framework_spec/build.yml +2 -2
  80. data/spec/phone_spec/app/spec/rhom_object_spec.rb +43 -2
  81. data/version +1 -1
  82. metadata +14 -5
@@ -1524,6 +1524,9 @@ module FileUtils
1524
1524
  OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) }
1525
1525
  end
1526
1526
 
1527
+ #RHO does not support eval of ruby text only block
1528
+ =begin
1529
+
1527
1530
  LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern)
1528
1531
  module LowMethods
1529
1532
  module_eval("private\n" + ::FileUtils::LOW_METHODS.map {|name| "def #{name}(*)end"}.join("\n"),
@@ -1532,8 +1535,6 @@ module FileUtils
1532
1535
 
1533
1536
  METHODS = singleton_methods() - [:private_module_function,
1534
1537
  :commands, :options, :have_option?, :options_of, :collect_method]
1535
- #RHO does not support eval of ruby text only block
1536
- =begin
1537
1538
  #
1538
1539
  # This module has all methods of FileUtils module, but it outputs messages
1539
1540
  # before acting. This equates to passing the <tt>:verbose</tt> flag to
@@ -0,0 +1,11 @@
1
+ require 'hmac'
2
+ require 'digest/md5'
3
+
4
+ module HMAC
5
+ class MD5 < Base
6
+ def initialize(key = nil)
7
+ super(Digest::MD5, 64, 16, key)
8
+ end
9
+ public_class_method :new, :digest, :hexdigest
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'hmac'
2
+ require 'digest/rmd160'
3
+
4
+ module HMAC
5
+ class RMD160 < Base
6
+ def initialize(key = nil)
7
+ super(Digest::RMD160, 64, 20, key)
8
+ end
9
+ public_class_method :new, :digest, :hexdigest
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'hmac'
2
+ require 'digest/sha1'
3
+
4
+ module HMAC
5
+ class SHA1 < Base
6
+ def initialize(key = nil)
7
+ super(Digest::SHA1, 64, 20, key)
8
+ end
9
+ public_class_method :new, :digest, :hexdigest
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ require 'hmac'
2
+ require 'digest/sha2'
3
+
4
+ module HMAC
5
+ class SHA256 < Base
6
+ def initialize(key = nil)
7
+ super(Digest::SHA256, 64, 32, key)
8
+ end
9
+ public_class_method :new, :digest, :hexdigest
10
+ end
11
+
12
+ class SHA384 < Base
13
+ def initialize(key = nil)
14
+ super(Digest::SHA384, 128, 48, key)
15
+ end
16
+ public_class_method :new, :digest, :hexdigest
17
+ end
18
+
19
+ class SHA512 < Base
20
+ def initialize(key = nil)
21
+ super(Digest::SHA512, 128, 64, key)
22
+ end
23
+ public_class_method :new, :digest, :hexdigest
24
+ end
25
+ end
@@ -0,0 +1,118 @@
1
+ # Copyright (C) 2001 Daiki Ueno <ueno@unixuser.org>
2
+ # This library is distributed under the terms of the Ruby license.
3
+
4
+ # This module provides common interface to HMAC engines.
5
+ # HMAC standard is documented in RFC 2104:
6
+ #
7
+ # H. Krawczyk et al., "HMAC: Keyed-Hashing for Message Authentication",
8
+ # RFC 2104, February 1997
9
+ #
10
+ # These APIs are inspired by JCE 1.2's javax.crypto.Mac interface.
11
+ #
12
+ # <URL:http://java.sun.com/security/JCE1.2/spec/apidoc/javax/crypto/Mac.html>
13
+ #
14
+ # Source repository is at
15
+ #
16
+ # http://github.com/topfunky/ruby-hmac/tree/master
17
+
18
+ module HMAC
19
+
20
+ VERSION = '0.4.0'
21
+
22
+ class Base
23
+ def initialize(algorithm, block_size, output_length, key)
24
+ @algorithm = algorithm
25
+ @block_size = block_size
26
+ @output_length = output_length
27
+ @initialized = false
28
+ @key_xor_ipad = ''
29
+ @key_xor_opad = ''
30
+ set_key(key) unless key.nil?
31
+ end
32
+
33
+ private
34
+ def check_status
35
+ unless @initialized
36
+ raise RuntimeError,
37
+ "The underlying hash algorithm has not yet been initialized."
38
+ end
39
+ end
40
+
41
+ public
42
+ def set_key(key)
43
+ # If key is longer than the block size, apply hash function
44
+ # to key and use the result as a real key.
45
+ key = @algorithm.digest(key) if key.size > @block_size
46
+ akey = key.unpack("C*")
47
+ key_xor_ipad = ("\x36" * @block_size).unpack("C*")
48
+ key_xor_opad = ("\x5C" * @block_size).unpack("C*")
49
+ for i in 0 .. akey.size - 1
50
+ key_xor_ipad[i] ^= akey[i]
51
+ key_xor_opad[i] ^= akey[i]
52
+ end
53
+ @key_xor_ipad = key_xor_ipad.pack("C*")
54
+ @key_xor_opad = key_xor_opad.pack("C*")
55
+ @md = @algorithm.new
56
+ @initialized = true
57
+ end
58
+
59
+ def reset_key
60
+ @key_xor_ipad.gsub!(/./, '?')
61
+ @key_xor_opad.gsub!(/./, '?')
62
+ @key_xor_ipad[0..-1] = ''
63
+ @key_xor_opad[0..-1] = ''
64
+ @initialized = false
65
+ end
66
+
67
+ def update(text)
68
+ check_status
69
+ # perform inner H
70
+ md = @algorithm.new
71
+ md.update(@key_xor_ipad)
72
+ md.update(text)
73
+ str = md.digest
74
+ # perform outer H
75
+ md = @algorithm.new
76
+ md.update(@key_xor_opad)
77
+ md.update(str)
78
+ @md = md
79
+ end
80
+ alias << update
81
+
82
+ def digest
83
+ check_status
84
+ @md.digest
85
+ end
86
+
87
+ def hexdigest
88
+ check_status
89
+ @md.hexdigest
90
+ end
91
+ alias to_s hexdigest
92
+
93
+ # These two class methods below are safer than using above
94
+ # instance methods combinatorially because an instance will have
95
+ # held a key even if it's no longer in use.
96
+ def Base.digest(key, text)
97
+ hmac = self.new(key)
98
+ begin
99
+ hmac.update(text)
100
+ hmac.digest
101
+ ensure
102
+ hmac.reset_key
103
+ end
104
+ end
105
+
106
+ def Base.hexdigest(key, text)
107
+ hmac = self.new(key)
108
+ begin
109
+ hmac.update(text)
110
+ hmac.hexdigest
111
+ ensure
112
+ hmac.reset_key
113
+ end
114
+ end
115
+
116
+ private_class_method :new, :digest, :hexdigest
117
+ end
118
+ end
@@ -0,0 +1,2 @@
1
+ # Convenience file to match gem name
2
+ require 'hmac'
@@ -876,7 +876,7 @@ module Net #:nodoc:
876
876
  the_body = r.read_body dest, &block
877
877
  case r["content-encoding"]
878
878
  when "gzip"
879
- r.body= Zlib::GzipReader.new(StringIO.new(the_body), encoding: "ASCII-8BIT").read
879
+ r.body= Zlib::GzipReader.new(StringIO.new(the_body), encoding => "ASCII-8BIT").read
880
880
  r.delete("content-encoding")
881
881
  when "deflate"
882
882
  r.body= Zlib::Inflate.inflate(the_body);
@@ -164,7 +164,7 @@ module Rho
164
164
  #rho_info 'render content: ' + @content.length.to_s
165
165
  if xhr? and options[:use_layout_on_ajax] != true
166
166
  options[:layout] = false
167
- if @request["headers"]["Transition-Enabled"] == "true"
167
+ if options[:partial].nil? && @request["headers"]["Transition-Enabled"] == "true"
168
168
  @content = "<div>#{@content}</div>"
169
169
  end
170
170
  elsif options[:layout].nil? or options[:layout] == true
@@ -247,7 +247,6 @@ public class RhodesActivity extends BaseActivity {
247
247
  @Override
248
248
  public void onStart() {
249
249
  super.onStart();
250
- RhodesService.rhodesActivityStarted(true);
251
250
 
252
251
  Log.d(TAG, "RhodesActivity.onStart()");
253
252
  mIsInsideStartStop = true;
@@ -278,15 +277,11 @@ public class RhodesActivity extends BaseActivity {
278
277
  iterator.next().onPause(this);
279
278
  }
280
279
  }
281
-
282
- RhodesApplication.stateChanged(RhodesApplication.UiState.MainActivityPaused);
283
-
284
- RhodesService.rhodesActivityStarted(false);
285
280
 
286
281
  super.onPause();
287
282
  Log.d(TAG, "RhodesActivity.onPause()");
288
283
 
289
- RhodesService.callUiDestroyedCallback();
284
+ RhodesApplication.stateChanged(RhodesApplication.UiState.MainActivityPaused);
290
285
  }
291
286
 
292
287
  @Override
@@ -37,15 +37,50 @@ public class RhodesApplication extends Application{
37
37
 
38
38
  private static final String TAG = RhodesApplication.class.getSimpleName();
39
39
  private static Handler mHandler;
40
- static {
41
- NativeLibraries.load();
42
- }
40
+ static {
41
+ NativeLibraries.load();
42
+ }
43
+
44
+ @Override
45
+ public void onCreate(){
46
+ super.onCreate();
47
+
48
+ RhodesApplication.runWhen(
49
+ UiState.MainActivityStarted,
50
+ new StateHandler(false) {
51
+ @Override
52
+ public void run() {
53
+ rhodesActivityStarted(true);
54
+ }
55
+ });
56
+ RhodesApplication.runWhen(
57
+ UiState.MainActivityPaused,
58
+ new StateHandler(false) {
59
+ @Override
60
+ public void run() {
61
+ if (isRhodesActivityStarted()) {
62
+ Logger.T(TAG, "callUiDestroyedCallback");
63
+ rhodesActivityStarted(false);
64
+ RhodesService.callUiDestroyedCallback();
65
+ }
66
+ }
67
+ });
68
+ }
69
+ private static boolean sRhodesActivityStarted = false;
70
+
71
+ synchronized
72
+ static void rhodesActivityStarted(boolean started) {
73
+ sRhodesActivityStarted = started;
74
+ }
75
+
76
+ synchronized
77
+ public static boolean isRhodesActivityStarted() { return sRhodesActivityStarted; }
43
78
 
44
79
  private native static void createRhodesApp();
45
80
  private native static void startRhodesApp();
46
81
  private native static void stopRhodesApp();
47
82
  private native static boolean canStartApp(String strCmdLine, String strSeparators);
48
-
83
+
49
84
  public static void create()
50
85
  {
51
86
  if (sAppState != AppState.Undefined) {
@@ -56,13 +91,13 @@ public class RhodesApplication extends Application{
56
91
  }
57
92
 
58
93
  public static void start()
59
- {
94
+ {
60
95
  if (sAppState != AppState.Undefined) {
61
96
  Logger.E(TAG, "Cannot start application it is already started!!!");
62
97
  return;
63
98
  }
64
- startRhodesApp();
65
- }
99
+ startRhodesApp();
100
+ }
66
101
 
67
102
  public static boolean canStart(String strCmdLine)
68
103
  {
@@ -70,14 +105,23 @@ public class RhodesApplication extends Application{
70
105
  }
71
106
 
72
107
  public static void stop() {
73
-
108
+ Logger.T(TAG, "Stopping application");
74
109
  mHandler = new Handler();
75
110
  mHandler.postDelayed(new Runnable() {
76
111
  public void run() {
112
+ Logger.T(TAG, "do stopRhodesApp");
77
113
  stopRhodesApp();
114
+ try {
115
+ Logger.T(TAG, "do RhodesActivity.finish()");
116
+ RhodesActivity.safeGetInstance().finish();
117
+ } catch (Throwable e) {
118
+ // Just postpone
119
+ }
120
+ Logger.T(TAG, "send quit signal");
78
121
  Process.sendSignal(Process.myPid(), Process.SIGNAL_QUIT);
79
122
  mHandler.postDelayed(new Runnable() {
80
123
  public void run() {
124
+ Logger.T(TAG, "send kill signal");
81
125
  Process.killProcess(Process.myPid());
82
126
  }
83
127
  }, 500);
@@ -151,15 +151,6 @@ public class RhodesService extends Service {
151
151
  private static boolean mCameraAvailable;
152
152
 
153
153
  private static int sActivitiesActive;
154
- private static boolean sRhodesActivityStarted = false;
155
-
156
- synchronized
157
- static void rhodesActivityStarted(boolean started) {
158
- sRhodesActivityStarted = started;
159
- }
160
-
161
- synchronized
162
- public static boolean isRhodesActivityStarted() { return sRhodesActivityStarted; }
163
154
 
164
155
  private boolean mNeedGeoLocationRestart = false;
165
156
 
@@ -614,22 +605,24 @@ public class RhodesService extends Service {
614
605
  }
615
606
 
616
607
  public static void exit() {
608
+ Logger.I(TAG, "Exit application");
617
609
  try {
618
- RhodesActivity activity = RhodesActivity.getInstance();
619
- if (activity != null)
620
- activity.finish();
621
-
610
+ // Do this fake state change in order to make processing before server is stopped
611
+ RhodesApplication.stateChanged(RhodesApplication.UiState.MainActivityPaused);
612
+
622
613
  RhodesService service = RhodesService.getInstance();
623
614
  if (service != null)
624
615
  {
616
+ Logger.T(TAG, "stop RhodesService");
625
617
  service.wakeLock.reset();
626
618
  service.stopSelf();
627
619
  }
628
620
 
621
+ Logger.T(TAG, "stop RhodesApplication");
629
622
  RhodesApplication.stop();
630
623
  }
631
624
  catch (Exception e) {
632
- Logger.E(TAG, e.getMessage());
625
+ Logger.E(TAG, e);
633
626
  }
634
627
  }
635
628
 
@@ -1430,7 +1423,7 @@ public class RhodesService extends Service {
1430
1423
  }
1431
1424
 
1432
1425
  public static void bringToFront() {
1433
- if (isRhodesActivityStarted()) {
1426
+ if (RhodesApplication.isRhodesActivityStarted()) {
1434
1427
  Logger.T(TAG, "Main activity is already at front, do nothing");
1435
1428
  return;
1436
1429
  }
@@ -45,7 +45,7 @@ public class PerformOnUiThread implements Runnable {
45
45
  runnable.run();
46
46
  }
47
47
  catch (Exception e) {
48
- Logger.E(TAG, "Operation failed: " + e.getMessage());
48
+ Logger.E(TAG, e);
49
49
  }
50
50
  finally {
51
51
  synchronized (runnable) {
@@ -64,7 +64,7 @@ public class PerformOnUiThread implements Runnable {
64
64
  RhodesActivity.safeGetInstance().post(r, delay);
65
65
  }
66
66
  catch (Exception e) {
67
- Logger.E(TAG, "exec failed: " + e.getMessage());
67
+ Logger.E(TAG, e);
68
68
  setError(e);
69
69
  }
70
70
  }
@@ -88,7 +88,7 @@ public class PerformOnUiThread implements Runnable {
88
88
  try {
89
89
  RhodesActivity.safeGetInstance().post(r);
90
90
  } catch (Exception e) {
91
- Logger.E(TAG, "exec failed: " + e.getMessage());
91
+ Logger.E(TAG, e);
92
92
  setError(e);
93
93
  }
94
94
  }
@@ -117,8 +117,7 @@ public class PerformOnUiThread implements Runnable {
117
117
  }
118
118
  }
119
119
  } catch (Exception e) {
120
- Logger.E(TAG, "exec failed: " + e.getMessage());
121
- Thread.dumpStack();
120
+ Logger.E(TAG, e);
122
121
  }
123
122
  }
124
123
  };
@@ -279,7 +279,9 @@ namespace "config" do
279
279
  $current_platform = "android"
280
280
  end
281
281
 
282
- task :android => [:set_android_platform, "config:common"] do
282
+ task :android => :set_android_platform do
283
+
284
+ Rake::Task["config:common"].invoke
283
285
 
284
286
  $ext_android_rhodes_activity_listener = []
285
287
  $ext_android_manifest_changes= []