using DotNetty.Buffers; using DotNetty.Transport.Channels; using JSMachine.WMS.Infrastructure.Helper; using JSMachine.WMS.Netty.Common.Model; using JSMachine.WMS.Netty.Common.Util; using JSMachine.WMS.Netty.NettyAsClient.Command; using JSMachine.WMS.Netty.NettyAsClient.CommandHandler; using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; namespace JSMachine.WMS.Netty.NettyAsClient.Transport { public class NettyClientTransport { private IChannelHandlerContext ChannelHandlerContext; private IPInfo RemoteIpInfo; private TcpEngineInitParam _tcpEngineInitParam; [ImportMany("NettyAsClient")] private List AllCmds { get; set; } private Lazy _Container = new(() => { AggregateCatalog catalog = new(); catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); return new CompositionContainer(catalog); }); public NettyClientTransport(IChannelHandlerContext channel, TcpEngineInitParam tcpEngineInitParam) { _tcpEngineInitParam= tcpEngineInitParam; _Container.Value.ComposeParts(this); ChannelHandlerContext = channel; foreach (BaseCmdhandler cmd in AllCmds) { cmd.Channel = channel; } RemoteIpInfo = channel.ToIPInfo(AddressOnwer.Remote); } public Task ChannelReadHandle(IByteBuffer byteBuffer) { string msg = byteBuffer.ToString(Encoding.UTF8); //int length = byteBuffer.ReadableBytes; //byte[] array = new byte[length]; //byteBuffer.GetBytes(byteBuffer.ReaderIndex, array); //string msg = Encoding.UTF8.GetString(array); return Task.Run(async () => { foreach (BaseCmdhandler cmd in AllCmds) { BaseCmd baseCmd; if (msg.Length < _tcpEngineInitParam.MinCodeLength) baseCmd = new BarCodeReadExceptionCmd() { Msg = msg }; else { if (_tcpEngineInitParam.DeviceType != DeviceType.PenmoPrint) baseCmd = new BarCodeUploadCmd() { Msg = msg }; else baseCmd = new PenmoReadCmd() { Msg = msg }; //baseCmd = new BarCodeUploadCmd() { Msg = msg }; } bool isMsgHasBeenHandled = await cmd.Handle(baseCmd); if (isMsgHasBeenHandled) break; } }); } } }