Author: titmuss
Date: Sat Jan 19 15:40:22 2008
New Revision: 1518

URL: http://svn.slimdevices.com?rev=1518&root=Jive&view=rev
Log:
Bug: N/A
Description:
Fix crasher in HomeMenu:hideToHome()
Use a weak table for the player instances. This is needed to ensure equality 
when moving 
between servers, and makes sure the slim server applet correctly detects when 
the player 
has moved.
Go directly to home when switching servers, do not collect $200.
Changing music source only works for ip3k players.


Modified:
    
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
    trunk/jive/src/pkg/jive/share/jive/slim/Player.lua
    trunk/jive/src/pkg/jive/share/jive/ui/HomeMenu.lua

Modified: 
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
URL: 
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua?rev=1518&root=Jive&r1=1517&r2=1518&view=diff
==============================================================================
--- 
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
 (original)
+++ 
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
 Sat Jan 19 15:40:22 2008
@@ -134,30 +134,34 @@
                self.serverMenu:removeItem(self.serverList[server:getIpPort()])
        end
 
-       local  currentPlayer = self.sdApplet:getCurrentPlayer()
+       local currentPlayer = self.sdApplet:getCurrentPlayer()
 
        -- new entry
        local item
-       if server and currentPlayer then
+       if server and currentPlayer and currentPlayer:canConnectToServer() then
+               local f = function()
+                                 self:connectPlayer(currentPlayer, server)
+                         end
+
                item = {
                        text = server:getName(),
                        sound = "WINDOWSHOW",
-                       callback = function()
-                                          self:connectPlayer(currentPlayer, 
server)
-                                  end,
+                       callback = f,
+                       connectFunc = f,
                        weight = 1
                }
-
-               -- check current player
-               if server == currentPlayer:getSlimServer() then
-                       item.style = 'checked'
-               end
        else
                item = {
                        text = server and server:getName() or address,
                        weight = 1,
                        style = 'itemNoAction'
                }
+       end
+
+       -- check current player
+       if server == currentPlayer:getSlimServer() then
+               item.style = 'checked' -- XXXX NoAction
+               item.callback = nil
        end
 
        self.serverMenu:addItem(item)
@@ -194,12 +198,19 @@
 end
 
 
-function _updateServerList(self, server)
+function _updateServerList(self, player)
+       local server = player and player:getSlimServer()
+
        for id, item in pairs(self.serverList) do
                if server == id then
-                       item.style = 'checked'
+                       item.style = 'checked' -- XXXX NoAction
+                       item.callback = nil
                else
                        item.style = nil
+
+                       if player and player:canConnectToServer() then
+                               item.callback = item.connectFunc
+                       end
                end
                self.serverMenu:updatedItem(item)
        end
@@ -207,12 +218,19 @@
 
 
 function notify_playerNew(self, player)
+       if player == self.waitForConnect.player
+               and player:getSlimServer() == self.waitForConnect.server then
+
+               self.waitForConnect = nil
+               jiveMain:closeToHome()
+       end
+
        local currentPlayer = self.sdApplet:getCurrentPlayer()
        if player ~= currentPlayer then
                return
        end
 
-       _updateServerList(self, player:getSlimServer())
+       _updateServerList(self, player)
 end
 
 
@@ -222,23 +240,23 @@
                return
        end
 
-       _updateServerList(self, player:getSlimServer())
+       _updateServerList(self, player)
 end
 
 
 function notify_playerCurrent(self, player)
-       _updateServerList(self, player and player:getSlimServer())
+       _updateServerList(self, player)
 end
 
 
 -- connect player to server
 function connectPlayer(self, player, server)
-       log:warn("connect ", player, " to ", server)
-
        -- tell the player to move servers
-       local ip, port = server:getIpPort()
-       player:send({'connect', ip})
-
+       self.waitForConnect = {
+               player = player,
+               server = server
+       }
+       player:connectToServer(server)
 
        local window = Popup("popupIcon")
        window:addWidget(Icon("iconConnecting"))
@@ -258,31 +276,13 @@
                                -- scan all servers waiting for the player
                                self.sdApplet:discover()
 
-                               if player:getSlimServer() == server then
-                                       self:_connectPlayerDone(player, server)
-                               end
+                               -- we detect when the connect to the new server
+                               -- with notify_playerNew
 
                                timeout = timeout + 1
                                if timeout == CONNECT_TIMEOUT then
                                        self:_connectPlayerFailed(player, 
server)
                                end
-                       end)
-
-       self:tieAndShowWindow(window)
-end
-
-
--- sucessfully connected player to server
-function _connectPlayerDone(self, player, server)
-       local window = Popup("popupIcon")
-       window:addWidget(Icon("iconConnected"))
-
-       local statusLabel = Label("text", 
self:string("SLIMSERVER_CONNECTED_TO", server:getName()))
-       window:addWidget(statusLabel)
-
-       window:addTimer(2000,
-                       function()
-                               window:hide()
                        end)
 
        self:tieAndShowWindow(window)

Modified: trunk/jive/src/pkg/jive/share/jive/slim/Player.lua
URL: 
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/jive/slim/Player.lua?rev=1518&root=Jive&r1=1517&r2=1518&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/jive/slim/Player.lua (original)
+++ trunk/jive/src/pkg/jive/share/jive/slim/Player.lua Sat Jan 19 15:40:22 2008
@@ -29,7 +29,7 @@
 local debug = require("jive.utils.debug")
 
 -- stuff we need
-local _assert, tonumber, tostring, pairs = _assert, tonumber, tostring, pairs
+local _assert, setmetatable, tonumber, tostring, pairs = _assert, 
setmetatable, tonumber, tostring, pairs
 
 local os             = require("os")
 local string         = require("string")
@@ -67,6 +67,7 @@
 
 -- list of players index by id.
 local players = {}
+setmetatable(players, { __mode = 'v' })
 
 
 -- _getSink
@@ -343,7 +344,8 @@
        self.jnt:notify('playerDelete', self)
        self:offStage()
 
-       players[self.id] = nil
+       -- The global players table uses weak values, it will be removed
+       -- when all references are freed.
 end
 
 
@@ -821,6 +823,20 @@
 end
 
 
+-- returns true if this player can connect to another server
+function canConnectToServer(self)
+       return self.model == "squeezebox2"
+               or self.model == "receiver"
+               or self.model == "transporter"
+end
+
+-- tell the player to connect to another server
+function connectToServer(self, server)
+       local ip, port = server:getIpPort()
+       self:send({'connect', ip})
+end
+
+
 function getConnected(self)
        return self.connected
 end

Modified: trunk/jive/src/pkg/jive/share/jive/ui/HomeMenu.lua
URL: 
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/jive/ui/HomeMenu.lua?rev=1518&root=Jive&r1=1517&r2=1518&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/jive/ui/HomeMenu.lua (original)
+++ trunk/jive/src/pkg/jive/share/jive/ui/HomeMenu.lua Sat Jan 19 15:40:22 2008
@@ -61,7 +61,7 @@
 
        local k = 1
        for i = 1, #stack do
-               if stack[i].alwaysOnTop and ~hideAlwaysOnTop then
+               if stack[i].alwaysOnTop and hideAlwaysOnTop == false then
                        k = i + 1
                end
 

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins

Reply via email to