Changeset 31719d3


Ignore:
Timestamp:
Feb 9, 2018 10:53:25 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
f13f4fc
Parents:
afad22a8
Message:

SusiMail?: Improve speed of subject sorter
Use ID instead of hashcode for mailparts, so attachments are bookmarkable
Recognize fw:

Location:
apps/susimail/src/src/i2p/susi/webmail
Files:
3 edited

Legend:

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

    rafad22a8 r31719d3  
    4646import java.util.Locale;
    4747import java.util.TimeZone;
     48import java.util.concurrent.atomic.AtomicInteger;
    4849import java.util.regex.Pattern;
    4950
     
    180181                        if (headerLines == null)
    181182                                headerLines = new String[0];
    182                         part = new MailPart(uidl, rb, in, in, headerLines);
     183                        part = new MailPart(uidl, new AtomicInteger(), rb, in, in, headerLines);
    183184                        rb.readComplete(true);
    184185                        // may only be available after reading and calling readComplete()
  • apps/susimail/src/src/i2p/susi/webmail/MailPart.java

    rafad22a8 r31719d3  
    4545import java.util.List;
    4646import java.util.Locale;
     47import java.util.concurrent.atomic.AtomicInteger;
    4748
    4849import net.i2p.data.DataHelper;
     
    8081         */
    8182        public final String uidl;
     83        private final int intID;
    8284       
    8385        /**
     
    8991         *         were already parsed in Mail. Null otherwise
    9092         */
    91         public MailPart(String uidl, Buffer readBuffer, InputStream in, ReadCounter counter, String[] hdrlines) throws IOException
     93        public MailPart(String uidl, AtomicInteger id, Buffer readBuffer, InputStream in, ReadCounter counter, String[] hdrlines) throws IOException
    9294        {
    9395                this.uidl = uidl;
     96                intID = id.getAndIncrement();
    9497                buffer = readBuffer;
    9598               
     
    220223                                        eofin = new EOFOnMatchInputStream(in, counter, match);
    221224                                }
    222                                 MailPart newPart = new MailPart(uidl, buffer, eofin, eofin, null);
     225                                MailPart newPart = new MailPart(uidl, id, buffer, eofin, eofin, null);
    223226                                parts.add( newPart );
    224227                                tmpEnd = (int) eofin.getRead();
     
    234237                }
    235238                else if( message ) {
    236                         MailPart newPart = new MailPart(uidl, buffer, in, counter, null);
     239                        MailPart newPart = new MailPart(uidl, id, buffer, in, counter, null);
    237240                        // TODO newPart doesn't save message headers we might like to display,
    238241                        // like From, To, and Subject
     
    251254                //      Debug.debug(Debug.DEBUG, "New " + this);
    252255        }
     256
     257        /**
     258         *  A value unique across all the parts of this Mail,
     259         *  and constant across restarts, so it may be part of a bookmark.
     260         *
     261         *  @since 0.9.34
     262         */
     263        public int getID() { return intID; }
     264
    253265
    254266        /**
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    rafad22a8 r31719d3  
    133133         */
    134134        private static final String SUSI_NONCE = "susiNonce";
    135         private static final String B64UIDL = "b64uidl";
    136         private static final String PREV_B64UIDL = "prevb64uidl";
    137         private static final String NEXT_B64UIDL = "nextb64uidl";
     135        private static final String B64UIDL = "msg";
     136        private static final String PREV_B64UIDL = "prevmsg";
     137        private static final String NEXT_B64UIDL = "nextmsg";
    138138        private static final String PREV_PAGE_NUM = "prevpagenum";
    139139        private static final String NEXT_PAGE_NUM = "nextpagenum";
     
    350350         */
    351351        private static class SubjectSorter extends SorterBase {
     352                private static final String xre = _t("Re:").toLowerCase(Locale.US);
     353                private static final String xfwd = _t("Fwd:").toLowerCase(Locale.US);
    352354                private final Comparator<Object> collator = Collator.getInstance();
    353355
     
    360362                        String as = a.subject;
    361363                        String bs = b.subject;
    362                         if (as.toLowerCase().startsWith("re:")) {
     364                        String aslc = as.toLowerCase(Locale.US);
     365                        String bslc = bs.toLowerCase(Locale.US);
     366                        if (aslc.startsWith("re:") || aslc.startsWith("fw:")) {
    363367                                as = as.substring(3).trim();
    364                         } else if (as.toLowerCase().startsWith("fwd:")) {
     368                        } else if (aslc.startsWith("fwd:")) {
    365369                                as = as.substring(4).trim();
    366370                        } else {
    367                                 String xre = _t("Re:").toLowerCase();
    368                                 if (as.toLowerCase().startsWith(xre)) {
     371                                if (aslc.startsWith(xre)) {
    369372                                        as = as.substring(xre.length()).trim();
    370373                                } else {
    371                                         String xfwd = _t("Fwd:").toLowerCase();
    372                                         if (as.toLowerCase().startsWith(xfwd))
     374                                        if (aslc.startsWith(xfwd))
    373375                                                as = as.substring(xfwd.length()).trim();
    374376                                }
    375377                        }
    376                         if (bs.toLowerCase().startsWith("re:")) {
     378                        if (bslc.startsWith("re:") || bslc.startsWith("fw:")) {
    377379                                bs = bs.substring(3).trim();
    378                         } else if (bs.toLowerCase().startsWith("fwd:")) {
     380                        } else if (bslc.startsWith("fwd:")) {
    379381                                bs = bs.substring(4).trim();
    380382                        } else {
    381                                 String xre = _t("Re:").toLowerCase();
    382                                 if (bs.toLowerCase().startsWith(xre)) {
     383                                if (bslc.startsWith(xre)) {
    383384                                        bs = bs.substring(xre.length()).trim();
    384385                                } else {
    385                                         String xfwd = _t("Fwd:").toLowerCase();
    386                                         if (bs.toLowerCase().startsWith(xfwd))
     386                                        if (bslc.startsWith(xfwd))
    387387                                                bs = bs.substring(xfwd.length()).trim();
    388388                                }
     
    619619                if( html ) {
    620620                        out.println( "<!-- " );
    621                         out.println( "Debug: Showing Mail Part at level " + level + " with hash code " + mailPart.hashCode());
     621                        out.println( "Debug: Showing Mail Part at level " + level + " with ID " + mailPart.getID());
    622622                        out.println( "Debug: Mail Part headers follow");
    623623                        for( int i = 0; i < mailPart.headerLines.length; i++ ) {
     
    643643                                                                continue;
    644644                                                        out.println( "<!-- " );
    645                                                         out.println( "Debug: Not showing alternative Mail Part at level " + (level + 1) + " with hash code " + subPart.hashCode());
     645                                                        out.println( "Debug: Not showing alternative Mail Part at level " + (level + 1) + " with ID " + subPart.getID());
    646646                                                        out.println( "Debug: Mail Part headers follow");
    647647                                                        for( int i = 0; i < subPart.headerLines.length; i++ ) {
     
    752752                                                name = quoteHTML(name);
    753753                                                out.println("<img src=\"" + myself + '?' + RAW_ATTACHMENT + '=' +
    754                                                          mailPart.hashCode() +
     754                                                         mailPart.getID() +
    755755                                                         "&amp;" + B64UIDL + '=' + Base64.encode(mailPart.uidl) +
    756756                                                         "\" alt=\"" + name + "\">");
     
    766766                                                type.equals("application/x-tar") || type.equals("application/x-bzip2") ||
    767767                                                type.equals("application/pdf") || type.equals("application/x-bittorrent") ||
     768                                                type.equals("application/pgp-encrypted") ||
    768769                                                type.equals("application/pgp-signature"))) {
    769770                                                out.println( "<a href=\"" + myself + '?' + RAW_ATTACHMENT + '=' +
    770                                                          mailPart.hashCode() +
     771                                                         mailPart.getID() +
    771772                                                         "&amp;" + B64UIDL + '=' + Base64.encode(mailPart.uidl) + "\">" +
    772773                                                         _t("Download attachment {0}", ident) + "</a>");
    773774                                        } else {
    774775                                                out.println( "<a target=\"_blank\" href=\"" + myself + '?' + DOWNLOAD + '=' +
    775                                                          mailPart.hashCode() +
     776                                                         mailPart.getID() +
    776777                                                         "&amp;" + B64UIDL + '=' + Base64.encode(mailPart.uidl) + "\">" +
    777778                                                         _t("Download attachment {0}", ident) + "</a>" +
     
    789790                if( html ) {
    790791                        out.println( "<!-- " );
    791                         out.println( "Debug: End of Mail Part at level " + level + " with hash code " + mailPart.hashCode());
     792                        out.println( "Debug: End of Mail Part at level " + level + " with ID " + mailPart.getID());
    792793                        out.println( "-->" );
    793794                }
     
    11681169                                                              sessionObject.subject.startsWith("fwd:") ||
    11691170                                                              sessionObject.subject.startsWith("FWD:") ||
     1171                                                              sessionObject.subject.startsWith("Fw:") ||
     1172                                                              sessionObject.subject.startsWith("fw:") ||
     1173                                                              sessionObject.subject.startsWith("FW:") ||
    11701174                                                              sessionObject.subject.startsWith(_t("Fwd:")))) {
    11711175                                                                sessionObject.subject = _t("Fwd:") + ' ' + sessionObject.subject;
     
    14381442                if( str != null ) {
    14391443                        try {
    1440                                 int hashCode = Integer.parseInt( str );
     1444                                int id = Integer.parseInt( str );
    14411445                                Mail mail = sessionObject.mailCache.getMail(showUIDL, MailCache.FetchMode.ALL);
    1442                                 MailPart part = mail != null ? getMailPartFromHashCode( mail.getPart(), hashCode ) : null;
     1446                                MailPart part = mail != null ? getMailPartFromID(mail.getPart(), id) : null;
    14431447                                if( part != null ) {
    14441448                                        if (sendAttachment(sessionObject, part, response, isRaw))
     
    14851489        /**
    14861490         * Recursive.
    1487          * FIXME can't be bookmarked.
    1488          * @param hashCode
     1491         * @param id as retrieved from getID()
    14891492         * @return the part or null
    14901493         */
    1491         private static MailPart getMailPartFromHashCode( MailPart part, int hashCode )
     1494        private static MailPart getMailPartFromID(MailPart part, int id)
    14921495        {
    14931496                if( part == null )
    14941497                        return null;
    14951498               
    1496                 if( part.hashCode() == hashCode )
     1499                if (part.getID() == id)
    14971500                        return part;
    14981501               
    14991502                if( part.multipart || part.message ) {
    15001503                        for( MailPart p : part.parts ) {
    1501                                 MailPart subPart = getMailPartFromHashCode( p, hashCode );
     1504                                MailPart subPart = getMailPartFromID(p, id);
    15021505                                if( subPart != null )
    15031506                                        return subPart;
     
    21332136                                        name = part.description;
    21342137                                        if (name == null)
    2135                                                 name = "part" + part.hashCode();
     2138                                                name = "part" + part.getID();
    21362139                                }
    21372140                        }
     
    26802683                }
    26812684                Mail mail = sessionObject.mailCache.getMail(showUIDL, MailCache.FetchMode.ALL);
    2682                 if(!RELEASE && mail != null && mail.hasBody() && mail.getBody().getLength() < 4096) {
     2685                if(!RELEASE && mail != null && mail.hasBody() && mail.getBody().getLength() < 16384) {
    26832686                        out.println( "<!--" );
    26842687                        out.println( "Debug: Mail header and body follow");
Note: See TracChangeset for help on using the changeset viewer.