void Flow::fragmentSortedHandler(UInt64 stage,PacketReader& fragment,UInt8 flags) { if(stage<=this->stage) { ERROR("Stage %llu not sorted on flow %llu",stage,id); return; } if(stage>(this->stage+1)) { // not following stage! UInt32 lostCount = (UInt32)(stage-this->stage-1); (UInt64&)this->stage = stage; if(_pPacket) { delete _pPacket; _pPacket = NULL; } if(flags&MESSAGE_WITH_BEFOREPART) { lostFragmentsHandler(lostCount+1); return; } lostFragmentsHandler(lostCount); } else (UInt64&)this->stage = stage; // If MESSAGE_ABANDONMENT, content is not the right normal content! if(flags&MESSAGE_ABANDONMENT) { if(_pPacket) { delete _pPacket; _pPacket = NULL; } return; } PacketReader* pMessage(&fragment); if(flags&MESSAGE_WITH_BEFOREPART){ if(!_pPacket) { WARN("A received message tells to have a 'beforepart' and nevertheless partbuffer is empty, certainly some packets were lost"); lostFragmentsHandler(1); delete _pPacket; _pPacket = NULL; return; } _pPacket->add(fragment); if(flags&MESSAGE_WITH_AFTERPART) return; pMessage = _pPacket->release(); } else if(flags&MESSAGE_WITH_AFTERPART) { if(_pPacket) { ERROR("A received message tells to have not 'beforepart' and nevertheless partbuffer exists"); lostFragmentsHandler(_pPacket->fragments); delete _pPacket; } _pPacket = new Packet(fragment); return; } Message::Type type = unpack(*pMessage); if(type!=Message::EMPTY) { writer._callbackHandle = 0; string name; AMFReader amf(*pMessage); if(type==Message::AMF_WITH_HANDLER || type==Message::AMF) { amf.read(name); if(type==Message::AMF_WITH_HANDLER) { writer._callbackHandle = amf.readNumber(); if(amf.followingType()==AMF::Null) amf.readNull(); } } try { switch(type) { case Message::AMF_WITH_HANDLER: case Message::AMF: messageHandler(name,amf); break; case Message::AUDIO: audioHandler(*pMessage); break; case Message::VIDEO: videoHandler(*pMessage); break; default: rawHandler(type,*pMessage); } } catch(Exception& ex) { _error = "flow error, " + ex.displayText(); } catch(exception& ex) { _error = string("flow error, ") + ex.what(); } catch(...) { _error = "Unknown flow error"; } } writer._callbackHandle = 0; if(_pPacket) { delete _pPacket; _pPacket=NULL; } if(flags&MESSAGE_END) complete(); }
void Flow::messageHandler(UInt32 stage,PacketReader& message,UInt8 flags) { if(_completed) return; if(stage<=_stage) { DEBUG("Stage %u on flow %u has already been received",stage,id); return; } _stage = stage; PacketReader* pMessage(NULL); if(flags&MESSAGE_WITH_BEFOREPART){ if(_sizeBuffer==0) { ERROR("A received message tells to have a 'afterpart' and nevertheless partbuffer is empty"); return; } UInt8* pOldBuffer = _pBuffer; _pBuffer = new UInt8[_sizeBuffer + message.available()](); memcpy(_pBuffer,pOldBuffer,_sizeBuffer); memcpy(_pBuffer+_sizeBuffer,message.current(),message.available()); _sizeBuffer += message.available(); delete [] pOldBuffer; if(flags&MESSAGE_WITH_AFTERPART) return; pMessage = new PacketReader(_pBuffer,_sizeBuffer); } else if(flags&MESSAGE_WITH_AFTERPART) { if(_sizeBuffer>0) { ERROR("A received message tells to have not 'beforepart' and nevertheless partbuffer exists"); delete [] _pBuffer; _sizeBuffer=0; } _sizeBuffer = message.available(); _pBuffer = new UInt8[_sizeBuffer](); memcpy(_pBuffer,message.current(),_sizeBuffer); return; } if(!pMessage) pMessage = new PacketReader(message); UInt8 type = unpack(*pMessage); if(type!=EMPTY) { writer._callbackHandle = 0; string name; AMFReader amf(*pMessage); if(type==AMF_WITH_HANDLER || type==AMF) { amf.read(name); if(type==AMF_WITH_HANDLER) { writer._callbackHandle = amf.readNumber(); amf.skipNull(); } } // create code prefix writer._code.assign(_name); if(!name.empty()) { writer._code.append("."); writer._code.push_back(toupper(name[0])); if(name.size()>1) writer._code.append(&name[1]); } switch(type) { case AMF_WITH_HANDLER: case AMF: messageHandler(name,amf); break; case AUDIO: audioHandler(*pMessage); break; case VIDEO: videoHandler(*pMessage); break; default: rawHandler(type,*pMessage); } } delete pMessage; if(flags&MESSAGE_END) complete(); if(_sizeBuffer>0) { delete [] _pBuffer; _sizeBuffer=0; } }