package cc.blynk.server.application.handlers.main;
import cc.blynk.server.application.handlers.main.auth.AppStateHolder;
import cc.blynk.server.core.dao.SessionDao;
import cc.blynk.server.core.model.DashBoard;
import cc.blynk.server.core.model.auth.Session;
import cc.blynk.server.core.protocol.enums.Command;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static cc.blynk.utils.AppStateHolderUtil.getAppState;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 2/20/2015.
*
* Removes channel from session in case it became inactive (closed from client side).
*/
@ChannelHandler.Sharable
public class AppChannelStateHandler extends ChannelInboundHandlerAdapter {
private static final Logger log = LogManager.getLogger(AppChannelStateHandler.class);
private final SessionDao sessionDao;
public AppChannelStateHandler(SessionDao sessionDao) {
this.sessionDao = sessionDao;
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
AppStateHolder state = getAppState(ctx.channel());
if (state != null) {
Session session = sessionDao.userSession.get(state.userKey);
if (session != null) {
session.removeAppChannel(ctx.channel());
log.trace("Application channel disconnect. {}", ctx.channel());
for (DashBoard dashBoard : state.user.profile.dashBoards) {
if (dashBoard.isAppConnectedOn && dashBoard.isActive) {
log.trace("{}-{}. Sendeind App Disconnected event to hardware.", state.user.email, state.user.appName);
session.sendMessageToHardware(dashBoard.id, Command.BLYNK_INTERNAL, 7777, "adis");
}
}
}
}
}
}