Ejemplo n.º 1
0
 /// <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();
 }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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;
        }