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

Sign up to get free protection for your applications and to get access to all the features.
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= []