From edac78eadc5ddceb17b93bffa101eeffbab4437c Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 30 Jun 2010 18:02:53 +0100 Subject: correct startup behaviour in place --- src/familiar-players-db.vala | 3 +- src/music-player-bridge.vala | 74 ++++++++++++++++++++++++++++---------------- src/player-controller.vala | 25 ++++++++++----- 3 files changed, 67 insertions(+), 35 deletions(-) diff --git a/src/familiar-players-db.vala b/src/familiar-players-db.vala index 88bc01f..b83caa3 100644 --- a/src/familiar-players-db.vala +++ b/src/familiar-players-db.vala @@ -143,7 +143,8 @@ public class FamiliarPlayersDB : GLib.Object public bool already_familiar(string desktop) { - return this.players_DB.get(desktop); + debug("playerDB->already_familiar - result %s", this.players_DB.keys.contains(desktop).to_string()); + return this.players_DB.keys.contains(desktop); } public Gee.Set records() diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index 07eef2a..84bf3df 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -44,32 +44,26 @@ public class MusicPlayerBridge : GLib.Object } private void try_to_add_inactive_familiar_clients(){ - // for now just use one of the entries. int count = 0; foreach(string app in this.playersDB.records()){ if(count == 0){ - debug("we have found %s", app); if(app == null){ - debug("moving on to next player"); + warning("App string in keyfile is null therefore moving on to next player"); continue; } - string[] bits = app.split("/"); - if(bits.length < 2){ - continue; - } - debug("trying to dig deeper %s", app); try{ - string app_name = bits[bits.length -1].split(".")[0]; - debug("we have found %s", app_name); - PlayerController ctrl = new PlayerController(this.root_menu, - app_name, - false); - this.registered_clients.set(app_name, ctrl); DesktopAppInfo info = new DesktopAppInfo.from_filename(app); + if(info == null){ + warning("Could not create a desktopappinfo instance from app: %s", app); + continue; + } GLib.AppInfo app_info = info as GLib.AppInfo; - - debug("Display name = %s", app_info.get_display_name()); - app_info.launch(null, null); + PlayerController ctrl = new PlayerController(this.root_menu, + app_info.get_name(), + app_info); + ctrl.set("active", false); + this.registered_clients.set(app_info.get_name().down().strip(), ctrl); + debug("Created a player controller for %s which was found in the cache file", app_info.get_name().down().strip()); count += 1; } catch(Error er){ @@ -84,13 +78,24 @@ public class MusicPlayerBridge : GLib.Object { debug("MusicPlayerBridge -> on_server_added with value %s", type); if(server_is_not_of_interest(type)) return; - string client_name = type.split(".")[1]; + string client_name = type.split(".")[1]; if (root_menu != null && client_name != null){ - listener_get_server_property_cb cb = (listener_get_server_property_cb)desktop_info_callback; - this.listener.server_get_desktop(object, cb, this); - PlayerController ctrl = new PlayerController(root_menu, client_name, true); - registered_clients.set(client_name, ctrl); - debug("client of name %s has successfully registered with us", client_name); + // If we have an instance already for this player, ensure it is switched to active + if(this.registered_clients.keys.contains(client_name)){ + debug("It figured out that it already has an instance for this player already"); + this.registered_clients[client_name].set("active", true); + } + //else init a new one + else{ + PlayerController ctrl = new PlayerController(root_menu, client_name); + registered_clients.set(client_name, ctrl); + debug("New Client of name %s has successfully registered with us", client_name); + } + // irregardless check that it has a desktop file if not kick off a request for it + if(this.registered_clients[client_name].app_info == null){ + listener_get_server_property_cb cb = (listener_get_server_property_cb)desktop_info_callback; + this.listener.server_get_desktop(object, cb, this); + } } } @@ -122,12 +127,18 @@ public class MusicPlayerBridge : GLib.Object MusicPlayerBridge bridge = data as MusicPlayerBridge; // Not the most secure validation // TODO revisit validation mechanism - if(path.contains("/")){ - debug("About to store desktop file path: %s", path); + if(path.contains("/") && bridge.playersDB.already_familiar(path) == false){ + debug("About to store desktop file path: %s", path); bridge.playersDB.insert(path); + AppInfo? app_info = create_app_info(path); + if(app_info != null){ + PlayerController ctrl = bridge.registered_clients[app_info.get_name().down().strip()]; + ctrl.set("app_info", app_info); + debug("successfully created appinfo from path and set it on the respective instance"); + } } else{ - debug("Ignoring desktop file path: %s", path); + debug("Ignoring desktop file path because its either invalid of the db cache file has it already: %s", path); } } @@ -156,6 +167,17 @@ public class MusicPlayerBridge : GLib.Object debug("MusicPlayerBridge -> indicator_modified with vale %s", s ); } + public static AppInfo? create_app_info(string path) + { + DesktopAppInfo info = new DesktopAppInfo.from_filename(path); + if(path == null){ + warning("Could not create a desktopappinfo instance from app: %s", path); + return null; + } + GLib.AppInfo app_info = info as GLib.AppInfo; + return app_info; + } + } diff --git a/src/player-controller.vala b/src/player-controller.vala index 0d8dc01..dfc2659 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -27,19 +27,20 @@ public class PlayerController : GLib.Object private const int TRANSPORT = 3; private Dbusmenu.Menuitem root_menu; - private string name; - private bool is_active; + public string name { get; set;} + public bool active { get; set;} public ArrayList custom_items; private MprisController mpris_adaptor; - private string desktop_path; - - public PlayerController(Dbusmenu.Menuitem root, string client_name, bool active) + public AppInfo app_info { get; set;} + + public PlayerController(Dbusmenu.Menuitem root, string client_name, AppInfo? info = null) { this.root_menu = root; this.name = format_client_name(client_name.strip()); - this.is_active = active; this.custom_items = new ArrayList(); + this.app_info = info; self_construct(); + //app_info.launch(null, null); // Temporary scenario to handle both v1 and v2 of MPRIS. if(this.name == "Vlc"){ @@ -61,6 +62,14 @@ public class PlayerController : GLib.Object root_menu.child_delete(item); } } + + //public void switch_active(bool active){ + // this.is_active = active; + //} + + //public bool has_app_info(){ + // return (this.app_info != null); + //} private bool self_construct() { @@ -84,7 +93,7 @@ public class PlayerController : GLib.Object } return true; } - + private static string format_client_name(string client_name) { string formatted = client_name; @@ -94,5 +103,5 @@ public class PlayerController : GLib.Object } return formatted; } - + } \ No newline at end of file -- cgit v1.2.3