graveman-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Graveman-cvs] Changes to graveman/current/src/cdrecord.c


From: sylvain cresto
Subject: [Graveman-cvs] Changes to graveman/current/src/cdrecord.c
Date: Sun, 20 Feb 2005 20:25:40 -0500

Index: graveman/current/src/cdrecord.c
diff -u graveman/current/src/cdrecord.c:1.20 
graveman/current/src/cdrecord.c:1.21
--- graveman/current/src/cdrecord.c:1.20        Sun Feb 20 17:45:02 2005
+++ graveman/current/src/cdrecord.c     Mon Feb 21 01:25:28 2005
@@ -1074,6 +1074,101 @@
   return *Aerror ? FALSE : TRUE;
 }
 
+gboolean cdrecord_mediainfo_callback(GIOChannel *Astd, GIOCondition Acond, 
gpointer Adata)
+{
+  GIOStatus Lstatus;
+  Tgrave *Lg = (Tgrave *)Adata;
+  gint *Lcont = (gint *) sc_grave_get_data(Lg, "cont"); /* on traite encore 
des donnees ? */
+  gchar *Ltrouve = (gchar *) sc_grave_get_data(Lg, "msinfo");
+  gchar *Lbuffer = NULL;
+  gchar *s;
+  gint Lniveau = 0;
+
+  /* fin du callback lorsque l'on recoi un signal comme quoi le pipe est ferme 
*/
+  if (Acond == G_IO_HUP || Acond == G_IO_ERR) {
+    *Lcont = 0;
+    return FALSE;
+  }
+  Lstatus = g_io_channel_read_line(Astd, &Lbuffer, NULL, NULL, NULL);    
+
+  for (s=Lbuffer; *s; s++) {
+    if (isdigit(*s)) {
+      if (Lniveau == 2) {
+        Lniveau = 3;
+      } else if (Lniveau == 0) {
+        Lniveau = 1;
+      }
+    } else if (*s==',') {
+      if (Lniveau == 1) {
+        Lniveau = 2;
+      } else {
+        Lniveau = 0;
+        break;
+      }
+    } else {
+      if (Lniveau != 3) Lniveau = 0;
+      break;
+    }
+  }
+
+  if (Lniveau == 3) {
+    g_strlcpy(Ltrouve, Lbuffer, _BUF_SIZE-1);
+  }
+
+  g_free(Lbuffer);
+  
+  return TRUE;
+}
+
+gchar *cdrecord_get_mediainfo(Tgrave *Ag, gchar *Adevice, GError **Aerror)
+{
+  gchar **Lcmd;
+  gchar *Lcommandline, *Lout = NULL;
+  gint *Lpid = (gint *) sc_grave_get_data(Ag, "pid");
+  gint *Lcont = (gint *)sc_grave_get_data(Ag, "cont");
+  gboolean *Labort = (gboolean *) sc_grave_get_data(Ag, "gabort");
+  gchar *Lreturn = NULL;
+  gboolean Lstatus = FALSE;
+  gchar Lmsinfo[_BUF_SIZE] = "";
+  GIOChannel *Lcom;
+  guint Lcomevent;
+  gint Lexit, Lnbrarg, g_out;
+  guint Ltimeout;
+
+  (*Lcont) = 2;
+  Ltimeout = g_timeout_add(500, encours_callback, Ag);
+
+  sc_grave_set_data(Ag, &Lmsinfo, "msinfo");
+  
+  Lcommandline = g_strdup_printf("%s dev=%s -msinfo", 
conf_get_string("cdrecord"), Adevice);
+_DEB("execution [%s]", Lcommandline);
+  Lstatus = g_shell_parse_argv(Lcommandline, &Lnbrarg, &Lcmd, Aerror);
+  g_free(Lcommandline);
+  if (Lstatus != FALSE) { 
+    *Lcont = 2;
+
+    Lstatus = g_spawn_async_with_pipes(NULL, Lcmd, NULL, (GSpawnFlags) 
(G_SPAWN_DO_NOT_REAP_CHILD),
+        NULL, NULL, Lpid, NULL, &g_out, NULL, Aerror);
+
+    Lcom = g_io_channel_unix_new( g_out );
+    g_io_channel_set_encoding (Lcom, NULL, NULL);
+    g_io_channel_set_flags( Lcom, G_IO_FLAG_NONBLOCK, NULL );
+    Lcomevent = g_io_add_watch (Lcom, (G_IO_IN | G_IO_HUP | G_IO_ERR | 
G_IO_PRI),
+                                      cdrecord_mediainfo_callback, Ag);
+
+    while (*Lcont > 0 && *Labort == FALSE) {
+     gtk_main_iteration();
+    }
+  }
+  g_strfreev(Lcmd);
+
+  sc_grave_del_data(Ag, "msinfo");
+
+  /* attente de la fin du timeout */ 
+  g_source_remove(Ltimeout);
+  
+  return *Lmsinfo ? g_strdup(Lmsinfo) : NULL;
+}
 
 
 /*




reply via email to

[Prev in Thread] Current Thread [Next in Thread]