/// <summary> /// Create data processor function /// </summary> /// <typeparam name="TConfig"></typeparam> /// <param name="config"></param> /// <param name="loggerFactory"></param> /// <param name="dataProcessorType"></param> /// <param name="getIdFunc"></param> /// <returns></returns> public Func <IDataProcessor> CreateDataProcesorFunc <TConfig>(TConfig config, ILoggerFactory loggerFactory, EnumDataProcessorType dataProcessorType, Func <byte[], byte[]> getIdFunc = null) where TConfig : ConfigBase { // set data processor creator switch (dataProcessorType) { case EnumDataProcessorType.Hsm: return(new Func <IDataProcessor>(() => SimpleMessageDataProcessor.CreateProcessor( loggerFactory.CreateLogger <SimpleMessageDataProcessor>(), config.SocketBufferSize * 2))); case EnumDataProcessorType.Message: return(new Func <IDataProcessor>(() => SimpleMessageDataProcessor.CreateProcessor( loggerFactory.CreateLogger <SimpleMessageDataProcessor>(), config.SocketBufferSize * 2, 2))); case EnumDataProcessorType.Iso8583: return(new Func <IDataProcessor>(() => MessageDataProcessor.CreateIso8583Processor( loggerFactory.CreateLogger <MessageDataProcessor>(), config.SocketBufferSize * 2, getIdFunc))); } // nothing done return(null); }
public void TestDelimiterInHeaderDoesNotSplitMessage() { // create processor var logp = new LoggerFactory(); var cfg = new MessageDataProcessorConfig(5000, new byte[] { 3 }, true); var proc = new MessageDataProcessor(cfg, logp.CreateLogger <MessageDataProcessor>()); // create buffer // (03 - length, XXX - message, 3 - terminator) var buffer = new byte[] { 0, 3, 88, 88, 88, 3, 0, 3, 99, 99, 99, 3, }; // process result var ret = proc.ProcessReceivedRawData(buffer, buffer.Length); Assert.AreEqual(2, ret.Count()); Assert.IsTrue(new byte[] { 88, 88, 88 }.SequenceEqual(ret.First())); Assert.IsTrue(new byte[] { 99, 99, 99 }.SequenceEqual(ret.Skip(1).First())); }
private void LoadEvd(string filePath) { using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { EndianBinaryReader reader = new EndianBinaryReader(stream, Endian.Little); int messageCount = reader.ReadInt32(); for (int i = 0; i < messageCount; i++) { mMessageList.Add(new Message(reader, i)); } // Command block 1 int commandBlockSize = reader.ReadInt32() * 4; long startPos = reader.BaseStream.Position; while (reader.BaseStream.Position - startPos < commandBlockSize) { uint cmdID = reader.ReadUInt32(); if (cmdID == 2147479592) { int formatTest = reader.PeekReadInt32(); if (formatTest == 1000 || formatTest == 0) { Command cmd = new Command(CommandTemplates.First(x => x.Name == "func_F028_2")); cmd.ReadBinary(reader); mCommandList_1.Add(cmd); } else { Command cmd = new Command(CommandTemplates.First(x => x.Name == "func_F028")); cmd.ReadBinary(reader); mCommandList_1.Add(cmd); } continue; } else if (cmdID == 2147479612) { int formatTest = reader.PeekReadInt32(); if (formatTest == 1) { Command cmd = new Command(CommandTemplates.First(x => x.Name == "func_F03C_2")); cmd.ReadBinary(reader); mCommandList_1.Add(cmd); } else { Command cmd = new Command(CommandTemplates.First(x => x.Name == "func_F03C")); cmd.ReadBinary(reader); mCommandList_1.Add(cmd); } continue; } else { Command cmd = new Command(CommandTemplates.First(x => x.ID == cmdID)); cmd.ReadBinary(reader); mCommandList_1.Add(cmd); } } // Command block 2 commandBlockSize = reader.ReadInt32() * 4; startPos = reader.BaseStream.Position; while (reader.BaseStream.Position - startPos < commandBlockSize) { uint cmdID = reader.ReadUInt32(); Command cmd = new Command(CommandTemplates.First(x => x.ID == cmdID)); cmd.ReadBinary(reader); mCommandList_2.Add(cmd); } // Player choices int choiceBlockCount = reader.ReadInt32(); for (int i = 0; i < choiceBlockCount; i++) { List <string> choices = new List <string>(); int numStrings = reader.ReadInt32(); for (int j = 0; j < numStrings; j++) { int stringLength = reader.ReadInt32(); byte[] strBytes = reader.ReadBytes(stringLength); choices.Add(MessageDataProcessor.DecodeBytes(strBytes)); MessageDataProcessor.PadMessageReader(reader); } mChoices.Add(choices.ToArray()); } } }
private void SaveEvd(string filePath) { string dir = Path.GetDirectoryName(filePath); string name = Path.GetFileNameWithoutExtension(filePath); using (FileStream strm = new FileStream(Path.Combine(dir, name + ".evd"), FileMode.Create, FileAccess.Write)) { EndianBinaryWriter writer = new EndianBinaryWriter(strm, Endian.Little); writer.Write(mMessageList.Count); for (int i = 0; i < mMessageList.Count; i++) { mMessageList[i].Write(writer, i); } // Write command stream 1 writer.Write((int)0); long curOffset = writer.BaseStream.Position; foreach (Command com in mCommandList_1) { com.WriteBinary(writer, null); } long size = writer.BaseStream.Position - curOffset; writer.BaseStream.Seek(curOffset - 4, SeekOrigin.Begin); writer.Write((int)size / 4); writer.Seek(0, SeekOrigin.End); // Write command stream 2 writer.Write((int)0); curOffset = writer.BaseStream.Position; foreach (Command com in mCommandList_2) { com.WriteBinary(writer, null); } size = writer.BaseStream.Position - curOffset; writer.BaseStream.Seek(curOffset - 4, SeekOrigin.Begin); writer.Write((int)size / 4); writer.Seek(0, SeekOrigin.End); writer.Write((int)mChoices.Count); foreach (string[] strArray in mChoices) { writer.Write((int)strArray.Length); foreach (string str in strArray) { byte[] chars = MessageDataProcessor.EncodeString(str); writer.Write((int)chars.Length); writer.Write(chars); MessageDataProcessor.PadMessageWriter(writer); } } } }