private string ParseMessage(ref Stream dataStream, ref Message message, IList <RFC822.Field> fields) { foreach (RFC822.Field contentField in fields) { if (contentField is ContentTypeField) { ContentTypeField contentTypeField = contentField as ContentTypeField; if (m_CompositePattern.RegularExpression.IsMatch(contentTypeField.Type)) { IMultipartEntity e = message as IMultipartEntity; e.Delimiter = ReadDelimiter(ref contentTypeField); return(ReadCompositeEntity(ref dataStream, ref e)); } if (m_DiscretePattern.RegularExpression.IsMatch(contentTypeField.Type)) { IEntity e = message as IEntity; message.BodyParts.Add(e);// This is a message witch body lies within its own entity return(ReadDiscreteEntity(ref dataStream, ref e)); } } } return(string.Empty); }
private string ReadCompositeEntity(ref Stream dataStream, ref IMultipartEntity parent) { IEntity child; string delimiter = null; IEntity e = parent as IEntity; if (parent.BodyParts.Count < 1) { delimiter = FindStartDelimiter(ref dataStream, ref e); if (!delimiter.Equals("--" + parent.Delimiter)) { return(string.Empty); } } delimiter = CreateEntity(ref dataStream, ref parent, out child); if (child == null || delimiter == string.Empty) { return(string.Empty); } if (child is MultipartEntity) { IMultipartEntity mChild = child as IMultipartEntity; delimiter = ReadCompositeEntity(ref dataStream, ref mChild); } else { delimiter = ReadDiscreteEntity(ref dataStream, ref child); } // until we reach end of mail while (delimiter != string.Empty && parent != null) { if (parent.Delimiter == null) { parent = parent.Parent; } else if (delimiter.Contains(parent.Delimiter)) { if (delimiter.Equals("--" + parent.Delimiter)) { delimiter = ReadCompositeEntity(ref dataStream, ref parent); } else if (delimiter.Equals("--" + parent.Delimiter + "--")) { parent = parent.Parent; IEntity ent = parent as IEntity; delimiter = FindStartDelimiter(ref dataStream, ref ent); } } } return(delimiter); }
private string CreateEntity(ref Stream dataStream, ref IMultipartEntity parent, out IEntity entity) { entity = null; IList <RFC822.Field> fields; int cause = ParseFields(ref dataStream, out fields); if (cause > 0) { foreach (RFC822.Field contentField in fields) { if (contentField is ContentTypeField) { ContentTypeField contentTypeField = contentField as ContentTypeField; if (m_FieldParser.CompositeType.IsMatch(contentTypeField.Type)) { MultipartEntity mEntity = new MultipartEntity(); mEntity.Fields = fields; entity = mEntity; entity.Parent = parent; parent.BodyParts.Add(entity); if (Regex.IsMatch(contentTypeField.Type, "(?i)message") && Regex.IsMatch(contentTypeField.SubType, "(?i)rfc822")) { Message message = new Message(); IList <RFC822.Field> messageFields; cause = ParseFields(ref dataStream, out messageFields); message.Fields = messageFields; mEntity.BodyParts.Add(message); message.Parent = mEntity; if (cause > 0) { return(ParseMessage(ref dataStream, ref message, messageFields)); } break; } else { mEntity.Delimiter = ReadDelimiter(ref contentTypeField); return(parent.Delimiter); } } else if (m_FieldParser.DescriteType.IsMatch(contentTypeField.Type)) { entity = new Entity(); entity.Fields = fields; entity.Parent = parent; parent.BodyParts.Add(entity); return(parent.Delimiter); } } } } return(string.Empty); }
private string ReadCompositeEntity(ref Stream dataStream, ref IMultipartEntity parent) { IEntity child; string delimiter = null; IEntity e = parent as IEntity; if (parent.BodyParts.Count < 1) { delimiter = FindStartDelimiter(ref dataStream, ref e); if (!delimiter.Equals("--" + parent.Delimiter)) return string.Empty; } delimiter = CreateEntity(ref dataStream, ref parent, out child); if (child == null || delimiter == string.Empty) { return string.Empty; } if (child is MultipartEntity) { IMultipartEntity mChild = child as IMultipartEntity; delimiter = ReadCompositeEntity(ref dataStream, ref mChild); } else delimiter = ReadDiscreteEntity(ref dataStream, ref child); // until we reach end of mail while (delimiter != string.Empty && parent != null) { if (parent.Delimiter == null) { parent = parent.Parent; } else if (delimiter.Contains(parent.Delimiter)) { if (delimiter.Equals("--" + parent.Delimiter)) { delimiter = ReadCompositeEntity(ref dataStream, ref parent); } else if (delimiter.Equals("--" + parent.Delimiter + "--")) { parent = parent.Parent; IEntity ent = parent as IEntity; delimiter = FindStartDelimiter(ref dataStream, ref ent); } } } return delimiter; }
private string CreateEntity(ref Stream dataStream, ref IMultipartEntity parent, out IEntity entity) { entity = null; IList<RFC822.Field> fields; int cause = ParseFields(ref dataStream, out fields); if (cause >= 0) { foreach (RFC822.Field contentField in fields) { if (contentField is ContentTypeField) { ContentTypeField contentTypeField = contentField as ContentTypeField; if (m_CompositePattern.RegularExpression.IsMatch(contentTypeField.Type)) { MultipartEntity mEntity = new MultipartEntity(); mEntity.Fields = fields; entity = mEntity; entity.Parent = parent; parent.BodyParts.Add(entity); if (Regex.IsMatch(contentTypeField.Type, "(?i)message") && Regex.IsMatch(contentTypeField.SubType, "(?i)rfc822")) { Message message = new Message(); IList<RFC822.Field> messageFields; cause = ParseFields(ref dataStream, out messageFields); message.Fields = messageFields; mEntity.BodyParts.Add(message); message.Parent = mEntity; if(cause > 0) return ParseMessage(ref dataStream, ref message, messageFields); break; } mEntity.Delimiter = ReadDelimiter(ref contentTypeField); return parent.Delimiter; } if (m_DiscretePattern.RegularExpression.IsMatch(contentTypeField.Type)) { entity = new Entity(); entity.Fields = fields; entity.Parent = parent; parent.BodyParts.Add(entity); return parent.Delimiter; } } } } return string.Empty; }