rhodes 2.0.0 → 2.0.2

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 (39) hide show
  1. data/CHANGELOG +6 -0
  2. data/Manifest.txt +3 -1
  3. data/bin/rhodes-setup +1 -32
  4. data/lib/framework/erb.rb +3 -3
  5. data/lib/framework/rhodes.rb +2 -2
  6. data/lib/framework/version.rb +2 -2
  7. data/lib/rhodes.rb +2 -2
  8. data/platform/android/Rhodes/AndroidManifest.xml +3 -2
  9. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_Rhodes.h +2 -2
  10. data/platform/android/Rhodes/jni/src/rhodes.cpp +7 -5
  11. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Capabilities.java +2 -0
  12. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +15 -6
  13. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +5 -2
  14. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Contact.java +8 -2
  15. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessor.java +11 -0
  16. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorNew.java +310 -0
  17. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorOld.java +275 -0
  18. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Phonebook.java +125 -322
  19. data/platform/android/build/RhodesSRC_build.files +23 -21
  20. data/platform/android/build/android.rake +40 -17
  21. data/platform/iphone/Info.plist +1 -1
  22. data/platform/iphone/rbuild/iphone.rake +58 -33
  23. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +1 -1
  24. data/platform/shared/common/RhoPort.h +18 -3
  25. data/platform/shared/common/RhodesApp.cpp +76 -54
  26. data/platform/shared/common/StringConverter.h +3 -2
  27. data/platform/shared/common/stat.h +29 -4
  28. data/platform/shared/db/DBAdapter.cpp +2 -1
  29. data/platform/shared/db/DBAdapter.h +1 -1
  30. data/platform/shared/json/RJSONTokener.c +1 -1
  31. data/platform/shared/json/json_object.c +2 -2
  32. data/platform/shared/json/json_tokener.c +1 -1
  33. data/rhodes.gemspec +1 -1
  34. data/spec/phone_spec/app/Spec/contacts_spec.rb +10 -3
  35. data/spec/phone_spec/app/Spec/controller.rb +3 -3
  36. data/spec/phone_spec/app/Spec/mapview_spec.rb +3 -1
  37. data/spec/phone_spec/build.yml +2 -1
  38. metadata +6 -4
  39. data/rhobuild.yml +0 -39
@@ -1,40 +1,44 @@
1
- platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java
2
1
  platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java
2
+ platform/android/Rhodes/src/com/rhomobile/rhodes/HttpLog.java
3
+ platform/android/Rhodes/src/com/rhomobile/rhodes/Logger.java
4
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NativeBar.java
5
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NavBar.java
6
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkConnectivityListener.java
7
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkStateTracker.java
8
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhoConf.java
9
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhoLogConf.java
10
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhoMenu.java
11
+ platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java
12
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesInstance.java
13
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RingtoneManager.java
14
+ platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java
15
+ platform/android/Rhodes/src/com/rhomobile/rhodes/Utils.java
16
+ platform/android/Rhodes/src/com/rhomobile/rhodes/WebView.java
17
+ platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java
3
18
  platform/android/Rhodes/src/com/rhomobile/rhodes/camera/Camera.java
4
19
  platform/android/Rhodes/src/com/rhomobile/rhodes/camera/FileList.java
5
- platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCaptureCallback.java
6
20
  platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java
7
- platform/android/Rhodes/src/com/rhomobile/rhodes/Capabilities.java
21
+ platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCaptureCallback.java
8
22
  platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePicker.java
9
23
  platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePickerScreen.java
10
- platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocationImpl.java
11
24
  platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocation.java
12
- platform/android/Rhodes/src/com/rhomobile/rhodes/HttpLog.java
13
- platform/android/Rhodes/src/com/rhomobile/rhodes/Logger.java
25
+ platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocationImpl.java
14
26
  platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/MainView.java
15
27
  platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java
16
28
  platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java
17
29
  platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/Annotation.java
18
30
  platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/AnnotationsOverlay.java
19
31
  platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/MapView.java
20
- platform/android/Rhodes/src/com/rhomobile/rhodes/NativeBar.java
21
- platform/android/Rhodes/src/com/rhomobile/rhodes/NavBar.java
22
- platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkConnectivityListener.java
23
- platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkStateTracker.java
24
- platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactField.java
25
32
  platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Contact.java
33
+ platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessor.java
34
+ platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorNew.java
35
+ platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorOld.java
36
+ platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactField.java
26
37
  platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Phonebook.java
27
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhoConf.java
28
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesInstance.java
29
- platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java
30
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhoLogConf.java
31
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhoMenu.java
32
- platform/android/Rhodes/src/com/rhomobile/rhodes/RingtoneManager.java
33
38
  platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSockAddr.java
34
- platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSocketImpl.java
35
39
  platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSocket.java
40
+ platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSocketImpl.java
36
41
  platform/android/Rhodes/src/com/rhomobile/rhodes/socket/SSLImpl.java
37
- platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java
38
42
  platform/android/Rhodes/src/com/rhomobile/rhodes/ui/AboutDialog.java
39
43
  platform/android/Rhodes/src/com/rhomobile/rhodes/ui/LogOptionsDialog.java
40
44
  platform/android/Rhodes/src/com/rhomobile/rhodes/ui/LogViewDialog.java
@@ -43,5 +47,3 @@ platform/android/Rhodes/src/com/rhomobile/rhodes/uri/SmsUriHandler.java
43
47
  platform/android/Rhodes/src/com/rhomobile/rhodes/uri/TelUriHandler.java
44
48
  platform/android/Rhodes/src/com/rhomobile/rhodes/uri/UriHandler.java
45
49
  platform/android/Rhodes/src/com/rhomobile/rhodes/uri/VideoUriHandler.java
46
- platform/android/Rhodes/src/com/rhomobile/rhodes/Utils.java
47
- platform/android/Rhodes/src/com/rhomobile/rhodes/WebView.java
@@ -27,11 +27,13 @@ end
27
27
  ANDROID_API_LEVEL = 3
28
28
 
29
29
  ANDROID_PERMISSIONS = {
30
+ 'audio' => ['RECORD_AUDIO', 'MODIFY_AUDIO_SETTINGS'],
30
31
  'camera' => 'CAMERA',
31
32
  'gps' => 'ACCESS_FINE_LOCATION',
32
33
  'network_state' => 'ACCESS_NETWORK_STATE',
33
34
  'phone' => ['CALL_PHONE', 'READ_PHONE_STATE'],
34
- 'pim' => ['READ_CONTACTS', 'WRITE_CONTACTS'],
35
+ 'pim' => ['READ_CONTACTS', 'WRITE_CONTACTS', 'GET_ACCOUNTS'],
36
+ 'record_audio' => 'RECORD_AUDIO',
35
37
  'vibrate' => 'VIBRATE'
36
38
  }
37
39
 
@@ -77,7 +79,7 @@ def set_app_name_android(newname)
77
79
  end
78
80
  doc.elements.delete "manifest/application/uses-library[@android:name='com.google.android.maps']" unless $use_geomapping
79
81
 
80
- caps = ['INTERNET']
82
+ caps = ['INTERNET', 'PERSISTENT_ACTIVITY']
81
83
  $app_config["capabilities"].each do |cap|
82
84
  cap = ANDROID_PERMISSIONS[cap]
83
85
  next if cap.nil?
@@ -89,7 +91,7 @@ def set_app_name_android(newname)
89
91
 
90
92
  manifest = doc.elements["manifest"]
91
93
  manifest.elements.each('uses-permission') { |e| manifest.delete e }
92
- caps.each do |cap|
94
+ caps.sort.each do |cap|
93
95
  element = REXML::Element.new('uses-permission')
94
96
  element.add_attribute('android:name', "android.permission.#{cap}")
95
97
  manifest.add element
@@ -125,8 +127,6 @@ namespace "config" do
125
127
 
126
128
  $emuversion = $app_config["android"]["version"] unless $app_config["android"].nil?
127
129
  $emuversion = $config["android"]["version"] if $emuversion.nil? and !$config["android"].nil?
128
- $emuversion = get_market_version(ANDROID_API_LEVEL) if $emuversion.nil?
129
- $emuversion = $emuversion.to_s unless $emuversion.nil?
130
130
 
131
131
  # Here is switch between release/debug configuration used for
132
132
  # building native libraries
@@ -176,6 +176,7 @@ namespace "config" do
176
176
  $app_android_r = File.join $tmpdir, "AndroidR.java"
177
177
  $app_rjava_dir = File.join $tmpdir
178
178
  $app_native_libs_java = File.join $tmpdir, "NativeLibraries.java"
179
+ $app_capabilities_java = File.join $tmpdir, "Capabilities.java"
179
180
 
180
181
  if RUBY_PLATFORM =~ /(win|w)32$/
181
182
  $emulator = #"cmd /c " +
@@ -206,10 +207,11 @@ namespace "config" do
206
207
  end
207
208
 
208
209
  puts "+++ Looking for platform..." if USE_TRACES
210
+ napilevel = ANDROID_API_LEVEL
209
211
  Dir.glob(File.join($androidsdkpath, "platforms", "*")).each do |platform|
210
212
  props = File.join(platform, "source.properties")
211
213
  unless File.file? props
212
- puts "+++ WARNING! No source.properties found in #{platform}" if USE_TRACES
214
+ puts "+++ WARNING! No source.properties found in #{platform}"
213
215
  next
214
216
  end
215
217
 
@@ -224,7 +226,11 @@ namespace "config" do
224
226
 
225
227
  puts "+++ API LEVEL of #{platform}: #{apilevel}" if USE_TRACES
226
228
 
227
- $androidplatform = File.basename(platform) if apilevel == ANDROID_API_LEVEL
229
+ if apilevel > napilevel
230
+ napilevel = apilevel
231
+ $androidplatform = File.basename(platform)
232
+ $found_api_level = apilevel
233
+ end
228
234
  end
229
235
 
230
236
  if $androidplatform.nil?
@@ -233,7 +239,7 @@ namespace "config" do
233
239
  end
234
240
 
235
241
  if $androidplatform.nil?
236
- puts "+++ No required platform (API level #{ANDROID_API_LEVEL}) found, can't proceed"
242
+ puts "+++ No required platform (API level >= #{ANDROID_API_LEVEL}) found, can't proceed"
237
243
  exit 1
238
244
  else
239
245
  puts "+++ Platform found: #{$androidplatform}" if USE_TRACES
@@ -282,19 +288,15 @@ namespace "config" do
282
288
  end
283
289
  end
284
290
 
285
- $avdname = "rhoAndroid" + $emuversion.gsub(/[^0-9]/, "")
286
- $avdname += "ext" if $use_geomapping
287
- $avdtarget = $androidtargets[get_api_level($emuversion)]
288
-
289
291
  # Detect Google API add-on path
290
292
  if $use_geomapping
291
293
  puts "+++ Looking for Google APIs add-on..." if USE_TRACES
294
+ napilevel = ANDROID_API_LEVEL
292
295
  Dir.glob(File.join($androidsdkpath, 'add-ons', '*')).each do |dir|
293
- break unless $gapijar.nil?
294
296
 
295
297
  props = File.join(dir, 'manifest.ini')
296
298
  if !File.file? props
297
- puts "+++ WARNING: no manifest.ini found in #{dir}" if USE_TRACES
299
+ puts "+++ WARNING: no manifest.ini found in #{dir}"
298
300
  next
299
301
  end
300
302
 
@@ -309,7 +311,11 @@ namespace "config" do
309
311
 
310
312
  puts "+++ API LEVEL of #{dir}: #{apilevel}" if USE_TRACES
311
313
 
312
- $gapijar = File.join(dir, 'libs', 'maps.jar') if apilevel == ANDROID_API_LEVEL
314
+ if apilevel > napilevel
315
+ napilevel = apilevel
316
+ $gapijar = File.join(dir, 'libs', 'maps.jar')
317
+ $found_api_level = apilevel
318
+ end
313
319
  end
314
320
  if $gapijar.nil?
315
321
  puts "+++ No Google APIs add-on found (which is required because 'mapping' enabled in build.yml)"
@@ -319,7 +325,13 @@ namespace "config" do
319
325
  end
320
326
  end
321
327
 
322
- setup_ndk($androidndkpath,ANDROID_API_LEVEL)
328
+ $emuversion = get_market_version($found_api_level) if $emuversion.nil?
329
+ $emuversion = $emuversion.to_s
330
+ $avdname = "rhoAndroid" + $emuversion.gsub(/[^0-9]/, "")
331
+ $avdname += "ext" if $use_geomapping
332
+ $avdtarget = $androidtargets[get_api_level($emuversion)]
333
+
334
+ setup_ndk($androidndkpath, ANDROID_API_LEVEL)
323
335
 
324
336
  $stlport_includes = File.join $shareddir, "stlport", "stlport"
325
337
 
@@ -668,7 +680,7 @@ namespace "build" do
668
680
  puts "Need to regenerate rhocaps.inc"
669
681
  $stdout.flush
670
682
  File.open(rhocaps_inc, 'w') do |f|
671
- ANDROID_PERMISSIONS.keys.each do |k|
683
+ ANDROID_PERMISSIONS.keys.sort.each do |k|
672
684
  f.puts "RHO_DEFINE_CAP(#{k.upcase})"
673
685
  end
674
686
  end
@@ -676,6 +688,16 @@ namespace "build" do
676
688
  puts "No need to regenerate rhocaps.inc"
677
689
  $stdout.flush
678
690
  end
691
+
692
+ # Generate Capabilities.java
693
+ File.open($app_capabilities_java, "w") do |f|
694
+ f.puts "package com.rhomobile.rhodes;"
695
+ f.puts "public class Capabilities {"
696
+ ANDROID_PERMISSIONS.keys.sort.each do |k|
697
+ f.puts " public static boolean #{k.upcase}_ENABLED = true;"
698
+ end
699
+ f.puts "}"
700
+ end
679
701
  end
680
702
 
681
703
  task :gen_java_ext => "config:android" do
@@ -811,6 +833,7 @@ namespace "build" do
811
833
  end
812
834
  lines << $app_android_r
813
835
  lines << $app_native_libs_java
836
+ lines << $app_capabilities_java
814
837
  if File.exists? File.join($extensionsdir, "ext_build.files")
815
838
  File.open(File.join($extensionsdir, "ext_build.files")) do |f|
816
839
  while line = f.gets
@@ -21,7 +21,7 @@
21
21
  <key>CFBundleSignature</key>
22
22
  <string>????</string>
23
23
  <key>CFBundleVersion</key>
24
- <string>2.0.0</string>
24
+ <string>2.0.2</string>
25
25
  <key>LSRequiresIPhoneOS</key>
26
26
  <true/>
27
27
  </dict>
@@ -76,10 +76,10 @@ namespace "config" do
76
76
  $excludelib = ['**/builtinME.rb','**/ServeME.rb','**/TestServe.rb']
77
77
  $tmpdir = $bindir +"/tmp"
78
78
 
79
- $homedir = `echo ~`.to_s.strip
79
+ $homedir = ENV['HOME']
80
80
  $simdir = "#{$homedir}/Library/Application Support/iPhone Simulator/"
81
81
  $sim="/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications"
82
- $guid="364FFCAF-C71D-4543-B293-9058E31CFFEE"
82
+ $guid = `uuidgen`.strip
83
83
  $applog = File.join($homedir,$app_config["applog"]) if $app_config["applog"]
84
84
 
85
85
 
@@ -171,7 +171,9 @@ namespace "build" do
171
171
  task :rhodes => ["config:iphone", "build:iphone:rhobundle"] do
172
172
 
173
173
  set_app_name($app_config["name"]) unless $app_config["name"].nil?
174
- cp $app_path + "/icon/icon.png", $config["build"]["iphonepath"]
174
+ ipath = $config["build"]["iphonepath"]
175
+ cp File.join(ipath, 'icon.png'), File.join(ipath, 'icon.png.bak') unless File.exists? File.join(ipath, 'icon.png.bak')
176
+ cp $app_path + "/icon/icon.png", ipath
175
177
 
176
178
  set_signing_identity($signidentity,$provisionprofile,$entitlements.to_s) if $signidentity.to_s != ""
177
179
 
@@ -179,11 +181,18 @@ namespace "build" do
179
181
  args = ['build', '-target', 'rhorunner', '-configuration', $configuration, '-sdk', $sdk]
180
182
 
181
183
  puts Jake.run("xcodebuild",args)
182
- unless $? == 0
184
+ ret = $?
185
+
186
+ chdir $startdir
187
+ set_app_name("Rhodes") unless $app_config["name"].nil?
188
+ rm_f File.join(ipath, 'icon.png')
189
+ cp File.join(ipath, 'icon.png.bak'), File.join(ipath, 'icon.png')
190
+ rm_f File.join(ipath, 'icon.png.bak')
191
+
192
+ unless ret == 0
183
193
  puts "Error cleaning"
184
194
  exit 1
185
195
  end
186
- chdir $startdir
187
196
 
188
197
  end
189
198
 
@@ -198,50 +207,66 @@ namespace "run" do
198
207
  exit 1
199
208
  end
200
209
  `killall "iPhone Simulator"`
210
+
211
+ puts "sdk: #{$sdk.inspect.to_s}"
212
+ sdkver = $sdk.gsub(/^iphonesimulator/, '')
201
213
 
202
214
  rhorunner = $config["build"]["iphonepath"] + "/build/#{$configuration}-iphonesimulator/rhorunner.app"
215
+ puts "rhorunner: #{rhorunner}"
203
216
 
204
217
 
205
- Find.find($simdir) do |path|
206
- if File.basename(path) == "rhorunner.app"
207
- $guid = File.basename(File.dirname(path))
218
+ puts "our app name: #{$app_config['name']}"
219
+ puts "simdir: #{$simdir}"
220
+ Dir.glob(File.join($simdir, sdkver, "Applications", "*")).each do |simapppath|
221
+ need_rm = true if File.directory? simapppath
222
+ if File.exists?(File.join(simapppath, 'rhorunner.app', 'name'))
223
+ name = File.read(File.join(simapppath, 'rhorunner.app', 'name'))
224
+ puts "found app name: #{name}"
225
+ guid = File.basename(simapppath)
226
+ puts "found guid: #{guid}"
227
+ if name == $app_config['name']
228
+ $guid = guid
229
+ need_rm = false
230
+ end
208
231
  end
232
+ rm_rf simapppath if need_rm
233
+ rm_rf simapppath + ".sb" if need_rm
209
234
  end
210
235
 
211
- Dir.glob($simdir + '*').each do |sdk|
212
- simapp = sdk + "/Applications"
213
- simlink = sdk + "/Library/Preferences"
236
+ puts "app guid: #{$guid}"
214
237
 
215
- simrhodes = File.join(simapp,$guid)
216
- $simrhodes = simrhodes if $simrhodes.nil?
238
+ mkdir_p File.join($simdir, sdkver)
217
239
 
218
- mkdir_p File.join(simrhodes,"Documents")
219
- mkdir_p File.join(simrhodes,"Library","Preferences")
240
+ simapp = File.join($simdir, sdkver, "Applications")
241
+ simlink = File.join($simdir, sdkver, "Library", "Preferences")
220
242
 
221
- `cp -R -p "#{rhorunner}" "#{simrhodes}"`
222
- `ln -f -s "#{simlink}/com.apple.PeoplePicker.plist" "#{simrhodes}/Library/Preferences/com.apple.PeoplePicker.plist"`
223
- `ln -f -s "#{simlink}/.GlobalPreferences.plist" "#{simrhodes}/Library/Preferences/.GlobalPreferences.plist"`
243
+ $simrhodes = File.join(simapp, $guid)
224
244
 
225
- `echo "#{$applog}" > "#{simrhodes}/Documents/rhologpath.txt"`
226
- rholog = simapp + "/" + $guid + "/Documents/RhoLog.txt"
245
+ mkdir_p File.join($simrhodes, "Documents")
246
+ mkdir_p File.join($simrhodes, "Library", "Preferences")
227
247
 
248
+ rm_rf File.join($simrhodes, 'rhorunner.app')
249
+ cp_r rhorunner, $simrhodes
250
+ ['com.apple.PeoplePicker.plist', '.GlobalPreferences.plist'].each do |f|
251
+ `ln -f -s "#{simlink}/#{f}" "#{$simrhodes}/Library/Preferences/#{f}"`
252
+ end
228
253
 
229
- simpublic = simapp + "/" + $guid + "/Documents/apps/public"
230
- apppublic = $app_path + "/sim-public-#{File.basename(sdk)}"
254
+ `echo "#{$applog}" > "#{$simrhodes}/Documents/rhologpath.txt"`
255
+ rholog = simapp + "/" + $guid + "/Documents/RhoLog.txt"
231
256
 
232
- apprholog = $app_path + "/rholog-#{File.basename(sdk)}.txt"
233
- rm_f apprholog
234
- rm_f apppublic
235
- `ln -f -s "#{simpublic}" "#{apppublic}"`
236
- `ln -f -s "#{rholog}" "#{apprholog}"`
237
- `echo > "#{rholog}"`
238
- f = File.new("#{simapp}/#{$guid}.sb","w")
239
- f << "(version 1)\n(debug deny)\n(allow default)\n"
240
- f.close
241
257
 
258
+ simpublic = simapp + "/" + $guid + "/Documents/apps/public"
259
+ apppublic = $app_path + "/sim-public-#{sdkver}"
242
260
 
243
- end
244
-
261
+ apprholog = $app_path + "/rholog-#{sdkver}.txt"
262
+ rm_f apprholog
263
+ rm_f apppublic
264
+ `ln -f -s "#{simpublic}" "#{apppublic}"`
265
+ `ln -f -s "#{rholog}" "#{apprholog}"`
266
+ `echo > "#{rholog}"`
267
+ f = File.new("#{simapp}/#{$guid}.sb","w")
268
+ f << "(version 1)\n(debug deny)\n(allow default)\n"
269
+ f.close
245
270
 
246
271
  end
247
272
 
@@ -739,7 +739,7 @@
739
739
  );
740
740
  runOnlyForDeploymentPostprocessing = 0;
741
741
  shellPath = /bin/sh;
742
- shellScript = "RHO_SOURCE_DIR=${TARGET_BUILD_DIR}/../../bin/RhoBundle\nRHO_TARGET_DIR=${TARGET_BUILD_DIR}/${TARGET_NAME}.app\nmkdir -p ${RHO_TARGET_DIR}\ncp -Rf ${RHO_SOURCE_DIR}/* ${RHO_TARGET_DIR}";
742
+ shellScript = "RHO_SOURCE_DIR=${TARGET_BUILD_DIR}/../../bin/RhoBundle\nRHO_TARGET_DIR=${TARGET_BUILD_DIR}/${TARGET_NAME}.app\necho \"Create dir $RHO_TARGET_DIR\"\nmkdir -p ${RHO_TARGET_DIR}\nfor i in `ls -1 ${RHO_SOURCE_DIR}`\ndo\n echo \"rm -Rf $RHO_TARGET_DIR/$i\"\n rm -Rf ${RHO_TARGET_DIR}/$i\ndone\necho \"cp -Rf $RHO_SOURCE_DIR/* $RHO_TARGET_DIR\"\ncp -Rf ${RHO_SOURCE_DIR}/* ${RHO_TARGET_DIR}";
743
743
  };
744
744
  /* End PBXShellScriptBuildPhase section */
745
745
 
@@ -8,12 +8,19 @@
8
8
  #include <windows.h>
9
9
  #include <time.h>
10
10
 
11
+ typedef int socklen_t;
12
+
11
13
  #if defined(OS_WINCE)
12
14
  #include "ruby/wince/sys/types.h"
13
15
  #include "ruby/wince/sys/stat.h"
14
- #else
16
+ #ifdef __cplusplus
17
+ extern "C"
18
+ #endif //__cplusplus
19
+ char *strdup(const char * str);
20
+
21
+ #else //!defined(OS_WINCE)
15
22
  #include <sys/stat.h>
16
- #endif
23
+ #endif //!defined(OS_WINCE)
17
24
 
18
25
  #define LOG_NEWLINE "\r\n"
19
26
  #define LOG_NEWLINELEN 2
@@ -25,7 +32,15 @@ typedef unsigned __int64 uint64;
25
32
 
26
33
  #define strcasecmp _stricmp
27
34
  #define snprintf _snprintf
28
- #else
35
+
36
+ #define FMTI64 "%I64d"
37
+ #define FMTU64 "%I64u"
38
+
39
+ #else // !(defined( OS_WINDOWS ) || defined( OS_WINCE ))
40
+
41
+ #define FMTI64 "%lli"
42
+ #define FMTU64 "%llu"
43
+
29
44
  # if defined(OS_ANDROID)
30
45
  // Needed for va_list on Android
31
46
  # include <stdarg.h>
@@ -325,74 +325,96 @@ void CRhodesApp::initHttpServer()
325
325
 
326
326
  const char* CRhodesApp::getFreeListeningPort()
327
327
  {
328
+ int sockfd = -1;
329
+ struct sockaddr_in serv_addr = {0};
330
+ int noerrors = 1;
331
+
328
332
  if ( m_strListeningPorts.length() > 0 )
329
333
  return m_strListeningPorts.c_str();
330
334
 
331
- int noerrors = 1;
332
335
  LOG(INFO) + "Trying to get free listening port.";
333
336
 
334
- //get free port
335
- int sockfd = -1;
336
- struct sockaddr_in serv_addr = {0};
337
- //struct hostent *server = {0};
338
- //int result = -1;
339
-
340
- if ( noerrors )
341
- {
342
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
343
- if ( sockfd < 0 )
344
- {
345
- LOG(WARNING) + ("Unable to open socket");
346
- noerrors = 0;
347
- }
348
-
349
- if ( noerrors )
350
- {
351
- //server = gethostbyname( "localhost" );
352
-
353
- memset((void *) &serv_addr, 0, sizeof(serv_addr));
354
- serv_addr.sin_family = AF_INET;
355
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
356
- serv_addr.sin_port = htons(8080);
337
+ sockfd = socket(AF_INET, SOCK_STREAM, 0);
338
+ if ( sockfd < 0 )
339
+ {
340
+ LOG(WARNING) + "Unable to open socket";
341
+ noerrors = 0;
342
+ }
343
+
344
+ int disable = 0;
345
+ if (noerrors && setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&disable, sizeof(disable)) != 0)
346
+ {
347
+ LOG(WARNING) + "Unable to set socket option";
348
+ noerrors = 0;
349
+ }
350
+ #if defined(OS_MACOSX)
351
+ if (noerrors && setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (const char *)&disable, sizeof(disable)) != 0)
352
+ {
353
+ LOG(WARNING) + "Unable to set socket option";
354
+ noerrors = 0;
355
+ }
356
+ #endif
357
+
358
+ if (noerrors)
359
+ {
360
+ memset((void *) &serv_addr, 0, sizeof(serv_addr));
361
+ #if defined(OS_MACOSX)
362
+ serv_addr.sin_len = sizeof(serv_addr);
363
+ #endif
364
+ serv_addr.sin_family = AF_INET;
365
+ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
366
+ serv_addr.sin_port = htons(8080);
367
+
368
+ LOG(INFO) + "Trying to bind on 8080 port...";
357
369
 
358
- if ( bind( sockfd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) )
370
+ if ( bind( sockfd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) != 0 )
371
+ {
372
+ // Fill serv_addr again but with dynamically selected port
373
+ #if defined(OS_MACOSX)
374
+ serv_addr.sin_len = sizeof(serv_addr);
375
+ #endif
376
+ serv_addr.sin_family = AF_INET;
377
+ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
378
+ serv_addr.sin_port = htons(0);
379
+
380
+ LOG(INFO) + "Trying to bind on dynamic port...";
381
+
382
+ if ( bind( sockfd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) != 0 )
359
383
  {
360
- serv_addr.sin_port = htons(0);
361
- if ( bind( sockfd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) )
362
- {
363
- LOG(WARNING) + "Unable to bind";
364
- noerrors = 0;
365
- }
384
+ LOG(WARNING) + "Unable to bind";
385
+ noerrors = 0;
366
386
  }
387
+ }
388
+ }
367
389
 
368
- if ( noerrors )
369
- {
370
- char buf[10] = {0};
371
- #ifdef OS_MACOSX
372
- socklen_t
373
- #else
374
- int
375
- #endif
376
- length = sizeof( serv_addr );
377
-
378
- getsockname( sockfd, (struct sockaddr *)&serv_addr, &length );
379
-
380
- sprintf(buf,"%d",ntohs(serv_addr.sin_port));
381
-
382
- m_strListeningPorts = buf;
383
- }
384
- //Clean up
390
+ if ( noerrors )
391
+ {
392
+ char buf[10] = {0};
393
+
394
+ socklen_t length = sizeof( serv_addr );
395
+
396
+ if (getsockname( sockfd, (struct sockaddr *)&serv_addr, &length ) != 0)
397
+ {
398
+ LOG(WARNING) + "Can not get socket info";
399
+ noerrors = 0;
400
+ }
401
+ else
402
+ {
403
+ sprintf(buf, "%d", (int)ntohs(serv_addr.sin_port));
404
+ LOG(INFO) + "Got port to bind on: " + buf;
405
+ m_strListeningPorts = buf;
406
+ }
407
+ }
408
+
409
+ //Clean up
385
410
  #if defined(OS_ANDROID)
386
- close(sockfd);
411
+ close(sockfd);
387
412
  #else
388
- closesocket(sockfd);
413
+ closesocket(sockfd);
389
414
  #endif
390
- }
391
-
392
- }
393
415
 
394
416
  if ( !noerrors )
395
- m_strListeningPorts = "8080";
417
+ m_strListeningPorts = "0";
396
418
 
397
419
  LOG(INFO) + "Free listening port: " + m_strListeningPorts;
398
420