static void swfdec_load_object_stream_target_close (SwfdecStreamTarget *target, SwfdecStream *stream) { SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (target); char *text; // get text text = swfdec_buffer_queue_pull_text (swfdec_stream_get_queue (stream), load_object->version); /* break reference to the loader */ swfdec_stream_set_target (stream, NULL); load_object->loader = NULL; g_object_unref (stream); /* call finish */ swfdec_sandbox_use (load_object->sandbox); if (text != NULL) { load_object->finish (load_object->target, swfdec_as_context_give_string (swfdec_gc_object_get_context (load_object->target), text)); } else { load_object->finish (load_object->target, SWFDEC_AS_STR_EMPTY); } swfdec_sandbox_unuse (load_object->sandbox); /* unroot */ swfdec_player_unroot (SWFDEC_PLAYER ( swfdec_gc_object_get_context (load_object->sandbox)), load_object); }
void swfdec_system_query (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval) { SwfdecPlayer *player = SWFDEC_PLAYER (cx); SwfdecAsValue val; guint i; GString *server; if (object == NULL) { SWFDEC_WARNING ("no this object in Query()"); return; } server = g_string_new (""); for (i = 0; i < G_N_ELEMENTS (queries); i++) { queries[i].get (player, &val); swfdec_as_object_set_variable (object, queries[i].name, &val); if (queries[i].name == SWFDEC_AS_STR_screenResolutionY) { g_string_append_printf (server, "x%d", (int) SWFDEC_AS_VALUE_GET_NUMBER (val)); } else if (queries[i].name == SWFDEC_AS_STR_pixelAspectRatio) { char buffer[10]; g_ascii_formatd (buffer, sizeof (buffer), "%.1f", SWFDEC_AS_VALUE_GET_NUMBER (val)); g_string_append (server, "&AR="); g_string_append (server, buffer); } else if (queries[i].name == SWFDEC_AS_STR_manufacturer) { char *s = swfdec_as_string_escape (cx, player->priv->system->server_manufacturer); g_string_append_printf (server, "&M=%s", s); g_free (s); } else { g_assert (queries[i].server_string); if (i > 0) g_string_append_c (server, '&'); g_string_append (server, queries[i].server_string); g_string_append_c (server, '='); if (SWFDEC_AS_VALUE_IS_BOOLEAN (val)) { g_string_append_c (server, SWFDEC_AS_VALUE_GET_BOOLEAN (val) ? 't' : 'f'); } else if (SWFDEC_AS_VALUE_IS_NUMBER (val)) { g_string_append_printf (server, "%d", (int) SWFDEC_AS_VALUE_GET_NUMBER (val)); } else if (SWFDEC_AS_VALUE_IS_STRING (val)) { char *s = swfdec_as_string_escape (cx, SWFDEC_AS_VALUE_GET_STRING (val)); g_string_append (server, s); g_free (s); } else { g_assert_not_reached (); } } } SWFDEC_AS_VALUE_SET_STRING (&val, swfdec_as_context_give_string (cx, g_string_free (server, FALSE))); swfdec_as_object_set_variable (object, SWFDEC_AS_STR_serverString, &val); }
static gboolean swfdec_amf_parse_string (SwfdecAsContext *context, SwfdecBits *bits, SwfdecAsValue *val) { guint len = swfdec_bits_get_bu16 (bits); char *s; /* FIXME: the supplied version is likely incorrect */ s = swfdec_bits_get_string_length (bits, len, context->version); if (s == NULL) return FALSE; SWFDEC_AS_VALUE_SET_STRING (val, swfdec_as_context_give_string (context, s)); return TRUE; }
void swfdec_as_array_join (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { int i; const char *var, *str, *sep; SwfdecAsValue val; if (object == NULL || SWFDEC_IS_MOVIE (object)) return; if (argc > 0) { sep = swfdec_as_value_to_string (cx, &argv[0]); } else { sep = SWFDEC_AS_STR_COMMA; } // note: we don't cache length if (swfdec_as_array_length (object) > 0) { GString *string; swfdec_as_object_get_variable (object, SWFDEC_AS_STR_0, &val); str = swfdec_as_value_to_string (cx, &val); string = g_string_new (str); for (i = 1; i < swfdec_as_array_length (object); i++) { var = swfdec_as_integer_to_string (cx, i); swfdec_as_object_get_variable (object, var, &val); var = swfdec_as_value_to_string (cx, &val); g_string_append (string, sep); g_string_append (string, var); } str = swfdec_as_context_give_string (cx, g_string_free (string, FALSE)); } else { str = SWFDEC_AS_STR_EMPTY; } SWFDEC_AS_VALUE_SET_STRING (ret, str); }