Example #1
0
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;
}
Example #2
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;
	}
Example #3
0
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);
}
Example #4
0
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;
}
Example #5
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 );

    }
Example #7
0
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);
}
Example #9
0
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);
	}
}
Example #10
0
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;
}
Example #11
0
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;
}
Example #12
0
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));
}
Example #13
0
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);
	}
}
Example #14
0
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);
}
Example #15
0
// 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);
}
Example #16
0
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);
	}
}
Example #17
0
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);
}
Example #18
0
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);
}
Example #19
0
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);
}
Example #21
0
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);
	}
}
Example #22
0
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");
}
Example #23
0
    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);
    }
Example #24
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;
}
Example #25
0
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);
}
Example #26
0
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 );

    }
Example #28
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);
}
Example #29
0
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;
}
Example #30
0
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);
			}
		}
	}
}