[Xfce4-commits] <parole:master> Implement exiting D-Bus signal to notify the plugin that the backend is exiting.

Ali Abdallah noreply at xfce.org
Thu Nov 26 10:16:08 CET 2009


Updating branch refs/heads/master
         to 6b76bf031b436d1da4ada61217fb54b1a40fc00c (commit)
       from f002921a75d690d4f7cead227d5e9d9c67008bc6 (commit)

commit 6b76bf031b436d1da4ada61217fb54b1a40fc00c
Author: Ali Abdallah <ali at ali-xfce.org>
Date:   Thu Nov 26 10:12:32 2009 +0100

    Implement exiting D-Bus signal to notify the plugin that
    the backend is exiting.

 browser-plugin/media-plugin/main.c                 |    1 -
 .../media-plugin/org.parole.media.plugin.xml       |    3 ++
 browser-plugin/media-plugin/parole-plugin-player.c |   39 ++++++++++++++++++--
 browser-plugin/media-plugin/parole-plugin-player.h |    8 +++--
 browser-plugin/plugin.cpp                          |   28 ++++++++++++--
 browser-plugin/plugin.h                            |    3 +-
 6 files changed, 69 insertions(+), 13 deletions(-)

diff --git a/browser-plugin/media-plugin/main.c b/browser-plugin/media-plugin/main.c
index 9004474..8a8215c 100644
--- a/browser-plugin/media-plugin/main.c
+++ b/browser-plugin/media-plugin/main.c
@@ -128,7 +128,6 @@ int main (int argc, char **argv)
         g_error_free (error);
     }
 
-    
     parole_plugin_player_play (player);
     
     gtk_main ();
diff --git a/browser-plugin/media-plugin/org.parole.media.plugin.xml b/browser-plugin/media-plugin/org.parole.media.plugin.xml
index de8762a..42ed852 100644
--- a/browser-plugin/media-plugin/org.parole.media.plugin.xml
+++ b/browser-plugin/media-plugin/org.parole.media.plugin.xml
@@ -14,5 +14,8 @@
     <method name="Ping">
     </method>
     
+    <signal name="Exiting">
+    </signal>
+    
     </interface>
 </node>
diff --git a/browser-plugin/media-plugin/parole-plugin-player.c b/browser-plugin/media-plugin/parole-plugin-player.c
index a3ced75..852d767 100644
--- a/browser-plugin/media-plugin/parole-plugin-player.c
+++ b/browser-plugin/media-plugin/parole-plugin-player.c
@@ -56,7 +56,7 @@ static void parole_plugin_player_get_property (GObject *object,
 					       GParamSpec *pspec);
 
 #define PAROLE_PLUGIN_PLAYER_GET_PRIVATE(o) \
-(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_PLUGINPLAYER, ParolePluginPlayerPrivate))
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_PLUGIN_PLAYER, ParolePluginPlayerPrivate))
 
 static GTimer *idle_timer = NULL;
 static GThread *idle_thread = NULL;
@@ -95,6 +95,14 @@ enum
     PROP_URL
 };
 
+enum
+{
+    SIG_EXITING,
+    LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0 };
+    
 G_DEFINE_TYPE (ParolePluginPlayer, parole_plugin_player, G_TYPE_OBJECT)
 
 static void
@@ -640,6 +648,7 @@ static gpointer *check_idle_thread (gpointer data)
 	if ( g_timer_elapsed (idle_timer, NULL ) > 60.f )
 	{
 	    g_debug ("Idle timeout expired, exiting...");
+	    g_signal_emit (player, signals [SIG_EXITING], 0);
 	    g_debug ("Here");
 	    gtk_main_quit ();
 	    g_debug ("Yalla");
@@ -651,17 +660,39 @@ static gpointer *check_idle_thread (gpointer data)
 }
 
 static void
+parole_plugin_player_dispose (GObject *object)
+{
+    ParolePluginPlayer *player;
+    
+    player = PAROLE_PLUGIN_PLAYER (object);
+    
+    g_signal_emit (player, signals [SIG_EXITING], 0);
+    
+    G_OBJECT_CLASS (parole_plugin_player_parent_class)->dispose (object);
+}
+
+static void
 parole_plugin_player_class_init (ParolePluginPlayerClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
     object_class->finalize = parole_plugin_player_finalize;
+    object_class->dispose = parole_plugin_player_dispose;
 
     object_class->get_property = parole_plugin_player_get_property;
     object_class->set_property = parole_plugin_player_set_property;
 
     object_class->constructed = parole_plugin_player_construct;
     
+    signals[SIG_EXITING] = 
+        g_signal_new ("exiting",
+                      PAROLE_TYPE_PLUGIN_PLAYER,
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (ParolePluginPlayerClass, exiting),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__VOID,
+                      G_TYPE_NONE, 0, G_TYPE_NONE);
+    
     
     g_object_class_install_property (object_class,
                                      PROP_PLUG,
@@ -802,8 +833,8 @@ parole_plugin_player_stop_idle (gpointer data)
     
     player = PAROLE_PLUGIN_PLAYER (data);
     
-    if (player->priv->gst )
-	parole_gst_stop (player->priv->gst);
+    if (player->priv->gst)
+	parole_gst_terminate (player->priv->gst);
 	
     return FALSE;
 }
@@ -813,7 +844,7 @@ parole_plugin_player_new (GtkWidget *plug, gchar *url)
 {
     ParolePluginPlayer *player = NULL;
     
-    player = g_object_new (PAROLE_TYPE_PLUGINPLAYER, 
+    player = g_object_new (PAROLE_TYPE_PLUGIN_PLAYER, 
 			   "plug", plug, 
 			   "url", url, 
 			   NULL);
diff --git a/browser-plugin/media-plugin/parole-plugin-player.h b/browser-plugin/media-plugin/parole-plugin-player.h
index d92dbf0..bc3d506 100644
--- a/browser-plugin/media-plugin/parole-plugin-player.h
+++ b/browser-plugin/media-plugin/parole-plugin-player.h
@@ -25,9 +25,9 @@
 
 G_BEGIN_DECLS
 
-#define PAROLE_TYPE_PLUGINPLAYER        (parole_plugin_player_get_type () )
-#define PAROLE_PLUGIN_PLAYER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_PLUGINPLAYER, ParolePluginPlayer))
-#define PAROLE_IS_PLUGINPLAYER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_PLUGINPLAYER))
+#define PAROLE_TYPE_PLUGIN_PLAYER        (parole_plugin_player_get_type () )
+#define PAROLE_PLUGIN_PLAYER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_PLUGIN_PLAYER, ParolePluginPlayer))
+#define PAROLE_IS_PLUGIN_PLAYER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_PLUGIN_PLAYER))
 
 typedef struct ParolePluginPlayerPrivate ParolePluginPlayerPrivate;
 
@@ -43,6 +43,8 @@ typedef struct
 {
     GObjectClass 			 parent_class;
     
+    void				(*exiting)			      (ParolePluginPlayer *player);
+    
 } ParolePluginPlayerClass;
 
 GType        				 parole_plugin_player_get_type        (void) G_GNUC_CONST;
diff --git a/browser-plugin/plugin.cpp b/browser-plugin/plugin.cpp
index 3fe6603..b68859c 100644
--- a/browser-plugin/plugin.cpp
+++ b/browser-plugin/plugin.cpp
@@ -77,6 +77,7 @@ CPlugin::CPlugin (NPP pNPInstance)
     url = NULL;
     bus = NULL;
     proxy = NULL;
+    process_exiting = FALSE;
 }
 
 void CPlugin::StopPlayer()
@@ -86,7 +87,7 @@ void CPlugin::StopPlayer()
     if ( !proxy )
 	GetProxy ();
     
-    if ( proxy )
+    if ( proxy && !process_exiting)
     {
 	do
 	{
@@ -120,7 +121,7 @@ void CPlugin::StopPlayer()
 	    else
 		break;
 	    
-	} while (num_tries  < 4 );
+	} while (num_tries  < 4  && process_exiting != TRUE);
     }   
     
 }
@@ -129,7 +130,7 @@ CPlugin::~CPlugin()
 {
     g_debug ("Destructor");
     
-    if ( ping_id ) 
+    if ( ping_id != 0 ) 
 	g_source_remove (ping_id);
     
     StopPlayer ();
@@ -204,6 +205,19 @@ ping_process (gpointer data)
     return TRUE;
 }
 
+
+static void
+process_exiting_cb (DBusGProxy *proxy, gpointer data)
+{
+    CPlugin *plugin;
+    
+    plugin = (CPlugin *) data;
+    g_debug ("Process exiting");
+    plugin->process_exiting = TRUE;
+    g_source_remove (plugin->ping_id);
+    plugin->ping_id = 0;
+}
+
 void CPlugin::GetProxy ()
 {
     g_return_if_fail (proxy == NULL);
@@ -221,7 +235,13 @@ void CPlugin::GetProxy ()
 					   "org.Parole.Media.Plugin");
 	if ( !proxy ) 
 	    g_critical ("Unable to create proxy for %s", dbus_name);
-	    
+	else
+	{
+	    dbus_g_proxy_add_signal (proxy, "exiting", G_TYPE_INVALID);
+	    dbus_g_proxy_connect_signal (proxy, "exiting",
+					 G_CALLBACK (process_exiting_cb), this, NULL);
+	}
+	
 	g_free (dbus_name);
     }
 }
diff --git a/browser-plugin/plugin.h b/browser-plugin/plugin.h
index f31f1e5..a89feb9 100644
--- a/browser-plugin/plugin.h
+++ b/browser-plugin/plugin.h
@@ -87,12 +87,13 @@ class CPlugin {
     gchar           *url;
     Window           window;
     GPid	     child_pid;
-    gulong	     ping_id;
     
   public:
     NPP mInstance;
     uint16 mode;
     gchar *mimetype;
+    gboolean process_exiting;
+    gulong	     ping_id;
 
 };
 



More information about the Xfce4-commits mailing list