[Swfdec] Branch 'vivi' - 18 commits - configure.ac doc/swfdec-sections.txt libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_types.h libswfdec/swfdec_player.c vivified/core vivified/ui

Benjamin Otte company at kemper.freedesktop.org
Thu Aug 16 12:31:32 PDT 2007


 configure.ac                     |    2 
 doc/swfdec-sections.txt          |    1 
 libswfdec/swfdec_as_context.c    |    2 
 libswfdec/swfdec_as_frame.c      |   37 ++++++++++++---
 libswfdec/swfdec_as_frame.h      |    1 
 libswfdec/swfdec_as_types.h      |    5 +-
 libswfdec/swfdec_player.c        |    2 
 vivified/core/Makefile.am        |    1 
 vivified/core/vivi_application.c |   68 ++++++++++++++++++---------
 vivified/core/vivi_application.h |    6 ++
 vivified/core/vivi_breakpoint.c  |   95 +++++++++++++++++++++++++++++++--------
 vivified/core/vivi_breakpoint.h  |    3 +
 vivified/core/vivi_debugger.c    |    7 ++
 vivified/core/vivi_initialize.as |   48 +++++++++++++++++--
 vivified/core/vivi_player_as.c   |   40 ++++++++++++++++
 vivified/core/vivi_wrap_as.c     |   41 ++++++++++++++++
 vivified/ui/main.c               |    9 ++-
 17 files changed, 305 insertions(+), 63 deletions(-)

New commits:
diff-tree da8a9e9b145d5cb1aebc04764e9ed66856a31c9b (from f0776fdc6d6e96c49e4daaa9d512c813b59b39df)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 21:31:25 2007 +0200

    make backtrace function actually work

diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 7b6fdc6..bf6ed76 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -101,11 +101,12 @@ Commands.delete = Commands.del;
 Commands.where = function () {
   var frame = Player.frame;
   if (frame == undefined) {
-    print ("---");
+    Commands.print ("---");
     return;
   }
+  var i = 0;
   while (frame) {
-    print (frame);
+    Commands.print (i++ + ": " + frame);
     frame = frame.next;
   }
 };
diff-tree f0776fdc6d6e96c49e4daaa9d512c813b59b39df (from 46e54f2e89bcf81b9137cdba219d7322ee7055ad)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 21:26:41 2007 +0200

    debugging g_print() ...

diff --git a/vivified/core/vivi_debugger.c b/vivified/core/vivi_debugger.c
index 53ea0ea..670daff 100644
--- a/vivified/core/vivi_debugger.c
+++ b/vivified/core/vivi_debugger.c
@@ -76,9 +76,7 @@ vivi_debugger_break (ViviDebugger *debug
   g_object_notify (G_OBJECT (app), "interrupted");
   vivi_application_check (app);
 
-  g_print (">>>\n");
   g_main_loop_run (app->loop);
-  g_print ("<<<\n");
 
   g_main_loop_unref (app->loop);
   app->loop = NULL;
diff-tree 46e54f2e89bcf81b9137cdba219d7322ee7055ad (from 19febb579adabc379bbb078c28d1afabf217dd38)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 21:26:20 2007 +0200

    add backtrace function

diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 4751870..7b6fdc6 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -98,3 +98,16 @@ Commands.del = function (id) {
   b.active = false;
 };
 Commands.delete = Commands.del;
+Commands.where = function () {
+  var frame = Player.frame;
+  if (frame == undefined) {
+    print ("---");
+    return;
+  }
+  while (frame) {
+    print (frame);
+    frame = frame.next;
+  }
+};
+Commands.backtrace = Commands.where;
+Commands.bt = Commands.where;
diff-tree 19febb579adabc379bbb078c28d1afabf217dd38 (from 9201f46e7c8502e949f1ab9608cdb6073aa3e15d)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 21:26:06 2007 +0200

    return the breakpoint that was added from Commands.add()

diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index e654e74..4751870 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -78,6 +78,7 @@ Commands.add = function (name) {
   ret.toString = function () {
     return "function call " + name;
   };
+  return ret;
 };
 Commands.list = function () {
   var a = Breakpoint.list;
diff-tree 9201f46e7c8502e949f1ab9608cdb6073aa3e15d (from e1b2e3c7a87d7f31d97553e9cc844afca9b8dd1d)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 21:23:47 2007 +0200

    implement Player object and Player.frame for the current frame

diff --git a/vivified/core/Makefile.am b/vivified/core/Makefile.am
index 9403543..13411ef 100644
--- a/vivified/core/Makefile.am
+++ b/vivified/core/Makefile.am
@@ -14,6 +14,7 @@ libvivified_core_la_SOURCES = \
 	vivi_initialize.s \
 	vivi_marshal.c \
 	vivi_ming.c \
+	vivi_player_as.c \
 	vivi_wrap.c \
 	vivi_wrap_as.c
 
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 7686c8b..e654e74 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -38,6 +38,11 @@ Breakpoint = function () extends Native.
 Breakpoint.list = new Array ();
 Breakpoint.prototype.addProperty ("active", Native.breakpoint_active_get, Native.breakpoint_active_set);
 
+/*** information about the player ***/
+
+Player = {};
+Player.addProperty ("frame", Native.player_frame_get, null);
+
 /*** commands available for debugging ***/
 
 Commands = new Object ();
diff --git a/vivified/core/vivi_player_as.c b/vivified/core/vivi_player_as.c
new file mode 100644
index 0000000..ab8c4de
--- /dev/null
+++ b/vivified/core/vivi_player_as.c
@@ -0,0 +1,40 @@
+/* Vivified
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "vivi_wrap.h"
+#include "vivi_application.h"
+#include "vivi_function.h"
+
+VIVI_FUNCTION ("player_frame_get", vivi_player_as_frame_get)
+void
+vivi_player_as_frame_get (SwfdecAsContext *cx, SwfdecAsObject *this,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+  ViviApplication *app = VIVI_APPLICATION (cx);
+  SwfdecAsObject *obj;
+
+  obj = SWFDEC_AS_OBJECT (swfdec_as_context_get_frame (SWFDEC_AS_CONTEXT (app->player)));
+  if (obj)
+    SWFDEC_AS_VALUE_SET_OBJECT (retval, vivi_wrap_object (app, obj));
+}
+
diff-tree e1b2e3c7a87d7f31d97553e9cc844afca9b8dd1d (from 45a3be6f561a80d6e7ef749e0fd5ad7cf1d43ce5)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 21:23:24 2007 +0200

    make swfdec_as_stack_iterator_init_arguments() work with every frame,
    not just with the first frame on the stack

diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 17f88cb..5369dca 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -79,21 +79,29 @@ swfdec_as_stack_iterator_init_arguments 
 
   g_return_val_if_fail (iter != NULL, NULL);
   g_return_val_if_fail (SWFDEC_IS_AS_FRAME (frame), NULL);
-  /* FIXME! */
-  context = SWFDEC_AS_OBJECT (frame)->context;
-  g_return_val_if_fail (context->frame == frame, NULL);
 
+  if (frame->argc == 0) {
+    iter->current = NULL;
+    return NULL;
+  }
+  context = SWFDEC_AS_OBJECT (frame)->context;
   if (frame->argv) {
     iter->stack = NULL;
     iter->current = (SwfdecAsValue *) frame->argv;
   } else {
-    iter->stack = context->stack;
+    SwfdecAsStack *stack = context->stack;
+    SwfdecAsValue *end;
     iter->current = frame->stack_begin - 1;
+    end = context->cur;
+    while (iter->current < stack->elements ||
+	iter->current > end) {
+      stack = stack->next;
+      end = &stack->elements[stack->used_elements];
+    }
+    iter->stack = stack;
   }
   iter->i = 0;
   iter->n = frame->argc;
-  if (frame->argc == 0)
-    iter->current = NULL;
   return iter->current;
 }
 
diff-tree 45a3be6f561a80d6e7ef749e0fd5ad7cf1d43ce5 (from b199888c9610670fe2e47791fe529156f11a3733)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 20:27:33 2007 +0200

    reorder

diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 5e1edac..7686c8b 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -17,12 +17,7 @@
  * Boston, MA  02110-1301  USA
  */
 
-Breakpoint = function () extends Native.Breakpoint {
-  super ();
-  Breakpoint.list.push (this);
-};
-Breakpoint.list = new Array ();
-Breakpoint.prototype.addProperty ("active", Native.breakpoint_active_get, Native.breakpoint_active_set);
+/*** general objects ***/
 
 Wrap = function () {};
 Wrap.prototype = {};
@@ -34,6 +29,15 @@ Frame.prototype.addProperty ("code", Nat
 Frame.prototype.addProperty ("name", Native.frame_name_get, null);
 Frame.prototype.addProperty ("next", Native.frame_next_get, null);
 
+/*** breakpoints ***/
+
+Breakpoint = function () extends Native.Breakpoint {
+  super ();
+  Breakpoint.list.push (this);
+};
+Breakpoint.list = new Array ();
+Breakpoint.prototype.addProperty ("active", Native.breakpoint_active_get, Native.breakpoint_active_set);
+
 /*** commands available for debugging ***/
 
 Commands = new Object ();
diff-tree b199888c9610670fe2e47791fe529156f11a3733 (from ee2cce889a2f70f535dec00093090836f13a1efd)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 20:11:25 2007 +0200

    implement Frame.next property

diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index f86991f..5e1edac 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -30,8 +30,9 @@ Wrap.prototype.toString = Native.wrap_to
 
 Frame = function () extends Wrap {};
 Frame.prototype = new Wrap ();
-Frame.prototype.addProperty ("name", Native.frame_name_get, null);
 Frame.prototype.addProperty ("code", Native.frame_code_get, null);
+Frame.prototype.addProperty ("name", Native.frame_name_get, null);
+Frame.prototype.addProperty ("next", Native.frame_next_get, null);
 
 /*** commands available for debugging ***/
 
diff --git a/vivified/core/vivi_wrap_as.c b/vivified/core/vivi_wrap_as.c
index 0f4f3e6..c905f34 100644
--- a/vivified/core/vivi_wrap_as.c
+++ b/vivified/core/vivi_wrap_as.c
@@ -86,5 +86,24 @@ vivi_wrap_code_get (SwfdecAsContext *cx,
     SWFDEC_AS_VALUE_SET_BOOLEAN (retval, TRUE);
 }
 
+VIVI_FUNCTION ("frame_next_get", vivi_wrap_next_get)
+void
+vivi_wrap_next_get (SwfdecAsContext *cx, SwfdecAsObject *this,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+  ViviWrap *wrap;
+  SwfdecAsObject *obj;
+
+  if (!VIVI_IS_WRAP (this))
+    return;
+  
+  wrap = VIVI_WRAP (this);
+  if (!SWFDEC_IS_AS_FRAME (wrap->wrap))
+    return;
+  
+  obj = SWFDEC_AS_OBJECT (swfdec_as_frame_get_next (SWFDEC_AS_FRAME (wrap->wrap)));
+  if (obj)
+    SWFDEC_AS_VALUE_SET_OBJECT (retval, vivi_wrap_object (VIVI_APPLICATION (cx), obj));
+}
 
 
diff-tree ee2cce889a2f70f535dec00093090836f13a1efd (from f469392f783d10984d4d6dc36ac03d41b3730bec)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 19:46:24 2007 +0200

    don't use parameters as format strings

diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c
index 1a311e9..96c23e4 100644
--- a/libswfdec/swfdec_as_context.c
+++ b/libswfdec/swfdec_as_context.c
@@ -169,7 +169,7 @@ swfdec_as_context_abort (SwfdecAsContext
 {
   g_return_if_fail (context);
 
-  SWFDEC_ERROR (reason);
+  SWFDEC_ERROR ("%s", reason);
   context->state = SWFDEC_AS_CONTEXT_ABORTED;
 }
 
diff-tree f469392f783d10984d4d6dc36ac03d41b3730bec (from 52bba717bd060881a2f47b202c129017a86bc955)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 19:46:12 2007 +0200

    in SWFDEC_AS_OBJECT() only reference the object once

diff --git a/libswfdec/swfdec_as_types.h b/libswfdec/swfdec_as_types.h
index 54189d8..8da685d 100644
--- a/libswfdec/swfdec_as_types.h
+++ b/libswfdec/swfdec_as_types.h
@@ -104,9 +104,10 @@ struct _SwfdecAsValue {
 #define SWFDEC_AS_VALUE_GET_OBJECT(val) ((val)->value.object)
 #define SWFDEC_AS_VALUE_SET_OBJECT(val,o) G_STMT_START { \
   SwfdecAsValue *__val = (val); \
-  g_assert (o != NULL); \
+  SwfdecAsObject *__o = (o); \
+  g_assert (__o != NULL); \
   (__val)->type = SWFDEC_AS_TYPE_OBJECT; \
-  (__val)->value.object = o; \
+  (__val)->value.object = __o; \
 } G_STMT_END
 
 /* value conversion functions */
diff-tree 52bba717bd060881a2f47b202c129017a86bc955 (from 85ec6f14038b68f557c37a8ad23095dca8a9af1f)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 17:32:59 2007 +0200

    support reset() in breakpoints (hopefully)

diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index 79b350d..cc1d4c2 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -181,7 +181,8 @@ vivi_application_reset (ViviApplication 
 {
   g_return_if_fail (VIVI_IS_APPLICATION (app));
 
-  g_assert (app->loop == NULL); /* FIXME: what do we do if we're inside a breakpoint? */
+  if (app->loop != NULL)
+    g_main_loop_quit (app->loop);
   g_object_unref (app->player);
   app->player = swfdec_gtk_player_new (SWFDEC_AS_DEBUGGER (app->debugger));
   app->player_inited = FALSE;
@@ -262,42 +263,25 @@ vivi_application_step_forward (gpointer 
   return FALSE;
 }
 
-static void
+void
 vivi_application_check (ViviApplication *app)
 {
-  gboolean is_playing, is_breakpoint;
+  gboolean is_breakpoint;
 
   /* if we're inside some script code, don't do anything */
   if (swfdec_as_context_get_frame (SWFDEC_AS_CONTEXT (app)))
     return;
 
-  is_playing = swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (app->player));
   is_breakpoint = app->loop != NULL;
   swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (app));
 
   switch (app->playback_state) {
     case VIVI_APPLICATION_EXITING:
-      if (is_playing)
-	swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (app->player), FALSE);
-      if (is_breakpoint)
-	g_main_loop_quit (app->loop);
-      break;
     case VIVI_APPLICATION_STOPPED:
-      if (is_playing)
-	swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (app->player), FALSE);
-      break;
     case VIVI_APPLICATION_PLAYING:
-      if (!is_playing)
-	swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (app->player), TRUE);
-      if (is_breakpoint)
-	g_main_loop_quit (app->loop);
       break;
     case VIVI_APPLICATION_STEPPING:
-      if (is_playing)
-	swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (app->player), FALSE);
-      if (is_breakpoint) {
-	g_main_loop_quit (app->loop);
-      } else {
+      if (!is_breakpoint) {
 	/* FIXME: sanely handle this */
 	g_idle_add_full (-100, vivi_application_step_forward, app, NULL);
       }
@@ -306,6 +290,14 @@ vivi_application_check (ViviApplication 
       g_assert_not_reached ();
       break;
   }
+
+  /* only play when not in breakpoints and only when really playing */
+  swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (app->player), !is_breakpoint && 
+      app->playback_state == VIVI_APPLICATION_PLAYING);
+
+  /* leave breakpoint unless stopped */
+  if (is_breakpoint && app->playback_state != VIVI_APPLICATION_STOPPED)
+    g_main_loop_quit (app->loop);
 }
 
 void
diff --git a/vivified/core/vivi_application.h b/vivified/core/vivi_application.h
index 7f66487..33694bf 100644
--- a/vivified/core/vivi_application.h
+++ b/vivified/core/vivi_application.h
@@ -75,6 +75,8 @@ GType			vivi_application_get_type   	(vo
 
 ViviApplication *	vivi_application_new		(void);
 
+void			vivi_application_check		(ViviApplication *	app);
+
 void			vivi_application_send_message	(ViviApplication *	app,
 							 ViviMessageType	type,
 							 const char *		format, 
diff --git a/vivified/core/vivi_debugger.c b/vivified/core/vivi_debugger.c
index 915dff0..53ea0ea 100644
--- a/vivified/core/vivi_debugger.c
+++ b/vivified/core/vivi_debugger.c
@@ -58,6 +58,7 @@ static void
 vivi_debugger_break (ViviDebugger *debugger)
 {
   ViviApplication *app = debugger->app;
+  SwfdecPlayer *player = app->player;
 
   g_assert (app);
   if (app->playback_state == VIVI_APPLICATION_EXITING)
@@ -67,19 +68,23 @@ vivi_debugger_break (ViviDebugger *debug
     if (app->playback_count > 0)
       return;
   }
-  swfdec_player_unlock_soft (app->player);
+  swfdec_player_unlock_soft (player);
 
   app->playback_state = 0;
   app->playback_count = 0;
   app->loop = g_main_loop_new (NULL, FALSE);
   g_object_notify (G_OBJECT (app), "interrupted");
+  vivi_application_check (app);
 
+  g_print (">>>\n");
   g_main_loop_run (app->loop);
+  g_print ("<<<\n");
 
   g_main_loop_unref (app->loop);
   app->loop = NULL;
   g_object_notify (G_OBJECT (app), "interrupted");
-  swfdec_player_lock_soft (app->player);
+  vivi_application_check (app);
+  swfdec_player_lock_soft (player);
 }
 
 static void
diff-tree 85ec6f14038b68f557c37a8ad23095dca8a9af1f (from f848345a3768d3029d5135db1556f9f0f8a7061f)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 17:32:31 2007 +0200

    add a reference to the player when locking

diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index 2bb0264..e9a8010 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1060,6 +1060,7 @@ swfdec_player_lock (SwfdecPlayer *player
   g_return_if_fail (SWFDEC_IS_PLAYER (player));
   g_assert (swfdec_ring_buffer_get_n_elements (player->actions) == 0);
 
+  g_object_ref (player);
   swfdec_player_lock_soft (player);
 }
 
@@ -1083,6 +1084,7 @@ swfdec_player_unlock (SwfdecPlayer *play
 
   swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (player));
   swfdec_player_unlock_soft (player);
+  g_object_unref (player);
 }
 
 static gboolean
diff-tree f848345a3768d3029d5135db1556f9f0f8a7061f (from 71440c71a145eb098445126cf0031f4a700df56f)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 15:42:10 2007 +0200

    add the possibility to set variables to be used with the player
    
    Variables can be specified as second command line argument now.

diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index 3a2de0a..79b350d 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -35,6 +35,7 @@ enum {
 enum {
   PROP_0,
   PROP_FILENAME,
+  PROP_VARIABLES,
   PROP_PLAYER,
   PROP_INTERRUPTED,
   PROP_QUIT
@@ -53,6 +54,9 @@ vivi_application_get_property (GObject *
     case PROP_FILENAME:
       g_value_set_string (value, app->filename);
       break;
+    case PROP_VARIABLES:
+      g_value_set_string (value, app->variables);
+      break;
     case PROP_PLAYER:
       g_value_set_object (value, app->player);
       break;
@@ -78,6 +82,9 @@ vivi_application_set_property (GObject *
     case PROP_FILENAME:
       vivi_application_set_filename (app, g_value_get_string (value));
       break;
+    case PROP_VARIABLES:
+      vivi_application_set_variables (app, g_value_get_string (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
       break;
@@ -110,6 +117,9 @@ vivi_application_class_init (ViviApplica
   g_object_class_install_property (object_class, PROP_FILENAME,
       g_param_spec_string ("filename", "filename", "name of file to play",
 	  NULL, G_PARAM_READWRITE));
+  g_object_class_install_property (object_class, PROP_FILENAME,
+      g_param_spec_string ("variables", "variables", "variables to pass to the file",
+	  NULL, G_PARAM_READWRITE));
   g_object_class_install_property (object_class, PROP_PLAYER,
       g_param_spec_object ("player", "player", "Flash player in use",
 	  SWFDEC_TYPE_PLAYER, G_PARAM_READABLE));
@@ -162,7 +172,7 @@ vivi_application_init_player (ViviApplic
   }
 
   loader = swfdec_file_loader_new (app->filename);
-  swfdec_player_set_loader (app->player, loader);
+  swfdec_player_set_loader_with_variables (app->player, loader, app->variables);
   app->player_inited = TRUE;
 }
 
@@ -198,6 +208,24 @@ vivi_application_get_filename (ViviAppli
   return app->filename;
 }
 
+void
+vivi_application_set_variables (ViviApplication *app, const char *variables)
+{
+  g_return_if_fail (VIVI_IS_APPLICATION (app));
+
+  g_free (app->variables);
+  app->variables = g_strdup (variables);
+  g_object_notify (G_OBJECT (app), "variables");
+}
+
+const char *
+vivi_application_get_variables (ViviApplication *app)
+{
+  g_return_val_if_fail (VIVI_IS_APPLICATION (app), NULL);
+
+  return app->variables;
+}
+
 SwfdecPlayer *
 vivi_application_get_player (ViviApplication *app)
 {
@@ -294,7 +322,7 @@ vivi_application_execute (ViviApplicatio
   vivi_application_input (app, "%s", command);
   script = vivi_ming_compile (command, &error);
   if (script == NULL) {
-    vivi_application_error (app, error);
+    vivi_application_error (app, "%s", error);
     g_free (error);
     return;
   }
diff --git a/vivified/core/vivi_application.h b/vivified/core/vivi_application.h
index 812b304..7f66487 100644
--- a/vivified/core/vivi_application.h
+++ b/vivified/core/vivi_application.h
@@ -55,6 +55,7 @@ struct _ViviApplication
   SwfdecAsContext	context;
 
   char *		filename;	/* name of the file we play back or NULL if none set yet */
+  char *		variables;	/* variables to pass to player or NULL if none set */
   SwfdecPlayer *	player;		/* the current player */
   ViviDebugger *	debugger;	/* the debugger used in player */
   gboolean		player_inited;	/* if the player is inited already */
@@ -88,6 +89,9 @@ void			vivi_application_send_message	(Vi
 void			vivi_application_set_filename	(ViviApplication *	app,
 							 const char *		filename);
 const char *		vivi_application_get_filename	(ViviApplication *	app);
+void			vivi_application_set_variables	(ViviApplication *	app,
+							 const char *		filename);
+const char *		vivi_application_get_variables	(ViviApplication *	app);
 SwfdecPlayer *	      	vivi_application_get_player	(ViviApplication *	app);
 gboolean	      	vivi_application_get_interrupted(ViviApplication *	app);
 gboolean	      	vivi_application_is_quit	(ViviApplication *	app);
diff --git a/vivified/ui/main.c b/vivified/ui/main.c
index 3f96021..df123a9 100644
--- a/vivified/ui/main.c
+++ b/vivified/ui/main.c
@@ -48,13 +48,14 @@ delete_event (GtkWidget *widget, GdkEven
 }
 
 static void
-setup (const char *filename)
+setup (const char *filename, const char *variables)
 {
   GtkWidget *window, *box, *widget;
   ViviApplication *app;
 
   app = vivi_application_new ();
   vivi_application_set_filename (app, filename);
+  vivi_application_set_variables (app, variables);
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   g_signal_connect_swapped (app, "notify::quit", G_CALLBACK (gtk_widget_destroy), window);
   box = vivi_vdock_new ();
@@ -75,12 +76,12 @@ main (int argc, char **argv)
 {
   gtk_init (&argc, &argv);
 
-  if (argc != 2) {
-    g_print ("usage: %s FILE\n", argv[0]);
+  if (argc < 2) {
+    g_print ("usage: %s FILE [VARIABLES]\n", argv[0]);
     return 0;
   }
 
-  setup (argv[1]);
+  setup (argv[1], argc > 2 ? argv[2] : NULL);
   gtk_main ();
 
   return 0;
diff-tree 71440c71a145eb098445126cf0031f4a700df56f (from 5e6e05624c6c7cd7ecc9d8ea90a5ad4b4b04c542)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 14:48:32 2007 +0200

    add Frame.code property

diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 51ce35d..f86991f 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -31,6 +31,7 @@ Wrap.prototype.toString = Native.wrap_to
 Frame = function () extends Wrap {};
 Frame.prototype = new Wrap ();
 Frame.prototype.addProperty ("name", Native.frame_name_get, null);
+Frame.prototype.addProperty ("code", Native.frame_code_get, null);
 
 /*** commands available for debugging ***/
 
diff --git a/vivified/core/vivi_wrap_as.c b/vivified/core/vivi_wrap_as.c
index cf9e4a8..0f4f3e6 100644
--- a/vivified/core/vivi_wrap_as.c
+++ b/vivified/core/vivi_wrap_as.c
@@ -65,4 +65,26 @@ vivi_wrap_name_get (SwfdecAsContext *cx,
   SWFDEC_AS_VALUE_SET_STRING (retval, swfdec_as_context_get_string (cx, s));
 }
 
+VIVI_FUNCTION ("frame_code_get", vivi_wrap_code_get)
+void
+vivi_wrap_code_get (SwfdecAsContext *cx, SwfdecAsObject *this,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+  ViviWrap *wrap;
+  SwfdecScript *script;
+
+  if (!VIVI_IS_WRAP (this))
+    return;
+  
+  wrap = VIVI_WRAP (this);
+  if (!SWFDEC_IS_AS_FRAME (wrap->wrap))
+    return;
+  
+  script = swfdec_as_frame_get_script (SWFDEC_AS_FRAME (wrap->wrap));
+  /* FIXME: wrap scripts */
+  if (script)
+    SWFDEC_AS_VALUE_SET_BOOLEAN (retval, TRUE);
+}
+
+
 
diff-tree 5e6e05624c6c7cd7ecc9d8ea90a5ad4b4b04c542 (from ecd3760b86ee8bc6d839b80303264d396131b60b)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 14:48:14 2007 +0200

    don't use the input string as a format string

diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index 624c911..3a2de0a 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -291,7 +291,7 @@ vivi_application_execute (ViviApplicatio
   g_return_if_fail (VIVI_IS_APPLICATION (app));
   g_return_if_fail (command != NULL);
 
-  vivi_application_input (app, command);
+  vivi_application_input (app, "%s", command);
   script = vivi_ming_compile (command, &error);
   if (script == NULL) {
     vivi_application_error (app, error);
diff-tree ecd3760b86ee8bc6d839b80303264d396131b60b (from 32955946fda66c445e1e3de12629890a8e2f354a)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 14:47:25 2007 +0200

    add some printf warning flags

diff --git a/configure.ac b/configure.ac
index 1303884..63a0bde 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@ dnl if we support them, we set them unco
 AS_COMPILER_FLAG(-Wall, GLOBAL_CFLAGS="-Wall", GLOBAL_CFLAGS="")
 dnl I want this but stupid headers don't let me
 dnl AS_COMPILER_FLAG(-Wshadow, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Wshadow")
-AS_COMPILER_FLAG(-Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline")
+AS_COMPILER_FLAG(-Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security")
 dnl if we're in nano >= 1, add -Werror if supported
 if test x$SWFDEC_CVS = xyes ; then
   AS_COMPILER_FLAG(-Werror, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Werror")
diff-tree 32955946fda66c445e1e3de12629890a8e2f354a (from c7d4ebd5b036b286a32706e74315c376553fb36d)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 14:00:15 2007 +0200

    add swfdec_as_frame_get_script ()

diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt
index cf0e5b1..c5f9076 100644
--- a/doc/swfdec-sections.txt
+++ b/doc/swfdec-sections.txt
@@ -374,6 +374,7 @@ SWFDEC_TYPE_AS_NATIVE_FUNCTION
 SwfdecAsFrame
 swfdec_as_frame_get_next
 swfdec_as_frame_get_function_name
+swfdec_as_frame_get_script
 SwfdecAsStackIterator
 swfdec_as_stack_iterator_init
 swfdec_as_stack_iterator_init_arguments
diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 0721022..17f88cb 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -760,3 +760,20 @@ swfdec_as_frame_get_function_name (Swfde
   g_assert (frame->function_name);
   return frame->function_name;
 }
+
+/**
+ * swfdec_as_frame_get_script:
+ * @frame: a #SwfdecAsFrame
+ *
+ * Gets the script associated with the given @frame. If the frame references
+ * a native function, there will be no script and this function returns %NULL.
+ *
+ * Returns: The script executed by this frame or %NULL
+ **/
+SwfdecScript *
+swfdec_as_frame_get_script (SwfdecAsFrame *frame)
+{
+  g_return_val_if_fail (SWFDEC_IS_AS_FRAME (frame), NULL);
+
+  return frame->script;
+}
diff --git a/libswfdec/swfdec_as_frame.h b/libswfdec/swfdec_as_frame.h
index 183f55d..8157858 100644
--- a/libswfdec/swfdec_as_frame.h
+++ b/libswfdec/swfdec_as_frame.h
@@ -48,6 +48,7 @@ GType		swfdec_as_frame_get_type	(void);
 
 SwfdecAsFrame *	swfdec_as_frame_get_next	(SwfdecAsFrame *		frame);
 const char *	swfdec_as_frame_get_function_name (SwfdecAsFrame *		frame);
+SwfdecScript *	swfdec_as_frame_get_script	(SwfdecAsFrame *		frame);
 
 SwfdecAsValue *	swfdec_as_stack_iterator_init	(SwfdecAsStackIterator *	iter,
 						 SwfdecAsFrame *		frame);
diff-tree c7d4ebd5b036b286a32706e74315c376553fb36d (from 6e6a99cc02d9399a08398cdcffe0599bc724fe1a)
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Aug 16 13:34:44 2007 +0200

    add ability to deactivate breakpoints
    
    use this to implement a "delete" command

diff --git a/vivified/core/vivi_breakpoint.c b/vivified/core/vivi_breakpoint.c
index 94922d4..506ee08 100644
--- a/vivified/core/vivi_breakpoint.c
+++ b/vivified/core/vivi_breakpoint.c
@@ -87,6 +87,31 @@ vivi_breakpoint_find_event (const char *
 }
 
 static void
+vivi_breakpoint_add (ViviBreakpoint *breakpoint, guint i)
+{
+  ViviDebugger *debugger = VIVI_APPLICATION (SWFDEC_AS_OBJECT (breakpoint)->context)->debugger;
+
+  g_assert (i != 0);
+  if (breakpoint->active) {
+    breakpoint->handlers[i] = g_signal_connect (debugger, events[i].signal,
+	events[i].handler, breakpoint);
+  } else {
+    breakpoint->handlers[i] = 1;
+  }
+}
+
+static void
+vivi_breakpoint_remove (ViviBreakpoint *breakpoint, guint i)
+{
+  ViviDebugger *debugger = VIVI_APPLICATION (SWFDEC_AS_OBJECT (breakpoint)->context)->debugger;
+
+  g_assert (i != 0);
+  if (breakpoint->active)
+    g_signal_handler_disconnect (debugger, breakpoint->handlers[i]);
+  breakpoint->handlers[i] = 0;
+}
+
+static void
 vivi_breakpoint_set (SwfdecAsObject *object, const char *variable, const SwfdecAsValue *val)
 {
   guint i;
@@ -94,17 +119,13 @@ vivi_breakpoint_set (SwfdecAsObject *obj
   i = vivi_breakpoint_find_event (variable);
   if (i) {
     ViviBreakpoint *breakpoint = VIVI_BREAKPOINT (object);
-    ViviDebugger *debugger = VIVI_APPLICATION (object->context)->debugger;
     if (SWFDEC_AS_VALUE_IS_OBJECT (val) &&
 	SWFDEC_IS_AS_FUNCTION (SWFDEC_AS_VALUE_GET_OBJECT (val))) {
       if (!breakpoint->handlers[i])
-	breakpoint->handlers[i] = g_signal_connect (debugger, events[i].signal,
-	    events[i].handler, object);
+	vivi_breakpoint_add (breakpoint, i);
     } else {
-      if (breakpoint->handlers[i]) {
-	g_signal_handler_disconnect (debugger, breakpoint->handlers[i]);
-	breakpoint->handlers[i] = 0;
-      }
+      if (breakpoint->handlers[i])
+	vivi_breakpoint_remove (breakpoint, i);
     }
   }
   SWFDEC_AS_OBJECT_CLASS (vivi_breakpoint_parent_class)->set (object, variable, val);
@@ -117,11 +138,8 @@ vivi_breakpoint_delete (SwfdecAsObject *
   guint i;
 
   i = vivi_breakpoint_find_event (variable);
-  if (i && breakpoint->handlers[i]) {
-    ViviDebugger *debugger = VIVI_APPLICATION (object->context)->debugger;
-    g_signal_handler_disconnect (debugger, breakpoint->handlers[i]);
-    breakpoint->handlers[i] = 0;
-  }
+  if (i && breakpoint->handlers[i])
+    vivi_breakpoint_remove (breakpoint, i);
 
   return SWFDEC_AS_OBJECT_CLASS (vivi_breakpoint_parent_class)->del (object, variable);
 }
@@ -130,13 +148,9 @@ static void
 vivi_breakpoint_dispose (GObject *object)
 {
   ViviBreakpoint *breakpoint = VIVI_BREAKPOINT (object);
-  ViviDebugger *debugger = VIVI_APPLICATION (SWFDEC_AS_OBJECT (breakpoint)->context)->debugger;
-  guint i;
 
-  for (i = 0; i < G_N_ELEMENTS (events); i++) {
-    if (breakpoint->handlers[i])
-      g_signal_handler_disconnect (debugger, breakpoint->handlers[i]);
-  }
+  vivi_breakpoint_set_active (breakpoint, FALSE);
+
   G_OBJECT_CLASS (vivi_breakpoint_parent_class)->dispose (object);
 }
 
@@ -155,7 +169,52 @@ vivi_breakpoint_class_init (ViviBreakpoi
 static void
 vivi_breakpoint_init (ViviBreakpoint *breakpoint)
 {
+  breakpoint->active = TRUE;
+}
+
+void
+vivi_breakpoint_set_active (ViviBreakpoint *breakpoint, gboolean active)
+{
+  guint i;
+
+  g_return_if_fail (VIVI_IS_BREAKPOINT (breakpoint));
+
+  g_print ("active = %d", active);
+  if (breakpoint->active == active)
+    return;
+  breakpoint->active = !breakpoint->active;
+  for (i = 1; i < G_N_ELEMENTS (events); i++) {
+    if (breakpoint->handlers[i] == 0)
+      continue;
+    /* FIXME: this is hacky */
+    breakpoint->active = !breakpoint->active;
+    vivi_breakpoint_remove (breakpoint, i);
+    breakpoint->active = !breakpoint->active;
+    vivi_breakpoint_add (breakpoint, i);
+  }
 }
 
 /*** AS CODE ***/
 
+VIVI_FUNCTION ("breakpoint_active_get", vivi_breakpoint_as_get_active)
+void
+vivi_breakpoint_as_get_active (SwfdecAsContext *cx, SwfdecAsObject *this,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+  if (!VIVI_IS_BREAKPOINT (this))
+    return;
+
+  SWFDEC_AS_VALUE_SET_BOOLEAN (retval, VIVI_BREAKPOINT (this)->active);
+}
+
+VIVI_FUNCTION ("breakpoint_active_set", vivi_breakpoint_as_set_active)
+void
+vivi_breakpoint_as_set_active (SwfdecAsContext *cx, SwfdecAsObject *this,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+  if (!VIVI_IS_BREAKPOINT (this) ||
+      argc == 0)
+    return;
+  vivi_breakpoint_set_active (VIVI_BREAKPOINT (this), swfdec_as_value_to_boolean (cx, &argv[0]));
+}
+
diff --git a/vivified/core/vivi_breakpoint.h b/vivified/core/vivi_breakpoint.h
index 5925ec9..87b2220 100644
--- a/vivified/core/vivi_breakpoint.h
+++ b/vivified/core/vivi_breakpoint.h
@@ -40,6 +40,7 @@ struct _ViviBreakpoint
 {
   SwfdecAsObject	object;
 
+  gboolean		active;		/* only active breakpoints receive events */
   gulong		handlers[4];	/* handlers for every signal of the debugger or 0 */
 };
 
@@ -50,6 +51,8 @@ struct _ViviBreakpointClass
 
 GType			vivi_breakpoint_get_type   	(void);
 
+void			vivi_breakpoint_set_active	(ViviBreakpoint *	breakpoint,
+							 gboolean		active);
 
 G_END_DECLS
 #endif
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 430110d..51ce35d 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -22,6 +22,7 @@ Breakpoint = function () extends Native.
   Breakpoint.list.push (this);
 };
 Breakpoint.list = new Array ();
+Breakpoint.prototype.addProperty ("active", Native.breakpoint_active_get, Native.breakpoint_active_set);
 
 Wrap = function () {};
 Wrap.prototype = {};
@@ -74,3 +75,14 @@ Commands.list = function () {
     Commands.print (i + ": " + a[i]);
   }
 };
+Commands.del = function (id) {
+  var a = Breakpoint.list;
+  if (id == undefined) {
+    while (a[0])
+      Commands.del (0);
+  }
+  var b = a[id];
+  a.splice (id, 1);
+  b.active = false;
+};
+Commands.delete = Commands.del;


More information about the Swfdec mailing list