1 package davmail.exchange;
2
3 import davmail.Settings;
4 import org.apache.log4j.Logger;
5
6 import javax.mail.internet.MimeMessage;
7 import java.io.IOException;
8 import java.io.OutputStream;
9 import java.net.SocketException;
10 import java.nio.charset.StandardCharsets;
11 import java.util.HashMap;
12
13
14
15
16 public class MessageCreateThread extends Thread {
17 private static final Logger LOGGER = Logger.getLogger(MessageCreateThread.class);
18
19 boolean isComplete = false;
20 ExchangeSession session;
21 String folderPath;
22 String messageName;
23 HashMap<String, String> properties;
24 MimeMessage mimeMessage;
25 ExchangeSession.Message message;
26 IOException exception;
27
28 MessageCreateThread(String threadName, ExchangeSession session, String folderPath, String messageName, HashMap<String, String> properties, MimeMessage mimeMessage) {
29 super(threadName + "-MessageCreate");
30 setDaemon(true);
31 this.session = session;
32 this.folderPath = folderPath;
33 this.messageName = messageName;
34 this.properties = properties;
35 this.mimeMessage = mimeMessage;
36 }
37
38 public void run() {
39 try {
40 this.message = session.createMessage(folderPath, messageName, properties, mimeMessage);
41 } catch (IOException e) {
42 exception = e;
43 } finally {
44 isComplete = true;
45 }
46 }
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 public static ExchangeSession.Message createMessage(ExchangeSession session, String folderPath, String messageName, HashMap<String, String> properties, MimeMessage mimeMessage, OutputStream outputStream, String capabilities) throws IOException {
62 MessageCreateThread messageCreateThread = new MessageCreateThread(currentThread().getName(), session, folderPath, messageName, properties, mimeMessage);
63 messageCreateThread.start();
64 while (!messageCreateThread.isComplete) {
65 try {
66 messageCreateThread.join(20000);
67 } catch (InterruptedException e) {
68 LOGGER.warn("Thread interrupted", e);
69 Thread.currentThread().interrupt();
70 }
71 if (!messageCreateThread.isComplete) {
72 if (Settings.getBooleanProperty("davmail.enableKeepAlive", false)) {
73 LOGGER.debug("Still loading message, send capabilities untagged response to avoid timeout");
74 try {
75 LOGGER.debug("* " + capabilities);
76 outputStream.write(("* " + capabilities).getBytes(StandardCharsets.US_ASCII));
77 outputStream.write((char) 13);
78 outputStream.write((char) 10);
79 outputStream.flush();
80 } catch (SocketException e) {
81 messageCreateThread.interrupt();
82 throw e;
83 }
84 }
85 }
86 }
87 if (messageCreateThread.exception != null) {
88 throw messageCreateThread.exception;
89 }
90 return messageCreateThread.message;
91 }
92 }