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"); } }
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; }