rhodes 2.0.2 → 2.0.3
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.
- data/CHANGELOG +10 -0
- data/lib/framework/rho/rhoerror.rb +4 -0
- data/lib/framework/rhodes.rb +2 -2
- data/lib/framework/rhom/rhom.rb +21 -1
- data/lib/framework/version.rb +2 -2
- data/lib/rhodes.rb +2 -2
- data/platform/android/Rhodes/AndroidManifest.xml +2 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +21 -6
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesInstance.java +1 -1
- data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +10 -0
- data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +1 -1
- data/platform/bb/rhodes/src/com/rho/rubyext/GeoLocation.java +2 -2
- data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +4 -2
- data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +52 -11
- data/platform/iphone/Classes/NativeBar.m +37 -18
- data/platform/iphone/Classes/Rhodes.h +2 -0
- data/platform/iphone/Classes/Rhodes.m +27 -8
- data/platform/iphone/Classes/SimpleMainView.h +7 -5
- data/platform/iphone/Classes/SimpleMainView.m +155 -36
- data/platform/iphone/Classes/TabbedMainView.h +2 -4
- data/platform/iphone/Classes/TabbedMainView.m +12 -10
- data/platform/iphone/Classes/WebView.m +1 -0
- data/platform/iphone/Info.plist +7 -1
- data/platform/iphone/icon114.png +0 -0
- data/platform/iphone/icon57.png +0 -0
- data/platform/iphone/icon72.png +0 -0
- data/platform/iphone/rbuild/iphone.rake +102 -16
- data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +12 -0
- data/platform/shared/common/IRhoThreadImpl.h +1 -1
- data/platform/shared/common/PosixThreadImpl.cpp +17 -22
- data/platform/shared/common/PosixThreadImpl.h +1 -1
- data/platform/shared/common/RhoThread.cpp +7 -3
- data/platform/shared/common/RhoThread.h +21 -7
- data/platform/shared/common/RhodesApp.cpp +13 -9
- data/platform/shared/common/RhodesApp.h +1 -1
- data/platform/shared/common/ThreadQueue.cpp +6 -4
- data/platform/shared/rubyJVM/src/com/rho/IRhoRubyHelper.java +2 -0
- data/platform/shared/rubyJVM/src/com/rho/RhoThread.java +18 -8
- data/platform/shared/rubyJVM/src/com/rho/RhodesApp.java +70 -2
- data/platform/shared/rubyJVM/src/com/rho/ThreadQueue.java +143 -0
- data/platform/shared/rubyJVM/src/com/rho/sync/ClientRegister.java +15 -5
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncEngine.java +42 -36
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncNotify.java +63 -20
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncSource.java +4 -4
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncThread.java +12 -2
- data/platform/shared/rubyJVM/src/com/xruby/runtime/lang/RhoSupport.java +9 -3
- data/platform/shared/sync/ClientRegister.cpp +11 -3
- data/platform/shared/sync/ClientRegister.h +1 -0
- data/platform/shared/sync/SyncEngine.cpp +38 -35
- data/platform/shared/sync/SyncEngine.h +2 -1
- data/platform/shared/sync/SyncNotify.cpp +53 -20
- data/platform/shared/sync/SyncNotify.h +9 -2
- data/platform/shared/sync/SyncSource.cpp +3 -3
- data/platform/shared/sync/SyncSource.h +1 -1
- data/platform/shared/sync/SyncThread.cpp +9 -2
- data/platform/wm/rhodes/Alert.cpp +35 -21
- data/platform/wm/rhodes/Alert.h +11 -2
- data/platform/wm/rhodes/rho/common/RhoThreadImpl.cpp +11 -12
- data/platform/wm/rhodes/rho/common/RhoThreadImpl.h +2 -0
- data/res/generators/templates/application/build.yml +1 -1
- data/rhodes.gemspec +2 -2
- data/spec/framework_spec/rhoconfig.txt +1 -0
- data/spec/phone_spec/rhoconfig.txt +2 -0
- metadata +8 -5
- data/Manifest.txt +0 -5333
    
        data/platform/iphone/Info.plist
    CHANGED
    
    | @@ -10,6 +10,12 @@ | |
| 10 10 | 
             
            	<string>${EXECUTABLE_NAME}</string>
         | 
| 11 11 | 
             
            	<key>CFBundleIconFile</key>
         | 
| 12 12 | 
             
            	<string>icon.png</string>
         | 
| 13 | 
            +
            	<key>CFBundleIconFiles</key>
         | 
| 14 | 
            +
            	<array>
         | 
| 15 | 
            +
            		<string>icon57</string>
         | 
| 16 | 
            +
            		<string>icon72</string>
         | 
| 17 | 
            +
            		<string>icon114</string>
         | 
| 18 | 
            +
            	</array>
         | 
| 13 19 | 
             
            	<key>CFBundleIdentifier</key>
         | 
| 14 20 | 
             
            	<string>com.rhomobile.rhosyncclient</string>
         | 
| 15 21 | 
             
            	<key>CFBundleInfoDictionaryVersion</key>
         | 
| @@ -21,7 +27,7 @@ | |
| 21 27 | 
             
            	<key>CFBundleSignature</key>
         | 
| 22 28 | 
             
            	<string>????</string>
         | 
| 23 29 | 
             
            	<key>CFBundleVersion</key>
         | 
| 24 | 
            -
            	<string>2.0. | 
| 30 | 
            +
            	<string>2.0.3</string>
         | 
| 25 31 | 
             
            	<key>LSRequiresIPhoneOS</key>
         | 
| 26 32 | 
             
            	<true/>
         | 
| 27 33 | 
             
            </dict>
         | 
| Binary file | 
| Binary file | 
| Binary file | 
| @@ -23,6 +23,38 @@ def set_app_name(newname) | |
| 23 23 |  | 
| 24 24 | 
             
            end
         | 
| 25 25 |  | 
| 26 | 
            +
            ICONS = ['icon', 'icon57', 'icon72', 'icon114']
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            def restore_app_icon
         | 
| 29 | 
            +
              puts "restore icon"
         | 
| 30 | 
            +
              ipath = $config["build"]["iphonepath"]
         | 
| 31 | 
            +
              ICONS.each do |name|
         | 
| 32 | 
            +
                ibak = File.join(ipath, name + '.bak')
         | 
| 33 | 
            +
                icon = File.join(ipath, name + '.png')
         | 
| 34 | 
            +
                next if !File.exists? ibak
         | 
| 35 | 
            +
                rm_f icon
         | 
| 36 | 
            +
                cp ibak, icon
         | 
| 37 | 
            +
                rm_f ibak
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            def set_app_icon
         | 
| 42 | 
            +
              puts "set icon"
         | 
| 43 | 
            +
              ipath = $config["build"]["iphonepath"]
         | 
| 44 | 
            +
              begin
         | 
| 45 | 
            +
                ICONS.each do |name|
         | 
| 46 | 
            +
                  ibak = File.join(ipath, name + '.bak')
         | 
| 47 | 
            +
                  icon = File.join(ipath, name + '.png')
         | 
| 48 | 
            +
                  appicon = File.join($app_path, 'icon', name + '.png')
         | 
| 49 | 
            +
                  cp icon, ibak unless File.exists? ibak
         | 
| 50 | 
            +
                  cp appicon, ipath
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              rescue => e
         | 
| 53 | 
            +
                puts "WARNING!!! Can not change icon: #{e.to_s}"
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            end
         | 
| 57 | 
            +
             | 
| 26 58 | 
             
            def set_signing_identity(identity,profile,entitlements)
         | 
| 27 59 | 
             
              fname = $config["build"]["iphonepath"] + "/rhorunner.xcodeproj/project.pbxproj"
         | 
| 28 60 | 
             
              buf = ""
         | 
| @@ -76,6 +108,8 @@ namespace "config" do | |
| 76 108 | 
             
                $excludelib = ['**/builtinME.rb','**/ServeME.rb','**/TestServe.rb']
         | 
| 77 109 | 
             
                $tmpdir =  $bindir +"/tmp"
         | 
| 78 110 |  | 
| 111 | 
            +
                $devroot = '/Developer' if $devroot.nil?
         | 
| 112 | 
            +
             | 
| 79 113 | 
             
                $homedir = ENV['HOME']
         | 
| 80 114 | 
             
                $simdir = "#{$homedir}/Library/Application Support/iPhone Simulator/"
         | 
| 81 115 | 
             
                $sim="/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications"
         | 
| @@ -97,6 +131,14 @@ namespace "config" do | |
| 97 131 | 
             
                  $sdk = $app_config["iphone"]["sdk"]
         | 
| 98 132 | 
             
                end
         | 
| 99 133 |  | 
| 134 | 
            +
                if $sdk =~ /iphonesimulator/
         | 
| 135 | 
            +
                  $sdkroot = $devroot + "/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator" +
         | 
| 136 | 
            +
                    $sdk.gsub(/iphonesimulator/,"") + ".sdk"
         | 
| 137 | 
            +
                else
         | 
| 138 | 
            +
                  $sdkroot = $devroot + "/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS" +
         | 
| 139 | 
            +
                    $sdk.gsub(/iphoneos/,"") + ".sdk"
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
             | 
| 100 142 | 
             
                unless File.exists? $homedir + "/.profile"
         | 
| 101 143 | 
             
                  File.open($homedir + "/.profile","w") {|f| f << "#" }
         | 
| 102 144 | 
             
                  chmod 0744, $homedir + "/.profile"
         | 
| @@ -138,14 +180,11 @@ namespace "build" do | |
| 138 180 | 
             
                  simulator = $sdk =~ /iphonesimulator/
         | 
| 139 181 | 
             
                  ENV["PLATFORM_DEVELOPER_BIN_DIR"] ||= "/Developer/Platforms/" + ( simulator ? "iPhoneSimulator" : "iPhoneOS" ) +
         | 
| 140 182 | 
             
                    ".platform/Developer/usr/bin"
         | 
| 183 | 
            +
                  ENV["SDKROOT"] = $sdkroot
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                  #ENV["SDKROOT"] = $xcode_sdk_dir if not $xcode_sdk_dir.nil?
         | 
| 186 | 
            +
             | 
| 141 187 |  | 
| 142 | 
            -
                  if simulator
         | 
| 143 | 
            -
                    ENV["SDKROOT"] ||= "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator" +
         | 
| 144 | 
            -
                          $sdk.gsub(/iphonesimulator/,"") + ".sdk"
         | 
| 145 | 
            -
                  else
         | 
| 146 | 
            -
                    ENV["SDKROOT"] ||= "/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS" +
         | 
| 147 | 
            -
                          $sdk.gsub(/iphoneos/,"") + ".sdk"
         | 
| 148 | 
            -
                  end
         | 
| 149 188 | 
             
                  ENV["BUILD_DIR"] ||= $startdir + "/platform/iphone/build"
         | 
| 150 189 | 
             
                  ENV["TARGET_TEMP_DIR"] ||= $startdir + "/platform/iphone/build/rhorunner.build/#{$configuration}-" +
         | 
| 151 190 | 
             
                    ( simulator ? "iphonesimulator" : "iphoneos") + "/rhorunner.build"
         | 
| @@ -171,9 +210,7 @@ namespace "build" do | |
| 171 210 | 
             
                task :rhodes => ["config:iphone", "build:iphone:rhobundle"] do
         | 
| 172 211 |  | 
| 173 212 | 
             
                  set_app_name($app_config["name"]) unless $app_config["name"].nil?
         | 
| 174 | 
            -
                   | 
| 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
         | 
| 213 | 
            +
                  set_app_icon
         | 
| 177 214 |  | 
| 178 215 | 
             
                  set_signing_identity($signidentity,$provisionprofile,$entitlements.to_s) if $signidentity.to_s != ""
         | 
| 179 216 |  | 
| @@ -185,9 +222,7 @@ namespace "build" do | |
| 185 222 |  | 
| 186 223 | 
             
                  chdir $startdir
         | 
| 187 224 | 
             
                  set_app_name("Rhodes") unless $app_config["name"].nil?
         | 
| 188 | 
            -
                   | 
| 189 | 
            -
                  cp File.join(ipath, 'icon.png.bak'), File.join(ipath, 'icon.png')
         | 
| 190 | 
            -
                  rm_f File.join(ipath, 'icon.png.bak')
         | 
| 225 | 
            +
                  restore_app_icon
         | 
| 191 226 |  | 
| 192 227 | 
             
                  unless ret == 0
         | 
| 193 228 | 
             
                    puts "Error cleaning"
         | 
| @@ -208,15 +243,66 @@ namespace "run" do | |
| 208 243 | 
             
                 end
         | 
| 209 244 | 
             
                 `killall "iPhone Simulator"`
         | 
| 210 245 |  | 
| 211 | 
            -
                 puts "sdk: #{$sdk.inspect.to_s}"
         | 
| 212 246 | 
             
                 sdkver = $sdk.gsub(/^iphonesimulator/, '')
         | 
| 213 | 
            -
             | 
| 247 | 
            +
             | 
| 248 | 
            +
                 elements = []
         | 
| 249 | 
            +
                 binplist = File.join(ENV['HOME'], 'Library', 'Preferences', 'com.apple.iphonesimulator.plist')
         | 
| 250 | 
            +
                 xmlplist = '/tmp/iphone.plist'
         | 
| 251 | 
            +
                 if File.exists? binplist
         | 
| 252 | 
            +
                   `plutil -convert xml1 -o #{xmlplist} #{binplist}`
         | 
| 253 | 
            +
             | 
| 254 | 
            +
                   elements = []
         | 
| 255 | 
            +
                   doc = REXML::Document.new(File.new(xmlplist))
         | 
| 256 | 
            +
                   nextignore = false
         | 
| 257 | 
            +
                   doc.elements.each('plist/dict/*') do |element|
         | 
| 258 | 
            +
                     if nextignore
         | 
| 259 | 
            +
                       nextignore = false
         | 
| 260 | 
            +
                       next
         | 
| 261 | 
            +
                     end
         | 
| 262 | 
            +
                     if element.name == 'key'
         | 
| 263 | 
            +
                       if element.text == 'currentSDKRoot' or element.text == 'SimulateDevice'
         | 
| 264 | 
            +
                         nextignore = true
         | 
| 265 | 
            +
                         next
         | 
| 266 | 
            +
                       end
         | 
| 267 | 
            +
                     end
         | 
| 268 | 
            +
                     
         | 
| 269 | 
            +
                     elements << element
         | 
| 270 | 
            +
                   end
         | 
| 271 | 
            +
                 end
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                 e = REXML::Element.new 'key'
         | 
| 274 | 
            +
                 e.text = 'SimulateDevice'
         | 
| 275 | 
            +
                 elements << e
         | 
| 276 | 
            +
                 e = REXML::Element.new 'string'
         | 
| 277 | 
            +
                 e.text = sdkver == '3.2' ? 'iPad' : 'iPhone'
         | 
| 278 | 
            +
                 elements << e
         | 
| 279 | 
            +
                 e = REXML::Element.new 'key'
         | 
| 280 | 
            +
                 e.text = 'currentSDKRoot'
         | 
| 281 | 
            +
                 elements << e
         | 
| 282 | 
            +
                 e = REXML::Element.new 'string'
         | 
| 283 | 
            +
                 e.text = $sdkroot
         | 
| 284 | 
            +
                 elements << e
         | 
| 285 | 
            +
             | 
| 286 | 
            +
                 File.open(xmlplist, 'w') do |f|
         | 
| 287 | 
            +
                   f.puts "<?xml version=\"1.0\" encoding=\"UTF-8'\"?>"
         | 
| 288 | 
            +
                   f.puts "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"
         | 
| 289 | 
            +
                   f.puts "<plist version=\"1.0\">"
         | 
| 290 | 
            +
                   f.puts "<dict>"
         | 
| 291 | 
            +
                   elements.each do |e|
         | 
| 292 | 
            +
                     f.puts "\t#{e.to_s}"
         | 
| 293 | 
            +
                   end
         | 
| 294 | 
            +
                   f.puts "</dict>"
         | 
| 295 | 
            +
                   f.puts "</plist>"
         | 
| 296 | 
            +
                 end
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                 `plutil -convert binary1 -o #{binplist} #{xmlplist}`
         | 
| 299 | 
            +
             | 
| 214 300 | 
             
                 rhorunner = $config["build"]["iphonepath"] + "/build/#{$configuration}-iphonesimulator/rhorunner.app"
         | 
| 215 301 | 
             
                 puts "rhorunner: #{rhorunner}"
         | 
| 216 302 |  | 
| 217 | 
            -
              
         | 
| 218 303 | 
             
                 puts "our app name: #{$app_config['name']}"
         | 
| 219 304 | 
             
                 puts "simdir: #{$simdir}"
         | 
| 305 | 
            +
             | 
| 220 306 | 
             
                 Dir.glob(File.join($simdir, sdkver, "Applications", "*")).each do |simapppath|
         | 
| 221 307 | 
             
                   need_rm = true if File.directory? simapppath
         | 
| 222 308 | 
             
                   if File.exists?(File.join(simapppath, 'rhorunner.app', 'name'))
         | 
| @@ -37,6 +37,9 @@ | |
| 37 37 | 
             
            		BDB15ED510B2EC8700003DFA /* librhorubylib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F59F16000E9449B8004103B4 /* librhorubylib.a */; };
         | 
| 38 38 | 
             
            		BDB373661144220F006EA6DA /* SimpleMainView.m in Sources */ = {isa = PBXBuildFile; fileRef = BDB373651144220F006EA6DA /* SimpleMainView.m */; };
         | 
| 39 39 | 
             
            		BDB373C511444A8F006EA6DA /* Rhodes.m in Sources */ = {isa = PBXBuildFile; fileRef = BDB373C411444A8F006EA6DA /* Rhodes.m */; };
         | 
| 40 | 
            +
            		BDC6F34911F4ABBF0056C1C3 /* icon57.png in Resources */ = {isa = PBXBuildFile; fileRef = BDC6F34611F4ABBF0056C1C3 /* icon57.png */; };
         | 
| 41 | 
            +
            		BDC6F34A11F4ABBF0056C1C3 /* icon72.png in Resources */ = {isa = PBXBuildFile; fileRef = BDC6F34711F4ABBF0056C1C3 /* icon72.png */; };
         | 
| 42 | 
            +
            		BDC6F34B11F4ABBF0056C1C3 /* icon114.png in Resources */ = {isa = PBXBuildFile; fileRef = BDC6F34811F4ABBF0056C1C3 /* icon114.png */; };
         | 
| 40 43 | 
             
            		BDE35A7A107F900A009941C7 /* RhoFileImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = BDE35A79107F900A009941C7 /* RhoFileImpl.m */; };
         | 
| 41 44 | 
             
            		BDFBD99610B1B99A00BAAFAB /* Entitlements.plist in Resources */ = {isa = PBXBuildFile; fileRef = BDFBD99510B1B99A00BAAFAB /* Entitlements.plist */; };
         | 
| 42 45 | 
             
            		BDFBD99A10B1B9A900BAAFAB /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = BDFBD99910B1B9A900BAAFAB /* Settings.bundle */; };
         | 
| @@ -183,6 +186,9 @@ | |
| 183 186 | 
             
            		BDB373651144220F006EA6DA /* SimpleMainView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleMainView.m; sourceTree = "<group>"; };
         | 
| 184 187 | 
             
            		BDB373C3114449B6006EA6DA /* Rhodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Rhodes.h; sourceTree = "<group>"; };
         | 
| 185 188 | 
             
            		BDB373C411444A8F006EA6DA /* Rhodes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Rhodes.m; sourceTree = "<group>"; };
         | 
| 189 | 
            +
            		BDC6F34611F4ABBF0056C1C3 /* icon57.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon57.png; sourceTree = SOURCE_ROOT; };
         | 
| 190 | 
            +
            		BDC6F34711F4ABBF0056C1C3 /* icon72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.png; sourceTree = SOURCE_ROOT; };
         | 
| 191 | 
            +
            		BDC6F34811F4ABBF0056C1C3 /* icon114.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon114.png; sourceTree = SOURCE_ROOT; };
         | 
| 186 192 | 
             
            		BDE35A79107F900A009941C7 /* RhoFileImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RhoFileImpl.m; sourceTree = "<group>"; };
         | 
| 187 193 | 
             
            		BDFBD99510B1B99A00BAAFAB /* Entitlements.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Entitlements.plist; sourceTree = "<group>"; };
         | 
| 188 194 | 
             
            		BDFBD99910B1B9A900BAAFAB /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
         | 
| @@ -258,6 +264,9 @@ | |
| 258 264 | 
             
            		080E96DDFE201D6D7F000001 /* Classes */ = {
         | 
| 259 265 | 
             
            			isa = PBXGroup;
         | 
| 260 266 | 
             
            			children = (
         | 
| 267 | 
            +
            				BDC6F34611F4ABBF0056C1C3 /* icon57.png */,
         | 
| 268 | 
            +
            				BDC6F34711F4ABBF0056C1C3 /* icon72.png */,
         | 
| 269 | 
            +
            				BDC6F34811F4ABBF0056C1C3 /* icon114.png */,
         | 
| 261 270 | 
             
            				BDFBD9A610B1BA2000BAAFAB /* icon.png */,
         | 
| 262 271 | 
             
            				BD97AC1E1160EE7A006960F9 /* Alert */,
         | 
| 263 272 | 
             
            				F579170F0E8AB2A200BBC54D /* AppManager */,
         | 
| @@ -682,6 +691,9 @@ | |
| 682 691 | 
             
            				BDFBD9A410B1B9E500BAAFAB /* forward_btn.png in Resources */,
         | 
| 683 692 | 
             
            				BDFBD9A510B1B9E500BAAFAB /* home_btn.png in Resources */,
         | 
| 684 693 | 
             
            				BDFBD9A710B1BA2000BAAFAB /* icon.png in Resources */,
         | 
| 694 | 
            +
            				BDC6F34911F4ABBF0056C1C3 /* icon57.png in Resources */,
         | 
| 695 | 
            +
            				BDC6F34A11F4ABBF0056C1C3 /* icon72.png in Resources */,
         | 
| 696 | 
            +
            				BDC6F34B11F4ABBF0056C1C3 /* icon114.png in Resources */,
         | 
| 685 697 | 
             
            			);
         | 
| 686 698 | 
             
            			runOnlyForDeploymentPostprocessing = 0;
         | 
| 687 699 | 
             
            		};
         | 
| @@ -14,27 +14,7 @@ namespace common | |
| 14 14 | 
             
            IMPLEMENT_LOGCLASS(CPosixThreadImpl, "RhoThread");
         | 
| 15 15 |  | 
| 16 16 | 
             
            CPosixThreadImpl::CPosixThreadImpl()
         | 
| 17 | 
            -
                :m_started(false)
         | 
| 18 | 
            -
            {}
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            void *runProc(void *pv)
         | 
| 21 17 | 
             
            {
         | 
| 22 | 
            -
                IRhoRunnable *p = static_cast<IRhoRunnable *>(pv);
         | 
| 23 | 
            -
                void *pData = rho_nativethread_start();
         | 
| 24 | 
            -
                p->run();
         | 
| 25 | 
            -
                rho_nativethread_end(pData);
         | 
| 26 | 
            -
                return 0;
         | 
| 27 | 
            -
            }
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            void CPosixThreadImpl::start(IRhoRunnable *pRunnable, IRhoRunnable::EPriority ePriority)
         | 
| 30 | 
            -
            {
         | 
| 31 | 
            -
                {
         | 
| 32 | 
            -
                    common::CMutexLock lock(m_mxSync);
         | 
| 33 | 
            -
                    if (m_started)
         | 
| 34 | 
            -
                        return;
         | 
| 35 | 
            -
                    m_started = true;
         | 
| 36 | 
            -
                }
         | 
| 37 | 
            -
             | 
| 38 18 | 
             
            #if defined(OS_ANDROID)
         | 
| 39 19 | 
             
                // Android has no pthread_condattr_xxx API
         | 
| 40 20 | 
             
                pthread_cond_init(&m_condSync, NULL);
         | 
| @@ -44,7 +24,24 @@ void CPosixThreadImpl::start(IRhoRunnable *pRunnable, IRhoRunnable::EPriority eP | |
| 44 24 | 
             
                pthread_cond_init(&m_condSync, &sync_details);
         | 
| 45 25 | 
             
                pthread_condattr_destroy(&sync_details);
         | 
| 46 26 | 
             
            #endif
         | 
| 27 | 
            +
            }
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            CPosixThreadImpl::~CPosixThreadImpl()
         | 
| 30 | 
            +
            {
         | 
| 31 | 
            +
                pthread_cond_destroy(&m_condSync);
         | 
| 32 | 
            +
            }
         | 
| 47 33 |  | 
| 34 | 
            +
            void *runProc(void *pv)
         | 
| 35 | 
            +
            {
         | 
| 36 | 
            +
                IRhoRunnable *p = static_cast<IRhoRunnable *>(pv);
         | 
| 37 | 
            +
                void *pData = rho_nativethread_start();
         | 
| 38 | 
            +
                p->runObject();
         | 
| 39 | 
            +
                rho_nativethread_end(pData);
         | 
| 40 | 
            +
                return 0;
         | 
| 41 | 
            +
            }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            void CPosixThreadImpl::start(IRhoRunnable *pRunnable, IRhoRunnable::EPriority ePriority)
         | 
| 44 | 
            +
            {
         | 
| 48 45 | 
             
                pthread_attr_t  attr;
         | 
| 49 46 | 
             
                int return_val = pthread_attr_init(&attr);
         | 
| 50 47 | 
             
                //return_val = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
         | 
| @@ -71,8 +68,6 @@ void CPosixThreadImpl::stop(unsigned int nTimeoutToKill) | |
| 71 68 | 
             
                //TODO: wait for nTimeoutToKill and kill thread
         | 
| 72 69 | 
             
                void* status;
         | 
| 73 70 | 
             
                pthread_join(m_thread,&status);
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                pthread_cond_destroy(&m_condSync);
         | 
| 76 71 | 
             
            }
         | 
| 77 72 |  | 
| 78 73 | 
             
            void CPosixThreadImpl::wait(unsigned int nTimeout)
         | 
| @@ -14,6 +14,7 @@ class CPosixThreadImpl : public IRhoThreadImpl | |
| 14 14 | 
             
                DEFINE_LOGCLASS;
         | 
| 15 15 | 
             
            public:
         | 
| 16 16 | 
             
                CPosixThreadImpl();
         | 
| 17 | 
            +
                ~CPosixThreadImpl();
         | 
| 17 18 |  | 
| 18 19 | 
             
                void start(IRhoRunnable *pRunnable, IRhoRunnable::EPriority ePriority);
         | 
| 19 20 | 
             
                void stop(unsigned int nTimeoutToKill);
         | 
| @@ -25,7 +26,6 @@ private: | |
| 25 26 | 
             
                pthread_cond_t m_condSync;
         | 
| 26 27 | 
             
                common::CMutex m_mxSync;
         | 
| 27 28 | 
             
                pthread_t m_thread;
         | 
| 28 | 
            -
                bool m_started;
         | 
| 29 29 | 
             
            };
         | 
| 30 30 |  | 
| 31 31 | 
             
            } // namespace common
         | 
| @@ -6,14 +6,18 @@ namespace common { | |
| 6 6 |  | 
| 7 7 | 
             
            CRhoThread::CRhoThread(IRhoClassFactory* factory)
         | 
| 8 8 | 
             
            {
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
                m_bStop = false;
         | 
| 9 | 
            +
                m_nState = TS_NONE;
         | 
| 11 10 | 
             
                m_pImpl = factory->createThreadImpl();
         | 
| 12 11 | 
             
            }
         | 
| 13 12 |  | 
| 14 13 | 
             
            void CRhoThread::start(EPriority ePriority)
         | 
| 15 14 | 
             
            {
         | 
| 16 | 
            -
                 | 
| 15 | 
            +
                if ( !isRunning() )
         | 
| 16 | 
            +
                {
         | 
| 17 | 
            +
                    m_pImpl->start(this, ePriority);
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    m_nState = TS_RUNNING;
         | 
| 20 | 
            +
                }
         | 
| 17 21 | 
             
            }
         | 
| 18 22 |  | 
| 19 23 | 
             
            }
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            #pragma once
         | 
| 2 2 |  | 
| 3 | 
            +
            #include "RhoStd.h"
         | 
| 3 4 | 
             
            #include "IRhoThreadImpl.h"
         | 
| 4 5 | 
             
            #include "AutoPointer.h"
         | 
| 5 6 |  | 
| @@ -10,20 +11,33 @@ struct IRhoClassFactory; | |
| 10 11 | 
             
            class CRhoThread : public IRhoRunnable
         | 
| 11 12 | 
             
            {
         | 
| 12 13 | 
             
                CAutoPtr<IRhoThreadImpl> m_pImpl;
         | 
| 13 | 
            -
                 | 
| 14 | 
            -
                 | 
| 14 | 
            +
                static const int TS_NONE = 0;
         | 
| 15 | 
            +
                static const int TS_WAIT = 1;
         | 
| 16 | 
            +
                static const int TS_STOPPING = 2;
         | 
| 17 | 
            +
                static const int TS_RUNNING = 4;
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                int m_nState;
         | 
| 15 20 | 
             
            public:
         | 
| 16 21 |  | 
| 17 22 | 
             
                CRhoThread(IRhoClassFactory* factory);
         | 
| 18 | 
            -
                virtual ~CRhoThread(void){}
         | 
| 23 | 
            +
                virtual ~CRhoThread(void){};
         | 
| 19 24 |  | 
| 20 25 | 
             
                virtual void start(EPriority ePriority);
         | 
| 21 | 
            -
                virtual void stop(unsigned int nTimeoutToKill){  | 
| 22 | 
            -
                virtual void wait(unsigned int nTimeout){  | 
| 23 | 
            -
                virtual void stopWait(){ if ( | 
| 26 | 
            +
                virtual void stop(unsigned int nTimeoutToKill){ m_nState |= TS_STOPPING; m_pImpl->stop(nTimeoutToKill); m_nState &= ~TS_STOPPING; }
         | 
| 27 | 
            +
                virtual void wait(unsigned int nTimeout){ m_nState |= TS_WAIT; m_pImpl->wait(nTimeout); m_nState &= ~TS_WAIT; }
         | 
| 28 | 
            +
                virtual void stopWait(){ if (isWaiting()) m_pImpl->stopWait(); }
         | 
| 24 29 | 
             
                virtual void sleep(unsigned int nTimeout){ m_pImpl->sleep(nTimeout); }
         | 
| 30 | 
            +
                virtual void run() = 0;
         | 
| 31 | 
            +
                virtual void runObject()
         | 
| 32 | 
            +
                {
         | 
| 33 | 
            +
                    run();
         | 
| 34 | 
            +
                    m_nState = TS_NONE;
         | 
| 35 | 
            +
                }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                boolean isStopping(){return (m_nState&TS_STOPPING) != 0;}
         | 
| 38 | 
            +
                boolean isWaiting(){return (m_nState&TS_WAIT) != 0;}
         | 
| 39 | 
            +
                boolean isRunning(){return (m_nState&TS_RUNNING) != 0;}
         | 
| 25 40 |  | 
| 26 | 
            -
                bool isStopped(){return m_bStop;}
         | 
| 27 41 | 
             
            };
         | 
| 28 42 |  | 
| 29 43 | 
             
            }
         | 
| @@ -465,9 +465,15 @@ void CRhodesApp::keepLastVisitedUrl(String strUrl) | |
| 465 465 | 
             
            void CRhodesApp::setAppBackUrl(const String& url)
         | 
| 466 466 | 
             
            {
         | 
| 467 467 | 
             
                if ( url.length() > 0 )
         | 
| 468 | 
            +
                {
         | 
| 469 | 
            +
                    m_strAppBackUrlOrig = url;
         | 
| 468 470 | 
             
                    m_strAppBackUrl = canonicalizeRhoUrl(url);
         | 
| 471 | 
            +
                }
         | 
| 469 472 | 
             
                else
         | 
| 473 | 
            +
                {
         | 
| 474 | 
            +
                    m_strAppBackUrlOrig = "";
         | 
| 470 475 | 
             
                    m_strAppBackUrl = "";
         | 
| 476 | 
            +
                }
         | 
| 471 477 | 
             
            }
         | 
| 472 478 |  | 
| 473 479 | 
             
            String CRhodesApp::getAppTitle()
         | 
| @@ -502,7 +508,7 @@ const String& CRhodesApp::getOptionsUrl() | |
| 502 508 | 
             
                return m_strOptionsUrl;
         | 
| 503 509 | 
             
            }
         | 
| 504 510 |  | 
| 505 | 
            -
            const String& CRhodesApp::getCurrentUrl(int index)
         | 
| 511 | 
            +
            const String& CRhodesApp::getCurrentUrl(int /*index*/)
         | 
| 506 512 | 
             
            { 
         | 
| 507 513 | 
             
                return m_currentUrls[m_currentTabIndex]; 
         | 
| 508 514 | 
             
            }
         | 
| @@ -533,10 +539,10 @@ void CRhodesApp::navigateToUrl( const String& strUrl) | |
| 533 539 |  | 
| 534 540 | 
             
            void CRhodesApp::navigateBack()
         | 
| 535 541 | 
             
            {
         | 
| 536 | 
            -
                rho::String strAppUrl = getAppBackUrl();
         | 
| 542 | 
            +
                //rho::String strAppUrl = getAppBackUrl();
         | 
| 537 543 |  | 
| 538 | 
            -
                if (  | 
| 539 | 
            -
                     | 
| 544 | 
            +
                if ( m_strAppBackUrlOrig.length() > 0 )
         | 
| 545 | 
            +
                    loadUrl(m_strAppBackUrlOrig);
         | 
| 540 546 | 
             
                else if ( strcasecmp(getCurrentUrl().c_str(),getStartUrl().c_str()) != 0 )
         | 
| 541 547 | 
             
                    rho_webview_navigate_back();
         | 
| 542 548 | 
             
            }
         | 
| @@ -700,18 +706,16 @@ void CRhodesApp::callScreenRotationCallback(int width, int height, int degrees) | |
| 700 706 | 
             
            void CRhodesApp::loadUrl(String url)
         | 
| 701 707 | 
             
            {
         | 
| 702 708 | 
             
                boolean callback = false;
         | 
| 703 | 
            -
                if ( | 
| 709 | 
            +
                if (String_startsWith(url, "callback:") )
         | 
| 704 710 | 
             
                {
         | 
| 705 711 | 
             
                    callback = true;
         | 
| 706 712 | 
             
                    url = url.substr(9);
         | 
| 707 713 | 
             
                }
         | 
| 708 | 
            -
                 | 
| 709 | 
            -
                url = s;
         | 
| 710 | 
            -
                free(s);
         | 
| 714 | 
            +
                url = canonicalizeRhoUrl(url);
         | 
| 711 715 | 
             
                if (callback)
         | 
| 712 716 | 
             
                {
         | 
| 713 717 | 
             
                    common::CAutoPtr<net::INetRequest> pNetRequest = m_ptrFactory->createNetRequest();
         | 
| 714 | 
            -
                    NetResponse(resp, pNetRequest-> | 
| 718 | 
            +
                    NetResponse(resp, pNetRequest->pushData( url,  "rho_callback=1", null ));
         | 
| 715 719 | 
             
                    (void)resp;
         | 
| 716 720 | 
             
                }
         | 
| 717 721 | 
             
                else
         |