[Swfdec-commits] 15 commits - swfdec-gtk/swfdec_gtk_loader.c swfdec-gtk/swfdec_gtk_socket.c swfdec/swfdec_audio_event.c swfdec/swfdec_bits.c swfdec/swfdec_buffer.c swfdec/swfdec_buffer.h swfdec/swfdec_codec_adpcm.c swfdec/swfdec_codec_audio.c swfdec/swfdec_codec_ffmpeg.c swfdec/swfdec_codec_gst.c swfdec/swfdec_codec_mad.c swfdec/swfdec_image.c swfdec/swfdec_player.c swfdec/swfdec_policy_file.c swfdec/swfdec_script.c swfdec/swfdec_socket.c swfdec/swfdec_swf_decoder.c swfdec/swfdec_system_security.c swfdec/swfdec_url.c test/sound test/swfdec_test_buffer.c test/swfdec_test_plugin.h test/swfdec_test_socket.c test/swfdec_test_test.c tools/swfdec-extract.c tools/swfdec_out.c tools/swfedit_file.c tools/swfedit_tag.c tools/swfedit_token.c vivified/core

Benjamin Otte company at kemper.freedesktop.org
Tue Feb 5 11:32:54 PST 2008


 swfdec-gtk/swfdec_gtk_loader.c  |   13 ---
 swfdec-gtk/swfdec_gtk_socket.c  |    2 
 swfdec/swfdec_audio_event.c     |    4 -
 swfdec/swfdec_bits.c            |    4 -
 swfdec/swfdec_buffer.c          |  132 ++++++++++++++++------------------------
 swfdec/swfdec_buffer.h          |   12 ++-
 swfdec/swfdec_codec_adpcm.c     |    2 
 swfdec/swfdec_codec_audio.c     |    2 
 swfdec/swfdec_codec_ffmpeg.c    |    6 -
 swfdec/swfdec_codec_gst.c       |   25 +------
 swfdec/swfdec_codec_mad.c       |    9 --
 swfdec/swfdec_image.c           |   11 +--
 swfdec/swfdec_player.c          |    7 --
 swfdec/swfdec_policy_file.c     |   24 ++++---
 swfdec/swfdec_script.c          |    2 
 swfdec/swfdec_socket.c          |   28 ++++++++
 swfdec/swfdec_swf_decoder.c     |    2 
 swfdec/swfdec_system_security.c |   18 +++++
 swfdec/swfdec_url.c             |    3 
 test/sound/sound.c              |    2 
 test/swfdec_test_buffer.c       |   10 ---
 test/swfdec_test_plugin.h       |   52 +++++++--------
 test/swfdec_test_socket.c       |    4 -
 test/swfdec_test_test.c         |    2 
 tools/swfdec-extract.c          |    6 -
 tools/swfdec_out.c              |    4 -
 tools/swfedit_file.c            |    6 -
 tools/swfedit_tag.c             |    2 
 tools/swfedit_token.c           |    6 -
 vivified/core/vivi_ming.c       |    2 
 30 files changed, 196 insertions(+), 206 deletions(-)

New commits:
commit 5584d63458350646be8cf51ea2108af034e187cb
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 13:50:02 2008 +0100

    hacks come back to bite you
    
    note to self: remember that, and code properly in the future :/

diff --git a/swfdec/swfdec_image.c b/swfdec/swfdec_image.c
index 54e84ca..3270756 100644
--- a/swfdec/swfdec_image.c
+++ b/swfdec/swfdec_image.c
@@ -465,11 +465,12 @@ swfdec_image_lossless_load (SwfdecImage *image)
 	p++;
       }
     }
-    /* FIXME: this can fail if the returned buffer does not contain malloc'd 
-     * data at some point in the future */
-    buffer->data = NULL;
-    buffer->length = 0;
-    swfdec_buffer_unref (buffer);
+    image->surface = cairo_image_surface_create_for_data (data, 
+	have_alpha ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, 
+	image->width, image->height, image->width * 4);
+    cairo_surface_set_user_data (image->surface, &key, buffer, 
+	(cairo_destroy_func_t) swfdec_buffer_unref);
+    return;
   } else {
     SWFDEC_ERROR ("unknown lossless image format %u", format);
     return;
commit 52dd3dc5eea837d2c2ce6536e2a9f9ed3ffc7981
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 13:46:57 2008 +0100

    use GSlice for buffers

diff --git a/swfdec/swfdec_buffer.c b/swfdec/swfdec_buffer.c
index 044c6a5..46befc7 100644
--- a/swfdec/swfdec_buffer.c
+++ b/swfdec/swfdec_buffer.c
@@ -159,7 +159,7 @@ swfdec_buffer_new_full (unsigned char *data, gsize size,
 {
   SwfdecBuffer *buffer;
   
-  buffer = g_new0 (SwfdecBuffer, 1);
+  buffer = g_slice_new (SwfdecBuffer);
   buffer->ref_count = 1;
   buffer->data = data;
   buffer->length = size;
@@ -288,7 +288,7 @@ swfdec_buffer_unref (SwfdecBuffer * buffer)
   if (buffer->ref_count == 0) {
     if (buffer->free)
       buffer->free (buffer->priv, buffer->data);
-    g_free (buffer);
+    g_slice_free (SwfdecBuffer, buffer);
   }
 }
 
commit 8dcbe532bb2634c49646ba010684e23221fd220a
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 13:43:29 2008 +0100

    update tests to new buffer API

diff --git a/test/sound/sound.c b/test/sound/sound.c
index ab8f566..07e2148 100644
--- a/test/sound/sound.c
+++ b/test/sound/sound.c
@@ -193,7 +193,7 @@ render_all_streams (SwfdecPlayer *player, guint msecs, guint n_samples, TestData
   
   for (walk = data->streams; walk; walk = walk->next) {
     TestStream *stream = walk->data;
-    SwfdecBuffer *buffer = swfdec_buffer_new_and_alloc0 (n_samples * 4);
+    SwfdecBuffer *buffer = swfdec_buffer_new0 (n_samples * 4);
     swfdec_audio_render (stream->audio, (gint16 *) buffer->data, 0, n_samples);
     swfdec_buffer_queue_push (stream->queue, buffer);
   }
commit 04852698c9a0df84445450c26ef84950f4d242fd
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 13:43:18 2008 +0100

    those checks aren't correct anymore

diff --git a/swfdec/swfdec_buffer.c b/swfdec/swfdec_buffer.c
index 040fb7a..044c6a5 100644
--- a/swfdec/swfdec_buffer.c
+++ b/swfdec/swfdec_buffer.c
@@ -159,9 +159,6 @@ swfdec_buffer_new_full (unsigned char *data, gsize size,
 {
   SwfdecBuffer *buffer;
   
-  g_return_val_if_fail (data != NULL, NULL);
-  g_return_val_if_fail (size > 0, NULL);
-
   buffer = g_new0 (SwfdecBuffer, 1);
   buffer->ref_count = 1;
   buffer->data = data;
commit eb3bbc372f6f538685c7eb3095af2cfa0718fbee
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 13:41:43 2008 +0100

    fix the rest of the buffer users

diff --git a/test/swfdec_test_buffer.c b/test/swfdec_test_buffer.c
index e05869b..34fb812 100644
--- a/test/swfdec_test_buffer.c
+++ b/test/swfdec_test_buffer.c
@@ -210,24 +210,20 @@ swfdec_test_buffer_from_args (SwfdecAsContext *cx, guint argc, SwfdecAsValue *ar
       if (SWFDEC_IS_TEST_BUFFER (o))
 	b = swfdec_buffer_ref (SWFDEC_TEST_BUFFER (o)->buffer);
     } else if (SWFDEC_AS_VALUE_IS_NUMBER (&argv[i])) {
-      b = swfdec_buffer_new_and_alloc (1);
+      b = swfdec_buffer_new (1);
       b->data[0] = swfdec_as_value_to_integer (cx, &argv[i]);
     }
     if (b == NULL) {
       const char *s = swfdec_as_value_to_string (cx, &argv[i]);
       gsize len = strlen (s);
       /* no terminating 0 byte on purpose here - use new Buffer (string, 0); to get that */
-      b = swfdec_buffer_new_and_alloc (len);
+      b = swfdec_buffer_new (len);
       memcpy (b->data, s, len);
     }
     swfdec_buffer_queue_push (queue, b);
   }
   i = swfdec_buffer_queue_get_depth (queue);
-  if (i) {
-    buffer = swfdec_buffer_queue_pull (queue, i);
-  } else {
-    buffer = swfdec_buffer_new ();
-  }
+  buffer = swfdec_buffer_queue_pull (queue, i);
   swfdec_buffer_queue_unref (queue);
 
   return buffer;
diff --git a/test/swfdec_test_socket.c b/test/swfdec_test_socket.c
index 8b1c070..cad98f4 100644
--- a/test/swfdec_test_socket.c
+++ b/test/swfdec_test_socket.c
@@ -190,7 +190,7 @@ swfdec_test_socket_receive (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
   }
   swfdec_test_socket_process (sock);
   if (len > 0) {
-    buffer = swfdec_buffer_new_and_alloc (len);
+    buffer = swfdec_buffer_new (len);
     if (soup_socket_read (sock->socket, buffer->data, buffer->length, &len,
 	  NULL, &error) != SOUP_SOCKET_OK) {
       swfdec_test_throw (cx, "%s", error->message);
@@ -206,7 +206,7 @@ swfdec_test_socket_receive (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
     SwfdecBufferQueue *queue = swfdec_buffer_queue_new ();
     SoupSocketIOStatus status = SOUP_SOCKET_OK;
     while (status == SOUP_SOCKET_OK) {
-      buffer = swfdec_buffer_new_and_alloc (128);
+      buffer = swfdec_buffer_new (128);
       status = soup_socket_read (sock->socket, buffer->data, 128, &
 	  buffer->length, NULL, &error);
       if (status != SOUP_SOCKET_OK && status != SOUP_SOCKET_WOULD_BLOCK) {
diff --git a/test/swfdec_test_test.c b/test/swfdec_test_test.c
index e056be6..c38a7f8 100644
--- a/test/swfdec_test_test.c
+++ b/test/swfdec_test_test.c
@@ -63,7 +63,7 @@ swfdec_test_test_trace (SwfdecTestPlugin *plugin, const char *message)
   gsize len = strlen (message);
   SwfdecBuffer *buffer;
 
-  buffer = swfdec_buffer_new_and_alloc (len + 1);
+  buffer = swfdec_buffer_new (len + 1);
   memcpy (buffer->data, message, len);
   buffer->data[len] = '\n';
   swfdec_buffer_queue_push (test->trace, buffer);
diff --git a/tools/swfdec-extract.c b/tools/swfdec-extract.c
index b233818..1e57034 100644
--- a/tools/swfdec-extract.c
+++ b/tools/swfdec-extract.c
@@ -46,7 +46,7 @@
 static SwfdecBuffer *
 encode_wav (SwfdecBuffer *buffer, SwfdecAudioFormat format)
 {
-  SwfdecBuffer *wav = swfdec_buffer_new_and_alloc (buffer->length + 44);
+  SwfdecBuffer *wav = swfdec_buffer_new (buffer->length + 44);
   unsigned char *data;
   guint i;
 
@@ -124,9 +124,7 @@ export_sprite_sound (SwfdecSprite *sprite, const char *filename)
   i = 4096;
   queue = swfdec_buffer_queue_new ();
   while (i > 0) {
-    buffer = swfdec_buffer_new ();
-    buffer->data = g_malloc0 (i * 4);
-    buffer->length = i * 4;
+    buffer = swfdec_buffer_new0 (i * 4);
 #if 0
     if (i > 1234) {
       swfdec_audio_render (audio, (gint16 *) buffer->data, 0, 1234);
diff --git a/tools/swfdec_out.c b/tools/swfdec_out.c
index ecf5a83..0684ce1 100644
--- a/tools/swfdec_out.c
+++ b/tools/swfdec_out.c
@@ -57,9 +57,7 @@ swfdec_out_close (SwfdecOut *out)
 
   swfdec_out_syncbits (out);
 
-  buffer = swfdec_buffer_new ();
-  buffer->data = out->data;
-  buffer->length = out->ptr - out->data;
+  buffer = swfdec_buffer_new_for_data (out->data, out->ptr - out->data);
 
   g_free (out);
 
diff --git a/tools/swfedit_file.c b/tools/swfedit_file.c
index 22684a3..5883d46 100644
--- a/tools/swfedit_file.c
+++ b/tools/swfedit_file.c
@@ -65,7 +65,7 @@ swfenc_file_inflate (SwfdecBits *bits, guint size)
   encoded = swfdec_bits_get_buffer (bits, -1);
   if (encoded == NULL)
     return NULL;
-  decoded = swfdec_buffer_new_and_alloc (size);
+  decoded = swfdec_buffer_new (size);
   z.zalloc = zalloc;
   z.zfree = zfree;
   z.opaque = NULL;
@@ -155,7 +155,7 @@ swfedit_file_parse (SwfeditFile *file, SwfdecBits *bits, GError **error)
     if (tag_len > 0)
       buffer = swfdec_bits_get_buffer (bits, tag_len);
     else
-      buffer = swfdec_buffer_new ();
+      buffer = swfdec_buffer_new (0);
     if (buffer == NULL) {
       g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
 	  "Invalid contents in file");
@@ -245,7 +245,7 @@ swfedit_file_write (SwfeditFile *file)
     swfdec_buffer_queue_push (queue, buffer);
   }
   /* write closing tag */
-  buffer = swfdec_buffer_new_and_alloc0 (2);
+  buffer = swfdec_buffer_new0 (2);
   swfdec_buffer_queue_push (queue, buffer);
 
   /* FIXME: implement compression */
diff --git a/tools/swfedit_tag.c b/tools/swfedit_tag.c
index 868632c..ccd3837 100644
--- a/tools/swfedit_tag.c
+++ b/tools/swfedit_tag.c
@@ -63,7 +63,7 @@ swfedit_binary_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint)
 {
   SwfdecBuffer *buffer = swfdec_bits_get_buffer (bits, -1);
   if (buffer == NULL)
-    buffer = swfdec_buffer_new ();
+    buffer = swfdec_buffer_new (0);
   return buffer;
 }
 
diff --git a/tools/swfedit_token.c b/tools/swfedit_token.c
index 11bedfc..587e831 100644
--- a/tools/swfedit_token.c
+++ b/tools/swfedit_token.c
@@ -61,7 +61,7 @@ swfedit_parse_hex (const char *s, guint *result)
 static gpointer
 swfedit_binary_new (void)
 {
-  return swfdec_buffer_new ();
+  return swfdec_buffer_new (0);
 }
 
 static gboolean
@@ -81,9 +81,7 @@ swfedit_binary_from_string (const char *s, gpointer* result)
     while (g_ascii_isspace (*s)) s++;
   } while (*s != '\0');
   if (*s == '\0') {
-    SwfdecBuffer *buffer = swfdec_buffer_new ();
-    buffer->length = array->len;
-    buffer->data = array->data;
+    SwfdecBuffer *buffer = swfdec_buffer_new_for_data (array->data, array->len);
     g_byte_array_free (array, FALSE);
     *result = buffer;
     return TRUE;
diff --git a/vivified/core/vivi_ming.c b/vivified/core/vivi_ming.c
index 7478fac..a126455 100644
--- a/vivified/core/vivi_ming.c
+++ b/vivified/core/vivi_ming.c
@@ -101,7 +101,7 @@ vivi_ming_compile (const char *code, char **error)
       *error = vivi_ming_get_error ();
     script = NULL;
   } else {
-    buffer = swfdec_buffer_new_and_alloc (len);
+    buffer = swfdec_buffer_new (len);
     memcpy (buffer->data, data, len);
     script = swfdec_script_new (buffer, "compiled script", 8);
   }
commit 5c96fd291083c0bf37ce0a78290a65300fdcdbe1
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 13:23:31 2008 +0100

    rework buffer allocation function API

diff --git a/swfdec-gtk/swfdec_gtk_loader.c b/swfdec-gtk/swfdec_gtk_loader.c
index 8545625..76155e8 100644
--- a/swfdec-gtk/swfdec_gtk_loader.c
+++ b/swfdec-gtk/swfdec_gtk_loader.c
@@ -87,12 +87,6 @@ swfdec_gtk_loader_ensure_open (SwfdecGtkLoader *gtk)
 }
 
 static void
-swfdec_gtk_loader_free_soup_buffer (unsigned char *data, gpointer chunk)
-{
-  soup_buffer_free (chunk);
-}
-
-static void
 swfdec_gtk_loader_push (SoupMessage *msg, SoupBuffer *chunk, gpointer loader)
 {
   SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader);
@@ -102,7 +96,7 @@ swfdec_gtk_loader_push (SoupMessage *msg, SoupBuffer *chunk, gpointer loader)
 
   swfdec_gtk_loader_ensure_open (gtk);
   buffer = swfdec_buffer_new_full ((unsigned char *) chunk->data, chunk->length,
-      swfdec_gtk_loader_free_soup_buffer, chunk);
+      (SwfdecBufferFreeFunc) soup_buffer_free, chunk);
   swfdec_stream_push (loader, buffer);
 }
   
diff --git a/swfdec-gtk/swfdec_gtk_socket.c b/swfdec-gtk/swfdec_gtk_socket.c
index 8385cf1..a4d85e0 100644
--- a/swfdec-gtk/swfdec_gtk_socket.c
+++ b/swfdec-gtk/swfdec_gtk_socket.c
@@ -95,7 +95,7 @@ swfdec_gtk_socket_do_read (SoupSocket *sock, SwfdecGtkSocket *gtk)
   GError *error = NULL;
 
   do {
-    buffer = swfdec_buffer_new_and_alloc (SWFDEC_GTK_SOCKET_BLOCK_SIZE);
+    buffer = swfdec_buffer_new (SWFDEC_GTK_SOCKET_BLOCK_SIZE);
     status = soup_socket_read (sock, buffer, SWFDEC_GTK_SOCKET_BLOCK_SIZE, 
 	&len, NULL, &error);
     buffer->length = len;
diff --git a/swfdec/swfdec_audio_event.c b/swfdec/swfdec_audio_event.c
index fa43359..d7ab2f5 100644
--- a/swfdec/swfdec_audio_event.c
+++ b/swfdec/swfdec_audio_event.c
@@ -173,7 +173,7 @@ swfdec_audio_event_decode (SwfdecAudioEvent *event)
   if (event->decoded == NULL) {
     SWFDEC_INFO ("Could not decode audio. Will assume %u samples of silence instead.",
 	event->sound->n_samples);
-    event->decoded = swfdec_buffer_new_and_alloc0 (event->sound->n_samples / 4);
+    event->decoded = swfdec_buffer_new0 (event->sound->n_samples / 4);
     event->decoded_format = swfdec_audio_format_new (5512, 1, FALSE);
   } else {
     swfdec_buffer_ref (event->decoded);
@@ -191,7 +191,7 @@ swfdec_audio_event_decode (SwfdecAudioEvent *event)
       SWFDEC_WARNING ("start sample %u > total number of samples %"G_GSIZE_FORMAT,
 	  event->start_sample / granule, event->decoded->length / bytes_per_sample);
       swfdec_buffer_unref (event->decoded);
-      event->decoded = swfdec_buffer_new ();
+      event->decoded = swfdec_buffer_new (0);
     } else {
       SwfdecBuffer *sub = swfdec_buffer_new_subbuffer (event->decoded,
 	  skip, event->decoded->length - skip);
diff --git a/swfdec/swfdec_bits.c b/swfdec/swfdec_bits.c
index 1cf166d..bf1e29b 100644
--- a/swfdec/swfdec_bits.c
+++ b/swfdec/swfdec_bits.c
@@ -647,7 +647,7 @@ swfdec_bits_get_buffer (SwfdecBits *bits, int len)
   if (bits->buffer) {
     buffer = swfdec_buffer_new_subbuffer (bits->buffer, bits->ptr - bits->buffer->data, len);
   } else {
-    buffer = swfdec_buffer_new_and_alloc (len);
+    buffer = swfdec_buffer_new (len);
     memcpy (buffer->data, bits->ptr, len);
   }
   bits->ptr += len;
@@ -713,7 +713,7 @@ swfdec_bits_decompress (SwfdecBits *bits, int compressed, int decompressed)
     SWFDEC_ERROR ("Error initialising zlib: %d %s", result, z.msg ? z.msg : "");
     goto fail;
   }
-  buffer = swfdec_buffer_new_and_alloc (decompressed > 0 ? decompressed : compressed * 2);
+  buffer = swfdec_buffer_new (decompressed > 0 ? decompressed : compressed * 2);
   z.next_out = buffer->data;
   z.avail_out = buffer->length;
   while (TRUE) {
diff --git a/swfdec/swfdec_buffer.c b/swfdec/swfdec_buffer.c
index 7e836d5..040fb7a 100644
--- a/swfdec/swfdec_buffer.c
+++ b/swfdec/swfdec_buffer.c
@@ -61,8 +61,8 @@
 
 /**
  * SwfdecBufferFreeFunc:
- * @data: The data to free
  * @priv: The private data registered for passing to this function
+ * @data: The data to free
  *
  * This is the function prototype for the function that is called for freeing
  * the memory pointed to by a buffer. See swfdec_buffer_new() for an example.
@@ -84,28 +84,6 @@ swfdec_buffer_get_type (void)
 
 /**
  * swfdec_buffer_new:
- *
- * Creates a new #SwfdecBuffer to be filled by the user. Use like this:
- * <informalexample><programlisting>SwfdecBuffer *buffer = swfdec_buffer_new ();
- * buffer->data = mydata;
- * buffer->length = mydata_length;
- * buffer->free = mydata_freefunc;
- * buffer->priv = mydata_private;</programlisting></informalexample>
- *
- * Returns: a new #SwfdecBuffer referencing nothing.
- **/
-SwfdecBuffer *
-swfdec_buffer_new (void)
-{
-  SwfdecBuffer *buffer;
-
-  buffer = g_new0 (SwfdecBuffer, 1);
-  buffer->ref_count = 1;
-  return buffer;
-}
-
-/**
- * swfdec_buffer_new_and_alloc:
  * @size: amount of bytes to allocate
  *
  * Creates a new buffer and allocates new memory of @size bytes to be used with 
@@ -114,36 +92,26 @@ swfdec_buffer_new (void)
  * Returns: a new #SwfdecBuffer with buffer->data pointing to new data
  **/
 SwfdecBuffer *
-swfdec_buffer_new_and_alloc (gsize size)
+swfdec_buffer_new (gsize size)
 {
-  SwfdecBuffer *buffer = swfdec_buffer_new ();
-
-  buffer->data = g_malloc (size);
-  buffer->length = size;
-  buffer->free = (SwfdecBufferFreeFunc) g_free;
-
-  return buffer;
+  unsigned char *data = g_malloc (size);
+  return swfdec_buffer_new_full (data, size, (SwfdecBufferFreeFunc) g_free, data);
 }
 
 /**
- * swfdec_buffer_new_and_alloc0:
+ * swfdec_buffer_new0:
  * @size: amount of bytes to allocate
  *
- * Createsa new buffer just like swfdec_buffer_new_and_alloc(), but ensures 
+ * Createsa new buffer just like swfdec_buffer_new(), but ensures 
  * that the returned data gets initialized to be 0.
  *
  * Returns: a new #SwfdecBuffer with buffer->data pointing to new data
  **/
 SwfdecBuffer *
-swfdec_buffer_new_and_alloc0 (gsize size)
+swfdec_buffer_new0 (gsize size)
 {
-  SwfdecBuffer *buffer = swfdec_buffer_new ();
-
-  buffer->data = g_malloc0 (size);
-  buffer->length = size;
-  buffer->free = (SwfdecBufferFreeFunc) g_free;
-
-  return buffer;
+  unsigned char *data = g_malloc0 (size);
+  return swfdec_buffer_new_full (data, size, (SwfdecBufferFreeFunc) g_free, data);
 }
 
 /**
@@ -155,6 +123,14 @@ swfdec_buffer_new_and_alloc0 (gsize size)
  *
  * Returns: a new #SwfdecBuffer pointing to @data
  **/
+SwfdecBuffer *
+swfdec_buffer_new_for_data (guchar *data, gsize size)
+{
+  /* This is not a macro because a macro would evaluate the data pointer twice
+   * and people like doing swfdec_buffer_new_for_data (g_malloc (10), 10);
+   */
+  return swfdec_buffer_new_full (data, size, (SwfdecBufferFreeFunc) g_free, data);
+}
 /**
  * swfdec_buffer_new_static:
  * @data: static data
@@ -186,7 +162,8 @@ swfdec_buffer_new_full (unsigned char *data, gsize size,
   g_return_val_if_fail (data != NULL, NULL);
   g_return_val_if_fail (size > 0, NULL);
 
-  buffer = swfdec_buffer_new ();
+  buffer = g_new0 (SwfdecBuffer, 1);
+  buffer->ref_count = 1;
   buffer->data = data;
   buffer->length = size;
   buffer->free = free_func;
@@ -195,12 +172,6 @@ swfdec_buffer_new_full (unsigned char *data, gsize size,
   return buffer;
 }
 
-static void
-swfdec_buffer_free_subbuffer (unsigned char *data, gpointer priv)
-{
-  swfdec_buffer_unref (priv);
-}
-
 /**
  * swfdec_buffer_new_subbuffer:
  * @buffer: #SwfdecBuffer managing the region of memory
@@ -223,11 +194,9 @@ swfdec_buffer_new_subbuffer (SwfdecBuffer *buffer, gsize offset, gsize length)
   if (offset == 0 && length == buffer->length)
     return swfdec_buffer_ref (buffer);
 
-  subbuffer = swfdec_buffer_new ();
-  subbuffer->priv = swfdec_buffer_ref (swfdec_buffer_get_super (buffer));
-  subbuffer->data = buffer->data + offset;
-  subbuffer->length = length;
-  subbuffer->free = swfdec_buffer_free_subbuffer;
+  subbuffer = swfdec_buffer_new_full (buffer->data + offset, length,
+      (SwfdecBufferFreeFunc) swfdec_buffer_unref, 
+      swfdec_buffer_ref (swfdec_buffer_get_super (buffer)));
 
   return subbuffer;
 }
@@ -248,19 +217,12 @@ swfdec_buffer_get_super (SwfdecBuffer *buffer)
 {
   g_return_val_if_fail (buffer != NULL, NULL);
 
-  if (buffer->free == swfdec_buffer_free_subbuffer)
+  if (buffer->free == (SwfdecBufferFreeFunc) swfdec_buffer_unref)
     buffer = buffer->priv;
 
-  g_assert (buffer->free != swfdec_buffer_free_subbuffer);
   return buffer;
 }
 
-static void
-swfdec_buffer_free_mapped (unsigned char *data, gpointer priv)
-{
-  g_mapped_file_free (priv);
-}
-
 /**
  * swfdec_buffer_new_from_file:
  * @filename: file to read
@@ -283,12 +245,9 @@ swfdec_buffer_new_from_file (const char *filename, GError **error)
 
   file = g_mapped_file_new (filename, FALSE, NULL);
   if (file != NULL) {
-    SwfdecBuffer *buffer = swfdec_buffer_new ();
-    buffer->data = (unsigned char *) g_mapped_file_get_contents (file), 
-    buffer->length = g_mapped_file_get_length (file);
-    buffer->free = swfdec_buffer_free_mapped;
-    buffer->priv = file;
-    return buffer;
+    return swfdec_buffer_new_full ((guchar *) g_mapped_file_get_contents (file),
+	g_mapped_file_get_length (file),
+	(SwfdecBufferFreeFunc) g_mapped_file_free, file);
   }
 
   if (!g_file_get_contents (filename, &data, &length, error))
@@ -331,7 +290,7 @@ swfdec_buffer_unref (SwfdecBuffer * buffer)
   buffer->ref_count--;
   if (buffer->ref_count == 0) {
     if (buffer->free)
-      buffer->free (buffer->data, buffer->priv);
+      buffer->free (buffer->priv, buffer->data);
     g_free (buffer);
   }
 }
@@ -521,7 +480,7 @@ swfdec_buffer_queue_peek (SwfdecBufferQueue * queue, gsize length)
 
   /* need to special case here, because the queue may be empty */
   if (length == 0)
-    return swfdec_buffer_new ();
+    return swfdec_buffer_new (0);
 
   g = queue->first_buffer;
   buffer = g->data;
@@ -529,7 +488,7 @@ swfdec_buffer_queue_peek (SwfdecBufferQueue * queue, gsize length)
     newbuffer = swfdec_buffer_new_subbuffer (buffer, 0, length);
   } else {
     gsize amount, offset;
-    newbuffer = swfdec_buffer_new_and_alloc (length);
+    newbuffer = swfdec_buffer_new (length);
     offset = 0;
     while (offset < length) {
       buffer = g->data;
diff --git a/swfdec/swfdec_buffer.h b/swfdec/swfdec_buffer.h
index 57cff63..2f66747 100644
--- a/swfdec/swfdec_buffer.h
+++ b/swfdec/swfdec_buffer.h
@@ -28,7 +28,7 @@
 typedef struct _SwfdecBuffer SwfdecBuffer;
 typedef struct _SwfdecBufferQueue SwfdecBufferQueue;
 
-typedef void (* SwfdecBufferFreeFunc) (unsigned char *data, gpointer priv);
+typedef void (* SwfdecBufferFreeFunc) (gpointer *priv, unsigned char *data);
 
 struct _SwfdecBuffer
 {
@@ -59,15 +59,13 @@ struct _SwfdecBufferQueue
 #define SWFDEC_TYPE_BUFFER_QUEUE swfdec_buffer_queue_get_type()
 GType swfdec_buffer_queue_get_type  (void);
 
-SwfdecBuffer *swfdec_buffer_new (void);
-SwfdecBuffer *swfdec_buffer_new_and_alloc (gsize size);
-SwfdecBuffer *swfdec_buffer_new_and_alloc0 (gsize size);
+SwfdecBuffer *swfdec_buffer_new (gsize size);
+SwfdecBuffer *swfdec_buffer_new0 (gsize size);
+SwfdecBuffer *swfdec_buffer_new_full (unsigned char *data, gsize size, SwfdecBufferFreeFunc free_func, gpointer priv);
 SwfdecBuffer *swfdec_buffer_new_subbuffer (SwfdecBuffer * buffer, gsize offset,
     gsize length);
 SwfdecBuffer *swfdec_buffer_new_from_file (const char *filename, GError **error);
-SwfdecBuffer *swfdec_buffer_new_full (unsigned char *data, gsize size, SwfdecBufferFreeFunc free_func, gpointer priv);
-#define swfdec_buffer_new_for_data(data, size) \
-    swfdec_buffer_new_full (data, size, (SwfdecBufferFreeFunc) g_free, NULL)
+SwfdecBuffer *swfdec_buffer_new_for_data (unsigned char *data, gsize size);
 #define swfdec_buffer_new_static(data, size) \
     swfdec_buffer_new_full (data, size, NULL, NULL)
 SwfdecBuffer *swfdec_buffer_ref (SwfdecBuffer * buffer);
diff --git a/swfdec/swfdec_codec_adpcm.c b/swfdec/swfdec_codec_adpcm.c
index 0aa39ab..600e313 100644
--- a/swfdec/swfdec_codec_adpcm.c
+++ b/swfdec/swfdec_codec_adpcm.c
@@ -78,7 +78,7 @@ swfdec_audio_decoder_adpcm_decode_chunk (SwfdecBits *bits, guint n_bits, guint c
   }
   len = swfdec_bits_left (bits) / channels / n_bits;
   len = MIN (len, 4095);
-  ret = swfdec_buffer_new_and_alloc ((len + 1) * sizeof (gint16) * channels);
+  ret = swfdec_buffer_new ((len + 1) * sizeof (gint16) * channels);
   out = (gint16 *) (void *) ret->data;
   /* output initial value */
   SWFDEC_LOG ("decoding %u samples", len + 1);
diff --git a/swfdec/swfdec_codec_audio.c b/swfdec/swfdec_codec_audio.c
index 34edbe9..2d121af 100644
--- a/swfdec/swfdec_codec_audio.c
+++ b/swfdec/swfdec_codec_audio.c
@@ -44,7 +44,7 @@ swfdec_audio_decoder_uncompressed_decode_8bit (SwfdecAudioDecoder *decoder,
   if (buffer == NULL)
     return;
 
-  ret = swfdec_buffer_new_and_alloc (buffer->length * 2);
+  ret = swfdec_buffer_new (buffer->length * 2);
   out = (gint16 *) (void *) ret->data;
   in = buffer->data;
   for (i = 0; i < buffer->length; i++) {
diff --git a/swfdec/swfdec_codec_ffmpeg.c b/swfdec/swfdec_codec_ffmpeg.c
index 9e159d3..fef007b 100644
--- a/swfdec/swfdec_codec_ffmpeg.c
+++ b/swfdec/swfdec_codec_ffmpeg.c
@@ -77,7 +77,7 @@ swfdec_codec_ffmpeg_convert (AVCodecContext *ctx, SwfdecBuffer *buffer)
 
   /* do the common case fast */
   if (ctx->channels == 2 && ctx->sample_rate == 44100) {
-    ret = swfdec_buffer_new_and_alloc (buffer->length);
+    ret = swfdec_buffer_new (buffer->length);
     memcpy (ret->data, buffer->data, buffer->length);
     return ret;
   }
@@ -98,7 +98,7 @@ swfdec_codec_ffmpeg_convert (AVCodecContext *ctx, SwfdecBuffer *buffer)
   }
   if (ctx->channels == 1)
     rate *= 2;
-  ret = swfdec_buffer_new_and_alloc (buffer->length * rate);
+  ret = swfdec_buffer_new (buffer->length * rate);
   out = (gint16 *) ret->data;
   in = (gint16 *) buffer->data;
   count = buffer->length / 2;
@@ -123,7 +123,7 @@ swfdec_audio_decoder_ffmpeg_push (SwfdecAudioDecoder *dec, SwfdecBuffer *buffer)
 
   if (buffer == NULL)
     return;
-  outbuf = swfdec_buffer_new_and_alloc (AVCODEC_MAX_AUDIO_FRAME_SIZE);
+  outbuf = swfdec_buffer_new (AVCODEC_MAX_AUDIO_FRAME_SIZE);
   for (amount = 0; amount < buffer->length; amount += len) {
     
     out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
diff --git a/swfdec/swfdec_codec_gst.c b/swfdec/swfdec_codec_gst.c
index 4b6f209..ebcd75f 100644
--- a/swfdec/swfdec_codec_gst.c
+++ b/swfdec/swfdec_codec_gst.c
@@ -30,15 +30,10 @@
 
 /*** BUFFER ***/
 
-static void
-swfdec_gst_buffer_free (unsigned char *data, gpointer priv)
-{
-  gst_buffer_unref (priv);
-}
-
+/* NB: references argument more than once */
 #define swfdec_buffer_new_from_gst(buffer) \
   swfdec_buffer_new_full (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), \
-      swfdec_gst_buffer_free, (buffer))
+      (SwfdecBufferFreeFunc) gst_mini_object_unref, (buffer))
 
 static GstBuffer *
 swfdec_gst_buffer_new (SwfdecBuffer *buffer)
diff --git a/swfdec/swfdec_codec_mad.c b/swfdec/swfdec_codec_mad.c
index ec15231..03241d5 100644
--- a/swfdec/swfdec_codec_mad.c
+++ b/swfdec/swfdec_codec_mad.c
@@ -70,7 +70,7 @@ convert_synth_to_buffer (MadData *mdata)
       return NULL;
   }
 
-  buffer = swfdec_buffer_new_and_alloc (n_samples * 2 * 2);
+  buffer = swfdec_buffer_new (n_samples * 2 * 2);
   data = (gint16 *) buffer->data;
 
   if (mdata->synth.pcm.samplerate == 11025) {
@@ -148,11 +148,8 @@ swfdec_audio_decoder_mad_push (SwfdecAudioDecoder *dec, SwfdecBuffer *buffer)
   SwfdecBuffer *out, *empty = NULL;
   guint amount = 0, size;
 
-  if (buffer == NULL) {
-    buffer = empty = swfdec_buffer_new ();
-    empty->data = g_malloc0 (MAD_BUFFER_GUARD * 3);
-    empty->length = MAD_BUFFER_GUARD * 3;
-  }
+  if (buffer == NULL)
+    buffer = empty = swfdec_buffer_new0 (MAD_BUFFER_GUARD * 3);
 
   //write (1, buffer->data, buffer->length);
   //g_print ("buffer %p gave us %u bytes\n", buffer, buffer->length);
diff --git a/swfdec/swfdec_script.c b/swfdec/swfdec_script.c
index ec73386..852b799 100644
--- a/swfdec/swfdec_script.c
+++ b/swfdec/swfdec_script.c
@@ -243,7 +243,7 @@ swfdec_script_new_from_bits (SwfdecBits *bits, const char *name, guint version)
   }
   len -= swfdec_bits_left (bits) / 8;
   if (len == 0) {
-    buffer = swfdec_buffer_new ();
+    buffer = swfdec_buffer_new (0);
   } else {
     buffer = swfdec_bits_get_buffer (&org, len);
   }
diff --git a/swfdec/swfdec_swf_decoder.c b/swfdec/swfdec_swf_decoder.c
index 5f3b2e0..733faa7 100644
--- a/swfdec/swfdec_swf_decoder.c
+++ b/swfdec/swfdec_swf_decoder.c
@@ -95,7 +95,7 @@ swfdec_buffer_merge (const SwfdecBuffer *front, const SwfdecBuffer *end)
   g_return_val_if_fail (front != NULL, NULL);
   g_return_val_if_fail (end != NULL, NULL);
 
-  new = swfdec_buffer_new_and_alloc (front->length + end->length);
+  new = swfdec_buffer_new (front->length + end->length);
   if (front->length)
     memcpy (new->data, front->data, front->length);
   if (end->length)
commit 8238a63d16dfef63834dab10a5ef7dd130a2d5cd
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 12:47:09 2008 +0100

    add swfdec_buffer_new_full() and use it instead of modifying buffer members directly

diff --git a/swfdec-gtk/swfdec_gtk_loader.c b/swfdec-gtk/swfdec_gtk_loader.c
index 42bbb76..8545625 100644
--- a/swfdec-gtk/swfdec_gtk_loader.c
+++ b/swfdec-gtk/swfdec_gtk_loader.c
@@ -101,11 +101,8 @@ swfdec_gtk_loader_push (SoupMessage *msg, SoupBuffer *chunk, gpointer loader)
   chunk = soup_buffer_copy (chunk);
 
   swfdec_gtk_loader_ensure_open (gtk);
-  buffer = swfdec_buffer_new ();
-  buffer->data = (unsigned char *) chunk->data;
-  buffer->length = chunk->length;
-  buffer->priv = chunk;
-  buffer->free = swfdec_gtk_loader_free_soup_buffer;
+  buffer = swfdec_buffer_new_full ((unsigned char *) chunk->data, chunk->length,
+      swfdec_gtk_loader_free_soup_buffer, chunk);
   swfdec_stream_push (loader, buffer);
 }
   
diff --git a/swfdec/swfdec_buffer.c b/swfdec/swfdec_buffer.c
index 75a66c8..7e836d5 100644
--- a/swfdec/swfdec_buffer.c
+++ b/swfdec/swfdec_buffer.c
@@ -155,8 +155,31 @@ swfdec_buffer_new_and_alloc0 (gsize size)
  *
  * Returns: a new #SwfdecBuffer pointing to @data
  **/
+/**
+ * swfdec_buffer_new_static:
+ * @data: static data
+ * @size: size of @data in bytes
+ *
+ * Creates a buffer for static data.
+ *
+ * Returns: a new #SwfdecBuffer pointing to @data
+ **/
+/**
+ * swfdec_buffer_new_full:
+ * @data: memory region to reference
+ * @size: size of the provided memory region
+ * @free_func: function to call for freeing the @data
+ * @priv: private data to bass to @free_func
+ *
+ * Creates a new #SwfdecBuffer for managing @data. The provided @free_func
+ * will be called when the returned buffer is not referenced anymore, the 
+ * provided data needs to stay valid until that point.
+ *
+ * Returns: a new #SwfdecBuffer pointing to @data
+ **/
 SwfdecBuffer *
-swfdec_buffer_new_for_data (unsigned char *data, gsize size)
+swfdec_buffer_new_full (unsigned char *data, gsize size, 
+    SwfdecBufferFreeFunc free_func, gpointer priv)
 {
   SwfdecBuffer *buffer;
   
@@ -166,7 +189,8 @@ swfdec_buffer_new_for_data (unsigned char *data, gsize size)
   buffer = swfdec_buffer_new ();
   buffer->data = data;
   buffer->length = size;
-  buffer->free = (SwfdecBufferFreeFunc) g_free;
+  buffer->free = free_func;
+  buffer->priv = priv;
 
   return buffer;
 }
diff --git a/swfdec/swfdec_buffer.h b/swfdec/swfdec_buffer.h
index 1b851b6..57cff63 100644
--- a/swfdec/swfdec_buffer.h
+++ b/swfdec/swfdec_buffer.h
@@ -62,10 +62,14 @@ GType swfdec_buffer_queue_get_type  (void);
 SwfdecBuffer *swfdec_buffer_new (void);
 SwfdecBuffer *swfdec_buffer_new_and_alloc (gsize size);
 SwfdecBuffer *swfdec_buffer_new_and_alloc0 (gsize size);
-SwfdecBuffer *swfdec_buffer_new_for_data (unsigned char *data, gsize size);
 SwfdecBuffer *swfdec_buffer_new_subbuffer (SwfdecBuffer * buffer, gsize offset,
     gsize length);
 SwfdecBuffer *swfdec_buffer_new_from_file (const char *filename, GError **error);
+SwfdecBuffer *swfdec_buffer_new_full (unsigned char *data, gsize size, SwfdecBufferFreeFunc free_func, gpointer priv);
+#define swfdec_buffer_new_for_data(data, size) \
+    swfdec_buffer_new_full (data, size, (SwfdecBufferFreeFunc) g_free, NULL)
+#define swfdec_buffer_new_static(data, size) \
+    swfdec_buffer_new_full (data, size, NULL, NULL)
 SwfdecBuffer *swfdec_buffer_ref (SwfdecBuffer * buffer);
 SwfdecBuffer *swfdec_buffer_get_super (SwfdecBuffer *buffer);
 void swfdec_buffer_unref (SwfdecBuffer * buffer);
diff --git a/swfdec/swfdec_codec_gst.c b/swfdec/swfdec_codec_gst.c
index 2167050..4b6f209 100644
--- a/swfdec/swfdec_codec_gst.c
+++ b/swfdec/swfdec_codec_gst.c
@@ -36,21 +36,9 @@ swfdec_gst_buffer_free (unsigned char *data, gpointer priv)
   gst_buffer_unref (priv);
 }
 
-static SwfdecBuffer *
-swfdec_buffer_new_from_gst (GstBuffer *buffer)
-{
-  SwfdecBuffer *ret;
-
-  g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
-
-  ret = swfdec_buffer_new ();
-  ret->data = GST_BUFFER_DATA (buffer);
-  ret->length = GST_BUFFER_SIZE (buffer);
-  ret->free = swfdec_gst_buffer_free;
-  ret->priv = buffer;
-
-  return ret;
-}
+#define swfdec_buffer_new_from_gst(buffer) \
+  swfdec_buffer_new_full (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), \
+      swfdec_gst_buffer_free, (buffer))
 
 static GstBuffer *
 swfdec_gst_buffer_new (SwfdecBuffer *buffer)
commit df98d771e244aa439f9a411d05f9a092647c0918
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 12:46:34 2008 +0100

    implement System.security.loadPolicyFile (untested)

diff --git a/swfdec/swfdec_system_security.c b/swfdec/swfdec_system_security.c
index 284eea1..404f689 100644
--- a/swfdec/swfdec_system_security.c
+++ b/swfdec/swfdec_system_security.c
@@ -26,6 +26,7 @@
 #include "swfdec_as_strings.h"
 #include "swfdec_resource.h"
 #include "swfdec_player_internal.h"
+#include "swfdec_policy_file.h"
 
 // properties
 SWFDEC_AS_NATIVE (12, 0, swfdec_system_security_allowDomain)
@@ -46,13 +47,28 @@ swfdec_system_security_allowInsecureDomain (SwfdecAsContext *cx,
   SWFDEC_STUB ("System.security.allowInsecureDomain (static)");
 }
 
+static void
+swfdec_system_security_do_loadPolicyFile (gpointer url, gpointer player)
+{
+  swfdec_policy_file_new (player, url);
+}
+
 SWFDEC_AS_NATIVE (12, 2, swfdec_system_security_loadPolicyFile)
 void
 swfdec_system_security_loadPolicyFile (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
     SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("System.security.loadPolicyFile (static)");
+  SwfdecPlayer *player;
+  const char *url_string;
+  SwfdecURL *url;
+
+  SWFDEC_AS_CHECK (0, NULL, "s", &url_string);
+
+  player = SWFDEC_PLAYER (cx);
+  url = swfdec_player_create_url (player, url_string);
+  swfdec_player_request_resource (player, swfdec_system_security_do_loadPolicyFile, 
+      url, (GDestroyNotify) swfdec_url_free);
 }
 
 SWFDEC_AS_NATIVE (12, 3, swfdec_system_security_chooseLocalSwfPath)
commit dac4f609cf10a2283dc638ae324a60286e0b9f6f
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 12:45:45 2008 +0100

    don't try getting a parent path when path is NULL

diff --git a/swfdec/swfdec_url.c b/swfdec/swfdec_url.c
index 2d0f29d..5e86632 100644
--- a/swfdec/swfdec_url.c
+++ b/swfdec/swfdec_url.c
@@ -223,7 +223,8 @@ swfdec_url_new_parent (const SwfdecURL *url)
   SwfdecURL *ret;
   
   path = g_strdup (url->path);
-  swfdec_url_path_to_parent_path (path);
+  if (path)
+    swfdec_url_path_to_parent_path (path);
   ret = swfdec_url_new_components (url->protocol, url->host, url->port,
       path, NULL);
   g_free (path);
commit 04a1b286948f8035d635f29ff95b16c64ba9fc87
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 5 12:45:20 2008 +0100

    add a describe vfunc so we don't crash

diff --git a/swfdec/swfdec_socket.c b/swfdec/swfdec_socket.c
index d3ebe9e..821e214 100644
--- a/swfdec/swfdec_socket.c
+++ b/swfdec/swfdec_socket.c
@@ -80,9 +80,20 @@ swfdec_socket_do_send (SwfdecSocket *socket, SwfdecBuffer *buffer)
   swfdec_buffer_unref (buffer);
 }
 
+static const char *
+swfdec_socket_describe (SwfdecStream *stream)
+{
+  /* FIXME: add host/port */
+  return G_OBJECT_TYPE_NAME (stream);
+}
+
 static void
 swfdec_socket_class_init (SwfdecSocketClass *klass)
 {
+  SwfdecStreamClass *stream_class = SWFDEC_STREAM_CLASS (klass);
+
+  stream_class->describe = swfdec_socket_describe;
+
   klass->connect = swfdec_socket_do_connect;
   klass->send = swfdec_socket_do_send;
 }
commit 560cbf0e36a465145983a31ea6631ffbe8d07985
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Feb 4 12:35:20 2008 +0100

    alignment

diff --git a/test/swfdec_test_plugin.h b/test/swfdec_test_plugin.h
index e7a68e9..0866453 100644
--- a/test/swfdec_test_plugin.h
+++ b/test/swfdec_test_plugin.h
@@ -43,37 +43,37 @@ typedef struct _SwfdecTestPlugin SwfdecTestPlugin;
 struct _SwfdecTestPlugin {
   /* initialized by the player before calling swfdec_test_plugin_new() */
   char *	filename;
-  void		(* trace)	(SwfdecTestPlugin *	plugin,
-				 const char *		string);
-  void		(* quit)	(SwfdecTestPlugin *	plugin);	  
-  void		(* error)	(SwfdecTestPlugin *	plugin,
-				 const char *		description);
+  void		(* trace)		(SwfdecTestPlugin *	plugin,
+					 const char *		string);
+  void		(* quit)		(SwfdecTestPlugin *	plugin);	  
+  void		(* error)		(SwfdecTestPlugin *	plugin,
+					 const char *		description);
   /* initialized by the plugin during swfdec_test_plugin_new() */
   unsigned int	width;
   unsigned int	height;
   unsigned int	rate; /* in 256th of a second */
-  void		(* advance)	(SwfdecTestPlugin *	plugin,
-				 unsigned int		msecs);
+  void		(* advance)		(SwfdecTestPlugin *	plugin,
+					 unsigned int		msecs);
   /* data nulled is ARGB for (provided) width * height with rowstride = width * 4 */
   /* size is guaranteed to fit into 0,0 x width,height */
-  void		(* screenshot)	(SwfdecTestPlugin *	plugin,
-				 unsigned char *	data,
-				 unsigned int		x,
-				 unsigned int		y,
-				 unsigned int		width,
-				 unsigned int		height);
-  void		(* mouse_move)	(SwfdecTestPlugin *     plugin,
-				 double			x,
-				 double			y);
-  void		(* mouse_press)	(SwfdecTestPlugin *	plugin,
-				 double			x,
-				 double			y,
-				 unsigned int		button); /* 1 - 32 */
-  void		(* mouse_release) (SwfdecTestPlugin *   plugin,
-				 double			x,
-				 double			y,
-				 unsigned int		button); /* 1 - 32 */
-  void		(* finish)	(SwfdecTestPlugin *	plugin);
+  void		(* screenshot)	  	(SwfdecTestPlugin *	plugin,
+					 unsigned char *	data,
+					 unsigned int		x,
+					 unsigned int		y,
+					 unsigned int		width,
+					 unsigned int		height);
+  void		(* mouse_move)	  	(SwfdecTestPlugin *     plugin,
+					 double			x,
+					 double			y);
+  void		(* mouse_press)		(SwfdecTestPlugin *	plugin,
+					 double			x,
+					 double			y,
+					 unsigned int		button); /* 1 - 32 */
+  void		(* mouse_release)	(SwfdecTestPlugin *   plugin,
+					 double			x,
+					 double			y,
+					 unsigned int		button); /* 1 - 32 */
+  void		(* finish)	  	(SwfdecTestPlugin *	plugin);
   void *	data;
 };
 
@@ -87,6 +87,6 @@ struct _SwfdecTestPlugin {
  *
  * Returns: a new SwfdecTestPlugin instance
  **/
-void swfdec_test_plugin_init (SwfdecTestPlugin *plugin);
+void		swfdec_test_plugin_init	(SwfdecTestPlugin *	plugin);
 
 #endif
commit 14dfe6f0915cbef5857f02abbe3b9eb06af33aeb
Author: Benjamin Otte <otte at gnome.org>
Date:   Sun Feb 3 23:44:13 2008 +0100

    implement xmlsocket:// policy file loading

diff --git a/swfdec/swfdec_policy_file.c b/swfdec/swfdec_policy_file.c
index 2070f67..a7069ae 100644
--- a/swfdec/swfdec_policy_file.c
+++ b/swfdec/swfdec_policy_file.c
@@ -158,6 +158,17 @@ swfdec_policy_file_finished_loading (SwfdecPolicyFile *file, const char *text)
 }
 
 static void
+swfdec_policy_file_target_open (SwfdecStreamTarget *target,
+    SwfdecStream *stream)
+{
+  if (SWFDEC_IS_SOCKET (stream)) {
+    SwfdecBuffer *buffer = swfdec_buffer_new_for_data (
+	(guchar *) g_strdup ("<policy-file-request/>"), 23);
+    swfdec_socket_send (SWFDEC_SOCKET (stream), buffer);
+  }
+}
+
+static void
 swfdec_policy_file_target_error (SwfdecStreamTarget *target,
     SwfdecStream *stream)
 {
@@ -187,6 +198,7 @@ static void
 swfdec_policy_file_stream_target_init (SwfdecStreamTargetInterface *iface)
 {
   iface->get_player = swfdec_policy_file_target_get_player;
+  iface->open = swfdec_policy_file_target_open;
   iface->close = swfdec_policy_file_target_close;
   iface->error = swfdec_policy_file_target_error;
 }
@@ -243,12 +255,13 @@ swfdec_policy_file_new (SwfdecPlayer *player, const SwfdecURL *url)
   file->load_url = swfdec_url_copy (url);
   file->url = swfdec_url_new_parent (url);
   if (swfdec_url_has_protocol (url, "xmlsocket")) {
-    SWFDEC_FIXME ("implement xmlsocket: protocol");
+    file->stream = SWFDEC_STREAM (swfdec_player_create_socket (player, 
+	swfdec_url_get_host (url), swfdec_url_get_port (url)));
   } else {
     file->stream = SWFDEC_STREAM (swfdec_player_load (player,
 	  swfdec_url_get_url (url), SWFDEC_LOADER_REQUEST_DEFAULT, NULL));
-    swfdec_stream_set_target (file->stream, SWFDEC_STREAM_TARGET (file));
   }
+  swfdec_stream_set_target (file->stream, SWFDEC_STREAM_TARGET (file));
   player->priv->loading_policy_files = 
     g_list_prepend (player->priv->loading_policy_files, file);
 
commit 11be954666bbc563f1630ec5da53f3ecac8eb7c1
Author: Benjamin Otte <otte at gnome.org>
Date:   Sun Feb 3 23:27:10 2008 +0100

    as a SwfdecSocket is now a valid socket, we can use it and not return NULL

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 33a4ea8..e0c59ac 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2157,9 +2157,8 @@ swfdec_player_set_export_class (SwfdecPlayer *player, const char *name, SwfdecAs
  *
  * Creates a new socket connecting to the given hostname and port.
  *
- * Returns: a new socket or %NULL if no socket implementation exists
+ * Returns: a new socket
  **/
-/* FIXME: always return a socket? */
 SwfdecSocket *
 swfdec_player_create_socket (SwfdecPlayer *player, const char *hostname, guint port)
 {
@@ -2170,10 +2169,6 @@ swfdec_player_create_socket (SwfdecPlayer *player, const char *hostname, guint p
   g_return_val_if_fail (hostname != NULL, NULL);
   g_return_val_if_fail (port > 0, NULL);
 
-  if (!G_TYPE_IS_INSTANTIATABLE (player->priv->socket_type)) {
-    SWFDEC_INFO ("can't create socket, no socket type set.");
-    return NULL;
-  }
   sock = g_object_new (player->priv->socket_type, NULL);
   klass = SWFDEC_SOCKET_GET_CLASS (sock);
   klass->connect (sock, player, hostname, port);
commit 225d3e1f1e505ebd676963cf8582925da2626ea3
Author: Benjamin Otte <otte at gnome.org>
Date:   Sun Feb 3 23:26:50 2008 +0100

    make a SwfdecSocket a valid socket type that does nothing

diff --git a/swfdec/swfdec_socket.c b/swfdec/swfdec_socket.c
index 19f47aa..d3ebe9e 100644
--- a/swfdec/swfdec_socket.c
+++ b/swfdec/swfdec_socket.c
@@ -65,11 +65,26 @@
 
 /*** SWFDEC_SOCKET ***/
 
-G_DEFINE_ABSTRACT_TYPE (SwfdecSocket, swfdec_socket, SWFDEC_TYPE_STREAM)
+G_DEFINE_TYPE (SwfdecSocket, swfdec_socket, SWFDEC_TYPE_STREAM)
+
+static void
+swfdec_socket_do_connect (SwfdecSocket *socket, SwfdecPlayer *player,
+    const char *hostname, guint port)
+{
+  swfdec_stream_error (SWFDEC_STREAM (socket), "no socket implementation exists");
+}
+
+static void
+swfdec_socket_do_send (SwfdecSocket *socket, SwfdecBuffer *buffer)
+{
+  swfdec_buffer_unref (buffer);
+}
 
 static void
 swfdec_socket_class_init (SwfdecSocketClass *klass)
 {
+  klass->connect = swfdec_socket_do_connect;
+  klass->send = swfdec_socket_do_send;
 }
 
 static void
commit f9d23bb1d543bbb5573785fa1e0239f0c62f68f8
Author: Benjamin Otte <otte at gnome.org>
Date:   Sun Feb 3 22:36:19 2008 +0100

    remove outdated warning

diff --git a/swfdec/swfdec_policy_file.c b/swfdec/swfdec_policy_file.c
index 842091a..2070f67 100644
--- a/swfdec/swfdec_policy_file.c
+++ b/swfdec/swfdec_policy_file.c
@@ -173,12 +173,7 @@ swfdec_policy_file_target_close (SwfdecStreamTarget *target,
   SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target);
   char *text;
 
-  if (SWFDEC_IS_LOADER (stream)) {
-    text = swfdec_buffer_queue_pull_text (swfdec_stream_get_queue (stream), 8);
-  } else {
-    SWFDEC_FIXME ("rewrite swfdec_loader_get_text() to swfdec_buffer_queue_get_text()");
-    text = NULL;
-  }
+  text = swfdec_buffer_queue_pull_text (swfdec_stream_get_queue (stream), 8);
 
   if (text == NULL) {
     SWFDEC_ERROR ("couldn't get text from crossdomain policy file %s", 


More information about the Swfdec-commits mailing list