static gboolean swfdec_amf_parse_properties (SwfdecAsContext *context, SwfdecBits *bits, SwfdecAsObject *object) { guint type; SwfdecAmfParseFunc func; while (swfdec_bits_left (bits)) { SwfdecAsValue val; const char *name; if (!swfdec_amf_parse_string (context, bits, &val)) return FALSE; name = SWFDEC_AS_VALUE_GET_STRING (&val); type = swfdec_bits_get_u8 (bits); if (type == SWFDEC_AMF_END_OBJECT) break; if (type >= SWFDEC_AMF_N_TYPES || (func = parse_funcs[type]) == NULL) { SWFDEC_ERROR ("no parse func for AMF type %u", type); goto error; } swfdec_as_object_set_variable (object, name, &val); /* GC... */ if (!func (context, bits, &val)) { goto error; } swfdec_as_object_set_variable (object, name, &val); } /* no more bytes seems to end automatically */ return TRUE; error: return FALSE; }
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); }