// Parse an FitcDemo Request message coming from the Red5 fitcDemo_test. This // method should only be used for testing purposes. vector<boost::shared_ptr<amf::Element > > FitcDemoTest::parseFitcDemoRequest(boost::uint8_t *ptr, size_t size) { // GNASH_REPORT_FUNCTION; AMF amf; vector<boost::shared_ptr<amf::Element > > headers; // The first element is the name of the test, 'fitcDemo' boost::shared_ptr<amf::Element> el1 = amf.extractAMF(ptr, ptr+size); ptr += amf.totalsize(); headers.push_back(el1); // The second element is the number of the test, boost::shared_ptr<amf::Element> el2 = amf.extractAMF(ptr, ptr+size); ptr += amf.totalsize(); headers.push_back(el2); // This one has always been a NULL object from my tests boost::shared_ptr<amf::Element> el3 = amf.extractAMF(ptr, ptr+size); ptr += amf.totalsize(); headers.push_back(el3); // This one has always been an NULL or Undefined object from my tests boost::shared_ptr<amf::Element> el4 = amf.extractAMF(ptr, ptr+size); if (!el4) { log_error("Couldn't reliably extract the fitcDemo data!"); } ptr += amf.totalsize(); headers.push_back(el4); return headers; }
/// \brief Parse the header of the memory segment. /// /// @param data real pointer to start parsing from. /// /// @param tooFar A pointer to one-byte-past the last valid memory /// address within the buffer. /// /// @return A real pointer to the data after the headers has been parsed. /// /// @remarks May throw a ParserException std::uint8_t * LcShm::parseHeader(std::uint8_t *data, std::uint8_t* tooFar) { // GNASH_REPORT_FUNCTION; std::uint8_t *ptr = data; if (data == nullptr) { log_debug(_("No data pointer to parse!")); return nullptr; } #ifndef GNASH_TRUST_AMF ENSUREBYTES(ptr, tooFar, LC_HEADER_SIZE); #endif memcpy(&_header, ptr, LC_HEADER_SIZE); // memcpy(&_object, data + LC_HEADER_SIZE, _header.length); // log_debug("Timestamp: %d", _header.timestamp); // log_debug("Length: %d", _header.length); // log_debug("Connection: %s", _object.connection_name); // log_debug("name: %s", _object.hostname); ptr += LC_HEADER_SIZE; AMF amf; std::shared_ptr<Element> el = amf.extractAMF(ptr, tooFar); if (el == nullptr) { log_debug(_("Didn't extract an element from the byte stream!")); return nullptr; } _object.connection_name = el->to_string(); el = amf.extractAMF(ptr, tooFar); if (ptr != nullptr) { _object.hostname = el->to_string(); } // el = new amf::Element; // ptr = amf.extractElement(el, ptr); // _object.domain = el->to_bool(); // delete el; // el = new amf::Element; // ptr = amf.extractElement(el, ptr); // _object.unknown_num1 = el->to_number(); // delete el; // el = new amf::Element; // ptr = amf.extractElement(el, ptr); // _object.unknown_num2 = el->to_number(); // delete el; // memcpy(&_object, data + LC_HEADER_SIZE, _header.length); // log_debug("Connection: %s", _object.connection_name.c_str()); // log_debug("name: %s", _object.hostname.c_str()); // log_debug("domain: %s", (_object.domain) ? "true" : "false"); // log_debug("unknown_num1: %f", _object.unknown_num1); // log_debug("unknown_num2: %f", _object.unknown_num2); // ptr += 3; // skip past the NULL terminator return ptr; }