/* * Copyright (c) [2016] [ <ether.camp> ] * This file is part of the ethereumJ library. * * The ethereumJ library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The ethereumJ library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>. */ package org.ethereum.net.swarm.bzz; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import org.ethereum.listener.EthereumListener; import org.ethereum.net.MessageQueue; import org.ethereum.net.swarm.NetStore; import org.ethereum.util.Functional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /** * Process the messages between peers with 'bzz' capability on the network. */ @Component @Scope("prototype") public class BzzHandler extends SimpleChannelInboundHandler<BzzMessage> implements Functional.Consumer<BzzMessage> { public final static byte VERSION = 0; private MessageQueue msgQueue = null; private boolean active = false; private final static Logger logger = LoggerFactory.getLogger("net"); BzzProtocol bzzProtocol; @Autowired EthereumListener ethereumListener; @Autowired NetStore netStore; public BzzHandler() { } public BzzHandler(MessageQueue msgQueue) { this.msgQueue = msgQueue; } @Override public void channelRead0(final ChannelHandlerContext ctx, BzzMessage msg) throws InterruptedException { if (!isActive()) return; if (BzzMessageCodes.inRange(msg.getCommand().asByte())) logger.debug("BzzHandler invoke: [{}]", msg.getCommand()); ethereumListener.trace(String.format("BzzHandler invoke: [%s]", msg.getCommand())); if (bzzProtocol != null) { bzzProtocol.accept(msg); } } @Override public void accept(BzzMessage bzzMessage) { msgQueue.sendMessage(bzzMessage); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { logger.error("Bzz handling failed", cause); super.exceptionCaught(ctx, cause); ctx.close(); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { active = false; logger.debug("handlerRemoved: ... "); } public void activate() { logger.info("BZZ protocol activated"); ethereumListener.trace("BZZ protocol activated"); createBzzProtocol(); this.active = true; } private void createBzzProtocol() { bzzProtocol = new BzzProtocol(netStore /*NetStore.getInstance()*/); bzzProtocol.setMessageSender(this); bzzProtocol.start(); } public boolean isActive() { return active; } public void setMsgQueue(MessageQueue msgQueue) { this.msgQueue = msgQueue; } }