Changeset b43ebd2


Ignore:
Timestamp:
Apr 22, 2014 11:18:56 AM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
6986f90
Parents:
7bf3ea5
Message:
  • SusiMail?:
    • Add persistent cache
    • Remove ID sorter
    • Mail size getter/setter
    • Set mail size when setting body
    • Only send CAPA once
    • Tagged string tweaks
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/webmail/Mail.java

    r7bf3ea5 rb43ebd2  
    5555        private static final String unknown = "unknown";
    5656
    57         public int id, size;
     57        private int size;
    5858        public String sender, reply, subject, dateString,
    5959                formattedSender, formattedSubject,
     
    109109                        setHeader(rb);
    110110                body = rb;
     111                size = rb.length;
    111112                try {
    112113                        part = new MailPart(rb);
     
    126127        public boolean hasPart() {
    127128                return part != null;
     129        }
     130
     131        public int getSize() {
     132                return size;
     133        }
     134
     135        public void setSize(int size) {
     136                if (body != null)
     137                        return;
     138                this.size = size;
    128139        }
    129140
  • apps/susimail/src/src/i2p/susi/webmail/MailCache.java

    r7bf3ea5 rb43ebd2  
    2424package i2p.susi.webmail;
    2525
     26import i2p.susi.debug.Debug;
    2627import i2p.susi.util.ReadBuffer;
    2728import i2p.susi.webmail.pop3.POP3MailBox;
    2829import i2p.susi.webmail.pop3.POP3MailBox.FetchRequest;
    2930
     31import java.io.IOException;
    3032import java.util.ArrayList;
    3133import java.util.Collection;
     
    4446        private final POP3MailBox mailbox;
    4547        private final Hashtable<String, Mail> mails;
     48        private final PersistentMailCache disk;
    4649       
    4750        /** Includes header, headers are generally 1KB to 1.5 KB,
     
    5356         * @param mailbox non-null
    5457         */
    55         MailCache( POP3MailBox mailbox ) {
     58        MailCache(POP3MailBox mailbox,
     59                  String host, int port, String user, String pass) {
    5660                this.mailbox = mailbox;
    5761                mails = new Hashtable<String, Mail>();
     62                PersistentMailCache pmc = null;
     63                try {
     64                        pmc = new PersistentMailCache(host, port, user, pass);
     65                        // TODO pmc.getMails()
     66                } catch (IOException ioe) {
     67                        Debug.debug(Debug.ERROR, "Error creating disk cache: " + ioe);
     68                }
     69                disk = pmc;
    5870        }
    5971
     
    8193                if( mail == null ) {
    8294                        mail = newMail;
    83                         mail.size = mailbox.getSize( uidl );
     95                        mail.setSize(mailbox.getSize(uidl));
    8496                }
    8597                if (mail.markForDeletion)
    8698                        return null;
    87                 if( mail.size <= FETCH_ALL_SIZE)
     99                if(mail.getSize() <= FETCH_ALL_SIZE)
    88100                        headerOnly = false;
    89101                       
     
    94106                        if(!mail.hasBody()) {
    95107                                mail.setBody(mailbox.getBody(uidl));
     108                        }
     109                }
     110                if (disk != null) {
     111                        if (disk.saveMail(mail) && mail.hasBody()) {
     112                                // TODO delete on server
    96113                        }
    97114                }
     
    127144                        if( mail == null ) {
    128145                                mail = newMail;
    129                                 mail.size = mailbox.getSize( uidl );
     146                                mail.setSize(mailbox.getSize(uidl));
    130147                        }
    131148                        if (mail.markForDeletion)
    132149                                continue;
    133150                        mr.setMail(mail);
    134                         if( mail.size <= FETCH_ALL_SIZE)
     151                        if(mail.getSize() <= FETCH_ALL_SIZE)
    135152                                headerOnly = false;
    136153                        if( headerOnly ) {
    137154                                if(!mail.hasHeader()) {
     155                                        if (disk != null) {
     156                                                if (disk.getMail(mail, true)) {
     157                                                        Debug.debug(Debug.DEBUG, "Loaded header from disk cache: " + uidl);
     158                                                        continue;  // found on disk, woo
     159                                                }
     160                                        }
    138161                                        POP3Request pr = new POP3Request(mr, mail, true);
    139162                                        fetches.add(pr);
     
    141164                        } else {
    142165                                if(!mail.hasBody()) {
     166                                        if (disk != null) {
     167                                                if (disk.getMail(mail, false)) {
     168                                                        Debug.debug(Debug.DEBUG, "Loaded body from disk cache: " + uidl);
     169                                                        continue;  // found on disk, woo
     170                                                }
     171                                        }
    143172                                        POP3Request pr = new POP3Request(mr, mail, false);
    144173                                        fetches.add(pr);
     
    163192                                                mail.setBody(rb);
    164193                                        }
     194                                        if (disk != null) {
     195                                                if (disk.saveMail(mail) && mail.hasBody()) {
     196                                                        // TODO delete on server
     197                                                }
     198                                        }
    165199                                }
    166200                        }
     
    189223                List<String> toDelete = new ArrayList<String>(uidls.size());
    190224                for (String uidl : uidls) {
     225                        if (disk != null)
     226                                disk.deleteMail(uidl);
    191227                        Mail mail = mails.get(uidl);
    192228                        if (mail == null)
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    r7bf3ea5 rb43ebd2  
    173173
    174174        private static final String CONFIG_BCC_TO_SELF = "composer.bcc.to.self";
     175        private static final String CONFIG_LEAVE_ON_SERVER = "pop3.leave.on.server";
    175176        private static final String CONFIG_DEBUG = "debug";
    176177
     
    195196         * @author susi
    196197         */
     198/****
    197199        private static class IDSorter implements Comparator<String> {
    198200                private final MailCache mailCache;
    199201               
    200                 /**
    201                  * Set MailCache object, where to get Mails from
    202                  * @param mailCache
    203                  */
    204202                public IDSorter( MailCache mailCache )
    205203                {
     
    207205                }
    208206               
    209                 /* (non-Javadoc)
    210                  * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
    211                  */
    212207                public int compare(String arg0, String arg1) {
    213208                        Mail a = mailCache.getMail( arg0, MailCache.FETCH_HEADER );
     
    220215                }               
    221216        }
     217****/
    222218
    223219        /**
     
    339335                        if (b == null)
    340336                                return -1;
    341                         return a.size - b.size;
     337                        return a.getSize() - b.getSize();
    342338                }               
    343339        }
     
    426422        private static String sortHeader( String name, String label, String imgPath )
    427423        {
    428                 return label + "&nbsp;<a href=\"" + myself + "?" + name + "=up\"><img src=\"" +
     424                return label + "&nbsp;&nbsp;<a href=\"" + myself + "?" + name + "=up\"><img src=\"" +
    429425                        imgPath + "3up.png\" border=\"0\" alt=\"^\"></a><a href=\"" + myself +
    430426                        "?" + name + "=down\"><img src=\"" + imgPath + "3down.png\" border=\"0\" alt=\"v\"></a>";
     
    557553                        if( prepareAttachment ) {
    558554                                if( html ) {
     555                                        // TODO can we at least show images safely?
    559556                                        out.println( "<hr><p class=\"mailbody\">" );
    560557                                        out.println( "<a target=\"_blank\" href=\"" + myself + "?" + DOWNLOAD + "=" +
     
    672669                                                sessionObject.smtpPort = smtpPortNo;
    673670                                                sessionObject.state = STATE_LIST;
    674                                                 MailCache mc = new MailCache(mailbox);
     671                                                MailCache mc = new MailCache(mailbox, host, pop3PortNo, user, pass);
    675672                                                sessionObject.mailCache = mc;
    676673                                                sessionObject.folder = new Folder<String>();
     674                                                // TODO get through cache so we have the disk-only ones too
    677675                                                String[] uidls = mailbox.getUIDLs();
    678676                                                sessionObject.folder.setElements(uidls);
     
    687685                                                }
    688686                                               
    689                                                 sessionObject.folder.addSorter( SORT_ID, new IDSorter( sessionObject.mailCache ) );
     687                                                //sessionObject.folder.addSorter( SORT_ID, new IDSorter( sessionObject.mailCache ) );
    690688                                                sessionObject.folder.addSorter( SORT_SENDER, new SenderSorter( sessionObject.mailCache ) );
    691689                                                sessionObject.folder.addSorter( SORT_SUBJECT, new SubjectSorter( sessionObject.mailCache ) );
     
    10141012                if( buttonPressed( request, REFRESH ) ) {
    10151013                        sessionObject.mailbox.refresh();
     1014                        // TODO get through cache so we have the disk-only ones too
    10161015                        String[] uidls = sessionObject.mailbox.getUIDLs();
    10171016                        if (uidls != null)
     
    14371436                         */
    14381437                        if( sessionObject.state != STATE_AUTH ) {
     1438                                // TODO get through cache so we have the disk-only ones too
    14391439                                String[] uidls = sessionObject.mailbox.getUIDLs();
    14401440                                if (uidls != null)
     
    14861486                                }
    14871487                                out.println( "</head>\n<body>\n" +
    1488                                         "<div class=\"page\"><p><img src=\"" + sessionObject.imgPath + "susimail.png\" alt=\"Susimail\"><br>&nbsp;</p>\n" +
     1488                                        "<div class=\"page\"><p><img src=\"" + sessionObject.imgPath + "susimail.png\" alt=\"Susimail\"></p>\n" +
    14891489                                        "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"" + myself + "\" accept-charset=\"UTF-8\">" );
    14901490
     
    17571757                out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
    17581758                                "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
    1759                                 "<tr><td align=\"right\">" + _("From:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_FROM + "\" value=\"" + from + "\" " + ( !fixed.equalsIgnoreCase("false") ? "disabled" : "" ) +"></td></tr>\n" +
    1760                                 "<tr><td align=\"right\">" + _("To:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_TO + "\" value=\"" + to + "\"></td></tr>\n" +
    1761                                 "<tr><td align=\"right\">" + _("Cc:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_CC + "\" value=\"" + cc + "\"></td></tr>\n" +
    1762                                 "<tr><td align=\"right\">" + _("Bcc:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_BCC + "\" value=\"" + bcc + "\"></td></tr>\n" +
     1759                                "<tr><td align=\"right\">" + _("From") + ":</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_FROM + "\" value=\"" + from + "\" " + ( !fixed.equalsIgnoreCase("false") ? "disabled" : "" ) +"></td></tr>\n" +
     1760                                "<tr><td align=\"right\">" + _("To") + ":</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_TO + "\" value=\"" + to + "\"></td></tr>\n" +
     1761                                "<tr><td align=\"right\">" + _("Cc") + ":</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_CC + "\" value=\"" + cc + "\"></td></tr>\n" +
     1762                                "<tr><td align=\"right\">" + _("Bcc") + ":</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_BCC + "\" value=\"" + bcc + "\"></td></tr>\n" +
    17631763                                "<tr><td align=\"right\">" + _("Bcc to self") + ": </td><td align=\"left\"><input type=\"checkbox\" class=\"optbox\" name=\"" + NEW_BCC_TO_SELF + "\" value=\"1\" " + (sessionObject.bccToSelf ? "checked" : "" ) + "></td></tr>\n" +
    1764                                 "<tr><td align=\"right\">" + _("Subject:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_SUBJECT + "\" value=\"" + subject + "\"></td></tr>\n" +
     1764                                "<tr><td align=\"right\">" + _("Subject") + ":</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_SUBJECT + "\" value=\"" + subject + "\"></td></tr>\n" +
    17651765                                "<tr><td colspan=\"2\" align=\"center\"><textarea cols=\"" + Config.getProperty( CONFIG_COMPOSER_COLS, 80 )+ "\" rows=\"" + Config.getProperty( CONFIG_COMPOSER_ROWS, 10 )+ "\" name=\"" + NEW_TEXT + "\">" + text + "</textarea>" +
    17661766                                "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
    1767                                 "<tr><td align=\"right\">" + _("Add Attachment:") + "</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"></td></tr>" +
     1767                                "<tr><td align=\"right\">" + _("Add Attachment") + ":</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"></td></tr>" +
    17681768                                // TODO disable/hide in JS if no file selected
    17691769                                "<tr><td>&nbsp;</td><td align=\"left\">" + button(NEW_UPLOAD, _("Add another attachment")) + "</td></tr>");
     
    17731773                        for( Attachment attachment : sessionObject.attachments ) {
    17741774                                if( !wroteHeader ) {
    1775                                         out.println("<tr><td align=\"right\">" + _("Attachments:") + "</td>");
     1775                                        out.println("<tr><td align=\"right\">" + _("Attachments") + ":</td>");
    17761776                                        wroteHeader = true;
    17771777                                } else {
     
    18591859                out.println("<table id=\"mailbox\" cellspacing=\"0\" cellpadding=\"5\">\n" +
    18601860                        "<tr><td colspan=\"8\"><hr></td></tr>\n<tr>" +
    1861                         thSpacer + "<th>" + sortHeader( SORT_SENDER, _("Sender"), sessionObject.imgPath ) + "</th>" +
     1861                        thSpacer + "<th>" + sortHeader( SORT_SENDER, _("From"), sessionObject.imgPath ) + "</th>" +
    18621862                        thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _("Subject"), sessionObject.imgPath ) + "</th>" +
    18631863                        thSpacer + "<th>" + sortHeader( SORT_DATE, _("Date"), sessionObject.imgPath ) +
     
    18941894                                        // don't let date get split across lines
    18951895                                        mail.localFormattedDate.replace(" ", "&nbsp;") + "</td><td>&nbsp;</td><td align=\"right\">" +
    1896                                         DataHelper.formatSize2(mail.size) + "B</td></tr>" );
     1896                                        DataHelper.formatSize2(mail.getSize()) + "B</td></tr>" );
    18971897                        bg = 1 - bg;
    18981898                        i++;
     
    19081908                                "<br>");
    19091909                        out.println(
    1910                                 _("Page Size:") + "&nbsp;<input type=\"text\" style=\"text-align: right;\" name=\"" + PAGESIZE + "\" size=\"4\" value=\"" +  sessionObject.folder.getPageSize() + "\">" +
     1910                                _("Page Size") + ":&nbsp;<input type=\"text\" style=\"text-align: right;\" name=\"" + PAGESIZE + "\" size=\"4\" value=\"" +  sessionObject.folder.getPageSize() + "\">" +
    19111911                                button( SETPAGESIZE, _("Set") ) );
    19121912                }
     
    19451945                        out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
    19461946                                        "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
    1947                                         "<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("From:") +
    1948                                         "</td><td align=\"left\">" + quoteHTML( mail.sender ) + "</td></tr>\n" +
    1949                                         "<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("Subject:") +
    1950                                         "</td><td align=\"left\">" + quoteHTML( mail.formattedSubject ) + "</td></tr>\n" +
    1951                                         "<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("Date:") +
    1952                                         "</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" +
     1947                                        "<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("From") +
     1948                                        ":</td><td align=\"left\">" + quoteHTML( mail.sender ) + "</td></tr>\n" +
     1949                                        "<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("Subject") +
     1950                                        ":</td><td align=\"left\">" + quoteHTML( mail.formattedSubject ) + "</td></tr>\n" +
     1951                                        "<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("Date") +
     1952                                        ":</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" +
    19531953                                        "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>" );
    19541954                        if( mail.hasPart()) {
  • apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java

    r7bf3ea5 rb43ebd2  
    5353
    5454        private boolean connected;
     55        private boolean gotCAPA;
    5556        private boolean supportsPipelining;
    5657        private boolean supportsTOP;
     
    279280                        if (srs.isEmpty())
    280281                                return;
     282                        // TODO don't quit now, just set timer to quit later
    281283                        SendRecv sr = new SendRecv("QUIT", Mode.A1);
    282284                        srs.add(sr);
     
    491493                Debug.debug(Debug.DEBUG, "connect()");
    492494                if (Debug.getLevel() == Debug.DEBUG)
    493                         (new Exception()).printStackTrace();
     495                        (new Exception("I did it")).printStackTrace();
    494496
    495497                clear();
     
    566568         */
    567569        private boolean doHandshake() throws IOException {
    568                 // can we always pipeline this ?
    569                 supportsPipelining = false;
    570                 supportsUIDL = false;
    571                 supportsTOP = false;
    572570                List<SendRecv> cmds = new ArrayList<SendRecv>(2);
    573571                cmds.add(new SendRecv(null, Mode.A1));
    574                 SendRecv capa = new SendRecv("CAPA", Mode.LS);
    575                 cmds.add(capa);
     572                SendRecv capa = null;
     573                if (gotCAPA) {
     574                        Debug.debug(Debug.DEBUG, "Skipping CAPA");
     575                } else {
     576                        capa = new SendRecv("CAPA", Mode.LS);
     577                        cmds.add(capa);
     578                }
    576579                boolean rv = sendCmds(cmds);
    577                 if (rv) {
     580                if (rv && capa != null) {
    578581                        if (capa.ls != null) {
    579582                                for (String cap : capa.ls) {
     
    587590                                }
    588591                        }
    589                 }
    590                 Debug.debug(Debug.DEBUG, "POP3 server caps: pipelining? " + supportsPipelining +
     592                        gotCAPA = true;
     593                        Debug.debug(Debug.DEBUG, "POP3 server caps: pipelining? " + supportsPipelining +
    591594                                                           " UIDL? " + supportsUIDL +
    592595                                                           " TOP? " + supportsTOP);
     596                }
    593597                return rv;
    594598        }
  • history.txt

    r7bf3ea5 rb43ebd2  
     12014-04-22 zzz
     2 * SusiMail:
     3   - Add persistent cache
     4
     52014-04-21 zzz
     6 * SusiMail:
     7   - Pipeline all deletes and quit
     8   - Don't reconnect after delete and quit
     9   - Verify connected before each POP3 operation
     10   - Don't clear messages if a reconnection fails
     11   - Use locale-based sorting for strings
     12   - Increase limit for full fetch again
     13   - Increase default page size back again
     14
    1152014-04-21 dg
    216 * findbugs: mostly stream closure fixes in router, apps, core
  • router/java/src/net/i2p/router/RouterVersion.java

    r7bf3ea5 rb43ebd2  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 7;
     21    public final static long BUILD = 8;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.