winlin

utest for amf0 object, refine the count of elem

@@ -594,6 +594,23 @@ SrsAmf0Object::~SrsAmf0Object() @@ -594,6 +594,23 @@ SrsAmf0Object::~SrsAmf0Object()
594 srs_freep(eof); 594 srs_freep(eof);
595 } 595 }
596 596
  597 +int SrsAmf0Object::size()
  598 +{
  599 + int size = 1;
  600 +
  601 + for (int i = 0; i < properties->size(); i++){
  602 + std::string name = key_at(i);
  603 + SrsAmf0Any* value = value_at(i);
  604 +
  605 + size += SrsAmf0Size::utf8(name);
  606 + size += SrsAmf0Size::any(value);
  607 + }
  608 +
  609 + size += SrsAmf0Size::object_eof();
  610 +
  611 + return size;
  612 +}
  613 +
597 int SrsAmf0Object::read(SrsStream* stream) 614 int SrsAmf0Object::read(SrsStream* stream)
598 { 615 {
599 int ret = ERROR_SUCCESS; 616 int ret = ERROR_SUCCESS;
@@ -691,21 +708,9 @@ int SrsAmf0Object::write(SrsStream* stream) @@ -691,21 +708,9 @@ int SrsAmf0Object::write(SrsStream* stream)
691 return ret; 708 return ret;
692 } 709 }
693 710
694 -int SrsAmf0Object::size() 711 +int SrsAmf0Object::count()
695 { 712 {
696 - int size = 1;  
697 -  
698 - for (int i = 0; i < properties->size(); i++){  
699 - std::string name = key_at(i);  
700 - SrsAmf0Any* value = value_at(i);  
701 -  
702 - size += SrsAmf0Size::utf8(name);  
703 - size += SrsAmf0Size::any(value);  
704 - }  
705 -  
706 - size += SrsAmf0Size::object_eof();  
707 -  
708 - return size; 713 + return properties->size();
709 } 714 }
710 715
711 std::string SrsAmf0Object::key_at(int index) 716 std::string SrsAmf0Object::key_at(int index)
@@ -751,6 +756,23 @@ SrsAmf0EcmaArray::~SrsAmf0EcmaArray() @@ -751,6 +756,23 @@ SrsAmf0EcmaArray::~SrsAmf0EcmaArray()
751 srs_freep(eof); 756 srs_freep(eof);
752 } 757 }
753 758
  759 +int SrsAmf0EcmaArray::size()
  760 +{
  761 + int size = 1 + 4;
  762 +
  763 + for (int i = 0; i < properties->size(); i++){
  764 + std::string name = key_at(i);
  765 + SrsAmf0Any* value = value_at(i);
  766 +
  767 + size += SrsAmf0Size::utf8(name);
  768 + size += SrsAmf0Size::any(value);
  769 + }
  770 +
  771 + size += SrsAmf0Size::object_eof();
  772 +
  773 + return size;
  774 +}
  775 +
754 int SrsAmf0EcmaArray::read(SrsStream* stream) 776 int SrsAmf0EcmaArray::read(SrsStream* stream)
755 { 777 {
756 int ret = ERROR_SUCCESS; 778 int ret = ERROR_SUCCESS;
@@ -782,7 +804,7 @@ int SrsAmf0EcmaArray::read(SrsStream* stream) @@ -782,7 +804,7 @@ int SrsAmf0EcmaArray::read(SrsStream* stream)
782 srs_verbose("amf0 read ecma_array count success. count=%d", count); 804 srs_verbose("amf0 read ecma_array count success. count=%d", count);
783 805
784 // value 806 // value
785 - this->count = count; 807 + this->_count = count;
786 808
787 while (!stream->empty()) { 809 while (!stream->empty()) {
788 // detect whether is eof. 810 // detect whether is eof.
@@ -837,8 +859,8 @@ int SrsAmf0EcmaArray::write(SrsStream* stream) @@ -837,8 +859,8 @@ int SrsAmf0EcmaArray::write(SrsStream* stream)
837 return ret; 859 return ret;
838 } 860 }
839 861
840 - stream->write_4bytes(this->count);  
841 - srs_verbose("amf0 write ecma_array count success. count=%d", value->count); 862 + stream->write_4bytes(this->_count);
  863 + srs_verbose("amf0 write ecma_array count success. count=%d", _count);
842 864
843 // value 865 // value
844 for (int i = 0; i < properties->size(); i++) { 866 for (int i = 0; i < properties->size(); i++) {
@@ -868,26 +890,14 @@ int SrsAmf0EcmaArray::write(SrsStream* stream) @@ -868,26 +890,14 @@ int SrsAmf0EcmaArray::write(SrsStream* stream)
868 return ret; 890 return ret;
869 } 891 }
870 892
871 -int SrsAmf0EcmaArray::size() 893 +void SrsAmf0EcmaArray::clear()
872 { 894 {
873 - int size = 1 + 4;  
874 -  
875 - for (int i = 0; i < properties->size(); i++){  
876 - std::string name = key_at(i);  
877 - SrsAmf0Any* value = value_at(i);  
878 -  
879 - size += SrsAmf0Size::utf8(name);  
880 - size += SrsAmf0Size::any(value);  
881 - }  
882 -  
883 - size += SrsAmf0Size::object_eof();  
884 -  
885 - return size; 895 + properties->clear();
886 } 896 }
887 897
888 -void SrsAmf0EcmaArray::clear() 898 +int SrsAmf0EcmaArray::count()
889 { 899 {
890 - properties->clear(); 900 + return properties->size();
891 } 901 }
892 902
893 std::string SrsAmf0EcmaArray::key_at(int index) 903 std::string SrsAmf0EcmaArray::key_at(int index)
@@ -158,14 +158,20 @@ private: @@ -158,14 +158,20 @@ private:
158 public: 158 public:
159 virtual ~SrsAmf0Object(); 159 virtual ~SrsAmf0Object();
160 160
  161 +public:
  162 + virtual int size();
161 virtual int read(SrsStream* stream); 163 virtual int read(SrsStream* stream);
162 virtual int write(SrsStream* stream); 164 virtual int write(SrsStream* stream);
163 165
164 - virtual int size(); 166 +public:
  167 + virtual int count();
  168 + // @remark: max index is count().
165 virtual std::string key_at(int index); 169 virtual std::string key_at(int index);
  170 + // @remark: max index is count().
166 virtual SrsAmf0Any* value_at(int index); 171 virtual SrsAmf0Any* value_at(int index);
  172 +
  173 +public:
167 virtual void set(std::string key, SrsAmf0Any* value); 174 virtual void set(std::string key, SrsAmf0Any* value);
168 -  
169 virtual SrsAmf0Any* get_property(std::string name); 175 virtual SrsAmf0Any* get_property(std::string name);
170 virtual SrsAmf0Any* ensure_property_string(std::string name); 176 virtual SrsAmf0Any* ensure_property_string(std::string name);
171 virtual SrsAmf0Any* ensure_property_number(std::string name); 177 virtual SrsAmf0Any* ensure_property_number(std::string name);
@@ -182,7 +188,7 @@ class SrsAmf0EcmaArray : public SrsAmf0Any @@ -182,7 +188,7 @@ class SrsAmf0EcmaArray : public SrsAmf0Any
182 private: 188 private:
183 __SrsUnSortedHashtable* properties; 189 __SrsUnSortedHashtable* properties;
184 __SrsAmf0ObjectEOF* eof; 190 __SrsAmf0ObjectEOF* eof;
185 - int32_t count; 191 + int32_t _count;
186 192
187 private: 193 private:
188 // use SrsAmf0Any::ecma_array() to create it. 194 // use SrsAmf0Any::ecma_array() to create it.
@@ -191,15 +197,21 @@ private: @@ -191,15 +197,21 @@ private:
191 public: 197 public:
192 virtual ~SrsAmf0EcmaArray(); 198 virtual ~SrsAmf0EcmaArray();
193 199
  200 +public:
  201 + virtual int size();
194 virtual int read(SrsStream* stream); 202 virtual int read(SrsStream* stream);
195 virtual int write(SrsStream* stream); 203 virtual int write(SrsStream* stream);
196 204
197 - virtual int size(); 205 +public:
198 virtual void clear(); 206 virtual void clear();
  207 + virtual int count();
  208 + // @remark: max index is count().
199 virtual std::string key_at(int index); 209 virtual std::string key_at(int index);
  210 + // @remark: max index is count().
200 virtual SrsAmf0Any* value_at(int index); 211 virtual SrsAmf0Any* value_at(int index);
201 - virtual void set(std::string key, SrsAmf0Any* value);  
202 212
  213 +public:
  214 + virtual void set(std::string key, SrsAmf0Any* value);
203 virtual SrsAmf0Any* get_property(std::string name); 215 virtual SrsAmf0Any* get_property(std::string name);
204 virtual SrsAmf0Any* ensure_property_string(std::string name); 216 virtual SrsAmf0Any* ensure_property_string(std::string name);
205 }; 217 };
@@ -3183,7 +3183,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) @@ -3183,7 +3183,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream)
3183 SrsAmf0EcmaArray* arr = any->to_ecma_array(); 3183 SrsAmf0EcmaArray* arr = any->to_ecma_array();
3184 3184
3185 // if ecma array, copy to object. 3185 // if ecma array, copy to object.
3186 - for (int i = 0; i < arr->size(); i++) { 3186 + for (int i = 0; i < arr->count(); i++) {
3187 metadata->set(arr->key_at(i), arr->value_at(i)); 3187 metadata->set(arr->key_at(i), arr->value_at(i));
3188 } 3188 }
3189 3189
@@ -748,3 +748,64 @@ VOID TEST(AMF0Test, AnyAssert) @@ -748,3 +748,64 @@ VOID TEST(AMF0Test, AnyAssert)
748 EXPECT_EQ(1+4+3, s.pos()); 748 EXPECT_EQ(1+4+3, s.pos());
749 } 749 }
750 } 750 }
  751 +
  752 +VOID TEST(AMF0Test, ObjectProps)
  753 +{
  754 + SrsAmf0Object* o = NULL;
  755 +
  756 + // get/set property
  757 + if (true) {
  758 + o = SrsAmf0Any::object();
  759 + SrsAutoFree(SrsAmf0Object, o, false);
  760 +
  761 + EXPECT_TRUE(NULL == o->get_property("name"));
  762 +
  763 + o->set("name", SrsAmf0Any::str("winlin"));
  764 + EXPECT_TRUE(NULL != o->get_property("name"));
  765 +
  766 + EXPECT_TRUE(NULL == o->get_property("age"));
  767 +
  768 + o->set("age", SrsAmf0Any::number(100));
  769 + EXPECT_TRUE(NULL != o->get_property("age"));
  770 + }
  771 +
  772 + // index property
  773 + if (true) {
  774 + o = SrsAmf0Any::object();
  775 + SrsAutoFree(SrsAmf0Object, o, false);
  776 +
  777 + o->set("name", SrsAmf0Any::str("winlin"));
  778 + EXPECT_STREQ("name", o->key_at(0).c_str());
  779 + ASSERT_TRUE(o->value_at(0)->is_string());
  780 + EXPECT_STREQ("winlin", o->value_at(0)->to_str().c_str());
  781 +
  782 + o->set("age", SrsAmf0Any::number(100));
  783 + EXPECT_STREQ("name", o->key_at(0).c_str());
  784 + ASSERT_TRUE(o->value_at(0)->is_string());
  785 + EXPECT_STREQ("winlin", o->value_at(0)->to_str().c_str());
  786 +
  787 + EXPECT_STREQ("age", o->key_at(1).c_str());
  788 + ASSERT_TRUE(o->value_at(1)->is_number());
  789 + EXPECT_DOUBLE_EQ(100, o->value_at(1)->to_number());
  790 + }
  791 +
  792 + // ensure property
  793 + if (true) {
  794 + o = SrsAmf0Any::object();
  795 + SrsAutoFree(SrsAmf0Object, o, false);
  796 +
  797 + EXPECT_TRUE(NULL == o->ensure_property_string("name"));
  798 + EXPECT_TRUE(NULL == o->ensure_property_number("age"));
  799 +
  800 + o->set("name", SrsAmf0Any::str("winlin"));
  801 + EXPECT_TRUE(NULL != o->ensure_property_string("name"));
  802 + EXPECT_TRUE(NULL == o->ensure_property_number("name"));
  803 + EXPECT_TRUE(NULL == o->ensure_property_number("age"));
  804 +
  805 + o->set("age", SrsAmf0Any::number(100));
  806 + EXPECT_TRUE(NULL != o->ensure_property_string("name"));
  807 + EXPECT_TRUE(NULL == o->ensure_property_number("name"));
  808 + EXPECT_TRUE(NULL != o->ensure_property_number("age"));
  809 + EXPECT_TRUE(NULL == o->ensure_property_string("age"));
  810 + }
  811 +}