DotAtomReader.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Net / System / Net / Mail / DotAtomReader.cs / 1305376 / DotAtomReader.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Net.Mail 
{ 
    using System;
    using System.Diagnostics; 
    using System.Net.Mime;
    using System.Text;

    // 
    // RFC 2822 Section 3.2.4 - Atom, Dot-Atom
    // 
    // A Dot-Atom is a string of ASCII characters separated by dots.  Dots would normally not be allowed at the start 
    // or end, but we do allow dots at the end for compatibility with other mail clients.  We also allow
    // multiple consecutive dots, which would normally be invalid. 
    //
    internal static class DotAtomReader
    {
        // Reads a Dot Atom in reverse. 
        //
        // Preconditions: 
        //  - Index must be within the bounds of the data string. 
        //
        // Return value: 
        // - The first index of of a character not valid in a dot-atom.  It is then up to the caller to
        //   determine if the next character is a valid delimiter.
        //   e.g. "user.name@domain.com", starting at index 19 (m) returns 9 (@).
        //   e.g. "user.name@dom in.com", starting at index 19 (m) returns 13 (space). 
        // - -1 if the dot-atom section terminated at the start of the data string.
        //   e.g. "user.name@domain.com", starting at index 8 (e) returns -1. 
        // 
        // A FormatException will be thrown if:
        // - The initial character at data[index] is invalid in a dot-atom. 
        //   e.g. "a@b.com", starting at index 1 (@).
        // - The leading character is a dot.
        //   e.g. "a@.b.com", starting at index 7 (m), throws because the leading char (index 2) is a dot.
        // 
        internal static int ReadReverse(string data, int index)
        { 
            Debug.Assert(0 <= index && index < data.Length, "index was outside the bounds of the string: " + index); 

            int startIndex = index; 
            // Scan for the first Unicode or invalid chars (including whitespace)
            for ( ; 0 <= index; index--)
            {
                if (data[index] > MailBnfHelper.Ascii7bitMaxValue // Unicode 
                 || (data[index] != MailBnfHelper.Dot && !MailBnfHelper.Atext[data[index]])) // Invalid char
                { 
                    break; 
                }
            } 

            // Check for empty/invalid dot-atom
            if (startIndex == index)
            { 
                throw new FormatException(SR.GetString(SR.MailHeaderFieldInvalidCharacter, data[index]));
            } 
            // Check for leading dot 
            else if (data[index + 1] == MailBnfHelper.Dot)
            { 
                throw new FormatException(SR.GetString(SR.MailHeaderFieldInvalidCharacter, MailBnfHelper.Dot));
            }
            return index;
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Net.Mail 
{ 
    using System;
    using System.Diagnostics; 
    using System.Net.Mime;
    using System.Text;

    // 
    // RFC 2822 Section 3.2.4 - Atom, Dot-Atom
    // 
    // A Dot-Atom is a string of ASCII characters separated by dots.  Dots would normally not be allowed at the start 
    // or end, but we do allow dots at the end for compatibility with other mail clients.  We also allow
    // multiple consecutive dots, which would normally be invalid. 
    //
    internal static class DotAtomReader
    {
        // Reads a Dot Atom in reverse. 
        //
        // Preconditions: 
        //  - Index must be within the bounds of the data string. 
        //
        // Return value: 
        // - The first index of of a character not valid in a dot-atom.  It is then up to the caller to
        //   determine if the next character is a valid delimiter.
        //   e.g. "user.name@domain.com", starting at index 19 (m) returns 9 (@).
        //   e.g. "user.name@dom in.com", starting at index 19 (m) returns 13 (space). 
        // - -1 if the dot-atom section terminated at the start of the data string.
        //   e.g. "user.name@domain.com", starting at index 8 (e) returns -1. 
        // 
        // A FormatException will be thrown if:
        // - The initial character at data[index] is invalid in a dot-atom. 
        //   e.g. "a@b.com", starting at index 1 (@).
        // - The leading character is a dot.
        //   e.g. "a@.b.com", starting at index 7 (m), throws because the leading char (index 2) is a dot.
        // 
        internal static int ReadReverse(string data, int index)
        { 
            Debug.Assert(0 <= index && index < data.Length, "index was outside the bounds of the string: " + index); 

            int startIndex = index; 
            // Scan for the first Unicode or invalid chars (including whitespace)
            for ( ; 0 <= index; index--)
            {
                if (data[index] > MailBnfHelper.Ascii7bitMaxValue // Unicode 
                 || (data[index] != MailBnfHelper.Dot && !MailBnfHelper.Atext[data[index]])) // Invalid char
                { 
                    break; 
                }
            } 

            // Check for empty/invalid dot-atom
            if (startIndex == index)
            { 
                throw new FormatException(SR.GetString(SR.MailHeaderFieldInvalidCharacter, data[index]));
            } 
            // Check for leading dot 
            else if (data[index + 1] == MailBnfHelper.Dot)
            { 
                throw new FormatException(SR.GetString(SR.MailHeaderFieldInvalidCharacter, MailBnfHelper.Dot));
            }
            return index;
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK