/*
* (C) Copyright 2015-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* ohun@live.cn (夜色)
*/
package com.mpush.client.gateway;
import com.mpush.api.connection.Connection;
import com.mpush.api.protocol.Command;
import com.mpush.api.service.Listener;
import com.mpush.client.gateway.handler.GatewayErrorHandler;
import com.mpush.client.gateway.handler.GatewayOKHandler;
import com.mpush.common.MessageDispatcher;
import com.mpush.netty.udp.UDPChannelHandler;
import com.mpush.netty.udp.NettyUDPConnector;
import com.mpush.tools.Utils;
import com.mpush.tools.config.CC;
import com.mpush.tools.config.CC.mp.net.rcv_buf;
import com.mpush.tools.config.CC.mp.net.snd_buf;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelOption;
import static com.mpush.common.MessageDispatcher.POLICY_LOG;
/**
* Created by ohun on 2015/12/30.
*
* @author ohun@live.cn
*/
public final class GatewayUDPConnector extends NettyUDPConnector {
private static GatewayUDPConnector I;
public static GatewayUDPConnector I() {
if (I == null) {
synchronized (GatewayUDPConnector.class) {
if (I == null) {
I = new GatewayUDPConnector();
}
}
}
return I;
}
private UDPChannelHandler channelHandler;
private GatewayUDPConnector() {
super(CC.mp.net.gateway_client_port);
}
@Override
public void init() {
super.init();
MessageDispatcher receiver = new MessageDispatcher(POLICY_LOG);
receiver.register(Command.OK, new GatewayOKHandler());
receiver.register(Command.ERROR, new GatewayErrorHandler());
channelHandler = new UDPChannelHandler(receiver);
channelHandler.setMulticastAddress(Utils.getInetAddress(CC.mp.net.gateway_client_multicast));
channelHandler.setNetworkInterface(Utils.getLocalNetworkInterface());
}
@Override
public void stop(Listener listener) {
super.stop(listener);
}
@Override
protected void initOptions(Bootstrap b) {
super.initOptions(b);
b.option(ChannelOption.IP_MULTICAST_LOOP_DISABLED, true);
b.option(ChannelOption.IP_MULTICAST_TTL, 255);
if (snd_buf.gateway_client > 0) b.option(ChannelOption.SO_SNDBUF, snd_buf.gateway_client);
if (rcv_buf.gateway_client > 0) b.option(ChannelOption.SO_RCVBUF, rcv_buf.gateway_client);
}
@Override
public ChannelHandler getChannelHandler() {
return channelHandler;
}
public Connection getConnection() {
return channelHandler.getConnection();
}
}