[Swfdec] 28 commits - configure.ac debian/changelog debian/control debian/copyright debian/.gitignore debian/libswfdec0.dirs debian/libswfdec0.files debian/libswfdec0.shlibs debian/libswfdec-dev.dirs debian/libswfdec-dev.files debian/rules debian/swf-player.dirs debian/swf-player.files doc/Makefile.am doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_flash_security.c libswfdec/swfdec_flash_security.h libswfdec/swfdec_load_object_as.c libswfdec/swfdec_load_object.c libswfdec/swfdec_load_object.h libswfdec/swfdec_marshal.list libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_security_allow.c libswfdec/swfdec_security_allow.h libswfdec/swfdec_security.c libswfdec/swfdec_security.h libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_sprite_movie.h libswfdec/swfdec_swf_decoder.h libswfdec/swfdec_swf_instance.c libswfdec/swfdec_tag.c libswfdec/swfdec_types.h libswfdec/swfdec_url.c libswfdec/swfdec_url.h libswfdec/swfdec_utils.c libswfdec/swfdec_utils.h Makefile.am swfdec.spec.in test/dump.c

Benjamin Otte company at kemper.freedesktop.org
Wed Oct 17 14:31:07 PDT 2007


 Makefile.am                          |    1 
 configure.ac                         |    1 
 debian/.gitignore                    |    1 
 debian/changelog                     |   54 -----------
 debian/control                       |   36 -------
 debian/copyright                     |   10 --
 debian/libswfdec-dev.dirs            |    2 
 debian/libswfdec-dev.files           |    5 -
 debian/libswfdec0.dirs               |    1 
 debian/libswfdec0.files              |    1 
 debian/libswfdec0.shlibs             |    1 
 debian/rules                         |  112 ------------------------
 debian/swf-player.dirs               |    3 
 debian/swf-player.files              |    5 -
 doc/Makefile.am                      |    4 
 doc/swfdec-sections.txt              |    1 
 libswfdec/Makefile.am                |    6 +
 libswfdec/swfdec_as_context.c        |    6 +
 libswfdec/swfdec_as_frame.c          |   37 ++++++++
 libswfdec/swfdec_as_frame_internal.h |    4 
 libswfdec/swfdec_as_function.c       |   20 ++++
 libswfdec/swfdec_as_function.h       |    2 
 libswfdec/swfdec_as_internal.h       |    7 +
 libswfdec/swfdec_as_interpret.c      |   79 ++++++++++++-----
 libswfdec/swfdec_as_object.c         |   33 +++++--
 libswfdec/swfdec_flash_security.c    |  104 ++++++++++++++++++++++
 libswfdec/swfdec_flash_security.h    |   57 ++++++++++++
 libswfdec/swfdec_load_object.c       |   10 +-
 libswfdec/swfdec_load_object.h       |    4 
 libswfdec/swfdec_load_object_as.c    |    2 
 libswfdec/swfdec_marshal.list        |    1 
 libswfdec/swfdec_movie.c             |   60 -------------
 libswfdec/swfdec_movie.h             |    8 -
 libswfdec/swfdec_net_stream.c        |    3 
 libswfdec/swfdec_player.c            |  159 +++++++++++++++++++++++++++++++++--
 libswfdec/swfdec_player_internal.h   |   20 +++-
 libswfdec/swfdec_security.c          |   87 +++++++++++++++++++
 libswfdec/swfdec_security.h          |   62 +++++++++++++
 libswfdec/swfdec_security_allow.c    |   79 +++++++++++++++++
 libswfdec/swfdec_security_allow.h    |   53 +++++++++++
 libswfdec/swfdec_sprite_movie.c      |   42 +++++++++
 libswfdec/swfdec_sprite_movie.h      |    8 +
 libswfdec/swfdec_swf_decoder.h       |    2 
 libswfdec/swfdec_swf_instance.c      |   26 +++++
 libswfdec/swfdec_tag.c               |   10 +-
 libswfdec/swfdec_types.h             |    1 
 libswfdec/swfdec_url.c               |   22 ++++
 libswfdec/swfdec_url.h               |    3 
 libswfdec/swfdec_utils.c             |   28 ++++++
 libswfdec/swfdec_utils.h             |    8 +
 swfdec.spec.in                       |   92 --------------------
 test/dump.c                          |   12 +-
 52 files changed, 943 insertions(+), 452 deletions(-)

New commits:
commit f1ed8d1217c79d57d94ed690eea4ee19bd0cc65e
Merge: 6eaa4d5... 2e79c95...
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 23:26:18 2007 +0200

    Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec/swfdec

commit 6eaa4d583a246c55db75dbf84e7e0b5f35a7aa7a
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 23:22:33 2007 +0200

    actually implement the use_network flag

diff --git a/libswfdec/swfdec_swf_instance.c b/libswfdec/swfdec_swf_instance.c
index 4523f05..97e8460 100644
--- a/libswfdec/swfdec_swf_instance.c
+++ b/libswfdec/swfdec_swf_instance.c
@@ -29,6 +29,7 @@
 #include "swfdec_character.h"
 #include "swfdec_debug.h"
 #include "swfdec_decoder.h"
+#include "swfdec_flash_security.h"
 #include "swfdec_flv_decoder.h"
 #include "swfdec_loader_internal.h"
 #include "swfdec_loadertarget.h"
@@ -52,6 +53,21 @@ swfdec_swf_instance_loader_target_get_player (SwfdecLoaderTarget *target)
 }
 
 static void
+swfdec_swf_instance_allow_network (SwfdecPlayer *player)
+{
+  SwfdecFlashSecurity *sec;
+
+  g_print ("enabling network access for %s\n", 
+      swfdec_url_get_url (swfdec_loader_get_url (player->loader)));
+  SWFDEC_INFO ("enabling network access for %s",
+      swfdec_url_get_url (swfdec_loader_get_url (player->loader)));
+
+  sec = SWFDEC_FLASH_SECURITY (player->security);
+  sec->allow_remote = TRUE;
+  sec->allow_local = FALSE;
+}
+
+static void
 swfdec_swf_instance_loader_target_image (SwfdecSwfInstance *instance)
 {
   SwfdecSpriteMovie *movie = instance->movie;
@@ -60,9 +76,15 @@ swfdec_swf_instance_loader_target_image (SwfdecSwfInstance *instance)
     return;
 
   if (SWFDEC_IS_SWF_DECODER (instance->decoder)) {
-    movie->sprite = SWFDEC_SWF_DECODER (instance->decoder)->main_sprite;
-
+    SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
+    SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (instance->decoder);
+    movie->sprite = dec->main_sprite;
     swfdec_movie_invalidate (SWFDEC_MOVIE (movie));
+    
+    /* if first instance */
+    if (player->loader == instance->loader && dec->use_network &&
+	swfdec_url_has_protocol (swfdec_loader_get_url (instance->loader), "file"))
+      swfdec_swf_instance_allow_network (player);
   } else if (SWFDEC_IS_FLV_DECODER (instance->decoder)) {
     /* nothing to do, please move along */
   } else {
commit d9a24da2aab39932a3eb75f5e8507176a61f99de
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 22:57:43 2007 +0200

    save results from the FileAttributes tag

diff --git a/libswfdec/swfdec_swf_decoder.h b/libswfdec/swfdec_swf_decoder.h
index 3cd43eb..ab88628 100644
--- a/libswfdec/swfdec_swf_decoder.h
+++ b/libswfdec/swfdec_swf_decoder.h
@@ -82,6 +82,8 @@ struct _SwfdecSwfDecoder
   GArray **		root_actions; 	/* actions to be executed by the root sprite */
   GHashTable *		scripts;      	/* buffer -> script mapping for all scripts */
 
+  gboolean		use_network;	/* allow network or local access */
+  gboolean		has_metadata;	/* TRUE if this file contains metadata */
   gboolean		protection;   	/* TRUE is this file is protected and may not be edited */
   char *		password;     	/* MD5'd password to open for editing or NULL if may not be opened */
 
diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c
index c7ef45f..c9ce1a6 100644
--- a/libswfdec/swfdec_tag.c
+++ b/libswfdec/swfdec_tag.c
@@ -509,17 +509,17 @@ tag_func_define_button (SwfdecSwfDecoder * s, guint tag)
 static int
 tag_func_file_attributes (SwfdecSwfDecoder *s, guint tag)
 {
-  int has_metadata, use_network;
-
   if (swfdec_bits_getbits (&s->b, 3))
     SWFDEC_INFO ("reserved bits (1) aren't 0");
-  has_metadata = swfdec_bits_getbit (&s->b);
+  s->has_metadata = swfdec_bits_getbit (&s->b);
+  SWFDEC_LOG ("  has metadata: %d", s->has_metadata);
   if (swfdec_bits_getbits (&s->b, 3))
     SWFDEC_INFO ("reserved bits (2) aren't 0");
-  use_network = swfdec_bits_getbit (&s->b);
-  /* FIXME: do something useful with this data */
+  s->use_network = swfdec_bits_getbit (&s->b);
+  SWFDEC_LOG ("  use network: %d", s->use_network);
   if (swfdec_bits_getbits (&s->b, 24))
     SWFDEC_INFO ("reserved bits (3) aren't 0");
+  /* initialize default security if it wasn't initialized yet */
 
   return SWFDEC_STATUS_OK;
 }
commit 9d8262b31d4e3049462528c0ffce33ceb8f27a32
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 22:28:52 2007 +0200

    add a SwfdecSecurity object to the SwfdecPlayer

diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c
index 0b6d07c..1a88534 100644
--- a/libswfdec/swfdec_flash_security.c
+++ b/libswfdec/swfdec_flash_security.c
@@ -82,6 +82,8 @@ swfdec_flash_security_init (SwfdecFlashSecurity *sec)
 
 /**
  * swfdec_flash_security_new:
+ * @allow_local: %TRUE to allow playback of local files
+ * @allow_remote: %TRUE to allow playback of remote files
  *
  * Creates a new Security object that allows everything. These objects are used 
  * by default when no other security object is in use. This is particularly 
@@ -91,15 +93,12 @@ swfdec_flash_security_init (SwfdecFlashSecurity *sec)
  * Returns: a new #SwfdecSecurity object
  **/
 SwfdecSecurity *
-swfdec_flash_security_new (void)
+swfdec_flash_security_new (gboolean allow_local, gboolean allow_remote)
 {
-  static SwfdecSecurity *singleton = NULL;
+  SwfdecFlashSecurity *ret;
   
-  /* FIXME: not threadsafe */
-  if (singleton)
-    return g_object_ref (singleton);
-
-  singleton = g_object_new (SWFDEC_TYPE_FLASH_SECURITY, NULL);
-  g_object_add_weak_pointer (G_OBJECT (singleton), (gpointer) &singleton);
-  return singleton;
+  ret = g_object_new (SWFDEC_TYPE_FLASH_SECURITY, NULL);
+  ret->allow_local = allow_local;
+  ret->allow_remote = allow_remote;
+  return SWFDEC_SECURITY (ret);
 }
diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h
index 3cbb7cb..00dd14f 100644
--- a/libswfdec/swfdec_flash_security.h
+++ b/libswfdec/swfdec_flash_security.h
@@ -49,7 +49,8 @@ struct _SwfdecFlashSecurityClass
 
 GType			swfdec_flash_security_get_type	(void);
 
-SwfdecSecurity *	swfdec_flash_security_new	(void);
+SwfdecSecurity *	swfdec_flash_security_new	(gboolean	allow_local,
+							 gboolean	allow_remote);
 
 
 G_END_DECLS
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index 8037927..e4e8eee 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -36,6 +36,7 @@
 #include "swfdec_debug.h"
 #include "swfdec_enums.h"
 #include "swfdec_event.h"
+#include "swfdec_flash_security.h"
 #include "swfdec_initialize.h"
 #include "swfdec_internal.h"
 #include "swfdec_loader_internal.h"
@@ -803,6 +804,10 @@ swfdec_player_dispose (GObject *object)
     g_object_unref (player->loader);
     player->loader = NULL;
   }
+  if (player->security) {
+    g_object_unref (player->security);
+    player->security = NULL;
+  }
   if (player->system) {
     g_object_unref (player->system);
     player->system = NULL;
@@ -1745,6 +1750,23 @@ swfdec_player_launch (SwfdecPlayer *player, SwfdecLoaderRequest request, const c
   g_signal_emit (player, signals[LAUNCH], 0, request, url, target, data);
 }
 
+static void
+swfdec_player_create_security (SwfdecPlayer *player, guint version)
+{
+  const SwfdecURL *url;
+  gboolean allow_local, allow_remote;
+
+  url = swfdec_loader_get_url (player->loader);
+  if (version > 7) {
+    allow_local = FALSE;
+    allow_remote = swfdec_url_has_protocol (url, "http");
+  } else {
+    allow_local = swfdec_url_has_protocol (url, "file");
+    allow_remote = TRUE;
+  }
+  player->security = swfdec_flash_security_new (allow_local, allow_remote);
+}
+
 /**
  * swfdec_player_initialize:
  * @player: a #SwfdecPlayer
@@ -1787,6 +1809,7 @@ swfdec_player_initialize (SwfdecPlayer *player, guint version,
     }
   }
   SWFDEC_INFO ("initializing player to size %ux%u", width, height);
+  swfdec_player_create_security (player, version);
   player->rate = rate;
   player->width = width;
   player->height = height;
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index f5c2557..fa34f68 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -25,6 +25,7 @@
 #include <libswfdec/swfdec_audio.h>
 #include <libswfdec/swfdec_rect.h>
 #include <libswfdec/swfdec_ringbuffer.h>
+#include <libswfdec/swfdec_security.h>
 #include <libswfdec/swfdec_system.h>
 
 G_BEGIN_DECLS
@@ -62,6 +63,7 @@ struct _SwfdecPlayer
   gboolean		bgcolor_set;		/* TRUE if the background color has been set */
   SwfdecColor		bgcolor;		/* background color */
   SwfdecLoader *	loader;			/* initial loader */
+  SwfdecSecurity *	security;		/* the default security */
   /* stage properties */
   guint			internal_width;		/* width used by the scripting engine */
   guint			internal_height;	/* height used by the scripting engine */
commit 01bc1a4f6f6ee518b86fad561bd1887c53b3c35e
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 20:17:07 2007 +0200

    spec files deserve to die, too

diff --git a/Makefile.am b/Makefile.am
index a9cb6fc..27849d7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -28,7 +28,6 @@ EXTRA_DIST=depcomp \
 	ChangeLog \
 	autogen.sh \
 	gtk-doc.make \
-	swfdec.spec \
 	m4/as-compiler-flag.m4 \
 	m4/ax_create_stdint_h.m4 \
 	m4/gtk-doc.m4
diff --git a/configure.ac b/configure.ac
index 75e5a0a..fd4e7f3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -333,7 +333,6 @@ vivified/dock/Makefile
 vivified/ui/Makefile
 swfdec.pc
 swfdec-gtk.pc
-swfdec.spec
 )
 
 AC_OUTPUT
diff --git a/swfdec.spec.in b/swfdec.spec.in
deleted file mode 100644
index bcbccec..0000000
--- a/swfdec.spec.in
+++ /dev/null
@@ -1,92 +0,0 @@
-Name:		swfdec
-Version:	@VERSION@
-Release:	gst.2
-Summary:	Flash animations redering library
-
-Group:		Libraries/Multimedia
-License:	LGPL
-URL:		http://swfdec.sourceforge.net/
-Vendor:         GStreamer Backpackers Team <package at gstreamer.net>
-Source:		http://swfdec.sourceforge.net/download/%{name}-%{version}.tar.gz
-BuildRoot:	%{_tmppath}/%{name}-root
-BuildRequires:  mozilla-devel
-BuildRequires:	gtk2-devel => 2.2.0
-Requires:	gtk2 => 2.2.0
-Prereq:		/sbin/ldconfig
-
-%description
-Libswfdec is a library for rendering Flash animations. Currently it handles mostFlash 3 animations and some Flash 4. No interactivity is supported yet.
-
-%package devel
-Summary:	swfdec development files and static libraries.
-Group:		Development/Libraries
-Requires:	%{name} = %{version}-%{release}
-
-%description devel
-swfdec-devel contains the files needed to build packages that depend on swfdec.
-
-%package mozilla
-Summary: Mozilla plugin for Flash rendering
-Group:   Applications/Internet
-Requires:  %{name} = %{version}-%{release}
-Requires:  mozilla
-
-%description mozilla
-Mozilla plugin for rendering of Flash animations based on swfdec library
-
-%prep
-%setup -q 
-
-%build
-CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --enable-shared
-make
-
-%install
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
-
-%makeinstall
-# Clean out files that should not be part of the rpm.
-# This is the recommended way of dealing with it for RH8
-rm -f $RPM_BUILD_ROOT%{_libdir}/mozilla/plugins/*.la
-rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
-rm -f $RPM_BUILD_ROOT%{_libdir}/gtk-2.0/2.2.0/loaders/swf_loader.la
-rm -f $RPM_BUILD_ROOT%{_sysconfdir}/gtk-2.0/gdk-pixbuf.loaders
-%clean
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
-
-%post
-/sbin/ldconfig
-mkdir -p %{_sysconfdir}/gtk-2.0
-gdk-pixbuf-query-loaders > %{_sysconfdir}/gtk-2.0/gdk-pixbuf.loaders
-
-%postun
-/sbin/ldconfig
-gdk-pixbuf-query-loaders > %{_sysconfdir}/gtk-2.0/gdk-pixbuf.loaders
-
-
-%files
-%defattr(-,root,root)
-%doc AUTHORS COPYING NEWS README TODO 
-%{_bindir}/swf_play
-%{_libdir}/libswfdec.so.*
-%{_libdir}/gtk-2.0/2.2.0/loaders/swf_loader.so
-
-%files devel
-%defattr(-,root,root)
-%{_libdir}/libswfdec.a
-%{_libdir}/libswfdec.so
-%{_libdir}/pkgconfig/swfdec.pc
-%{_includedir}/swfdec/swf.h
-%{_includedir}/swfdec/swfdec.h
-%{_libdir}/gtk-2.0/2.2.0/loaders/swf_loader.a
-
-%files mozilla
-%defattr(-,root,root)
-%{_libdir}/mozilla/plugins/libmozswfdec.so*
-%{_libdir}/mozilla/plugins/libmozswfdec.a
-
-%changelog
-* Wed Feb 05 2003 Christian F.K. Schaller <Uraeus at linuxrising.org>
-- Update spec to handle pixbuf loader
-* Sat Oct 26 2002 Christian F.K. Schaller <Uraeus at linuxrising.org>
-- First attempt at spec
commit a15bfb5e6edc48d2720017b239c1873ae109be10
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 20:15:53 2007 +0200

    remove debian dir
    
    This should have been dead for ages

diff --git a/debian/.gitignore b/debian/.gitignore
deleted file mode 100644
index 7ac83b2..0000000
--- a/debian/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-CVS
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 409b62e..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,54 +0,0 @@
-swfdec (0.2.0-2) unstable; urgency=low
-
-  * Remove installation of (empty) changelong (Closes: #179227)
-  * Fix swfdec.pc file and package dependency (Closes: #179223)
-  * Add workaround for mozilla-snapshot not loading plug-ins
-    from /usr/lib/mozilla/plugins. (might fix 169404)
-
- -- David Schleef <ds at schleef.org>  Fri, 31 Jan 2003 11:23:07 -0800
-
-swfdec (0.2.0-1) unstable; urgency=low
-
-  * New upstream release
-   - Fixes image rendering (Closes: #170243)
-
- -- David Schleef <ds at schleef.org>  Thu, 23 Jan 2003 01:29:59 -0800
-
-swfdec (0.1.3-1) unstable; urgency=low
-
-  * New upstream release
-
- -- David Schleef <ds at schleef.org>  Thu, 21 Nov 2002 01:37:53 -0800
-
-swfdec (0.1.2-3) unstable; urgency=low
-
-  * debian/control: Add depends on libart2.0-dev, since the headers
-    pull in libart (this fixes an upstream bug)
-
- -- David Schleef <ds at schleef.org>  Mon, 11 Nov 2002 14:36:09 -0800
-
-swfdec (0.1.2-2) unstable; urgency=low
-
-  * debian/copyright: fix download location (Closes: #167906)
-  * debian/rules: actually install docs
-
- -- David Schleef <ds at schleef.org>  Tue, 05 Nov 2002 17:22:57 -0800
-
-swfdec (0.1.2-1) unstable; urgency=low
-
-  * new release
-
- -- David Schleef <ds at schleef.org>  Fri, 01 Nov 2002 14:56:46 -0800
-
-libswfdec (0.1.1-1) unstable; urgency=low
-
-  * new release
-
- -- David Schleef <ds at schleef.org>  Sat, 14 Sep 2002 16:44:26 -0700
-
-swfdec (0.1.0-1) unstable; urgency=low
-
-  * Initial Release.
-
- -- David Schleef <ds at schleef.org>  Fri, 13 Sep 2002 19:00:10 -0700
-
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 09e946a..0000000
--- a/debian/control
+++ /dev/null
@@ -1,36 +0,0 @@
-Source: swfdec
-Priority: optional
-Maintainer: David Schleef <ds at schleef.org>
-Build-Depends: debhelper (>> 3.0.0), libgtk2.0-dev, mozilla-dev, libart-2.0-dev, zlib1g-dev, libmad0-dev, libsdl1.2-dev
-Standards-Version: 3.5.6
-
-Package: libswfdec-dev
-Section: libdevel
-Architecture: any
-Depends: libswfdec0 (= ${Source-Version}), libglib2.0-dev
-Description: SWF (Macromedia Flash) decoder libaray
- A decoder library for Macromedia Flash animations, which are often
- found on web sites.  This is the development portion of the library,
- intended to be installed if you intend to compile or develop
- applications that use the library.
-
-Package: libswfdec0
-Section: libs
-Architecture: any
-Depends: ${shlibs:Depends}
-Description: SWF (Macromedia Flash) decoder libaray
- A decoder library for Macromedia Flash animations, which are often
- found on web sites.  This is the run-time portion of the library.
-
-Package: swf-player
-Section: utils
-Architecture: any
-Depends: ${shlibs:Depends}
-Description: SWF (Macromedia Flash) player
- A GTK+ and SDL based player for Macromedia Flash animations.  Includes
- a Mozilla plugin, that embeds the player into Mozilla-based browsers,
- in order to allow seamless viewing of Flash animations in web
- pages.  Includes a GdkPixbuf loader, so that SWF animations can be
- used seamlessly as images in Gtk+ applications.
-
-
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 3d0dbfd..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,10 +0,0 @@
-This package was debianized by David Schleef <ds at schleef.org> on
-Fri, 13 Sep 2002 19:00:10 -0700.
-
-It was downloaded from http://swfdec.sourceforge.net/.
-
-Upstream Author(s): David Schleef <ds at schleef.org>
-
-Copyright:
-
-LGPL
diff --git a/debian/libswfdec-dev.dirs b/debian/libswfdec-dev.dirs
deleted file mode 100644
index 4418816..0000000
--- a/debian/libswfdec-dev.dirs
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/lib
-usr/include
diff --git a/debian/libswfdec-dev.files b/debian/libswfdec-dev.files
deleted file mode 100644
index 2164966..0000000
--- a/debian/libswfdec-dev.files
+++ /dev/null
@@ -1,5 +0,0 @@
-usr/include/*
-usr/lib/lib*.a
-usr/lib/lib*.so
-usr/lib/lib*.sa
-usr/lib/pkgconfig/*.pc
diff --git a/debian/libswfdec0.dirs b/debian/libswfdec0.dirs
deleted file mode 100644
index 6845771..0000000
--- a/debian/libswfdec0.dirs
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib
diff --git a/debian/libswfdec0.files b/debian/libswfdec0.files
deleted file mode 100644
index d0dbfd1..0000000
--- a/debian/libswfdec0.files
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib/lib*.so.*
diff --git a/debian/libswfdec0.shlibs b/debian/libswfdec0.shlibs
deleted file mode 100644
index 87ab9a4..0000000
--- a/debian/libswfdec0.shlibs
+++ /dev/null
@@ -1 +0,0 @@
-libswfdec 0 libswfdec0 (>= 0.1.2)
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 86d0ffe..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/usr/bin/make -f
-# Sample debian/rules that uses debhelper.
-# GNU copyright 1997 to 1999 by Joey Hess.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-# This is the debhelper compatibility version to use.
-export DH_COMPAT=3
-
-# These are used for cross-compiling and for saving the configure script
-# from having to guess our platform (since we know it already)
-DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
-DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
-
-
-ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
-	CFLAGS += -g
-endif
-ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
-	INSTALL_PROGRAM += -s
-endif
-
-# shared library versions, option 1
-version=2.0.5
-major=2
-# option 2, assuming the library is created as src/.libs/libfoo.so.2.0.5 or so
-#version=`ls src/.libs/lib*.so.* | \
-# awk '{if (match($$0,/[0-9]+\.[0-9]+\.[0-9]+$$/)) print substr($$0,RSTART)}'`
-#major=`ls src/.libs/lib*.so.* | \
-# awk '{if (match($$0,/\.so\.[0-9]+$$/)) print substr($$0,RSTART+4)}'`
-
-config.status: configure
-	dh_testdir
-	# Add here commands to configure the package.
-	./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
-
-
-build: build-stamp
-build-stamp:  config.status
-	dh_testdir
-
-	# Add here commands to compile the package.
-	$(MAKE)
-
-	touch build-stamp
-
-clean:
-	dh_testdir
-	dh_testroot
-	rm -f build-stamp 
-
-	# Add here commands to clean up after the build process.
-	-$(MAKE) distclean
-	-test -r /usr/share/misc/config.sub && \
-	  cp -f /usr/share/misc/config.sub config.sub
-	-test -r /usr/share/misc/config.guess && \
-	  cp -f /usr/share/misc/config.guess config.guess
-
-
-	dh_clean
-
-install: build
-	dh_testdir
-	dh_testroot
-	dh_clean -k
-	dh_installdirs
-
-	# Add here commands to install the package into debian/tmp
-	$(MAKE) install prefix=$(CURDIR)/debian/tmp/usr
-
-	mkdir -p debian/tmp/usr/lib/mozilla-snapshot/plugins
-	cd debian/tmp/usr/lib/mozilla-snapshot/plugins && ln -s ../../mozilla/plugins/libmozswfdec.so .
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
-	dh_testdir
-	dh_testroot
-	dh_movefiles
-
-#	dh_installdebconf	
-	dh_installdocs -A README TODO
-	dh_installexamples
-	dh_installmenu
-#	dh_installlogrotate
-#	dh_installemacsen
-#	dh_installpam
-#	dh_installmime
-#	dh_installinit
-	dh_installcron
-	dh_installman
-	dh_installinfo
-#	dh_undocumented
-	dh_installchangelogs
-	dh_link
-	dh_strip
-	dh_compress
-	dh_fixperms
-	dh_makeshlibs
-	dh_installdeb
-#	dh_perl
-	dh_shlibdeps
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install 
diff --git a/debian/swf-player.dirs b/debian/swf-player.dirs
deleted file mode 100644
index e742ee4..0000000
--- a/debian/swf-player.dirs
+++ /dev/null
@@ -1,3 +0,0 @@
-usr/bin
-usr/lib/mozilla/plugins
-usr/lib/mozilla-snapshot/plugins
diff --git a/debian/swf-player.files b/debian/swf-player.files
deleted file mode 100644
index 6c53087..0000000
--- a/debian/swf-player.files
+++ /dev/null
@@ -1,5 +0,0 @@
-usr/bin/*
-usr/lib/mozilla/plugins/*.so
-usr/lib/gtk-2.0/*/loaders/*.so
-usr/lib/gtk-2.0/*/loaders/*.la
-usr/lib/mozilla-snapshot/plugins/*.so
commit dca4a26e7bbbb1d524ea1dd9e94628cbae4e2056
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 20:10:12 2007 +0200

    add the first signs of the flash security model

diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index 771440a..3bab53b 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -65,6 +65,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES = \
 	swfdec_file_loader.c \
 	swfdec_filter.c \
 	swfdec_filter_as.c \
+	swfdec_flash_security.c \
 	swfdec_flv_decoder.c \
 	swfdec_font.c \
 	swfdec_graphic.c \
@@ -195,6 +196,7 @@ noinst_HEADERS = \
 	swfdec_text_field_movie.h \
 	swfdec_event.h \
 	swfdec_filter.h \
+	swfdec_flash_security.h \
 	swfdec_flv_decoder.h \
 	swfdec_font.h \
 	swfdec_graphic.h \
diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c
new file mode 100644
index 0000000..0b6d07c
--- /dev/null
+++ b/libswfdec/swfdec_flash_security.c
@@ -0,0 +1,105 @@
+/* Swfdec
+ * 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 <string.h>
+#include "swfdec_flash_security.h"
+#include "swfdec_debug.h"
+#include "swfdec_security_allow.h"
+
+
+G_DEFINE_TYPE (SwfdecFlashSecurity, swfdec_flash_security, SWFDEC_TYPE_SECURITY)
+
+static SwfdecSecurity *
+swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key)
+{
+  if (SWFDEC_IS_SECURITY_ALLOW (key)) {
+    return g_object_ref (guard);
+  } else if (SWFDEC_IS_FLASH_SECURITY (key)) {
+    SwfdecFlashSecurity *fguard, *fkey, *ret;
+    fguard = SWFDEC_FLASH_SECURITY (guard);
+    fkey = SWFDEC_FLASH_SECURITY (key);
+
+    ret = g_object_new (SWFDEC_TYPE_FLASH_SECURITY, NULL);
+    ret->allow_local = fguard->allow_local && fkey->allow_local;
+    ret->allow_remote = fguard->allow_remote && fkey->allow_remote;
+    return SWFDEC_SECURITY (ret);
+  } else {
+    SWFDEC_ERROR ("unknown security %s, denying access", G_OBJECT_TYPE_NAME (key));
+    return NULL;
+  }
+}
+
+static gboolean
+swfdec_flash_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url)
+{
+  SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (guard);
+
+  if (swfdec_url_has_protocol (url, "http")) {
+    return sec->allow_remote;
+  } else if (swfdec_url_has_protocol (url, "file")) {
+    return sec->allow_local;
+  } else {
+    SWFDEC_ERROR ("unknown protocol %s, denying access", swfdec_url_get_protocol (url));
+    return FALSE;
+  }
+}
+
+static void
+swfdec_flash_security_class_init (SwfdecFlashSecurityClass *klass)
+{
+  SwfdecSecurityClass *security_class = SWFDEC_SECURITY_CLASS (klass);
+
+  security_class->allow = swfdec_flash_security_allow;
+  security_class->allow_url = swfdec_flash_security_allow_url;
+}
+
+static void
+swfdec_flash_security_init (SwfdecFlashSecurity *sec)
+{
+  sec->allow_local = TRUE;
+  sec->allow_remote = TRUE;
+}
+
+/**
+ * swfdec_flash_security_new:
+ *
+ * Creates a new Security object that allows everything. These objects are used 
+ * by default when no other security object is in use. This is particularly 
+ * useful for script engines that are not security sensitive or code injection
+ * via debugging.
+ *
+ * Returns: a new #SwfdecSecurity object
+ **/
+SwfdecSecurity *
+swfdec_flash_security_new (void)
+{
+  static SwfdecSecurity *singleton = NULL;
+  
+  /* FIXME: not threadsafe */
+  if (singleton)
+    return g_object_ref (singleton);
+
+  singleton = g_object_new (SWFDEC_TYPE_FLASH_SECURITY, NULL);
+  g_object_add_weak_pointer (G_OBJECT (singleton), (gpointer) &singleton);
+  return singleton;
+}
diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h
new file mode 100644
index 0000000..3cbb7cb
--- /dev/null
+++ b/libswfdec/swfdec_flash_security.h
@@ -0,0 +1,56 @@
+/* Swfdec
+ * 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
+ */
+
+#ifndef _SWFDEC_FLASH_SECURITY_H_
+#define _SWFDEC_FLASH_SECURITY_H_
+
+#include <libswfdec/swfdec_security.h>
+
+G_BEGIN_DECLS
+
+typedef struct _SwfdecFlashSecurity SwfdecFlashSecurity;
+typedef struct _SwfdecFlashSecurityClass SwfdecFlashSecurityClass;
+
+#define SWFDEC_TYPE_FLASH_SECURITY                    (swfdec_flash_security_get_type())
+#define SWFDEC_IS_FLASH_SECURITY(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_FLASH_SECURITY))
+#define SWFDEC_IS_FLASH_SECURITY_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_FLASH_SECURITY))
+#define SWFDEC_FLASH_SECURITY(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_FLASH_SECURITY, SwfdecFlashSecurity))
+#define SWFDEC_FLASH_SECURITY_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_FLASH_SECURITY, SwfdecFlashSecurityClass))
+#define SWFDEC_FLASH_SECURITY_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_FLASH_SECURITY, SwfdecFlashSecurityClass))
+
+struct _SwfdecFlashSecurity
+{
+  SwfdecSecurity	security;
+
+  gboolean		allow_local;	/* TRUE to allow access to local ressources */
+  gboolean		allow_remote;	/* TRUE to allow access to remote resources */
+};
+
+struct _SwfdecFlashSecurityClass
+{
+  SwfdecSecurityClass 	security_class;
+};
+
+GType			swfdec_flash_security_get_type	(void);
+
+SwfdecSecurity *	swfdec_flash_security_new	(void);
+
+
+G_END_DECLS
+#endif
commit 292929cb6f3edaa413de648e0a1d11bae5229735
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 19:38:39 2007 +0200

    add security files

diff --git a/doc/Makefile.am b/doc/Makefile.am
index f846b32..68cc5ac 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -90,6 +90,7 @@ IGNORE_HFILES= \
 	swfdec_event.h \
 	swfdec_filter.h \
 	swfdec_flv_decoder.h \
+	swfdec_flash_security.h \
 	swfdec_font.h \
 	swfdec_graphic.h \
 	swfdec_graphic_movie.h \
@@ -117,6 +118,7 @@ IGNORE_HFILES= \
 	swfdec_script.h \
 	swfdec_script_internal.h \
 	swfdec_security.h \
+	swfdec_security_allow.h \
 	swfdec_shape.h \
 	swfdec_shape_parser.h \
 	swfdec_sound.h \
commit 0f8f1d32c3ec70001b0a451b9ee091c2b6cec620
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 19:38:19 2007 +0200

    add swfdec_url_has_protocol()

diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt
index e269718..0c22165 100644
--- a/doc/swfdec-sections.txt
+++ b/doc/swfdec-sections.txt
@@ -58,6 +58,7 @@ swfdec_url_free
 swfdec_url_get_host
 swfdec_url_get_path
 swfdec_url_get_protocol
+swfdec_url_has_protocol
 swfdec_url_get_query
 swfdec_url_get_url
 swfdec_url_new
diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c
index 2d01827..cb5db48 100644
--- a/libswfdec/swfdec_url.c
+++ b/libswfdec/swfdec_url.c
@@ -138,7 +138,7 @@ swfdec_url_new_relative (const SwfdecURL *url, const char *string)
   g_string_append (str, "://");
   if (url->host)
     g_string_append (str, url->host);
-  if (string[0] == '/' && !g_str_equal (swfdec_url_get_protocol (url), "file")) {
+  if (string[0] == '/' && !swfdec_url_has_protocol (url, "file")) {
     /* absolute URL */
     g_string_append (str, string);
   } else {
@@ -242,6 +242,24 @@ swfdec_url_get_protocol (const SwfdecURL *url)
 }
 
 /**
+ * swfdec_url_has_protocol:
+ * @url: a url
+ * @protocol: protocol name to check for
+ *
+ * Checks if the given @url references the given @protocol
+ *
+ * Returns: %TRUE if both protocols match, %FALSE otherwise
+ **/
+gboolean
+swfdec_url_has_protocol (const SwfdecURL *url, const char *protocol)
+{
+  g_return_val_if_fail (url != NULL, FALSE);
+  g_return_val_if_fail (protocol != NULL, FALSE);
+
+  return g_str_equal (url->protocol, protocol);
+}
+
+/**
  * swfdec_url_get_host:
  * @url: a #SwfdecURL
  *
diff --git a/libswfdec/swfdec_url.h b/libswfdec/swfdec_url.h
index d3c4e24..6bf46fc 100644
--- a/libswfdec/swfdec_url.h
+++ b/libswfdec/swfdec_url.h
@@ -40,6 +40,9 @@ const char *		swfdec_url_get_protocol		(const SwfdecURL *      url);
 const char *		swfdec_url_get_host		(const SwfdecURL *      url);
 const char *		swfdec_url_get_path		(const SwfdecURL *      url);
 const char *		swfdec_url_get_query		(const SwfdecURL *      url);
+
+gboolean		swfdec_url_has_protocol		(const SwfdecURL *	url,
+							 const char *		protocol);
 							 
 
 G_END_DECLS
commit 6d60bb9a31ef13b22e9785316678d04c1f3f0960
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 19:26:39 2007 +0200

    add swfdec_as_object_run_with_security()

diff --git a/libswfdec/swfdec_as_internal.h b/libswfdec/swfdec_as_internal.h
index df7e70a..ee49ef2 100644
--- a/libswfdec/swfdec_as_internal.h
+++ b/libswfdec/swfdec_as_internal.h
@@ -66,6 +66,10 @@ void		swfdec_as_object_decode		(SwfdecAsObject *	obj,
 SwfdecAsObject * swfdec_as_object_prototype_for_version (SwfdecAsObject *object,
 						 guint			version,
 						 gboolean		check7);
+void		swfdec_as_object_run_with_security 
+						(SwfdecAsObject *	object,
+						 SwfdecScript *		script,
+						 SwfdecSecurity *	sec);
 
 
 G_END_DECLS
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index 0ff384b..765a56c 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -33,6 +33,7 @@
 #include "swfdec_as_strings.h"
 #include "swfdec_debug.h"
 #include "swfdec_movie.h"
+#include "swfdec_security_allow.h"
 
 #define SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT 256
 
@@ -1013,26 +1014,22 @@ swfdec_as_object_add_constructor (SwfdecAsObject *object, const char *name, GTyp
   return function;
 }
 
-/**
- * swfdec_as_object_run:
- * @object: a #SwfdecAsObject
- * @script: script to execute
- *
- * Executes the given @script with @object as this pointer.
- **/
 void
-swfdec_as_object_run (SwfdecAsObject *object, SwfdecScript *script)
+swfdec_as_object_run_with_security (SwfdecAsObject *object, SwfdecScript *script,
+    SwfdecSecurity *sec)
 {
   SwfdecAsContext *context;
   SwfdecAsFrame *frame;
 
   g_return_if_fail (SWFDEC_IS_AS_OBJECT (object));
   g_return_if_fail (script != NULL);
+  g_return_if_fail (SWFDEC_IS_SECURITY (sec));
 
   context = object->context;
   frame = swfdec_as_frame_new (context, script);
   if (frame == NULL)
     return;
+  swfdec_as_frame_set_security (frame, sec);
   swfdec_as_frame_set_this (frame, object);
   swfdec_as_frame_preload (frame);
   swfdec_as_context_run (context);
@@ -1040,6 +1037,26 @@ swfdec_as_object_run (SwfdecAsObject *object, SwfdecScript *script)
 }
 
 /**
+ * swfdec_as_object_run:
+ * @object: a #SwfdecAsObject
+ * @script: script to execute
+ *
+ * Executes the given @script with @object as this pointer.
+ **/
+void
+swfdec_as_object_run (SwfdecAsObject *object, SwfdecScript *script)
+{
+  SwfdecSecurity *sec;
+
+  g_return_if_fail (SWFDEC_IS_AS_OBJECT (object));
+  g_return_if_fail (script != NULL);
+
+  sec = swfdec_security_allow_new ();
+  swfdec_as_object_run_with_security (object, script, sec);
+  g_object_unref (sec);
+}
+
+/**
  * swfdec_as_object_call:
  * @object: a #SwfdecAsObject
  * @name: garbage-collected string naming the function to call. 
commit a00874ae40d7168a215891695cc170a83b4469d2
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 19:21:10 2007 +0200

    make functions have a security context associated with them

diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 1596041..5582f2b 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -856,3 +856,30 @@ swfdec_as_frame_get_this (SwfdecAsFrame *frame)
 
   return frame->thisp;
 }
+
+/**
+ * swfdec_as_frame_set_security:
+ * @frame: the frame to be executed
+ * @guard: the security guarding this frame
+ *
+ * Checks that @guard allows executing the frame. The frame's security will
+ * be set to what @guard returns. By default, a frame has the security of
+ * its parent frame. If it's the first frame, it's allowed everything.
+ **/
+void
+swfdec_as_frame_set_security (SwfdecAsFrame *frame, SwfdecSecurity *guard)
+{
+  SwfdecSecurity *old;
+
+  g_return_if_fail (SWFDEC_IS_AS_FRAME (frame));
+  g_return_if_fail (SWFDEC_IS_SECURITY (guard));
+
+  /* execution is not allowed anyway */
+  if (frame->security == NULL)
+    return;
+
+  old = frame->security;
+  frame->security = swfdec_security_allow (guard, old);
+  g_object_unref (old);
+}
+
diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h
index 4088f3d..b09fb9c 100644
--- a/libswfdec/swfdec_as_frame_internal.h
+++ b/libswfdec/swfdec_as_frame_internal.h
@@ -70,6 +70,8 @@ SwfdecAsFrame *	swfdec_as_frame_new_native	(SwfdecAsContext *	context);
 void		swfdec_as_frame_return		(SwfdecAsFrame *	frame,
 						 SwfdecAsValue *	return_value);
 
+void		swfdec_as_frame_set_security	(SwfdecAsFrame *	frame,
+						 SwfdecSecurity *	guard);
 void		swfdec_as_frame_set_this	(SwfdecAsFrame *	frame,
 						 SwfdecAsObject *	thisp);
 void		swfdec_as_frame_preload		(SwfdecAsFrame *	frame);
diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c
index 1178b0c..18970b1 100644
--- a/libswfdec/swfdec_as_function.c
+++ b/libswfdec/swfdec_as_function.c
@@ -134,6 +134,8 @@ swfdec_as_function_call (SwfdecAsFunction *function, SwfdecAsObject *thisp, guin
   /* FIXME: figure out what to do in these situations */
   if (frame == NULL)
     return;
+  if (function->priv)
+    swfdec_as_frame_set_security (frame, function->priv);
   /* second check especially for super object */
   if (thisp != NULL && frame->thisp == NULL)
     swfdec_as_frame_set_this (frame, swfdec_as_object_resolve (thisp));
@@ -254,3 +256,21 @@ swfdec_as_function_init_context (SwfdecAsContext *context, guint version)
       &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
 }
 
+/**
+ * swfdec_as_function_set_security:
+ * @fun: a #SwfdecFunction
+ * @sec: the security guarding calls to this function
+ *
+ * Sets the security object guarding execution of this function. This function
+ * may only be called once per #SwfdecAsFunction.
+ **/
+void
+swfdec_as_function_set_security (SwfdecAsFunction *fun, SwfdecSecurity *sec)
+{
+  g_return_if_fail (SWFDEC_IS_AS_FUNCTION (fun));
+  g_return_if_fail (SWFDEC_IS_SECURITY (sec));
+  g_return_if_fail (fun->priv == NULL);
+
+  fun->priv = g_object_ref (sec);
+}
+
diff --git a/libswfdec/swfdec_as_function.h b/libswfdec/swfdec_as_function.h
index 534aad5..ab2c364 100644
--- a/libswfdec/swfdec_as_function.h
+++ b/libswfdec/swfdec_as_function.h
@@ -39,6 +39,8 @@ typedef struct _SwfdecAsFunctionClass SwfdecAsFunctionClass;
 struct _SwfdecAsFunction {
   /*< private >*/
   SwfdecAsObject	object;
+
+  gpointer		priv;		/* currently only contains the security context or NULL for any */
 };
 
 struct _SwfdecAsFunctionClass {
diff --git a/libswfdec/swfdec_as_internal.h b/libswfdec/swfdec_as_internal.h
index 98189a5..df7e70a 100644
--- a/libswfdec/swfdec_as_internal.h
+++ b/libswfdec/swfdec_as_internal.h
@@ -22,6 +22,7 @@
 
 #include <libswfdec/swfdec_as_object.h>
 #include <libswfdec/swfdec_as_types.h>
+#include <libswfdec/swfdec_security.h>
 
 G_BEGIN_DECLS
 
@@ -34,6 +35,8 @@ G_BEGIN_DECLS
 
 
 void		swfdec_as_function_set_constructor (SwfdecAsFunction *	fun);
+void		swfdec_as_function_set_security	(SwfdecAsFunction *	fun,
+						 SwfdecSecurity *	sec);
 void		swfdec_as_function_init_context (SwfdecAsContext *	context,
 						 guint			version);
 
commit 9b0856c41716622156c11e3982234f721b713ca7
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 19:06:55 2007 +0200

    add a SwfdecSecurity to every frame

diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c
index cf80c9a..dd276fc 100644
--- a/libswfdec/swfdec_as_context.c
+++ b/libswfdec/swfdec_as_context.c
@@ -741,6 +741,12 @@ start:
     swfdec_as_context_abort (context, "Stack overflow");
     return;
   }
+  /* if security is NULL, the function may not be called */
+  if (frame->security == NULL) {
+    SWFDEC_WARNING ("insufficient right to call %s", frame->function_name);
+    swfdec_as_frame_return (frame, NULL);
+    goto start;
+  }
   if (SWFDEC_IS_AS_NATIVE_FUNCTION (frame->function)) {
     SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (frame->function);
     SwfdecAsValue rval = { 0, };
diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 619811c..1596041 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -29,6 +29,7 @@
 #include "swfdec_as_strings.h"
 #include "swfdec_as_super.h"
 #include "swfdec_debug.h"
+#include "swfdec_security_allow.h"
 
 /**
  * SECTION:SwfdecAsFrame
@@ -269,6 +270,10 @@ swfdec_as_frame_dispose (GObject *object)
   SwfdecAsFrame *frame = SWFDEC_AS_FRAME (object);
 
   g_slice_free1 (sizeof (SwfdecAsValue) * frame->n_registers, frame->registers);
+  if (frame->security) {
+    g_object_unref (frame->security);
+    frame->security = NULL;
+  }
   if (frame->constant_pool) {
     swfdec_constant_pool_free (frame->constant_pool);
     frame->constant_pool = NULL;
@@ -374,6 +379,11 @@ swfdec_as_frame_load (SwfdecAsFrame *frame)
 {
   SwfdecAsContext *context = SWFDEC_AS_OBJECT (frame)->context;
 
+  if (context->frame) {
+    frame->security = g_object_ref (context->frame->security);
+  } else {
+    frame->security = swfdec_security_allow_new ();
+  }
   frame->stack_begin = context->cur;
   context->base = frame->stack_begin;
   frame->next = context->frame;
diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h
index 7213be3..4088f3d 100644
--- a/libswfdec/swfdec_as_frame_internal.h
+++ b/libswfdec/swfdec_as_frame_internal.h
@@ -22,6 +22,7 @@
 
 #include <libswfdec/swfdec_as_types.h>
 #include <libswfdec/swfdec_script_internal.h>
+#include <libswfdec/swfdec_security.h>
 
 G_BEGIN_DECLS
 
@@ -38,6 +39,7 @@ struct _SwfdecAsFrame {
   SwfdecAsValue *	return_value;	/* pointer to where to store the return value */
   guint			argc;		/* number of arguments */
   const SwfdecAsValue *	argv;		/* arguments or %NULL if taken from stack */
+  SwfdecSecurity *	security;	/* security for this frame or %NULL if not allowed to call */
   /* debugging */
   const char *		function_name;	/* name of function */
   /* script execution */
commit 74443bb75583af3250be76709dbdc87ba17855b0
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 19:06:44 2007 +0200

    make it compile without warnings

diff --git a/libswfdec/swfdec_security_allow.c b/libswfdec/swfdec_security_allow.c
index fafc258..98d915e 100644
--- a/libswfdec/swfdec_security_allow.c
+++ b/libswfdec/swfdec_security_allow.c
@@ -74,6 +74,6 @@ swfdec_security_allow_new (void)
     return g_object_ref (singleton);
 
   singleton = g_object_new (SWFDEC_TYPE_SECURITY_ALLOW, NULL);
-  g_object_add_weak_pointer (singleton, &singleton);
+  g_object_add_weak_pointer (G_OBJECT (singleton), (gpointer) &singleton);
   return singleton;
 }
commit 2d32b67327c47a2421388da869cef6ffb5d18f4f
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 18:49:27 2007 +0200

    document swfdec_security_allow_new() and make it a singleton

diff --git a/libswfdec/swfdec_security_allow.c b/libswfdec/swfdec_security_allow.c
index 035a44c..fafc258 100644
--- a/libswfdec/swfdec_security_allow.c
+++ b/libswfdec/swfdec_security_allow.c
@@ -54,9 +54,26 @@ swfdec_security_allow_init (SwfdecSecurityAllow *security_allow)
 {
 }
 
+/**
+ * swfdec_security_allow_new:
+ *
+ * Creates a new Security object that allows everything. These objects are used 
+ * by default when no other security object is in use. This is particularly 
+ * useful for script engines that are not security sensitive or code injection
+ * via debugging.
+ *
+ * Returns: a new #SwfdecSecurity object
+ **/
 SwfdecSecurity *
 swfdec_security_allow_new (void)
 {
+  static SwfdecSecurity *singleton = NULL;
   
-  return g_object_new (SWFDEC_TYPE_SECURITY_ALLOW, NULL);
+  /* FIXME: not threadsafe */
+  if (singleton)
+    return g_object_ref (singleton);
+
+  singleton = g_object_new (SWFDEC_TYPE_SECURITY_ALLOW, NULL);
+  g_object_add_weak_pointer (singleton, &singleton);
+  return singleton;
 }
commit e8a153927b99cfe9a660d804a215e8f65f1b7983
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 18:39:42 2007 +0200

    add swfdec_security_allow.[ch] - a Security that is totally not secure

diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index c042086..771440a 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -97,6 +97,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES = \
 	swfdec_ringbuffer.c \
 	swfdec_script.c \
 	swfdec_security.c \
+	swfdec_security_allow.c \
 	swfdec_shape.c \
 	swfdec_shape_parser.c \
 	swfdec_sound.c \
@@ -218,6 +219,7 @@ noinst_HEADERS = \
 	swfdec_ringbuffer.h \
 	swfdec_script_internal.h \
 	swfdec_security.h \
+	swfdec_security_allow.h \
 	swfdec_shape.h \
 	swfdec_shape_parser.h \
 	swfdec_sound.h \
diff --git a/libswfdec/swfdec_security_allow.c b/libswfdec/swfdec_security_allow.c
new file mode 100644
index 0000000..035a44c
--- /dev/null
+++ b/libswfdec/swfdec_security_allow.c
@@ -0,0 +1,62 @@
+/* Swfdec
+ * 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 <string.h>
+#include "swfdec_security_allow.h"
+#include "swfdec_debug.h"
+
+
+G_DEFINE_TYPE (SwfdecSecurityAllow, swfdec_security_allow, SWFDEC_TYPE_SECURITY)
+
+static SwfdecSecurity *
+swfdec_security_allow_allow (SwfdecSecurity *guard, SwfdecSecurity *key)
+{
+  return g_object_ref (key);
+}
+
+static gboolean
+swfdec_security_allow_allow_url (SwfdecSecurity *guard, const SwfdecURL *url)
+{
+  return TRUE;
+}
+
+static void
+swfdec_security_allow_class_init (SwfdecSecurityAllowClass *klass)
+{
+  SwfdecSecurityClass *security_class = SWFDEC_SECURITY_CLASS (klass);
+
+  security_class->allow = swfdec_security_allow_allow;
+  security_class->allow_url = swfdec_security_allow_allow_url;
+}
+
+static void
+swfdec_security_allow_init (SwfdecSecurityAllow *security_allow)
+{
+}
+
+SwfdecSecurity *
+swfdec_security_allow_new (void)
+{
+  
+  return g_object_new (SWFDEC_TYPE_SECURITY_ALLOW, NULL);
+}
diff --git a/libswfdec/swfdec_security_allow.h b/libswfdec/swfdec_security_allow.h
new file mode 100644
index 0000000..108ed72
--- /dev/null
+++ b/libswfdec/swfdec_security_allow.h
@@ -0,0 +1,53 @@
+/* Swfdec
+ * 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
+ */
+
+#ifndef _SWFDEC_SECURITY_ALLOW_H_
+#define _SWFDEC_SECURITY_ALLOW_H_
+
+#include <libswfdec/swfdec_security.h>
+
+G_BEGIN_DECLS
+
+typedef struct _SwfdecSecurityAllow SwfdecSecurityAllow;
+typedef struct _SwfdecSecurityAllowClass SwfdecSecurityAllowClass;
+
+#define SWFDEC_TYPE_SECURITY_ALLOW                    (swfdec_security_allow_get_type())
+#define SWFDEC_IS_SECURITY_ALLOW(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SECURITY_ALLOW))
+#define SWFDEC_IS_SECURITY_ALLOW_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SECURITY_ALLOW))
+#define SWFDEC_SECURITY_ALLOW(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SECURITY_ALLOW, SwfdecSecurityAllow))
+#define SWFDEC_SECURITY_ALLOW_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SECURITY_ALLOW, SwfdecSecurityAllowClass))
+#define SWFDEC_SECURITY_ALLOW_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SECURITY_ALLOW, SwfdecSecurityAllowClass))
+
+struct _SwfdecSecurityAllow
+{
+  SwfdecSecurity	security;
+};
+
+struct _SwfdecSecurityAllowClass
+{
+  SwfdecSecurityClass 	security_class;
+};
+
+GType			swfdec_security_allow_get_type	(void);
+
+SwfdecSecurity *	swfdec_security_allow_new	(void);
+
+
+G_END_DECLS
+#endif
commit 679cb09a4b8cb37151cd84cdd0609db49c0d51f3
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 18:18:42 2007 +0200

    that function doesn't actually exist

diff --git a/libswfdec/swfdec_security.h b/libswfdec/swfdec_security.h
index aeda8ae..1bfaf3f 100644
--- a/libswfdec/swfdec_security.h
+++ b/libswfdec/swfdec_security.h
@@ -52,8 +52,6 @@ struct _SwfdecSecurityClass
 
 GType			swfdec_security_get_type	(void);
 
-SwfdecSecurity *	swfdec_security_new_default	(SwfdecSecurity *	sec);
-
 SwfdecSecurity *	swfdec_security_allow		(SwfdecSecurity *	guard,
 							 SwfdecSecurity *	key);
 gboolean		swfdec_security_allow_url	(SwfdecSecurity *	guard,
commit a66af9e1a3ab9c7e9eb6d30508484b3739ab7bbd
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 18:18:28 2007 +0200

    fix header

diff --git a/libswfdec/swfdec_security.c b/libswfdec/swfdec_security.c
index bbe8c6e..dfd66b3 100644
--- a/libswfdec/swfdec_security.c
+++ b/libswfdec/swfdec_security.c
@@ -24,7 +24,6 @@
 #include <string.h>
 #include "swfdec_security.h"
 #include "swfdec_debug.h"
-#include "swfdec_decoder.h"
 
 
 G_DEFINE_ABSTRACT_TYPE (SwfdecSecurity, swfdec_security, G_TYPE_OBJECT)
commit 231a35360a01d04cb478430c494db54384bcf2b9
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 17:47:31 2007 +0200

    add SwfdecSecurity object

diff --git a/doc/Makefile.am b/doc/Makefile.am
index bb67895..f846b32 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -116,7 +116,7 @@ IGNORE_HFILES= \
 	swfdec_root_sprite.h \
 	swfdec_script.h \
 	swfdec_script_internal.h \
-	swfdec_scriptable.h \
+	swfdec_security.h \
 	swfdec_shape.h \
 	swfdec_shape_parser.h \
 	swfdec_sound.h \
diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index 0c2e2a6..c042086 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -96,6 +96,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES = \
 	swfdec_rectangle.c \
 	swfdec_ringbuffer.c \
 	swfdec_script.c \
+	swfdec_security.c \
 	swfdec_shape.c \
 	swfdec_shape_parser.c \
 	swfdec_sound.c \
@@ -216,6 +217,7 @@ noinst_HEADERS = \
 	swfdec_rect.h \
 	swfdec_ringbuffer.h \
 	swfdec_script_internal.h \
+	swfdec_security.h \
 	swfdec_shape.h \
 	swfdec_shape_parser.h \
 	swfdec_sound.h \
diff --git a/libswfdec/swfdec_security.c b/libswfdec/swfdec_security.c
new file mode 100644
index 0000000..bbe8c6e
--- /dev/null
+++ b/libswfdec/swfdec_security.c
@@ -0,0 +1,88 @@
+/* Swfdec
+ * 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 <string.h>
+#include "swfdec_security.h"
+#include "swfdec_debug.h"
+#include "swfdec_decoder.h"
+
+
+G_DEFINE_ABSTRACT_TYPE (SwfdecSecurity, swfdec_security, G_TYPE_OBJECT)
+
+static void
+swfdec_security_class_init (SwfdecSecurityClass *klass)
+{
+}
+
+static void
+swfdec_security_init (SwfdecSecurity *security)
+{
+}
+
+/**
+ * swfdec_security_allow:
+ * @guard: security guarding an operation
+ * @key: security available
+ *
+ * Asks @guard to check if the given @key allows accessing it. If so, a
+ * key for accessing the operation is returned.
+ *
+ * Returns: %NULL if access was not granted, otherwise the new security 
+ *          priviliges for accessing the operation. Use g_object_unref() after
+ *          use.
+ **/
+SwfdecSecurity *
+swfdec_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key)
+{
+  SwfdecSecurityClass *klass;
+
+  g_return_val_if_fail (SWFDEC_IS_SECURITY (guard), NULL);
+  g_return_val_if_fail (SWFDEC_IS_SECURITY (key), NULL);
+
+  klass = SWFDEC_SECURITY_GET_CLASS (guard);
+  g_return_val_if_fail (klass->allow, NULL);
+  return klass->allow (guard, key);
+}
+
+/**
+ * swfdec_security_allow_url:
+ * @guard: security that is in effect
+ * @url: URL that should be accessed
+ *
+ * Asks @guard to check if the given @url may be accessed.
+ *
+ * Returns: %TRUE if @url may be accessed.
+ **/
+gboolean
+swfdec_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url)
+{
+  SwfdecSecurityClass *klass;
+
+  g_return_val_if_fail (SWFDEC_IS_SECURITY (guard), FALSE);
+  g_return_val_if_fail (url != NULL, FALSE);
+
+  klass = SWFDEC_SECURITY_GET_CLASS (guard);
+  g_return_val_if_fail (klass->allow_url, FALSE);
+  return klass->allow_url (guard, url);
+}
+
diff --git a/libswfdec/swfdec_security.h b/libswfdec/swfdec_security.h
new file mode 100644
index 0000000..aeda8ae
--- /dev/null
+++ b/libswfdec/swfdec_security.h
@@ -0,0 +1,64 @@
+/* Swfdec
+ * 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
+ */
+
+#ifndef _SWFDEC_SECURITY_H_
+#define _SWFDEC_SECURITY_H_
+
+#include <glib-object.h>
+#include <libswfdec/swfdec_url.h>
+
+G_BEGIN_DECLS
+
+typedef struct _SwfdecSecurity SwfdecSecurity;
+typedef struct _SwfdecSecurityClass SwfdecSecurityClass;
+
+#define SWFDEC_TYPE_SECURITY                    (swfdec_security_get_type())
+#define SWFDEC_IS_SECURITY(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SECURITY))
+#define SWFDEC_IS_SECURITY_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SECURITY))
+#define SWFDEC_SECURITY(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SECURITY, SwfdecSecurity))
+#define SWFDEC_SECURITY_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SECURITY, SwfdecSecurityClass))
+#define SWFDEC_SECURITY_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SECURITY, SwfdecSecurityClass))
+
+struct _SwfdecSecurity
+{
+  GObject		object;
+};
+
+struct _SwfdecSecurityClass
+{
+  GObjectClass		object_class;
+
+  SwfdecSecurity *	(* allow)			(SwfdecSecurity *	guard,
+							 SwfdecSecurity *	from);
+  gboolean		(* allow_url)			(SwfdecSecurity *	guard,
+							 const SwfdecURL *	url);
+};
+
+GType			swfdec_security_get_type	(void);
+
+SwfdecSecurity *	swfdec_security_new_default	(SwfdecSecurity *	sec);
+
+SwfdecSecurity *	swfdec_security_allow		(SwfdecSecurity *	guard,
+							 SwfdecSecurity *	key);
+gboolean		swfdec_security_allow_url	(SwfdecSecurity *	guard,
+							 const SwfdecURL *	url);
+
+
+G_END_DECLS
+#endif
commit 12f7efbe515ea4c777e6cc80f89e1f6e2b408af7
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 16:26:01 2007 +0200

    lowercase the protocol and make absolute file URLs be relative anyway

diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c
index 5b99d94..2d01827 100644
--- a/libswfdec/swfdec_url.c
+++ b/libswfdec/swfdec_url.c
@@ -89,7 +89,7 @@ swfdec_url_new (const char *string)
     SWFDEC_ERROR ("URL %s has no protocol", string);
     return url;
   }
-  url->protocol = g_strndup (string, s - string);
+  url->protocol = g_utf8_strdown (string, s - string);
   string = s + 3;
   s = strchr (string, '/');
   if (s == NULL) {
@@ -138,7 +138,7 @@ swfdec_url_new_relative (const SwfdecURL *url, const char *string)
   g_string_append (str, "://");
   if (url->host)
     g_string_append (str, url->host);
-  if (string[0] == '/') {
+  if (string[0] == '/' && !g_str_equal (swfdec_url_get_protocol (url), "file")) {
     /* absolute URL */
     g_string_append (str, string);
   } else {
commit b7edf7393bfb21ebb30405c16efa1a5352ca96f0
Merge: 77f5f65... 429ccc9...
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 13:57:06 2007 +0200

    Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec/swfdec

commit 77f5f65999fd094fdca5033c757cb38b414ed3d7
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 11:50:29 2007 +0200

    don't call initialize on the movies anymore

diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 1f7faaf..7236572 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -1151,12 +1151,7 @@ swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, gu
   } else {
     SwfdecSpriteMovie *movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE);
     if (movie) {
-      if (SWFDEC_MOVIE (movie)->swf == NULL) {
-	swfdec_sprite_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
-	swfdec_movie_initialize (SWFDEC_MOVIE (movie));
-      } else {
-	swfdec_sprite_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
-      }
+      swfdec_sprite_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
     } else {
       swfdec_player_launch (SWFDEC_PLAYER (cx), SWFDEC_LOADER_REQUEST_DEFAULT, 
 	  url, target, NULL);
@@ -1210,12 +1205,7 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g
     } else if (variables) {
       swfdec_movie_load_variables (SWFDEC_MOVIE (movie), url, method, NULL);
     } else {
-      if (SWFDEC_MOVIE (movie)->swf == NULL) {
-	swfdec_sprite_movie_load (movie, url, method, NULL);
-	swfdec_movie_initialize (SWFDEC_MOVIE (movie));
-      } else {
-	swfdec_sprite_movie_load (movie, url, method, NULL);
-      }
+      swfdec_sprite_movie_load (movie, url, method, NULL);
     }
   } else {
     /* load an external file */
commit 5007f2aedb6e97a53c7a1d391de27d58a359a04e
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 11:34:45 2007 +0200

    Ha, we don't need case sensitivity options.
    
    I can't read tests...

diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index d0814fd..1f7faaf 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -1149,7 +1149,7 @@ swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, gu
   } else if (swfdec_player_fscommand (SWFDEC_PLAYER (cx), url, target)) {
     /* nothing to do here */
   } else {
-    SwfdecSpriteMovie *movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE, TRUE);
+    SwfdecSpriteMovie *movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE);
     if (movie) {
       if (SWFDEC_MOVIE (movie)->swf == NULL) {
 	swfdec_sprite_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
@@ -1198,7 +1198,7 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g
   } else if (internal || variables) {
     SwfdecSpriteMovie *movie;
     /* FIXME: This code looks wrong - figure out how levels are handled */
-    movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE, !variables);
+    movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, !variables);
     if (movie == NULL) {
       movie = (SwfdecSpriteMovie *) swfdec_player_get_movie_from_string (
 	SWFDEC_PLAYER (cx), target);
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index ace4c45..8037927 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1573,8 +1573,6 @@ swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect)
  * swfdec_player_get_level:
  * @player: a #SwfdecPlayer
  * @name: name of the level to request
- * @ignore_case: %TRUE to always be case insensitive, otherwise use the version
- *               to determine case sensitivity
  * @create: %TRUE to create if it doesn't exist
  *
  * This function is used to look up root movies in the given @player. The 
@@ -1588,8 +1586,7 @@ swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect)
  *          fully initialized (yes, this function sucks).
  **/
 SwfdecSpriteMovie *
-swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean ignore_case,
-    gboolean create)
+swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean create)
 {
   SwfdecSpriteMovie *movie;
   GList *walk;
@@ -1602,7 +1599,7 @@ swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean ignore
   g_return_val_if_fail (name != NULL, NULL);
 
   /* check name starts with "_level" */
-  if (swfdec_strncmp (ignore_case ? 6 : SWFDEC_AS_CONTEXT (player)->version, name, "_level", 6) != 0)
+  if (swfdec_strncmp (SWFDEC_AS_CONTEXT (player)->version, name, "_level", 6) != 0)
     return NULL;
   name += 6;
   /* extract depth from rest string (or fail if it's not a depth) */
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index f25f782..f5c2557 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -198,7 +198,6 @@ void		swfdec_player_stop_all_sounds	(SwfdecPlayer *		player);
 SwfdecSpriteMovie *
 		swfdec_player_get_level		(SwfdecPlayer *		player,
 						 const char *		name,
-						 gboolean		ignore_case,
 						 gboolean		create);
 SwfdecMovie *	swfdec_player_add_level_from_loader 
 						(SwfdecPlayer *		player,
commit 42f1dcc0e604d0ddba306039b0b5e566d8ed3561
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 11:34:03 2007 +0200

    reset n_frames, too

diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c
index 11c1bf4..74dd86e 100644
--- a/libswfdec/swfdec_sprite_movie.c
+++ b/libswfdec/swfdec_sprite_movie.c
@@ -703,6 +703,7 @@ swfdec_sprite_movie_unload (SwfdecSpriteMovie *movie)
   swfdec_sprite_movie_clear (SWFDEC_AS_OBJECT (movie)->context, 
       SWFDEC_AS_OBJECT (movie), 0, NULL, &hack);
   movie->frame = 0;
+  movie->n_frames = 0;
   movie->sprite = NULL;
 }
 
commit b261e561ce60ccbb362ddb71378f8608ff249898
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 09:36:19 2007 +0200

    loadMovie() changes...

diff --git a/test/dump.c b/test/dump.c
index 5b8ecea..47fb1ea 100644
--- a/test/dump.c
+++ b/test/dump.c
@@ -421,14 +421,20 @@ main (int argc, char *argv[])
   }
   /* FIXME: HACK! */
   swfdec_player_advance (player, 0);
-  s = (SwfdecSwfDecoder *) SWFDEC_MOVIE (player->roots->data)->swf->decoder;
-  if (swfdec_player_get_rate (player) == 0 || 
-      !SWFDEC_IS_SWF_DECODER (s)) {
+  if (swfdec_player_is_initialized (player)) {
     g_printerr ("File \"%s\" is not a SWF file\n", argv[1]);
     g_object_unref (player);
     player = NULL;
     return 1;
   }
+  s = (SwfdecSwfDecoder *) SWFDEC_MOVIE (player->roots->data)->swf->decoder;
+  /* FIXME: can happen after a _root.loadMovie() call */
+  if (!SWFDEC_IS_SWF_DECODER (s)) {
+    g_printerr ("Movie already unloaded from \"%s\"\n", argv[1]);
+    g_object_unref (player);
+    player = NULL;
+    return 1;
+  }
 
   g_print ("file:\n");
   g_print ("  version: %d\n", s->version);
commit 6a98b904013e0c5b1855a1cd7f91313c5ee34aab
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Oct 17 09:24:26 2007 +0200

    more random breakage on the loadMovie front
    
    I should stop getting from one fix to another one to yet another one without
    ever committing

diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 4a80a75..d0814fd 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -1149,13 +1149,13 @@ swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, gu
   } else if (swfdec_player_fscommand (SWFDEC_PLAYER (cx), url, target)) {
     /* nothing to do here */
   } else {
-    SwfdecMovie *movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE);
+    SwfdecSpriteMovie *movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE, TRUE);
     if (movie) {
-      if (movie->swf == NULL) {
-	swfdec_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
-	swfdec_movie_initialize (movie);
+      if (SWFDEC_MOVIE (movie)->swf == NULL) {
+	swfdec_sprite_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
+	swfdec_movie_initialize (SWFDEC_MOVIE (movie));
       } else {
-	swfdec_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
+	swfdec_sprite_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
       }
     } else {
       swfdec_player_launch (SWFDEC_PLAYER (cx), SWFDEC_LOADER_REQUEST_DEFAULT, 
@@ -1195,24 +1195,26 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g
     SWFDEC_ERROR ("GetURL2 action requires a SwfdecPlayer");
   } else if (swfdec_player_fscommand (SWFDEC_PLAYER (cx), url, target)) {
     /* nothing to do here */
-  } else if (internal) {
-    SwfdecMovie *movie;
+  } else if (internal || variables) {
+    SwfdecSpriteMovie *movie;
     /* FIXME: This code looks wrong - figure out how levels are handled */
-    movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, !variables);
-    if (movie) {
-      if (movie->swf == NULL) {
-	swfdec_movie_load (movie, url, method, NULL);
-	swfdec_movie_initialize (movie);
-      }
-    } else {
-      movie = swfdec_player_get_movie_from_string (
+    movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE, !variables);
+    if (movie == NULL) {
+      movie = (SwfdecSpriteMovie *) swfdec_player_get_movie_from_string (
 	SWFDEC_PLAYER (cx), target);
-      if (movie == NULL) {
-	/* swfdec_player_get_movie_from_value() should have warned already */
-      } else if (variables) {
-	swfdec_movie_load_variables (movie, url, method, NULL);
+      if (!SWFDEC_IS_SPRITE_MOVIE (movie))
+	movie = NULL;
+    }
+    if (movie == NULL) {
+      /* swfdec_player_get_movie_from_value() should have warned already */
+    } else if (variables) {
+      swfdec_movie_load_variables (SWFDEC_MOVIE (movie), url, method, NULL);
+    } else {
+      if (SWFDEC_MOVIE (movie)->swf == NULL) {
+	swfdec_sprite_movie_load (movie, url, method, NULL);
+	swfdec_movie_initialize (SWFDEC_MOVIE (movie));
       } else {
-	swfdec_movie_load (movie, url, method, NULL);
+	swfdec_sprite_movie_load (movie, url, method, NULL);
       }
     }
   } else {
diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index de4ec28..7e888b4 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -1368,30 +1368,16 @@ swfdec_movie_load_variables (SwfdecMovie *movie, const char *url,
     return;
   }
 
+  context = SWFDEC_AS_OBJECT (movie)->context;
   loader = swfdec_as_object_new_empty (context);
   swfdec_as_object_add_function (loader, SWFDEC_AS_STR_onData, 0,
       swfdec_movie_load_variables_on_data, 0);
+  SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (movie));
   swfdec_as_object_set_variable (loader, SWFDEC_AS_STR_target, &val);
 
   swfdec_load_object_new (loader, url, request, data);
 }
 
-void
-swfdec_movie_load (SwfdecMovie *movie, const char *url, SwfdecLoaderRequest request, 
-    SwfdecBuffer *data)
-{
-  SwfdecLoader *loader;
-
-  g_return_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie));
-  g_return_if_fail (url != NULL);
-
-  /* FIXME: load relative to other movie? */
-  loader = swfdec_player_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context),
-      url, request, data);
-  swfdec_swf_instance_new (SWFDEC_SPRITE_MOVIE (movie), loader, NULL);
-  g_object_unref (loader);
-}
-
 char *
 swfdec_movie_get_path (SwfdecMovie *movie, gboolean dot)
 {
diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h
index 7848d52..40605db 100644
--- a/libswfdec/swfdec_movie.h
+++ b/libswfdec/swfdec_movie.h
@@ -238,10 +238,6 @@ void		swfdec_movie_load_variables	(SwfdecMovie *		movie,
 						 const char *		url,
 						 SwfdecLoaderRequest	request,
 						 SwfdecBuffer *		data);
-void		swfdec_movie_load		(SwfdecMovie *		movie,
-						 const char *		url,
-						 SwfdecLoaderRequest	request,
-						 SwfdecBuffer *		data);
 
 int		swfdec_movie_compare_depths	(gconstpointer		a,
 						 gconstpointer		b);
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index fc43ef3..ace4c45 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1573,6 +1573,8 @@ swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect)
  * swfdec_player_get_level:
  * @player: a #SwfdecPlayer
  * @name: name of the level to request
+ * @ignore_case: %TRUE to always be case insensitive, otherwise use the version
+ *               to determine case sensitivity
  * @create: %TRUE to create if it doesn't exist
  *
  * This function is used to look up root movies in the given @player. The 
@@ -1585,10 +1587,11 @@ swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect)
  *          movie exists. Note that if a new movie is created, it will not be
  *          fully initialized (yes, this function sucks).
  **/
-SwfdecMovie *
-swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean create)
+SwfdecSpriteMovie *
+swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean ignore_case,
+    gboolean create)
 {
-  SwfdecMovie *movie;
+  SwfdecSpriteMovie *movie;
   GList *walk;
   const char *s;
   char *end;
@@ -1599,7 +1602,7 @@ swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean create
   g_return_val_if_fail (name != NULL, NULL);
 
   /* check name starts with "_level" */
-  if (swfdec_strncmp (SWFDEC_AS_CONTEXT (player)->version, name, "_level", 6) != 0)
+  if (swfdec_strncmp (ignore_case ? 6 : SWFDEC_AS_CONTEXT (player)->version, name, "_level", 6) != 0)
     return NULL;
   name += 6;
   /* extract depth from rest string (or fail if it's not a depth) */
@@ -1610,11 +1613,11 @@ swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean create
   depth = l - 16384;
   /* find movie */
   for (walk = player->roots; walk; walk = walk->next) {
-    movie = walk->data;
-    if (movie->depth < depth)
+    SwfdecMovie *cur = walk->data;
+    if (cur->depth < depth)
       continue;
-    if (movie->depth == depth)
-      return movie;
+    if (cur->depth == depth)
+      return SWFDEC_SPRITE_MOVIE (cur);
     break;
   }
   /* bail if create isn't set*/
@@ -1622,8 +1625,8 @@ swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean create
     return NULL;
   /* create new root movie */
   s = swfdec_as_context_give_string (SWFDEC_AS_CONTEXT (player), g_strdup_printf ("_level%lu", l));
-  movie = swfdec_movie_new (player, depth, NULL, NULL, s);
-  movie->name = SWFDEC_AS_STR_EMPTY;
+  movie = SWFDEC_SPRITE_MOVIE (swfdec_movie_new (player, depth, NULL, NULL, s));
+  SWFDEC_MOVIE (movie)->name = SWFDEC_AS_STR_EMPTY;
   return movie;
 }
 
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index 0f717cb..f25f782 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -195,8 +195,10 @@ void		swfdec_player_stop_sounds	(SwfdecPlayer *		player,
 						 SwfdecAudioRemoveFunc	func,
 						 gpointer		data);
 void		swfdec_player_stop_all_sounds	(SwfdecPlayer *		player);
-SwfdecMovie *	swfdec_player_get_level		(SwfdecPlayer *		player,
+SwfdecSpriteMovie *
+		swfdec_player_get_level		(SwfdecPlayer *		player,
 						 const char *		name,
+						 gboolean		ignore_case,
 						 gboolean		create);
 SwfdecMovie *	swfdec_player_add_level_from_loader 
 						(SwfdecPlayer *		player,
diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c
index 130ed4e..11c1bf4 100644
--- a/libswfdec/swfdec_sprite_movie.c
+++ b/libswfdec/swfdec_sprite_movie.c
@@ -683,3 +683,44 @@ swfdec_sprite_movie_init (SwfdecSpriteMovie * movie)
   movie->playing = TRUE;
 }
 
+/* cute little hack */
+extern void
+swfdec_sprite_movie_clear (SwfdecAsContext *cx, SwfdecAsObject *object,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval);
+/**
+ * swfdec_sprite_movie_unload:
+ * @movie: a #SwfdecMovie
+ *
+ * Unloads all contents from the given movie.
+ **/
+void
+swfdec_sprite_movie_unload (SwfdecSpriteMovie *movie)
+{
+  SwfdecAsValue hack;
+
+  g_return_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie));
+
+  swfdec_sprite_movie_clear (SWFDEC_AS_OBJECT (movie)->context, 
+      SWFDEC_AS_OBJECT (movie), 0, NULL, &hack);
+  movie->frame = 0;
+  movie->sprite = NULL;
+}
+
+void
+swfdec_sprite_movie_load (SwfdecSpriteMovie *movie, const char *url, SwfdecLoaderRequest request, 
+    SwfdecBuffer *data)
+{
+  SwfdecLoader *loader;
+
+  g_return_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie));
+  g_return_if_fail (url != NULL);
+
+  swfdec_sprite_movie_unload (movie);
+
+  /* FIXME: load relative to other movie? */
+  loader = swfdec_player_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context),
+      url, request, data);
+  swfdec_swf_instance_new (movie, loader, NULL);
+  g_object_unref (loader);
+}
+
diff --git a/libswfdec/swfdec_sprite_movie.h b/libswfdec/swfdec_sprite_movie.h
index 6f1b570..0573d92 100644
--- a/libswfdec/swfdec_sprite_movie.h
+++ b/libswfdec/swfdec_sprite_movie.h
@@ -27,7 +27,7 @@
 G_BEGIN_DECLS
 
 
-typedef struct _SwfdecSpriteMovie SwfdecSpriteMovie;
+//typedef struct _SwfdecSpriteMovie SwfdecSpriteMovie;
 typedef struct _SwfdecSpriteMovieClass SwfdecSpriteMovieClass;
 
 #define SWFDEC_TYPE_SPRITE_MOVIE                    (swfdec_sprite_movie_get_type())
@@ -66,6 +66,12 @@ GType		swfdec_sprite_movie_get_type		(void);
 void		swfdec_sprite_movie_goto		(SwfdecSpriteMovie *	movie,
 							 guint			goto_frame);
 
+void		swfdec_sprite_movie_unload		(SwfdecSpriteMovie *	movie);
+void		swfdec_sprite_movie_load		(SwfdecSpriteMovie *  	movie,
+							 const char *		url,
+					  		 SwfdecLoaderRequest	request,
+							 SwfdecBuffer *		data);
+
 
 G_END_DECLS
 #endif
diff --git a/libswfdec/swfdec_types.h b/libswfdec/swfdec_types.h
index cee815a..37a89ea 100644
--- a/libswfdec/swfdec_types.h
+++ b/libswfdec/swfdec_types.h
@@ -55,6 +55,7 @@ typedef struct _SwfdecSound SwfdecSound;
 typedef struct _SwfdecSoundChunk SwfdecSoundChunk;
 typedef struct _SwfdecSprite SwfdecSprite;
 typedef struct _SwfdecSpriteFrame SwfdecSpriteFrame;
+typedef struct _SwfdecSpriteMovie SwfdecSpriteMovie;
 typedef struct _SwfdecSwfDecoder SwfdecSwfDecoder;
 typedef struct _SwfdecSwfInstance SwfdecSwfInstance;
 typedef struct _SwfdecText SwfdecText;
commit a25766bd236cb0e9120d66916f265793ac8f73e0
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 16 15:08:13 2007 +0200

    big reorg patch for GetURL and GetURL2 fixage

diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index e11397f..4a80a75 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -548,14 +548,24 @@ swfdec_player_get_movie_from_value (SwfdecPlayer *player, SwfdecAsValue *val)
 {
   SwfdecAsContext *cx;
   const char *s;
-  SwfdecAsObject *ret;
 
   g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
-  g_return_val_if_fail (val != NULL, NULL);
+  g_return_val_if_fail (SWFDEC_IS_AS_VALUE (val), NULL);
 
   cx = SWFDEC_AS_CONTEXT (player);
   s = swfdec_as_value_to_string (cx, val);
-  ret = swfdec_action_lookup_object (cx, NULL, s, s + strlen (s));
+  return swfdec_player_get_movie_from_string (player, s);
+}
+
+SwfdecMovie *
+swfdec_player_get_movie_from_string (SwfdecPlayer *player, const char *s)
+{
+  SwfdecAsObject *ret;
+
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
+  g_return_val_if_fail (s != NULL, NULL);
+
+  ret = swfdec_action_lookup_object (SWFDEC_AS_CONTEXT (player), NULL, s, s + strlen (s));
   if (!SWFDEC_IS_MOVIE (ret)) {
     SWFDEC_WARNING ("\"%s\" does not reference a movie", s);
     return NULL;
@@ -1134,11 +1144,24 @@ swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, gu
   if (swfdec_bits_left (&bits)) {
     SWFDEC_WARNING ("leftover bytes in GetURL action");
   }
-  if (SWFDEC_IS_MOVIE (cx->frame->target))
-    swfdec_movie_load (SWFDEC_MOVIE (cx->frame->target), url, target, 
-	SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0);
-  else
-    SWFDEC_WARNING ("no movie to load");
+  if (!SWFDEC_IS_PLAYER (cx)) {
+    SWFDEC_ERROR ("GetURL without a SwfdecPlayer");
+  } else if (swfdec_player_fscommand (SWFDEC_PLAYER (cx), url, target)) {
+    /* nothing to do here */
+  } else {
+    SwfdecMovie *movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, TRUE);
+    if (movie) {
+      if (movie->swf == NULL) {
+	swfdec_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
+	swfdec_movie_initialize (movie);
+      } else {
+	swfdec_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
+      }
+    } else {
+      swfdec_player_launch (SWFDEC_PLAYER (cx), SWFDEC_LOADER_REQUEST_DEFAULT, 
+	  url, target, NULL);
+    }
+  }
   g_free (url);
   g_free (target);
 }
@@ -1147,38 +1170,54 @@ static void
 swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
 {
   const char *target, *url;
-  guint method;
+  guint method, internal, variables;
 
   if (len != 1) {
     SWFDEC_ERROR ("GetURL2 requires 1 byte of data, not %u", len);
     return;
   }
 
-  target = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx, 1));
-  url = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx, 2));
   method = data[0] & 3;
-
   if (method == 3) {
     SWFDEC_ERROR ("GetURL method 3 invalid");
     method = 0;
   }
+  internal = data[0] & 64;
+  variables = data[0] & 128;
+  if (method == 1 || method == 2) {
+    SWFDEC_FIXME ("encode variables");
+  }
 
-  // FIXME: What difference should LoadTarget flag (data[0] & 64) do?
+  target = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx, 1));
+  url = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx, 2));
 
-  if (data[0] & 128) {
-    if (SWFDEC_IS_MOVIE (cx->frame->target)) {
-      swfdec_movie_load_variables (SWFDEC_MOVIE (cx->frame->target), url,
-	  target, method);
+  if (!SWFDEC_IS_PLAYER (cx)) {
+    SWFDEC_ERROR ("GetURL2 action requires a SwfdecPlayer");
+  } else if (swfdec_player_fscommand (SWFDEC_PLAYER (cx), url, target)) {
+    /* nothing to do here */
+  } else if (internal) {
+    SwfdecMovie *movie;
+    /* FIXME: This code looks wrong - figure out how levels are handled */
+    movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, !variables);
+    if (movie) {
+      if (movie->swf == NULL) {
+	swfdec_movie_load (movie, url, method, NULL);
+	swfdec_movie_initialize (movie);
+      }
     } else {
-      SWFDEC_WARNING ("no movie to load");
+      movie = swfdec_player_get_movie_from_string (
+	SWFDEC_PLAYER (cx), target);
+      if (movie == NULL) {
+	/* swfdec_player_get_movie_from_value() should have warned already */
+      } else if (variables) {
+	swfdec_movie_load_variables (movie, url, method, NULL);
+      } else {
+	swfdec_movie_load (movie, url, method, NULL);
+      }
     }
   } else {
-    if (SWFDEC_IS_MOVIE (cx->frame->target)) {
-      swfdec_movie_load (SWFDEC_MOVIE (cx->frame->target), url, target, method,
-	  NULL, 0);
-    } else {
-      SWFDEC_WARNING ("no movie to load");
-    }
+    /* load an external file */
+    swfdec_player_launch (SWFDEC_PLAYER (cx), method, url, target, NULL);
   }
 
   swfdec_as_stack_pop_n (cx, 2);
diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c
index 5c9003e..7174aa2 100644
--- a/libswfdec/swfdec_load_object.c
+++ b/libswfdec/swfdec_load_object.c
@@ -182,7 +182,8 @@ swfdec_load_object_init (SwfdecLoadObject *load_object)
 }
 
 static void
-swfdec_load_object_load (SwfdecLoadObject *load_object, const char *url)
+swfdec_load_object_load (SwfdecLoadObject *load_object, const char *url, 
+    SwfdecLoaderRequest request, SwfdecBuffer *data)
 {
   SwfdecAsValue val;
 
@@ -191,7 +192,7 @@ swfdec_load_object_load (SwfdecLoadObject *load_object, const char *url)
 
   swfdec_load_object_reset (load_object);
   load_object->loader = swfdec_player_load (
-      SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load_object)->context), url);
+      SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load_object)->context), url, request, data);
   swfdec_loader_set_target (load_object->loader,
       SWFDEC_LOADER_TARGET (load_object));
   swfdec_loader_set_data_type (load_object->loader, SWFDEC_LOADER_DATA_TEXT);
@@ -209,7 +210,8 @@ swfdec_load_object_load (SwfdecLoadObject *load_object, const char *url)
 }
 
 SwfdecAsObject *
-swfdec_load_object_new (SwfdecAsObject *target, const char *url)
+swfdec_load_object_new (SwfdecAsObject *target, const char *url,
+    SwfdecLoaderRequest request, SwfdecBuffer *data)
 {
   SwfdecAsObject *load_object;
 
@@ -227,7 +229,7 @@ swfdec_load_object_new (SwfdecAsObject *target, const char *url)
   SWFDEC_PLAYER (target->context)->load_objects =
     g_list_append (SWFDEC_PLAYER (target->context)->load_objects, load_object);
 
-  swfdec_load_object_load (SWFDEC_LOAD_OBJECT (load_object), url);
+  swfdec_load_object_load (SWFDEC_LOAD_OBJECT (load_object), url, request, data);
 
   return load_object;
 }
diff --git a/libswfdec/swfdec_load_object.h b/libswfdec/swfdec_load_object.h
index 9a07b59..071ab4d 100644
--- a/libswfdec/swfdec_load_object.h
+++ b/libswfdec/swfdec_load_object.h
@@ -51,7 +51,9 @@ struct _SwfdecLoadObjectClass {
 GType		swfdec_load_object_get_type	(void);
 
 SwfdecAsObject *swfdec_load_object_new		(SwfdecAsObject *	target,
-						 const char *		url);
+						 const char *		url,
+						 SwfdecLoaderRequest	request,
+						 SwfdecBuffer *		data);
 
 
 G_END_DECLS
diff --git a/libswfdec/swfdec_load_object_as.c b/libswfdec/swfdec_load_object_as.c
index 57d91e8..335bf6b 100644
--- a/libswfdec/swfdec_load_object_as.c
+++ b/libswfdec/swfdec_load_object_as.c
@@ -42,7 +42,7 @@ swfdec_load_object_load (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc,
   }
 
   url = swfdec_as_value_to_string (cx, &argv[0]);
-  swfdec_load_object_new (obj, url);
+  swfdec_load_object_new (obj, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
 
   SWFDEC_AS_VALUE_SET_BOOLEAN (rval, TRUE);
 }
diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index 0771c3e..de4ec28 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -1354,7 +1354,7 @@ swfdec_movie_load_variables_on_data (SwfdecAsContext *cx,
 
 void
 swfdec_movie_load_variables (SwfdecMovie *movie, const char *url,
-    const char *target, SwfdecLoaderRequest request)
+    SwfdecLoaderRequest request, SwfdecBuffer *data)
 {
   SwfdecAsObject *loader;
   SwfdecAsContext *context;
@@ -1362,16 +1362,6 @@ swfdec_movie_load_variables (SwfdecMovie *movie, const char *url,
 
   g_return_if_fail (SWFDEC_IS_MOVIE (movie));
   g_return_if_fail (url != NULL);
-  g_return_if_fail (target != NULL);
-
-  context = SWFDEC_AS_OBJECT (movie)->context;
-
-  swfdec_as_context_eval (context, SWFDEC_AS_OBJECT (movie), target, &val);
-  if (!SWFDEC_AS_VALUE_IS_OBJECT (&val) ||
-      !SWFDEC_IS_MOVIE (SWFDEC_AS_VALUE_GET_OBJECT (&val))) {
-    SWFDEC_WARNING ("Target not a movie");
-    return;
-  }
 
   if (request != SWFDEC_LOADER_REQUEST_DEFAULT) {
     SWFDEC_FIXME ("loadVariables: Different request-modes not supported");
@@ -1383,52 +1373,23 @@ swfdec_movie_load_variables (SwfdecMovie *movie, const char *url,
       swfdec_movie_load_variables_on_data, 0);
   swfdec_as_object_set_variable (loader, SWFDEC_AS_STR_target, &val);
 
-  swfdec_load_object_new (loader, url);
+  swfdec_load_object_new (loader, url, request, data);
 }
 
 void
-swfdec_movie_load (SwfdecMovie *movie, const char *url, const char *target,
-    SwfdecLoaderRequest request, const char *data, gsize data_len)
+swfdec_movie_load (SwfdecMovie *movie, const char *url, SwfdecLoaderRequest request, 
+    SwfdecBuffer *data)
 {
-  SwfdecPlayer *player;
-  guint version;
+  SwfdecLoader *loader;
 
-  g_return_if_fail (SWFDEC_IS_MOVIE (movie));
+  g_return_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie));
   g_return_if_fail (url != NULL);
-  g_return_if_fail (target != NULL);
-
-  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
-  version = SWFDEC_AS_CONTEXT (player)->version;
 
-  /* yay for the multiple uses of GetURL - one of the crappier Flash things */
-  if (g_ascii_strncasecmp (url, "FSCommand:", strlen ("FSCommand:")) != 0 &&
-      ((version >= 7 && g_str_has_prefix (target, "_level")) ||
-       (version < 7 &&
-	g_ascii_strncasecmp (target, "_level", strlen ("_level")) == 0)))
-  {
-    const char *nr = target + strlen ("_level");
-    char *end;
-    guint depth;
-
-    errno = 0;
-    depth = strtoul (nr, &end, 10);
-    if (errno == 0 && *end == '\0') {
-      if (url[0] == '\0') {
-	swfdec_player_remove_level (player, depth);
-      } else {
-	SwfdecLoader *loader = swfdec_loader_load (movie->swf->loader, url,
-	    request, data, data_len);
-	g_assert (loader);
-	swfdec_player_add_level_from_loader (player, depth, loader, NULL);
-      }
-    } else {
-      SWFDEC_ERROR ("%s does not specify a valid level", target);
-    }
-    /* FIXME: what do we do here? Is returning correct?*/
-    return;
-  }
-  /* FIXME: add data */
-  swfdec_player_launch (player, request, url, target, NULL);
+  /* FIXME: load relative to other movie? */
+  loader = swfdec_player_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context),
+      url, request, data);
+  swfdec_swf_instance_new (SWFDEC_SPRITE_MOVIE (movie), loader, NULL);
+  g_object_unref (loader);
 }
 
 char *
diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h
index 3b41d2f..7848d52 100644
--- a/libswfdec/swfdec_movie.h
+++ b/libswfdec/swfdec_movie.h
@@ -236,14 +236,12 @@ void		swfdec_movie_set_variables	(SwfdecMovie *		movie,
 						 const char *		variables);
 void		swfdec_movie_load_variables	(SwfdecMovie *		movie,
 						 const char *		url,
-						 const char *		target,
-						 SwfdecLoaderRequest	request);
+						 SwfdecLoaderRequest	request,
+						 SwfdecBuffer *		data);
 void		swfdec_movie_load		(SwfdecMovie *		movie,
 						 const char *		url,
-						 const char *		target,
 						 SwfdecLoaderRequest	request,
-						 const char *		data,
-						 gsize			data_len);
+						 SwfdecBuffer *		data);
 
 int		swfdec_movie_compare_depths	(gconstpointer		a,
 						 gconstpointer		b);
diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c
index 41a6c42..59cb836 100644
--- a/libswfdec/swfdec_net_stream.c
+++ b/libswfdec/swfdec_net_stream.c
@@ -482,7 +482,8 @@ swfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url)
   g_return_if_fail (url != NULL);
 
   /* FIXME: use the connection once connections are implemented */
-  loader = swfdec_player_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (stream)->context), url);
+  loader = swfdec_player_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (stream)->context), url,
+      SWFDEC_LOADER_REQUEST_DEFAULT, NULL);
   swfdec_net_stream_set_loader (stream, loader);
   g_object_unref (loader);
 }
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index e844181..fc43ef3 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -21,6 +21,7 @@
 #include "config.h"
 #endif
 
+#include <errno.h>
 #include <math.h>
 #include <string.h>
 #include <stdlib.h>
@@ -43,6 +44,7 @@
 #include "swfdec_script_internal.h"
 #include "swfdec_sprite_movie.h"
 #include "swfdec_swf_instance.h"
+#include "swfdec_utils.h"
 
 /*** gtk-doc ***/
 
@@ -1417,9 +1419,9 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
   /**
    * SwfdecPlayer::fscommand:
    * @player: the #SwfdecPlayer affected
-   * @command: the command to execute
-   * @paramter: parameter to pass to the command. The parameter depends on the 
-   *            function.
+   * @command: the command to execute. This is a lower case string.
+   * @parameter: parameter to pass to the command. The parameter depends on the 
+   *             function.
    *
    * This signal is emited whenever a Flash script command (also known as 
    * fscommand) is encountered. This method is ued by the Flash file to
@@ -1567,6 +1569,64 @@ swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect)
       player->invalidations->len);
 }
 
+/**
+ * swfdec_player_get_level:
+ * @player: a #SwfdecPlayer
+ * @name: name of the level to request
+ * @create: %TRUE to create if it doesn't exist
+ *
+ * This function is used to look up root movies in the given @player. The 
+ * algorithm used is like this: First, check that @name actually references a
+ * root level movie. If it does not, return %NULL. If the movie for the given 
+ * level already exists, return it. If it does not, create it when @create was 
+ * set to %TRUE and return the newly created movie. Otherwise return %NULL.
+ *
+ * Returns: the #SwfdecMovie referenced by the given @name or %NULL if no such
+ *          movie exists. Note that if a new movie is created, it will not be
+ *          fully initialized (yes, this function sucks).
+ **/
+SwfdecMovie *
+swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean create)
+{
+  SwfdecMovie *movie;
+  GList *walk;
+  const char *s;
+  char *end;
+  int depth;
+  gulong l;
+
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
+  g_return_val_if_fail (name != NULL, NULL);
+
+  /* check name starts with "_level" */
+  if (swfdec_strncmp (SWFDEC_AS_CONTEXT (player)->version, name, "_level", 6) != 0)
+    return NULL;
+  name += 6;
+  /* extract depth from rest string (or fail if it's not a depth) */
+  errno = 0;
+  l = strtoul (name, &end, 10);
+  if (errno != 0 || *end != 0 || l > G_MAXINT)
+    return NULL;
+  depth = l - 16384;
+  /* find movie */
+  for (walk = player->roots; walk; walk = walk->next) {
+    movie = walk->data;
+    if (movie->depth < depth)
+      continue;
+    if (movie->depth == depth)
+      return movie;
+    break;
+  }
+  /* bail if create isn't set*/
+  if (!create)
+    return NULL;
+  /* create new root movie */
+  s = swfdec_as_context_give_string (SWFDEC_AS_CONTEXT (player), g_strdup_printf ("_level%lu", l));
+  movie = swfdec_movie_new (player, depth, NULL, NULL, s);
+  movie->name = SWFDEC_AS_STR_EMPTY;
+  return movie;
+}
+
 SwfdecMovie *
 swfdec_player_add_level_from_loader (SwfdecPlayer *player, guint depth,
     SwfdecLoader *loader, const char *variables)
@@ -1608,13 +1668,65 @@ swfdec_player_remove_level (SwfdecPlayer *player, guint depth)
 }
 
 SwfdecLoader *
-swfdec_player_load (SwfdecPlayer *player, const char *url)
+swfdec_player_load (SwfdecPlayer *player, const char *url, 
+    SwfdecLoaderRequest request, SwfdecBuffer *buffer)
 {
   g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
   g_return_val_if_fail (url != NULL, NULL);
 
   g_assert (player->loader);
-  return swfdec_loader_load (player->loader, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0);
+  if (buffer) {
+    return swfdec_loader_load (player->loader, url, request, 
+	(const char *) buffer->data, buffer->length);
+  } else {
+    return swfdec_loader_load (player->loader, url, request, NULL, 0);
+  }
+}
+
+static gboolean
+is_ascii (const char *s)
+{
+  while (*s) {
+    if (*s & 0x80)
+      return FALSE;
+    s++;
+  }
+  return TRUE;
+}
+
+/**
+ * swfdec_player_fscommand:
+ * @player: a #SwfdecPlayer
+ * @command: the command to parse
+ * @value: the value passed to the command
+ *
+ * Checks if @command is an FSCommand and if so, emits the 
+ * SwfdecPlayer::fscommand signal. 
+ *
+ * Returns: %TRUE if an fscommand was found and the signal emitted, %FALSE 
+ *          otherwise.
+ **/
+gboolean
+swfdec_player_fscommand (SwfdecPlayer *player, const char *command, const char *value)
+{
+  char *real_command;
+
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE);
+  g_return_val_if_fail (command != NULL, FALSE);
+  g_return_val_if_fail (value != NULL, FALSE);
+
+  if (g_ascii_strncasecmp (command, "FSCommand:", 10) != 0)
+    return FALSE;
+
+  command += 10;
+  if (!is_ascii (command)) {
+    SWFDEC_ERROR ("command \"%s\" are not ascii, skipping fscommand", command);
+    return TRUE;
+  }
+  real_command = g_ascii_strdown (command, -1);
+  g_signal_emit (player, signals[FSCOMMAND], 0, real_command, value);
+  g_free (real_command);
+  return TRUE;
 }
 
 void
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index 80af913..0f717cb 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -195,6 +195,9 @@ void		swfdec_player_stop_sounds	(SwfdecPlayer *		player,
 						 SwfdecAudioRemoveFunc	func,
 						 gpointer		data);
 void		swfdec_player_stop_all_sounds	(SwfdecPlayer *		player);
+SwfdecMovie *	swfdec_player_get_level		(SwfdecPlayer *		player,
+						 const char *		name,
+						 gboolean		create);
 SwfdecMovie *	swfdec_player_add_level_from_loader 
 						(SwfdecPlayer *		player,
 						 guint			depth,
@@ -202,8 +205,13 @@ SwfdecMovie *	swfdec_player_add_level_from_loader
 						 const char *		variables);
 void		swfdec_player_remove_level	(SwfdecPlayer *		player,
 						 guint			depth);
+gboolean	swfdec_player_fscommand		(SwfdecPlayer *		player,
+						 const char *		command,
+						 const char *		value);
 SwfdecLoader *	swfdec_player_load		(SwfdecPlayer *         player,
-						 const char *		url);
+						 const char *		url,
+						 SwfdecLoaderRequest	request,
+						 SwfdecBuffer *		buffer);
 void		swfdec_player_launch		(SwfdecPlayer *         player,
 						 SwfdecLoaderRequest	request,
 						 const char *		url,
@@ -219,6 +227,9 @@ void		swfdec_player_global_to_stage	(SwfdecPlayer *		player,
 SwfdecMovie *	swfdec_player_get_movie_from_value 
 						(SwfdecPlayer *		player,
 						 SwfdecAsValue *	val);
+SwfdecMovie *	swfdec_player_get_movie_from_string
+						(SwfdecPlayer *		player,
+						 const char *		s);
 
 
 G_END_DECLS
commit 034c310b5e4595310441f6082aa93b932de23146
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 16 12:42:51 2007 +0200

    add swfdec_strcmp() and swfdec_strncmp()
    
    This function to version-dependant string matching as is done in Actionscript

diff --git a/libswfdec/swfdec_utils.c b/libswfdec/swfdec_utils.c
index b809a2f..a6dc0db 100644
--- a/libswfdec/swfdec_utils.c
+++ b/libswfdec/swfdec_utils.c
@@ -21,6 +21,8 @@
 #include "config.h"
 #endif
 
+#include <string.h>
+
 #include "swfdec_utils.h"
 
 gboolean
@@ -44,3 +46,29 @@ swfdec_str_case_hash (gconstpointer v)
   return h;
 }
 
+int
+swfdec_strcmp (guint version, const char *s1, const char *s2)
+{
+  g_return_val_if_fail (s1 != NULL, 0);
+  g_return_val_if_fail (s2 != NULL, 0);
+
+  if (version < 7) {
+    return g_ascii_strcasecmp (s1, s2);
+  } else {
+    return strcmp (s1, s2);
+  }
+}
+
+int
+swfdec_strncmp (guint version, const char *s1, const char *s2, guint n)
+{
+  g_return_val_if_fail (s1 != NULL, 0);
+  g_return_val_if_fail (s2 != NULL, 0);
+
+  if (version < 7) {
+    return g_ascii_strncasecmp (s1, s2, n);
+  } else {
+    return strncmp (s1, s2, n);
+  }
+}
+
diff --git a/libswfdec/swfdec_utils.h b/libswfdec/swfdec_utils.h
index f208651..fc57a5d 100644
--- a/libswfdec/swfdec_utils.h
+++ b/libswfdec/swfdec_utils.h
@@ -27,6 +27,14 @@ gboolean	swfdec_str_case_equal		(gconstpointer	v1,
 						 gconstpointer	v2);
 guint		swfdec_str_case_hash		(gconstpointer	v);
 
+int		swfdec_strcmp			(guint		version,
+						 const char *	s1,
+						 const char *	s2);
+int		swfdec_strncmp			(guint		version,
+						 const char *	s1,
+						 const char *	s2,
+						 guint		n);
+
 
 G_END_DECLS
 #endif
commit e623c50e0564d1871dd1d7d1c6e9183f74945f7a
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 16 08:36:03 2007 +0200

    change swfdec_player_launch() and LAUNCH signal to take request type and data

diff --git a/libswfdec/swfdec_marshal.list b/libswfdec/swfdec_marshal.list
index 9357834..5aeeb44 100644
--- a/libswfdec/swfdec_marshal.list
+++ b/libswfdec/swfdec_marshal.list
@@ -1,5 +1,6 @@
 BOOLEAN:DOUBLE,DOUBLE,INT
 BOOLEAN:UINT,UINT,BOOLEAN
 VOID:BOXED,POINTER,UINT
+VOID:ENUM,STRING,STRING,BOXED
 VOID:STRING,STRING
 VOID:ULONG,UINT
diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index 3d8bade..0771c3e 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -1427,7 +1427,8 @@ swfdec_movie_load (SwfdecMovie *movie, const char *url, const char *target,
     /* FIXME: what do we do here? Is returning correct?*/
     return;
   }
-  swfdec_player_launch (player, url, target);
+  /* FIXME: add data */
+  swfdec_player_launch (player, request, url, target, NULL);
 }
 
 char *
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index 4980b21..e844181 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1447,8 +1447,12 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
   /**
    * SwfdecPlayer::launch:
    * @player: the #SwfdecPlayer affected
+   * @request: the type of request
    * @url: URL to open
    * @target: target to load the URL into
+   * @data: optional data to pass on with the request. Will be of mime type
+   *        application/x-www-form-urlencoded. Can be %NULL indicating no data
+   *        should be passed.
    *
    * Emitted whenever the @player encounters an URL that should be loaded into 
    * a target the Flash player does not recognize. In most cases this happens 
@@ -1457,8 +1461,9 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
    * The effect of calling any swfdec functions on the emitting @player is undefined.
    */
   signals[LAUNCH] = g_signal_new ("launch", G_TYPE_FROM_CLASS (klass),
-      G_SIGNAL_RUN_LAST, 0, NULL, NULL, swfdec_marshal_VOID__STRING_STRING,
-      G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
+      G_SIGNAL_RUN_LAST, 0, NULL, NULL, swfdec_marshal_VOID__ENUM_STRING_STRING_BOXED,
+      G_TYPE_NONE, 4, SWFDEC_TYPE_LOADER_REQUEST, G_TYPE_STRING, G_TYPE_STRING, 
+      SWFDEC_TYPE_BUFFER);
 
   context_class->mark = swfdec_player_mark;
   context_class->get_time = swfdec_player_get_time;
@@ -1613,7 +1618,8 @@ swfdec_player_load (SwfdecPlayer *player, const char *url)
 }
 
 void
-swfdec_player_launch (SwfdecPlayer *player, const char *url, const char *target)
+swfdec_player_launch (SwfdecPlayer *player, SwfdecLoaderRequest request, const char *url, 
+    const char *target, SwfdecBuffer *data)
 {
   g_return_if_fail (SWFDEC_IS_PLAYER (player));
   g_return_if_fail (url != NULL);
@@ -1624,7 +1630,7 @@ swfdec_player_launch (SwfdecPlayer *player, const char *url, const char *target)
     g_signal_emit (player, signals[FSCOMMAND], 0, command, target);
     return;
   }
-  g_signal_emit (player, signals[LAUNCH], 0, url, target);
+  g_signal_emit (player, signals[LAUNCH], 0, request, url, target, data);
 }
 
 /**
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index 182acd0..80af913 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -205,8 +205,10 @@ void		swfdec_player_remove_level	(SwfdecPlayer *		player,
 SwfdecLoader *	swfdec_player_load		(SwfdecPlayer *         player,
 						 const char *		url);
 void		swfdec_player_launch		(SwfdecPlayer *         player,
+						 SwfdecLoaderRequest	request,
 						 const char *		url,
-						 const char *		target);
+						 const char *		target,
+						 SwfdecBuffer *		data);
 void		swfdec_player_stage_to_global	(SwfdecPlayer *		player,
 						 double *		x,
 						 double *		y);


More information about the Swfdec mailing list