1
2
3
4
5
6
7
8
9
10
11
12
13 package org.abstracthorizon.mercury.imap.cmd;
14
15 import org.abstracthorizon.danube.connection.Connection;
16 import org.abstracthorizon.danube.connection.ConnectionHandler;
17 import org.abstracthorizon.danube.support.RuntimeIOException;
18 import org.abstracthorizon.mercury.common.command.CommandException;
19 import org.abstracthorizon.mercury.imap.BADCommandException;
20 import org.abstracthorizon.mercury.imap.IMAPSession;
21 import org.abstracthorizon.mercury.imap.NOCommandException;
22 import org.abstracthorizon.mercury.imap.response.ExistsResponse;
23 import org.abstracthorizon.mercury.imap.response.NOResponse;
24 import org.abstracthorizon.mercury.imap.response.OKResponse;
25 import org.abstracthorizon.mercury.imap.response.RecentResponse;
26 import org.abstracthorizon.mercury.imap.util.ParserException;
27
28 import java.io.IOException;
29
30 import javax.mail.Folder;
31 import javax.mail.MessagingException;
32
33
34
35
36
37
38 public class IMAPCommand implements ConnectionHandler {
39
40 public static final short SEND_WHEN_HAVE_NEW = 0;
41 public static final short ALWAYS_SEND_UNILATERAL_DATA = 1;
42 public static final short ALWAYS_SUPRESS_UNILATERAL_DATA = 2;
43
44 protected short unilateral = SEND_WHEN_HAVE_NEW;
45
46
47 protected String mnemonic;
48
49
50
51
52
53 public IMAPCommand(String mnemonic) {
54 this.mnemonic = mnemonic;
55 }
56
57
58
59
60
61 public String getMnemonic() {
62 return mnemonic;
63 }
64
65
66
67
68
69 public void handleConnection(Connection connection) {
70 IMAPSession session = (IMAPSession)connection;
71 try {
72 session.markCommandStarted();
73 execute(session);
74 } catch (IOException e) {
75 throw new RuntimeIOException(e);
76 } catch (ParserException e) {
77 throw new BADCommandException(e);
78 } catch (MessagingException e) {
79 throw new NOCommandException(e);
80 }
81 }
82
83
84
85
86
87
88
89
90
91 protected void execute(IMAPSession session) throws ParserException, MessagingException, CommandException, IOException {
92 checkEOL(session);
93 new NOResponse(session, getMnemonic()+" unimplemented").submit();
94 }
95
96
97
98
99
100
101 protected void sendOK(IMAPSession session) throws IOException {
102 new OKResponse(session, mnemonic+" Completed in "+session.getCommandLasted()+"ms").submit();
103 }
104
105
106
107
108
109
110
111 protected void checkEOL(IMAPSession session) throws IOException, ParserException {
112 session.getScanner().check_eol();
113 if (unilateral != ALWAYS_SUPRESS_UNILATERAL_DATA) {
114 try {
115 Folder folder = session.getSelectedFolder();
116 if (folder != null) {
117 if ((unilateral == ALWAYS_SEND_UNILATERAL_DATA) || (folder.getNewMessageCount() > 0)) {
118 new ExistsResponse(session, folder).submit();
119 new RecentResponse(session, folder).submit();
120 }
121 }
122 } catch (MessagingException ignore) {
123
124 }
125 }
126 }
127 }