rhodes 2.2.4.beta.1 → 2.2.5.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.
Files changed (188) hide show
  1. data/CHANGELOG +10 -0
  2. data/Rakefile +119 -3
  3. data/lib/build/jake.rb +15 -1
  4. data/lib/framework/dateME.rb +6 -1
  5. data/lib/framework/rho/render.rb +18 -15
  6. data/lib/framework/rho/rho.rb +105 -43
  7. data/lib/framework/rho/rhoapplication.rb +1 -1
  8. data/lib/framework/rho/rhocontact.rb +41 -13
  9. data/lib/framework/rho/rhocontroller.rb +10 -1
  10. data/lib/framework/rho/rhoevent_c.rb +6 -1
  11. data/lib/framework/rho/rhosupport.rb +1 -1
  12. data/lib/framework/rhodes.rb +1 -1
  13. data/lib/framework/rholang/rhomsg_de.rb +1 -1
  14. data/lib/framework/rholang/rhomsg_es.rb +1 -1
  15. data/lib/framework/rholang/rhomsg_it.rb +28 -0
  16. data/lib/framework/rhom/rhom.rb +6 -0
  17. data/lib/framework/rhom/rhom_model.rb +14 -7
  18. data/lib/framework/rhom/rhom_object_factory.rb +121 -56
  19. data/lib/framework/version.rb +1 -1
  20. data/lib/rhodes.rb +1 -1
  21. data/platform/android/Rhodes/AndroidManifest.full.xml +62 -0
  22. data/platform/android/Rhodes/AndroidManifest.xml +3 -34
  23. data/platform/android/Rhodes/jni/include/rhodes/JNIRhodes.h +17 -2
  24. data/platform/android/Rhodes/jni/src/alert.cpp +16 -0
  25. data/platform/android/Rhodes/jni/src/callbacks.cpp +27 -3
  26. data/platform/android/Rhodes/jni/src/nativebar.cpp +3 -0
  27. data/platform/android/Rhodes/jni/src/nativeview.cpp +131 -1
  28. data/platform/android/Rhodes/jni/src/phonebook.cpp +102 -41
  29. data/platform/android/Rhodes/jni/src/rhodes.cpp +113 -32
  30. data/platform/android/Rhodes/jni/src/ringtones.cpp +1 -1
  31. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Capabilities.java +1 -0
  32. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +9 -8
  33. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +184 -49
  34. data/platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java +49 -25
  35. data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java +104 -57
  36. data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java +36 -2
  37. data/platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocation.java +24 -14
  38. data/platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocationImpl.java +7 -8
  39. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +185 -3
  40. data/platform/android/Rhodes/src/com/rhomobile/rhodes/nativeview/RhoNativeViewManager.java +54 -1
  41. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Contact.java +107 -14
  42. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorNew.java +72 -24
  43. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorOld.java +22 -21
  44. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Phonebook.java +91 -11
  45. data/platform/android/Rhodes/src/com/rhomobile/rhodes/util/PerformOnUiThread.java +10 -0
  46. data/platform/android/Rhodes/src/com/rhomobile/rhodes/webview/ChromeClientNew.java +11 -0
  47. data/platform/android/Rhodes/src/com/rhomobile/rhodes/webview/RhoWebSettingsNew.java +10 -0
  48. data/platform/android/build/android.rake +50 -9
  49. data/platform/android/build/librhocommon_build.files +1 -0
  50. data/platform/bb/Hsqldb/src/org/hsqldb/Parser.java +3 -2
  51. data/platform/bb/Hsqldb/src/org/hsqldb/SchemaManager.java +3 -1
  52. data/platform/bb/Hsqldb/src/org/hsqldb/Session.java +7 -0
  53. data/platform/bb/Hsqldb/src/org/hsqldb/Tokenizer.java +2 -2
  54. data/platform/bb/RubyVM/RubyVM.jdp +1 -0
  55. data/platform/bb/RubyVM/src/com/rho/AppBuildConfig.java +22 -0
  56. data/platform/bb/RubyVM/src/com/rho/RhoRuby.java +5 -0
  57. data/platform/bb/RubyVM/src/com/rho/net/RhoConnection.java +1 -1
  58. data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +51 -4
  59. data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +21 -10
  60. data/platform/bb/RubyVM/src/com/rho/sync/SyncSource.java +82 -33
  61. data/platform/bb/RubyVM/src/com/rho/sync/SyncThread.java +59 -6
  62. data/platform/bb/RubyVM/src/com/xruby/GeneratedMethods/RubyFloat_Methods.java +5 -0
  63. data/platform/bb/RubyVM/src/com/xruby/GeneratedMethods/RubyString_Methods.java +19 -7
  64. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/ArrayPacker.java +1 -1
  65. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyFloat.java +5 -0
  66. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyString.java +55 -11
  67. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyTime.java +18 -2
  68. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyKernelModule.java +8 -5
  69. data/platform/bb/RubyVM/src/j2me/lang/CharacterMe.java +1 -1
  70. data/platform/bb/RubyVM/src/j2me/util/StringParser.java +2 -0
  71. data/platform/bb/build/RubyVM_build.files +1 -0
  72. data/platform/bb/build/bb.rake +21 -2
  73. data/platform/bb/rhodes/platform/4.7/com/rho/RhoMainScreen.java +3 -3
  74. data/platform/bb/rhodes/platform/common/com/rho/RhoMainScreen.java +1 -1
  75. data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +1 -2
  76. data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +15 -16
  77. data/platform/bb/rhodes/src/com/rho/rubyext/RhoCalendar.java +4 -0
  78. data/platform/bb/rhodes/src/com/rho/rubyext/System.java +58 -0
  79. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +90 -4
  80. data/platform/iphone/Classes/AppManager/AppManager.m +43 -5
  81. data/platform/iphone/Classes/Event/Event.h +2 -0
  82. data/platform/iphone/Classes/Event/Event.m +12 -1
  83. data/platform/iphone/Classes/GeoLocation/LocationController.m +9 -3
  84. data/platform/iphone/Classes/MapView/MapViewController.m +20 -9
  85. data/platform/iphone/Classes/NativeBar.m +27 -0
  86. data/platform/iphone/Classes/Phonebook/phonebook.m +17 -0
  87. data/platform/iphone/Classes/RhoAlert.m +61 -1
  88. data/platform/iphone/Classes/RhoMainView.h +1 -0
  89. data/platform/iphone/Classes/Rhodes.h +2 -0
  90. data/platform/iphone/Classes/Rhodes.m +108 -1
  91. data/platform/iphone/Classes/SimpleMainView.h +4 -0
  92. data/platform/iphone/Classes/SimpleMainView.m +30 -3
  93. data/platform/iphone/Classes/SplashViewController.m +3 -1
  94. data/platform/iphone/Classes/TabbedMainView.h +2 -0
  95. data/platform/iphone/Classes/TabbedMainView.m +63 -11
  96. data/platform/iphone/Classes/rho/net/NetRequestImpl.m +26 -0
  97. data/platform/iphone/Info.plist +12 -1
  98. data/platform/iphone/RhoLib/RhoLib.xcodeproj/project.pbxproj +8 -0
  99. data/platform/iphone/rbuild/iphone.rake +181 -25
  100. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +5 -5
  101. data/platform/shared/common/IRhoThreadImpl.h +1 -1
  102. data/platform/shared/common/PosixThreadImpl.cpp +5 -3
  103. data/platform/shared/common/PosixThreadImpl.h +1 -1
  104. data/platform/shared/common/RhoFilePath.h +11 -0
  105. data/platform/shared/common/RhoNativeViewManager.h +17 -0
  106. data/platform/shared/common/RhoThread.h +1 -1
  107. data/platform/shared/common/RhodesApp.cpp +29 -8
  108. data/platform/shared/common/ThreadQueue.cpp +5 -3
  109. data/platform/shared/common/ThreadQueue.h +2 -1
  110. data/platform/shared/common/app_build_configs.c +25 -0
  111. data/platform/shared/common/app_build_configs.h +11 -0
  112. data/platform/shared/net/AsyncHttp.cpp +5 -5
  113. data/platform/shared/net/CURLNetRequest.cpp +25 -7
  114. data/platform/shared/net/CURLNetRequest.h +2 -1
  115. data/platform/shared/net/HttpServer.cpp +28 -0
  116. data/platform/shared/ruby/ext/nativebar/nativebar.i +3 -0
  117. data/platform/shared/ruby/ext/nativebar/nativebar_wrap.c +26 -1
  118. data/platform/shared/ruby/ext/rho/rhoruby.c +6 -0
  119. data/platform/shared/ruby/ext/rho/rhoruby.h +1 -0
  120. data/platform/shared/ruby/ext/rho/rhosupport.c +15 -2
  121. data/platform/shared/ruby/ext/syncengine/syncengine.i +14 -2
  122. data/platform/shared/ruby/ext/syncengine/syncengine_wrap.c +97 -2
  123. data/platform/shared/ruby/ext/system/system.i +13 -0
  124. data/platform/shared/ruby/ext/system/system_wrap.c +104 -1
  125. data/platform/shared/rubyext/RhoAppAdapter.cpp +7 -0
  126. data/platform/shared/sync/SyncEngine.cpp +43 -3
  127. data/platform/shared/sync/SyncEngine.h +13 -0
  128. data/platform/shared/sync/SyncNotify.cpp +41 -23
  129. data/platform/shared/sync/SyncNotify.h +18 -4
  130. data/platform/shared/sync/SyncSource.cpp +52 -14
  131. data/platform/shared/sync/SyncSource.h +1 -0
  132. data/platform/shared/sync/SyncThread.cpp +29 -9
  133. data/platform/shared/sync/SyncThread.h +4 -2
  134. data/platform/wm/RhoLib/RhoLib.vcproj +8 -0
  135. data/platform/wm/build/build_inf.js +15 -9
  136. data/platform/wm/build/wm.rake +10 -5
  137. data/platform/wm/rhodes/Alert.cpp +10 -0
  138. data/platform/wm/rhodes/Alert.h +3 -3
  139. data/platform/wm/rhodes/MainWindow.cpp +171 -26
  140. data/platform/wm/rhodes/MainWindow.h +23 -1
  141. data/platform/wm/rhodes/MetaHandler.cpp +192 -0
  142. data/platform/wm/rhodes/MetaHandler.h +31 -0
  143. data/platform/wm/rhodes/RhoNativeViewManager.cpp +126 -0
  144. data/platform/wm/rhodes/RhoNativeViewManagerWM.h +20 -0
  145. data/platform/wm/rhodes/Rhodes.cpp +91 -2
  146. data/platform/wm/rhodes/Rhodes.rc +15 -6
  147. data/platform/wm/rhodes/SyncStatusDlg.cpp +32 -0
  148. data/platform/wm/rhodes/SyncStatusDlg.h +29 -0
  149. data/platform/wm/rhodes/resource.h +5 -2
  150. data/platform/wm/rhodes/rho/common/RhoThreadImpl.cpp +3 -1
  151. data/platform/wm/rhodes/rho/common/RhoThreadImpl.h +1 -1
  152. data/platform/wm/rhodes/rho/rubyext/SystemImpl.cpp +146 -14
  153. data/platform/wm/rhodes/rhodes.vcproj +28 -0
  154. data/rakefile.rb +119 -3
  155. data/res/build-tools/iphonesim/README +58 -0
  156. data/res/build-tools/iphonesim/Source/iPhoneSimulator.h +43 -0
  157. data/res/build-tools/iphonesim/Source/iPhoneSimulator.m +224 -0
  158. data/res/build-tools/iphonesim/Source/main.m +52 -0
  159. data/res/build-tools/iphonesim/Source/nsprintf.h +3 -0
  160. data/res/build-tools/iphonesim/Source/nsprintf.m +42 -0
  161. data/res/build-tools/iphonesim/build/Release/iphonesim +0 -0
  162. data/res/build-tools/iphonesim/iPhoneSimulatorRemoteClient/iPhoneSimulatorRemoteClient.h +124 -0
  163. data/res/build-tools/iphonesim/iphonesim.xcodeproj/project.pbxproj +261 -0
  164. data/res/build-tools/iphonesim/iphonesim_Prefix.pch +7 -0
  165. data/res/generators/rhogen.rb +5 -0
  166. data/res/generators/templates/application/app/layout.erb +7 -13
  167. data/res/generators/templates/application/app/loading.png +0 -0
  168. data/res/generators/templates/application/build.yml +3 -0
  169. data/res/generators/templates/application/icon/icon114.png +0 -0
  170. data/res/generators/templates/application/icon/icon57.png +0 -0
  171. data/res/generators/templates/application/icon/icon72.png +0 -0
  172. data/res/generators/templates/application/public/css/iphone.css +96 -0
  173. data/res/generators/templates/application/public/images/backButton.png +0 -0
  174. data/res/generators/templates/application/public/jqtouch/jqtouch.js +2 -1
  175. data/res/generators/templates/application/rhoconfig.txt +2 -0
  176. data/rhodes.gemspec +1 -1
  177. data/spec/phone_spec/app/spec/array_pack_spec.rb +108 -0
  178. data/spec/phone_spec/app/spec/bulksync_spec.rb +1 -0
  179. data/spec/phone_spec/app/spec/date_spec.rb +27 -0
  180. data/spec/phone_spec/app/spec/fixtures/classes.rb +91 -0
  181. data/spec/phone_spec/app/spec/lstrip_spec.rb +57 -0
  182. data/spec/phone_spec/app/spec/rho_spec.rb +50 -19
  183. data/spec/phone_spec/app/spec/rhom_object_spec.rb +78 -0
  184. data/spec/phone_spec/app/spec/rstrip_spec.rb +51 -0
  185. data/spec/phone_spec/app/spec/strip_spec.rb +50 -0
  186. data/spec/phone_spec/app/spec/syncengine_spec.rb +46 -3
  187. data/spec/phone_spec/app/spec_runner.rb +6 -0
  188. metadata +34 -4
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ ## 2.2.5
2
+ * support iPhone and iPad 4.2
3
+ * support Blackberry 6
4
+ * support Samsung Galaxy
5
+ * GPS stops by timeout on Android
6
+ * fixed several schema model issues
7
+ * NativeView on Android and Windows Mobile
8
+ * Tabbar badge for iPhone
9
+ * sms link fix for Blackberry
10
+
1
11
  ## 2.2.4
2
12
  * Launch external browser
3
13
  * Open any url (http, file etc), and run external application associated with it
data/Rakefile CHANGED
@@ -51,6 +51,94 @@ namespace "framework" do
51
51
  end
52
52
 
53
53
 
54
+ $application_build_configs_keys = ['security_token']
55
+
56
+ def make_application_build_config_header_file
57
+ inc_file = File.join($startdir, "platform", "shared", "common", "app_build_configs.c")
58
+ File.open(inc_file, "w") do |f|
59
+ f.puts "// WARNING! THIS FILE IS GENERATED AUTOMATICALLY! DO NOT EDIT IT MANUALLY!"
60
+ f.puts "// Generated #{Time.now.to_s}"
61
+ f.puts ""
62
+ f.puts "#include <string.h>"
63
+ f.puts ""
64
+ f.puts '#include "app_build_configs.h"'
65
+ f.puts ""
66
+
67
+ f.puts 'static const char* keys[] = { ""'
68
+ $application_build_configs.keys.each do |key|
69
+ f.puts ',"'+key+'"'
70
+ end
71
+ f.puts '};'
72
+ f.puts ''
73
+
74
+ count = 1
75
+
76
+ f.puts 'static const char* values[] = { ""'
77
+ $application_build_configs.keys.each do |key|
78
+ f.puts ',"'+$application_build_configs[key]+'"'
79
+ count = count + 1
80
+ end
81
+ f.puts '};'
82
+ f.puts ''
83
+
84
+ f.puts '#define APP_BUILD_CONFIG_COUNT '+count.to_s
85
+ f.puts ''
86
+ f.puts 'const char* get_app_build_config_item(const char* key) {'
87
+ f.puts ' int i;'
88
+ f.puts ' for (i = 1; i < APP_BUILD_CONFIG_COUNT; i++) {'
89
+ f.puts ' if (strcmp(key, keys[i]) == 0) {'
90
+ f.puts ' return values[i];'
91
+ f.puts ' }'
92
+ f.puts ' }'
93
+ f.puts ' return 0;'
94
+ f.puts '}'
95
+ f.puts ''
96
+
97
+ end
98
+ end
99
+
100
+ def make_application_build_config_java_file
101
+ file_name = $startdir + "/platform/bb/RubyVM/src/com/rho/AppBuildConfig.java"
102
+
103
+ File.open(file_name, "w") do |f|
104
+ f.puts "// WARNING! THIS FILE IS GENERATED AUTOMATICALLY! DO NOT EDIT IT MANUALLY!"
105
+ f.puts "// Generated #{Time.now.to_s}"
106
+
107
+ f.puts "package com.rho;"
108
+ f.puts ""
109
+ f.puts "public class AppBuildConfig {"
110
+
111
+ f.puts 'static final String keys[] = { ""'
112
+ $application_build_configs.keys.each do |key|
113
+ f.puts ',"'+key+'"'
114
+ end
115
+ f.puts '};'
116
+ f.puts ''
117
+
118
+ count = 1
119
+
120
+ f.puts 'static final String values[] = { ""'
121
+ $application_build_configs.keys.each do |key|
122
+ f.puts ',"'+$application_build_configs[key]+'"'
123
+ count = count + 1
124
+ end
125
+ f.puts '};'
126
+ f.puts ''
127
+
128
+ f.puts 'static final int APP_BUILD_CONFIG_COUNT = '+count.to_s + ';'
129
+ f.puts ''
130
+ f.puts 'public static String getItem(String key){'
131
+ f.puts ' for (int i = 1; i < APP_BUILD_CONFIG_COUNT; i++) {'
132
+ f.puts ' if ( key.compareTo( keys[i]) == 0) {'
133
+ f.puts ' return values[i];'
134
+ f.puts ' }'
135
+ f.puts ' }'
136
+ f.puts ' return null;'
137
+ f.puts '}'
138
+ f.puts "}"
139
+ end
140
+ end
141
+
54
142
  namespace "config" do
55
143
  task :common do
56
144
  $startdir = File.dirname(__FILE__)
@@ -106,6 +194,32 @@ namespace "config" do
106
194
  extensions += $app_config[$config["platform"]]["extensions"] if $app_config[$config["platform"]] and
107
195
  $app_config[$config["platform"]]["extensions"] and $app_config[$config["platform"]]["extensions"].is_a? Array
108
196
  $app_config["extensions"] = extensions
197
+
198
+ $hidden_app = $app_config["hidden_app"].nil?() ? "0" : $app_config["hidden_app"]
199
+
200
+
201
+ #application build configs
202
+ application_build_configs = {}
203
+
204
+ $application_build_configs_keys.each do |key|
205
+ value = $app_config[key]
206
+ if $app_config[$config["platform"]] != nil
207
+ if $app_config[$config["platform"]][key] != nil
208
+ value = $app_config[$config["platform"]][key]
209
+ end
210
+ end
211
+ if value != nil
212
+ application_build_configs[key] = value
213
+ end
214
+ end
215
+ $application_build_configs = application_build_configs
216
+
217
+ if $current_platform == "bb"
218
+ make_application_build_config_java_file
219
+ else
220
+ make_application_build_config_header_file
221
+ end
222
+
109
223
  end
110
224
 
111
225
  out = `javac -version 2>&1`
@@ -311,7 +425,7 @@ def common_bundle_start(startdir, dest)
311
425
  clear_linker_settings
312
426
 
313
427
  init_extensions(startdir, dest)
314
-
428
+
315
429
  chdir startdir
316
430
  #throw "ME"
317
431
  cp_r app + '/app',File.join($srcdir,'apps'), :preserve => true
@@ -419,6 +533,7 @@ namespace "build" do
419
533
  task :xruby do
420
534
  #needs $config, $srcdir, $excludelib, $bindir
421
535
  app = $app_path
536
+ jpath = $config["env"]["paths"]["java"]
422
537
  startdir = pwd
423
538
  dest = $srcdir
424
539
  xruby = File.dirname(__FILE__) + '/res/build-tools/xruby-0.3.3.jar'
@@ -482,8 +597,9 @@ namespace "build" do
482
597
  rm_rf $tmpdir
483
598
  mkdir_p $tmpdir
484
599
  chdir $srcdir
485
- =end
486
- puts `jar uf ../RhoBundle.jar apps/#{$all_files_mask}`
600
+ =end
601
+
602
+ puts `"#{File.join(jpath,'jar')}" uf ../RhoBundle.jar apps/#{$all_files_mask}`
487
603
  unless $? == 0
488
604
  puts "Error creating Rhobundle.jar"
489
605
  exit 1
data/lib/build/jake.rb CHANGED
@@ -361,7 +361,21 @@ class Jake
361
361
  f.write "MIDlet-1: " + title + "," + icon + ",\n"
362
362
  puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! service_enabled: #{$service_enabled}"
363
363
  $stdout.flush
364
- f.write "RIM-MIDlet-Flags-1: 1\n" if $service_enabled
364
+
365
+ if $service_enabled
366
+ if $hidden_app == "0"
367
+ f.write "RIM-MIDlet-Flags-1: 1\n"
368
+ else
369
+ f.write "RIM-MIDlet-Flags-1: 3\n"
370
+ end
371
+ else
372
+ if $hidden_app == "0"
373
+ f.write "RIM-MIDlet-Flags-1: 0\n"
374
+ else
375
+ f.write "RIM-MIDlet-Flags-1: 2\n"
376
+ end
377
+ end
378
+
365
379
  end
366
380
 
367
381
  f.close
@@ -24,9 +24,14 @@ class Time
24
24
 
25
25
  strRes += __makeTwoDigit(mon()) + '/' + __makeTwoDigit(mday()) + '/' + year().to_s + ', ' + __makeTwoDigit(nHour) + ':' + __makeTwoDigit(min()) + strPM;
26
26
  return strRes
27
+ elsif fmt == "%Y%m%dT%H%M%S.000 GMT"
28
+ strRes = year().to_s() + __makeTwoDigit(mon()) + __makeTwoDigit(mday()) + "T" + __makeTwoDigit(hour()) + __makeTwoDigit(min()) + __makeTwoDigit(sec()) +
29
+ ".000 GMT"
30
+
31
+ return strRes
27
32
  end
28
33
 
29
- DateTime.new(self.localtime).strftime(fmt)
34
+ DateTime.new(self).strftime(fmt)
30
35
  end
31
36
 
32
37
  end
@@ -61,6 +61,16 @@ module Rho
61
61
  binding
62
62
  end
63
63
 
64
+ @@cached_metadata = {}
65
+ def self.cached_metadata
66
+ @@cached_metadata
67
+ end
68
+
69
+ def self.clean_cached_metadata
70
+ @@cached_metadata.clear()
71
+ puts "meta deleted"
72
+ end
73
+
64
74
  def render(options = nil)
65
75
  if @params['rho_callback']
66
76
  rho_error( "render call in callback. Call WebView.navigate instead" )
@@ -71,7 +81,6 @@ module Rho
71
81
  options = options.symbolize_keys
72
82
 
73
83
  metaenabled = false
74
- clean_metadata = false
75
84
 
76
85
  action = nil
77
86
  action = options[:action] if options[:action]
@@ -79,14 +88,10 @@ module Rho
79
88
 
80
89
  if $".include?( "rhodes_translator") and @request['model'] != nil
81
90
  model = nil
82
- begin
83
- model = Object.const_get(@request['model'].to_sym)
84
- rescue
85
- end
86
- if model.respond_to?( :metadata ) and model.metadata != nil
87
- clean_metadata = true
88
- metaenabled = model.metadata[action.to_s] != nil
89
- end
91
+ model = Object.const_get(@request['model'].to_sym) if Object.const_defined?(@request['model'].to_sym)
92
+ if model && model.respond_to?( :metadata ) and model.metadata != nil
93
+ metaenabled = model.metadata[action.to_s] != nil
94
+ end
90
95
  end
91
96
 
92
97
  if not options[:string].nil?
@@ -133,17 +138,15 @@ module Rho
133
138
  RhoController.start_geoview_notification()
134
139
  @back_action = options[:back] if options[:back]
135
140
  @rendered = true
136
- model.clean_cached_metadata() if clean_metadata
137
141
  @content
138
142
  end
139
143
 
140
144
  def render_metadata(action = nil,metadata = nil)
141
145
  if metadata.nil?
142
- begin
143
- model = Object.const_get(@request['model'].to_sym)
144
- rescue
145
- end
146
- if model.respond_to?( :metadata ) and model.metadata != nil
146
+ model = nil
147
+ model = Object.const_get(@request['model'].to_sym) if Object.const_defined?(@request['model'].to_sym)
148
+
149
+ if model && model.respond_to?( :metadata ) and model.metadata != nil
147
150
  metadata = model.metadata
148
151
  end
149
152
  end
@@ -119,7 +119,8 @@ module Rho
119
119
 
120
120
  #puts "model name: #{modelName}"
121
121
 
122
- modelClass = Object.const_get(modelName)
122
+ modelClass = nil
123
+ modelClass = Object.const_get(modelName) if Object.const_defined?(modelName)
123
124
  if modelClass
124
125
  if modelClass.respond_to?( :get_model_params )
125
126
  Rho::RhoConfig::add_source(modelName,modelClass.get_model_params())
@@ -197,9 +198,26 @@ module Rho
197
198
  arSrcs = db.select_from_table('sources','source_id, name, sync_priority, partition, sync_type, schema, schema_version, associations, blob_attribs',
198
199
  {'partition'=>str_partition} )
199
200
  arSrcs.each do |src|
200
- src['schema'] = '<empty_schema>' if src && !src['schema'] && db.table_exist?(src['name'])
201
201
 
202
+ if src && src['schema'] && src['schema'].length() > 0
203
+
204
+ #puts "src['schema'] : #{src['schema']}"
205
+ hashSchema = Rho::JSON.parse(src['schema'])
206
+ #puts "hashSchema : #{hashSchema}"
207
+
208
+ src['schema'] = {}
209
+ src['schema']['sql'] = ::Rho::RHO.make_createsql_script( src['name'], hashSchema)
210
+ src['schema_version'] = hashSchema['version']
211
+
212
+ db.update_into_table('sources', {"schema"=>src['schema']['sql'], "schema_version"=>src['schema_version']},{"name"=>src['name']})
213
+
214
+ if str_partition != 'user'
215
+ @db_partitions['user'].update_into_table('sources', {"schema"=>src['schema']['sql'], "schema_version"=>src['schema_version']},{"name"=>src['name']})
216
+ end
217
+ end
218
+
202
219
  Rho::RhoConfig::sources()[ src['name'] ] = src
220
+
203
221
  end
204
222
 
205
223
  puts "sources after: #{Rho::RhoConfig::sources()}"
@@ -268,7 +286,9 @@ module Rho
268
286
  init_db_sources(db, uniq_sources, partition,hash_migrate)
269
287
  db.commit
270
288
  rescue Exception => e
271
- puts "exception when init_db_sources: #{e}"
289
+ trace_msg = e.backtrace.join("\n")
290
+ puts "exception when init_db_sources: #{e}; Trace:" + trace_msg
291
+
272
292
  db.rollback
273
293
  end
274
294
 
@@ -276,6 +296,13 @@ module Rho
276
296
  end
277
297
 
278
298
  ::Rho::RHO.init_schema_sources(hash_migrate)
299
+
300
+ Rho::RhoConfig::sources.values.each do|src|
301
+ ['pass_through'].each do |prop|
302
+ next unless src.has_key?(prop)
303
+ SyncEngine.set_source_property(src['source_id'], prop, src[prop] ? src[prop].to_s() : '' )
304
+ end
305
+ end
279
306
  end
280
307
 
281
308
  def self.processIndexes(index_param, src_name, is_unique)
@@ -317,6 +344,7 @@ module Rho
317
344
  db = get_src_db(source['name'])
318
345
 
319
346
  next unless source['schema']
347
+ raise ArgumentError, "schema parameter should be Hash!" unless source['schema'].is_a?(Hash)
320
348
 
321
349
  call_migrate = false
322
350
  if db.table_exist?(source['name'])
@@ -324,25 +352,7 @@ module Rho
324
352
  call_migrate = true
325
353
  end
326
354
 
327
- strCreate = source['schema']['sql']
328
- if source['schema']['property']
329
- arCols = source['schema']['property']
330
- arCols = arCols
331
- strCols = ""
332
- arCols.each do |col, type|
333
- strCols += ',' if strCols.length() > 0
334
- strCols += "\"#{col}\" varchar default NULL"
335
- #TODO: support column type
336
- end
337
-
338
- strCols += ",\"object\" varchar(255) PRIMARY KEY"
339
- strCreate = "CREATE TABLE #{source['name']} ( #{strCols} )"
340
- end
341
-
342
- strCreate += ";\r\n" if strCreate && strCreate.length() > 0
343
- strCreate += processIndexes(source['schema']['index'], source['name'], false)
344
- strCreate += ";\r\n" if strCreate && strCreate.length() > 0
345
- strCreate += processIndexes(source['schema']['unique_index'], source['name'], true)
355
+ strCreate = make_createsql_script(source['name'], source['schema'])
346
356
 
347
357
  if call_migrate
348
358
  db.update_into_table('sources', {"schema"=>strCreate},{"name"=>source['name']})
@@ -356,6 +366,32 @@ module Rho
356
366
  end
357
367
  end
358
368
 
369
+ def self.make_createsql_script(name,schema_attr)
370
+ strCreate = schema_attr['sql']
371
+ strCreate = "" unless strCreate
372
+ if schema_attr['property']
373
+ arCols = schema_attr['property']
374
+ arCols = arCols
375
+ strCols = ""
376
+ arCols.each do |col, type|
377
+ strCols += ',' if strCols.length() > 0
378
+ strCols += "\"#{col}\" varchar default NULL"
379
+ #TODO: support column type
380
+ end
381
+
382
+ strCols += ',' if strCols.length() > 0
383
+ strCols += "\"object\" varchar(255) PRIMARY KEY"
384
+ strCreate = "CREATE TABLE \"#{name}\" ( #{strCols} )"
385
+ end
386
+
387
+ strCreate += ";\r\n" if strCreate && strCreate.length() > 0
388
+ strCreate += processIndexes(schema_attr['index'], name, false)
389
+ strCreate += ";\r\n" if strCreate && strCreate.length() > 0
390
+ strCreate += processIndexes(schema_attr['unique_index'], name, true)
391
+
392
+ strCreate
393
+ end
394
+
359
395
  def process_blob_attribs(source, db)
360
396
  return source['str_blob_attribs'] if source['str_blob_attribs']
361
397
  source['str_blob_attribs'] = ""
@@ -386,16 +422,35 @@ module Rho
386
422
  source['str_blob_attribs']
387
423
 
388
424
  end
425
+
426
+ def get_start_id(db_sources)
427
+ start_id = 0
428
+ db_sources.each do |db_src|
429
+ src_id = db_src['source_id']
430
+ start_id = src_id if src_id > start_id
431
+ end
432
+
433
+ start_id = Rho::RhoConfig.max_config_srcid()+2 if start_id < Rho::RhoConfig.max_config_srcid
434
+ puts "start_id: #{start_id}"
435
+ start_id
436
+ end
389
437
 
390
- def init_db_sources(db, uniq_sources, db_partition, hash_migrate)
438
+ def find_src_byname(db_sources, name)
439
+ db_sources.each do |db_src|
440
+ return db_src if db_src['name'] == name
441
+ end
442
+
443
+ nil
444
+ end
391
445
 
392
- result = db.execute_sql("SELECT MAX(source_id) AS maxid FROM sources")
393
- #puts 'result: ' + result.inspect
394
- start_id = result.length > 0 && result[0]['maxid'] ? result[0]['maxid']+2 : 1
395
- start_id = Rho::RhoConfig.max_config_srcid()+2 if start_id < Rho::RhoConfig.max_config_srcid
446
+ def init_db_sources(db, uniq_sources, db_partition, hash_migrate)
447
+ puts "init_db_sources"
448
+
449
+ db_sources = db.select_from_table('sources','sync_priority,source_id,partition, sync_type, schema_version, associations, blob_attribs, name' )
450
+ start_id = get_start_id(db_sources)
396
451
 
397
452
  uniq_sources.each do |source|
398
- puts "init_db_sources(#{source['name']}) : #{source}"
453
+ #puts "init_db_sources(#{source['name']}) : #{source}"
399
454
  name = source['name']
400
455
  sync_priority = source['sync_priority']
401
456
  partition = source['partition']
@@ -404,34 +459,36 @@ module Rho
404
459
  associations = source['str_associations']
405
460
  blob_attribs = process_blob_attribs(source, db)
406
461
 
407
- attribs = db.select_from_table('sources','sync_priority,source_id,partition, sync_type, schema_version, associations, blob_attribs', {'name'=>name})
408
- if attribs && attribs.size > 0
409
- if attribs[0]['sync_priority'].to_i != sync_priority.to_i
462
+ #attribs = db.select_from_table('sources','sync_priority,source_id,partition, sync_type, schema_version, associations, blob_attribs', {'name'=>name})
463
+ attribs = find_src_byname(db_sources,name)
464
+
465
+ if attribs
466
+ if attribs['sync_priority'].to_i != sync_priority.to_i
410
467
  db.update_into_table('sources', {"sync_priority"=>sync_priority},{"name"=>name})
411
468
  end
412
- if attribs[0]['sync_type'] != sync_type
469
+ if attribs['sync_type'] != sync_type
413
470
  db.update_into_table('sources', {"sync_type"=>sync_type},{"name"=>name})
414
471
  end
415
- if attribs[0]['schema_version'] != schema_version
472
+ if attribs['schema_version'] != schema_version
416
473
  if db_partition == partition
417
- hash_migrate[name] = attribs[0]['schema_version']
474
+ hash_migrate[name] = attribs['schema_version']
418
475
  else
419
476
  db.update_into_table('sources', {"schema_version"=>schema_version},{"name"=>name})
420
477
  end
421
478
  end
422
- if attribs[0]['partition'] != partition
479
+ if attribs['partition'] != partition
423
480
  db.update_into_table('sources', {"partition"=>partition},{"name"=>name})
424
481
  end
425
- if attribs[0]['associations'] != associations
482
+ if attribs['associations'] != associations
426
483
  db.update_into_table('sources', {"associations"=>associations},{"name"=>name})
427
484
  end
428
- if attribs[0]['blob_attribs'] != blob_attribs
485
+ if attribs['blob_attribs'] != blob_attribs
429
486
  db.update_into_table('sources', {"blob_attribs"=>blob_attribs},{"name"=>name})
430
487
  end
431
488
 
432
489
  if !source['source_id']
433
- source['source_id'] = attribs[0]['source_id'].to_i
434
- Rho::RhoConfig::sources[name]['source_id'] = attribs[0]['source_id'].to_i
490
+ source['source_id'] = attribs['source_id'].to_i
491
+ Rho::RhoConfig::sources[name]['source_id'] = attribs['source_id'].to_i
435
492
  end
436
493
 
437
494
  else
@@ -455,9 +512,11 @@ module Rho
455
512
 
456
513
  def serve(req)
457
514
  begin
458
- puts 'inside RHO.serve...'
515
+ puts "RHO serve: " + (req ? "#{req['request-uri']}" : '')
459
516
  res = init_response
460
517
  get_app(req['application']).send :serve, req, res
518
+
519
+ Rho::RhoController.clean_cached_metadata()
461
520
  return send_response(res)
462
521
  rescue Exception => e
463
522
  return send_error(e)
@@ -466,9 +525,10 @@ module Rho
466
525
 
467
526
  def serve_hash(req)
468
527
  begin
469
- puts 'inside RHO.serve...'
528
+ puts "RHO serve: " + (req ? "#{req['request-uri']}" : '')
470
529
  res = init_response
471
530
  get_app(req['application']).send :serve, req, res
531
+ Rho::RhoController.clean_cached_metadata()
472
532
  return send_response_hash(res)
473
533
  rescue Exception => e
474
534
  return send_error(e,500,true)
@@ -479,9 +539,10 @@ module Rho
479
539
  # TODO: Removed hardcoded appname
480
540
  get_app(APPNAME).set_menu
481
541
  begin
482
- puts 'inside RHO.serve_index: ' + index_name
542
+ puts "RHO serve_index: " + (req ? "#{req['request-uri']}" : '')
483
543
  res = init_response
484
544
  res['request-body'] = RhoController::renderfile(index_name, req, res)
545
+ Rho::RhoController.clean_cached_metadata()
485
546
  return send_response(res)
486
547
  rescue Exception => e
487
548
  return send_error(e)
@@ -492,9 +553,10 @@ module Rho
492
553
  # TODO: Removed hardcoded appname
493
554
  get_app(APPNAME).set_menu
494
555
  begin
495
- puts 'inside RHO.serve_index: ' + index_name
556
+ puts "RHO serve_index: " + (req ? "#{req['request-uri']}" : '')
496
557
  res = init_response
497
558
  res['request-body'] = RhoController::renderfile(index_name, req, res)
559
+ Rho::RhoController.clean_cached_metadata()
498
560
  return send_response_hash(res)
499
561
  rescue Exception => e
500
562
  return send_error(e, 500, true)
@@ -70,7 +70,7 @@ module Rho
70
70
  @default_menu = {} if @default_menu.nil?
71
71
  disp_menu = menu ? menu.dup : @default_menu.dup
72
72
  disp_menu['Back'] = back_action if back_action
73
- puts "RhoApplication: Using menu - #{disp_menu.inspect}"
73
+ #puts "RhoApplication: Using menu - #{disp_menu.inspect}"
74
74
  WebView.set_menu_items(disp_menu)
75
75
  end
76
76
 
@@ -3,24 +3,40 @@ require 'bsearch'
3
3
  module Rho
4
4
  class RhoContact
5
5
  class << self
6
- def find(param)
7
- pb = Phonebook::openPhonebook
6
+ def open_phonebook()
7
+ return Phonebook::openPhonebook
8
+ end
9
+ def close_phonebook(phonebook)
10
+ Phonebook::closePhonebook(phonebook)
11
+ end
12
+ def find(param, properties_list = nil, phonebook = nil)
13
+ pb = phonebook
14
+ if phonebook == nil
15
+ pb = Phonebook::openPhonebook
16
+ end
8
17
  if pb.nil?
9
18
  puts "Can't open phonebook"
10
19
  return nil
11
20
  elsif param == :all or param == 'all'
12
21
  records = Phonebook::getallPhonebookRecords(pb)
13
- Phonebook::closePhonebook(pb)
22
+ if phonebook == nil
23
+ Phonebook::closePhonebook(pb)
24
+ end
14
25
  return records
15
26
  else
16
27
  record = Phonebook::getPhonebookRecord(pb,param)
17
- Phonebook::closePhonebook(pb)
28
+ if phonebook == nil
29
+ Phonebook::closePhonebook(pb)
30
+ end
18
31
  return record
19
32
  end
20
33
  end
21
34
 
22
- def create!(properties)
23
- pb = Phonebook::openPhonebook
35
+ def create!(properties, phonebook = nil)
36
+ pb = phonebook
37
+ if phonebook == nil
38
+ pb = Phonebook::openPhonebook
39
+ end
24
40
  unless pb.nil?
25
41
  record = Phonebook::createRecord(pb)
26
42
  if record.nil?
@@ -31,12 +47,17 @@ module Rho
31
47
  end
32
48
  Phonebook::addRecord(pb,record)
33
49
  end
34
- Phonebook::closePhonebook(pb)
50
+ if phonebook == nil
51
+ Phonebook::closePhonebook(pb)
52
+ end
35
53
  end
36
54
  end
37
55
 
38
- def destroy(recordId)
39
- pb = Phonebook::openPhonebook
56
+ def destroy(recordId, phonebook = nil)
57
+ pb = phonebook
58
+ if phonebook == nil
59
+ pb = Phonebook::openPhonebook
60
+ end
40
61
  unless pb.nil?
41
62
  record = Phonebook::openPhonebookRecord(pb,recordId)
42
63
  if record.nil?
@@ -44,12 +65,17 @@ module Rho
44
65
  else
45
66
  Phonebook::deleteRecord(pb,record)
46
67
  end
47
- Phonebook::closePhonebook(pb)
68
+ if phonebook == nil
69
+ Phonebook::closePhonebook(pb)
70
+ end
48
71
  end
49
72
  end
50
73
 
51
- def update_attributes(properties)
52
- pb = Phonebook::openPhonebook
74
+ def update_attributes(properties, phonebook = nil)
75
+ pb = phonebook
76
+ if phonebook == nil
77
+ pb = Phonebook::openPhonebook
78
+ end
53
79
  unless pb.nil?
54
80
  record = Phonebook::openPhonebookRecord(pb,properties['id'])
55
81
  if record.nil?
@@ -60,7 +86,9 @@ module Rho
60
86
  end
61
87
  Phonebook::saveRecord(pb,record)
62
88
  end
63
- Phonebook::closePhonebook(pb)
89
+ if phonebook == nil
90
+ Phonebook::closePhonebook(pb)
91
+ end
64
92
  end
65
93
  end
66
94
 
@@ -7,7 +7,7 @@ module Rho
7
7
  attr_accessor :menu
8
8
 
9
9
  @@rholog = RhoLog.new
10
-
10
+ @@before = nil
11
11
  def rho_info(str)
12
12
  @@rholog.info("RHO " + self.class.to_s, str)
13
13
  end
@@ -42,6 +42,11 @@ module Rho
42
42
  end
43
43
  end
44
44
 
45
+ def self.before(&block)
46
+ @@before = {} unless @@before
47
+ @@before[self.to_s] = block if block_given?
48
+ end
49
+
45
50
  def serve(application,object_mapping,req,res)
46
51
  @request, @response = req, res
47
52
  @object_mapping = object_mapping
@@ -51,6 +56,10 @@ module Rho
51
56
 
52
57
  RhoController.process_rho_object(@params)
53
58
 
59
+ if @@before and @@before[self.class.to_s] and not @params['rho_callback']
60
+ @@before[self.class.to_s].call(@params,@request)
61
+ end
62
+
54
63
  act = req['action'].nil? ? default_action : req['action']
55
64
  if self.respond_to?(act)
56
65
  res = send req['action'].nil? ? default_action : req['action']