Esempio n. 1
0
void RTMFPHandshake::receive(const SocketAddress& address, BinaryReader& request) {

	if(!Session::receive(address, request))
		return;

	UInt8 marker = request.read8();
	if(marker!=0x0b) {
		ERROR("Marker handshake wrong : should be 0b and not ",Format<UInt8>("%.2x",marker));
		return;
	}

	UInt16 time = request.read16();
	UInt8 id = request.read8();
	request.shrink(request.read16()); // length

	BinaryWriter response(packet(),RTMFP_MAX_PACKET_SIZE);
	response.clear(RTMFP_HEADER_SIZE+3); // header + type and size
	UInt8 idResponse = handshakeHandler(id,address, request,response);
	if (!idResponse)
		return;
	
	BinaryWriter(response.data() + RTMFP_HEADER_SIZE, 3).write8(idResponse).write16(response.size() - RTMFP_HEADER_SIZE - 3);
	(UInt32&)farId = 0;
	flush(0x0b, response.size());
}
	void OnStart()
	{
		asd::Engine::GetFile()->AddRootDirectory(asd::ToAString("Data/Texture.pack").c_str());

		for (auto loop = 0; loop < 2; loop++)
		{
			//普通に読み込んだバイナリ
			BinaryReader reader;
			auto data = GetBinaryData(asd::ToAString("Data/Texture/Surface/Tile_Normal.png"));
			reader.ReadIn(data.begin(), data.end());

			//ファイル機能で読み込んだバイナリ
			auto staticFile = asd::Engine::GetFile()->CreateStaticFile(asd::ToAString("Surface/Tile_Normal.png").c_str());
			auto staticFileData = staticFile->GetBuffer();

			int cnt = 0;
			while (!reader.IsEmpty())
			{
				int8_t byteFromRaw = reader.Get<int8_t>();

				int8_t byteFromFile = staticFileData[cnt++];

				ASSERT_EQ(byteFromRaw, byteFromFile);
			}

			ASSERT_EQ(cnt, staticFileData.size());
		}
	}
Esempio n. 3
0
	void OnStart()
	{
		//普通に読み込んだバイナリ
		BinaryReader reader;
		auto data = GetBinaryData(asd::ToAString("Data/Texture/Surface/Tile_Normal.png"));
		reader.ReadIn(data.begin(), data.end());

		//ファイル機能で読み込んだバイナリ
		asd::Engine::GetFile()->AddRootPackage(asd::ToAString("Data/Texture.pack").c_str());
		auto streamFile = asd::Engine::GetFile()->CreateStreamFile(asd::ToAString("Surface/Tile_Normal.png").c_str());
		
		std::vector<uint8_t> buffer;
		streamFile->Read(buffer, streamFile->GetSize());

		int cnt = 0;
		while (!reader.IsEmpty())
		{
			auto byteFromRaw = reader.Get<uint8_t>();

			auto byteFromFile = buffer[cnt++];

			ASSERT_EQ(byteFromRaw, byteFromFile);
		}

		ASSERT_EQ(cnt, buffer.size());
	}
Esempio n. 4
0
void OutPoint::unserialize(BinaryReader & br)
{
   if (br.getSizeRemaining() < 32)
      throw BlockDeserializingException();
   br.get_BinaryData(txHash_, 32);
   txOutIndex_ = br.get_uint32_t();
}
Esempio n. 5
0
Record::Record(Guid &id, long long length, BinaryReader &reader,
			   DatabaseImpl *_database) : reader(reader), database(_database)
{
	this->id = id;
	this->length = length;

	long childrenSize;
	reader >> childrenSize;
	long long childrenStartPosition;
	reader >> childrenStartPosition;

	dataPosition = reader.Position();

	reader.Position(childrenStartPosition);
	vchildren.reserve(childrenSize);
	for(int i =0;i < childrenSize;i++)
	{
		long long startPosition = reader.Position();
		Guid childId;
		reader >> childId;
		long long childLength;
		reader >> childLength;
		
		IRecord *childRecord = new Record(childId,childLength,reader,_database);
		vchildren.push_back(childRecord);
		reader.Position(startPosition+childLength);
		database->AddRecord(childRecord);
	}
}
Esempio n. 6
0
void WS::Unmask(BinaryReader& reader) {
	UInt32 i;
	UInt8 mask[4];
	reader.read(sizeof(mask),mask);
	UInt8* bytes = (UInt8*)reader.current();
	for(i=0;i<reader.available();++i)
		bytes[i] ^= mask[i%4];
}
Esempio n. 7
0
 void ReadData() {
     if(reader_) {
         while(((available_ - position_) < windowSize_) &&
                 (reader_->IsEOF() == false)) {
             buffer_[BufferOffset(available_)] = reader_->ReadByte();
             available_++;
         }
     }
 }
Esempio n. 8
0
void BmpImage::toGrayscale()
{
	if (bitsPerPixel != 8 && bitsPerPixel != 24)
		return;

	int w = rowBytes();
	int avg;

	if (bitsPerPixel == 24)
	{
		ByteBuffer* bmpBuffer = new ByteBuffer(bitmapSize, bmpBits);
		BinaryReader* reader = new BinaryReader(bmpBuffer);

		byte blue, green, red;

		for (unsigned int i = 0; i < height; i++)
		{
			for (unsigned int j = 0; j < width; j++)
			{
				blue = reader->readByte(i*w+j*3);
				green = reader->readByte(i*w+j*3+1);
				red = reader->readByte(i*w+j*3+2);

				avg = (red + green + blue)/3;
				avg = (avg << 16) | (avg << 8) | (avg);

				bmpBuffer->seek(i*w+j*3);
				bmpBuffer->addRGB(avg);
			}
		}

		bmpBits = bmpBuffer->getBytes();
		return;
	}

	int colorTableIndex;

	for (unsigned int i = 0; i < height; i++)
	{
		for (unsigned int j = 0; j < width; j++)
		{
			colorTableIndex = bmpBits[i*w+j];
			avg = (colorPalette[colorTableIndex] & 0x00FF0000) >> 16;
			avg += (colorPalette[colorTableIndex] & 0x0000FF00) >> 8;
			avg += (colorPalette[colorTableIndex] & 0x000000FF);
			avg /= 3;

			bmpBits[i*w+j] = avg;
		}
	}

	for (int k = 0; k < colorPaletteSize; k++)
	{
		colorPalette[k] = (k << 16) | (k << 8) | (k);
	}
}
Esempio n. 9
0
void PositionPacket::readRawPacket(BinaryReader& stream) {
  stream.read(reinterpret_cast<char*>(&mNotUsed1), sizeof(mNotUsed1));
  stream >> mGyro1 >> mTemp1 >> mAccel1X >> mAccel1Y >> mGyro2 >> mTemp2 >>
    mAccel2X >> mAccel2Y >> mGyro3 >> mTemp3 >> mAccel3X >> mAccel3Y;
  stream.read(reinterpret_cast<char*>(&mNotUsed2), sizeof(mNotUsed2));
  stream >> mGPSTimestamp;
  stream.read(reinterpret_cast<char*>(&mNotUsed3), sizeof(mNotUsed3));
  stream.read(reinterpret_cast<char*>(&mNMEASentence), sizeof(mNMEASentence));
  stream.read(reinterpret_cast<char*>(&mNotUsed4), sizeof(mNotUsed4));
}
Esempio n. 10
0
	void ReadHeader(const BinaryReader& rd, bool bParent) override {
		HashValue h;
		rd >> Ver >> PrevBlockHash >> h;
		m_merkleRoot = h;
		Height = (uint32_t)rd.ReadInt64();
		Timestamp = DateTime::from_time_t(rd.ReadUInt64());
		rd >> Nonce1 >> Nonce2 >> Nonce3 >> Nonce;
		rd.ReadStruct(MinerId);
		DifficultyTargetBits = rd.ReadUInt32();
	}
Esempio n. 11
0
 BinaryReader<T> &operator>>(BinaryReader<T> &reader, Bone &b)
 {
     b.name=reader.getString(15);
     reader
         >> b.frame
         >> b.pos
         >> b.q
         ;
     reader.getBytes(b.cInterpolationX, 16);
     reader.getBytes(b.cInterpolationY, 16);
     reader.getBytes(b.cInterpolationZ, 16);
     reader.getBytes(b.cInterpolationRot, 16);
     return reader;
 }
Esempio n. 12
0
	AffLoader::AffLoader(std::vector<uint8_t> &data)
	{
		BinaryReader reader;
		reader.ReadIn(data.begin(), data.end());

		auto header = AffHeader::Get(reader);

		auto table = AffIndexTable::Get(reader);
		auto indexes = table.GetIndexes();
		auto fontNum = header.GetFontCount();

		for (int16_t i = 0; i < fontNum; ++i)
		{
			auto charactor = distance(indexes.begin(), find(indexes.begin(), indexes.end(), i));
			result[charactor] = GlyphData::Get(reader, charactor);
		}
	}
Esempio n. 13
0
 BinaryReader<T> &operator>>(BinaryReader<T> &reader, Morph &m)
 {
     m.name=reader.getString(15);
     reader
         >> m.frame
         >> m.influence
         ;
     return reader;
 }
Esempio n. 14
0
void ReadModelArray( Array< _type_ > & out, const char * string, const BinaryReader & bin, const int numElements )
{
	if ( string != NULL && string[0] != '\0' && numElements > 0 )
	{
		if ( !bin.ReadArray( out, numElements ) )
		{
			StringUtils::StringTo( out, string );
		}
	}
}
Esempio n. 15
0
	bool Model_IO::Load(const std::vector<uint8_t>& data, const achar* path)
	{
		Meshes.clear();

		BinaryReader reader;
		reader.ReadIn(data.begin(), data.end());

		// ヘッダーチェック
		uint8_t header_true [] = "MDL";
		for (int32_t i = 0; i < 4; i++)
		{
			auto h = reader.Get<uint8_t>();
			if (header_true[i] != h) return false;
		}

		// バージョン
		int32_t version = reader.Get<int32_t>();

		// ボーン
		LoadDeformer(Deformer_, reader, path, version);

		// メッシュ
		LoadMeshes(Meshes, reader, path);

		// アニメーション
		int32_t sourceCount = reader.Get<int32_t>();
		AnimationSources.resize(sourceCount);
		for (int32_t i = 0; i < sourceCount; i++)
		{
			LoadAnimationSource(AnimationSources[i], reader, path);
		}

		int32_t clipCount = reader.Get<int32_t>();
		AnimationClips.resize(clipCount);
		for (int32_t i = 0; i < clipCount; i++)
		{
			LoadAnimationClip(AnimationClips[i], reader, path);
		}

		return true;
	}
Esempio n. 16
0
uint Packet::getMessageLength(ushort lengthType, BinaryReader& reader)
{
    uint length = 0;

    switch(lengthType)
    {
        case 1:
            length = static_cast<uint>(reader.readByte());
            break;
        case 2:
            length = reader.readUShort();
            break;
        case 3:
            length = static_cast<uint>(
                        ((reader.readByte() & 255) << 16) +
                        ((reader.readByte() & 255) << 8) +
                         (reader.readByte() & 255));
            break;
        default:
            break;
    }

    return length;
}
Esempio n. 17
0
	void read_tga_uncompressed(BinaryReader& br, uint32_t width, uint32_t height, uint8_t channels, ImageData& image)
	{
		if (channels == 2)
		{
			uint32_t i = 0;

			for (uint32_t h = 0; h < height; h++)
			{
				for (uint32_t w = 0; w < width; w++)
				{
					uint16_t data;
					br.read(data);

					image.data[i + 0] = (data & 0x7c) >> 10;
					image.data[i + 1] = (data & 0x3e) >> 5;
					image.data[i + 2] = (data & 0x1f);

					i += 3;
				}
			}
		}
Esempio n. 18
0
void FlowWriter::flush(PacketWriter& writer,UInt64 stage,UInt8 flags,bool header,BinaryReader& reader,UInt16 size) {
	if(_stageAck==0 && header)
		flags |= MESSAGE_HEADER;
	if(size==0)
		flags |= MESSAGE_ABANDONMENT;
	if(_closed && _messages.size()==1) // On LAST message
		flags |= MESSAGE_END;

	// TRACE("FlowWriter %u stage %u",id,stage);

	writer.write8(flags);

	if(header) {
		writer.write7BitLongValue(id);
		writer.write7BitLongValue(stage);
		writer.write7BitLongValue(stage-_stageAck);

		// signature
		if(_stageAck==0) {
			writer.writeString8(signature);
			// No write this in the case where it's a new flow!
			if(flowId>0) {
				writer.write8(1+Util::Get7BitValueSize(flowId)); // following size
				writer.write8(0x0a); // Unknown!
				writer.write7BitLongValue(flowId);
			}
			writer.write8(0); // marker of end for this part
		}

	}

	if(size>0) {
		reader.readRaw(writer.begin()+writer.position(),size);
		writer.next(size);
	}
}
Esempio n. 19
0
	void ackMessageHandler(UInt32 ackCount,UInt32 lostCount,BinaryReader& content,UInt32 available,UInt32 size) {
		if(available==0 || content.read8()!=_type)
			return;
		qos.add(content.read32(),ackCount,lostCount,size);
	}
Esempio n. 20
0
Blob XptMessage::ReadBlob16(const BinaryReader& rd) {
	return rd.ReadBytes(rd.ReadUInt16());
}
Esempio n. 21
0
void RTMFPSession::receive(const SocketAddress& address, BinaryReader& packet) {

	if (!Session::receive(address, packet))
		return;

	// Read packet
	UInt8 marker = packet.read8()|0xF0;
	
	_timeSent = packet.read16();

	// with time echo
	if(marker == 0xFD) {
		UInt16 time = RTMFP::TimeNow();
		UInt16 timeEcho = packet.read16();
		if(timeEcho>time) {
			if(timeEcho-time<30)
				time=0;
			else
				time += 0xFFFF-timeEcho;
			timeEcho = 0;
		}
		peer.setPing((time-timeEcho)*RTMFP_TIMESTAMP_SCALE);
	}
	else if(marker != 0xF9)
		WARN("RTMFPPacket marker unknown : ", Format<UInt8>("%02x",marker));


	// Variables for request (0x10 and 0x11)
	UInt8 flags;
	RTMFPFlow* pFlow=NULL;
	UInt64 stage=0;
	UInt64 deltaNAck=0;

	UInt8 type = packet.available()>0 ? packet.read8() : 0xFF;
	bool answer = false;

	// Can have nested queries
	while(type!=0xFF) {

		UInt16 size = packet.read16();

		PacketReader message(packet.current(),size);		

		switch(type) {
			case 0x0c :
				fail("failed on client side");
				break;

			case 0x4c :
				/// Session death!
				_failed = true; // to avoid the fail signal!!
				kill();
				return;

			/// KeepAlive
			case 0x01 :
				if(!peer.connected)
					fail("Timeout connection client");
				else
					writeMessage(0x41,0);
			case 0x41 :
				_timesKeepalive=0;
				break;

			case 0x5e : {
				// RTMFPFlow exception!
				UInt64 id = message.read7BitLongValue();
				
				RTMFPWriter* pRTMFPWriter = writer(id);
				if(pRTMFPWriter)
					pRTMFPWriter->fail("Writer rejected on session ",name());
				else
					WARN("RTMFPWriter ", id, " unfound for failed signal on session ", name());
				break;

			}
			case 0x18 :
				/// This response is sent when we answer with a Acknowledgment negative
				// It contains the id flow
				// I don't unsertand the usefulness...
				//pFlow = &flow(message.read8());
				//stage = pFlow->stageSnd();
				// For the moment, we considerate it like a exception
				fail("ack negative from server"); // send fail message immediatly
				break;

			case 0x51 : {
				/// Acknowledgment
				UInt64 id = message.read7BitLongValue();
				RTMFPWriter* pRTMFPWriter = writer(id);
				if(pRTMFPWriter)
					pRTMFPWriter->acknowledgment(message);
				else
					WARN("RTMFPWriter ",id," unfound for acknowledgment on session ",name());
				break;
			}
			/// Request
			// 0x10 normal request
			// 0x11 special request, in repeat case (following stage request)
			case 0x10 : {
				flags = message.read8();
				UInt64 idFlow = message.read7BitLongValue();
				stage = message.read7BitLongValue()-1;
				deltaNAck = message.read7BitLongValue()-1;
				
				if (_failed)
					break;

				map<UInt64,RTMFPFlow*>::const_iterator it = _flows.find(idFlow);
				pFlow = it==_flows.end() ? NULL : it->second;

				// Header part if present
				if(flags & MESSAGE_HEADER) {
					string signature;
					message.read(message.read8(),signature);

					if(!pFlow)
						pFlow = createFlow(idFlow,signature);

					if(message.read8()>0) {

						// Fullduplex header part
						if(message.read8()!=0x0A)
							WARN("Unknown fullduplex header part for the flow ",idFlow)
						else 
							message.read7BitLongValue(); // Fullduplex useless here! Because we are creating a new RTMFPFlow!

						// Useless header part 
						UInt8 length=message.read8();
						while(length>0 && message.available()) {
							WARN("Unknown message part on flow ",idFlow);
							message.next(length);
							length=message.read8();
						}
						if(length>0)
							ERROR("Bad header message part, finished before scheduled");
					}

				}
				
				if(!pFlow) {
					WARN("RTMFPFlow ",idFlow," unfound");
					if (_pFlowNull)
						((UInt64&)_pFlowNull->id) = idFlow;
					pFlow = _pFlowNull;
				}

			}	
			case 0x11 : {
				++stage;
				++deltaNAck;

				// has Header?
				if(type==0x11)
					flags = message.read8();

				// Process request
				if (pFlow && !_failed) {
					bool wasConnected(peer.connected);
					pFlow->receive(stage, deltaNAck, message, flags);
					if (!wasConnected && peer.connected) {
						for (auto& it : _flowWriters)
							it.second->open();
					}
				}
				break;
			}
			default :
				ERROR("RTMFPMessage type '", Format<UInt8>("%02x", type), "' unknown");
		}

		// Next
		packet.next(size);
		type = packet.available()>0 ? packet.read8() : 0xFF;

		// Commit RTMFPFlow (pFlow means 0x11 or 0x10 message)
		if(pFlow && type!= 0x11) {
			pFlow->commit();
			if(pFlow->consumed()) {
				if (pFlow->critical()) {
					if (!peer.connected) {
						// without connection, nothing must be sent!
						for (auto& it : _flowWriters)
							it.second->clear();
					}
					fail(); // If connection fails, log is already displayed, and so fail the whole session!
				} else {
					_flows.erase(pFlow->id);
					delete pFlow;
				}
			}
			pFlow=NULL;
		}
	}
Esempio n. 22
0
 void ReadHeader(BinaryReader& reader) {
     indexBits_ = MIN_DICT_SIZE + reader.ReadBits(MIN_DICT_SIZE_BITS);
     freeze_ = reader.ReadBit();
 }
void BinaryReaderWriterTest::read(BinaryReader& reader)
{
	bool b;
	reader >> b;
	assert (b);
	reader >> b;
	assert (!b);
	
	char c;
	reader >> c;
	assert (c == 'a');

	short shortv;
	reader >> shortv;
	assert (shortv == -100);

	unsigned short ushortv;
	reader >> ushortv;
	assert (ushortv == 50000);

	int intv;
	reader >> intv;
	assert (intv == -123456);

	unsigned uintv;
	reader >> uintv;
	assert (uintv == 123456);

	long longv;
	reader >> longv;
	assert (longv == -1234567890);

	unsigned long ulongv;
	reader >> ulongv;
	assert (ulongv == 1234567890);

#if defined(POCO_HAVE_INT64)
	Int64 int64v;
	reader >> int64v;
	assert (int64v == -1234567890);
	
	UInt64 uint64v;
	reader >> uint64v;
	assert (uint64v == 1234567890);
#endif

	float floatv;
	reader >> floatv;
	assert (floatv == 1.5);
	
	double doublev;
	reader >> doublev;
	assert (doublev == -1.5);
	
	std::string str;
	reader >> str;
	assert (str == "foo");
	reader >> str;
	assert (str == "");
	reader >> str;
	assert (str == "bar");
	reader >> str;
	assert (str == "");
	
	UInt32 uint32v;
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 100);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 1000);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 10000);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 100000);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 1000000);

#if defined(POCO_HAVE_INT64)
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 100);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 1000);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 10000);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 100000);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 1000000);
#endif

	reader.readRaw(3, str);
	assert (str == "RAW");
}
Esempio n. 24
0
 void ReadHeader(BinaryReader& reader) {
     offsetBits_ = reader.ReadBits(HEADER_OFFSET_BITS) + MIN_OFFSET_BITS;
     lengthBits_ = reader.ReadBits(HEADER_LENGTH_BITS) + MIN_LENGTH_BITS;
 }
Esempio n. 25
0
UInt8 RTMFPHandshake::handshakeHandler(UInt8 id,const SocketAddress& address, BinaryReader& request,BinaryWriter& response) {

	switch(id){
		case 0x30: {
			
			request.read7BitValue(); // = epdLen + 2 (useless)
			UInt16 epdLen = request.read7BitValue()-1;
			UInt8 type = request.read8();
			string epd;
			request.read(epdLen,epd);

			string tag;
			request.read(16,tag);
			response.write7BitValue(tag.size()).write(tag);
		
			if(type == 0x0f) {

				const UInt8* peerId((const UInt8*)epd.c_str());
				
				RTMFPSession* pSessionWanted = _sessions.findByPeer<RTMFPSession>(peerId);
	
				if(pSessionWanted) {
					if(pSessionWanted->failed())
						return 0x00; // TODO no way in RTMFP to tell "died!"
					/// Udp hole punching
					UInt32 times = attempt(tag);
		
					RTMFPSession* pSession(NULL);
					if(times > 0 || address.host() == pSessionWanted->peer.address.host()) // try in first just with public address (excepting if the both peer are on the same machine)
						pSession = _sessions.findByAddress<RTMFPSession>(address,Socket::DATAGRAM);
					
					bool hasAnExteriorPeer(pSessionWanted->p2pHandshake(tag,address,times,pSession));
					
					// public address
					RTMFP::WriteAddress(response,pSessionWanted->peer.address, RTMFP::ADDRESS_PUBLIC);
					DEBUG("P2P address initiator exchange, ",pSessionWanted->peer.address.toString());

					if (hasAnExteriorPeer && pSession->peer.serverAddress.host()!=pSessionWanted->peer.address.host()) {
						// the both peer see the server in a different way (and serverAddress.host()!= public address host written above),
						// Means an exterior peer, but we can't know which one is the exterior peer
						// so add an interiorAddress build with how see eachone the server on the both side
						SocketAddress interiorAddress(pSession->peer.serverAddress.host(), pSessionWanted->peer.address.port());
						RTMFP::WriteAddress(response,interiorAddress, RTMFP::ADDRESS_PUBLIC);
						DEBUG("P2P address initiator exchange, ",interiorAddress.toString());
					}	

					// local address
					for(const SocketAddress& address : pSessionWanted->peer.localAddresses) {
						RTMFP::WriteAddress(response,address, RTMFP::ADDRESS_LOCAL);
						DEBUG("P2P address initiator exchange, ",address.toString());
					}

					// add the turn address (RelayServer) if possible and required
					if (pSession && times>0) {
						UInt8 timesBeforeTurn(0);
						if(pSession->peer.parameters().getNumber("timesBeforeTurn",timesBeforeTurn) && timesBeforeTurn>=times) {
							UInt16 port = invoker.relayer.relay(pSession->peer.address,pSessionWanted->peer.address,20); // 20 sec de timeout is enough for RTMFP!
							if (port > 0) {
								SocketAddress address(pSession->peer.serverAddress.host(), port);
								RTMFP::WriteAddress(response, address, RTMFP::ADDRESS_REDIRECTION);
							} // else ERROR already display by RelayServer class
						}
					}
					return 0x71;
				}


				DEBUG("UDP Hole punching, session ", Util::FormatHex(peerId, ID_SIZE, LOG_BUFFER), " wanted not found")
				set<SocketAddress> addresses;
				peer.onRendezVousUnknown(peerId,addresses);
				set<SocketAddress>::const_iterator it;
				for(it=addresses.begin();it!=addresses.end();++it) {
					if(it->host().isWildcard())
						continue;
					if(address == *it)
						WARN("A client tries to connect to himself (same ", address.toString()," address)");
					RTMFP::WriteAddress(response,*it,RTMFP::ADDRESS_REDIRECTION);
					DEBUG("P2P address initiator exchange, ",it->toString());
				}
				return addresses.empty() ? 0 : 0x71;
			}

			if(type == 0x0a){
				/// RTMFPHandshake
				HelloAttempt& attempt = AttemptCounter::attempt<HelloAttempt>(tag);

				Peer& peer(*_pPeer);

				// Fill peer infos
				peer.properties().clear();
				string serverAddress;
				Util::UnpackUrl(epd, serverAddress, (string&)peer.path,(string&)peer.query);
				peer.setServerAddress(serverAddress);
				Util::UnpackQuery(peer.query, peer.properties());

				Exception ex;

				set<SocketAddress> addresses;
				peer.onHandshake(attempt.count+1,addresses);
				if(!addresses.empty()) {
					set<SocketAddress>::iterator it;
					for(it=addresses.begin();it!=addresses.end();++it) {
						if (it->host().isWildcard())
							RTMFP::WriteAddress(response, peer.serverAddress, RTMFP::ADDRESS_REDIRECTION);
						else
							RTMFP::WriteAddress(response, *it, RTMFP::ADDRESS_REDIRECTION);
					}
					return 0x71;
				}


				// New RTMFPCookie
				RTMFPCookie* pCookie = attempt.pCookie;
				if (!pCookie) {
					pCookie = new RTMFPCookie(*this, invoker, tag, _pPeer);
					if (!pCookie->run(ex)) {
						delete pCookie;
						ERROR("RTMFPCookie creation, ", ex.error())
						return 0;
					}
					_pPeer.reset(new Peer((Handler&)invoker)); // reset peer
					_cookies.emplace(pCookie->value(), pCookie);
					attempt.pCookie = pCookie;
				}

				// response
				response.write8(COOKIE_SIZE);
				response.write(pCookie->value(),COOKIE_SIZE);
				// instance id (certificat in the middle)
				response.write(_certificat,sizeof(_certificat));
				return 0x70;

			} else
Esempio n. 26
0
 static void Read(BinaryReader& reader, TestEntry& dst)
 {
     dst.value = reader.ReadInt32("value");
 }
Esempio n. 27
0
bool BmpImage::init()
{
	initValuesToDefault();

	BinaryReader* reader = new BinaryReader(this->image);
	reader->reset();

	/* read the file data header */
	// read the type of the file
	reader->seek(FILE_TYPE_OFFSET);
	fileType = reader->readWord();
	

	switch (fileType)
	{
	case BMPBITMAP:
		break;
	case BMPARRAY:
	case BMPCLRICON:
	case BMPCLRPOINTER:
	case BMPICON:
	case BMPPOINTER:
		return false;
	default:
		{
			fileType = NOT_BMP; // exception should be thrown
			return false;
		}
	}

	// read the file size in bytes
	fileSize = reader->readDword();

	// read the two hot spots, reserved 1 & reserved 2
	Xhot = reader->readWord();
	Yhot = reader->readWord();

	bitmapOffset = reader->readDword();

	/* read the bitmap header now */
	headerSize = reader->readDword();

	if (headerSize < BMPOLDANYHDRSIZE || 
		(headerSize > BMPNEWOS2HDRSIZE && headerSize != BMPNEWWINV4HDRSIZE))
	{
		fileType = NOT_BMP; // exception should be thrown
		return false;
	}

	// read the rest of the header and the palette if any
	if (headerSize == BMPOLDANYHDRSIZE) // we have an old BMP file format
	{
		version = BMPOLD;
		width = (word) reader->readWord();
		height = (word) reader->readWord();
		planes = reader->readWord();
		bitsPerPixel = reader->readWord();

		if (bitsPerPixel != 1 || bitsPerPixel != 4 || bitsPerPixel != 8 || 
			bitsPerPixel != 24)
		{
			fileType = NOT_BMP; // exception should be thrown
			return false;
		}

		colorPaletteSize = bitsPerPixel == 24 ? 0 : 1 << bitsPerPixel;
		
		int numberOfEntries = (bitmapOffset - BMPFILEHDRSIZE - 
			BMPOLDANYHDRSIZE) / BMPOLDPALETTESIZE;

		if (colorPaletteSize != numberOfEntries)
		{
			fileType = NOT_BMP; // exception should be thrown
			return false;
		}

		// read the palette
		if (colorPaletteSize != 0)
		{
			colorPalette = new unsigned long[colorPaletteSize];
			for (int i = 0; i < colorPaletteSize; i++)
			{
				colorPalette[i] = reader->readRGB();
			}
		}

		bitmapSize = rowBytes() * height;
	}
	else // new BMP file format
	{
		switch (headerSize)
		{
		case BMPNEWWINHDRSIZE:
			{
				version = BMPWINNEW;
				break;
			}
		case BMPNEWOS2HDRSIZE:
			{
				version = BMPOS2NEW;
				break;
			}
		case BMPNEWWINV4HDRSIZE:
			{
				version = BMPWIN4NEW;
				break;
			}
		default:
			{
				version = BMPUNKNOWN;
				break;
			}
		}
		width = reader->readDword();
		height = reader->readDword();
		planes = reader->readWord();
		bitsPerPixel = reader->readWord();
		compression = reader->readDword();
		bitmapSize = reader->readDword();
		horizResolution = (long) reader->readDword();
		vertResolution = (long) reader->readDword();
		colorsUsed = reader->readDword();
		colorsImportant = reader->readDword();

		bitmapSize = (bitmapSize) ? bitmapSize : rowBytes() * height;
		
		
		// if the image is an OS2 bitmap
		if (headerSize == BMPNEWOS2HDRSIZE)
		{
			units = reader->readWord();
			reserved = reader->readWord();
			recording = reader->readWord();
			rendering = reader->readWord();
			size1 = reader->readDword();
			size2 = reader->readDword();
			identifier = reader->readDword();
		}

		// read the palette
		// seek to the color palette
		reader->seek(BMPFILEHDRSIZE + headerSize);
		// rle compression not supported
		if (compression == 3 && (bitsPerPixel == 16 || bitsPerPixel == 32))
		{
			// should throw exception
			return false;
		}
		// compute the number of color table entries
		colorPaletteSize = bitsPerPixel > 8 ? 0 : 1 << bitsPerPixel;
		
		int numberOfEntries = (bitmapOffset - BMPFILEHDRSIZE - 
			headerSize) / BMPNEWPALETTESIZE;

		if (colorPaletteSize != numberOfEntries)
		{
			fileType = NOT_BMP; // exception should be thrown
			return false;
		}
			
		// read the palette
		if (colorPaletteSize != 0)
		{
			colorPalette = new unsigned long[colorPaletteSize];
			for (int i = 0; i < colorPaletteSize; i++)
			{
				colorPalette[i] = reader->readDword();
			}
		}
	}

	// shold read the data bits & lose the padding
	bmpBits = &image->getBytes()[bitmapOffset];

	// calculate the file size if not given
	if (fileSize == 0)
	{
		fileSize = BMPFILEHDRSIZE;
		fileSize += headerSize;

		int paletteSize = (version == BMPOLD) ? BMPOLDPALETTESIZE : BMPNEWPALETTESIZE;

		fileSize += colorPaletteSize*paletteSize;
		fileSize += bitmapSize;
	}

	delete reader;
	return true;
}
Esempio n. 28
0
UInt8 RTMFPHandshake::handshakeHandler(UInt8 id,const SocketAddress& address, BinaryReader& request,BinaryWriter& response) {

	switch(id){
		case 0x30: {
			
			request.next(1);
			UInt8 epdLen = request.read8()-1;

			UInt8 type = request.read8();

			string epd;
			request.read(epdLen,epd);

			string tag;
			request.read(16,tag);
			response.write8(tag.size()).write(tag);
		
			if(type == 0x0f) {

				const UInt8* peerId = (const UInt8*)epd.c_str();
				
				RTMFPSession* pSessionWanted = _sessions.findByPeer<RTMFPSession>(peerId);
	
				if(pSessionWanted) {
					if(pSessionWanted->failed())
						return 0x00; // TODO no way in RTMFP to tell "died!"
					/// Udp hole punching
					UInt32 times = attempt(tag);

					RTMFPSession* pSession(NULL);
					if(times > 0 || address.host() == pSessionWanted->peer.address.host())
						pSession = _sessions.findByAddress<RTMFPSession>(address,Socket::DATAGRAM);
					
					pSessionWanted->p2pHandshake(tag,address,times,pSession);

					RTMFP::WriteAddress(response,pSessionWanted->peer.address, RTMFP::ADDRESS_PUBLIC);
					DEBUG("P2P address initiator exchange, ",pSessionWanted->peer.address.toString());
					for(const SocketAddress& address : pSessionWanted->peer.localAddresses) {
						RTMFP::WriteAddress(response,address, RTMFP::ADDRESS_LOCAL);
						DEBUG("P2P address initiator exchange, ",address.toString());
					}

					// add the turn address (RelayServer) if possible and required
					if (pSession && times>0) {
						UInt8 timesBeforeTurn(0);
						if(pSession->peer.parameters().getNumber("timesBeforeTurn",timesBeforeTurn) && timesBeforeTurn>=times) {
							UInt16 port = invoker.relayer.relay(pSession->peer.address,pSessionWanted->peer.address,20); // 20 sec de timeout is enough for RTMFP!
							if (port > 0) {
								string host;
								SocketAddress::SplitLiteral(pSession->peer.serverAddress, host);
								bool success(false);
								Exception ex;
								SocketAddress address;
								EXCEPTION_TO_LOG(success=address.set(ex,host, port),"RTMFP turn impossible")
								if (success)
									RTMFP::WriteAddress(response, address, RTMFP::ADDRESS_REDIRECTION);
							} // else ERROR already display by RelayServer class
						}
					}
					return 0x71;
				}


				DEBUG("UDP Hole punching, session ", Util::FormatHex(peerId, ID_SIZE, LOG_BUFFER), " wanted not found")
				set<SocketAddress> addresses;
				peer.onRendezVousUnknown(peerId,addresses);
				set<SocketAddress>::const_iterator it;
				for(it=addresses.begin();it!=addresses.end();++it) {
					if(it->host().isWildcard())
						continue;
					if(address == *it)
						WARN("A client tries to connect to himself (same ", address.toString()," address)");
					RTMFP::WriteAddress(response,*it,RTMFP::ADDRESS_REDIRECTION);
					DEBUG("P2P address initiator exchange, ",it->toString());
				}
				return addresses.empty() ? 0 : 0x71;
			}
Esempio n. 29
0
void DataTest::readFromBLOB(BinaryReader& reader)
{
	bool b = false;
	reader >> b;
	assert (b);
	reader >> b;
	assert (!b);
	
	char c = ' ';
	reader >> c;
	assert (c == 'a');

	short shortv = 0;
	reader >> shortv;
	assert (shortv == -100);

	unsigned short ushortv = 0;
	reader >> ushortv;
	assert (ushortv == 50000);

	int intv = 0;
	reader >> intv;
	assert (intv == -123456);

	unsigned uintv = 0;
	reader >> uintv;
	assert (uintv == 123456);

	long longv = 0;
	reader >> longv;
	assert (longv == -1234567890);

	unsigned long ulongv = 0;
	reader >> ulongv;
	assert (ulongv == 1234567890);

	Int64 int64v = 0;
	reader >> int64v;
	assert (int64v == -1234567890);
	
	UInt64 uint64v = 0;
	reader >> uint64v;
	assert (uint64v == 1234567890);

	float floatv = 0.0;
	reader >> floatv;
	assert (floatv == 1.5);
	
	double doublev = 0.0;
	reader >> doublev;
	assert (doublev == -1.5);

	std::string str;
	reader >> str;
	assert (str == "foo");
	reader >> str;
	assert (str == "");
	
	reader >> str;
	assert (str == "bar");
	reader >> str;
	assert (str == "");

	UInt32 uint32v;
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 100);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 1000);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 10000);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 100000);
	reader.read7BitEncoded(uint32v);
	assert (uint32v == 1000000);

	reader.read7BitEncoded(uint64v);
	assert (uint64v == 100);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 1000);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 10000);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 100000);
	reader.read7BitEncoded(uint64v);
	assert (uint64v == 1000000);

	reader.readRaw(3, str);
	assert (str == "RAW");
}
Esempio n. 30
0
String XptMessage::ReadString16(const BinaryReader& rd) {
	uint16_t len = rd.ReadUInt16();
	return Encoding::UTF8.GetChars(rd.ReadBytes(len));
}