private byte[] GetEncodedFileNameBytes()
{
// workitem 6513
var s1 = NormalizeFileName();
switch(AlternateEncodingUsage)
{
case ZipOption.Always:
if (!(_Comment == null || _Comment.Length == 0))
_CommentBytes = AlternateEncoding.GetBytes(_Comment);
_actualEncoding = AlternateEncoding;
return AlternateEncoding.GetBytes(s1);
case ZipOption.Never:
if (!(_Comment == null || _Comment.Length == 0))
_CommentBytes = ibm437.GetBytes(_Comment);
_actualEncoding = ibm437;
return ibm437.GetBytes(s1);
}
// arriving here means AlternateEncodingUsage is "AsNecessary"
// case ZipOption.AsNecessary:
// workitem 6513: when writing, use the alternative encoding
// only when _actualEncoding is not yet set (it can be set
// during Read), and when ibm437 will not do.
byte[] result = ibm437.GetBytes(s1);
// need to use this form of GetString() for .NET CF
string s2 = ibm437.GetString(result, 0, result.Length);
_CommentBytes = null;
if (s2 != s1)
{
// Encoding the filename with ibm437 does not allow round-trips.
// Therefore, use the alternate encoding. Assume it will work,
// no checking of round trips here.
result = AlternateEncoding.GetBytes(s1);
if (_Comment != null && _Comment.Length != 0)
_CommentBytes = AlternateEncoding.GetBytes(_Comment);
_actualEncoding = AlternateEncoding;
return result;
}
_actualEncoding = ibm437;
// Using ibm437, FileName can be encoded without information
// loss; now try the Comment.
// if there is no comment, use ibm437.
if (_Comment == null || _Comment.Length == 0)
return result;
// there is a comment. Get the encoded form.
byte[] cbytes = ibm437.GetBytes(_Comment);
string c2 = ibm437.GetString(cbytes,0,cbytes.Length);
// Check for round-trip.
if (c2 != Comment)
{
// Comment cannot correctly be encoded with ibm437. Use
// the alternate encoding.
result = AlternateEncoding.GetBytes(s1);
_CommentBytes = AlternateEncoding.GetBytes(_Comment);
_actualEncoding = AlternateEncoding;
return result;
}
// use IBM437
_CommentBytes = cbytes;
return result;
}