gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash libamf/amf.cpp libamf/amf.h testsuite/lib...


From: Rob Savoye
Subject: [Gnash-commit] gnash libamf/amf.cpp libamf/amf.h testsuite/lib...
Date: Sat, 17 Mar 2007 05:21:34 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Rob Savoye <rsavoye>    07/03/17 05:21:34

Modified files:
        libamf         : amf.cpp amf.h 
        testsuite/libamf.all: test_number.cpp test_object.cpp 
                              test_string.cpp test_variable.cpp 

Log message:
                * testsuite/libamf.all/test_object.cpp: Add building and testing
                a connect message against the binary.
                * libamf/amf.cpp, amf.h: Add support for undefined variables. 
Add
                support for building an RTMP message header. Add support to 
encode
                booleans and undefined variables.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/libamf/amf.cpp?cvsroot=gnash&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/gnash/libamf/amf.h?cvsroot=gnash&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/libamf.all/test_number.cpp?cvsroot=gnash&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/libamf.all/test_object.cpp?cvsroot=gnash&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/libamf.all/test_string.cpp?cvsroot=gnash&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/libamf.all/test_variable.cpp?cvsroot=gnash&r1=1.1&r2=1.2

Patches:
Index: libamf/amf.cpp
===================================================================
RCS file: /sources/gnash/gnash/libamf/amf.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- libamf/amf.cpp      16 Mar 2007 19:35:12 -0000      1.26
+++ libamf/amf.cpp      17 Mar 2007 05:21:33 -0000      1.27
@@ -16,7 +16,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: amf.cpp,v 1.26 2007/03/16 19:35:12 rsavoye Exp $ */
+/* $Id: amf.cpp,v 1.27 2007/03/17 05:21:33 rsavoye Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -84,8 +84,7 @@
       _packet_size(0),
       _amf_data(0),
       _seekptr(0),
-      _mystery_word(0),
-      _src_dest(0)
+      _mystery_word(0)
 {
     GNASH_REPORT_FUNCTION;
 }
@@ -97,8 +96,7 @@
       _total_size(0),
       _packet_size(0),
       _amf_data(0),
-      _mystery_word(0),
-      _src_dest(0)
+      _mystery_word(0)
 {
     GNASH_REPORT_FUNCTION;
     if (!_amf_data) {
@@ -313,7 +311,8 @@
           pktsize = -1;         // FIXME: no clue
           break;
       case UNDEFINED:
-          pktsize = 1;          // just the header, no data
+         // just the header, no data
+          pktsize = nbytes + 3; // two length bytes after the header
           break;
       case REFERENCE:
           pktsize = -1;         // FIXME: no clue
@@ -386,9 +385,14 @@
           log_msg("Null unimplemented\n");
           break;
       case UNDEFINED:
-          out = (char *)new char[pktsize];
-          memset(out, 0, pktsize);
-          *out++ = AMF::UNDEFINED;
+          x = out = (char *)new char[pktsize];
+          memset(x, 0, pktsize);
+          *x++ = AMF::UNDEFINED;
+          num = nbytes;
+          swapBytes(&num, 2);
+          memcpy(x, &num, 2);
+          x+=2;
+          memcpy(x, in, nbytes);
           break;
       case REFERENCE:
           log_msg("Reference unimplemented\n");
@@ -404,12 +408,12 @@
           break;
           // Encode the date as a 64 bit, big-endian, numeric value
       case DATE:
-          out = (char *)new char[pktsize];
-          memset(out, 0, pktsize);
-          *out++ = AMF::DATE;
+          x = out = (char *)new char[pktsize];
+          memset(x, 0, pktsize);
+          *x++ = AMF::DATE;
           num = *(amfnum_t *)in;
           swapBytes(&num, 8);
-          memcpy(out, &num, 8);
+          memcpy(x, &num, 8);
           break;
       case LONG_STRING:
           log_msg("LongString unimplemented\n");
@@ -423,12 +427,12 @@
       case XML_OBJECT:
           // Encode an XML object. The data follows a 4 byte length
           // field. (which must be big-endian)
-          out = (char *)new char[pktsize];
-          memset(out, 0, pktsize);
-          *out++ = AMF::STRING;
+          x = out = (char *)new char[pktsize];
+          memset(x, 0, pktsize);
+          *x++ = AMF::STRING;
           num = nbytes;
           swapBytes(&num, 4);
-          memcpy(out, in, nbytes);
+          memcpy(x, in, nbytes);
           break;
       case TYPED_OBJECT:
           log_msg("TypedObject unimplemented\n");
@@ -438,6 +442,56 @@
     return out;
 }
 
+/// \brief \ Each RTMP header consists of the following:
+///
+/// * Index & header size - The header size and amf channel index.
+/// * Total size - The total size of the message
+/// * Type - The type of the message
+/// * Routing - The source/destination of the message
+void *
+AMF::encodeRTMPHeader(int amf_index, amf_headersize_e head_size,
+                     int total_size, content_types_e type,
+                     amfsource_e routing)
+{
+    GNASH_REPORT_FUNCTION;
+    void *out = new char[total_size + 12 + 4];
+    memset(out, 0, total_size + 12 + 4);
+    char *tmpptr = reinterpret_cast<char *>(out);
+    // Make the index & header size byte
+    *tmpptr = head_size & AMF_HEADSIZE_MASK;    
+    *tmpptr += amf_index  & AMF_INDEX_MASK;
+    tmpptr++;
+
+    // Add the unknown bytes. These seem to be used by video and
+    // audio, and only when the header size is 4 or more.
+    if (head_size <= HEADER_4) {
+       memset(tmpptr, 0, 3);
+       tmpptr += 3;
+    }
+
+    // Add the size of the message if the header size is 8 or more.
+    if (head_size <= HEADER_8) {
+       int length = total_size;
+       swapBytes(&length, 4);
+       memcpy(tmpptr, ((char *)&length +1), 3);
+       tmpptr += 3;
+    }
+    
+    // Add the type of the objectif the header size is 8 or more.
+    if (head_size <= HEADER_8) {
+       *tmpptr = type;
+       tmpptr++;
+    }
+
+    // Add the routing of the message if the header size is 12 or more.
+    if (head_size == HEADER_12) {
+       memcpy(tmpptr, &routing, 4);
+       tmpptr += 4;
+    }
+
+    return out;
+}
+
 #if 0
 /// \brief Each header consists of the following:
 ///
@@ -682,12 +736,56 @@
 }
 
 void *
-AMF::encodeVariable(amf_element_t &el)
+AMF::encodeVariable(amf_element_t & /* el */)
 {
     GNASH_REPORT_FUNCTION;
 }
 
 void *
+AMF::encodeVariable(const char *name, bool flag)
+{
+    GNASH_REPORT_FUNCTION;
+    
+    int outsize = strlen(name) + AMF_NUMBER_SIZE + 5;
+    char *out = new char[outsize];
+    char *tmpptr = out;
+    short length;
+
+    length = strlen(name);
+    swapBytes(&length, 2);
+    memcpy(tmpptr, &length, 2);
+    tmpptr += 2;
+    strcpy(tmpptr, name);
+    tmpptr += strlen(name);
+    *tmpptr = AMF::BOOLEAN;
+    tmpptr++;
+    *tmpptr = flag;
+
+    return out;    
+}
+
+void *
+AMF::encodeVariable(const char *name)
+{
+    GNASH_REPORT_FUNCTION;
+    int outsize = strlen(name) + AMF_NUMBER_SIZE + 5;
+    char *out = new char[outsize];
+    char *tmpptr = out;
+    short length;
+
+    length = strlen(name);
+    swapBytes(&length, 2);
+    memcpy(tmpptr, &length, 2);
+    tmpptr += 2;
+    strcpy(tmpptr, name);
+    tmpptr += strlen(name);
+    *tmpptr = AMF::UNDEFINED;
+    tmpptr++;
+
+    return out;    
+}
+
+void *
 AMF::encodeVariable(const char *name, amfnum_t bignum)
 {
     GNASH_REPORT_FUNCTION;
@@ -872,7 +970,7 @@
     
     if (_header_size == 12) {
         hexify((unsigned char *)hexint, (unsigned char *)tmpptr, 3, false);
-        _src_dest = ntohl(*(unsigned int *)tmpptr);
+        _src_dest = *(reinterpret_cast<amfsource_e *>(tmpptr));
         tmpptr += sizeof(unsigned int);
         dbglogfile << "The source/destination is: " << _src_dest
                    << " Hex value is: 0x" << hexint << endl;
@@ -976,7 +1074,7 @@
               break;
           case OBJECT:
               do {
-                  tmpptr = extractVariables(&el, tmpptr);
+                  tmpptr = extractVariable(&el, tmpptr);
               } while (el.type != AMF::OBJECT_END);
               break;
           case MOVIECLIP:
@@ -1005,13 +1103,13 @@
 }
 
 unsigned char *
-AMF::extractVariables(amf_element_t *el, unsigned char *in)
+AMF::extractVariable(amf_element_t *el, unsigned char *in)
 {
     GNASH_REPORT_FUNCTION;
     
-    unsigned char buffer[300];
+    unsigned char buffer[AMF_PACKET_SIZE];
     unsigned char *tmpptr = in;
-    short length = 0;
+    short length;
 
     el->length = 0;
     el->name.erase();
@@ -1019,10 +1117,12 @@
         el->data = 0;
     }
     
-    memset(buffer, 0, 300);
+    memset(buffer, 0, AMF_PACKET_SIZE);
     // @@ casting generic pointers to bigger types may be dangerous
     //    due to memory alignment constraints
-    length = ntohs((*(const short *)tmpptr) & 0xffff);
+    length = *((short *)tmpptr);
+    swapBytes(&length, 2);
+//    length = ntohs((*(const short *)tmpptr) & 0xffff);
     el->length = length;
     if (length == 0) {
         if (*(tmpptr+2) == AMF::OBJECT_END) {
@@ -1035,7 +1135,7 @@
     }
     
 #if 0
-    unsigned char hexint[500];
+    unsigned char hexint[AMF_PACKET_SIZE];
     hexify((unsigned char *)hexint, (unsigned char *)tmpptr, length*3, true);
     dbglogfile << "The element is: 0x" << hexint << endl;
 #endif
@@ -1065,29 +1165,44 @@
          memset((void *)el->data, 0, AMF_NUMBER_SIZE+1);
           memcpy((void *)el->data, buffer, AMF_NUMBER_SIZE);
           unsigned char hexint[AMF_NUMBER_SIZE*3];
-          hexify((unsigned char *)hexint, (unsigned char *)buffer, 
AMF_NUMBER_SIZE, false);
-          dbglogfile << "Number \"" << el->name.c_str() << "\" is: 0x" << 
hexint << endl;
+          hexify((unsigned char *)hexint, (unsigned char *)buffer,
+                AMF_NUMBER_SIZE, false);
+          dbglogfile << "Number \"" << el->name.c_str() << "\" is: 0x"
+                    << hexint << endl;
 //          amfnum_t *num = extractNumber(tmpptr);
           tmpptr += 8;
           break;
       case BOOLEAN:
 //          int value = *tmpptr;
-           el->data = (const unsigned char*)tmpptr; 
-           dbglogfile << "Boolean \"" << el->name.c_str() << "\" is: " << ( 
(*tmpptr == 0) ? "true" :"false") << endl;
+          el->data = new unsigned char[1];
+         memcpy((void *)el->data, tmpptr, 1); 
+         dbglogfile << "Boolean \"" << el->name.c_str() << "\" is: "
+                    << ( (*tmpptr == 0) ? "true" :"false") << endl;
            tmpptr += 1;
            break;
       case STRING:
          length = ntohs((*(const short *)tmpptr) & 0xffff);
           tmpptr += sizeof(short);
           el->data = (const unsigned char*)tmpptr; 
-          dbglogfile << "Variable \"" << el->name.c_str() << "\" is: " << 
el->data << endl;
+          dbglogfile << "Variable \"" << el->name.c_str() << "\" is: "
+                    << el->data << endl;
           tmpptr += length;
           el->length = length;
           break;
       case OBJECT:
       case MOVIECLIP:
       case NULL_VALUE: 
+         // Undefined types have a name, but no value
       case UNDEFINED:
+          dbglogfile << "Undefined type" << endl;
+         length = ntohs((*(const short *)tmpptr) & 0xffff);
+          el->data = (const unsigned char*)tmpptr; 
+          dbglogfile << "Variable \"" << el->name.c_str() << "\" is: "
+                    << el->data << endl;
+//          tmpptr += length;
+          el->length = length;
+          el->type = AMF::UNDEFINED;
+          break;
       case REFERENCE:
       case ECMA_ARRAY:
       case OBJECT_END:

Index: libamf/amf.h
===================================================================
RCS file: /sources/gnash/gnash/libamf/amf.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- libamf/amf.h        16 Mar 2007 19:35:12 -0000      1.13
+++ libamf/amf.h        17 Mar 2007 05:21:34 -0000      1.14
@@ -58,7 +58,7 @@
 const char AMF_VERSION = 0;
 const int  AMF_HEADSIZE_MASK = 0xc0;
 const char AMF_HEADER_SIZE = 0x03;
-const char AMF_INDEX_MASK = 0x03f;
+const char AMF_INDEX_MASK = 0x3f;
 const int  AMF_VIDEO_PACKET_SIZE = 128;
 const int  AMF_AUDIO_PACKET_SIZE = 64;
 // This is the sized used when reading from the network to
@@ -170,6 +170,7 @@
         std::string     name;
         const unsigned char   *data;
     } amf_element_t;
+
     AMF();
     AMF(int size);
     ~AMF();
@@ -177,22 +178,30 @@
     // Swap the bytes for Little Endian machines
     void *swapBytes(void *word, int size);
     
+    // encode an element
     void *encodeElement(astype_e type, void *in, int nbytes);
+    // encode a string
     void *encodeString(char *str)  {
         return encodeElement (STRING, str, strlen(str));
     };
     void *encodeString(std::string &str) {
         return encodeElement (STRING, (void *)str.c_str(), str.size());
     };
+    // encode a 64 bit number
     void *encodeNumber(amfnum_t num)  {
         return encodeElement (NUMBER, &num, AMF_NUMBER_SIZE);
     };
     
+    // encode a variable. These are a name, followed by a string or number
+    void *encodeVariable(const char *name);
     void *encodeVariable(amf_element_t &el);
+    void *encodeVariable(const char *name, bool flag);
     void *encodeVariable(const char *name, amfnum_t num);
     void *encodeVariable(std::string &name, std::string &val);
     void *encodeVariable(const char *name, const char *val);
     
+    void *encodeRTMPHeader(int amf_index, amf_headersize_e size, int size,
+                           content_types_e type, amfsource_e routing);
 //     amfhead_t *encodeHeader(amfutf8_t *name, bool required, int nbytes, 
void *data);
 //     amfbody_t *encodeBody(amfutf8_t *target, amfutf8_t *response, int 
nbytes, void *data);
 //    amfpacket_t *encodePacket(std::vector<amfhead_t *> messages);
@@ -206,7 +215,7 @@
     amf_element_t *extractObject(const char *in);
 
     
-    unsigned char *extractVariables(amf_element_t *el, unsigned char *in);
+    unsigned char *extractVariable(amf_element_t *el, unsigned char *in);
     
     bool parseAMF(char *in);
     static int headerSize(char header);
@@ -220,12 +229,17 @@
     int getTotalSize()          { return _total_size; }; 
     int getPacketSize()         { return _packet_size; };
     int getMysteryWord()        { return _mystery_word; };
-    int getRouting()            { return _src_dest; };
+    amfsource_e getRouting()    { return _src_dest; };
+    int getAMFIndex()           { return _amf_index; };
 
     content_types_e getType()   { return _type; };
     
     unsigned char *addPacketData(unsigned char *data, int bytes);
-    //    std::map<amf_element_t *, std::vector<unsigned char *> > 
*getElements() { return &_elements; };
+    std::map<std::string, amf_element_t *> *getElements() { return &_elements; 
};
+    unsigned char *appendPtr(unsigned char *data, unsigned char *var, int 
bytes) {
+      memcpy(data, var, bytes);
+      return data += bytes;
+    }
     
  private:
     content_types_e     _type;
@@ -237,7 +251,7 @@
     unsigned char       *_amf_data;
     unsigned char       *_seekptr;
     int                 _mystery_word;
-    int                 _src_dest;
+    amfsource_e         _src_dest;
 };
 
  

Index: testsuite/libamf.all/test_number.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/libamf.all/test_number.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/libamf.all/test_number.cpp        16 Mar 2007 15:00:49 -0000      
1.1
+++ testsuite/libamf.all/test_number.cpp        17 Mar 2007 05:21:34 -0000      
1.2
@@ -92,7 +92,7 @@
 //     hexify((unsigned char *)hexint, (unsigned char *)&value, 8, false);
 //     cerr << "AMF value is: 0x" << hexint << endl;
 
-    if (((char *)num)[7] == 0x3f) {
+    if ((((char *)num)[6] == -16) && (((char *)num)[7] == 0x3f)) {
 //    if (memcmp(num, &value, AMF_NUMBER_SIZE) == 0) {
         runtest.pass("Extracted Number AMF object");
     } else {

Index: testsuite/libamf.all/test_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/libamf.all/test_object.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- testsuite/libamf.all/test_object.cpp        16 Mar 2007 19:35:12 -0000      
1.2
+++ testsuite/libamf.all/test_object.cpp        17 Mar 2007 05:21:34 -0000      
1.3
@@ -138,20 +138,324 @@
         runtest.fail("Message Routing");
     }
 
-    amf_obj.parseBody(buf + amf_obj.getHeaderSize(), amf_obj.getTotalSize());
+//    amf_obj.parseBody(buf + amf_obj.getHeaderSize(), amf_obj.getTotalSize());
 
-    tmpptr = buf;
+    // This extracts a "connect" message from the RTMP data stream. We
+    // look for everything ourselves to be the most accurate.
+    tmpptr = buf  + amf_obj.getHeaderSize();
+    char *str = amf_obj.extractString((char *)tmpptr);
+    if (strcmp(str, "connect") == 0) {
+        runtest.pass("Extracted \"connect\" string");
+    } else {
+        runtest.fail("Extracted \"connect\" string");
+    }
 
+    tmpptr += strlen(str) + AMF_HEADER_SIZE;    
+    amfnum_t *num = amf_obj.extractNumber((char *)tmpptr);
+    char     *numptr = (char *)num;
+    if ((numptr[6] == -16)
+        && (numptr[7] == 0x3f)) {
+        runtest.pass("Extracted \"connect\" number");
+    } else {
+        runtest.fail("Extracted \"connect\" number");
+    }
+    tmpptr += AMF_NUMBER_SIZE + 2;
     
-//    tmpptr = amf_obj.extractVariables(el, tmpptr);
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "app") {
+        runtest.pass("Extracted \"app\" variable");
+    } else {
+        runtest.fail("Extracted \"app\" variable");
+    }
+//    cerr << el.name << endl;
     
-//     char *str = amf_obj.extractObject(buf);
-//     if (strcmp(str, "connect") == 0) {
-//         runtest.pass("Extracted \"connect\" string");
-//     } else {
-//         runtest.fail("Extracted \"connect\" string");
-//     }
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "flashVer") {
+        runtest.pass("Extracted \"flashVer\" variable");
+    } else {
+        runtest.fail("Extracted \"flashVer\" variable");
+    }
+//    cerr << el.name << endl;
 
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "swfUrl") {
+        runtest.pass("Extracted \"swfUrl\" variable");
+    } else {
+        runtest.fail("Extracted \"swfUrl\" variable");
+    }
+//    cerr << el.name << endl;
+    
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "tcUrl") {
+        runtest.pass("Extracted \"tcUrl\" variable");
+    } else {
+        runtest.fail("Extracted \"tcUrl\" variable");
+    }
+//    cerr << el.name << endl;
+    
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "fpad") {
+        runtest.pass("Extracted \"fpad\" variable");
+    } else {
+        runtest.fail("Extracted \"fpad\" variable");
+    }
+//    cerr << el.name << endl;
+    
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "audioCodecs") {
+        runtest.pass("Extracted \"audioCodecs\" variable");
+    } else {
+        runtest.fail("Extracted \"audioCodecs\" variable");
+    }
+//    cerr << el.name << endl;
+    
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "videoCodecs") {
+        runtest.pass("Extracted \"videoCodecs\" variable");
+    } else {
+        runtest.fail("Extracted \"videoCodecs\" variable");
+    }
+//    cerr << el.name << endl;
+    
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "videoFunction") {
+        runtest.pass("Extracted \"videoFunction\" variable");
+    } else {
+        runtest.fail("Extracted \"videoFunction\" variable");
+    }
+//    cerr << el.name << endl;
+
+    tmpptr = amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "pageUrl") {
+        runtest.pass("Extracted \"pageURL\" variable");
+    } else {
+        runtest.fail("Extracted \"pageURL\" variable");
+    }
+//    cerr << el.name << endl;
+    
+    amf_obj.extractVariable(&el, tmpptr);
+    if (el.name == "objectEncoding") {
+        runtest.pass("Extracted \"objectEncoding\" variable");
+    } else {
+        runtest.fail("Extracted \"objectEncoding\" variable");
+    }
+//    cerr << el.name << endl;
+    
+    // Now build our own connect message with the same data, which
+    // should give us an exact copy.
+    int amf_index = amf_obj.getAMFIndex();
+    AMF::amf_headersize_e head_size = AMF::HEADER_12;
+    int total_size = amf_obj.getTotalSize();
+    AMF::content_types_e type = AMF::INVOKE;
+    amfsource_e routing = amf_obj.getRouting();
+    AMF rtmp;
+
+    // First build and test the header. This uses the same data as the
+    // previous one
+    unsigned char *out = reinterpret_cast<unsigned char 
*>(rtmp.encodeRTMPHeader(amf_index, head_size, total_size, type, routing));
+    tmpptr = out;
+    rtmp.parseHeader(out);
+    if (rtmp.getTotalSize() == 269) {
+        runtest.pass("New Message Header Total Size");
+    } else {
+        runtest.fail("New Message Header Total Size");
+    }
+    
+    if (rtmp.getHeaderSize() == 12) {
+        runtest.pass("New Message Header Size");
+    } else {
+        runtest.fail("New Message Header Size");
+    }
+    
+    if (rtmp.getMysteryWord() == 0) {
+        runtest.pass("New Message Mystery Word");
+    } else {
+        runtest.fail("Message Mystery Word");
+    }
+    
+    if (rtmp.getRouting() == CLIENT) {
+        runtest.pass("New Message Routing");
+    } else {
+        runtest.fail("New Message Routing");
+    }
+
+    if (memcmp(out, buf, 12) == 0) {
+        runtest.pass("RTMP Headers match");
+    } else {
+        runtest.fail("RTMP Headers match");
+    }
+
+    tmpptr += rtmp.getHeaderSize();
+    
+    // Now build up a body of a connect message
+    unsigned char *var;
+
+    var = (unsigned char *)rtmp.encodeString("connect");
+    if (strncmp(rtmp.extractString((char *)var), "connect", strlen("connect")) 
== 0) {
+        runtest.pass("Encoded \"connect\" string");
+    } else {
+        runtest.fail("Encoded \"connect\" string");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, strlen("connect") + 3);
+    delete var;
+
+    amfnum_t bignum = 0x3ff0000000000000LL;
+    numptr = (char *)&bignum;
+    var = (unsigned char *)rtmp.encodeNumber(bignum);
+    if (*rtmp.extractNumber((char *)var) == bignum) {
+        runtest.pass("Encoded \"connect\" number");
+    } else {
+        runtest.fail("Encoded \"connect\" number");
+    }
+
+    tmpptr = rtmp.appendPtr(tmpptr, var, AMF_NUMBER_SIZE + 1);
+    delete var;
+
+    // Start the object
+    *tmpptr++ = AMF::OBJECT;
+    
+    var = (unsigned char *)rtmp.encodeVariable("app", "oflaDemo");
+    rtmp.extractVariable(&el, var);
+    if ((el.name == "app") && (strncmp((char *)el.data, "oflaDemo", 8) == 0)) {
+        runtest.pass("Encoded \"app\" variable");
+    } else {
+        runtest.fail("Encoded \"app\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.length + strlen("app") + 5);
+    delete var;
+    
+    var = (unsigned char *)rtmp.encodeVariable("flashVer", "LNX 9,0,31,0");
+    rtmp.extractVariable(&el, var);
+    if ((el.name == "flashVer") && (strncmp((char *)el.data, "LNX 9,0,31,0", 
el.length) == 0)) {
+        runtest.pass("Encoded \"flashVer\" variable");
+    } else {
+        runtest.fail("Encoded \"flashVer\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.length + strlen("flashVer") + 5);
+    delete var;
+    
+    var = (unsigned char *)rtmp.encodeVariable("swfUrl", 
"http://www.red5.nl/tools/publisher/publisher.swf";);
+    rtmp.extractVariable(&el, var);
+    if ((el.name == "swfUrl") && (strncmp((char *)el.data, 
"http://www.red5.nl/tools/publisher/publisher.swf";, el.length) == 0)) {
+        runtest.pass("Encoded \"swfUrl\" variable");
+    } else {
+        runtest.fail("Encoded \"swfUrl\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.length + strlen("swfUrl") + 5);
+    delete var;
+    
+    var = (unsigned char *)rtmp.encodeVariable("tcUrl", 
"rtmp://localhost/oflaDemo");
+    rtmp.extractVariable(&el, var);
+    if ((el.name == "tcUrl") && (strncmp((char *)el.data, 
"rtmp://localhost/oflaDemo", 25) == 0)) {
+        runtest.pass("Encoded \"tcUrl\" variable");
+    } else {
+        runtest.fail("Encoded \"tcUrl\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.length + strlen("tcUrl") + 5);
+    delete var;
+
+    var = (unsigned char *)rtmp.encodeVariable("fpad", false);
+    rtmp.extractVariable(&el, var);
+    if ((el.name == "fpad") && (*el.data == 0)) {
+        runtest.pass("Encoded \"fpad\" Boolean variable");
+    } else {
+        runtest.fail("Encoded \"fpad\" Boolean variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, 1 + strlen("fpad") + 3);
+    delete var;
+    
+    bignum = 0x388340LL;
+    numptr = (char *)&bignum;
+    var = (unsigned char *)rtmp.encodeVariable("audioCodecs", bignum);
+    rtmp.extractVariable(&el, var);
+    
+    if ((el.type == amf::AMF::NUMBER)
+        && (el.name == "audioCodecs")
+        && (el.data[5] == 0x38)
+        && (el.data[6] == 0x83)
+        && (el.data[7] == 0x40)) {
+        runtest.pass("Encoded \"audioCodecs\" variable");
+    } else {
+        runtest.fail("Encoded \"audioCodecs\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.name.size() + AMF_NUMBER_SIZE + 3);
+    delete var;
+    
+    bignum = 0x5f40LL;
+    numptr = (char *)&bignum;
+    var = (unsigned char *)rtmp.encodeVariable("videoCodecs", bignum);
+    rtmp.extractVariable(&el, var);
+    
+    if ((el.type == amf::AMF::NUMBER)
+        && (el.name == "videoCodecs")
+        && (el.data[6] == 0x5f)
+        && (el.data[7] == 0x40)) {
+        runtest.pass("Encoded \"videoCodecs\" variable");
+    } else {
+        runtest.fail("Encoded \"videoCodecs\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.name.size() + AMF_NUMBER_SIZE + 3);
+    delete var;
+    
+    bignum = 0xf03fLL;
+    numptr = (char *)&bignum;
+    var = (unsigned char *)rtmp.encodeVariable("videoFunction", bignum);
+    rtmp.extractVariable(&el, var);
+    
+    if ((el.type == amf::AMF::NUMBER)
+        && (el.name == "videoFunction")
+        && (el.data[6] == 0xf0)
+        && (el.data[7] == 0x3f)) {
+        runtest.pass("Encoded \"videoFunction\" variable");
+    } else {
+        runtest.fail("Encoded \"videoFunction\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.name.size() + AMF_NUMBER_SIZE + 3);
+    delete var;
+    
+    var = (unsigned char *)rtmp.encodeVariable("pageUrl");
+    rtmp.extractVariable(&el, var);
+    if ((el.type == amf::AMF::UNDEFINED)
+        && (el.name == "pageUrl")) {
+        runtest.pass("Encoded \"pageUrl\" undefined variable");
+    } else {
+        runtest.fail("Encoded \"pageUrl\" undefined variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.name.size() + 3);
+    delete var;
+    
+    bignum = 0x0;
+    numptr = (char *)&bignum;
+    var = (unsigned char *)rtmp.encodeVariable("objectEncoding", bignum);
+    rtmp.extractVariable(&el, var);
+    
+    if ((el.type == amf::AMF::NUMBER)
+        && (el.name == "objectEncoding")
+        && (el.data[6] == 0x0)
+        && (el.data[7] == 0x0)) {
+        runtest.pass("Encoded \"objectEncoding\" variable");
+    } else {
+        runtest.fail("Encoded \"objectEncoding\" variable");
+    }
+    tmpptr = rtmp.appendPtr(tmpptr, var, el.name.size() + AMF_NUMBER_SIZE + 3);
+    delete var;
+
+    // Start the object
+    *tmpptr++ = AMF::OBJECT_END;
+    
+    if (memcmp(buf, out, amf_obj.getTotalSize()) == 0) {
+        runtest.pass("Object Packets match");
+    } else {
+        runtest.fail("Object Packets match");
+    }    
+
+    unsigned char hexint[AMF_PACKET_SIZE];
+    hexify((unsigned char *)hexint, (unsigned char *)buf, 
amf_obj.getTotalSize() + 10, true);
+    cerr << "buf is: 0x" << hexint << ", size is: " << amf_obj.getTotalSize() 
<< endl;
+    hexify((unsigned char *)hexint, (unsigned char *)out, rtmp.getTotalSize() 
+ 10, true);
+    cerr << "out is: 0x" << hexint << ", size is: " << rtmp.getTotalSize() << 
endl;
+    
+//    delete out;
 }
 
 static void

Index: testsuite/libamf.all/test_string.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/libamf.all/test_string.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/libamf.all/test_string.cpp        16 Mar 2007 15:00:49 -0000      
1.1
+++ testsuite/libamf.all/test_string.cpp        17 Mar 2007 05:21:34 -0000      
1.2
@@ -80,8 +80,9 @@
     ret = read(fd, buf, AMF_VIDEO_PACKET_SIZE);
     close(fd);
 
+    char *connect = "connect";
     char *str = amf_obj.extractString(buf);
-    if (strcmp(str, "connect") == 0) {
+    if (strcmp(str, connect) == 0) {
         runtest.pass("Extracted \"connect\" string");
     } else {
         runtest.fail("Extracted \"connect\" string");
@@ -89,7 +90,6 @@
 
     // Now make sure we can also create strings. We'll create the same
     // string we just read, and make sure they match.
-    char *connect = "connect";
     void *out = amf_obj.encodeElement(AMF::STRING, connect, strlen(connect));
     if (memcmp(out, buf, 10) == 0) {
         runtest.pass("Encoded \"connect\" string");

Index: testsuite/libamf.all/test_variable.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/libamf.all/test_variable.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/libamf.all/test_variable.cpp      16 Mar 2007 19:35:12 -0000      
1.1
+++ testsuite/libamf.all/test_variable.cpp      17 Mar 2007 05:21:34 -0000      
1.2
@@ -117,7 +117,7 @@
     ret = read(fd, buf, AMF_PACKET_SIZE);
     close(fd);
 
-    if (amf_obj.extractVariables(&el, buf)) {
+    if (amf_obj.extractVariable(&el, buf)) {
         runtest.pass("Got String element");
     } else {
         runtest.fail("Got String element");
@@ -170,7 +170,7 @@
     ret = read(fd, buf, AMF_PACKET_SIZE);
     close(fd);
 
-    if (amf_obj.extractVariables(&el, buf)) {
+    if (amf_obj.extractVariable(&el, buf)) {
         runtest.pass("Got Number element");
     } else {
         runtest.fail("Got Number element");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]