rhodes 2.2.4.beta.1 → 2.2.5.beta.1

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