Changeset 1e4b433


Ignore:
Timestamp:
Apr 23, 2014 10:46:57 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
775047f
Parents:
b365817
Message:
  • SusiMail?:
    • Fix fetching of new mail
    • More Folder cleanup
    • Prep for not leaving on server
    • Prep for background checker
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/util/Folder.java

    rb365817 r1e4b433  
    6060
    6161        private int pages, pageSize, currentPage;
    62         private O[] unsortedElements, elements;
     62        private O[] elements;
    6363        private final Hashtable<String, Comparator<O>> sorter;
    6464        private SortOrder sortingDirection;
     
    7575        /**
    7676         * Returns the current page.
     77         * Starts at 1, even if empty.
    7778         *
    7879         * @return Returns the current page.
     
    8485        /**
    8586         * Sets the current page to the given parameter.
     87         * Starts at 1.
    8688         *
    8789         * @param currentPage The current page to set.
     
    103105        /**
    104106         * Returns the number of pages in the folder.
     107         * Minimum of 1 even if empty.
    105108         * @return Returns the number of pages.
    106109         */
     
    130133        }
    131134
    132         /**
    133          * Creates a copy of an array by copying its elements.
    134          *
    135          * @param source Array to copy.
    136          * @return Copy of source.
    137          */
    138         @SuppressWarnings("unchecked")
    139         private O[] copyArray( O[] source )
    140         {
    141                 Object[] destination = new Object[source.length];
    142                 for( int i = 0; i < source.length; i++ )
    143                         destination[i] = source[i];
    144                 return (O[])destination;
    145         }
    146135        /**
    147136         * Recalculates variables.
     
    167156        private void sort()
    168157        {
    169                 if( currentSorter != null ) {
    170                         elements = copyArray( unsortedElements );
     158                if( currentSorter != null )
    171159                        Arrays.sort( elements, currentSorter );
    172                 }
    173                 else {
    174                         elements = unsortedElements;
    175                 }
    176160        }
    177161       
    178162        /**
    179163         * Set the array of objects the folder should manage.
     164         * Does NOT copy the array.
    180165         *
    181166         * @param elements Array of Os.
     
    184169        {
    185170                if (elements.length > 0) {
    186                         this.unsortedElements = elements;
     171                        this.elements = elements;
    187172                        if( currentSorter != null )
    188173                                sort();
    189                         else
    190                                 this.elements = elements;
    191                 } else
     174                } else {
    192175                        this.elements = null;
     176                }
    193177                update();
    194178        }
     
    199183         * @param element to remove
    200184         */
    201         public synchronized void removeElement(O element) {
     185        public void removeElement(O element) {
    202186                removeElements(Collections.singleton(element));
    203187        }
     
    212196                if (elements != null) {
    213197                        List<O> list = new ArrayList<O>(Arrays.asList(elements));
     198                        boolean shouldUpdate = false;
    214199                        for (O e : elems) {
    215                                 list.remove(e);
     200                                if (list.remove(e))
     201                                        shouldUpdate = true;
    216202                        }
    217                         elements = (O[]) list.toArray(new Object[list.size()]);
    218                 }
    219                 if (unsortedElements != null) {
    220                         List<O> list = new ArrayList<O>(Arrays.asList(unsortedElements));
     203                        if (shouldUpdate) {
     204                                elements = (O[]) list.toArray(new Object[list.size()]);
     205                                update();  // will still be sorted
     206                        }
     207                }
     208        }
     209
     210        /**
     211         * Add an element only if it does not already exist
     212         *
     213         * @param element to add
     214         */
     215        public void addElement(O element) {
     216                addElements(Collections.singleton(element));
     217        }
     218       
     219        /**
     220         * Add elements only if it they do not already exist
     221         *
     222         * @param elems to adde
     223         */
     224        @SuppressWarnings("unchecked")
     225        public synchronized void addElements(Collection<O> elems) {
     226                if (elements != null) {
     227                        List<O> list = new ArrayList<O>(Arrays.asList(elements));
     228                        boolean shouldUpdate = false;
    221229                        for (O e : elems) {
    222                                 list.remove(e);
     230                                if (!list.contains(e)) {
     231                                        list.add(e);
     232                                        shouldUpdate = true;
     233                                }
    223234                        }
    224                         unsortedElements = (O[]) list.toArray(new Object[list.size()]);
    225                 }
    226                 update();
     235                        if (shouldUpdate) {
     236                                elements = (O[]) list.toArray(new Object[list.size()]);
     237                                sort();
     238                                update();
     239                        }
     240                }
    227241        }
    228242       
  • apps/susimail/src/src/i2p/susi/webmail/MailCache.java

    rb365817 r1e4b433  
    2525
    2626import i2p.susi.debug.Debug;
     27import i2p.susi.util.Config;
    2728import i2p.susi.util.ReadBuffer;
    2829import i2p.susi.webmail.pop3.POP3MailBox;
     
    137138                }
    138139                if (disk != null) {
    139                         if (disk.saveMail(mail) && mail.hasBody()) {
    140                                 // TODO delete on server
     140                        if (disk.saveMail(mail) && mail.hasBody() &&
     141                                false && // TO ENABLE
     142                            !Boolean.parseBoolean(Config.getProperty(WebMail.CONFIG_LEAVE_ON_SERVER))) {
     143                                mailbox.queueForDeletion(mail.uidl);
    141144                        }
    142145                }
     
    147150         * Fetch any needed data from pop3 server.
    148151         * Mail objects are inserted into the requests.
    149          *
    150          * @since 0.9.13
    151          */
    152         public void getMail(Collection<MailRequest> requests) {
     152         * After this, call getUIDLs() to get all known mail UIDLs.
     153         * MUST already be connected, otherwise returns false.
     154         *
     155         * @return true if any were fetched
     156         * @since 0.9.13
     157         */
     158        public boolean getMail(boolean hOnly) {
    153159               
     160                Collection<String> popKnown = mailbox.getUIDLs();
     161                if (popKnown == null)
     162                        return false;
    154163                List<POP3Request> fetches = new ArrayList<POP3Request>();
    155164                //  Fill in the answers from the cache and make a list of
    156165                //  requests.to send off
    157                 for (MailRequest mr : requests) {
     166                for (String uidl : popKnown) {
    158167                        Mail mail = null, newMail = null;
    159                         String uidl = mr.getUIDL();
    160                         boolean headerOnly = mr.getHeaderOnly();
     168                        boolean headerOnly = hOnly;
    161169
    162170                        /*
     
    176184                        if (mail.markForDeletion)
    177185                                continue;
    178                         mr.setMail(mail);
    179186                        int sz = mail.getSize();
    180187                        if (sz > 0 && sz <= FETCH_ALL_SIZE)
     
    188195                                                }
    189196                                        }
    190                                         POP3Request pr = new POP3Request(mr, mail, true);
     197                                        POP3Request pr = new POP3Request(mail, true);
    191198                                        fetches.add(pr);
    192199                                }
     
    199206                                                }
    200207                                        }
    201                                         POP3Request pr = new POP3Request(mr, mail, false);
     208                                        POP3Request pr = new POP3Request(mail, false);
    202209                                        fetches.add(pr);
    203210                                }
     
    205212                }
    206213
     214                boolean rv = false;
    207215                if (!fetches.isEmpty()) {
    208216                        //  Send off the fetches
     
    221229                                                mail.setBody(rb);
    222230                                        }
     231                                        rv = true;
    223232                                        if (disk != null) {
    224                                                 if (disk.saveMail(mail) && mail.hasBody()) {
    225                                                         // TODO delete on server
     233                                                if (disk.saveMail(mail) && mail.hasBody() &&
     234                                                        false && // TO ENABLE
     235                                                    !Boolean.parseBoolean(Config.getProperty(WebMail.CONFIG_LEAVE_ON_SERVER))) {
     236                                                        mailbox.queueForDeletion(mail.uidl);
    226237                                                }
    227238                                        }
     
    229240                        }
    230241                }
     242                return rv;
    231243        }
    232244
     
    266278
    267279        /**
    268          *  Incoming to us
    269          */
    270         public interface MailRequest {
    271                 public String getUIDL();
    272                 public boolean getHeaderOnly();
    273                 public void setMail(Mail mail);
    274         }
    275 
    276         /**
    277280         *  Outgoing to POP3
    278281         */
    279282        private static class POP3Request implements FetchRequest {
    280                 public final MailRequest request;
    281283                public final Mail mail;
    282284                private final boolean headerOnly;
    283285                public ReadBuffer buf;
    284286
    285                 public POP3Request(MailRequest req, Mail m, boolean hOnly) {
    286                         request = req;
     287                public POP3Request(Mail m, boolean hOnly) {
    287288                        mail = m;
    288289                        headerOnly = hOnly;
     
    290291
    291292                public String getUIDL() {
    292                         return request.getUIDL();
     293                        return mail.uidl;
    293294                }
    294295
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    rb365817 r1e4b433  
    175175
    176176        private static final String CONFIG_BCC_TO_SELF = "composer.bcc.to.self";
    177         private static final String CONFIG_LEAVE_ON_SERVER = "pop3.leave.on.server";
     177        static final String CONFIG_LEAVE_ON_SERVER = "pop3.leave.on.server";
    178178        private static final String CONFIG_DEBUG = "debug";
    179179
     
    677677                                                sessionObject.mailCache = mc;
    678678                                                sessionObject.folder = new Folder<String>();
     679                                                if (!offline) {
     680                                                        // prime the cache, request all headers at once
     681                                                        // otherwise they are pulled one at a time by sortBy() below
     682                                                        mc.getMail(true);
     683                                                }
    679684                                                // get through cache so we have the disk-only ones too
    680685                                                String[] uidls = mc.getUIDLs();
    681686                                                sessionObject.folder.setElements(uidls);
    682                                                 if (uidls.length > 0 && !offline) {
    683                                                         // prime the cache, request all headers at once
    684                                                         // otherwise they are pulled one at a time by sortBy() below
    685                                                         List<MailCache.MailRequest> reqs = new ArrayList<MailCache.MailRequest>(uidls.length);
    686                                                         for (int i = 0; i < uidls.length; i++) {
    687                                                                 reqs.add(new CacheRequest(uidls[i]));
    688                                                         }
    689                                                         mc.getMail(reqs);
    690                                                 }
    691687                                               
    692688                                                //sessionObject.folder.addSorter( SORT_ID, new IDSorter( sessionObject.mailCache ) );
     
    712708                                }
    713709                        }
    714                 }
    715         }
    716 
    717         /**
    718          *  Outgoing to MailCache
    719          *  @since 0.9.13
    720          */
    721         private static class CacheRequest implements MailCache.MailRequest {
    722                 private final String uidl;
    723 
    724                 public CacheRequest(String uidl) {
    725                         this.uidl = uidl;
    726                 }
    727 
    728                 public String getUIDL() {
    729                         return uidl;
    730                 }
    731 
    732                 public boolean getHeaderOnly() {
    733                         return true;
    734                 }
    735 
    736                 public void setMail(Mail mail) {
    737                         // do nothing, this just pumps up the cache
    738710                }
    739711        }
     
    10371009                if( buttonPressed( request, REFRESH ) ) {
    10381010                        sessionObject.mailbox.refresh();
     1011                        sessionObject.mailCache.getMail(true);
    10391012                        // get through cache so we have the disk-only ones too
    10401013                        String[] uidls = sessionObject.mailCache.getUIDLs();
     
    14621435                                // get through cache so we have the disk-only ones too
    14631436                                String[] uidls = sessionObject.mailCache.getUIDLs();
    1464                                 if (uidls != null)
     1437                                if (uidls != null) {
     1438                                        // TODO why every time?
    14651439                                        sessionObject.folder.setElements(uidls);
     1440                                }
    14661441                        }
    14671442
     
    18531828                        "<tr><td colspan=\"2\">&nbsp;</td></tr>\n" +
    18541829                        "<tr><td></td><td align=\"left\">" + button( LOGIN, _("Login") ) + spacer +
    1855                           button(OFFLINE, _("View Mail Offline") ) + spacer +
     1830                          button(OFFLINE, _("Read Mail Offline") ) + spacer +
    18561831                         " <input class=\"cancel\" type=\"reset\" value=\"" + _("Reset") + "\"></td></tr>\n" +
    18571832                        "<tr><td colspan=\"2\">&nbsp;</td></tr>\n" +
  • apps/susimail/src/src/i2p/susi/webmail/pop3/DelayedDeleter.java

    rb365817 r1e4b433  
    7272                                        t.start();
    7373                                } else {
    74                                         Debug.debug(Debug.DEBUG, "Nothing to delete");
     74                                        Debug.debug(Debug.DEBUG, "Not deleting, only idle " + idle);
    7575                                }
     76                        } else {
     77                                Debug.debug(Debug.DEBUG, "Nothing to delete");
    7678                        }
    7779                        schedule(CHECK_TIME);
  • apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java

    rb365817 r1e4b433  
    6767        private Socket socket;
    6868        private final AtomicLong lastActive;
     69        private final AtomicLong lastChecked;
    6970
    7071        private final Object synchronizer;
     
    9394                lastLine = _("No response from server");
    9495                lastActive = new AtomicLong(System.currentTimeMillis());
     96                lastChecked = new AtomicLong();
    9597                delayedDeleter = new DelayedDeleter(this);
    9698        }
     
    271273        public void queueForDeletion(Collection<String> uidls) {
    272274                for (String uidl : uidls) {
    273                         delayedDeleter.queueDelete(uidl);
    274                 }
     275                        queueForDeletion(uidl);
     276                }
     277        }
     278
     279        /**
     280         * Queue for later deletion. Non-blocking.
     281         *
     282         * @since 0.9.13
     283         */
     284        public void queueForDeletion(String uidl) {
     285                Debug.debug(Debug.DEBUG, "Queueing for deletion: " + uidl);
     286                delayedDeleter.queueDelete(uidl);
    275287        }
    276288
     
    447459
    448460        /**
     461         * Timestamp. When we last successfully got the UIDL list.
     462         *
     463         * @since 0.9.13
     464         */
     465        long getLastChecked() {
     466                return lastChecked.get();
     467        }
     468
     469        /**
    449470         *
    450471         * @param response line starting with +OK
     
    490511                                        }
    491512                                }
     513                                lastChecked.set(System.currentTimeMillis());
    492514                        } else {
    493515                                Debug.debug(Debug.DEBUG, "Error getting UIDL list from server.");
     
    10861108         * @return A new array of the available UIDLs. No particular order.
    10871109         */
    1088         public String[] getUIDLs()
     1110        public Collection<String> getUIDLs()
    10891111        {
    10901112                if (!isConnected())
    10911113                        return null;
    10921114                synchronized( synchronizer ) {
    1093                        return uidlToID.keySet().toArray(new String[uidlToID.size()]);
     1115                       return new ArrayList(uidlToID.keySet());
    10941116                }
    10951117        }
  • history.txt

    rb365817 r1e4b433  
    33   - Queue deletions for a later thread
    44   - Synch all folder access
     5   - Fix fetching of new mail
    56
    672014-04-22 zzz
  • router/java/src/net/i2p/router/RouterVersion.java

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