VOID TEST(AMF0Test, ApiEcmaArrayProps) { SrsAmf0EcmaArray* o = NULL; // get/set property if (true) { o = SrsAmf0Any::ecma_array(); SrsAutoFree(SrsAmf0EcmaArray, o); EXPECT_TRUE(NULL == o->get_property("name")); o->set("name", SrsAmf0Any::str("winlin")); EXPECT_TRUE(NULL != o->get_property("name")); EXPECT_TRUE(NULL == o->get_property("age")); o->set("age", SrsAmf0Any::number(100)); EXPECT_TRUE(NULL != o->get_property("age")); } // index property if (true) { o = SrsAmf0Any::ecma_array(); SrsAutoFree(SrsAmf0EcmaArray, o); o->set("name", SrsAmf0Any::str("winlin")); EXPECT_STREQ("name", o->key_at(0).c_str()); ASSERT_TRUE(o->value_at(0)->is_string()); EXPECT_STREQ("winlin", o->value_at(0)->to_str().c_str()); o->set("age", SrsAmf0Any::number(100)); EXPECT_STREQ("name", o->key_at(0).c_str()); ASSERT_TRUE(o->value_at(0)->is_string()); EXPECT_STREQ("winlin", o->value_at(0)->to_str().c_str()); EXPECT_STREQ("age", o->key_at(1).c_str()); ASSERT_TRUE(o->value_at(1)->is_number()); EXPECT_DOUBLE_EQ(100, o->value_at(1)->to_number()); } // ensure property if (true) { o = SrsAmf0Any::ecma_array(); SrsAutoFree(SrsAmf0EcmaArray, o); EXPECT_TRUE(NULL == o->ensure_property_string("name")); EXPECT_TRUE(NULL == o->ensure_property_number("age")); o->set("name", SrsAmf0Any::str("winlin")); EXPECT_TRUE(NULL != o->ensure_property_string("name")); EXPECT_TRUE(NULL == o->ensure_property_number("name")); EXPECT_TRUE(NULL == o->ensure_property_number("age")); o->set("age", SrsAmf0Any::number(100)); EXPECT_TRUE(NULL != o->ensure_property_string("name")); EXPECT_TRUE(NULL == o->ensure_property_number("name")); EXPECT_TRUE(NULL != o->ensure_property_number("age")); EXPECT_TRUE(NULL == o->ensure_property_string("age")); } // count if (true) { o = SrsAmf0Any::ecma_array(); SrsAutoFree(SrsAmf0EcmaArray, o); EXPECT_EQ(0, o->count()); o->set("name", SrsAmf0Any::str("winlin")); EXPECT_EQ(1, o->count()); o->set("name", SrsAmf0Any::str("winlin")); EXPECT_EQ(1, o->count()); o->set("age", SrsAmf0Any::number(100)); EXPECT_EQ(2, o->count()); } }
int SrsRtmpClient::connect_app2( string app, string tc_url, SrsRequest* req, bool debug_srs_upnode, string& srs_server_ip, string& srs_server, string& srs_primary_authors, string& srs_version, int& srs_id, int& srs_pid ){ int ret = ERROR_SUCCESS; // Connect(vhost, app) if (true) { SrsConnectAppPacket* pkt = new SrsConnectAppPacket(); pkt->command_object->set("app", SrsAmf0Any::str(app.c_str())); pkt->command_object->set("flashVer", SrsAmf0Any::str("WIN 12,0,0,41")); if (req) { pkt->command_object->set("swfUrl", SrsAmf0Any::str(req->swfUrl.c_str())); } else { pkt->command_object->set("swfUrl", SrsAmf0Any::str()); } pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); pkt->command_object->set("fpad", SrsAmf0Any::boolean(false)); pkt->command_object->set("capabilities", SrsAmf0Any::number(239)); pkt->command_object->set("audioCodecs", SrsAmf0Any::number(3575)); pkt->command_object->set("videoCodecs", SrsAmf0Any::number(252)); pkt->command_object->set("videoFunction", SrsAmf0Any::number(1)); if (req) { pkt->command_object->set("pageUrl", SrsAmf0Any::str(req->pageUrl.c_str())); } else { pkt->command_object->set("pageUrl", SrsAmf0Any::str()); } pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0)); // @see https://github.com/winlinvip/simple-rtmp-server/issues/160 // the debug_srs_upnode is config in vhost and default to true. if (debug_srs_upnode && req && req->args) { srs_freep(pkt->args); pkt->args = req->args->copy()->to_object(); } if ((ret = protocol->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) { return ret; } } // Set Window Acknowledgement size(2500000) if (true) { SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket(); pkt->ackowledgement_window_size = 2500000; if ((ret = protocol->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) { return ret; } } // expect connect _result SrsMessage* msg = NULL; SrsConnectAppResPacket* pkt = NULL; if ((ret = expect_message<SrsConnectAppResPacket>(&msg, &pkt)) != ERROR_SUCCESS) { srs_error("expect connect app response message failed. ret=%d", ret); return ret; } SrsAutoFree(SrsMessage, msg); SrsAutoFree(SrsConnectAppResPacket, pkt); // server info SrsAmf0Any* data = pkt->info->get_property("data"); if (data && data->is_ecma_array()) { SrsAmf0EcmaArray* arr = data->to_ecma_array(); SrsAmf0Any* prop = NULL; if ((prop = arr->ensure_property_string("srs_primary_authors")) != NULL) { srs_primary_authors = prop->to_str(); } if ((prop = arr->ensure_property_string("srs_version")) != NULL) { srs_version = prop->to_str(); } if ((prop = arr->ensure_property_string("srs_server_ip")) != NULL) { srs_server_ip = prop->to_str(); } if ((prop = arr->ensure_property_string("srs_server")) != NULL) { srs_server = prop->to_str(); } if ((prop = arr->ensure_property_number("srs_id")) != NULL) { srs_id = (int)prop->to_number(); } if ((prop = arr->ensure_property_number("srs_pid")) != NULL) { srs_pid = (int)prop->to_number(); } } srs_trace("connected, version=%s, ip=%s, pid=%d, id=%d, dsu=%d", srs_version.c_str(), srs_server_ip.c_str(), srs_pid, srs_id, debug_srs_upnode); return ret; }
int SrsRtmpClient::connect_app(string app, string tc_url) { int ret = ERROR_SUCCESS; // Connect(vhost, app) if (true) { SrsConnectAppPacket* pkt = new SrsConnectAppPacket(); pkt->command_object->set("app", SrsAmf0Any::str(app.c_str())); pkt->command_object->set("flashVer", SrsAmf0Any::str("WIN 12,0,0,41")); pkt->command_object->set("swfUrl", SrsAmf0Any::str()); pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); pkt->command_object->set("fpad", SrsAmf0Any::boolean(false)); pkt->command_object->set("capabilities", SrsAmf0Any::number(239)); pkt->command_object->set("audioCodecs", SrsAmf0Any::number(3575)); pkt->command_object->set("videoCodecs", SrsAmf0Any::number(252)); pkt->command_object->set("videoFunction", SrsAmf0Any::number(1)); pkt->command_object->set("pageUrl", SrsAmf0Any::str()); pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0)); if ((ret = protocol->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) { return ret; } } // Set Window Acknowledgement size(2500000) if (true) { SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket(); pkt->ackowledgement_window_size = 2500000; if ((ret = protocol->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) { return ret; } } // expect connect _result SrsMessage* msg = NULL; SrsConnectAppResPacket* pkt = NULL; if ((ret = srs_rtmp_expect_message<SrsConnectAppResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) { srs_error("expect connect app response message failed. ret=%d", ret); return ret; } SrsAutoFree(SrsMessage, msg); SrsAutoFree(SrsConnectAppResPacket, pkt); // server info std::string srs_version; std::string srs_server_ip; int srs_id = 0; int srs_pid = 0; SrsAmf0Any* data = pkt->info->get_property("data"); if (data && data->is_ecma_array()) { SrsAmf0EcmaArray* arr = data->to_ecma_array(); SrsAmf0Any* prop = NULL; if ((prop = arr->ensure_property_string("srs_version")) != NULL) { srs_version = prop->to_str(); } if ((prop = arr->ensure_property_string("srs_server_ip")) != NULL) { srs_server_ip = prop->to_str(); } if ((prop = arr->ensure_property_number("srs_id")) != NULL) { srs_id = (int)prop->to_number(); } if ((prop = arr->ensure_property_number("srs_pid")) != NULL) { srs_pid = (int)prop->to_number(); } } srs_trace("connected, version=%s, ip=%s, pid=%d, id=%d", srs_version.c_str(), srs_server_ip.c_str(), srs_pid, srs_id); return ret; }