Continue exportig on errors

This commit is contained in:
M66B 2021-04-18 08:18:31 +02:00
parent 8c1ef89aec
commit a6092c6cd2
1 changed files with 64 additions and 61 deletions

View File

@ -920,81 +920,84 @@ public class FragmentFolders extends FragmentBase {
long last = new Date().getTime(); long last = new Date().getTime();
ContentResolver resolver = context.getContentResolver(); ContentResolver resolver = context.getContentResolver();
try (OutputStream out = new BufferedOutputStream(resolver.openOutputStream(uri))) { try (OutputStream out = new BufferedOutputStream(resolver.openOutputStream(uri))) {
for (int i = 0; i < ids.size(); i++) { for (int i = 0; i < ids.size(); i++)
long now = new Date().getTime(); try {
if (now - last > EXPORT_PROGRESS_INTERVAL) { long now = new Date().getTime();
last = now; if (now - last > EXPORT_PROGRESS_INTERVAL) {
builder.setProgress(ids.size(), i, false); last = now;
nm.notify("export", 1, builder.build()); builder.setProgress(ids.size(), i, false);
} nm.notify("export", 1, builder.build());
}
long id = ids.get(i); long id = ids.get(i);
EntityMessage message = db.message().getMessage(id); EntityMessage message = db.message().getMessage(id);
if (message == null) if (message == null)
continue; continue;
String email = null; String email = null;
if (message.from != null && message.from.length > 0) if (message.from != null && message.from.length > 0)
email = ((InternetAddress) message.from[0]).getAddress(); email = ((InternetAddress) message.from[0]).getAddress();
if (TextUtils.isEmpty(email)) if (TextUtils.isEmpty(email))
email = "MAILER-DAEMON"; email = "MAILER-DAEMON";
out.write(("From " + email + " " + df.format(message.received) + "\n").getBytes()); out.write(("From " + email + " " + df.format(message.received) + "\n").getBytes());
Message imessage = MessageHelper.from(context, message, null, isession, false); Message imessage = MessageHelper.from(context, message, null, isession, false);
imessage.writeTo(new FilterOutputStream(out) { imessage.writeTo(new FilterOutputStream(out) {
private boolean cr = false; private boolean cr = false;
private ByteArrayOutputStream buffer = new ByteArrayOutputStream(998); private ByteArrayOutputStream buffer = new ByteArrayOutputStream(998);
@Override @Override
public void write(int b) throws IOException { public void write(int b) throws IOException {
if (b == 13 /* CR */) { if (b == 13 /* CR */) {
if (cr) // another if (cr) // another
line();
cr = true;
} else if (b == 10 /* LF */) {
line(); line();
cr = true; } else {
} else if (b == 10 /* LF */) { if (cr) // dangling
line(); line();
} else { buffer.write(b);
if (cr) // dangling }
line();
buffer.write(b);
} }
}
@Override @Override
public void flush() throws IOException { public void flush() throws IOException {
if (buffer.size() > 0 || cr /* dangling */) if (buffer.size() > 0 || cr /* dangling */)
line(); line();
out.write(10); out.write(10);
super.flush(); super.flush();
} }
private void line() throws IOException { private void line() throws IOException {
byte[] b = buffer.toByteArray(); byte[] b = buffer.toByteArray();
int i = 0; int i = 0;
for (; i < b.length; i++) for (; i < b.length; i++)
if (b[i] != '>') if (b[i] != '>')
break; break;
if (i + 4 < b.length && if (i + 4 < b.length &&
b[i + 0] == 'F' && b[i + 0] == 'F' &&
b[i + 1] == 'r' && b[i + 1] == 'r' &&
b[i + 2] == 'o' && b[i + 2] == 'o' &&
b[i + 3] == 'm' && b[i + 3] == 'm' &&
b[i + 4] == ' ') b[i + 4] == ' ')
out.write('>'); out.write('>');
for (i = 0; i < b.length; i++) for (i = 0; i < b.length; i++)
out.write(b[i]); out.write(b[i]);
out.write(10); out.write(10);
buffer.reset(); buffer.reset();
cr = false; cr = false;
} }
}); });
} } catch (Throwable ex) {
Log.e(ex);
}
} finally { } finally {
nm.cancel("export", 1); nm.cancel("export", 1);
} }