/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under GNU LESSER GENERAL PUBLIC LICENSE Version 3. */ package com.ttProject.flazr.rtmp.message; import java.util.ArrayList; import java.util.List; import org.jboss.netty.buffer.ChannelBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.flazr.amf.Amf0Object; import com.flazr.rtmp.RtmpHeader; import com.flazr.rtmp.RtmpMessage; import com.flazr.rtmp.message.CommandAmf0; import com.ttProject.container.flv.amf.Amf0Value; import com.ttProject.flazr.unit.Amf0ObjectManager; import com.ttProject.nio.channels.ByteReadChannel; import com.ttProject.nio.channels.IReadChannel; /** * CommandAmf0Ex * original flazr's CommandAmf0 cannot handle Amf3 extra message. * in order to deal with such message, I make CommandAmf0Ex. * @author taktod */ public class CommandAmf0Ex implements RtmpMessage { private static final Logger logger = LoggerFactory.getLogger(CommandAmf0Ex.class); private final RtmpHeader header; private String name; private Integer transactionId; private Object object; private Object[] args; private final Amf0ObjectManager amf0ObjectManager = new Amf0ObjectManager(); /** * constructor * @param header * @param in */ public CommandAmf0Ex(RtmpHeader header, ChannelBuffer in) { this.header = header; decode(in); } @Override public void decode(ChannelBuffer in) { int length = in.readableBytes(); byte[] bytes = new byte[length]; in.readBytes(bytes); try { IReadChannel channel = new ByteReadChannel(bytes); name = (String)Amf0Value.getValueObject(channel); transactionId = ((Double)Amf0Value.getValueObject(channel)).intValue(); object = Amf0Value.getValueObject(channel); List<Object> list = new ArrayList<Object>(); while(channel.size() > channel.position()) { Object data = Amf0Value.getValueObject(channel); if(data instanceof Integer) { Integer i = (Integer)data; list.add(i.doubleValue()); } else { list.add(data); } } args = list.toArray(); } catch(Exception e) { logger.error("failed to parse data.", e); } } @Override public ChannelBuffer encode() { throw new RuntimeException("encode is not supported now."); } @Override public RtmpHeader getHeader() { return header; } public String getName() { return name; } public Integer getTransactionId() { return transactionId; } public Object getObject() { return object; } public Object getArg(int index) { return args[index]; } public int getArgCount() { if(args == null) { return 0; } return args.length; } public CommandAmf0 transform() { if(object == null || object instanceof com.ttProject.container.flv.amf.Amf0Object) { CommandAmf0 command0 = new CommandAmf0(transactionId, name, (Amf0Object)amf0ObjectManager.toFlazrObject(object), args); return command0; } throw new RuntimeException("base object is not amf0Object."); } }