[Top][All Lists]
[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");
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash libamf/amf.cpp libamf/amf.h testsuite/lib...,
Rob Savoye <=