/* * Copyright (c) 2012-2015 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package org.red5.server.mqtt.codec.parser; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.eclipse.moquette.proto.messages.AbstractMessage; import org.eclipse.moquette.proto.messages.SubscribeMessage; import org.red5.server.mqtt.codec.MQTTProtocol; import org.red5.server.mqtt.codec.exception.CorruptedFrameException; /** * PubRel encoder. * * @author andrea * @author Paul Gregoire */ public class SubscribeEncoder extends DemuxEncoder<SubscribeMessage> { @Override public IoBuffer encode(IoSession session, SubscribeMessage message) throws CorruptedFrameException { if (message.subscriptions().isEmpty()) { throw new IllegalArgumentException("Found a subscribe message with empty topics"); } if (message.getQos() != AbstractMessage.QOSType.LEAST_ONE) { throw new IllegalArgumentException("Expected a message with QOS 1, found " + message.getQos()); } IoBuffer out = null; IoBuffer variableHeaderBuff = IoBuffer.allocate(4); try { variableHeaderBuff.putShort((short) message.getMessageID()); for (SubscribeMessage.Couple c : message.subscriptions()) { variableHeaderBuff.put(MQTTProtocol.encodeString(c.getTopicFilter())); variableHeaderBuff.put(c.getQos()); } int variableHeaderSize = variableHeaderBuff.limit(); byte flags = MQTTProtocol.encodeFlags(message); out = IoBuffer.allocate(2 + variableHeaderSize); out.put((byte) (AbstractMessage.SUBSCRIBE << 4 | flags)); out.put(MQTTProtocol.encodeRemainingLength(variableHeaderSize)); variableHeaderBuff.flip(); out.put(variableHeaderBuff); out.flip(); return out; } finally { variableHeaderBuff.free(); } } }