void Handshake::packetHandler(PacketReader& packet) { UInt8 marker = packet.read8(); if(marker!=0x0b) { ERROR("Marker handshake wrong : should be 0b and not %u",marker); return; } UInt16 time = packet.read16(); UInt8 id = packet.read8(); packet.shrink(packet.read16()); // length PacketWriter& response(writer()); UInt32 pos = response.position(); response.next(3); UInt8 idResponse = handshakeHandler(id,packet,response); response.reset(pos); if(idResponse>0) { response.write8(idResponse); response.write16(response.length()-response.position()-2); flush(); } // reset farid to 0! (UInt32&)farId=0; }
void add(PacketReader& fragment) { string::size_type old = _buffer.size(); _buffer.resize(old + (string::size_type)fragment.available()); if(_buffer.size()>old) memcpy(&_buffer[old],fragment.current(),(size_t)fragment.available()); ++(UInt16&)fragments; }
void Session::receiveWithoutFlush(PacketReader& packet) { if(died) return; if (!dumpJustInDebug || (dumpJustInDebug && Logs::GetLevel()>=7)) DUMP(packet.data(),packet.size(),"Request from ",peer.address.toString()) packetHandler(packet); }
void Handshake::packetHandler(PacketReader& packet) { UInt8 marker = packet.read8(); if(marker!=0x0b) { ERROR("Marker handshake wronk : must be '0B' and not '%02x'",marker); return; } UInt16 time = packet.read16(); UInt8 id = packet.read8(); packet.shrink(packet.read16()); // length PacketWriter& packetOut = writer(); UInt8 idResponse=0; { PacketWriter response(packetOut,3); idResponse = handshakeHandler(id,packet,response); if(idResponse==0) return; } packetOut << (UInt8)idResponse; packetOut << (UInt16)(packetOut.length()-packetOut.position()-2); send(true); // reset farid to 0! _farId=0; }
void add(PacketReader& fragment) { string::size_type old = _pBuffer->size(); _pBuffer->resize(old + fragment.available(),true); if(_pBuffer->size()>old) memcpy(_pBuffer->data()+old,fragment.current(),fragment.available()); ++(UInt16&)fragments; }
void test_PacketReader_parseBinaryFile_append() { /* * Add our 2 packets */ pl->LogPacket(*mp1); pl->LogPacket(*mp2); pl->flush(0); /* * First parse, should have 2 */ unsigned int i = p->parseBinaryFile(pl->getFile()); CPPUNIT_ASSERT( i == 2 ); /* * Trigger append mode */ p->setAppend(true); /* * Second parse. Since no reset, should have 4 */ i = p->parseBinaryFile(pl->getFile()); CPPUNIT_ASSERT( i = 4 ); /* * And back again */ p->setAppend(false); i = p->parseBinaryFile(pl->getFile()); CPPUNIT_ASSERT( i == 2 ); }
void FlashStream::rawHandler(UInt8 type, PacketReader& packet, FlashWriter& writer) { if(packet.read16()==0x22) { // TODO Here we receive RTMFP flow sync signal, useless to support it! //TRACE("Sync ",id," : ",data.read32(),"/",data.read32()); return; } ERROR("Raw message ",Format<UInt8>("%.2x",type),"/",packet.read16()," unknown on stream ",id); }
void WorldServerConnectHandler::whisperPlayer(PacketReader &packet) { int32_t whisperee = packet.get<int32_t>(); string whisperer = packet.getString(); uint16_t channel = packet.get<int16_t>(); string message = packet.getString(); PlayersPacket::whisperPlayer(PlayerDataProvider::Instance()->getPlayer(whisperee), whisperer, channel, message); }
void Publication::pushRawPacket(UInt8 type,PacketReader& packet) { list<Listener*>::const_iterator it; int pos = packet.position(); for(it=_listeners.begin();it!=_listeners.end();++it) { (*it)->pushRawPacket(type,packet); packet.reset(pos); } }
bool RTMFP::Decode(Exception& ex,RTMFPEngine& aesDecrypt,PacketReader& packet) { // Decrypt aesDecrypt.process(packet.current(),(UInt8*)packet.current(),packet.available()); bool result = ReadCRC(packet); if (!result) ex.set(Exception::CRYPTO, "Bad RTMFP CRC sum computing"); return result; }
UInt32 RTMFP::Unpack(PacketReader& packet) { packet.reset(); UInt32 id=0; for(int i=0;i<3;++i) id ^= packet.read32(); packet.reset(4); return id; }
bool RTMFP::Decode(AESEngine& aesDecrypt,PacketReader& packet) { // Decrypt aesDecrypt.process(packet.current(),packet.current(),packet.available()); // Check the first 2 CRC bytes packet.reset(4); UInt16 sum = packet.read16(); return (sum == CheckSum(packet)); }
void Publication::pushVideoPacket(PacketReader& packet) { UInt32 time = packet.read32(); // TODO? list<Listener*>::const_iterator it; int pos = packet.position(); for(it=_listeners.begin();it!=_listeners.end();++it) { (*it)->pushVideoPacket(packet); packet.reset(pos); } }
void Maps::useScriptedPortal(Player *player, PacketReader &packet) { packet.skipBytes(1); string portalname = packet.getString(); PortalInfo *portal = getMap(player->getMap())->getPortal(portalname); if (portal == nullptr) // Exit the function if portal is not found return; usePortal(player, portal); }
// Stored packets void PlayerDataProvider::parseIncomingPacket(PacketReader &packet) { int32_t playerid = packet.get<int32_t>(); bool fromCashOrMts = packet.getBool(); size_t psize = packet.getBufferLength(); unsigned char *buf = new unsigned char[psize]; // Prevent the packet memory from being freed by external sources memcpy(buf, packet.getBuffer(), psize); m_packets[playerid].reset(new PacketReader(buf, psize)); SyncPacket::playerBuffsTransferred(ChannelServer::Instance()->getWorldConnection(), playerid, fromCashOrMts); }
void FlowConnection::rawHandler(UInt8 type,PacketReader& data) { UInt16 flag = data.read16(); if(flag!=0x03) { Flow::rawHandler(type,data); return; } // setBufferTime UInt32 streamId = data.read32(); if(streamId>0) { INFO("setBufferTime %u on stream %u",data.read32(),streamId) BinaryWriter& raw = writer.writeRawMessage(); raw.write16(0); raw.write32(streamId); } }
void FlashStream::rawHandler(UInt8 type, PacketReader& packet, FlashWriter& writer) { if(packet.read16()==0x22) { // TODO Here we receive publication bounds (id + tracks), useless? maybe to record a file and sync tracks? //TRACE("Bound ",id," : ",data.read32()," ",data.read32()); return; } ERROR("Raw message ",type," unknown on stream ",id); }
void Listener::pushVideoPacket(UInt32 time,PacketReader& packet) { if(!receiveVideo) { _firstKeyFrame=false; return; } if(!_pVideoWriter) { ERROR("Listener %u must be initialized before to be used",id); return; } // key frame ? if(((*packet.current())&0xF0) == 0x10) _firstKeyFrame=true; if(!_firstKeyFrame) { DEBUG("Video frame dropped for listener %u to wait first key frame",id); ++(UInt32&)_pVideoWriter->qos.droppedFrames; return; } if(_pVideoWriter->reseted) { _pVideoWriter->reseted=false; writeBounds(); } _pVideoWriter->write(computeTime(time),packet,_unbuffered); }
void FlowStream::videoHandler(PacketReader& packet) { if(_pPublication && _pPublication->publisherId() == _index) { _pPublication->pushVideoPacket(packet.read32(),packet,_numberLostFragments); _numberLostFragments=0; } else WARN("a video packet has been received on a no publisher FlowStream, certainly a publication currently closing"); }
void WorldServerConnectHandler::findPlayer(PacketReader &packet) { int32_t finder = packet.get<int32_t>(); int16_t channel = packet.get<int16_t>(); string name = packet.getString(); int8_t is = packet.get<int8_t>(); PlayersPacket::findPlayer(PlayerDataProvider::Instance()->getPlayer(finder), name, channel, is); }
void MobHandler::handleTurncoats(Player *player, PacketReader &packet) { int32_t mobfrom = packet.get<int32_t>(); int32_t playerid = packet.get<int32_t>(); int32_t mobto = packet.get<int32_t>(); packet.skipBytes(1); // Same as player damage, -1 = bump, integer = skill ID int32_t damage = packet.get<int32_t>(); packet.skipBytes(1); // Facing direction packet.skipBytes(4); // Some type of pos, damage display, I think Map *map = Maps::getMap(player->getMap()); Mob *damager = map->getMob(mobfrom); Mob *taker = map->getMob(mobto); if (damager != nullptr && taker != nullptr) { taker->applyDamage(playerid, damage); } }
void FlowStream::videoHandler(PacketReader& packet) { if(_pPublication && _pPublication->publisherId() == _index) { _pPublication->pushVideoPacket(peer,packet.read32(),packet,_numberLostFragments); _numberLostFragments=0; } else fail("a video packet has been received on a no publisher FlowStream"); }
JNIEXPORT void JNICALL Java_com_mobilecg_androidapp_EcgJNI_processEcgData(JNIEnv *env, jclass type, jbyteArray jdata, jint size) { (void)type; jbyte* data = env->GetByteArrayElements(jdata, 0); char* chars = (char*) data; static PacketReader packetReader; for(int i=0; i < size; ++i) { packetReader.addByte(chars[i]); if(packetReader.isPacketReady()) { PacketRouter::instance().packetReceived(packetReader.getPacketHeader(), packetReader.getPacketData()); } } env->ReleaseByteArrayElements(jdata, data, 0); }
AMF::ContentType RTMFPFlow::unpack(PacketReader& packet,UInt32& time) { if(packet.available()==0) return AMF::EMPTY; AMF::ContentType type = (AMF::ContentType)packet.read8(); switch(type) { // amf content case AMF::INVOCATION_AMF3: packet.next(1); case AMF::INVOCATION: packet.next(4); return AMF::INVOCATION; case AMF::AUDIO: case AMF::VIDEO: time = packet.read32(); break; case AMF::DATA: packet.next(1); case AMF::RAW: packet.next(4); case AMF::CHUNKSIZE: break; default: ERROR("Unpacking type '",Format<UInt8>("%02x",(UInt8)type),"' unknown"); break; } return type; }
void FlowStream::rawHandler(UInt8 type,PacketReader& data) { UInt16 flag = data.read16(); if(flag==0x22) { // TODO Here we receive publication bounds (id + tracks), useless? maybe to record a file and sync tracks? //TRACE("Bound %u : %u %u",id,data.read32(),data.read32()); return; } ERROR("Unknown raw flag %u on FlowStream %llu",flag,id); Flow::rawHandler(type,data); }
void AlliancePacket::sendChangeNotice(int32_t allianceid, int32_t playerid, PacketReader &pack) { PacketCreator packet; packet.add<int16_t>(IMSG_SYNC); packet.add<int8_t>(Sync::SyncTypes::Alliance); packet.add<int8_t>(Sync::Alliance::ChangeNotice); packet.add<int32_t>(allianceid); packet.add<int32_t>(playerid); packet.addString(pack.getString()); ChannelServer::Instance()->sendToWorld(packet); }
void test_PacketReader_parseBinaryFile_empty() { unsigned int i = p->parseBinaryFile("/tmp/file_does_not_exist"); /* * Any sort of file operation that would fail, should produce * a 'zero packets parsed' return. */ CPPUNIT_ASSERT( i == 0 ); }
void RTMFPHandshake::packetHandler(PacketReader& packet) { UInt8 marker = packet.read8(); if(marker!=0x0b) { ERROR("Marker handshake wrong : should be 0b and not ",Format<UInt8>("%.2x",marker)); return; } UInt16 time = packet.read16(); UInt8 id = packet.read8(); packet.shrink(packet.read16()); // length PacketWriter& response(this->packet()); UInt32 oldSize(response.size()); response.next(3); // type and size UInt8 idResponse = handshakeHandler(id,packet,response); if(idResponse>0) BinaryWriter(response,oldSize).write8(idResponse).write16(response.size()-oldSize-3); else response.clear(oldSize); }
Message::Type Flow::unpack(PacketReader& reader) { if(reader.available()==0) return Message::EMPTY; Message::Type type = (Message::Type)reader.read8(); switch(type) { // amf content case 0x11: reader.next(1); case Message::AMF_WITH_HANDLER: reader.next(4); return Message::AMF_WITH_HANDLER; case Message::AMF: reader.next(5); case Message::AUDIO: case Message::VIDEO: break; // raw data case 0x04: reader.next(4); case 0x01: break; default: ERROR("Unpacking type '%02x' unknown",type); break; } return type; }
void Maps::usePortal(Player *player, PacketReader &packet) { packet.skipBytes(1); int32_t opcode = packet.get<int32_t>(); switch (opcode) { case 0: // Dead if (player->getStats()->getHp() == 0) { packet.getString(); // Useless packet.skipBytes(1); // Useless bool wheel = packet.getBool(); if (wheel && player->getInventory()->getItemAmount(Items::WheelOfDestiny) <= 0) { player->acceptDeath(false); return; } Inventory::takeItem(player, Items::WheelOfDestiny, 1); player->acceptDeath(wheel); } break; case -1: { string portalname = packet.getString(); Map *tomap = getMap(player->getMap()); if (tomap == nullptr) return; PortalInfo *portal = tomap->getPortal(portalname); if (portal == nullptr) // Exit the function if portal is not found return; usePortal(player, portal); break; } default: { // GM Map change (command "/m") if (player->isGm() && getMap(opcode)) { player->setMap(opcode); } } } }