1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.ftp.core.control;
21
22 import io.netty.buffer.ByteBuf;
23 import io.netty.channel.ChannelInitializer;
24 import io.netty.channel.ChannelPipeline;
25 import io.netty.channel.socket.SocketChannel;
26 import io.netty.handler.codec.DelimiterBasedFrameDecoder;
27 import io.netty.util.concurrent.EventExecutorGroup;
28 import org.waarp.common.command.ReplyCode;
29 import org.waarp.common.utility.WaarpNettyUtil;
30 import org.waarp.common.utility.WaarpStringUtils;
31 import org.waarp.ftp.core.config.FtpConfiguration;
32 import org.waarp.ftp.core.session.FtpSession;
33
34
35
36
37 public class FtpInitializer extends ChannelInitializer<SocketChannel> {
38
39
40
41 protected static final ByteBuf[] delimiter = {
42 WaarpNettyUtil.wrappedBuffer(
43 ReplyCode.CRLF.getBytes(WaarpStringUtils.UTF8)),
44 WaarpNettyUtil.wrappedBuffer(
45 ReplyCode.CRNUL.getBytes(WaarpStringUtils.UTF8)),
46 WaarpNettyUtil.wrappedBuffer(ReplyCode.LF.getBytes(WaarpStringUtils.UTF8))
47 };
48
49 protected static final FtpControlStringDecoder ftpControlStringDecoder =
50 new FtpControlStringDecoder(WaarpStringUtils.UTF8);
51
52 protected static final FtpControlStringEncoder ftpControlStringEncoder =
53 new FtpControlStringEncoder(WaarpStringUtils.UTF8);
54
55
56
57
58 protected final Class<? extends BusinessHandler> businessHandler;
59
60
61
62
63 protected final FtpConfiguration configuration;
64
65
66
67
68
69
70
71 public FtpInitializer(final Class<? extends BusinessHandler> businessHandler,
72 final FtpConfiguration configuration) {
73 this.businessHandler = businessHandler;
74 this.configuration = configuration;
75 }
76
77
78
79
80 @Override
81 public void initChannel(final SocketChannel ch) throws Exception {
82 final ChannelPipeline pipeline = ch.pipeline();
83
84 pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, delimiter));
85 pipeline.addLast("decoder", ftpControlStringDecoder);
86 pipeline.addLast("encoder", ftpControlStringEncoder);
87
88 final EventExecutorGroup executorGroup =
89 configuration.getFtpInternalConfiguration().getExecutor();
90
91 final BusinessHandler newbusiness =
92 businessHandler.getDeclaredConstructor().newInstance();
93 final NetworkHandler newNetworkHandler =
94 new NetworkHandler(new FtpSession(configuration, newbusiness));
95 pipeline.addLast(executorGroup, "handler", newNetworkHandler);
96 }
97 }