Author: titmuss
Date: Thu Jan 17 15:49:04 2008
New Revision: 1495

URL: http://svn.slimdevices.com?rev=1495&root=Jive&view=rev
Log:
Bug: N/A
Description:
Allow the player to move between servers in the Music Source menu. This is work 
in 
progress, it usually works ok.


Modified:
    
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
    trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt
    trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua
    trunk/jive/src/pkg/jive/share/jive/slim/Player.lua
    trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.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=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- 
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
 (original)
+++ 
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
 Thu Jan 17 15:49:04 2008
@@ -39,9 +39,13 @@
 local Popup         = require("jive.ui.Popup")
 local Icon          = require("jive.ui.Icon")
 
+local debug         = require("jive.utils.debug")
 local log           = require("jive.utils.log").logger("applets.setup")
 
 local EVENT_WINDOW_POP = jive.ui.EVENT_WINDOW_POP
+local EVENT_KEY_PRESS  = jive.ui.EVENT_KEY_PRESS
+local EVENT_CONSUME    = jive.ui.EVENT_CONSUME
+local EVENT_UNUSED     = jive.ui.EVENT_UNUSED
 
 local jnt           = jnt
 local jiveMain      = jiveMain
@@ -98,6 +102,10 @@
        }
        menu:addItem(item)
 
+       --[[
+       -- Remove auto discovery, most of the time Jive now is only
+       -- connected to the same server as the current player, so
+       -- this is less relevant.
        item = {
                text = self:string("SLIMSERVER_AUTO_DISCOVERY"),
                sound = "WINDOWSHOW",
@@ -114,6 +122,7 @@
                weight = 4 
        }
        menu:addItem(item)
+       --]]
 
        -- Discover slimservers in this window
        window:addTimer(1000, function() self.sdApplet:discover() end)
@@ -150,14 +159,12 @@
        local  currentPlayer = self.sdApplet:getCurrentPlayer()
        if currentPlayer then
                local currentServer = currentPlayer:getSlimServer()
-               local thisServer = id .. ':' .. (port or 0)
-               if currentServer.id == thisServer then
+               if currentServer:getIpPort() == id then
                        item.style = 'checked'
                end
        end
 
        self.serverMenu:addItem(item)
-
        self.serverList[id] = item
 end
 
@@ -165,7 +172,7 @@
 function _delServerItem(self, id, server)
        -- remove entry
        if self.serverList[id] then
-               server.serverMenu:removeItem(self.serverList[id])
+               self.serverMenu:removeItem(self.serverList[id])
                self.serverList[id] = nil
        end
 
@@ -182,7 +189,19 @@
        local window = Window("window", name)
        local menu = SimpleMenu("menu", items)
 
+       local currentPlayer = self.sdApplet:getCurrentPlayer()
+
        if server then
+               if server and currentPlayer and currentPlayer:getSlimServer() 
~= server then
+                       menu:addItem({
+                                            text = 
self:string("SLIMSERVER_CONNECT", name),
+                                            callback = function()
+                                                               
self:connectPlayer(currentPlayer, server)
+                                                               window:hide()
+                                                       end
+                                    })
+               end
+
                menu:addItem({
                                     text = self:string("SLIMSERVER_ADDRESS"),
                                     icon = Label("value", table.concat({ 
server:getIpPort() }, ":"))
@@ -211,18 +230,115 @@
 
 
 function notify_serverNew(self, server)
-       log:debug("server new", server)
-
        local id = server:getIpPort()
        self:_addServerItem(id, server)
 end
 
 
 function notify_serverDelete(self, server)
-       log:debug("server delete", server)
-
        local id = server:getIpPort()
        self:_delServerItem(id, server)
+end
+
+
+function _updateServerList(self, server)
+       for id, item in pairs(self.serverList) do
+               if server and server:getIpPort() == id then
+                       item.style = 'checked'
+               else
+                       item.style = nil
+               end
+               self.serverMenu:updatedItem(item)
+       end
+end
+
+
+function notify_playerNew(self, player)
+       local currentPlayer = self.sdApplet:getCurrentPlayer()
+       if player ~= currentPlayer then
+               return
+       end
+
+       _updateServerList(self, player:getSlimServer())
+end
+
+
+function notify_playerDelete(self, player)
+       local currentPlayer = self.sdApplet:getCurrentPlayer()
+       if player ~= currentPlayer then
+               return
+       end
+
+       _updateServerList(self, player:getSlimServer())
+end
+
+
+function notify_playerCurrent(self, player)
+       _updateServerList(self, player and player:getSlimServer())
+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})
+
+
+       local window = Popup("popupIcon")
+       window:addWidget(Icon("iconConnecting"))
+
+       local statusLabel = Label("text", 
self:string("SLIMSERVER_CONNECTING_TO", server:getName()))
+       window:addWidget(statusLabel)
+
+       -- disable key presses
+       window:addListener(EVENT_KEY_PRESS,
+                          function(event)
+                                  return EVENT_CONSUME
+                          end)
+
+       local timeout = 1
+       window:addTimer(1000,
+                       function()
+                               -- scan all servers waiting for the player
+                               self.sdApplet:discover()
+
+                               if player:getSlimServer() == server then
+                                       self:_connectPlayerDone(player, server)
+                               end
+
+                               timeout = timeout + 1
+                               if timeout == 60 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)
+end
+
+
+-- failed to connect player to server
+function _connectPlayerFailed(self, player, server)
+       log:warn("FAILED")
 end
 
 

Modified: trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt
URL: 
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt 
(original)
+++ trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt Thu Jan 
17 15:49:04 2008
@@ -66,3 +66,21 @@
        IT      Immettere l'indirizzo IP del computer in cui è in esecuzione 
SqueezeCenter
        NL      Voer het IP-adres in van de computer waarop SqueezeCenter wordt 
uitgevoerd
 
+SLIMSERVER_CONNECTING_TO
+       DE      Verbindung mit\n%s
+       EN      Connecting to\n%s
+       ES      Estableciendo conexión a\n%s
+       FR      Connexion à\n%s
+       IT      Connessione a\n%s\nin corso
+       NL      Bezig verbinding te maken met\n%s
+
+SLIMSERVER_CONNECTED_TO
+       DE      Verbunden mit\n%s
+       EN      Connected to\n%s
+       ES      Conexión a\n%s\nestablecida
+       FR      Connecté à\n%s
+       IT      Connesso a\n%s
+       NL      Verbonden met\n%s
+
+SLIMSERVER_CONNECT
+       EN      Use %s

Modified: 
trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua
URL: 
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua 
(original)
+++ trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua 
Thu Jan 17 15:49:04 2008
@@ -140,7 +140,7 @@
 function setCurrentPlayer(self, player)
        local settings = self:getSettings()
 
-       if settings.currentPlayer ~= player then
+       if player and settings.currentPlayer ~= player then
                settings.currentPlayer = player and player.id or false
                self:storeSettings()
        end
@@ -179,9 +179,7 @@
 -- notify_playerNew
 -- this is called by jnt when the playerNew message is sent
 function notify_playerNew(self, player)
-       log:warn("playerNew ", player)
-
-       if not self.currentPlayer then
+       if not self:getCurrentPlayer() then
                local settings = self:getSettings()
 
                if settings.currentPlayer == player.id then
@@ -194,7 +192,7 @@
 -- notify_playerDelete
 -- this is called by jnt when the playerDelete message is sent
 function notify_playerDelete(self, player)
-       if self.currentPlayer == player then
+       if self:getCurrentPlayer() == player then
                self:setCurrentPlayer(nil)
        end
 end

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=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/jive/slim/Player.lua (original)
+++ trunk/jive/src/pkg/jive/share/jive/slim/Player.lua Thu Jan 17 15:49:04 2008
@@ -63,6 +63,10 @@
 
 -- jive.slim.Player is a base class
 module(..., oo.class)
+
+
+-- list of players index by id.
+local players = {}
 
 
 -- _getSink
@@ -173,11 +177,21 @@
 =cut
 --]]
 
-function __init(self, slimServer, jnt, playerInfo)
+function __init(self, jnt, slimServer, playerInfo)
        log:debug("Player:__init(", playerInfo.playerid, ")")
 
-       _assert(slimServer, "Cannot create Player without SlimServer object")
-       
+       _assert(slimServer, "Needs slimServer")
+       _assert(playerInfo, "Needs playerInfo")
+
+       -- Only create one player object per id. This avoids duplicates
+       -- when moving between servers
+
+       local obj = players[playerInfo.playerid]
+       if  obj then
+               obj:update(slimServer, playerInfo)
+               return obj
+       end
+
        local obj = oo.rawnew(self,{
                
                lastSeen = os.time(),
@@ -202,6 +216,8 @@
                currentSong = {}
        })
 
+       players[obj.id] = obj
+
        -- notify of new player
        jnt:notify('playerNew', obj)
 
@@ -211,13 +227,30 @@
 
 --[[
 
-=head2 jive.slim.Player:updateFromSS(playerInfo)
+=head2 jive.slim.Player:update(playerInfo)
 
 Updates the player with fresh data from SS.
 
 =cut
 --]]
-function updateFromSS(self, playerInfo)
+function update(self, slimServer, playerInfo)
+       -- ignore updates from a different server if the player
+       -- is not connected to it
+       if self.slimServer ~= slimServer 
+               and playerInfo.connected ~= 1 then
+               return
+       end
+
+       if self.slimServer ~= slimServer then
+               -- delete from old server
+               if self.slimServer then
+                       self.jnt:notify('playerDelete', self)
+               end
+
+               -- add to new server
+               self.slimServer = slimServer
+               self.jnt:notify('playerNew', self)
+       end
        
        self.model = playerInfo.model
        self.needsUpgrade = (tonumber(playerInfo.player_needs_upgrade) == 1)
@@ -230,7 +263,6 @@
        if self.pin and not playerInfo.pin then
                self.pin = nil
        end
-
 end
 
 --[[
@@ -298,9 +330,10 @@
 --]]
 function free(self)
        self.jnt:notify('playerDelete', self)
-
        self:offStage()
-       -- caller has to notify we're gone
+
+       -- FIXME we can't free players, maybe used by other servers
+       -- players[self.id] = nil
 end
 
 

Modified: trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua
URL: 
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua (original)
+++ trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua Thu Jan 17 15:49:04 
2008
@@ -142,13 +142,13 @@
                        -- create new players
                        if not self.players[player_info.playerid] then
                        
-                               player = Player(self, self.jnt, player_info)
+                               player = Player(self.jnt, self, player_info)
                        
                                self.players[player_info.playerid] = player
 
                        else
                                -- update existing players
-                               
self.players[player_info.playerid]:updateFromSS(player_info)
+                               self.players[player_info.playerid]:update(self, 
player_info)
                        end
                end
        else

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

Reply via email to