Display an error message (instead of "null") if a message couldn't be decoded because of a missing charset.

See issue 1480 for a test case.
This commit is contained in:
cketti 2010-07-11 01:28:08 +00:00
parent 44f161fc7f
commit e59987fdcb
2 changed files with 37 additions and 43 deletions

View File

@ -881,4 +881,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
<string name="save_or_discard_draft_message_dlg_title">Save draft message?</string>
<string name="save_or_discard_draft_message_instructions_fmt">Save or Discard this message?</string>
<string name="charset_not_found">This message can\'t be displayed because the charset \"<xliff:g id="charset">%s</xliff:g>\" wasn\'t found.</string>
</resources>

View File

@ -2,12 +2,14 @@
package com.fsck.k9.mail.internet;
import android.util.Log;
import com.fsck.k9.R;
import com.fsck.k9.K9;
import com.fsck.k9.mail.*;
import org.apache.commons.io.IOUtils;
import org.apache.james.mime4j.decoder.Base64InputStream;
import org.apache.james.mime4j.decoder.DecoderUtil;
import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
import org.apache.james.mime4j.util.CharsetUtil;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -345,67 +347,57 @@ public class MimeUtility
* to be done.
* @param part
* @return
* @throws IOException
*/
public static String getTextFromPart(Part part)
{
Charset mCharsetConverter;
try
{
if (part != null && part.getBody() != null)
if ((part != null) && (part.getBody() != null))
{
Body body = part.getBody();
final Body body = part.getBody();
if (body instanceof TextBody)
{
return ((TextBody)body).getText();
}
else
final String mimeType = part.getMimeType();
if ((mimeType != null) && MimeUtility.mimeTypeMatches(mimeType, "text/*"))
{
InputStream in = part.getBody().getInputStream();
String mimeType = part.getMimeType();
if (mimeType != null && MimeUtility.mimeTypeMatches(mimeType, "text/*"))
/*
* We've got a text part, so let's see if it needs to be processed further.
*/
final String originalCharset = getHeaderParameter(part.getContentType(), "charset");
String charset = "ASCII"; // No encoding, so use us-ascii, which is the standard.
if (originalCharset != null)
{
/*
* Now we read the part into a buffer for further processing. Because
* the stream is now wrapped we'll remove any transfer encoding at this point.
* See if there is conversion from the MIME charset to the Java one.
*/
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
byte[] bytes = out.toByteArray();
in.close();
out.close();
String charset = getHeaderParameter(part.getContentType(), "charset");
/*
* We've got a text part, so let's see if it needs to be processed further.
*/
if (charset != null)
charset = CharsetUtil.toJavaCharset(originalCharset);
if (charset == null)
{
/*
* See if there is conversion from the MIME charset to the Java one.
*/
mCharsetConverter = Charset.forName(charset);
charset = mCharsetConverter.name();
}
if (charset != null)
{
/*
* We've got a charset encoding, so decode using it.
*/
return new String(bytes, 0, bytes.length, charset);
}
else
{
/*
* No encoding, so use us-ascii, which is the standard.
*/
return new String(bytes, 0, bytes.length, "ASCII");
return String.format(K9.app.getString(R.string.charset_not_found), originalCharset);
}
}
/*
* Now we read the part into a buffer for further processing. Because
* the stream is now wrapped we'll remove any transfer encoding at this point.
*/
final InputStream in = part.getBody().getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
in.close();
/*
* Convert and return as new String
*/
final String result = out.toString(charset);
out.close();
return result;
}
}//if text body
}
}
catch (Exception e)
{