[Swfdec-commits] 12 commits - swfdec/swfdec_load_object_as.c swfdec/swfdec_load_object.c swfdec/swfdec_marshal.list swfdec/swfdec_player.c swfdec/swfdec_player_internal.h vivified/code

Pekka Lampila medar at kemper.freedesktop.org
Mon Jun 16 04:26:36 PDT 2008


 swfdec/swfdec_load_object.c                                    |   10 
 swfdec/swfdec_load_object_as.c                                 |   57 ++--
 swfdec/swfdec_marshal.list                                     |    2 
 swfdec/swfdec_player.c                                         |   31 +-
 swfdec/swfdec_player_internal.h                                |    9 
 vivified/code/test/compiler/Makefile.am                        |   10 
 vivified/code/test/compiler/builtin_call.as                    |   11 
 vivified/code/test/compiler/builtin_call.as.expect             |   48 +++
 vivified/code/test/compiler/function_call.as                   |    1 
 vivified/code/test/compiler/function_call.as.expect            |    7 
 vivified/code/test/compiler/function_call_arguments.as         |    1 
 vivified/code/test/compiler/function_call_arguments.as.expect  |    9 
 vivified/code/test/compiler/function_call_get_member.as        |    2 
 vivified/code/test/compiler/function_call_get_member.as.expect |   15 +
 vivified/code/test/compiler/function_call_returned.as          |    1 
 vivified/code/test/compiler/function_call_returned.as.expect   |    8 
 vivified/code/vivi_parser.c                                    |  135 ++++------
 17 files changed, 244 insertions(+), 113 deletions(-)

New commits:
commit 5006bfac57be257fd7595b22413a11b93555ddbf
Merge: 76edb98... 6c9b0a8...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 16 13:54:50 2008 +0300

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

commit 76edb981df3a37a865269881baa4e71e9ed2ed10
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 16 13:51:24 2008 +0300

    Fix parsing of typeOf in vivi-compile

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index 879dc12..e632b96 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -1660,10 +1660,15 @@ peek_builtin_call (ParseData *data)
   const char *identifier;
   const ViviParserValue *value;
 
-  if (!peek_token (data, TOKEN_IDENTIFIER))
-    return FALSE;
+  if (peek_token (data, TOKEN_TYPEOF)) {
+    identifier = "typeOf";
+  } else {
+    if (!peek_token (data, TOKEN_IDENTIFIER))
+      return FALSE;
 
-  identifier = vivi_parser_scanner_get_value (data->scanner, 1)->value.v_identifier;
+    identifier =
+      vivi_parser_scanner_get_value (data->scanner, 1)->value.v_identifier;
+  }
 
   value = vivi_parser_scanner_get_value (data->scanner, 2);
 
@@ -1685,7 +1690,11 @@ parse_builtin_call (ParseData *data)
   const char *identifier;
   ViviCodeValue *value, *argument;
 
-  identifier = parse_identifier_value (data);
+  if (try_parse_token (data, TOKEN_TYPEOF)) {
+    identifier = "typeOf";
+  } else {
+    identifier = parse_identifier_value (data);
+  }
 
   for (i = 0; i < G_N_ELEMENTS (builtin_calls); i++) {
     if (g_ascii_strcasecmp (identifier, builtin_calls[i].name) == 0)
commit bbfb05578d6e6f7fc2ec5ce261b668a8d71a631d
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 16 13:50:57 2008 +0300

    Add a vivi-compile test for some builtin calls

diff --git a/vivified/code/test/compiler/Makefile.am b/vivified/code/test/compiler/Makefile.am
index 30c4277..6b0c476 100644
--- a/vivified/code/test/compiler/Makefile.am
+++ b/vivified/code/test/compiler/Makefile.am
@@ -54,6 +54,8 @@ EXTRA_DIST = \
 	automatic_semicolon.as.expect \
 	bitwise_not.as \
 	bitwise_not.as.expect \
+	builtin_call.as \
+	builtin_call.as.expect \
 	builtin_statement.as \
 	builtin_statement.as.expect \
 	break.as \
diff --git a/vivified/code/test/compiler/builtin_call.as b/vivified/code/test/compiler/builtin_call.as
new file mode 100644
index 0000000..154f939
--- /dev/null
+++ b/vivified/code/test/compiler/builtin_call.as
@@ -0,0 +1,11 @@
+trace (chr (x));
+trace (concat (x, y));
+trace (eval (x));
+trace (getTimer ());
+trace (int (x));
+trace (length (x));
+trace (Number (x));
+trace (ord (x));
+trace (random (x));
+trace (targetPath (x));
+trace (typeOf (x));
diff --git a/vivified/code/test/compiler/builtin_call.as.expect b/vivified/code/test/compiler/builtin_call.as.expect
new file mode 100644
index 0000000..f78cc9e
--- /dev/null
+++ b/vivified/code/test/compiler/builtin_call.as.expect
@@ -0,0 +1,48 @@
+asm {
+  pool "x", "y"
+  push pool 0
+  get_variable
+  ascii_to_char
+  trace
+  push pool 0
+  get_variable
+  push pool 1
+  get_variable
+  string_add
+  trace
+  push pool 0
+  get_variable
+  get_variable
+  trace
+  get_time
+  trace
+  push pool 0
+  get_variable
+  to_integer
+  trace
+  push pool 0
+  get_variable
+  string_length
+  trace
+  push pool 0
+  get_variable
+  to_number
+  trace
+  push pool 0
+  get_variable
+  char_to_ascii
+  trace
+  push pool 0
+  get_variable
+  random
+  trace
+  push pool 0
+  get_variable
+  target_path
+  trace
+  push pool 0
+  get_variable
+  type_of
+  trace
+  end
+}
commit 28745744794157df5727075bfb12b9e3f3e97340
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 16 13:37:38 2008 +0300

    Add a vivi-compile test for getting member from function call's returned value

diff --git a/vivified/code/test/compiler/Makefile.am b/vivified/code/test/compiler/Makefile.am
index 3c6a691..30c4277 100644
--- a/vivified/code/test/compiler/Makefile.am
+++ b/vivified/code/test/compiler/Makefile.am
@@ -94,6 +94,8 @@ EXTRA_DIST = \
 	function_call.as.expect \
 	function_call_arguments.as \
 	function_call_arguments.as.expect \
+	function_call_get_member.as \
+	function_call_get_member.as.expect \
 	function_call_returned.as \
 	function_call_returned.as.expect \
 	function_declaration.as \
diff --git a/vivified/code/test/compiler/function_call_get_member.as b/vivified/code/test/compiler/function_call_get_member.as
new file mode 100644
index 0000000..d60cd72
--- /dev/null
+++ b/vivified/code/test/compiler/function_call_get_member.as
@@ -0,0 +1,2 @@
+trace (test ().x);
+trace (test ()[x]);
diff --git a/vivified/code/test/compiler/function_call_get_member.as.expect b/vivified/code/test/compiler/function_call_get_member.as.expect
new file mode 100644
index 0000000..945981c
--- /dev/null
+++ b/vivified/code/test/compiler/function_call_get_member.as.expect
@@ -0,0 +1,15 @@
+asm {
+  pool "test", "x"
+  push 0, pool 0
+  call_function
+  push pool 1
+  get_member
+  trace
+  push 0, pool 0
+  call_function
+  push pool 1
+  get_variable
+  get_member
+  trace
+  end
+}
commit 5416d1dfca0885058f8999966451bdcb2ef6af5b
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 16 13:34:58 2008 +0300

    Fix parsing of "foo ().x" (get member after call) in vivi-compile

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index 283143e..879dc12 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -1862,61 +1862,10 @@ static ViviCodeValue *
 parse_function_expression (ParseData *data);
 
 static gboolean
-peek_member_expression (ParseData *data)
-{
-  return (peek_primary_expression (data) || peek_function_expression (data));
-}
-
-static ViviCodeValue *
-parse_member_expression (ParseData *data)
-{
-  ViviCodeValue *value;
-
-  vivi_parser_start_code_token (data);
-
-  if (peek_primary_expression (data)) {
-    value = parse_primary_expression (data);
-  } else if (peek_function_expression (data)) {
-    value = parse_function_expression (data);
-  } else {
-    vivi_parser_error_unexpected_or (data, ERROR_TOKEN_PRIMARY_EXPRESSION,
-	ERROR_TOKEN_FUNCTION_EXPRESSION, TOKEN_NONE);
-    value = vivi_code_undefined_new ();
-
-    vivi_parser_duplicate_code_token (data);
-    vivi_parser_end_code_token (data, VIVI_CODE_TOKEN (value));
-  }
-
-  while (TRUE) {
-    ViviCodeValue *tmp;
-
-    if (try_parse_token (data, TOKEN_BRACKET_LEFT)) {
-      ViviCodeValue *member = parse_expression (data);
-      tmp = value;
-      value = vivi_code_get_new (tmp, member);
-      g_object_unref (tmp);
-      g_object_unref (member);
-      parse_token (data, TOKEN_BRACKET_RIGHT);
-    } else if (try_parse_token (data, TOKEN_DOT)) {
-      tmp = value;
-      value = vivi_code_get_new_name (tmp, parse_identifier_value (data));
-      g_object_unref (tmp);
-    } else {
-      vivi_parser_end_code_token (data, NULL);
-      return value;
-    }
-
-    vivi_parser_duplicate_code_token (data);
-    vivi_parser_end_code_token (data, VIVI_CODE_TOKEN (value));
-  }
-
-  g_assert_not_reached ();
-}
-
-static gboolean
 peek_left_hand_side_expression (ParseData *data)
 {
-  return (peek_token (data, TOKEN_NEW) || peek_member_expression (data));
+  return (peek_token (data, TOKEN_NEW) || peek_primary_expression (data) ||
+      peek_function_expression (data));
 
 }
 
@@ -1948,29 +1897,58 @@ parse_left_hand_side_expression (ParseData *data)
 
   if (peek_builtin_call (data)) {
     value = parse_builtin_call (data);
+  } else if (peek_primary_expression (data)) {
+    value = parse_primary_expression (data);
+  } else if (peek_function_expression (data)) {
+    value = parse_function_expression (data);
   } else {
-    value = parse_member_expression (data);
+    vivi_parser_error_unexpected_or (data, ERROR_TOKEN_PRIMARY_EXPRESSION,
+	ERROR_TOKEN_FUNCTION_EXPRESSION, TOKEN_NONE);
+    value = vivi_code_undefined_new ();
+    vivi_parser_duplicate_code_token (data);
+    vivi_parser_end_code_token (data, VIVI_CODE_TOKEN (value));
   }
 
-  while (try_parse_token (data, TOKEN_PARENTHESIS_LEFT)) {
-    if (!try_parse_token (data, TOKEN_PARENTHESIS_RIGHT)) {
-      parse_value_list (data, peek_assignment_expression,
-	  parse_assignment_expression, &arguments, TOKEN_COMMA);
-      parse_token (data, TOKEN_PARENTHESIS_RIGHT);
-    } else {
-      arguments = NULL;
-    }
+  while (TRUE) {
+    ViviCodeValue *tmp;
 
-    name = value;
-    value = vivi_parser_function_call_new (name);
-    g_object_unref (name);
+    if (try_parse_token (data, TOKEN_BRACKET_LEFT)) {
+      ViviCodeValue *member = parse_expression (data);
+      tmp = value;
+      value = vivi_code_get_new (tmp, member);
+      g_object_unref (tmp);
+      g_object_unref (member);
+      parse_token (data, TOKEN_BRACKET_RIGHT);
+    } else if (try_parse_token (data, TOKEN_DOT)) {
+      tmp = value;
+      value = vivi_code_get_new_name (tmp, parse_identifier_value (data));
+      g_object_unref (tmp);
+    } else if (try_parse_token (data, TOKEN_PARENTHESIS_LEFT)) {
+      if (!try_parse_token (data, TOKEN_PARENTHESIS_RIGHT)) {
+	parse_value_list (data, peek_assignment_expression,
+	    parse_assignment_expression, &arguments, TOKEN_COMMA);
+	parse_token (data, TOKEN_PARENTHESIS_RIGHT);
+      } else {
+	arguments = NULL;
+      }
 
-    if (arguments != NULL) {
-      for (i = 0; arguments[i] != NULL; i++) {
-	vivi_code_function_call_add_argument (VIVI_CODE_FUNCTION_CALL (value),
-	    arguments[i]);
+      name = value;
+      value = vivi_parser_function_call_new (name);
+      g_object_unref (name);
+
+      if (arguments != NULL) {
+	for (i = 0; arguments[i] != NULL; i++) {
+	  vivi_code_function_call_add_argument (VIVI_CODE_FUNCTION_CALL (value),
+	      arguments[i]);
+	}
+	free_value_list (arguments);
       }
-      free_value_list (arguments);
+
+      vivi_parser_duplicate_code_token (data);
+      vivi_parser_end_code_token (data, VIVI_CODE_TOKEN (value));
+    } else {
+      vivi_parser_end_code_token (data, NULL);
+      return value;
     }
 
     vivi_parser_duplicate_code_token (data);
commit f7e62ddfb1bb1532037ba81fa59182f80f17e60d
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 16 13:18:53 2008 +0300

    Add a vivi-compile test for calling the value returned from function call

diff --git a/vivified/code/test/compiler/Makefile.am b/vivified/code/test/compiler/Makefile.am
index 02bd5a6..3c6a691 100644
--- a/vivified/code/test/compiler/Makefile.am
+++ b/vivified/code/test/compiler/Makefile.am
@@ -94,6 +94,8 @@ EXTRA_DIST = \
 	function_call.as.expect \
 	function_call_arguments.as \
 	function_call_arguments.as.expect \
+	function_call_returned.as \
+	function_call_returned.as.expect \
 	function_declaration.as \
 	function_declaration.as.expect \
 	function_expression.as \
diff --git a/vivified/code/test/compiler/function_call_returned.as b/vivified/code/test/compiler/function_call_returned.as
new file mode 100644
index 0000000..8ab2c9f
--- /dev/null
+++ b/vivified/code/test/compiler/function_call_returned.as
@@ -0,0 +1 @@
+test (1) (2);
diff --git a/vivified/code/test/compiler/function_call_returned.as.expect b/vivified/code/test/compiler/function_call_returned.as.expect
new file mode 100644
index 0000000..06c6634
--- /dev/null
+++ b/vivified/code/test/compiler/function_call_returned.as.expect
@@ -0,0 +1,8 @@
+asm {
+  pool "test"
+  push 2, 1, 1, 1, pool 0
+  call_function
+  call_function
+  pop
+  end
+}
commit 50835a1532642ea063afa7f804dbc8fb1879483d
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 16 13:03:19 2008 +0300

    Add two vivi-compile tests for function calls

diff --git a/vivified/code/test/compiler/Makefile.am b/vivified/code/test/compiler/Makefile.am
index af55f30..02bd5a6 100644
--- a/vivified/code/test/compiler/Makefile.am
+++ b/vivified/code/test/compiler/Makefile.am
@@ -90,6 +90,10 @@ EXTRA_DIST = \
 	for.as.expect \
 	for_local.as \
 	for_local.as.expect \
+	function_call.as \
+	function_call.as.expect \
+	function_call_arguments.as \
+	function_call_arguments.as.expect \
 	function_declaration.as \
 	function_declaration.as.expect \
 	function_expression.as \
diff --git a/vivified/code/test/compiler/function_call.as b/vivified/code/test/compiler/function_call.as
new file mode 100644
index 0000000..edfcef2
--- /dev/null
+++ b/vivified/code/test/compiler/function_call.as
@@ -0,0 +1 @@
+test ();
diff --git a/vivified/code/test/compiler/function_call.as.expect b/vivified/code/test/compiler/function_call.as.expect
new file mode 100644
index 0000000..da18af0
--- /dev/null
+++ b/vivified/code/test/compiler/function_call.as.expect
@@ -0,0 +1,7 @@
+asm {
+  pool "test"
+  push 0, pool 0
+  call_function
+  pop
+  end
+}
diff --git a/vivified/code/test/compiler/function_call_arguments.as b/vivified/code/test/compiler/function_call_arguments.as
new file mode 100644
index 0000000..7f24134
--- /dev/null
+++ b/vivified/code/test/compiler/function_call_arguments.as
@@ -0,0 +1 @@
+test (a, 3);
diff --git a/vivified/code/test/compiler/function_call_arguments.as.expect b/vivified/code/test/compiler/function_call_arguments.as.expect
new file mode 100644
index 0000000..29dbfbb
--- /dev/null
+++ b/vivified/code/test/compiler/function_call_arguments.as.expect
@@ -0,0 +1,9 @@
+asm {
+  pool "a", "test"
+  push 3, pool 0
+  get_variable
+  push 2, pool 1
+  call_function
+  pop
+  end
+}
commit 6928186baf91665d578be4e31034e6c4ca5853ad
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Fri Jun 13 10:15:29 2008 +0300

    Change launch signal to include a list of custom headers

diff --git a/swfdec/swfdec_marshal.list b/swfdec/swfdec_marshal.list
index 5debc75..fb33a3e 100644
--- a/swfdec/swfdec_marshal.list
+++ b/swfdec/swfdec_marshal.list
@@ -2,6 +2,6 @@ BOOLEAN:DOUBLE,DOUBLE,INT
 BOOLEAN:UINT,UINT,BOOLEAN
 VOID:BOXED,POINTER,UINT
 VOID:STRING,STRING
-VOID:STRING,STRING,BOXED
+VOID:STRING,STRING,BOXED,UINT,BOXED,BOXED
 VOID:ULONG,UINT
 VOID:ULONG,ULONG
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index e5ab90e..36608af 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2280,9 +2280,11 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
    * @player: the #SwfdecPlayer affected
    * @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.
+   * @data: optional data to pass on with the request. Can be %NULL indicating
+   *        no data should be passed.
+   * @header_count: number of custom HTTP headers to be sent
+   * @header_names: names of the custom HTTP headers. %NULL terminated
+   * @header_values: values of the custom HTTP headers. %NULL terminated
    *
    * 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 
@@ -2291,8 +2293,8 @@ 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_BOXED,
-      G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, SWFDEC_TYPE_BUFFER);
+      G_SIGNAL_RUN_LAST, 0, NULL, NULL, swfdec_marshal_VOID__STRING_STRING_BOXED_UINT_BOXED_BOXED,
+      G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, SWFDEC_TYPE_BUFFER, G_TYPE_UINT, G_TYPE_STRV, G_TYPE_STRV);
   /**
    * SwfdecPlayer::missing-plugins:
    * @player: the #SwfdecPlayer missing plugins
@@ -2538,19 +2540,27 @@ swfdec_player_get_movie_at_level (SwfdecPlayer *player, int level)
 }
 
 void
-swfdec_player_launch (SwfdecPlayer *player, const char *url,
-    const char *target, SwfdecBuffer *data)
+swfdec_player_launch_with_headers (SwfdecPlayer *player, const char *url,
+    const char *target, SwfdecBuffer *data, guint header_count,
+    const char **header_names, const char **header_values)
 {
   g_return_if_fail (SWFDEC_IS_PLAYER (player));
   g_return_if_fail (url != NULL);
   g_return_if_fail (target != NULL);
+  g_return_if_fail (header_count == 0 || header_names != NULL);
+  g_return_if_fail (header_count == 0 || header_values != NULL);
+  g_return_if_fail (header_names == NULL ||
+      header_names[header_count] == NULL);
+  g_return_if_fail (header_values == NULL ||
+      header_values[header_count] == NULL);
 
   if (!g_ascii_strncasecmp (url, "FSCommand:", strlen ("FSCommand:"))) {
     const char *command = url + strlen ("FSCommand:");
     g_signal_emit (player, signals[FSCOMMAND], 0, command, target);
     return;
   }
-  g_signal_emit (player, signals[LAUNCH], 0, url, target, data);
+  g_signal_emit (player, signals[LAUNCH], 0, url, target, data, header_count,
+      header_names, header_values);
 }
 
 void
diff --git a/swfdec/swfdec_player_internal.h b/swfdec/swfdec_player_internal.h
index 8391998..ac3a939 100644
--- a/swfdec/swfdec_player_internal.h
+++ b/swfdec/swfdec_player_internal.h
@@ -255,10 +255,15 @@ SwfdecSpriteMovie *
 						(SwfdecPlayer *		player,
 						 SwfdecResource *	resource,
 						 int			level);
-void		swfdec_player_launch		(SwfdecPlayer *         player,
+#define swfdec_player_launch(player,url,target,data) \
+  swfdec_player_launch_with_headers ((player), (url), (target), (data), 0, NULL, NULL)
+void		swfdec_player_launch_with_headers (SwfdecPlayer *	player,
 						 const char *		url,
 						 const char *		target,
-						 SwfdecBuffer *		data);
+						 SwfdecBuffer *		data,
+						 guint			header_count,
+						 const char **		header_names,
+						 const char **		header_values);
 void		swfdec_player_stage_to_global	(SwfdecPlayer *		player,
 						 double *		x,
 						 double *		y);
commit bbc384ffccbccadb81623ab4c6f11b27b6acd2e0
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Jun 10 16:22:38 2008 +0300

    Change to SwfdecPlayer:launch signal's documentation that was forgotten earlier

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 7ff6124..e5ab90e 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2278,7 +2278,6 @@ 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
commit 4f812ecfd76ff3501375c92063f70579871eb6be
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Jun 10 16:13:14 2008 +0300

    Implement XML/LoadVars.send, support for sending headers is still missing

diff --git a/swfdec/swfdec_load_object_as.c b/swfdec/swfdec_load_object_as.c
index 820dab7..034ecd9 100644
--- a/swfdec/swfdec_load_object_as.c
+++ b/swfdec/swfdec_load_object_as.c
@@ -91,14 +91,6 @@ swfdec_load_object_as_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
   SWFDEC_AS_VALUE_SET_BOOLEAN (rval, TRUE);
 }
 
-SWFDEC_AS_NATIVE (301, 1, swfdec_load_object_as_send)
-void
-swfdec_load_object_as_send (SwfdecAsContext *cx, SwfdecAsObject *object,
-    guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
-{
-  SWFDEC_STUB ("LoadVars/XML.send");
-}
-
 static void
 swfdec_load_object_as_get_headers (SwfdecAsObject *object, guint *header_count,
     char ***header_names, char ***header_values)
@@ -176,6 +168,38 @@ end:
   *header_values = (char **)g_ptr_array_free (array_values, FALSE);
 }
 
+SWFDEC_AS_NATIVE (301, 1, swfdec_load_object_as_send)
+void
+swfdec_load_object_as_send (SwfdecAsContext *cx, SwfdecAsObject *object,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
+{
+  const char *url, *target, *method, *data;
+  SwfdecAsValue val;
+  SwfdecBuffer *buffer;
+
+  SWFDEC_AS_VALUE_SET_BOOLEAN (rval, FALSE);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_OBJECT, &object, "s|ss", &url, &target, &method);
+
+  SWFDEC_AS_VALUE_SET_OBJECT (&val, object);
+  data = swfdec_as_value_to_string (cx, &val);
+
+  if (method == NULL || g_ascii_strcasecmp (method, "GET") == 0) {
+    url = swfdec_as_context_give_string (cx,
+	g_strjoin (NULL, url, "?", data, NULL));
+    buffer = NULL;
+  } else {
+    // don't send the nul-byte
+    buffer = swfdec_buffer_new_for_data (g_memdup (data, strlen (data)),
+	strlen (data));
+  }
+
+  SWFDEC_FIXME ("XML/LoadVars.send: Support for sending headers missing");
+
+  swfdec_player_launch (SWFDEC_PLAYER (cx), url, target, buffer);
+
+  SWFDEC_AS_VALUE_SET_BOOLEAN (rval, TRUE);
+}
+
 SWFDEC_AS_NATIVE (301, 2, swfdec_load_object_as_sendAndLoad)
 void
 swfdec_load_object_as_sendAndLoad (SwfdecAsContext *cx, SwfdecAsObject *object,
commit 1c4c5bcbc8a3782fe625e4e4c5d07186b7bea98c
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Jun 10 16:08:05 2008 +0300

    Clean up sendAndLoad code a little

diff --git a/swfdec/swfdec_load_object_as.c b/swfdec/swfdec_load_object_as.c
index 8695a52..820dab7 100644
--- a/swfdec/swfdec_load_object_as.c
+++ b/swfdec/swfdec_load_object_as.c
@@ -181,27 +181,20 @@ void
 swfdec_load_object_as_sendAndLoad (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
 {
-  const char *url, *data, *method_string;
+  const char *url, *data, *method;
   guint header_count;
   char **header_names, **header_values;
   SwfdecAsObject *target;
   SwfdecAsValue val;
   SwfdecBuffer *buffer;
-  gboolean get;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_OBJECT, &object, "sO|s", &url, &target, &method_string);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_OBJECT, &object, "sO|s", &url, &target,
+      &method);
 
-  SWFDEC_FIXME ("support for contentType is missing");
-
-  if (method_string == NULL || g_ascii_strcasecmp (method_string, "get") == 0) {
-    get = TRUE;
-  } else {
-    get = FALSE;
-  }
   SWFDEC_AS_VALUE_SET_OBJECT (&val, object);
   data = swfdec_as_value_to_string (cx, &val);
 
-  if (get) {
+  if (method == NULL || g_ascii_strcasecmp (method, "GET") == 0) {
     url = swfdec_as_context_give_string (cx,
 	g_strjoin (NULL, url, "?", data, NULL));
     buffer = NULL;
commit d374120e83b7a1336eab01a5e4ffa4ba6e17d796
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jun 9 14:35:01 2008 +0300

    Make header_names and header_values NULL terminated

diff --git a/swfdec/swfdec_load_object.c b/swfdec/swfdec_load_object.c
index afc7781..1ec98f2 100644
--- a/swfdec/swfdec_load_object.c
+++ b/swfdec/swfdec_load_object.c
@@ -126,7 +126,6 @@ static void
 swfdec_load_object_dispose (GObject *object)
 {
   SwfdecLoadObject *load = SWFDEC_LOAD_OBJECT (object);
-  guint i;
 
   if (load->loader) {
     swfdec_stream_set_target (SWFDEC_STREAM (load->loader), NULL);
@@ -137,13 +136,8 @@ swfdec_load_object_dispose (GObject *object)
     swfdec_buffer_unref (load->buffer);
     load->buffer = NULL;
   }
-
-  for (i = 0; i < load->header_count; i++) {
-    g_free (load->header_names[i]);
-    g_free (load->header_values[i]);
-  }
-  g_free (load->header_names);
-  g_free (load->header_values);
+  g_strfreev (load->header_names);
+  g_strfreev (load->header_values);
 
   G_OBJECT_CLASS (swfdec_load_object_parent_class)->dispose (object);
 }
diff --git a/swfdec/swfdec_load_object_as.c b/swfdec/swfdec_load_object_as.c
index 0571990..8695a52 100644
--- a/swfdec/swfdec_load_object_as.c
+++ b/swfdec/swfdec_load_object_as.c
@@ -170,6 +170,8 @@ swfdec_load_object_as_get_headers (SwfdecAsObject *object, guint *header_count,
 end:
   g_assert (array_names->len == array_values->len);
   *header_count = array_names->len;
+  g_ptr_array_add (array_names, NULL);
+  g_ptr_array_add (array_values, NULL);
   *header_names = (char **)g_ptr_array_free (array_names, FALSE);
   *header_values = (char **)g_ptr_array_free (array_values, FALSE);
 }
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 790ad6c..7ff6124 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2719,6 +2719,10 @@ swfdec_player_load_with_headers (SwfdecPlayer *player, const char *url,
   g_return_val_if_fail (url != NULL, NULL);
   g_return_val_if_fail (header_count == 0 || header_names != NULL, NULL);
   g_return_val_if_fail (header_count == 0 || header_values != NULL, NULL);
+  g_return_val_if_fail (header_names == NULL ||
+      header_names[header_count] == NULL, NULL);
+  g_return_val_if_fail (header_values == NULL ||
+      header_values[header_count] == NULL, NULL);
 
   loader = g_object_new (player->priv->loader_type, NULL);
   klass = SWFDEC_LOADER_GET_CLASS (loader);


More information about the Swfdec-commits mailing list