Benjamin Otte
2007-Oct-18 20:19 UTC
[Swfdec] 18 commits - doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_event.c libswfdec/swfdec_event.h libswfdec/swfdec_flash_security.c libswfdec/swfdec_flash_security.h libswfdec/swfdec_graphic_movie.c libswfdec/swfdec_load_object.c libswfdec/swfdec_morph_movie.c libswfdec/swfdec_morph_movie.h libswfdec/swfdec_movie_asprops.c libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h libswfdec/swfdec_sound_object.c libswfdec/swfdec_sprite_movie_as.c libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_swf_decoder.c libswfdec/swfdec_swf_instance.c libswfdec/swfdec_swf_instance.h libswfdec/swfdec_tag.c libswfdec/swfdec_tag.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_types.h libswfdec/swfdec_url.c libswfdec/swfdec_url.h libswfdec/swfdec_video.c libswfdec/swfdec_video_movie.c libswfdec/swfdec_video_movie.h test/dump.c test/swfdec-extract.c
doc/swfdec-sections.txt | 1 libswfdec/Makefile.am | 4 libswfdec/swfdec_as_interpret.c | 24 +- libswfdec/swfdec_as_strings.c | 1 libswfdec/swfdec_button_movie.c | 3 libswfdec/swfdec_event.c | 5 libswfdec/swfdec_event.h | 2 libswfdec/swfdec_flash_security.c | 95 ++++++---- libswfdec/swfdec_flash_security.h | 16 + libswfdec/swfdec_graphic_movie.c | 2 libswfdec/swfdec_load_object.c | 15 + libswfdec/swfdec_morph_movie.c | 37 ++- libswfdec/swfdec_morph_movie.h | 3 libswfdec/swfdec_movie.c | 58 +++++- libswfdec/swfdec_movie.h | 5 libswfdec/swfdec_movie_asprops.c | 4 libswfdec/swfdec_net_stream.c | 17 + libswfdec/swfdec_player.c | 90 +++------ libswfdec/swfdec_player_internal.h | 10 - libswfdec/swfdec_resource.c | 310 +++++++++++++++++++++++++++++++++ libswfdec/swfdec_resource.h | 73 +++++++ libswfdec/swfdec_sound_object.c | 4 libswfdec/swfdec_sprite_movie.c | 41 ++-- libswfdec/swfdec_sprite_movie_as.c | 20 +- libswfdec/swfdec_swf_decoder.c | 14 + libswfdec/swfdec_swf_instance.c | 308 -------------------------------- libswfdec/swfdec_swf_instance.h | 72 ------- libswfdec/swfdec_tag.c | 34 +-- libswfdec/swfdec_tag.h | 6 libswfdec/swfdec_text_field_movie_as.c | 2 libswfdec/swfdec_types.h | 2 libswfdec/swfdec_url.c | 16 + libswfdec/swfdec_url.h | 2 libswfdec/swfdec_video.c | 64 +++++- libswfdec/swfdec_video_movie.c | 72 ++++--- libswfdec/swfdec_video_movie.h | 15 - test/dump.c | 10 - test/swfdec-extract.c | 6 38 files changed, 823 insertions(+), 640 deletions(-) New commits: commit 18c69ec89d20eb74a205d76f202123c4e9bec71f Merge: 3a60b20... 60c0c37... Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 22:19:33 2007 +0200 Merge branch 'master' of ssh://company at git.freedesktop.org/git/swfdec/swfdec Conflicts: libswfdec/swfdec_as_strings.c diff --cc libswfdec/swfdec_as_strings.c index f5eed8a,2c6c0e9..313383a --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@@ -411,6 -411,14 +411,15 @@@ const char swfdec_as_strings[] SWFDEC_AS_CONSTANT_STRING ("variable") SWFDEC_AS_CONSTANT_STRING ("restrict") SWFDEC_AS_CONSTANT_STRING ("mouseWheelEnabled") + SWFDEC_AS_CONSTANT_STRING ("_level0") + SWFDEC_AS_CONSTANT_STRING ("hscroll") + SWFDEC_AS_CONSTANT_STRING ("maxhscroll") + SWFDEC_AS_CONSTANT_STRING ("maxscroll") + SWFDEC_AS_CONSTANT_STRING ("bottomScroll") + SWFDEC_AS_CONSTANT_STRING ("Sans") + SWFDEC_AS_CONSTANT_STRING ("Serif") + SWFDEC_AS_CONSTANT_STRING ("Monospace") + SWFDEC_AS_CONSTANT_STRING ("textHeight") + SWFDEC_AS_CONSTANT_STRING ("textWidth") /* add more here */ ; commit 3a60b202da5fd9e5bce61f04b73c229f77c6707f Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 21:47:12 2007 +0200 fix SwfdecVideoMovie to work with ratio fixes: - ratio describes the current frame - only decode video when displaying it - fix size computation for VdeoFrame'd videos problems: - must decode whole movie when going one frame backwards diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 135bae8..c401125 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -115,7 +115,7 @@ swfdec_net_stream_video_goto (SwfdecNetStream *stream, guint timestamp) if (stream->surface) { GList *walk; for (walk = stream->movies; walk; walk = walk->next) { - swfdec_video_movie_new_image (walk->data, stream->surface); + swfdec_video_movie_new_image (walk->data); } } } @@ -350,6 +350,14 @@ swfdec_net_stream_input_disconnect (SwfdecVideoMovieInput *input, SwfdecVideoMov g_object_unref (stream); } +static cairo_surface_t * +swfdec_net_stream_input_get_image (SwfdecVideoMovieInput *input) +{ + SwfdecNetStream *stream = SWFDEC_NET_STREAM ((guchar *) input - G_STRUCT_OFFSET (SwfdecNetStream, input)); + + return stream->surface; +} + /*** SWFDEC_NET_STREAM ***/ G_DEFINE_TYPE_WITH_CODE (SwfdecNetStream, swfdec_net_stream, SWFDEC_TYPE_AS_OBJECT, @@ -451,6 +459,7 @@ swfdec_net_stream_init (SwfdecNetStream *stream) { stream->input.connect = swfdec_net_stream_input_connect; stream->input.disconnect = swfdec_net_stream_input_disconnect; + stream->input.get_image = swfdec_net_stream_input_get_image; stream->buffer_time = 100; /* msecs */ } diff --git a/libswfdec/swfdec_video.c b/libswfdec/swfdec_video.c index 768babd..520960c 100644 --- a/libswfdec/swfdec_video.c +++ b/libswfdec/swfdec_video.c @@ -63,27 +63,52 @@ typedef struct { SwfdecVideo * video; gpointer decoder; guint current_frame; + cairo_surface_t * surface; } SwfdecVideoInput; static void -swfdec_video_input_iterate (SwfdecVideoMovieInput *input_) +swfdec_video_input_set_ratio (SwfdecVideoMovieInput *input_, SwfdecVideoMovie *movie) { SwfdecVideoInput *input = (SwfdecVideoInput *) input_; + guint ratio = SWFDEC_MOVIE (movie)->original_ratio; SwfdecBuffer *buffer; - cairo_surface_t *surface; - input->current_frame = (input->current_frame + 1) % input->video->n_frames; if (input->decoder == NULL) return; - buffer = swfdec_video_find_frame (input->video, input->current_frame); - if (buffer == NULL) - return; + ratio++; + if (ratio > input->video->n_frames) { + SWFDEC_ERROR ("ratio %u too big: only %u frames", ratio, input->video->n_frames); + ratio = input->video->n_frames - 1; + } + if (ratio < input->current_frame) { + /* FIXME: need to reset decoder here? */ + input->current_frame = 0; + } - surface = swfdec_video_decoder_decode (input->decoder, buffer); - if (surface == NULL) - return; - swfdec_video_movie_new_image (input->movie, surface); - cairo_surface_destroy (surface); + while (input->current_frame < ratio) { + buffer = swfdec_video_find_frame (input->video, input->current_frame); + if (buffer == NULL) { + SWFDEC_INFO ("no buffer for frame %u", input->current_frame); + } else { + if (input->surface) + cairo_surface_destroy (input->surface); + input->surface = swfdec_video_decoder_decode (input->decoder, buffer); + if (input->surface == NULL) + return; + if (input->video->width < (guint) cairo_image_surface_get_width (input->surface) || + input->video->height < (guint) cairo_image_surface_get_height (input->surface)) { + static cairo_user_data_key_t key; + cairo_surface_t *old = input->surface; + input->surface = cairo_image_surface_create_for_data ( + cairo_image_surface_get_data (old), cairo_image_surface_get_format (old), + input->video->width, input->video->height, + cairo_image_surface_get_stride (old)); + cairo_surface_set_user_data (input->surface, &key, old, + (cairo_destroy_func_t) cairo_surface_destroy); + } + } + input->current_frame++; + } } static void @@ -104,7 +129,15 @@ swfdec_video_input_disconnect (SwfdecVideoMovieInput *input_, SwfdecVideoMovie * if (input->decoder) swfdec_video_decoder_free (input->decoder); g_object_unref (input->video); - g_free (input); + g_slice_free (SwfdecVideoInput, input); +} + +static cairo_surface_t * +swfdec_video_input_get_image (SwfdecVideoMovieInput *input_) +{ + SwfdecVideoInput *input = (SwfdecVideoInput *) input_; + + return input->surface; } static SwfdecVideoMovieInput * @@ -114,15 +147,16 @@ swfdec_video_input_new (SwfdecVideo *video) if (video->n_frames == 0) return NULL; - input = g_new0 (SwfdecVideoInput, 1); + input = g_slice_new0 (SwfdecVideoInput); input->decoder = swfdec_video_decoder_new (video->format); if (input->decoder == NULL) { - g_free (input); + g_slice_free (SwfdecVideoInput, input); return NULL; } input->input.connect = swfdec_video_input_connect; - input->input.iterate = swfdec_video_input_iterate; input->input.disconnect = swfdec_video_input_disconnect; + input->input.set_ratio = swfdec_video_input_set_ratio; + input->input.get_image = swfdec_video_input_get_image; g_object_ref (video); input->video = video; input->current_frame = (guint) -1; diff --git a/libswfdec/swfdec_video_movie.c b/libswfdec/swfdec_video_movie.c index d17c0cb..f95c2db 100644 --- a/libswfdec/swfdec_video_movie.c +++ b/libswfdec/swfdec_video_movie.c @@ -39,17 +39,39 @@ swfdec_video_movie_update_extents (SwfdecMovie *movie, } static void +swfdec_video_movie_update_image (SwfdecVideoMovie *movie) +{ + if (!movie->needs_update) + return; + + if (movie->input != NULL) { + if (movie->input->set_ratio) + movie->input->set_ratio (movie->input, movie); + + if (movie->image) + cairo_surface_destroy (movie->image); + movie->image = movie->input->get_image (movie->input); + if (movie->image) + cairo_surface_reference (movie->image); + } + movie->needs_update = FALSE; +} + +static void swfdec_video_movie_render (SwfdecMovie *mov, cairo_t *cr, const SwfdecColorTransform *trans, const SwfdecRect *inval) { SwfdecVideoMovie *movie = SWFDEC_VIDEO_MOVIE (mov); + swfdec_video_movie_update_image (movie); if (movie->image == NULL) return; cairo_scale (cr, - (mov->original_extents.x1 - mov->original_extents.x0) / movie->image_width, - (mov->original_extents.y1 - mov->original_extents.y0) / movie->image_height); + (mov->original_extents.x1 - mov->original_extents.x0) + / cairo_image_surface_get_width (movie->image), + (mov->original_extents.y1 - mov->original_extents.y0) + / cairo_image_surface_get_height (movie->image)); cairo_set_source_surface (cr, movie->image, 0.0, 0.0); cairo_paint (cr); } @@ -60,6 +82,7 @@ swfdec_video_movie_unset_input (SwfdecVideoMovie *movie) if (movie->input == NULL) return; + swfdec_video_movie_update_image (movie); if (movie->input->disconnect) movie->input->disconnect (movie->input, movie); movie->input = NULL; @@ -71,28 +94,24 @@ swfdec_video_movie_dispose (GObject *object) SwfdecVideoMovie *movie = SWFDEC_VIDEO_MOVIE (object); swfdec_video_movie_unset_input (movie); + g_object_unref (movie->video); if (movie->image) { cairo_surface_destroy (movie->image); movie->image = NULL; } - g_object_unref (movie->video); G_OBJECT_CLASS (swfdec_video_movie_parent_class)->dispose (object); } -static gboolean -swfdec_video_movie_iterate_end (SwfdecMovie *mov) +static void +swfdec_video_movie_set_ratio (SwfdecMovie *movie) { - SwfdecVideoMovie *movie = SWFDEC_VIDEO_MOVIE (mov); - - if (!SWFDEC_MOVIE_CLASS (swfdec_video_movie_parent_class)->iterate_end (mov)) - return FALSE; + SwfdecVideoMovie *video = SWFDEC_VIDEO_MOVIE (movie); - if (movie->input && movie->input->iterate) { - movie->input->iterate (movie->input); + if (video->input->set_ratio) { + video->needs_update = TRUE; + swfdec_movie_invalidate (movie); } - - return TRUE; } static void @@ -114,7 +133,7 @@ swfdec_video_movie_class_init (SwfdecVideoMovieClass * g_class) movie_class->update_extents = swfdec_video_movie_update_extents; movie_class->render = swfdec_video_movie_render; movie_class->init_movie = swfdec_video_movie_init_movie; - movie_class->iterate_end = swfdec_video_movie_iterate_end; + movie_class->set_ratio = swfdec_video_movie_set_ratio; } static void @@ -131,6 +150,10 @@ swfdec_video_movie_set_input (SwfdecVideoMovie *movie, SwfdecVideoMovieInput *in movie->input = input; if (input == NULL) return; + if (movie->input->set_ratio) { + swfdec_movie_invalidate (SWFDEC_MOVIE (movie)); + } + movie->needs_update = TRUE; if (input->connect) input->connect (input, movie); } @@ -140,26 +163,23 @@ swfdec_video_movie_clear (SwfdecVideoMovie *movie) { g_return_if_fail (SWFDEC_IS_VIDEO_MOVIE (movie)); - if (movie->image == NULL) - return; - - cairo_surface_destroy (movie->image); - movie->image = NULL; + if (movie->image) { + cairo_surface_destroy (movie->image); + movie->image = NULL; + } swfdec_movie_invalidate (SWFDEC_MOVIE (movie)); } void -swfdec_video_movie_new_image (SwfdecVideoMovie *movie, cairo_surface_t *image) +swfdec_video_movie_new_image (SwfdecVideoMovie *movie) { g_return_if_fail (SWFDEC_IS_VIDEO_MOVIE (movie)); - g_return_if_fail (image != NULL); - if (movie->image) + if (movie->image) { cairo_surface_destroy (movie->image); - cairo_surface_reference (image); - movie->image = image; - movie->image_width = cairo_image_surface_get_width (image); - movie->image_height = cairo_image_surface_get_height (image); + movie->image = NULL; + } + movie->needs_update = TRUE; swfdec_movie_invalidate (SWFDEC_MOVIE (movie)); } diff --git a/libswfdec/swfdec_video_movie.h b/libswfdec/swfdec_video_movie.h index 9ba9f1a..958bc49 100644 --- a/libswfdec/swfdec_video_movie.h +++ b/libswfdec/swfdec_video_movie.h @@ -45,8 +45,11 @@ struct _SwfdecVideoMovieInput { /* called when input is unset */ void (* disconnect) (SwfdecVideoMovieInput *input, SwfdecVideoMovie * movie); - /* called when movie is iterating */ - void (* iterate) (SwfdecVideoMovieInput *input); + /* called when movie ratio changed */ + void (* set_ratio) (SwfdecVideoMovieInput *input, + SwfdecVideoMovie * movie); + /* called to request the current image */ + cairo_surface_t * (* get_image) (SwfdecVideoMovieInput *input); }; struct _SwfdecVideoMovie { @@ -54,9 +57,8 @@ struct _SwfdecVideoMovie { SwfdecVideo * video; /* video we play back */ SwfdecVideoMovieInput *input; /* where we take the input from */ - cairo_surface_t * image; /* current image or NULL */ - guint image_width; /* width of current image */ - guint image_height; /* height of current image */ + gboolean needs_update; /* TRUE if we should call set_ratio and get_image */ + cairo_surface_t * image; /* currently displayed image */ }; struct _SwfdecVideoMovieClass { @@ -69,8 +71,7 @@ void swfdec_video_movie_set_input (SwfdecVideoMovie * movie, SwfdecVideoMovieInput *input); void swfdec_video_movie_clear (SwfdecVideoMovie * movie); /* API for SwfdecVideoMovieInput */ -void swfdec_video_movie_new_image (SwfdecVideoMovie * movie, - cairo_surface_t * surface); +void swfdec_video_movie_new_image (SwfdecVideoMovie * movie); G_END_DECLS #endif commit 4081ac4bb4c6ceebb52e55f766bee298d23fb492 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 19:52:38 2007 +0200 set ratio via a set_ratio vfunc diff --git a/libswfdec/swfdec_morph_movie.c b/libswfdec/swfdec_morph_movie.c index ae52d8a..7997827 100644 --- a/libswfdec/swfdec_morph_movie.c +++ b/libswfdec/swfdec_morph_movie.c @@ -40,22 +40,30 @@ swfdec_morph_movie_update_extents (SwfdecMovie *movie, extents->x1 = ((65535 - ratio) * graphic->extents.x1 + ratio * morph->end_extents.x1) / 65535; extents->y0 = ((65535 - ratio) * graphic->extents.y0 + ratio * morph->end_extents.y0) / 65535; extents->y1 = ((65535 - ratio) * graphic->extents.y1 + ratio * morph->end_extents.y1) / 65535; +} + +static void +swfdec_morph_movie_set_ratio (SwfdecMovie *movie) +{ + SwfdecMorphMovie *mmovie = SWFDEC_MORPH_MOVIE (movie); - /* update the vectors */ - if (ratio != mmovie->ratio) { - SwfdecShape *shape = SWFDEC_SHAPE (mmovie->morph); - GSList *walk; + g_slist_foreach (mmovie->draws, (GFunc) g_object_unref, NULL); + g_slist_free (mmovie->draws); + mmovie->draws = NULL; + swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_CONTENTS); +} - g_slist_foreach (mmovie->draws, (GFunc) g_object_unref, NULL); - g_slist_free (mmovie->draws); - mmovie->draws = NULL; +static void +swfdec_morph_movie_create_morphs (SwfdecMorphMovie *mmovie) +{ + SwfdecShape *shape = SWFDEC_SHAPE (mmovie->morph); + guint ratio = SWFDEC_MOVIE (mmovie)->original_ratio; + GSList *walk; - for (walk = shape->draws; walk; walk = walk->next) { - mmovie->draws = g_slist_prepend (mmovie->draws, swfdec_draw_morph (walk->data, ratio)); - } - mmovie->draws = g_slist_reverse (mmovie->draws); - mmovie->ratio = ratio; + for (walk = shape->draws; walk; walk = walk->next) { + mmovie->draws = g_slist_prepend (mmovie->draws, swfdec_draw_morph (walk->data, ratio)); } + mmovie->draws = g_slist_reverse (mmovie->draws); } static void @@ -65,6 +73,9 @@ swfdec_morph_movie_render (SwfdecMovie *movie, cairo_t *cr, SwfdecMorphMovie *morph = SWFDEC_MORPH_MOVIE (movie); GSList *walk; + if (morph->draws == NULL) + swfdec_morph_movie_create_morphs (morph); + for (walk = morph->draws; walk; walk = walk->next) { SwfdecDraw *draw = walk->data; @@ -98,6 +109,7 @@ swfdec_morph_movie_class_init (SwfdecMorphMovieClass * g_class) movie_class->update_extents = swfdec_morph_movie_update_extents; movie_class->render = swfdec_morph_movie_render; + movie_class->set_ratio = swfdec_morph_movie_set_ratio; /* FIXME */ //movie_class->handle_mouse = swfdec_morph_movie_handle_mouse; } @@ -105,6 +117,5 @@ swfdec_morph_movie_class_init (SwfdecMorphMovieClass * g_class) static void swfdec_morph_movie_init (SwfdecMorphMovie *morph) { - morph->ratio = (guint) -1; } diff --git a/libswfdec/swfdec_morph_movie.h b/libswfdec/swfdec_morph_movie.h index 9c18d50..c8dd6cc 100644 --- a/libswfdec/swfdec_morph_movie.h +++ b/libswfdec/swfdec_morph_movie.h @@ -40,8 +40,7 @@ struct _SwfdecMorphMovie { SwfdecMovie movie; SwfdecMorphShape * morph; - guint ratio; /* current ratio for paths */ - GSList * draws; /* drawing operations to use */ + GSList * draws; /* drawing operations to use or NULL if not yet created */ }; struct _SwfdecMorphMovieClass { diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 4617169..3f91015 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -1330,8 +1330,11 @@ swfdec_movie_set_static_properties (SwfdecMovie *movie, const cairo_matrix_t *tr swfdec_movie_invalidate (movie); } if (ratio >= 0 && (guint) ratio != movie->original_ratio) { + SwfdecMovieClass *klass; movie->original_ratio = ratio; - swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_CONTENTS); + klass = SWFDEC_MOVIE_GET_CLASS (movie); + if (klass->set_ratio) + klass->set_ratio (movie); } if (clip_depth && clip_depth != movie->clip_depth) { movie->clip_depth = clip_depth; diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h index 5cac2a5..d074ba9 100644 --- a/libswfdec/swfdec_movie.h +++ b/libswfdec/swfdec_movie.h @@ -155,6 +155,7 @@ struct _SwfdecMovieClass { void (* finish_movie) (SwfdecMovie * movie); void (* replace) (SwfdecMovie * movie, SwfdecGraphic * graphic); + void (* set_ratio) (SwfdecMovie * movie); void (* update_extents) (SwfdecMovie * movie, SwfdecRect * extents); void (* render) (SwfdecMovie * movie, commit 07f3af8f1025ef2757dd92fa54127ba128bc4c63 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 19:05:17 2007 +0200 fix for SwfInstance => Resource rename diff --git a/test/dump.c b/test/dump.c index 47fb1ea..b66f8fc 100644 --- a/test/dump.c +++ b/test/dump.c @@ -41,7 +41,7 @@ #include <libswfdec/swfdec_shape.h> #include <libswfdec/swfdec_sound.h> #include <libswfdec/swfdec_swf_decoder.h> -#include <libswfdec/swfdec_swf_instance.h> +#include <libswfdec/swfdec_resource.h> #include <libswfdec/swfdec_tag.h> #include <libswfdec/swfdec_text.h> @@ -414,20 +414,20 @@ main (int argc, char *argv[]) } player = swfdec_player_new_from_file (argv[1]); - if (player->loader->error) { - g_printerr ("Couldn't open file \"%s\": %s\n", argv[1], player->loader->error); + if (player->resource->loader->error) { + g_printerr ("Couldn't open file \"%s\": %s\n", argv[1], player->resource->loader->error); g_object_unref (player); return 1; } /* FIXME: HACK! */ swfdec_player_advance (player, 0); - if (swfdec_player_is_initialized (player)) { + 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; + s = (SwfdecSwfDecoder *) SWFDEC_MOVIE (player->roots->data)->resource->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]); diff --git a/test/swfdec-extract.c b/test/swfdec-extract.c index 07dce11..cdc74a7 100644 --- a/test/swfdec-extract.c +++ b/test/swfdec-extract.c @@ -41,7 +41,7 @@ #include <libswfdec/swfdec_sprite.h> #include <libswfdec/swfdec_sprite_movie.h> #include <libswfdec/swfdec_swf_decoder.h> -#include <libswfdec/swfdec_swf_instance.h> +#include <libswfdec/swfdec_resource.h> static SwfdecBuffer * encode_wav (SwfdecBuffer *buffer, SwfdecAudioFormat format) @@ -270,11 +270,11 @@ main (int argc, char *argv[]) id = strtol (argv[2], NULL, 0); if (id >= 0) { character = swfdec_swf_decoder_get_character ( - SWFDEC_SWF_DECODER (SWFDEC_MOVIE (player->roots->data)->swf->decoder), + SWFDEC_SWF_DECODER (SWFDEC_MOVIE (player->roots->data)->resource->decoder), id); } else { character = SWFDEC_CHARACTER (SWFDEC_SWF_DECODER ( - SWFDEC_MOVIE (player->roots->data)->swf->decoder)->main_sprite); + SWFDEC_MOVIE (player->roots->data)->resource->decoder)->main_sprite); } if (SWFDEC_IS_SPRITE (character)) { if (!export_sprite_sound (SWFDEC_SPRITE (character), argv[3])) commit c69b7afe5cb37f764b2c41397cba38d68f952ff3 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 18:52:28 2007 +0200 make swfdec_player_load fail when the security doesn't allow opening the URL diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index 7174aa2..09ac8c8 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -181,18 +181,21 @@ swfdec_load_object_init (SwfdecLoadObject *load_object) { } -static void +static gboolean swfdec_load_object_load (SwfdecLoadObject *load_object, const char *url, SwfdecLoaderRequest request, SwfdecBuffer *data) { SwfdecAsValue val; - g_return_if_fail (SWFDEC_IS_LOAD_OBJECT (load_object)); - g_return_if_fail (url != NULL); + g_return_val_if_fail (SWFDEC_IS_LOAD_OBJECT (load_object), FALSE); + g_return_val_if_fail (url != NULL, FALSE); swfdec_load_object_reset (load_object); load_object->loader = swfdec_player_load ( SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load_object)->context), url, request, data); + if (load_object->loader == NULL) + return FALSE; + swfdec_loader_set_target (load_object->loader, SWFDEC_LOADER_TARGET (load_object)); swfdec_loader_set_data_type (load_object->loader, SWFDEC_LOADER_DATA_TEXT); @@ -207,6 +210,7 @@ swfdec_load_object_load (SwfdecLoadObject *load_object, const char *url, SWFDEC_AS_VALUE_SET_BOOLEAN (&val, FALSE); swfdec_as_object_set_variable_and_flags (load_object->target, SWFDEC_AS_STR_loaded, &val, SWFDEC_AS_VARIABLE_HIDDEN); + return TRUE; } SwfdecAsObject * @@ -226,10 +230,11 @@ swfdec_load_object_new (SwfdecAsObject *target, const char *url, SWFDEC_LOAD_OBJECT (load_object)->target = target; + if (!swfdec_load_object_load (SWFDEC_LOAD_OBJECT (load_object), url, request, data)) + return NULL; + 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, request, data); - return load_object; } diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 59cb836..135bae8 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -484,8 +484,10 @@ swfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url) /* FIXME: use the connection once connections are implemented */ 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); + if (loader) { + swfdec_net_stream_set_loader (stream, loader); + g_object_unref (loader); + } } void diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 420820e..6355c42 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -28,6 +28,7 @@ #include <liboil/liboil.h> #include "swfdec_player_internal.h" +#include "swfdec_as_frame_internal.h" #include "swfdec_as_internal.h" #include "swfdec_as_strings.h" #include "swfdec_audio_internal.h" @@ -1656,10 +1657,29 @@ SwfdecLoader * swfdec_player_load (SwfdecPlayer *player, const char *url, SwfdecLoaderRequest request, SwfdecBuffer *buffer) { + SwfdecAsContext *cx; + SwfdecSecurity *sec; + SwfdecURL *full; + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); g_return_val_if_fail (url != NULL, NULL); g_assert (player->resource); + /* create absolute url first */ + full = swfdec_url_new_relative (swfdec_loader_get_url (player->resource->loader), url); + /* figure out the right security object (FIXME: let the person loading it provide it?) */ + cx = SWFDEC_AS_CONTEXT (player); + if (cx->frame) { + sec = cx->frame->security; + } else { + g_warning ("swfdec_player_load() should only be called from scripts"); + sec = SWFDEC_SECURITY (player->resource); + } + if (!swfdec_security_allow_url (sec, full)) { + SWFDEC_ERROR ("not allowing access to %s", url); + return NULL; + } + if (buffer) { return swfdec_loader_load (player->resource->loader, url, request, (const char *) buffer->data, buffer->length); diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index bf80f93..91bfb2f 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -722,9 +722,11 @@ swfdec_sprite_movie_load (SwfdecSpriteMovie *movie, const char *url, SwfdecLoade 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); + if (loader == NULL) + return; + resource = swfdec_resource_new (loader, NULL); g_object_unref (SWFDEC_MOVIE (movie)->resource); SWFDEC_MOVIE (movie)->resource = resource; commit ef0da1f12dd355bf62799b810026e1d8ad07cd40 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 17:12:50 2007 +0200 add flag for "only used as first flag" and use it for FileAttributes diff --git a/libswfdec/swfdec_swf_decoder.c b/libswfdec/swfdec_swf_decoder.c index fe964ff..a864ecb 100644 --- a/libswfdec/swfdec_swf_decoder.c +++ b/libswfdec/swfdec_swf_decoder.c @@ -38,11 +38,13 @@ #include "swfdec_script.h" #include "swfdec_script_internal.h" #include "swfdec_sprite.h" +#include "swfdec_tag.h" enum { SWFDEC_STATE_INIT1 = 0, SWFDEC_STATE_INIT2, - SWFDEC_STATE_PARSETAG, + SWFDEC_STATE_PARSE_FIRST_TAG, + SWFDEC_STATE_PARSE_TAG, SWFDEC_STATE_EOF, }; @@ -270,7 +272,7 @@ swf_parse_header2 (SwfdecSwfDecoder * s) swfdec_swf_decoder_flush_bits (s, &s->b); - s->state = SWFDEC_STATE_PARSETAG; + s->state = SWFDEC_STATE_PARSE_FIRST_TAG; return SWFDEC_STATUS_INIT; } @@ -292,7 +294,8 @@ swfdec_swf_decoder_parse (SwfdecDecoder *dec) return SWFDEC_STATUS_ERROR; ret = swf_parse_header2 (s); break; - case SWFDEC_STATE_PARSETAG: + case SWFDEC_STATE_PARSE_FIRST_TAG: + case SWFDEC_STATE_PARSE_TAG: { guint header_length; guint x; @@ -336,6 +339,10 @@ swfdec_swf_decoder_parse (SwfdecDecoder *dec) func = swfdec_swf_decoder_get_tag_func (tag); if (tag == 0) { s->state = SWFDEC_STATE_EOF; + } else if ((swfdec_swf_decoder_get_tag_flag (tag) & SWFDEC_TAG_FIRST_ONLY) + && s->state == SWFDEC_STATE_PARSE_TAG) { + SWFDEC_WARNING ("tag %d %s must be first tag in file, ignoring", + tag, swfdec_swf_decoder_get_tag_name (tag)); } else if (func == NULL) { SWFDEC_WARNING ("tag function not implemented for %d %s", tag, swfdec_swf_decoder_get_tag_name (tag)); @@ -355,6 +362,7 @@ swfdec_swf_decoder_parse (SwfdecDecoder *dec) ret = SWFDEC_STATE_EOF; SWFDEC_ERROR ("data after last frame"); } + s->state = SWFDEC_STATE_PARSE_TAG; break; } diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c index c9ce1a6..bad0be3 100644 --- a/libswfdec/swfdec_tag.c +++ b/libswfdec/swfdec_tag.c @@ -638,8 +638,6 @@ tag_func_do_action (SwfdecSwfDecoder * s, guint tag) return SWFDEC_STATUS_OK; } -/* may appear inside DefineSprite */ -#define SPRITE 1 struct tag_func_struct { const char *name; @@ -647,12 +645,12 @@ struct tag_func_struct int flag; }; static struct tag_func_struct tag_funcs[] = { - [SWFDEC_TAG_END] = {"End", tag_func_end, SPRITE}, - [SWFDEC_TAG_SHOWFRAME] = {"ShowFrame", tag_func_show_frame, SPRITE}, + [SWFDEC_TAG_END] = {"End", tag_func_end, SWFDEC_TAG_DEFINE_SPRITE }, + [SWFDEC_TAG_SHOWFRAME] = {"ShowFrame", tag_func_show_frame, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINESHAPE] = {"DefineShape", tag_define_shape, 0}, [SWFDEC_TAG_FREECHARACTER] = {"FreeCharacter", NULL, 0}, - [SWFDEC_TAG_PLACEOBJECT] = {"PlaceObject", NULL, SPRITE}, - [SWFDEC_TAG_REMOVEOBJECT] = {"RemoveObject", tag_func_enqueue, SPRITE}, + [SWFDEC_TAG_PLACEOBJECT] = {"PlaceObject", NULL, SWFDEC_TAG_DEFINE_SPRITE }, + [SWFDEC_TAG_REMOVEOBJECT] = {"RemoveObject", tag_func_enqueue, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINEBITSJPEG] = {"DefineBitsJPEG", tag_func_define_bits_jpeg, 0}, [SWFDEC_TAG_DEFINEBUTTON] = {"DefineButton", tag_func_define_button, 0}, [SWFDEC_TAG_JPEGTABLES] = {"JPEGTables", swfdec_image_jpegtables, 0}, @@ -660,22 +658,22 @@ static struct tag_func_struct tag_funcs[] = { {"SetBackgroundColor", tag_func_set_background_color, 0}, [SWFDEC_TAG_DEFINEFONT] = {"DefineFont", tag_func_define_font, 0}, [SWFDEC_TAG_DEFINETEXT] = {"DefineText", tag_func_define_text, 0}, - [SWFDEC_TAG_DOACTION] = {"DoAction", tag_func_do_action, SPRITE}, + [SWFDEC_TAG_DOACTION] = {"DoAction", tag_func_do_action, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINEFONTINFO] = {"DefineFontInfo", tag_func_define_font_info, 0}, [SWFDEC_TAG_DEFINESOUND] = {"DefineSound", tag_func_define_sound, 0}, - [SWFDEC_TAG_STARTSOUND] = {"StartSound", tag_func_enqueue, SPRITE}, + [SWFDEC_TAG_STARTSOUND] = {"StartSound", tag_func_enqueue, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINEBUTTONSOUND] {"DefineButtonSound", tag_func_define_button_sound, 0}, - [SWFDEC_TAG_SOUNDSTREAMHEAD] = {"SoundStreamHead", tag_func_sound_stream_head, SPRITE}, - [SWFDEC_TAG_SOUNDSTREAMBLOCK] = {"SoundStreamBlock", tag_func_sound_stream_block, SPRITE}, + [SWFDEC_TAG_SOUNDSTREAMHEAD] = {"SoundStreamHead", tag_func_sound_stream_head, SWFDEC_TAG_DEFINE_SPRITE }, + [SWFDEC_TAG_SOUNDSTREAMBLOCK] = {"SoundStreamBlock", tag_func_sound_stream_block, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINEBITSLOSSLESS] {"DefineBitsLossless", tag_func_define_bits_lossless, 0}, [SWFDEC_TAG_DEFINEBITSJPEG2] = {"DefineBitsJPEG2", tag_func_define_bits_jpeg_2, 0}, [SWFDEC_TAG_DEFINESHAPE2] = {"DefineShape2", tag_define_shape, 0}, [SWFDEC_TAG_DEFINEBUTTONCXFORM] = {"DefineButtonCXForm", NULL, 0}, [SWFDEC_TAG_PROTECT] = {"Protect", tag_func_protect, 0}, - [SWFDEC_TAG_PLACEOBJECT2] = {"PlaceObject2", tag_func_enqueue, SPRITE}, - [SWFDEC_TAG_REMOVEOBJECT2] = {"RemoveObject2", tag_func_enqueue, SPRITE}, + [SWFDEC_TAG_PLACEOBJECT2] = {"PlaceObject2", tag_func_enqueue, SWFDEC_TAG_DEFINE_SPRITE }, + [SWFDEC_TAG_REMOVEOBJECT2] = {"RemoveObject2", tag_func_enqueue, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINESHAPE3] = {"DefineShape3", tag_define_shape_3, 0}, [SWFDEC_TAG_DEFINETEXT2] = {"DefineText2", tag_func_define_text, 0}, [SWFDEC_TAG_DEFINEBUTTON2] = {"DefineButton2", tag_func_define_button_2, 0}, @@ -688,8 +686,8 @@ static struct tag_func_struct tag_funcs[] = { [SWFDEC_TAG_NAMECHARACTER] = {"NameCharacter", NULL, 0}, [SWFDEC_TAG_SERIALNUMBER] = {"SerialNumber", NULL, 0}, [SWFDEC_TAG_GENERATORTEXT] = {"GeneratorText", NULL, 0}, - [SWFDEC_TAG_FRAMELABEL] = {"FrameLabel", tag_func_frame_label, SPRITE}, - [SWFDEC_TAG_SOUNDSTREAMHEAD2] = {"SoundStreamHead2", tag_func_sound_stream_head, SPRITE}, + [SWFDEC_TAG_FRAMELABEL] = {"FrameLabel", tag_func_frame_label, SWFDEC_TAG_DEFINE_SPRITE }, + [SWFDEC_TAG_SOUNDSTREAMHEAD2] = {"SoundStreamHead2", tag_func_sound_stream_head, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINEMORPHSHAPE] {"DefineMorphShape", tag_define_morph_shape, 0}, [SWFDEC_TAG_DEFINEFONT2] = {"DefineFont2", tag_func_define_font_2, 0}, @@ -699,16 +697,16 @@ static struct tag_func_struct tag_funcs[] = { [SWFDEC_TAG_EXPORTASSETS] = {"ExportAssets", tag_func_export_assets, 0}, [SWFDEC_TAG_IMPORTASSETS] = {"ImportAssets", NULL, 0}, [SWFDEC_TAG_ENABLEDEBUGGER] = {"EnableDebugger", NULL, 0}, - [SWFDEC_TAG_DOINITACTION] = {"DoInitAction", tag_func_do_init_action, SPRITE}, + [SWFDEC_TAG_DOINITACTION] = {"DoInitAction", tag_func_do_init_action, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINEVIDEOSTREAM] = {"DefineVideoStream", tag_func_define_video, 0}, - [SWFDEC_TAG_VIDEOFRAME] = {"VideoFrame", tag_func_video_frame, SPRITE}, + [SWFDEC_TAG_VIDEOFRAME] = {"VideoFrame", tag_func_video_frame, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_DEFINEFONTINFO2] = {"DefineFontInfo2", tag_func_define_font_info, 0}, [SWFDEC_TAG_MX4] = {"MX4", NULL, 0}, [SWFDEC_TAG_ENABLEDEBUGGER2] = {"EnableDebugger2", NULL, 0}, [SWFDEC_TAG_SCRIPTLIMITS] = {"ScriptLimits", NULL, 0}, [SWFDEC_TAG_SETTABINDEX] = {"SetTabIndex", NULL, 0}, - [SWFDEC_TAG_FILEATTRIBUTES] = {"FileAttributes", tag_func_file_attributes, 0}, - [SWFDEC_TAG_PLACEOBJECT3] = {"PlaceObject3", tag_func_enqueue, SPRITE}, + [SWFDEC_TAG_FILEATTRIBUTES] = {"FileAttributes", tag_func_file_attributes, SWFDEC_TAG_FIRST_ONLY }, + [SWFDEC_TAG_PLACEOBJECT3] = {"PlaceObject3", tag_func_enqueue, SWFDEC_TAG_DEFINE_SPRITE }, [SWFDEC_TAG_IMPORTASSETS2] = {"ImportAssets2", NULL, 0}, [SWFDEC_TAG_DEFINEFONTALIGNZONES] = {"DefineFontAlignZones", NULL, 0}, [SWFDEC_TAG_CSMTEXTSETTINGS] = {"CSMTextSettings", NULL, 0}, diff --git a/libswfdec/swfdec_tag.h b/libswfdec/swfdec_tag.h index cbb6de0..a3df92b 100644 --- a/libswfdec/swfdec_tag.h +++ b/libswfdec/swfdec_tag.h @@ -92,5 +92,11 @@ typedef enum { SWFDEC_TAG_DEFINEMORPHSHAPE2 = 84 } SwfdecTag; +typedef enum { + /* tag is allowe inside DefineSprite */ + SWFDEC_TAG_DEFINE_SPRITE = (1 << 0), + /* tag must be first tag */ + SWFDEC_TAG_FIRST_ONLY = (1 << 1) +} SwfdecTagFlag; #endif commit 488a233fcf44a08e6f4a10cdc056dec3fbde5526 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 17:00:39 2007 +0200 remove g_print diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c index 7913383..c9ce1a6 100644 --- a/libswfdec/swfdec_tag.c +++ b/libswfdec/swfdec_tag.c @@ -517,7 +517,6 @@ tag_func_file_attributes (SwfdecSwfDecoder *s, guint tag) SWFDEC_INFO ("reserved bits (2) aren't 0"); s->use_network = swfdec_bits_getbit (&s->b); SWFDEC_LOG (" use network: %d", s->use_network); - g_print (" use network: %d\n", 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 */ commit 29ae44d7a7faaff225603a76b2d8c3cc0705d7e2 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 16:57:10 2007 +0200 fix allow security handling diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index c13d0e0..0acf747 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -35,8 +35,10 @@ swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) if (guard == key) { return g_object_ref (guard); } else if (SWFDEC_IS_SECURITY_ALLOW (key)) { - return g_object_ref (key); + /* This only happens when calling functions (I hope) */ + return g_object_ref (guard); } else if (SWFDEC_IS_FLASH_SECURITY (key)) { + /* FIXME: what do we do here? */ return g_object_ref (key); } else { SWFDEC_ERROR ("unknown security %s, denying access", G_OBJECT_TYPE_NAME (key)); commit 2c9ea37ee7248455fc1fa4478cf638b3dbc7675b Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 16:47:51 2007 +0200 make the flash security use the sandbox type explicitly diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index 4b27c53..c13d0e0 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -35,10 +35,9 @@ swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) if (guard == key) { return g_object_ref (guard); } else if (SWFDEC_IS_SECURITY_ALLOW (key)) { - return g_object_ref (guard); + return g_object_ref (key); } else if (SWFDEC_IS_FLASH_SECURITY (key)) { - SWFDEC_FIXME ("merging flash securities - how is this supposed to work?"); - return key; + return g_object_ref (key); } else { SWFDEC_ERROR ("unknown security %s, denying access", G_OBJECT_TYPE_NAME (key)); return NULL; @@ -46,22 +45,55 @@ swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) } static gboolean +swfdec_flash_security_match_domain (const SwfdecURL *guard, const SwfdecURL *key) +{ + return g_ascii_strcasecmp (swfdec_url_get_host (guard), swfdec_url_get_host (key)) == 0; +} + +static gboolean swfdec_flash_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url) { SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (guard); - if (swfdec_url_is_local (url)) { - return sec->allow_local; - } else { - return sec->allow_remote; + switch (sec->sandbox) { + case SWFDEC_SANDBOX_NONE: + return FALSE; + case SWFDEC_SANDBOX_REMOTE: + if (swfdec_url_is_local (url)) + return FALSE; + return swfdec_flash_security_match_domain (sec->url, url); + case SWFDEC_SANDBOX_LOCAL_FILE: + return swfdec_url_is_local (url); + case SWFDEC_SANDBOX_LOCAL_NETWORK: + return !swfdec_url_is_local (url); + case SWFDEC_SANDBOX_LOCAL_TRUSTED: + return TRUE; } + g_assert_not_reached (); + return FALSE; +} + +static void +swfdec_flash_security_dispose (GObject *object) +{ + SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (object); + + if (sec->url) { + swfdec_url_free (sec->url); + sec->url = NULL; + } + sec->sandbox = SWFDEC_SANDBOX_NONE; + G_OBJECT_CLASS (swfdec_flash_security_parent_class)->dispose (object); } static void swfdec_flash_security_class_init (SwfdecFlashSecurityClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); SwfdecSecurityClass *security_class = SWFDEC_SECURITY_CLASS (klass); + object_class->dispose = swfdec_flash_security_dispose; + security_class->allow = swfdec_flash_security_allow; security_class->allow_url = swfdec_flash_security_allow_url; } @@ -71,25 +103,19 @@ 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 - * useful for script engines that are not security sensitive or code injection - * via debugging. - * - * Returns: a new #SwfdecSecurity object - **/ -SwfdecSecurity * -swfdec_flash_security_new (gboolean allow_local, gboolean allow_remote) +void +swfdec_flash_security_set_url (SwfdecFlashSecurity *sec, const SwfdecURL *url) { - SwfdecFlashSecurity *ret; - - ret = g_object_new (SWFDEC_TYPE_FLASH_SECURITY, NULL); - ret->allow_local = allow_local; - ret->allow_remote = allow_remote; - return SWFDEC_SECURITY (ret); + g_return_if_fail (SWFDEC_IS_FLASH_SECURITY (sec)); + g_return_if_fail (sec->url == NULL); + g_return_if_fail (url != NULL); + + g_assert (sec->sandbox == SWFDEC_SANDBOX_NONE); + sec->url = swfdec_url_copy (url); + if (swfdec_url_is_local (url)) { + sec->sandbox = SWFDEC_SANDBOX_LOCAL_FILE; + } else { + sec->sandbox = SWFDEC_SANDBOX_REMOTE; + } } + diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h index 00dd14f..ae1246b 100644 --- a/libswfdec/swfdec_flash_security.h +++ b/libswfdec/swfdec_flash_security.h @@ -27,6 +27,14 @@ G_BEGIN_DECLS typedef struct _SwfdecFlashSecurity SwfdecFlashSecurity; typedef struct _SwfdecFlashSecurityClass SwfdecFlashSecurityClass; +typedef enum { + SWFDEC_SANDBOX_NONE, + SWFDEC_SANDBOX_REMOTE, + SWFDEC_SANDBOX_LOCAL_FILE, + SWFDEC_SANDBOX_LOCAL_NETWORK, + SWFDEC_SANDBOX_LOCAL_TRUSTED +} SwfdecSandboxType; + #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)) @@ -38,8 +46,8 @@ struct _SwfdecFlashSecurity { SwfdecSecurity security; - gboolean allow_local; /* TRUE to allow access to local ressources */ - gboolean allow_remote; /* TRUE to allow access to remote resources */ + SwfdecSandboxType sandbox; /* sandbox we are operating in */ + SwfdecURL * url; /* url this security was loaded from */ }; struct _SwfdecFlashSecurityClass @@ -49,8 +57,8 @@ struct _SwfdecFlashSecurityClass GType swfdec_flash_security_get_type (void); -SwfdecSecurity * swfdec_flash_security_new (gboolean allow_local, - gboolean allow_remote); +void swfdec_flash_security_set_url (SwfdecFlashSecurity * sec, + const SwfdecURL * url); G_END_DECLS diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 7e514e1..420820e 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1730,23 +1730,6 @@ 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; - SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (player->resource); - - url = swfdec_loader_get_url (player->resource->loader); - if (version > 7) { - /* for local files we allow nothing by default, the FileAttributes tag fixes that */ - sec->allow_local = FALSE; - sec->allow_remote = swfdec_url_has_protocol (url, "http"); - } else { - sec->allow_local = swfdec_url_has_protocol (url, "file"); - sec->allow_remote = TRUE; - } -} - /** * swfdec_player_initialize: * @player: a #SwfdecPlayer @@ -1789,7 +1772,6 @@ 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_resource.c b/libswfdec/swfdec_resource.c index 68623ed..b8c0256 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -57,21 +57,11 @@ swfdec_resource_check_rights (SwfdecResource *resource) { SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (resource); SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (resource->decoder); - gboolean network; - if (dec->version < 8 || !swfdec_url_is_local (swfdec_loader_get_url (resource->loader))) - return; - - network = dec->use_network; - g_print ("enabling %s access for %s\n", network ? "network" : "local", - swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); - SWFDEC_INFO ("enabling %s access for %s", network ? "network" : "local", + if (dec->use_network && sec->sandbox == SWFDEC_SANDBOX_LOCAL_FILE) + sec->sandbox = SWFDEC_SANDBOX_LOCAL_NETWORK; + SWFDEC_INFO ("enabling local-with-network sandbox for %s", swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); - SWFDEC_INFO ("enabling network access for %s", - swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); - - sec->allow_remote = network; - sec->allow_local = !network; } static void @@ -234,6 +224,8 @@ swfdec_resource_new (SwfdecLoader *loader, const char *variables) swf->variables = g_strdup (variables); /* set loader (that depends on those vars) */ swf->loader = g_object_ref (loader); + swfdec_flash_security_set_url (SWFDEC_FLASH_SECURITY (swf), + swfdec_loader_get_url (loader)); return swf; } commit 5671f65fa031d684261b29db7dfa5a46f5a42c99 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 16:17:49 2007 +0200 add (and use) swfdec_url_is_local() diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt index 0c22165..b3b4425 100644 --- a/doc/swfdec-sections.txt +++ b/doc/swfdec-sections.txt @@ -61,6 +61,7 @@ swfdec_url_get_protocol swfdec_url_has_protocol swfdec_url_get_query swfdec_url_get_url +swfdec_url_is_local swfdec_url_new swfdec_url_new_relative <SUBSECTION Standard> diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index a9c5219..4b27c53 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -50,13 +50,10 @@ 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")) { + if (swfdec_url_is_local (url)) { return sec->allow_local; } else { - SWFDEC_ERROR ("unknown protocol %s, denying access", swfdec_url_get_protocol (url)); - return FALSE; + return sec->allow_remote; } } diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 4f2a6be..68623ed 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -59,8 +59,7 @@ swfdec_resource_check_rights (SwfdecResource *resource) SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (resource->decoder); gboolean network; - if (dec->version < 8 || - !swfdec_url_has_protocol (swfdec_loader_get_url (resource->loader), "file")) + if (dec->version < 8 || !swfdec_url_is_local (swfdec_loader_get_url (resource->loader))) return; network = dec->use_network; diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c index cb5db48..3d51d8e 100644 --- a/libswfdec/swfdec_url.c +++ b/libswfdec/swfdec_url.c @@ -312,4 +312,20 @@ swfdec_url_get_query (const SwfdecURL *url) return url->query; } +/** + * swfdec_url_is_local: + * @url: the url to check + * + * Checks if the given @url references a local resource. Local resources are + * treated differently by Flash, since they get a higher degree of trust. + * + * Returns: %TRUE if the given url is local. + **/ +gboolean +swfdec_url_is_local (const SwfdecURL *url) +{ + g_return_val_if_fail (url != NULL, FALSE); + /* FIXME: If we ever support gnome-vfs, this might become tricky */ + return swfdec_url_has_protocol (url, "file"); +} diff --git a/libswfdec/swfdec_url.h b/libswfdec/swfdec_url.h index 6bf46fc..7a94039 100644 --- a/libswfdec/swfdec_url.h +++ b/libswfdec/swfdec_url.h @@ -43,6 +43,8 @@ const char * swfdec_url_get_query (const SwfdecURL * url); gboolean swfdec_url_has_protocol (const SwfdecURL * url, const char * protocol); + +gboolean swfdec_url_is_local (const SwfdecURL * url); G_END_DECLS commit 4c90bdcccb86f87aaf11593cc460789c9c65ea8b Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 16:04:28 2007 +0200 replace Player.loader and Player.security with Player.resource diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index 16ea014..f5eed8a 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -411,5 +411,6 @@ const char swfdec_as_strings[] SWFDEC_AS_CONSTANT_STRING ("variable") SWFDEC_AS_CONSTANT_STRING ("restrict") SWFDEC_AS_CONSTANT_STRING ("mouseWheelEnabled") + SWFDEC_AS_CONSTANT_STRING ("_level0") /* add more here */ ; diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 73dce1b..7e514e1 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -800,13 +800,9 @@ swfdec_player_dispose (GObject *object) g_queue_free (player->init_queue); g_queue_free (player->construct_queue); swfdec_cache_unref (player->cache); - if (player->loader) { - g_object_unref (player->loader); - player->loader = NULL; - } - if (player->security) { - g_object_unref (player->security); - player->security = NULL; + if (player->resource) { + g_object_unref (player->resource); + player->resource = NULL; } if (player->system) { g_object_unref (player->system); @@ -1632,23 +1628,6 @@ swfdec_player_get_level (SwfdecPlayer *player, const char *name, SwfdecResource return movie; } -SwfdecMovie * -swfdec_player_add_level_from_loader (SwfdecPlayer *player, guint depth, - SwfdecLoader *loader, const char *variables) -{ - SwfdecResource *resource; - SwfdecMovie *movie; - const char *name; - - swfdec_player_remove_level (player, depth); - name = swfdec_as_context_give_string (SWFDEC_AS_CONTEXT (player), g_strdup_printf ("_level%u", depth)); - resource = swfdec_resource_new (loader, variables); - movie = swfdec_movie_new (player, depth - 16384, NULL, resource, NULL, name); - movie->name = SWFDEC_AS_STR_EMPTY; - g_object_unref (loader); - return movie; -} - void swfdec_player_remove_level (SwfdecPlayer *player, guint depth) { @@ -1680,12 +1659,12 @@ swfdec_player_load (SwfdecPlayer *player, const char *url, g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); g_return_val_if_fail (url != NULL, NULL); - g_assert (player->loader); + g_assert (player->resource); if (buffer) { - return swfdec_loader_load (player->loader, url, request, + return swfdec_loader_load (player->resource->loader, url, request, (const char *) buffer->data, buffer->length); } else { - return swfdec_loader_load (player->loader, url, request, NULL, 0); + return swfdec_loader_load (player->resource->loader, url, request, NULL, 0); } } @@ -1755,17 +1734,17 @@ static void swfdec_player_create_security (SwfdecPlayer *player, guint version) { const SwfdecURL *url; - gboolean allow_local, allow_remote; + SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (player->resource); - url = swfdec_loader_get_url (player->loader); + url = swfdec_loader_get_url (player->resource->loader); if (version > 7) { - allow_local = FALSE; - allow_remote = swfdec_url_has_protocol (url, "http"); + /* for local files we allow nothing by default, the FileAttributes tag fixes that */ + sec->allow_local = FALSE; + sec->allow_remote = swfdec_url_has_protocol (url, "http"); } else { - allow_local = swfdec_url_has_protocol (url, "file"); - allow_remote = TRUE; + sec->allow_local = swfdec_url_has_protocol (url, "file"); + sec->allow_remote = TRUE; } - player->security = swfdec_flash_security_new (allow_local, allow_remote); } /** @@ -1931,13 +1910,15 @@ void swfdec_player_set_loader_with_variables (SwfdecPlayer *player, SwfdecLoader *loader, const char *variables) { + SwfdecMovie *movie; + g_return_if_fail (SWFDEC_IS_PLAYER (player)); - g_return_if_fail (player->loader == NULL); + g_return_if_fail (player->resource == NULL); g_return_if_fail (SWFDEC_IS_LOADER (loader)); - player->loader = loader; - g_object_ref (loader); - swfdec_player_add_level_from_loader (player, 0, loader, variables); + player->resource = swfdec_resource_new (loader, variables); + movie = swfdec_movie_new (player, -16384, NULL, player->resource, NULL, SWFDEC_AS_STR__level0); + movie->name = SWFDEC_AS_STR_EMPTY; } /** diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index afaebeb..483d487 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -62,8 +62,7 @@ struct _SwfdecPlayer SwfdecCache * cache; /* player cache */ gboolean bgcolor_set; /* TRUE if the background color has been set */ SwfdecColor bgcolor; /* background color */ - SwfdecLoader * loader; /* initial loader */ - SwfdecSecurity * security; /* the default security */ + SwfdecResource * resource; /* initial resource loaded */ /* stage properties */ guint internal_width; /* width used by the scripting engine */ guint internal_height; /* height used by the scripting engine */ @@ -201,11 +200,6 @@ SwfdecSpriteMovie * swfdec_player_get_level (SwfdecPlayer * player, const char * name, SwfdecResource * resource); -SwfdecMovie * swfdec_player_add_level_from_loader - (SwfdecPlayer * player, - guint depth, - SwfdecLoader * loader, - const char * variables); void swfdec_player_remove_level (SwfdecPlayer * player, guint depth); gboolean swfdec_player_fscommand (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 21c8a82..4f2a6be 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -53,18 +53,26 @@ swfdec_resource_loader_target_get_player (SwfdecLoaderTarget *target) } static void -swfdec_resource_allow_network (SwfdecPlayer *player) +swfdec_resource_check_rights (SwfdecResource *resource) { - SwfdecFlashSecurity *sec; + SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (resource); + SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (resource->decoder); + gboolean network; - g_print ("enabling network access for %s\n", - swfdec_url_get_url (swfdec_loader_get_url (player->loader))); + if (dec->version < 8 || + !swfdec_url_has_protocol (swfdec_loader_get_url (resource->loader), "file")) + return; + + network = dec->use_network; + g_print ("enabling %s access for %s\n", network ? "network" : "local", + swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); + SWFDEC_INFO ("enabling %s access for %s", network ? "network" : "local", + swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); SWFDEC_INFO ("enabling network access for %s", - swfdec_url_get_url (swfdec_loader_get_url (player->loader))); + swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); - sec = SWFDEC_FLASH_SECURITY (player->security); - sec->allow_remote = TRUE; - sec->allow_local = FALSE; + sec->allow_remote = network; + sec->allow_local = !network; } static void @@ -82,9 +90,8 @@ swfdec_resource_loader_target_image (SwfdecResource *instance) 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_resource_allow_network (player); + if (player->resource == instance) + swfdec_resource_check_rights (instance); } else if (SWFDEC_IS_FLV_DECODER (instance->decoder)) { /* nothing to do, please move along */ } else { diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c index c9ce1a6..7913383 100644 --- a/libswfdec/swfdec_tag.c +++ b/libswfdec/swfdec_tag.c @@ -517,6 +517,7 @@ tag_func_file_attributes (SwfdecSwfDecoder *s, guint tag) SWFDEC_INFO ("reserved bits (2) aren't 0"); s->use_network = swfdec_bits_getbit (&s->b); SWFDEC_LOG (" use network: %d", s->use_network); + g_print (" use network: %d\n", 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 */ commit a0d4cc6a7d07360dbe3b98c5b677609a8f461d8c Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 13:24:18 2007 +0200 don't allow any access by default diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index 8d1171e..a9c5219 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -72,8 +72,6 @@ swfdec_flash_security_class_init (SwfdecFlashSecurityClass *klass) static void swfdec_flash_security_init (SwfdecFlashSecurity *sec) { - sec->allow_local = TRUE; - sec->allow_remote = TRUE; } /** commit 2584f8940d5e780ed0a9d970a1eaa388c6988250 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 13:17:25 2007 +0200 disable merging of Flash securities diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index f739d27..8d1171e 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -37,15 +37,8 @@ swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) } else 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); - - SWFDEC_FIXME ("merging flash securities - this should create the right type"); - 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); + SWFDEC_FIXME ("merging flash securities - how is this supposed to work?"); + return key; } else { SWFDEC_ERROR ("unknown security %s, denying access", G_OBJECT_TYPE_NAME (key)); return NULL; commit 7e9288880f2a1b51688308dee1e9226617aee64a Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 13:15:16 2007 +0200 make the SwfdecResource an argument to swfdec_movie_new() diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 42f8dd8..b608f31 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1150,7 +1150,9 @@ 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); + SwfdecSecurity *sec = cx->frame->security; + SwfdecSpriteMovie *movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, + SWFDEC_IS_RESOURCE (sec) ? SWFDEC_RESOURCE (sec) : NULL); if (movie) { swfdec_sprite_movie_load (movie, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL); } else { @@ -1192,9 +1194,12 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g } else if (swfdec_player_fscommand (SWFDEC_PLAYER (cx), url, target)) { /* nothing to do here */ } else if (internal || variables) { + SwfdecSecurity *sec = cx->frame->security; SwfdecSpriteMovie *movie; + /* FIXME: This code looks wrong - figure out how levels are handled */ - movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, !variables); + movie = swfdec_player_get_level (SWFDEC_PLAYER (cx), target, + (SWFDEC_IS_RESOURCE (sec) && !variables) ? SWFDEC_RESOURCE (sec) : NULL); if (movie == NULL) { movie = (SwfdecSpriteMovie *) swfdec_player_get_movie_from_string ( SWFDEC_PLAYER (cx), target); diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 41a0007..4617169 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -1214,6 +1214,7 @@ swfdec_movie_set_depth (SwfdecMovie *movie, int depth) * @player: a #SwfdecPlayer * @depth: depth of movie * @parent: the parent movie or %NULL to make this a root movie + * @resource: the resource that is responsible for this movie * @graphic: the graphic that is displayed by this movie or %NULL to create an * empty movieclip * @name: a garbage-collected string to be used as the name for this movie or @@ -1229,13 +1230,15 @@ swfdec_movie_set_depth (SwfdecMovie *movie, int depth) * Returns: a new #SwfdecMovie **/ SwfdecMovie * -swfdec_movie_new (SwfdecPlayer *player, int depth, SwfdecMovie *parent, SwfdecGraphic *graphic, const char *name) +swfdec_movie_new (SwfdecPlayer *player, int depth, SwfdecMovie *parent, SwfdecResource *resource, + SwfdecGraphic *graphic, const char *name) { SwfdecMovie *movie; gsize size; g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); g_return_val_if_fail (parent == NULL || SWFDEC_IS_MOVIE (parent), NULL); + g_return_val_if_fail (SWFDEC_IS_RESOURCE (resource), NULL); g_return_val_if_fail (graphic == NULL || SWFDEC_IS_GRAPHIC (graphic), NULL); /* create the right movie */ @@ -1257,8 +1260,8 @@ swfdec_movie_new (SwfdecPlayer *player, int depth, SwfdecMovie *parent, SwfdecGr g_object_ref (movie); /* set essential properties */ movie->parent = parent; + movie->resource = g_object_ref (resource); if (parent) { - movie->resource = g_object_ref (parent->resource); parent->list = g_list_insert_sorted (parent->list, movie, swfdec_movie_compare_depths); SWFDEC_DEBUG ("inserting %s %s (depth %d) into %s %p", G_OBJECT_TYPE_NAME (movie), movie->name, movie->depth, G_OBJECT_TYPE_NAME (parent), parent); @@ -1288,6 +1291,11 @@ swfdec_movie_new (SwfdecPlayer *player, int depth, SwfdecMovie *parent, SwfdecGr player->movies = g_list_prepend (player->movies, movie); /* only add the movie here, because it needs to be setup for the debugger */ swfdec_as_object_add (SWFDEC_AS_OBJECT (movie), SWFDEC_AS_CONTEXT (player), size); + /* only setup here, the resource assumes it can access the player via the movie */ + if (resource->movie == NULL) { + g_assert (SWFDEC_IS_SPRITE_MOVIE (movie)); + swfdec_resource_set_movie (resource, SWFDEC_SPRITE_MOVIE (movie)); + } return movie; } @@ -1372,7 +1380,7 @@ swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth) swfdec_movie_remove (copy); } copy = swfdec_movie_new (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context), depth, - parent, movie->graphic, name); + parent, movie->resource, movie->graphic, name); if (copy == NULL) return NULL; swfdec_movie_set_static_properties (copy, &movie->original_transform, @@ -1393,7 +1401,7 @@ swfdec_movie_new_for_content (SwfdecMovie *parent, const SwfdecContent *content) SWFDEC_DEBUG ("new movie for parent %p", parent); player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (parent)->context); - movie = swfdec_movie_new (player, content->depth, parent, content->graphic, + movie = swfdec_movie_new (player, content->depth, parent, parent->resource, content->graphic, content->name ? swfdec_as_context_get_string (SWFDEC_AS_CONTEXT (player), content->name) : NULL); swfdec_movie_set_static_properties (movie, content->has_transform ? &content->transform : NULL, diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h index f5f6887..5cac2a5 100644 --- a/libswfdec/swfdec_movie.h +++ b/libswfdec/swfdec_movie.h @@ -182,6 +182,7 @@ GType swfdec_movie_get_type (void); SwfdecMovie * swfdec_movie_new (SwfdecPlayer * player, int depth, SwfdecMovie * parent, + SwfdecResource * resource, SwfdecGraphic * graphic, const char * name); SwfdecMovie * swfdec_movie_new_for_content (SwfdecMovie * parent, diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index d14a5d8..73dce1b 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1578,7 +1578,7 @@ swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect) * swfdec_player_get_level: * @player: a #SwfdecPlayer * @name: name of the level to request - * @create: %TRUE to create if it doesn't exist + * @create: resource to create the movie with 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 @@ -1591,7 +1591,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 create) +swfdec_player_get_level (SwfdecPlayer *player, const char *name, SwfdecResource *create) { SwfdecSpriteMovie *movie; GList *walk; @@ -1623,11 +1623,11 @@ swfdec_player_get_level (SwfdecPlayer *player, const char *name, gboolean create break; } /* bail if create isn't set*/ - if (!create) + if (create == NULL) return NULL; /* create new root movie */ s = swfdec_as_context_give_string (SWFDEC_AS_CONTEXT (player), g_strdup_printf ("_level%lu", l)); - movie = SWFDEC_SPRITE_MOVIE (swfdec_movie_new (player, depth, NULL, NULL, s)); + movie = SWFDEC_SPRITE_MOVIE (swfdec_movie_new (player, depth, NULL, create, NULL, s)); SWFDEC_MOVIE (movie)->name = SWFDEC_AS_STR_EMPTY; return movie; } @@ -1636,14 +1636,15 @@ SwfdecMovie * swfdec_player_add_level_from_loader (SwfdecPlayer *player, guint depth, SwfdecLoader *loader, const char *variables) { + SwfdecResource *resource; SwfdecMovie *movie; const char *name; swfdec_player_remove_level (player, depth); name = swfdec_as_context_give_string (SWFDEC_AS_CONTEXT (player), g_strdup_printf ("_level%u", depth)); - movie = swfdec_movie_new (player, depth - 16384, NULL, NULL, name); + resource = swfdec_resource_new (loader, variables); + movie = swfdec_movie_new (player, depth - 16384, NULL, resource, NULL, name); movie->name = SWFDEC_AS_STR_EMPTY; - swfdec_resource_new (SWFDEC_SPRITE_MOVIE (movie), loader, variables); g_object_unref (loader); return movie; } diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index fa34f68..afaebeb 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -200,7 +200,7 @@ void swfdec_player_stop_all_sounds (SwfdecPlayer * player); SwfdecSpriteMovie * swfdec_player_get_level (SwfdecPlayer * player, const char * name, - gboolean create); + SwfdecResource * resource); SwfdecMovie * swfdec_player_add_level_from_loader (SwfdecPlayer * player, guint depth, diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 109018c..21c8a82 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -217,29 +217,32 @@ swfdec_resource_init (SwfdecResource *instance) } SwfdecResource * -swfdec_resource_new (SwfdecSpriteMovie *movie, SwfdecLoader *loader, const char *variables) +swfdec_resource_new (SwfdecLoader *loader, const char *variables) { - SwfdecMovie *mov; SwfdecResource *swf; - g_return_val_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie), NULL); g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); - mov = SWFDEC_MOVIE (movie); swf = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); /* set important variables */ swf->variables = g_strdup (variables); - swf->movie = movie; - if (mov->resource) - g_object_unref (mov->resource); - mov->resource = swf; /* set loader (that depends on those vars) */ swf->loader = g_object_ref (loader); - swfdec_loader_set_target (loader, SWFDEC_LOADER_TARGET (swf)); return swf; } +void +swfdec_resource_set_movie (SwfdecResource *resource, SwfdecSpriteMovie *movie) +{ + g_return_if_fail (SWFDEC_IS_RESOURCE (resource)); + g_return_if_fail (resource->movie == NULL); + g_return_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie)); + + resource->movie = movie; + swfdec_loader_set_target (resource->loader, SWFDEC_LOADER_TARGET (resource)); +} + gpointer swfdec_resource_get_export (SwfdecResource *instance, const char *name) { diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h index 2c456a0..8143d01 100644 --- a/libswfdec/swfdec_resource.h +++ b/libswfdec/swfdec_resource.h @@ -57,10 +57,10 @@ struct _SwfdecResourceClass GType swfdec_resource_get_type (void); -SwfdecResource * - swfdec_resource_new (SwfdecSpriteMovie * movie, - SwfdecLoader * loader, +SwfdecResource *swfdec_resource_new (SwfdecLoader * loader, const char * variables); +void swfdec_resource_set_movie (SwfdecResource * resource, + SwfdecSpriteMovie * movie); void swfdec_resource_advance (SwfdecResource * instance); diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 68c6fd7..bf80f93 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -263,7 +263,7 @@ swfdec_sprite_movie_perform_place (SwfdecSpriteMovie *movie, SwfdecBits *bits, g swfdec_event_list_free (events); return FALSE; } - cur = swfdec_movie_new (player, depth, mov, graphic, name); + cur = swfdec_movie_new (player, depth, mov, mov->resource, graphic, name); swfdec_movie_set_static_properties (cur, has_transform ? &transform : NULL, has_ctrans ? &ctrans : NULL, ratio, clip_depth, blend_mode, events); if (SWFDEC_IS_SPRITE_MOVIE (cur)) { @@ -714,6 +714,7 @@ void swfdec_sprite_movie_load (SwfdecSpriteMovie *movie, const char *url, SwfdecLoaderRequest request, SwfdecBuffer *data) { + SwfdecResource *resource; SwfdecLoader *loader; g_return_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie)); @@ -724,7 +725,10 @@ swfdec_sprite_movie_load (SwfdecSpriteMovie *movie, const char *url, SwfdecLoade /* FIXME: load relative to other movie? */ loader = swfdec_player_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context), url, request, data); - swfdec_resource_new (movie, loader, NULL); + resource = swfdec_resource_new (loader, NULL); + g_object_unref (SWFDEC_MOVIE (movie)->resource); + SWFDEC_MOVIE (movie)->resource = resource; + swfdec_resource_set_movie (resource, movie); g_object_unref (loader); } diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index 4cd0c0b..00e9be2 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -316,7 +316,7 @@ swfdec_sprite_movie_createEmptyMovieClip (SwfdecAsContext *cx, SwfdecAsObject *o movie = swfdec_movie_find (parent, depth); if (movie) swfdec_movie_remove (movie); - movie = swfdec_movie_new (SWFDEC_PLAYER (cx), depth, parent, NULL, name); + movie = swfdec_movie_new (SWFDEC_PLAYER (cx), depth, parent, parent->resource, NULL, name); swfdec_movie_initialize (movie); SWFDEC_AS_VALUE_SET_OBJECT (rval, SWFDEC_AS_OBJECT (movie)); } @@ -391,7 +391,7 @@ swfdec_sprite_movie_attachMovie (SwfdecAsContext *cx, SwfdecAsObject *object, ret = swfdec_movie_find (movie, depth); if (ret) swfdec_movie_remove (ret); - ret = swfdec_movie_new (SWFDEC_PLAYER (object->context), depth, movie, sprite, name); + ret = swfdec_movie_new (SWFDEC_PLAYER (object->context), depth, movie, movie->resource, sprite, name); SWFDEC_LOG ("attached %s (%u) as %s to depth %u", export, SWFDEC_CHARACTER (sprite)->id, ret->name, ret->depth); /* run init and construct */ diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c index 2930c66..16b04d7 100644 --- a/libswfdec/swfdec_text_field_movie_as.c +++ b/libswfdec/swfdec_text_field_movie_as.c @@ -882,7 +882,7 @@ swfdec_text_field_movie_createTextField (SwfdecAsContext *cx, if (movie) swfdec_movie_remove (movie); - movie = swfdec_movie_new (SWFDEC_PLAYER (cx), depth, parent, + movie = swfdec_movie_new (SWFDEC_PLAYER (cx), depth, parent, parent->resource, SWFDEC_GRAPHIC (edittext), name); g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (movie)); swfdec_movie_initialize (movie); commit 19d4a71aaf9967a70648324b143be5a743bf5d20 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 13:14:57 2007 +0200 special case guard == key diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index 1a88534..f739d27 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -32,13 +32,16 @@ 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)) { + if (guard == key) { + return g_object_ref (guard); + } else 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); + SWFDEC_FIXME ("merging flash securities - this should create the right type"); 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; commit 9a2800231e75f546285fd7728e0060f810f9b5b8 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 12:31:30 2007 +0200 set security when calling functions diff --git a/libswfdec/swfdec_button_movie.c b/libswfdec/swfdec_button_movie.c index 2e1d80b..3aad8fd 100644 --- a/libswfdec/swfdec_button_movie.c +++ b/libswfdec/swfdec_button_movie.c @@ -108,7 +108,8 @@ swfdec_button_movie_execute (SwfdecButtonMovie *movie, } if (movie->button->events) swfdec_event_list_execute (movie->button->events, - SWFDEC_AS_OBJECT (SWFDEC_MOVIE (movie)->parent), condition, 0); + SWFDEC_AS_OBJECT (SWFDEC_MOVIE (movie)->parent), + SWFDEC_SECURITY (SWFDEC_MOVIE (movie)->resource), condition, 0); name = swfdec_button_condition_get_name (condition); swfdec_as_object_call (SWFDEC_AS_OBJECT (movie), name, 0, NULL, NULL); } diff --git a/libswfdec/swfdec_event.c b/libswfdec/swfdec_event.c index 06ce46e..03f05fa 100644 --- a/libswfdec/swfdec_event.c +++ b/libswfdec/swfdec_event.c @@ -212,12 +212,13 @@ swfdec_event_list_parse (SwfdecEventList *list, SwfdecBits *bits, int version, void swfdec_event_list_execute (SwfdecEventList *list, SwfdecAsObject *object, - guint condition, guint8 key) + SwfdecSecurity *sec, guint condition, guint8 key) { guint i; g_return_if_fail (list != NULL); g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); + g_return_if_fail (SWFDEC_IS_SECURITY (sec)); /* FIXME: Do we execute all events if the event list is gone already? */ /* need to ref here because followup code could free all references to the list */ @@ -227,7 +228,7 @@ swfdec_event_list_execute (SwfdecEventList *list, SwfdecAsObject *object, if ((event->conditions & condition) && event->key == key) { SWFDEC_LOG ("executing script for event %u on scriptable %p", condition, object); - swfdec_as_object_run (object, event->script); + swfdec_as_object_run_with_security (object, event->script, sec); } } swfdec_event_list_free (list); diff --git a/libswfdec/swfdec_event.h b/libswfdec/swfdec_event.h index 6c5be7f..3ee42cc 100644 --- a/libswfdec/swfdec_event.h +++ b/libswfdec/swfdec_event.h @@ -20,6 +20,7 @@ #include <libswfdec/swfdec_bits.h> #include <libswfdec/swfdec_as_types.h> #include <libswfdec/swfdec_player.h> +#include <libswfdec/swfdec_security.h> #include <libswfdec/swfdec_types.h> #ifndef _SWFDEC_EVENT_H_ @@ -63,6 +64,7 @@ void swfdec_event_list_parse (SwfdecEventList * list, const char * description); void swfdec_event_list_execute (SwfdecEventList * list, SwfdecAsObject * object, + SwfdecSecurity * sec, guint condition, guint8 key); gboolean swfdec_event_list_has_conditions(SwfdecEventList * list, diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 8a3607d..41a0007 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -387,8 +387,8 @@ swfdec_movie_execute_script (SwfdecMovie *movie, SwfdecEventType condition) g_return_if_fail (condition != 0); if (movie->events) { - swfdec_event_list_execute (movie->events, - SWFDEC_AS_OBJECT (movie), condition, 0); + swfdec_event_list_execute (movie->events, SWFDEC_AS_OBJECT (movie), + SWFDEC_SECURITY (movie->resource), condition, 0); } name = swfdec_event_type_get_name (condition); if (name != NULL) diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index e3dd583..109018c 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -292,7 +292,8 @@ swfdec_resource_advance (SwfdecResource *instance) SwfdecRootAction *action = &g_array_index (array, SwfdecRootAction, i); switch (action->type) { case SWFDEC_ROOT_ACTION_INIT_SCRIPT: - swfdec_as_object_run (SWFDEC_AS_OBJECT (instance->movie), action->data); + swfdec_as_object_run_with_security (SWFDEC_AS_OBJECT (instance->movie), + action->data, SWFDEC_SECURITY (instance)); break; case SWFDEC_ROOT_ACTION_EXPORT: { diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 78b1978..68c6fd7 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -55,7 +55,8 @@ swfdec_sprite_movie_remove_child (SwfdecMovie *movie, int depth) static void swfdec_sprite_movie_run_script (gpointer movie, gpointer data) { - swfdec_as_object_run (movie, data); + swfdec_as_object_run_with_security (movie, data, + SWFDEC_SECURITY (SWFDEC_MOVIE (movie)->resource)); } static int commit c14e87b2e8c4976ba0934a653fb18c09904335a7 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 12:12:12 2007 +0200 rename swfdec_swf_instance.[ch] => swfdec_resource.[ch] diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 3bab53b..c67f132 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -95,6 +95,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES = \ swfdec_player_as.c \ swfdec_rect.c \ swfdec_rectangle.c \ + swfdec_resource.c \ swfdec_ringbuffer.c \ swfdec_script.c \ swfdec_security.c \ @@ -110,7 +111,6 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES = \ swfdec_stage_as.c \ swfdec_style_sheet.c \ swfdec_swf_decoder.c \ - swfdec_swf_instance.c \ swfdec_system.c \ swfdec_system_as.c \ swfdec_tag.c \ @@ -218,6 +218,7 @@ noinst_HEADERS = \ swfdec_pattern.h \ swfdec_player_internal.h \ swfdec_rect.h \ + swfdec_resource.h \ swfdec_ringbuffer.h \ swfdec_script_internal.h \ swfdec_security.h \ @@ -230,7 +231,6 @@ noinst_HEADERS = \ swfdec_sprite_movie.h \ swfdec_style_sheet.h \ swfdec_swf_decoder.h \ - swfdec_swf_instance.h \ swfdec_stroke.h \ swfdec_tag.h \ swfdec_text.h \ diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index bd8ae18..42f8dd8 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -41,7 +41,7 @@ #include "swfdec_player_internal.h" #include "swfdec_sprite.h" #include "swfdec_sprite_movie.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" #include "swfdec_text_field_movie.h" // for typeof /* Define this to get SWFDEC_WARN'd about missing properties of objects. diff --git a/libswfdec/swfdec_graphic_movie.c b/libswfdec/swfdec_graphic_movie.c index 4ffd2ce..a1e86af 100644 --- a/libswfdec/swfdec_graphic_movie.c +++ b/libswfdec/swfdec_graphic_movie.c @@ -29,7 +29,7 @@ #include "swfdec_shape.h" #include "swfdec_sprite.h" #include "swfdec_swf_decoder.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" #include "swfdec_text.h" G_DEFINE_TYPE (SwfdecGraphicMovie, swfdec_graphic_movie, SWFDEC_TYPE_MOVIE) diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index f7cef8b..8a3607d 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -39,7 +39,7 @@ #include "swfdec_player_internal.h" #include "swfdec_sprite.h" #include "swfdec_sprite_movie.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" #include "swfdec_system.h" #include "swfdec_utils.h" #include "swfdec_load_object.h" diff --git a/libswfdec/swfdec_movie_asprops.c b/libswfdec/swfdec_movie_asprops.c index 3a77906..deb8d7a 100644 --- a/libswfdec/swfdec_movie_asprops.c +++ b/libswfdec/swfdec_movie_asprops.c @@ -32,7 +32,7 @@ #include "swfdec_player_internal.h" #include "swfdec_sprite.h" #include "swfdec_sprite_movie.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" static void mc_x_get (SwfdecMovie *movie, SwfdecAsValue *rval) diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index f70f438..d14a5d8 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -44,7 +44,7 @@ #include "swfdec_movie.h" #include "swfdec_script_internal.h" #include "swfdec_sprite_movie.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" #include "swfdec_utils.h" /*** gtk-doc ***/ diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c new file mode 100644 index 0000000..e3dd583 --- /dev/null +++ b/libswfdec/swfdec_resource.c @@ -0,0 +1,308 @@ +/* Swfdec + * Copyright (C) 2006-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 <errno.h> +#include <stdlib.h> +#include <string.h> +#include "swfdec_resource.h" +#include "swfdec_as_internal.h" +#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" +#include "swfdec_player_internal.h" +#include "swfdec_script.h" +#include "swfdec_sprite.h" +#include "swfdec_swf_decoder.h" +#include "swfdec_utils.h" + + +static void swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface); +G_DEFINE_TYPE_WITH_CODE (SwfdecResource, swfdec_resource, SWFDEC_TYPE_FLASH_SECURITY, + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_resource_loader_target_init)) + +/*** SWFDEC_LOADER_TARGET interface ***/ + +static SwfdecPlayer * +swfdec_resource_loader_target_get_player (SwfdecLoaderTarget *target) +{ + return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (SWFDEC_RESOURCE (target)->movie)->context); +} + +static void +swfdec_resource_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_resource_loader_target_image (SwfdecResource *instance) +{ + SwfdecSpriteMovie *movie = instance->movie; + + if (movie->sprite != NULL) + return; + + if (SWFDEC_IS_SWF_DECODER (instance->decoder)) { + 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_resource_allow_network (player); + } else if (SWFDEC_IS_FLV_DECODER (instance->decoder)) { + /* nothing to do, please move along */ + } else { + g_assert_not_reached (); + } +} + +static void +swfdec_resource_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *loader) +{ + SwfdecResource *instance = SWFDEC_RESOURCE (target); + const char *query; + + query = swfdec_url_get_query (swfdec_loader_get_url (loader)); + if (query) { + SWFDEC_INFO ("set url query movie variables: %s", query); + swfdec_movie_set_variables (SWFDEC_MOVIE (instance->movie), query); + } + if (instance->variables) { + SWFDEC_INFO ("set manual movie variables: %s", instance->variables); + swfdec_movie_set_variables (SWFDEC_MOVIE (instance->movie), instance->variables); + } +} + +static void +swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) +{ + SwfdecResource *instance = SWFDEC_RESOURCE (target); + SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (instance->movie)->context); + SwfdecDecoder *dec = instance->decoder; + SwfdecDecoderClass *klass; + + if (dec == NULL) { + if (!swfdec_decoder_can_detect (loader->queue)) + return; + dec = swfdec_decoder_new (player, loader->queue); + if (dec == NULL) { + SWFDEC_ERROR ("no decoder found"); + swfdec_loader_set_target (loader, NULL); + return; + } + + if (SWFDEC_IS_FLV_DECODER (dec)) { + swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_FLV); + swfdec_flv_decoder_add_movie (SWFDEC_FLV_DECODER (dec), SWFDEC_MOVIE (instance->movie)); + } else if (SWFDEC_IS_SWF_DECODER (dec)) { + swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_SWF); + instance->decoder = dec; + } else { + SWFDEC_FIXME ("implement handling of %s", G_OBJECT_TYPE_NAME (dec)); + g_object_unref (dec); + swfdec_loader_set_target (loader, NULL); + return; + } + /* HACK for flv playback */ + if (target != loader->target) { + swfdec_loader_target_parse (loader->target, loader); + return; + } + } + klass = SWFDEC_DECODER_GET_CLASS (dec); + g_return_if_fail (klass->parse); + while (TRUE) { + SwfdecStatus status = klass->parse (dec); + switch (status) { + case SWFDEC_STATUS_ERROR: + SWFDEC_ERROR ("parsing error"); + swfdec_loader_set_target (loader, NULL); + return; + case SWFDEC_STATUS_OK: + break; + case SWFDEC_STATUS_NEEDBITS: + return; + case SWFDEC_STATUS_IMAGE: + swfdec_resource_loader_target_image (instance); + break; + case SWFDEC_STATUS_INIT: + swfdec_player_initialize (player, + SWFDEC_IS_SWF_DECODER (dec) ? SWFDEC_SWF_DECODER (dec)->version : 7, /* <-- HACK */ + dec->rate, dec->width, dec->height); + break; + case SWFDEC_STATUS_EOF: + return; + default: + g_assert_not_reached (); + return; + } + } +} + +static void +swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface) +{ + iface->get_player = swfdec_resource_loader_target_get_player; + iface->open = swfdec_resource_loader_target_open; + iface->parse = swfdec_resource_loader_target_parse; +} + +static void +swfdec_resource_dispose (GObject *object) +{ + SwfdecResource *instance = SWFDEC_RESOURCE (object); + + swfdec_loader_set_target (instance->loader, NULL); + g_object_unref (instance->loader); + if (instance->decoder) { + g_object_unref (instance->decoder); + instance->decoder = NULL; + } + g_free (instance->variables); + g_hash_table_destroy (instance->exports); + g_hash_table_destroy (instance->export_names); + + G_OBJECT_CLASS (swfdec_resource_parent_class)->dispose (object); +} + +static void +swfdec_resource_class_init (SwfdecResourceClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = swfdec_resource_dispose; +} + +static void +swfdec_resource_init (SwfdecResource *instance) +{ + instance->exports = g_hash_table_new (swfdec_str_case_hash, swfdec_str_case_equal); + instance->export_names = g_hash_table_new (g_direct_hash, g_direct_equal); +} + +SwfdecResource * +swfdec_resource_new (SwfdecSpriteMovie *movie, SwfdecLoader *loader, const char *variables) +{ + SwfdecMovie *mov; + SwfdecResource *swf; + + g_return_val_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie), NULL); + g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); + + mov = SWFDEC_MOVIE (movie); + swf = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); + /* set important variables */ + swf->variables = g_strdup (variables); + swf->movie = movie; + if (mov->resource) + g_object_unref (mov->resource); + mov->resource = swf; + /* set loader (that depends on those vars) */ + swf->loader = g_object_ref (loader); + swfdec_loader_set_target (loader, SWFDEC_LOADER_TARGET (swf)); + + return swf; +} + +gpointer +swfdec_resource_get_export (SwfdecResource *instance, const char *name) +{ + g_return_val_if_fail (SWFDEC_IS_RESOURCE (instance), NULL); + g_return_val_if_fail (name != NULL, NULL); + + return g_hash_table_lookup (instance->exports, name); +} + +const char * +swfdec_resource_get_export_name (SwfdecResource *instance, SwfdecCharacter *character) +{ + g_return_val_if_fail (SWFDEC_IS_RESOURCE (instance), NULL); + g_return_val_if_fail (SWFDEC_IS_CHARACTER (character), NULL); + + return g_hash_table_lookup (instance->export_names, character); +} + +static void +swfdec_resource_add_export (SwfdecResource *instance, SwfdecCharacter *character, const char *name) +{ + g_return_if_fail (SWFDEC_IS_RESOURCE (instance)); + g_return_if_fail (SWFDEC_IS_CHARACTER (character)); + g_return_if_fail (name != NULL); + + g_hash_table_insert (instance->exports, (char *) name, character); + g_hash_table_insert (instance->export_names, character, (char *) name); +} + +void +swfdec_resource_advance (SwfdecResource *instance) +{ + SwfdecSwfDecoder *s; + GArray *array; + guint i; + + g_return_if_fail (SWFDEC_IS_RESOURCE (instance)); + + s = SWFDEC_SWF_DECODER (instance->decoder); + SWFDEC_LOG ("performing actions for frame %u", instance->parse_frame); + if (s->root_actions) { + array = s->root_actions[instance->parse_frame]; + } else { + array = NULL; + } + instance->parse_frame++; + if (array == NULL) + return; + for (i = 0; i < array->len; i++) { + SwfdecRootAction *action = &g_array_index (array, SwfdecRootAction, i); + switch (action->type) { + case SWFDEC_ROOT_ACTION_INIT_SCRIPT: + swfdec_as_object_run (SWFDEC_AS_OBJECT (instance->movie), action->data); + break; + case SWFDEC_ROOT_ACTION_EXPORT: + { + SwfdecRootExportData *data = action->data; + swfdec_resource_add_export (instance, data->character, data->name); + } + break; + default: + g_assert_not_reached (); + } + } +} + diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h new file mode 100644 index 0000000..2c456a0 --- /dev/null +++ b/libswfdec/swfdec_resource.h @@ -0,0 +1,73 @@ +/* Swfdec + * Copyright (C) 2006-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_RESOURCE_H_ +#define _SWFDEC_RESOURCE_H_ + +#include <libswfdec/swfdec_player.h> +#include <libswfdec/swfdec_flash_security.h> +#include <libswfdec/swfdec_sprite_movie.h> + +G_BEGIN_DECLS + +//typedef struct _SwfdecResource SwfdecResource; +typedef struct _SwfdecResourceClass SwfdecResourceClass; + +#define SWFDEC_TYPE_RESOURCE (swfdec_resource_get_type()) +#define SWFDEC_IS_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_RESOURCE)) +#define SWFDEC_IS_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_RESOURCE)) +#define SWFDEC_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_RESOURCE, SwfdecResource)) +#define SWFDEC_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_RESOURCE, SwfdecResourceClass)) + +struct _SwfdecResource +{ + SwfdecFlashSecurity flash_security; + + SwfdecSpriteMovie * movie; /* the movie responsible for creating this instance */ + guint parse_frame; /* next frame to parse */ + + SwfdecLoader * loader; /* the loader providing data for the decoder */ + SwfdecDecoder * decoder; /* decoder that decoded all the stuff used by us */ + char * variables; /* extra variables to be set */ + + GHashTable * exports; /* string->SwfdecCharacter mapping of exported characters */ + GHashTable * export_names; /* SwfdecCharacter->string mapping of exported characters */ +}; + +struct _SwfdecResourceClass +{ + SwfdecFlashSecurityClass flash_security_class; +}; + +GType swfdec_resource_get_type (void); + +SwfdecResource * + swfdec_resource_new (SwfdecSpriteMovie * movie, + SwfdecLoader * loader, + const char * variables); + +void swfdec_resource_advance (SwfdecResource * instance); + +gpointer swfdec_resource_get_export (SwfdecResource * root, + const char * name); +const char * swfdec_resource_get_export_name (SwfdecResource * root, + SwfdecCharacter * character); + +G_END_DECLS +#endif diff --git a/libswfdec/swfdec_sound_object.c b/libswfdec/swfdec_sound_object.c index 2089eb6..85e870e 100644 --- a/libswfdec/swfdec_sound_object.c +++ b/libswfdec/swfdec_sound_object.c @@ -32,7 +32,7 @@ #include "swfdec_debug.h" #include "swfdec_internal.h" #include "swfdec_player_internal.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" /*** SwfdecSoundObject ***/ diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index a8df92b..78b1978 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -35,7 +35,7 @@ #include "swfdec_ringbuffer.h" #include "swfdec_script.h" #include "swfdec_sprite.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" #include "swfdec_tag.h" /*** SWFDEC_SPRITE_MOVIE ***/ diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index 8e566c3..4cd0c0b 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -34,7 +34,7 @@ #include "swfdec_sprite.h" #include "swfdec_sprite_movie.h" #include "swfdec_swf_decoder.h" -#include "swfdec_swf_instance.h" +#include "swfdec_resource.h" #include "swfdec_as_internal.h" SWFDEC_AS_NATIVE (900, 12, swfdec_sprite_movie_play) diff --git a/libswfdec/swfdec_swf_instance.c b/libswfdec/swfdec_swf_instance.c deleted file mode 100644 index c77df13..0000000 --- a/libswfdec/swfdec_swf_instance.c +++ /dev/null @@ -1,308 +0,0 @@ -/* Swfdec - * Copyright (C) 2006-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 <errno.h> -#include <stdlib.h> -#include <string.h> -#include "swfdec_swf_instance.h" -#include "swfdec_as_internal.h" -#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" -#include "swfdec_player_internal.h" -#include "swfdec_script.h" -#include "swfdec_sprite.h" -#include "swfdec_swf_decoder.h" -#include "swfdec_utils.h" - - -static void swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface); -G_DEFINE_TYPE_WITH_CODE (SwfdecResource, swfdec_resource, SWFDEC_TYPE_FLASH_SECURITY, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_resource_loader_target_init)) - -/*** SWFDEC_LOADER_TARGET interface ***/ - -static SwfdecPlayer * -swfdec_resource_loader_target_get_player (SwfdecLoaderTarget *target) -{ - return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (SWFDEC_RESOURCE (target)->movie)->context); -} - -static void -swfdec_resource_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_resource_loader_target_image (SwfdecResource *instance) -{ - SwfdecSpriteMovie *movie = instance->movie; - - if (movie->sprite != NULL) - return; - - if (SWFDEC_IS_SWF_DECODER (instance->decoder)) { - 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_resource_allow_network (player); - } else if (SWFDEC_IS_FLV_DECODER (instance->decoder)) { - /* nothing to do, please move along */ - } else { - g_assert_not_reached (); - } -} - -static void -swfdec_resource_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *loader) -{ - SwfdecResource *instance = SWFDEC_RESOURCE (target); - const char *query; - - query = swfdec_url_get_query (swfdec_loader_get_url (loader)); - if (query) { - SWFDEC_INFO ("set url query movie variables: %s", query); - swfdec_movie_set_variables (SWFDEC_MOVIE (instance->movie), query); - } - if (instance->variables) { - SWFDEC_INFO ("set manual movie variables: %s", instance->variables); - swfdec_movie_set_variables (SWFDEC_MOVIE (instance->movie), instance->variables); - } -} - -static void -swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) -{ - SwfdecResource *instance = SWFDEC_RESOURCE (target); - SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (instance->movie)->context); - SwfdecDecoder *dec = instance->decoder; - SwfdecDecoderClass *klass; - - if (dec == NULL) { - if (!swfdec_decoder_can_detect (loader->queue)) - return; - dec = swfdec_decoder_new (player, loader->queue); - if (dec == NULL) { - SWFDEC_ERROR ("no decoder found"); - swfdec_loader_set_target (loader, NULL); - return; - } - - if (SWFDEC_IS_FLV_DECODER (dec)) { - swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_FLV); - swfdec_flv_decoder_add_movie (SWFDEC_FLV_DECODER (dec), SWFDEC_MOVIE (instance->movie)); - } else if (SWFDEC_IS_SWF_DECODER (dec)) { - swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_SWF); - instance->decoder = dec; - } else { - SWFDEC_FIXME ("implement handling of %s", G_OBJECT_TYPE_NAME (dec)); - g_object_unref (dec); - swfdec_loader_set_target (loader, NULL); - return; - } - /* HACK for flv playback */ - if (target != loader->target) { - swfdec_loader_target_parse (loader->target, loader); - return; - } - } - klass = SWFDEC_DECODER_GET_CLASS (dec); - g_return_if_fail (klass->parse); - while (TRUE) { - SwfdecStatus status = klass->parse (dec); - switch (status) { - case SWFDEC_STATUS_ERROR: - SWFDEC_ERROR ("parsing error"); - swfdec_loader_set_target (loader, NULL); - return; - case SWFDEC_STATUS_OK: - break; - case SWFDEC_STATUS_NEEDBITS: - return; - case SWFDEC_STATUS_IMAGE: - swfdec_resource_loader_target_image (instance); - break; - case SWFDEC_STATUS_INIT: - swfdec_player_initialize (player, - SWFDEC_IS_SWF_DECODER (dec) ? SWFDEC_SWF_DECODER (dec)->version : 7, /* <-- HACK */ - dec->rate, dec->width, dec->height); - break; - case SWFDEC_STATUS_EOF: - return; - default: - g_assert_not_reached (); - return; - } - } -} - -static void -swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface) -{ - iface->get_player = swfdec_resource_loader_target_get_player; - iface->open = swfdec_resource_loader_target_open; - iface->parse = swfdec_resource_loader_target_parse; -} - -static void -swfdec_resource_dispose (GObject *object) -{ - SwfdecResource *instance = SWFDEC_RESOURCE (object); - - swfdec_loader_set_target (instance->loader, NULL); - g_object_unref (instance->loader); - if (instance->decoder) { - g_object_unref (instance->decoder); - instance->decoder = NULL; - } - g_free (instance->variables); - g_hash_table_destroy (instance->exports); - g_hash_table_destroy (instance->export_names); - - G_OBJECT_CLASS (swfdec_resource_parent_class)->dispose (object); -} - -static void -swfdec_resource_class_init (SwfdecResourceClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = swfdec_resource_dispose; -} - -static void -swfdec_resource_init (SwfdecResource *instance) -{ - instance->exports = g_hash_table_new (swfdec_str_case_hash, swfdec_str_case_equal); - instance->export_names = g_hash_table_new (g_direct_hash, g_direct_equal); -} - -SwfdecResource * -swfdec_resource_new (SwfdecSpriteMovie *movie, SwfdecLoader *loader, const char *variables) -{ - SwfdecMovie *mov; - SwfdecResource *swf; - - g_return_val_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie), NULL); - g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); - - mov = SWFDEC_MOVIE (movie); - swf = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); - /* set important variables */ - swf->variables = g_strdup (variables); - swf->movie = movie; - if (mov->resource) - g_object_unref (mov->resource); - mov->resource = swf; - /* set loader (that depends on those vars) */ - swf->loader = g_object_ref (loader); - swfdec_loader_set_target (loader, SWFDEC_LOADER_TARGET (swf)); - - return swf; -} - -gpointer -swfdec_resource_get_export (SwfdecResource *instance, const char *name) -{ - g_return_val_if_fail (SWFDEC_IS_RESOURCE (instance), NULL); - g_return_val_if_fail (name != NULL, NULL); - - return g_hash_table_lookup (instance->exports, name); -} - -const char * -swfdec_resource_get_export_name (SwfdecResource *instance, SwfdecCharacter *character) -{ - g_return_val_if_fail (SWFDEC_IS_RESOURCE (instance), NULL); - g_return_val_if_fail (SWFDEC_IS_CHARACTER (character), NULL); - - return g_hash_table_lookup (instance->export_names, character); -} - -static void -swfdec_resource_add_export (SwfdecResource *instance, SwfdecCharacter *character, const char *name) -{ - g_return_if_fail (SWFDEC_IS_RESOURCE (instance)); - g_return_if_fail (SWFDEC_IS_CHARACTER (character)); - g_return_if_fail (name != NULL); - - g_hash_table_insert (instance->exports, (char *) name, character); - g_hash_table_insert (instance->export_names, character, (char *) name); -} - -void -swfdec_resource_advance (SwfdecResource *instance) -{ - SwfdecSwfDecoder *s; - GArray *array; - guint i; - - g_return_if_fail (SWFDEC_IS_RESOURCE (instance)); - - s = SWFDEC_SWF_DECODER (instance->decoder); - SWFDEC_LOG ("performing actions for frame %u", instance->parse_frame); - if (s->root_actions) { - array = s->root_actions[instance->parse_frame]; - } else { - array = NULL; - } - instance->parse_frame++; - if (array == NULL) - return; - for (i = 0; i < array->len; i++) { - SwfdecRootAction *action = &g_array_index (array, SwfdecRootAction, i); - switch (action->type) { - case SWFDEC_ROOT_ACTION_INIT_SCRIPT: - swfdec_as_object_run (SWFDEC_AS_OBJECT (instance->movie), action->data); - break; - case SWFDEC_ROOT_ACTION_EXPORT: - { - SwfdecRootExportData *data = action->data; - swfdec_resource_add_export (instance, data->character, data->name); - } - break; - default: - g_assert_not_reached (); - } - } -} - diff --git a/libswfdec/swfdec_swf_instance.h b/libswfdec/swfdec_swf_instance.h deleted file mode 100644 index 2c456a0..0000000 --- a/libswfdec/swfdec_swf_instance.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Swfdec - * Copyright (C) 2006-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_RESOURCE_H_ -#define _SWFDEC_RESOURCE_H_ - -#include <libswfdec/swfdec_player.h> -#include <libswfdec/swfdec_flash_security.h> -#include <libswfdec/swfdec_sprite_movie.h> - -G_BEGIN_DECLS - -//typedef struct _SwfdecResource SwfdecResource; -typedef struct _SwfdecResourceClass SwfdecResourceClass; - -#define SWFDEC_TYPE_RESOURCE (swfdec_resource_get_type()) -#define SWFDEC_IS_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_RESOURCE)) -#define SWFDEC_IS_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_RESOURCE)) -#define SWFDEC_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_RESOURCE, SwfdecResource)) -#define SWFDEC_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_RESOURCE, SwfdecResourceClass)) - -struct _SwfdecResource -{ - SwfdecFlashSecurity flash_security; - - SwfdecSpriteMovie * movie; /* the movie responsible for creating this instance */ - guint parse_frame; /* next frame to parse */ - - SwfdecLoader * loader; /* the loader providing data for the decoder */ - SwfdecDecoder * decoder; /* decoder that decoded all the stuff used by us */ - char * variables; /* extra variables to be set */ - - GHashTable * exports; /* string->SwfdecCharacter mapping of exported characters */ - GHashTable * export_names; /* SwfdecCharacter->string mapping of exported characters */ -}; - -struct _SwfdecResourceClass -{ - SwfdecFlashSecurityClass flash_security_class; -}; - -GType swfdec_resource_get_type (void); - -SwfdecResource * - swfdec_resource_new (SwfdecSpriteMovie * movie, - SwfdecLoader * loader, - const char * variables); - -void swfdec_resource_advance (SwfdecResource * instance); - -gpointer swfdec_resource_get_export (SwfdecResource * root, - const char * name); -const char * swfdec_resource_get_export_name (SwfdecResource * root, - SwfdecCharacter * character); - -G_END_DECLS -#endif commit e5d5472ddd24ed00d54039f853b7ac74eef89ba3 Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 12:09:33 2007 +0200 rename SwfdecSwfInstance to SwfdecResource also add convenience function swfdec_movie_get_own_resource() diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index f3133b9..bd8ae18 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -268,25 +268,26 @@ swfdec_action_wait_for_frame2 (SwfdecAsContext *cx, guint action, const guint8 * static void swfdec_action_wait_for_frame (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecSpriteMovie *movie; + SwfdecMovie *movie; + SwfdecResource *resource; guint frame, jump, loaded; if (len != 3) { SWFDEC_ERROR ("WaitForFrame action length invalid (is %u, should be 3", len); return; } - if (!SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { + if (!SWFDEC_IS_MOVIE (cx->frame->target)) { SWFDEC_ERROR ("no movie for WaitForFrame"); return; } - movie = SWFDEC_SPRITE_MOVIE (cx->frame->target); + movie = SWFDEC_MOVIE (cx->frame->target); frame = data[0] || (data[1] << 8); jump = data[2]; - if (SWFDEC_MOVIE (movie)->swf->movie == movie) { - SwfdecDecoder *dec = SWFDEC_MOVIE (movie)->swf->decoder; + resource = swfdec_movie_get_own_resource (movie); + if (resource) { + SwfdecDecoder *dec = resource->decoder; loaded = dec->frames_loaded; - g_assert (loaded <= movie->n_frames); if (loaded == dec->frames_total) loaded = G_MAXUINT; } else { diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 852f011..f7cef8b 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -927,9 +927,9 @@ swfdec_movie_dispose (GObject *object) g_assert (movie->list == NULL); SWFDEC_LOG ("disposing movie %s (depth %d)", movie->name, movie->depth); - if (movie->swf) { - g_object_unref (movie->swf); - movie->swf = NULL; + if (movie->resource) { + g_object_unref (movie->resource); + movie->resource = NULL; } if (movie->events) { swfdec_event_list_free (movie->events); @@ -1258,7 +1258,7 @@ swfdec_movie_new (SwfdecPlayer *player, int depth, SwfdecMovie *parent, SwfdecGr /* set essential properties */ movie->parent = parent; if (parent) { - movie->swf = g_object_ref (parent->swf); + movie->resource = g_object_ref (parent->resource); parent->list = g_list_insert_sorted (parent->list, movie, swfdec_movie_compare_depths); SWFDEC_DEBUG ("inserting %s %s (depth %d) into %s %p", G_OBJECT_TYPE_NAME (movie), movie->name, movie->depth, G_OBJECT_TYPE_NAME (parent), parent); @@ -1524,3 +1524,28 @@ swfdec_depth_classify (int depth) return SWFDEC_DEPTH_CLASS_RESERVED; return SWFDEC_DEPTH_CLASS_EMPTY; } + +/** + * swfdec_movie_get_own_resource: + * @movie: movie to query + * + * Queries the movie for his own resource. A movie only has its own resource if + * it contains data loaded with the loadMovie() function, or if it is the root + * movie. + * + * Returns: The own resource of @movie or %NULL + **/ +SwfdecResource * +swfdec_movie_get_own_resource (SwfdecMovie *movie) +{ + g_return_val_if_fail (SWFDEC_IS_MOVIE (movie), NULL); + + if (!SWFDEC_IS_SPRITE_MOVIE (movie)) + return NULL; + + if (SWFDEC_MOVIE (movie->resource->movie) != movie) + return NULL; + + return movie->resource; +} + diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h index 0ea66aa..f5f6887 100644 --- a/libswfdec/swfdec_movie.h +++ b/libswfdec/swfdec_movie.h @@ -114,7 +114,7 @@ struct _SwfdecMovie { /* parenting information */ SwfdecMovie * parent; /* movie that contains us or NULL for root movies */ - SwfdecSwfInstance * swf; /* the instance that created us */ + SwfdecResource * resource; /* the resource that created us */ /* positioning - the values are applied in this order */ SwfdecRect extents; /* the extents occupied after transform is applied */ @@ -272,6 +272,7 @@ void swfdec_movie_remove_variable_listener (SwfdecMovie * movie, SwfdecAsObject * object, const char * name, const SwfdecMovieVariableListenerFunction function); +SwfdecResource *swfdec_movie_get_own_resource (SwfdecMovie * movie); G_END_DECLS #endif diff --git a/libswfdec/swfdec_movie_asprops.c b/libswfdec/swfdec_movie_asprops.c index 517d0ad..3a77906 100644 --- a/libswfdec/swfdec_movie_asprops.c +++ b/libswfdec/swfdec_movie_asprops.c @@ -391,7 +391,7 @@ mc_url_get (SwfdecMovie *movie, SwfdecAsValue *rval) { SWFDEC_AS_VALUE_SET_STRING (rval, swfdec_as_context_get_string ( SWFDEC_AS_OBJECT (movie)->context, - swfdec_url_get_url (swfdec_loader_get_url (movie->swf->loader)))); + swfdec_url_get_url (swfdec_loader_get_url (movie->resource->loader)))); } struct { diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index e4e8eee..f70f438 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1643,7 +1643,7 @@ swfdec_player_add_level_from_loader (SwfdecPlayer *player, guint depth, name = swfdec_as_context_give_string (SWFDEC_AS_CONTEXT (player), g_strdup_printf ("_level%u", depth)); movie = swfdec_movie_new (player, depth - 16384, NULL, NULL, name); movie->name = SWFDEC_AS_STR_EMPTY; - swfdec_swf_instance_new (SWFDEC_SPRITE_MOVIE (movie), loader, variables); + swfdec_resource_new (SWFDEC_SPRITE_MOVIE (movie), loader, variables); g_object_unref (loader); return movie; } diff --git a/libswfdec/swfdec_sound_object.c b/libswfdec/swfdec_sound_object.c index c464bda..2089eb6 100644 --- a/libswfdec/swfdec_sound_object.c +++ b/libswfdec/swfdec_sound_object.c @@ -83,7 +83,7 @@ swfdec_sound_object_get_sound (SwfdecSoundObject *sound, const char *name) if (sound->target == NULL) return NULL; - return swfdec_swf_instance_get_export (sound->target->swf, name); + return swfdec_resource_get_export (sound->target->resource, name); } /*** AS CODE ***/ diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 74dd86e..a8df92b 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -61,7 +61,7 @@ swfdec_sprite_movie_run_script (gpointer movie, gpointer data) static int swfdec_get_clipeventflags (SwfdecMovie *movie, SwfdecBits * bits) { - if (SWFDEC_SWF_DECODER (movie->swf->decoder)->version <= 5) { + if (SWFDEC_SWF_DECODER (movie->resource->decoder)->version <= 5) { return swfdec_bits_get_u16 (bits); } else { return swfdec_bits_get_u32 (bits); @@ -74,6 +74,7 @@ swfdec_sprite_movie_perform_place (SwfdecSpriteMovie *movie, SwfdecBits *bits, g SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context); SwfdecMovie *mov = SWFDEC_MOVIE (movie); SwfdecMovie *cur; + SwfdecSwfDecoder *dec; gboolean has_clip_actions; gboolean has_clip_depth; gboolean has_name; @@ -95,7 +96,8 @@ swfdec_sprite_movie_perform_place (SwfdecSpriteMovie *movie, SwfdecBits *bits, g guint blend_mode; SwfdecGraphic *graphic; - version = SWFDEC_SWF_DECODER (mov->swf->decoder)->version; + dec = SWFDEC_SWF_DECODER (mov->resource->decoder); + version = dec->version; /* 1) check which stuff is set */ has_clip_actions = swfdec_bits_getbit (bits); @@ -236,7 +238,7 @@ swfdec_sprite_movie_perform_place (SwfdecSpriteMovie *movie, SwfdecBits *bits, g /* 3) perform the actions depending on the set properties */ cur = swfdec_movie_find (mov, depth); - graphic = swfdec_swf_decoder_get_character (SWFDEC_SWF_DECODER (mov->swf->decoder), id); + graphic = swfdec_swf_decoder_get_character (dec, id); if (move) { if (cur == NULL) { SWFDEC_INFO ("no movie at depth %d, ignoring move command", depth); @@ -284,7 +286,7 @@ swfdec_sprite_movie_start_sound (SwfdecMovie *movie, SwfdecBits *bits) int id; id = swfdec_bits_get_u16 (bits); - chunk = swfdec_sound_parse_chunk (SWFDEC_SWF_DECODER (movie->swf->decoder), bits, id); + chunk = swfdec_sound_parse_chunk (SWFDEC_SWF_DECODER (movie->resource->decoder), bits, id); if (chunk) { SwfdecAudio *audio = swfdec_audio_event_new_from_chunk (SWFDEC_PLAYER ( SWFDEC_AS_OBJECT (movie)->context), chunk); @@ -301,7 +303,7 @@ swfdec_sprite_movie_perform_one_action (SwfdecSpriteMovie *movie, guint tag, Swf SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (mov)->context); SwfdecBits bits; - g_assert (mov->swf); + g_assert (mov->resource); swfdec_bits_init (&bits, buffer); SWFDEC_LOG ("%p: executing %uth tag %s in frame %u", movie, movie->next_action - 1, @@ -311,7 +313,7 @@ swfdec_sprite_movie_perform_one_action (SwfdecSpriteMovie *movie, guint tag, Swf SWFDEC_LOG ("SCRIPT action"); if (!skip_scripts) { SwfdecScript *script = swfdec_swf_decoder_get_script ( - SWFDEC_SWF_DECODER (mov->swf->decoder), buffer->data); + SWFDEC_SWF_DECODER (mov->resource->decoder), buffer->data); g_assert (script); swfdec_player_add_action (player, mov, swfdec_sprite_movie_run_script, script); } @@ -435,10 +437,10 @@ swfdec_sprite_movie_goto (SwfdecSpriteMovie *movie, guint goto_frame) while (n) { guint tag; SwfdecBuffer *buffer; + SwfdecResource *resource = swfdec_movie_get_own_resource (mov); /* FIXME: These actions should probably just be added to the action queue */ - if (movie == mov->swf->movie && - mov->swf->parse_frame <= movie->frame) - swfdec_swf_instance_advance (mov->swf); + if (resource && resource->parse_frame <= movie->frame) + swfdec_resource_advance (resource); if (!swfdec_sprite_get_action (movie->sprite, movie->next_action, &tag, &buffer)) break; movie->next_action++; @@ -515,14 +517,14 @@ swfdec_sprite_movie_do_init_movie (SwfdecSpriteMovie *movie) SwfdecAsContext *context = SWFDEC_AS_OBJECT (movie)->context; SwfdecAsObject *constructor = NULL; - g_assert (mov->swf != NULL); + g_assert (mov->resource != NULL); if (movie->sprite) { const char *name; g_assert (movie->sprite->parse_frame > 0); movie->n_frames = movie->sprite->n_frames; - name = swfdec_swf_instance_get_export_name (mov->swf, + name = swfdec_resource_get_export_name (mov->resource, SWFDEC_CHARACTER (movie->sprite)); if (name != NULL) { name = swfdec_as_context_get_string (context, name); @@ -721,7 +723,7 @@ swfdec_sprite_movie_load (SwfdecSpriteMovie *movie, const char *url, SwfdecLoade /* 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); + swfdec_resource_new (movie, loader, NULL); g_object_unref (loader); } diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index d5a9f03..8e566c3 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -67,11 +67,13 @@ swfdec_sprite_movie_getBytesLoaded (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { SwfdecMovie *movie; + SwfdecResource *resource; SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE, (gpointer)&movie, ""); - if (SWFDEC_MOVIE (movie->swf->movie) == movie) { - SWFDEC_AS_VALUE_SET_INT (rval, movie->swf->decoder->bytes_loaded); + resource = swfdec_movie_get_own_resource (movie); + if (resource) { + SWFDEC_AS_VALUE_SET_INT (rval, resource->decoder->bytes_loaded); } else { SWFDEC_AS_VALUE_SET_INT (rval, 0); } @@ -83,11 +85,13 @@ swfdec_sprite_movie_getBytesTotal (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { SwfdecMovie *movie; + SwfdecResource *resource; SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE, (gpointer)&movie, ""); - if (SWFDEC_MOVIE (movie->swf->movie) == movie) { - SWFDEC_AS_VALUE_SET_INT (rval, movie->swf->decoder->bytes_total); + resource = swfdec_movie_get_own_resource (movie); + if (resource) { + SWFDEC_AS_VALUE_SET_INT (rval, resource->decoder->bytes_total); } else { SWFDEC_AS_VALUE_SET_INT (rval, 0); } @@ -372,7 +376,7 @@ swfdec_sprite_movie_attachMovie (SwfdecAsContext *cx, SwfdecAsObject *object, } else { initObject = NULL; } - sprite = swfdec_swf_instance_get_export (movie->swf, export); + sprite = swfdec_resource_get_export (movie->resource, export); if (!SWFDEC_IS_SPRITE (sprite)) { if (sprite == NULL) { SWFDEC_WARNING ("no symbol with name %s exported", export); diff --git a/libswfdec/swfdec_swf_instance.c b/libswfdec/swfdec_swf_instance.c index 97e8460..c77df13 100644 --- a/libswfdec/swfdec_swf_instance.c +++ b/libswfdec/swfdec_swf_instance.c @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> + * Copyright (C) 2006-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 @@ -40,20 +40,20 @@ #include "swfdec_utils.h" -static void swfdec_swf_instance_loader_target_init (SwfdecLoaderTargetInterface *iface); -G_DEFINE_TYPE_WITH_CODE (SwfdecSwfInstance, swfdec_swf_instance, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_swf_instance_loader_target_init)) +static void swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface); +G_DEFINE_TYPE_WITH_CODE (SwfdecResource, swfdec_resource, SWFDEC_TYPE_FLASH_SECURITY, + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_resource_loader_target_init)) /*** SWFDEC_LOADER_TARGET interface ***/ static SwfdecPlayer * -swfdec_swf_instance_loader_target_get_player (SwfdecLoaderTarget *target) +swfdec_resource_loader_target_get_player (SwfdecLoaderTarget *target) { - return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (SWFDEC_SWF_INSTANCE (target)->movie)->context); + return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (SWFDEC_RESOURCE (target)->movie)->context); } static void -swfdec_swf_instance_allow_network (SwfdecPlayer *player) +swfdec_resource_allow_network (SwfdecPlayer *player) { SwfdecFlashSecurity *sec; @@ -68,7 +68,7 @@ swfdec_swf_instance_allow_network (SwfdecPlayer *player) } static void -swfdec_swf_instance_loader_target_image (SwfdecSwfInstance *instance) +swfdec_resource_loader_target_image (SwfdecResource *instance) { SwfdecSpriteMovie *movie = instance->movie; @@ -84,7 +84,7 @@ swfdec_swf_instance_loader_target_image (SwfdecSwfInstance *instance) /* 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); + swfdec_resource_allow_network (player); } else if (SWFDEC_IS_FLV_DECODER (instance->decoder)) { /* nothing to do, please move along */ } else { @@ -93,9 +93,9 @@ swfdec_swf_instance_loader_target_image (SwfdecSwfInstance *instance) } static void -swfdec_swf_instance_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *loader) +swfdec_resource_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *loader) { - SwfdecSwfInstance *instance = SWFDEC_SWF_INSTANCE (target); + SwfdecResource *instance = SWFDEC_RESOURCE (target); const char *query; query = swfdec_url_get_query (swfdec_loader_get_url (loader)); @@ -110,9 +110,9 @@ swfdec_swf_instance_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader } static void -swfdec_swf_instance_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) +swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) { - SwfdecSwfInstance *instance = SWFDEC_SWF_INSTANCE (target); + SwfdecResource *instance = SWFDEC_RESOURCE (target); SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (instance->movie)->context); SwfdecDecoder *dec = instance->decoder; SwfdecDecoderClass *klass; @@ -159,7 +159,7 @@ swfdec_swf_instance_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoade case SWFDEC_STATUS_NEEDBITS: return; case SWFDEC_STATUS_IMAGE: - swfdec_swf_instance_loader_target_image (instance); + swfdec_resource_loader_target_image (instance); break; case SWFDEC_STATUS_INIT: swfdec_player_initialize (player, @@ -176,17 +176,17 @@ swfdec_swf_instance_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoade } static void -swfdec_swf_instance_loader_target_init (SwfdecLoaderTargetInterface *iface) +swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface) { - iface->get_player = swfdec_swf_instance_loader_target_get_player; - iface->open = swfdec_swf_instance_loader_target_open; - iface->parse = swfdec_swf_instance_loader_target_parse; + iface->get_player = swfdec_resource_loader_target_get_player; + iface->open = swfdec_resource_loader_target_open; + iface->parse = swfdec_resource_loader_target_parse; } static void -swfdec_swf_instance_dispose (GObject *object) +swfdec_resource_dispose (GObject *object) { - SwfdecSwfInstance *instance = SWFDEC_SWF_INSTANCE (object); + SwfdecResource *instance = SWFDEC_RESOURCE (object); swfdec_loader_set_target (instance->loader, NULL); g_object_unref (instance->loader); @@ -198,41 +198,41 @@ swfdec_swf_instance_dispose (GObject *object) g_hash_table_destroy (instance->exports); g_hash_table_destroy (instance->export_names); - G_OBJECT_CLASS (swfdec_swf_instance_parent_class)->dispose (object); + G_OBJECT_CLASS (swfdec_resource_parent_class)->dispose (object); } static void -swfdec_swf_instance_class_init (SwfdecSwfInstanceClass *klass) +swfdec_resource_class_init (SwfdecResourceClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - object_class->dispose = swfdec_swf_instance_dispose; + object_class->dispose = swfdec_resource_dispose; } static void -swfdec_swf_instance_init (SwfdecSwfInstance *instance) +swfdec_resource_init (SwfdecResource *instance) { instance->exports = g_hash_table_new (swfdec_str_case_hash, swfdec_str_case_equal); instance->export_names = g_hash_table_new (g_direct_hash, g_direct_equal); } -SwfdecSwfInstance * -swfdec_swf_instance_new (SwfdecSpriteMovie *movie, SwfdecLoader *loader, const char *variables) +SwfdecResource * +swfdec_resource_new (SwfdecSpriteMovie *movie, SwfdecLoader *loader, const char *variables) { SwfdecMovie *mov; - SwfdecSwfInstance *swf; + SwfdecResource *swf; g_return_val_if_fail (SWFDEC_IS_SPRITE_MOVIE (movie), NULL); g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); mov = SWFDEC_MOVIE (movie); - swf = g_object_new (SWFDEC_TYPE_SWF_INSTANCE, NULL); + swf = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); /* set important variables */ swf->variables = g_strdup (variables); swf->movie = movie; - if (mov->swf) - g_object_unref (mov->swf); - mov->swf = swf; + if (mov->resource) + g_object_unref (mov->resource); + mov->resource = swf; /* set loader (that depends on those vars) */ swf->loader = g_object_ref (loader); swfdec_loader_set_target (loader, SWFDEC_LOADER_TARGET (swf)); @@ -241,27 +241,27 @@ swfdec_swf_instance_new (SwfdecSpriteMovie *movie, SwfdecLoader *loader, const c } gpointer -swfdec_swf_instance_get_export (SwfdecSwfInstance *instance, const char *name) +swfdec_resource_get_export (SwfdecResource *instance, const char *name) { - g_return_val_if_fail (SWFDEC_IS_SWF_INSTANCE (instance), NULL); + g_return_val_if_fail (SWFDEC_IS_RESOURCE (instance), NULL); g_return_val_if_fail (name != NULL, NULL); return g_hash_table_lookup (instance->exports, name); } const char * -swfdec_swf_instance_get_export_name (SwfdecSwfInstance *instance, SwfdecCharacter *character) +swfdec_resource_get_export_name (SwfdecResource *instance, SwfdecCharacter *character) { - g_return_val_if_fail (SWFDEC_IS_SWF_INSTANCE (instance), NULL); + g_return_val_if_fail (SWFDEC_IS_RESOURCE (instance), NULL); g_return_val_if_fail (SWFDEC_IS_CHARACTER (character), NULL); return g_hash_table_lookup (instance->export_names, character); } static void -swfdec_swf_instance_add_export (SwfdecSwfInstance *instance, SwfdecCharacter *character, const char *name) +swfdec_resource_add_export (SwfdecResource *instance, SwfdecCharacter *character, const char *name) { - g_return_if_fail (SWFDEC_IS_SWF_INSTANCE (instance)); + g_return_if_fail (SWFDEC_IS_RESOURCE (instance)); g_return_if_fail (SWFDEC_IS_CHARACTER (character)); g_return_if_fail (name != NULL); @@ -270,13 +270,13 @@ swfdec_swf_instance_add_export (SwfdecSwfInstance *instance, SwfdecCharacter *ch } void -swfdec_swf_instance_advance (SwfdecSwfInstance *instance) +swfdec_resource_advance (SwfdecResource *instance) { SwfdecSwfDecoder *s; GArray *array; guint i; - g_return_if_fail (SWFDEC_IS_SWF_INSTANCE (instance)); + g_return_if_fail (SWFDEC_IS_RESOURCE (instance)); s = SWFDEC_SWF_DECODER (instance->decoder); SWFDEC_LOG ("performing actions for frame %u", instance->parse_frame); @@ -297,7 +297,7 @@ swfdec_swf_instance_advance (SwfdecSwfInstance *instance) case SWFDEC_ROOT_ACTION_EXPORT: { SwfdecRootExportData *data = action->data; - swfdec_swf_instance_add_export (instance, data->character, data->name); + swfdec_resource_add_export (instance, data->character, data->name); } break; default: diff --git a/libswfdec/swfdec_swf_instance.h b/libswfdec/swfdec_swf_instance.h index 89d1cdb..2c456a0 100644 --- a/libswfdec/swfdec_swf_instance.h +++ b/libswfdec/swfdec_swf_instance.h @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> + * Copyright (C) 2006-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 @@ -17,26 +17,27 @@ * Boston, MA 02110-1301 USA */ -#ifndef _SWFDEC_SWF_INSTANCE_H_ -#define _SWFDEC_SWF_INSTANCE_H_ +#ifndef _SWFDEC_RESOURCE_H_ +#define _SWFDEC_RESOURCE_H_ #include <libswfdec/swfdec_player.h> +#include <libswfdec/swfdec_flash_security.h> #include <libswfdec/swfdec_sprite_movie.h> G_BEGIN_DECLS -//typedef struct _SwfdecSwfInstance SwfdecSwfInstance; -typedef struct _SwfdecSwfInstanceClass SwfdecSwfInstanceClass; +//typedef struct _SwfdecResource SwfdecResource; +typedef struct _SwfdecResourceClass SwfdecResourceClass; -#define SWFDEC_TYPE_SWF_INSTANCE (swfdec_swf_instance_get_type()) -#define SWFDEC_IS_SWF_INSTANCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SWF_INSTANCE)) -#define SWFDEC_IS_SWF_INSTANCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SWF_INSTANCE)) -#define SWFDEC_SWF_INSTANCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SWF_INSTANCE, SwfdecSwfInstance)) -#define SWFDEC_SWF_INSTANCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SWF_INSTANCE, SwfdecSwfInstanceClass)) +#define SWFDEC_TYPE_RESOURCE (swfdec_resource_get_type()) +#define SWFDEC_IS_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_RESOURCE)) +#define SWFDEC_IS_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_RESOURCE)) +#define SWFDEC_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_RESOURCE, SwfdecResource)) +#define SWFDEC_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_RESOURCE, SwfdecResourceClass)) -struct _SwfdecSwfInstance +struct _SwfdecResource { - GObject object; + SwfdecFlashSecurity flash_security; SwfdecSpriteMovie * movie; /* the movie responsible for creating this instance */ guint parse_frame; /* next frame to parse */ @@ -49,23 +50,23 @@ struct _SwfdecSwfInstance GHashTable * export_names; /* SwfdecCharacter->string mapping of exported characters */ }; -struct _SwfdecSwfInstanceClass +struct _SwfdecResourceClass { - GObjectClass object_class; + SwfdecFlashSecurityClass flash_security_class; }; -GType swfdec_swf_instance_get_type (void); +GType swfdec_resource_get_type (void); -SwfdecSwfInstance * - swfdec_swf_instance_new (SwfdecSpriteMovie * movie, +SwfdecResource * + swfdec_resource_new (SwfdecSpriteMovie * movie, SwfdecLoader * loader, const char * variables); -void swfdec_swf_instance_advance (SwfdecSwfInstance * instance); +void swfdec_resource_advance (SwfdecResource * instance); -gpointer swfdec_swf_instance_get_export (SwfdecSwfInstance * root, +gpointer swfdec_resource_get_export (SwfdecResource * root, const char * name); -const char * swfdec_swf_instance_get_export_name (SwfdecSwfInstance * root, +const char * swfdec_resource_get_export_name (SwfdecResource * root, SwfdecCharacter * character); G_END_DECLS diff --git a/libswfdec/swfdec_types.h b/libswfdec/swfdec_types.h index 37a89ea..60193a0 100644 --- a/libswfdec/swfdec_types.h +++ b/libswfdec/swfdec_types.h @@ -49,6 +49,7 @@ typedef struct _SwfdecMovie SwfdecMovie; typedef struct _SwfdecShape SwfdecShape; typedef struct _SwfdecShapeVec SwfdecShapeVec; typedef struct _SwfdecRect SwfdecRect; +typedef struct _SwfdecResource SwfdecResource; typedef struct _SwfdecRootSprite SwfdecRootSprite; typedef struct _SwfdecScriptable SwfdecScriptable; typedef struct _SwfdecSound SwfdecSound; @@ -57,7 +58,6 @@ typedef struct _SwfdecSprite SwfdecSprite; typedef struct _SwfdecSpriteFrame SwfdecSpriteFrame; typedef struct _SwfdecSpriteMovie SwfdecSpriteMovie; typedef struct _SwfdecSwfDecoder SwfdecSwfDecoder; -typedef struct _SwfdecSwfInstance SwfdecSwfInstance; typedef struct _SwfdecText SwfdecText; #endif
Apparently Analagous Threads
- 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
- 7 commits - doc/swfdec-sections.txt libswfdec-gtk/swfdec_gtk_widget.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_decoder.c libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_movie_asprops.c libswfdec/swfdec_net_stream.c libswfdec/swfdec_player.c
- libswfdec/swfdec_load_object.c libswfdec/swfdec_movie.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h
- 8 commits - libswfdec/swfdec_movie_as_drawing.c libswfdec/swfdec_player.c libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h libswfdec/swfdec_sprite_movie.c
- 13 commits - libswfdec/Makefile.am libswfdec/swfdec_decoder.c libswfdec/swfdec_decoder.h libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_flv_decoder.h libswfdec/swfdec_image.c libswfdec/swfdec_image_decoder.c libswfdec/swfdec_image_decoder.h