[Swfdec] 5 commits - doc/Makefile.am doc/swfdec-sections.txt libswfdec/swfdec_as_array.c libswfdec/swfdec_as_boolean.c libswfdec/swfdec_asbroadcaster.c libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_native_function.h libswfdec/swfdec_as_number.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_string.c libswfdec/swfdec_filter_as.c libswfdec/swfdec_key_as.c libswfdec/swfdec_load_object_as.c libswfdec/swfdec_loadvars_as.c libswfdec/swfdec_mouse_as.c libswfdec/swfdec_player_as.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_stage_as.c libswfdec/swfdec_system_as.c
Benjamin Otte
company at kemper.freedesktop.org
Tue Sep 4 01:43:43 PDT 2007
doc/Makefile.am | 1
doc/swfdec-sections.txt | 3
libswfdec/swfdec_as_array.c | 1
libswfdec/swfdec_as_boolean.c | 2
libswfdec/swfdec_as_internal.h | 4
libswfdec/swfdec_as_native_function.c | 156 ++++++++++++++++++++++++++++++++++
libswfdec/swfdec_as_native_function.h | 21 ++++
libswfdec/swfdec_as_number.c | 2
libswfdec/swfdec_as_object.h | 3
libswfdec/swfdec_as_string.c | 2
libswfdec/swfdec_asbroadcaster.c | 2
libswfdec/swfdec_filter_as.c | 2
libswfdec/swfdec_key_as.c | 1
libswfdec/swfdec_load_object_as.c | 2
libswfdec/swfdec_loadvars_as.c | 5 -
libswfdec/swfdec_mouse_as.c | 1
libswfdec/swfdec_player_as.c | 17 +--
libswfdec/swfdec_player_internal.h | 4
libswfdec/swfdec_stage_as.c | 1
libswfdec/swfdec_system_as.c | 1
20 files changed, 204 insertions(+), 27 deletions(-)
New commits:
diff-tree 300edae0abd60d832b45a12b4904d0bfc0d4f7e0 (from 57eed866d22b1f7fcd6812b6a8b1dee829bd4ff9)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Sep 4 10:43:35 2007 +0200
move SWFDEC_AS_NATIVE and SWFDEC_AS_CNSTRUCTOR macros to swfdec_as_internal.h
diff --git a/libswfdec/swfdec_as_array.c b/libswfdec/swfdec_as_array.c
index 30cf22a..959d906 100644
--- a/libswfdec/swfdec_as_array.c
+++ b/libswfdec/swfdec_as_array.c
@@ -33,7 +33,6 @@
#include "swfdec_as_native_function.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
-#include "swfdec_player_internal.h"
G_DEFINE_TYPE (SwfdecAsArray, swfdec_as_array, SWFDEC_TYPE_AS_OBJECT)
diff --git a/libswfdec/swfdec_as_boolean.c b/libswfdec/swfdec_as_boolean.c
index 6764cbe..4645254 100644
--- a/libswfdec/swfdec_as_boolean.c
+++ b/libswfdec/swfdec_as_boolean.c
@@ -25,10 +25,10 @@
#include "swfdec_as_boolean.h"
#include "swfdec_as_context.h"
+#include "swfdec_as_internal.h"
#include "swfdec_as_native_function.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
-#include "swfdec_player_internal.h"
G_DEFINE_TYPE (SwfdecAsBoolean, swfdec_as_boolean, SWFDEC_TYPE_AS_OBJECT)
diff --git a/libswfdec/swfdec_as_internal.h b/libswfdec/swfdec_as_internal.h
index e64bc44..558696c 100644
--- a/libswfdec/swfdec_as_internal.h
+++ b/libswfdec/swfdec_as_internal.h
@@ -28,6 +28,10 @@ G_BEGIN_DECLS
/* This header contains all the non-exported symbols that can't go into
* exported headers
*/
+#define SWFDEC_AS_NATIVE(x, y, func) SWFDEC_AS_CONSTRUCTOR (x, y, func, NULL)
+#define SWFDEC_AS_CONSTRUCTOR(x, y, func, type) void func (SwfdecAsContext *cx, \
+ SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret);
+
/* swfdec_as_array.c */
void swfdec_as_array_init_context (SwfdecAsContext * context,
diff --git a/libswfdec/swfdec_as_number.c b/libswfdec/swfdec_as_number.c
index f047165..4387301 100644
--- a/libswfdec/swfdec_as_number.c
+++ b/libswfdec/swfdec_as_number.c
@@ -26,10 +26,10 @@
#include "swfdec_as_number.h"
#include "swfdec_as_context.h"
#include "swfdec_as_frame.h"
+#include "swfdec_as_internal.h"
#include "swfdec_as_native_function.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
-#include "swfdec_player_internal.h"
G_DEFINE_TYPE (SwfdecAsNumber, swfdec_as_number, SWFDEC_TYPE_AS_OBJECT)
diff --git a/libswfdec/swfdec_as_string.c b/libswfdec/swfdec_as_string.c
index cce29bf..a59ffe6 100644
--- a/libswfdec/swfdec_as_string.c
+++ b/libswfdec/swfdec_as_string.c
@@ -27,10 +27,10 @@
#include "swfdec_as_string.h"
#include "swfdec_as_array.h"
#include "swfdec_as_context.h"
+#include "swfdec_as_internal.h"
#include "swfdec_as_native_function.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
-#include "swfdec_player_internal.h"
G_DEFINE_TYPE (SwfdecAsString, swfdec_as_string, SWFDEC_TYPE_AS_OBJECT)
diff --git a/libswfdec/swfdec_asbroadcaster.c b/libswfdec/swfdec_asbroadcaster.c
index 396ac81..05897e8 100644
--- a/libswfdec/swfdec_asbroadcaster.c
+++ b/libswfdec/swfdec_asbroadcaster.c
@@ -21,10 +21,10 @@
#include "config.h"
#endif
+#include "swfdec_as_internal.h"
#include "swfdec_as_object.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
-#include "swfdec_player_internal.h"
/*** AS CODE ***/
diff --git a/libswfdec/swfdec_filter_as.c b/libswfdec/swfdec_filter_as.c
index 53a0674..0f00211 100644
--- a/libswfdec/swfdec_filter_as.c
+++ b/libswfdec/swfdec_filter_as.c
@@ -22,8 +22,8 @@
#endif
#include "swfdec_filter.h"
+#include "swfdec_as_internal.h"
#include "swfdec_debug.h"
-#include "swfdec_player_internal.h"
SWFDEC_AS_NATIVE (1112, 1, swfdec_filter_clone)
void
diff --git a/libswfdec/swfdec_key_as.c b/libswfdec/swfdec_key_as.c
index a5523f7..002ad1f 100644
--- a/libswfdec/swfdec_key_as.c
+++ b/libswfdec/swfdec_key_as.c
@@ -21,6 +21,7 @@
#include "config.h"
#endif
+#include "swfdec_as_internal.h"
#include "swfdec_as_object.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
diff --git a/libswfdec/swfdec_load_object_as.c b/libswfdec/swfdec_load_object_as.c
index 9df8c9f..57d91e8 100644
--- a/libswfdec/swfdec_load_object_as.c
+++ b/libswfdec/swfdec_load_object_as.c
@@ -23,7 +23,7 @@
#include <string.h>
#include "swfdec_load_object.h"
-#include "swfdec_as_strings.h"
+#include "swfdec_as_internal.h"
#include "swfdec_debug.h"
#include "swfdec_loader_internal.h"
#include "swfdec_loadertarget.h"
diff --git a/libswfdec/swfdec_loadvars_as.c b/libswfdec/swfdec_loadvars_as.c
index 2e1553a..66e7751 100644
--- a/libswfdec/swfdec_loadvars_as.c
+++ b/libswfdec/swfdec_loadvars_as.c
@@ -25,11 +25,12 @@
#include <string.h>
#include "swfdec_debug.h"
-#include "swfdec_as_types.h"
+#include "swfdec_as_context.h"
+#include "swfdec_as_internal.h"
#include "swfdec_as_object.h"
#include "swfdec_as_string.h"
#include "swfdec_as_strings.h"
-#include "swfdec_player_internal.h"
+#include "swfdec_as_types.h"
/*** AS CODE ***/
diff --git a/libswfdec/swfdec_mouse_as.c b/libswfdec/swfdec_mouse_as.c
index 1459f0e..914e009 100644
--- a/libswfdec/swfdec_mouse_as.c
+++ b/libswfdec/swfdec_mouse_as.c
@@ -21,6 +21,7 @@
#include "config.h"
#endif
+#include "swfdec_as_internal.h"
#include "swfdec_as_object.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index d28a2f6..281b90f 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -28,10 +28,6 @@
G_BEGIN_DECLS
-#define SWFDEC_AS_NATIVE(x, y, func) SWFDEC_AS_CONSTRUCTOR (x, y, func, NULL)
-#define SWFDEC_AS_CONSTRUCTOR(x, y, func, type) void func (SwfdecAsContext *cx, \
- SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret);
-
typedef enum {
SWFDEC_ALIGN_FLAG_TOP = (1 << 0),
SWFDEC_ALIGN_FLAG_BOTTOM = (1 << 1),
diff --git a/libswfdec/swfdec_stage_as.c b/libswfdec/swfdec_stage_as.c
index 2f27cbb..15975b7 100644
--- a/libswfdec/swfdec_stage_as.c
+++ b/libswfdec/swfdec_stage_as.c
@@ -22,6 +22,7 @@
#endif
#include <string.h>
+#include "swfdec_as_internal.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
#include "swfdec_player_internal.h"
diff --git a/libswfdec/swfdec_system_as.c b/libswfdec/swfdec_system_as.c
index 1849a32..79cc427 100644
--- a/libswfdec/swfdec_system_as.c
+++ b/libswfdec/swfdec_system_as.c
@@ -22,6 +22,7 @@
#endif
#include "swfdec.h"
+#include "swfdec_as_internal.h"
#include "swfdec_as_string.h"
#include "swfdec_as_strings.h"
#include "swfdec_codec_audio.h"
diff-tree 57eed866d22b1f7fcd6812b6a8b1dee829bd4ff9 (from parents)
Merge: 4fd150cacc14d6332233e8b2a0ce90fdbf39a0d2 13df1826b6865f15a09f190b759613ba7693a35c
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Sep 4 10:37:49 2007 +0200
Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec/swfdec
diff-tree 4fd150cacc14d6332233e8b2a0ce90fdbf39a0d2 (from 7ec278506b08c9941e244eb4a31bae29ada08673)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Sep 4 10:33:49 2007 +0200
add SWFDEC_AS_CHECK macro for doing checks/conversions for native functions
see the inline API docs for what it does
diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt
index 6ad2114..d8ef4fa 100644
--- a/doc/swfdec-sections.txt
+++ b/doc/swfdec-sections.txt
@@ -353,6 +353,9 @@ swfdec_as_function_call
swfdec_as_native_function_new
swfdec_as_native_function_set_construct_type
swfdec_as_native_function_set_object_type
+swfdec_as_native_function_check
+swfdec_as_native_function_checkv
+SWFDEC_AS_CHECK
<SUBSECTION Standard>
swfdec_as_function_get_type
SwfdecAsFunctionClass
diff --git a/libswfdec/swfdec_as_native_function.c b/libswfdec/swfdec_as_native_function.c
index 4088604..c05faba 100644
--- a/libswfdec/swfdec_as_native_function.c
+++ b/libswfdec/swfdec_as_native_function.c
@@ -196,3 +196,159 @@ swfdec_as_native_function_set_construct_
function->construct_size = query.instance_size;
}
+/**
+ * SWFDEC_AS_CHECK:
+ * @type: required type of this object or 0 for ignoring
+ * @result: converted this object
+ * @...: conversion string and pointers taking converted values
+ *
+ * This is a shortcut macro for calling swfdec_as_native_function_check() at
+ * the beginning of a native function. See that function for details.
+ * It requires the native function parameters to have the default name. So your
+ * function must be declared like this:
+ * |[static void
+ * my_function (SwfdecAsContext *cx, SwfdecAsObject *object,
+ * guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval);]|
+ */
+/**
+ * swfdec_as_native_function_check:
+ * @cx: a #SwfdecAsContext
+ * @object: this object passed to the native function
+ * @type: expected type of @object or 0 for any
+ * @result: pointer to variable taking cast result of @object
+ * @argc: count of arguments passed to the function
+ * @argv: arguments passed to the function
+ * @args: argument conversion string
+ * @...: pointers to variables taking converted arguments
+ *
+ * This function is a convenience function to validate and convert arguments to
+ * a native function while avoiding common pitfalls. You typically want to call
+ * it at the beginning of every native function you write. Or you can use the
+ * SWFDEC_AS_CHECK() macro instead which calls this function.
+ * The @cx, @object, @argc and @argv paramters should be passed verbatim from
+ * the function call to your native function. If @type is not 0, @object is then
+ * checked to be of that type and cast to @result. After that the @args string
+ * is used to convert the arguments. Every character in @args describes the
+ * conversion of one argument. For that argument, you have to pass a pointer
+ * that takes the value. For the conversion, the default conversion functions
+ * like swfdec_as_value_to_string() are used. If not enough arguments are
+ * available, the function stops converting and returns %NULL. The following
+ * conversion characters are allowed:<itemizedlist>
+ * <listitem><para>"b": convert to boolean. Requires a %gboolean pointer
+ * </para></listitem>
+ * <listitem><para>"i": convert to integer. Requires an %integer pointer
+ * </para></listitem>
+ * <listitem><para>"n": convert to number. Requires a %double pointer
+ * </para></listitem>
+ * <listitem><para>"o": convert to object. Requires a #SwfdecAsObject pointer.
+ * If the conversion fails, this function immediately return %
+ * FALSE.</para></listitem>
+ * <listitem><para>"O": convert to object or %NULL. Requires a #SwfdecAsObject
+ * pointer.</para></listitem>
+ * <listitem><para>"s": convert to garbage-collected string. Requires a const
+ * %char pointer</para></listitem>
+ * <listitem><para>"v": copy the value. The given argument must be a pointer
+ * to a #SwfdecAsValue</para></listitem>
+ * </itemizedlist>
+ *
+ * Returns: %TRUE if the conversion succeeded, %FALSE otherwise
+ **/
+gboolean
+swfdec_as_native_function_check (SwfdecAsContext *cx, SwfdecAsObject *object,
+ GType type, gpointer *result, guint argc, SwfdecAsValue *argv,
+ const char *args, ...)
+{
+ gboolean ret;
+ va_list varargs;
+
+ g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (cx), FALSE);
+ g_return_val_if_fail (type == 0 || result != NULL, FALSE);
+
+ va_start (varargs, args);
+ ret = swfdec_as_native_function_checkv (cx, object, type, result, argc, argv, args, varargs);
+ va_end (varargs);
+ return ret;
+}
+
+/**
+ * swfdec_as_native_function_checkv:
+ * @cx: a #SwfdecAsContext
+ * @object: this object passed to the native function
+ * @type: expected type of @object
+ * @result: pointer to variable taking cast result of @object
+ * @argc: count of arguments passed to the function
+ * @argv: arguments passed to the function
+ * @args: argument conversion string
+ * @varargs: pointers to variables taking converted arguments
+ *
+ * This is the valist version of swfdec_as_native_function_check(). See that
+ * function for details.
+ *
+ * Returns: %TRUE if the conversion succeeded, %FALSE otherwise
+ **/
+gboolean
+swfdec_as_native_function_checkv (SwfdecAsContext *cx, SwfdecAsObject *object,
+ GType type, gpointer *result, guint argc, SwfdecAsValue *argv,
+ const char *args, va_list varargs)
+{
+ guint i;
+
+ g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (cx), FALSE);
+ g_return_val_if_fail (type == 0 || result != NULL, FALSE);
+
+ /* check that we got a valid type */
+ if (type) {
+ if (!G_TYPE_CHECK_INSTANCE_TYPE (object, type))
+ return FALSE;
+ *result = object;
+ }
+ for (i = 0; i < argc && *args; i++, args++) {
+ switch (*args) {
+ case 'v':
+ {
+ SwfdecAsValue *val = va_arg (varargs, SwfdecAsValue *);
+ *val = argv[i];
+ }
+ break;
+ case 'b':
+ {
+ gboolean *b = va_arg (varargs, gboolean *);
+ *b = swfdec_as_value_to_boolean (cx, &argv[i]);
+ }
+ break;
+ case 'i':
+ {
+ int *j = va_arg (varargs, int *);
+ *j = swfdec_as_value_to_integer (cx, &argv[i]);
+ }
+ break;
+ case 'n':
+ {
+ double *d = va_arg (varargs, double *);
+ *d = swfdec_as_value_to_number (cx, &argv[i]);
+ }
+ break;
+ case 's':
+ {
+ const char **s = va_arg (varargs, const char **);
+ *s = swfdec_as_value_to_string (cx, &argv[i]);
+ }
+ break;
+ case 'o':
+ case 'O':
+ {
+ SwfdecAsObject **o = va_arg (varargs, SwfdecAsObject **);
+ *o = swfdec_as_value_to_object (cx, &argv[i]);
+ if (*o == NULL && *args != 'O')
+ return FALSE;
+ }
+ break;
+ default:
+ g_warning ("'%c' is not a valid type conversion", *args);
+ return FALSE;
+ }
+ }
+ if (*args)
+ return FALSE;
+ return TRUE;
+}
diff --git a/libswfdec/swfdec_as_native_function.h b/libswfdec/swfdec_as_native_function.h
index 4a1ab28..5d7923c 100644
--- a/libswfdec/swfdec_as_native_function.h
+++ b/libswfdec/swfdec_as_native_function.h
@@ -69,6 +69,27 @@ void swfdec_as_native_function_set_cons
(SwfdecAsNativeFunction *function,
GType type);
+gboolean swfdec_as_native_function_check (SwfdecAsContext * cx,
+ SwfdecAsObject * object,
+ GType type,
+ gpointer * result,
+ guint argc,
+ SwfdecAsValue * argv,
+ const char * args,
+ ...);
+gboolean swfdec_as_native_function_checkv(SwfdecAsContext * cx,
+ SwfdecAsObject * object,
+ GType type,
+ gpointer * result,
+ guint argc,
+ SwfdecAsValue * argv,
+ const char * args,
+ va_list varargs);
+#define SWFDEC_AS_CHECK(type,result,...) G_STMT_START {\
+ if (!swfdec_as_native_function_check (cx, object, type, result, argc, argv, __VA_ARGS__)) \
+ return; \
+}G_STMT_END
+
G_END_DECLS
#endif
diff --git a/libswfdec/swfdec_player_as.c b/libswfdec/swfdec_player_as.c
index 2fd543a..08ccc26 100644
--- a/libswfdec/swfdec_player_as.c
+++ b/libswfdec/swfdec_player_as.c
@@ -26,6 +26,7 @@
#include "swfdec_player_internal.h"
#include "swfdec_as_function.h"
+#include "swfdec_as_internal.h"
#include "swfdec_as_native_function.h"
#include "swfdec_as_object.h"
#include "swfdec_as_strings.h"
@@ -118,7 +119,7 @@ swfdec_get_asnative (SwfdecAsContext *cx
// same as ASnative, but also sets prototype
static void
-swfdec_player_ASconstructor (SwfdecAsContext *cx, SwfdecAsObject *obj,
+swfdec_player_ASconstructor (SwfdecAsContext *cx, SwfdecAsObject *object,
guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
{
SwfdecAsValue val;
@@ -126,8 +127,7 @@ swfdec_player_ASconstructor (SwfdecAsCon
SwfdecAsFunction *func;
guint x, y;
- x = swfdec_as_value_to_integer (cx, &argv[0]);
- y = swfdec_as_value_to_integer (cx, &argv[1]);
+ SWFDEC_AS_CHECK (0, NULL, "ii", &x, &y);
func = swfdec_get_asnative (cx, x, y);
if (func) {
@@ -149,14 +149,13 @@ swfdec_player_ASconstructor (SwfdecAsCon
}
static void
-swfdec_player_ASnative (SwfdecAsContext *cx, SwfdecAsObject *obj,
+swfdec_player_ASnative (SwfdecAsContext *cx, SwfdecAsObject *object,
guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
{
SwfdecAsFunction *func;
guint x, y;
- x = swfdec_as_value_to_integer (cx, &argv[0]);
- y = swfdec_as_value_to_integer (cx, &argv[1]);
+ SWFDEC_AS_CHECK (0, NULL, "ii", &x, &y);
func = swfdec_get_asnative (cx, x, y);
if (func) {
@@ -178,12 +177,8 @@ ASSetNative (SwfdecAsContext *cx, Swfdec
char **names;
guint i, x, y;
- if (argc < 3)
- return;
+ SWFDEC_AS_CHECK (0, NULL, "ois", &target, &x, &s);
- target = swfdec_as_value_to_object (cx, &argv[0]);
- x = swfdec_as_value_to_integer (cx, &argv[1]);
- s = swfdec_as_value_to_string (cx, &argv[2]);
if (argc > 3)
y = swfdec_as_value_to_integer (cx, &argv[3]);
else
diff-tree 7ec278506b08c9941e244eb4a31bae29ada08673 (from 7966b86c80ce185cf6c03b9abeb11c32b35d60df)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Sep 4 10:31:54 2007 +0200
ignore swfdec_filter.h
diff --git a/doc/Makefile.am b/doc/Makefile.am
index de001b0..21ffd71 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -90,6 +90,7 @@ IGNORE_HFILES= \
swfdec_edittext_movie.h \
swfdec_enums.h \
swfdec_event.h \
+ swfdec_filter.h \
swfdec_flv_decoder.h \
swfdec_font.h \
swfdec_graphic.h \
diff-tree 7966b86c80ce185cf6c03b9abeb11c32b35d60df (from b8da9da8a7a5ebd58cb38cf4c981d809ad6fd5ab)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Sep 4 10:31:24 2007 +0200
This function is gone already
diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h
index 2de6d04..a61bc4b 100644
--- a/libswfdec/swfdec_as_object.h
+++ b/libswfdec/swfdec_as_object.h
@@ -177,9 +177,6 @@ void swfdec_as_object_call (SwfdecAsOb
void swfdec_as_object_run (SwfdecAsObject * object,
SwfdecScript * script);
-const char* swfdec_as_object_to_string (SwfdecAsContext * context,
- SwfdecAsObject * object);
-
G_END_DECLS
#endif
More information about the Swfdec
mailing list