void srs_amf0_do_print(SrsAmf0Any* any, stringstream& ss, int level) { if (any->is_boolean()) { ss << "Boolean " << (any->to_boolean()? "true":"false") << endl; } else if (any->is_number()) { ss << "Number " << std::fixed << any->to_number() << endl; } else if (any->is_string()) { ss << "String " << any->to_str() << endl; } else if (any->is_date()) { ss << "Date " << std::hex << any->to_date() << "/" << std::hex << any->to_date_time_zone() << endl; } else if (any->is_null()) { ss << "Null" << endl; } else if (any->is_ecma_array()) { SrsAmf0EcmaArray* obj = any->to_ecma_array(); ss << "EcmaArray " << "(" << obj->count() << " items)" << endl; for (int i = 0; i < obj->count(); i++) { srs_fill_level_spaces(ss, level + 1); ss << "Elem '" << obj->key_at(i) << "' "; if (obj->value_at(i)->is_complex_object()) { srs_amf0_do_print(obj->value_at(i), ss, level + 1); } else { srs_amf0_do_print(obj->value_at(i), ss, 0); } } } else if (any->is_strict_array()) { SrsAmf0StrictArray* obj = any->to_strict_array(); ss << "StrictArray " << "(" << obj->count() << " items)" << endl; for (int i = 0; i < obj->count(); i++) { srs_fill_level_spaces(ss, level + 1); ss << "Elem "; if (obj->at(i)->is_complex_object()) { srs_amf0_do_print(obj->at(i), ss, level + 1); } else { srs_amf0_do_print(obj->at(i), ss, 0); } } } else if (any->is_object()) { SrsAmf0Object* obj = any->to_object(); ss << "Object " << "(" << obj->count() << " items)" << endl; for (int i = 0; i < obj->count(); i++) { srs_fill_level_spaces(ss, level + 1); ss << "Property '" << obj->key_at(i) << "' "; if (obj->value_at(i)->is_complex_object()) { srs_amf0_do_print(obj->value_at(i), ss, level + 1); } else { srs_amf0_do_print(obj->value_at(i), ss, 0); } } } else { ss << "Unknown" << endl; } }
srs_amf0_t srs_amf0_strict_array_property_at(srs_amf0_t amf0, int index) { SrsAmf0Any* any = (SrsAmf0Any*)amf0; srs_assert(any->is_strict_array()); SrsAmf0StrictArray* obj = (SrsAmf0StrictArray*)amf0; return (srs_amf0_t)obj->at(index); }
VOID TEST(AMF0Test, ApiStrictArray) { SrsStream s; char buf[1024]; memset(buf, 0, sizeof(buf)); EXPECT_EQ(ERROR_SUCCESS, s.initialize(buf, sizeof(buf))); SrsAmf0StrictArray* o = NULL; // append property if (true) { o = SrsAmf0Any::strict_array(); SrsAutoFree(SrsAmf0StrictArray, o); o->append(SrsAmf0Any::number(100)); EXPECT_DOUBLE_EQ(100, o->at(0)->to_number()); o->append(SrsAmf0Any::number(101)); EXPECT_DOUBLE_EQ(101, o->at(1)->to_number()); o->append(SrsAmf0Any::str("winlin")); EXPECT_STREQ("winlin", o->at(2)->to_str().c_str()); } // count if (true) { o = SrsAmf0Any::strict_array(); SrsAutoFree(SrsAmf0StrictArray, o); EXPECT_EQ(0, o->count()); o->append(SrsAmf0Any::boolean()); EXPECT_EQ(1, o->count()); o->append(SrsAmf0Any::boolean()); EXPECT_EQ(2, o->count()); o->clear(); EXPECT_EQ(0, o->count()); } // io if (true) { o = SrsAmf0Any::strict_array(); SrsAutoFree(SrsAmf0StrictArray, o); s.reset(); EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); EXPECT_EQ(5, s.pos()); s.reset(); EXPECT_EQ(0x0a, s.read_1bytes()); EXPECT_EQ(0x00, s.read_4bytes()); } if (true) { o = SrsAmf0Any::strict_array(); SrsAutoFree(SrsAmf0StrictArray, o); o->append(SrsAmf0Any::number(0)); s.reset(); EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); EXPECT_EQ(5 + SrsAmf0Size::number(), s.pos()); } }