rhodes 2.0.0 → 2.0.2

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