/// <summary> /// Fetches a single nested message from the requested message. /// </summary> /// <param name="info">The associated info object, this token can be obtained from the messages body structure.</param> /// <returns>The requested nested message.</returns> public Message FetchNestedMessage(MessageInfo info) { var text = FetchEntityText(info); if (string.IsNullOrEmpty(text)) { return null; } var entity = new Entity(); entity.Deserialize(text); return entity.ToMessage(); }
private static void ProcessChild(MessageInfo message, Part current, string token, int sn, string original) { if (current is BodyPart) { var body = (BodyPart) current; switch (body.BodyType.ToLower()) { case "text": AddView(message, current as BodyPart, token, sn); break; case "audio": case "video": case "image": case "application": AddAttachment(message, current as BodyPart, token, sn); break; case "message": if (body.SubType.ToLower() == "rfc822") { AddNestedMessage(message, body, token, sn, original); return; } AddView(message, current as BodyPart, token, sn); break; default: AddView(message, current as BodyPart, token, sn); break; } } var i = 0; foreach (var child in current.Children) { i += 1; var childToken = (token + "." + i).TrimStart('.'); ProcessChild(message, child, childToken, sn, original); } }
private static void AddView(MessageInfo message, BodyPart child, string token, int sn) { var mediaType = (child.BodyType + "/" + child.SubType).ToLower(); var view = new ViewInfo { Description = child.BodyDescription.ToUpper() == "NIL" ? string.Empty : child.BodyDescription, Id = child.BodyId.ToUpper() == "NIL" ? string.Empty : child.BodyId, ContentTransferEncoding = string.IsNullOrEmpty(child.BodyEncoding) ? string.Empty : child.BodyEncoding.ToLower(), MediaType = mediaType, Token = token, SequenceNumber = sn }; int size; var success = int.TryParse(child.BodySize, out size); if (success) { view.SizeEncoded = Size.FromBytes(size); } else { Debug.WriteLine(string.Format("Unable to parse body size. Value is not numeric: '{0}'", child.BodySize)); } int lines; success = int.TryParse(child.TextLines, out lines); if (success) { view.TextLinesEncoded = lines; } var paramDictionary = (ParameterDictionary)view.Parameters; paramDictionary.AddRange(child.Parameters); ((IList<ViewInfo>) message.Views).Add(view); }
private static void AddNestedMessage(MessageInfo message, BodyPart current, string token, int sn, string original) { var nested = new MessageInfo { SequenceNumber = sn, Token = token, OriginalString = original }; nested.Token = token; nested.SequenceNumber = sn; var envelope = original.Substring(current.EnvelopeBounds[0], current.EnvelopeBounds[1]); var parser = new EnvelopeParser(); nested.Envelope = (Envelope) parser.Parse(envelope, null); ((List<MessageInfo>) message.NestedMessages).Add(nested); var i = 0; foreach (var child in current.Children) { i += 1; var childToken = (token + "." + i).TrimStart('.'); ProcessChild(nested, child, childToken, sn, original); } }
private static void AddAttachment(MessageInfo message, BodyPart child, string token, int sn) { var attachment = new AttachmentInfo { ContentTransferEncoding = string.IsNullOrEmpty(child.BodyEncoding) ? string.Empty : child.BodyEncoding.ToLower(), MediaType = (child.BodyType + "/" + child.SubType).ToLower(), Token = token, SequenceNumber = sn }; int size; var success = int.TryParse(child.BodySize, out size); if (success) { attachment.SizeEncoded = Size.FromBytes(size); } else { Debug.WriteLine(string.Format("Unable to parse body size. Value is not numeric: '{0}'", child.BodySize)); } if (child.Parameters.ContainsKey("name")) { attachment.Name = child.Parameters["name"]; } ((ParameterDictionary) attachment.Parameters).AddRange(child.Parameters); ((IList<AttachmentInfo>) message.Attachments).Add(attachment); }
internal static MessageInfo FromBodyPart(Part part, int sn, string original) { var rootToken = string.Empty; var message = new MessageInfo {SequenceNumber = sn, Token = rootToken, OriginalString = original}; if (part is BodyPart) { var body = (BodyPart) part; switch (body.BodyType.ToLower()) { case "text": AddView(message, part as BodyPart, rootToken, sn); break; case "audio": case "video": case "image": case "application": AddAttachment(message, part as BodyPart, rootToken, sn); break; case "message": if (body.SubType == "rfc822") { AddNestedMessage(message, part as BodyPart, rootToken, sn, original); } else { AddView(message, part as BodyPart, rootToken, sn); } break; default: AddView(message, part as BodyPart, string.Empty, sn); break; } } var i = 0; foreach (var child in part.Children) { i += 1; ProcessChild(message, child, i.ToString(), sn, original); } return message; }