aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConor Curran <conor.curran@canonical.com>2010-06-30 18:02:53 +0100
committerConor Curran <conor.curran@canonical.com>2010-06-30 18:02:53 +0100
commitedac78eadc5ddceb17b93bffa101eeffbab4437c (patch)
tree43b5c9e5b7208e9c7cfea6c75fa927764bd4bda3
parent2d1c2058a7384a6dc0d4c1b900e223b6905df4c6 (diff)
downloadayatana-indicator-sound-edac78eadc5ddceb17b93bffa101eeffbab4437c.tar.gz
ayatana-indicator-sound-edac78eadc5ddceb17b93bffa101eeffbab4437c.tar.bz2
ayatana-indicator-sound-edac78eadc5ddceb17b93bffa101eeffbab4437c.zip
correct startup behaviour in place
-rw-r--r--src/familiar-players-db.vala3
-rw-r--r--src/music-player-bridge.vala74
-rw-r--r--src/player-controller.vala25
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<string> 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<PlayerItem> 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<PlayerItem>();
+ 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