Skip to content

Commit

Permalink
reformatting
Browse files Browse the repository at this point in the history
  • Loading branch information
andyedinborough committed Jun 12, 2015
1 parent 26169bb commit 47cfe87
Show file tree
Hide file tree
Showing 4 changed files with 1,037 additions and 877 deletions.
2 changes: 1 addition & 1 deletion Imap/Mailbox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ namespace AE.Net.Mail.Imap {
public class Mailbox {
public Mailbox() : this(string.Empty) { }
public Mailbox(string name) {
Name = ModifiedUtf7Encoding.Decode(name);
Name = name;
Flags = new string[0];
}
public virtual string Name { get; internal set; }
Expand Down
56 changes: 38 additions & 18 deletions Imap/ModifiedUtf7Encoding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,29 @@

namespace AE.Net.Mail.Imap
{
public static class ModifiedUtf7Encoding {
public class ModifiedUtf7Encoding
{
#region Methods

/// <summary>
/// Decodes modified UTF-7 according to RFC 3501 5.1.3: Mailbox International Naming Convention
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Decode(string input) {
if (String.IsNullOrWhiteSpace(input)) {
public string Decode(string input)
{
if (String.IsNullOrWhiteSpace(input))
{
return input;
}

string result = input.Replace("&-", "&");

for (int indexOfAmpersand = result.IndexOf('&'); indexOfAmpersand != -1; indexOfAmpersand = result.IndexOf('&', indexOfAmpersand + 1)) {
for (int indexOfAmpersand = result.IndexOf('&'); indexOfAmpersand != -1; indexOfAmpersand = result.IndexOf('&', indexOfAmpersand + 1))
{
int indexOfMinus = result.IndexOf('-', indexOfAmpersand);
if (indexOfMinus > 0) {
if (indexOfMinus > 0)
{
string substring = result.Substring(indexOfAmpersand + 1, indexOfMinus - indexOfAmpersand - 1);
string modifiedBase64 = "+" + substring.Replace(',', '/');
result = result.Replace("&" + substring + "-", Encoding.UTF7.GetString(Encoding.UTF8.GetBytes(modifiedBase64)));
Expand All @@ -35,50 +42,63 @@ public static string Decode(string input) {
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Encode(string input) {
if (String.IsNullOrWhiteSpace(input)) {
public string Encode(string input)
{
if (String.IsNullOrWhiteSpace(input))
{
return input;
}

if (input.All(IsPrintableAscii)) {
if (input.All(IsPrintableAscii))
{
return input.Replace("&", "&-");
}

var result = new StringBuilder();
var nonAsciiBuffer = new StringBuilder();
foreach (char c in input) {
if (IsPrintableAscii(c)) {
if (nonAsciiBuffer.Length > 0) {
foreach (char c in input)
{
if (IsPrintableAscii(c))
{
if (nonAsciiBuffer.Length > 0)
{
result.Append(EncodeNonPrintableAsciiString(nonAsciiBuffer.ToString()));
nonAsciiBuffer.Clear();
}

if (c == '&') {
if (c == '&')
{
result.Append("&-");
}
else {
else
{
result.Append(c);
}
}
else {
else
{
nonAsciiBuffer.Append(c);
}
}

if (nonAsciiBuffer.Length > 0) {
if (nonAsciiBuffer.Length > 0)
{
result.Append(EncodeNonPrintableAsciiString(nonAsciiBuffer.ToString()));
}

return result.ToString();
}

private static string EncodeNonPrintableAsciiString(string nonAsciiString) {
private string EncodeNonPrintableAsciiString(string nonAsciiString)
{
return Encoding.UTF8.GetString(Encoding.UTF7.GetBytes(nonAsciiString)).Replace('/', ',').Replace('+', '&');
}

private static bool IsPrintableAscii(char c) {
private bool IsPrintableAscii(char c)
{
return c >= '\x20' && c <= '\x7e';
}
}

#endregion Methods
}
}
Loading

0 comments on commit 47cfe87

Please sign in to comment.