void FlowConnection::messageHandler(const std::string& name,AMFReader& message) {
	
	if(name=="connect") {
		AMFObject obj;
		message.readObject(obj);
		((URI&)peer.swfUrl) = obj.getString("swfUrl","");
		((URI&)peer.pageUrl) = obj.getString("pageUrl","");

		// Don't support AMF0 forced on NetConnection object because impossible to exchange custome data (ByteArray written impossible)
		// But it's not a pb because NetConnection RTMFP works since flash player 10.0 only (which supports AMF3)
		if(obj.getDouble("objectEncoding")==0)
			throw Exception("ObjectEncoding client must be AMF3 and not AMF0");

		// Check if the client is authorized
		++((UInt32&)handler.count);
		((Peer::PeerState&)peer.state) = Peer::REJECTED;
		if(!handler.onConnection(peer,writer))
			throw Exception("Client rejected");
		
		((Peer::PeerState&)peer.state) = Peer::ACCEPTED;

		AMFObjectWriter response(writer.writeSuccessResponse("Connect.Success","Connection succeeded"));
		response.write("objectEncoding",3);
		response.write("data",peer.data);

	} else if(name == "setPeerInfo") {

		list<Address> address;
		string addr;
		while(message.available()) {
			message.read(addr); // private host
			address.push_back(addr);
		}
		peer.setPrivateAddress(address);
		
		BinaryWriter& response(writer.writeRawMessage());
		response.write16(0x29); // Unknown!
		response.write32(handler.keepAliveServer);
		response.write32(handler.keepAlivePeer);

	} else if(name == "initStream") {
		// TODO?
	} else if(name == "createStream") {

		AMFWriter& response(writer.writeAMFResult());
		response.writeNumber(*_streamIndex.insert(handler.streams.create()).first);

	} else if(name == "deleteStream") {
		UInt32 index = (UInt32)message.readNumber();
		_streamIndex.erase(index);
		handler.streams.destroy(index);
	} else {
		if(!handler.onMessage(peer,name,message,writer))
			writer.writeErrorResponse("Call.Failed","Method '" + name + "' not found");
	}
}
Пример #2
0
bool FlowConnection::requestHandler(const std::string& name,AMFReader& request,ResponseWriter& responseWriter) {
	
	if(name=="connect") {

		AMFObject obj;
		request.readObject(obj);
		((URI&)peer.swfUrl) = obj.getString("swfUrl","");
		((URI&)peer.pageUrl) = obj.getString("pageUrl","");

		((Client::ClientState&)peer.state) = Client::REJECTED;

		// Don't support AMF0 forced on NetConnection object because impossible to exchange custome data (ByteArray written impossible)
		// But it's not a pb because NetConnection RTMFP works since flash player 10.0 only (which supports AMF3)
		if(obj.getDouble("objectEncoding")==0)
			return false;

		// Check if the client is authorized
		if(!serverHandler.connection(peer))
			return false;
		
		((Client::ClientState&)peer.state) = Client::ACCEPTED;

		AMFObjectWriter response(responseWriter.writeSuccessResponse("Connection succeeded"));
		response.write("objectEncoding",3);
		response.write("data",peer.data);

	} else if(name == "setPeerInfo") {

		list<Address> address;
		string addr;
		while(request.available()) {
			request.read(addr); // private host
			address.push_back(addr);
		}
		peer.setPrivateAddress(address);
		
		PacketWriter& response(responseWriter.writeRawResponse());
		response.write16(0x29); // Unknown!
		response.write32(serverHandler.keepAliveServer);
		response.write32(serverHandler.keepAlivePeer);

	} else if(name == "createStream") {

		AMFWriter& response(responseWriter.writeAMFResponse());
		response.writeNumber(1); // TODO, id stream!

	} else
		responseWriter.writeErrorResponse("Method not found (" + name + ")");

	return false;
}