Author: titmuss
Date: Wed Jun 18 03:33:44 2008
New Revision: 2584

URL: http://svn.slimdevices.com?rev=2584&root=Jive&view=rev
Log:
Bug: 6683
Description:
Keep state for the currentServer, and fix some state transitions.


Modified:
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua?rev=2584&root=Jive&r1=2583&r2=2584&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
 Wed Jun 18 03:33:44 2008
@@ -159,12 +159,8 @@
 local function _squeezeCenterCleanup(self)
        local now = Framework:getTicks()
 
-       local currentPlayer = Player:getCurrentPlayer()
-       local currentServer = currentPlayer and currentPlayer:getSlimServer()
-
        for i, server in SlimServer.iterate() do
                if not server:isConnected() and
-                       currentServer ~= server and
                        now - server:getLastSeen() > DISCOVERY_TIMEOUT then
                
                        log:info("Removing server ", server)
@@ -342,9 +338,7 @@
        log:info("----")
        log:info("State: ", self.state)
        log:info("CurrentPlayer: ", currentPlayer)
-       if currentPlayer then
-               log:info("CurrentServer: ", currentPlayer:getSlimServer())
-       end
+       log:info("CurrentServer: ", SlimServer:getCurrentServer())
        log:info("Servers:")
        for i, server in SlimServer.iterate() do
                log:info("\t", server:getName(), " [", server:getIpPort(), "] 
connected=", server:isConnected(), " timeout=", DISCOVERY_TIMEOUT - (now - 
server:getLastSeen()))
@@ -375,8 +369,7 @@
 
 -- disconnect from idle servers
 function _idleDisconnect(self)
-       local currentPlayer = Player:getCurrentPlayer()
-       local currentServer = currentPlayer and currentPlayer:getSlimServer()
+       local currentServer = SlimServer:getCurrentServer()
 
        for i, server in SlimServer:iterate() do
                if server ~= currentServer then

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua?rev=2584&root=Jive&r1=2583&r2=2584&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
 Wed Jun 18 03:33:44 2008
@@ -31,7 +31,7 @@
 
 
 -- stuff we need
-local _assert, assert, setmetatable, tonumber, tostring, pairs, type = 
_assert, assert, setmetatable, tonumber, tostring, pairs, type
+local _assert, assert, require, setmetatable, tonumber, tostring, pairs, type 
= _assert, assert, require, setmetatable, tonumber, tostring, pairs, type
 
 local os             = require("os")
 local math           = require("math")
@@ -73,6 +73,10 @@
 module(..., oo.class)
 
 
+-- we must load this after the module declartion to dependancy loops
+local SlimServer     = require("jive.slim.SlimServer")
+
+
 local DEVICE_IDS = {
        [4] = "squeezebox2",
        [5] = "transporter",
@@ -106,12 +110,15 @@
 
 -- class method, sets the current player
 function setCurrentPlayer(class, player)
-       -- is the current player still active?
-       if currentPlayer and currentPlayer ~= player and currentPlayer.lastSeen 
== 0 then
-               playerList[currentPlayer.id] = nil
-       end
+       local lastCurrentPlayer = currentPlayer
 
        currentPlayer = player
+       SlimServer:setCurrentServer(currentPlayer and currentPlayer.slimServer 
or nil)
+
+       -- is the last current player still active?
+       if lastCurrentPlayer and lastCurrentPlayer.lastSeen == 0 then
+               lastCurrentPlayer:free()
+       end
 
        -- notify even if the player has not changed
        jnt:notify("playerCurrent", currentPlayer)
@@ -275,14 +282,13 @@
                -- callback happens.
                oldInfo.connected = false
 
-               -- player is now available
-               playerList[self.id] = self
-
                -- add to new server
                log:info(self, " new for ", slimServer)
                self.slimServer = slimServer
                self.slimServer:_addPlayer(self)
 
+               -- player is now available
+               playerList[self.id] = self
                self.jnt:notify('playerNew', self)
        end
 
@@ -328,7 +334,6 @@
 
        -- player is now available
        playerList[self.id] = self
-
        self.jnt:notify('playerNew', self)
 end
 
@@ -365,7 +370,6 @@
 
        -- player is now available
        playerList[self.id] = self
-
        self.jnt:notify('playerNew', self)
 end
 
@@ -384,19 +388,21 @@
                return
        end
 
-       -- player is now longer seen
+       log:info(self, " delete for ", self.slimServer)
+
+       -- player is gone
        self.lastSeen = 0
-
-       log:info(self, " delete for ", self.slimServer)
-
-       if self ~= currentPlayer then
-               -- player is no longer active
-               playerList[self.id] = nil
-       end
-
        self.jnt:notify('playerDelete', self)
+
+       if self == currentPlayer then
+               -- dont' delete state if this is the current player
+               return
+       end
+
+       -- player is no longer active
+       playerList[self.id] = nil
        
-       if self.slimServer and self ~= currentPlayer then
+       if self.slimServer then
                self:offStage()
 
                self.slimServer:_deletePlayer(self)

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua?rev=2584&root=Jive&r1=2583&r2=2584&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
 Wed Jun 18 03:33:44 2008
@@ -32,7 +32,7 @@
 
 -- our stuff
 local _assert, assert, tostring, type, tonumber = _assert, assert, tostring, 
type, tonumber
-local pairs, ipairs, setmetatable = pairs, ipairs, setmetatable
+local pairs, ipairs, require, setmetatable = pairs, ipairs, require, 
setmetatable
 
 local os          = require("os")
 local table       = require("jive.utils.table")
@@ -42,7 +42,6 @@
 
 local Comet       = require("jive.net.Comet")
 local HttpPool    = require("jive.net.HttpPool")
-local Player      = require("jive.slim.Player")
 local Surface     = require("jive.ui.Surface")
 local RequestHttp = require("jive.net.RequestHttp")
 local SocketHttp  = require("jive.net.SocketHttp")
@@ -62,6 +61,10 @@
 module(..., oo.class)
 
 
+-- we must load this after the module declartion to dependancy loops
+local Player      = require("jive.slim.Player")
+
+
 -- list of servers index by id. this weak table is used to enforce
 -- object equality with the server name.
 local serverIds = {}
@@ -70,6 +73,9 @@
 -- list of servers, that are active
 local serverList = {}
 
+-- current server
+local currentServer = nil
+
 -- credential list for http auth
 local credentials = {}
 
@@ -77,6 +83,25 @@
 -- class function to iterate over all SqueezeCenters
 function iterate(class)
        return pairs(serverList)
+end
+
+
+-- class method to return current server
+function getCurrentServer(class)
+       return currentServer
+end
+
+
+-- class method to set the current server
+function setCurrentServer(class, server)
+       lastCurrentServer = currentServer
+
+       currentServer = server
+
+       -- is the current server still active, it not clean up?
+       if lastCurrentServer and lastCurrentServer.lastSeen == 0 then
+               lastCurrentServer:free()
+       end
 end
 
 
@@ -244,7 +269,7 @@
                jnt = jnt,
 
                -- connection stuff
-               lastSeen = false,
+               lastSeen = 0,
                ip = false,
                port = false,
 
@@ -300,9 +325,6 @@
 
        -- task to fetch artwork while browsing
        obj.artworkFetchTask = Task("artwork", obj, processArtworkQueue)
-
-       -- notify we're here by caller in SlimServers
-       jnt:notify('serverNew', obj)
        
        return obj
 end
@@ -352,9 +374,14 @@
                end
        end
 
+       local oldLastSeen = self.lastSeen
+       self.lastSeen = Framework:getTicks()
+
        -- server is now active
-       serverList[self.id] = self
-       self.lastSeen = Framework:getTicks()
+       if oldLastSeen == 0  then
+               serverList[self.id] = self
+               self.jnt:notify('serverNew', self)
+       end
 end
 
 
@@ -369,22 +396,27 @@
 function free(self)
        log:debug(self, ":free")
 
-       -- notify we're gone
-       self.jnt:notify("serverDelete", self)
-               
        -- clear cache
        self.artworkCache:free()
        self.artworkThumbIcons = {}
 
+       -- server is gone
+       self.lastSeen = 0
+       self.jnt:notify("serverDelete", self)
+               
+       -- close connections
+       self:disconnect()
+
+       if self == currentServer then
+               -- dont' delete state if this is the current server
+               return
+       end
+
        -- delete players
        for id, player in pairs(self.players) do
                player:free(self)
        end
        self.players = {}
-
-       -- close connections
-       self.comet:disconnect()
-       self.artworkPool:close()
 
        -- server is no longer active
        serverList[self.id] = nil

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

Reply via email to