void EncodeRfc2231 (FormatOptions options, StringBuilder builder, ref int lineLength, Encoding headerEncoding)
{
var bestEncoding = options.International ? CharsetUtils.UTF8 : GetBestEncoding (Value, encoding ?? headerEncoding);
int maxLength = options.MaxLineLength - (Name.Length + 6);
var charset = CharsetUtils.GetMimeCharset (bestEncoding);
var encoder = (Encoder) bestEncoding.GetEncoder ();
var bytes = new byte[Math.Max (maxLength, 6)];
var hexbuf = new byte[bytes.Length * 3 + 3];
var chars = Value.ToCharArray ();
var hex = new HexEncoder ();
int index = 0, i = 0;
string value, id;
bool encoded;
int length;
do {
builder.Append (';');
lineLength++;
encoded = Rfc2231GetNextValue (options, charset, encoder, hex, chars, ref index, ref bytes, ref hexbuf, maxLength, out value);
length = Name.Length + (encoded ? 1 : 0) + 1 + value.Length;
if (i == 0 && index == chars.Length) {
if (lineLength + 1 + length >= options.MaxLineLength) {
builder.Append (options.NewLine);
builder.Append ('\t');
lineLength = 1;
} else {
builder.Append (' ');
lineLength++;
}
builder.Append (Name);
if (encoded)
builder.Append ('*');
builder.Append ('=');
builder.Append (value);
lineLength += length;
return;
}
builder.Append (options.NewLine);
builder.Append ('\t');
lineLength = 1;
id = i.ToString ();
length += id.Length + 1;
builder.Append (Name);
builder.Append ('*');
builder.Append (id);
if (encoded)
builder.Append ('*');
builder.Append ('=');
builder.Append (value);
lineLength += length;
i++;
} while (index < chars.Length);
}