EnVisageOnline/Main/TestSystem/Net/Mime/QuotedPrintableEncoding.cs

74 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace Net.Mime
{
/// <summary>
/// This class is based on the QuotedPrintable class written by Bill Gearhart
/// found at http://www.aspemporium.com/classes.aspx?cid=6
/// </summary>
public static class QuotedPrintableEncoding
{
private const string Equal = "=";
private const string HexPattern = "(\\=([0-9A-F][0-9A-F]))";
public static string Decode(string contents)
{
if (contents == null)
{
throw new ArgumentNullException("contents");
}
using (StringWriter writer = new StringWriter())
{
using (StringReader reader = new StringReader(contents))
{
string line;
while ((line = reader.ReadLine()) != null)
{
/*remove trailing line whitespace that may have
been added by a mail transfer agent per rule
#3 of the Quoted Printable section of RFC 1521.*/
line.TrimEnd();
if (line.EndsWith(Equal))
{
writer.Write(DecodeLine(line));
} //handle soft line breaks for lines that end with an "="
else
{
writer.WriteLine(DecodeLine(line));
}
}
}
writer.Flush();
return writer.ToString();
}
}
private static string DecodeLine(string line)
{
if (line == null)
{
throw new ArgumentNullException("line");
}
Regex hexRegex = new Regex(HexPattern, RegexOptions.IgnoreCase);
return hexRegex.Replace(line, new MatchEvaluator(HexMatchEvaluator));
}
private static string HexMatchEvaluator(Match m)
{
int dec = Convert.ToInt32(m.Groups[2].Value, 16);
char character = Convert.ToChar(dec);
return character.ToString();
}
}
}