private byte[] Receive() { if (MessageStream == null) { return(null); } int readLength = config.MaskConfig.MinBytesCountToCheck; byte[] checkData = new byte[readLength]; int offset = 0, numberReadData = 0; do { numberReadData = MessageStream.Receive(checkData, offset, readLength); offset += numberReadData; readLength -= numberReadData; } while (readLength > 0 && numberReadData > 0); config.MessageToModelConfig cfg = config.MessageConfigs.GetQulifiedMessageToModel(checkData); MessageToModelConfig = cfg; if (cfg == null) { throw new MessageProcessorException("Unrecognized message. Check message-to-model elements in configuration file." + Environment.NewLine + readLength + " first bytes of message: " + MessageUtility.HexToReadableString(checkData)); } byte[] lengthHeader = new byte[cfg.ModelCfg.MessageCfg.LengthHeader]; Array.Copy(checkData, lengthHeader, lengthHeader.Length); int messageLength = (int)MessageUtility.BytesToInt(lengthHeader); messageLength += lengthHeader.Length; byte[] data = new byte[messageLength]; Array.Copy(checkData, data, checkData.Length); offset = checkData.Length; readLength = messageLength - checkData.Length; do { numberReadData = MessageStream.Receive(data, offset, readLength); offset += numberReadData; readLength -= numberReadData; } while (readLength > 0 && numberReadData > 0); return(data); }
public override void Parse() { Type IMaskType = typeof(IMask); MethodInfo[] methods = _mapping.GetMethods(BindingFlags.Public | BindingFlags.Static); foreach (var m in methods) { if (!IMaskType.IsAssignableFrom(m.ReturnType) || m.GetParameters().Length > 0) { continue; } var attr = GetAttribute <MessageToModelAttribute>(m); if (attr == null) { continue; } MessageToModelConfig cfg = new MessageToModelConfig(); string sourceMsg = "Check mapping defined by " + m.Name + " method of " + _mapping.FullName + " class."; if (attr.Model == null) { throw new ConfigParserException("Model must be defined. " + sourceMsg); } cfg.ModelCfg = ParseModel(attr.Model, sourceMsg); MethodInfo processMethod = null; if (attr.ProcessClass == null) { cfg.ProcessModel = null; } else { CheckRequired(attr, "ProcessMethod", sourceMsg); cfg.ProcessModel = ParseDelegate(typeof(ProcessModel <,>), attr.ProcessClass, attr.ProcessMethod, sourceMsg); processMethod = cfg.ProcessModel.Method; } cfg.MaskList.Add((m.Invoke(null, null) as IMask).GetConfig(attr.Model, processMethod)); MessageConfigs.MessageToModels.Add(cfg); } }