Changeset d128bab for apps


Ignore:
Timestamp:
May 28, 2018 2:18:23 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
277a161
Parents:
550ef2a
Message:

SusiMail?: Send deletions after connect so emails don't come back after a move (ticket #2087)
Refactor/consolidate pop3 deletion code
Fix loading mails in checker
Fix checker thread name
Return to inbox, not drafts, after sending draft
CSS for select

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

Legend:

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

    r550ef2a rd128bab  
    894894                public void foundNewMail(boolean connected) {
    895895                        MailCache mc = null;
    896                         Folder<String> f = null;
    897896                        boolean found = false;
    898897                        Log log = _so.log;
     
    932931                                        _so.newMails = 0;
    933932                                        _so.connectError = null;
    934                                 } else if (mc != null && f != null) {
     933                                } else if (mc != null) {
    935934                                        String[] uidls = mc.getUIDLs();
    936935                                        int added = mc.getFolder().addElements(Arrays.asList(uidls));
     
    941940                                        if (log.shouldDebug()) log.debug("Added " + added + " new emails");
    942941                                } else {
    943                                         if (log.shouldDebug()) log.debug("MailCache/folder vanished?");
     942                                        if (log.shouldDebug()) log.debug("MailCache vanished?");
    944943                                }
    945944                                _mb.setNewMailListener(_so);
     
    20932092                                                if (str == null)
    20942093                                                        str = request.getParameter(CURRENT_FOLDER);
    2095                                                 if (str != null && !str.equals(DIR_FOLDER))
     2094                                                // always go to inbox after SEND
     2095                                                if (str != null && !str.equals(DIR_FOLDER) && !buttonPressed(request, SEND))
    20962096                                                        q += '&' + CURRENT_FOLDER + '=' + str;
    20972097                                                sendRedirect(httpRequest, response, q);
     
    27912791                                                              recipients.toArray(new String[recipients.size()]),
    27922792                                                              body, attachments, boundary);
    2793                                 Thread t = new I2PAppThread(es, "Email fetcher");
     2793                                Thread t = new I2PAppThread(es, "Email sender");
    27942794                                sessionObject.info += _t("Sending mail.") + '\n';
    27952795                                t.start();
     
    32453245                out.println(button(SWITCH_TO, _t("Change to Folder") + ':'));
    32463246                showFolderSelect(out, folderName, false);
     3247                out.println("</td><td>");
    32473248                if (pages > 1) {
    32483249                        if (outputHidden)
  • apps/susimail/src/src/i2p/susi/webmail/pop3/DelayedDeleter.java

    r550ef2a rd128bab  
    9393                public void run() {
    9494                        try {
    95                                 List<String> uidls = new ArrayList<String>(toDelete);
    96                                 Collection<String> deleted = mailbox.delete(uidls);
    97                                 if (_log.shouldDebug()) _log.debug("Deleted " + deleted.size() + " of " + toDelete.size() + " mails");
    98                                 toDelete.removeAll(deleted);
     95                                int origSize = toDelete.size();
     96                                mailbox.deletePending(false);
     97                                int delSize = origSize - toDelete.size();
     98                                if (_log.shouldDebug()) _log.debug("Deleted " + delSize + " of " + origSize + " mails");
    9999                        } finally {             
    100100                                isDeleting = false;
  • apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java

    r550ef2a rd128bab  
    316316
    317317        /**
    318          * Delete all at once and close. Does not reconnect.
    319          * Do NOT call performDelete() after this.
    320          * Returns all UIDLs successfully deleted OR were not known by the server.
    321          *
     318         * Delete all pending deletions at once.
     319         * If previously connected, leaves connected.
     320         * If not previously connected, closes connection when done.
     321         *
     322         * @param noWait fire-and-forget mode, only if connected
    322323         * @since 0.9.13
    323324         */
    324         Collection<String> delete(Collection<String> uidls) {
    325                 List<String> rv = new ArrayList<String>(uidls.size());
    326                 List<SendRecv> srs = new ArrayList<SendRecv>(uidls.size() + 1);
     325        void deletePending(boolean noWait) {
     326                Collection<String> uidls = delayedDeleter.getQueued();
     327                if (uidls.isEmpty())
     328                        return;
    327329                synchronized( synchronizer ) {
    328330                        try {
    329                                 // we must be connected to know the UIDL to ID mapping
    330                                 checkConnection();
    331                         } catch (IOException ioe) {
    332                                 if (_log.shouldDebug()) _log.debug("Error deleting", ioe);
    333                                 return rv;
    334                         }
    335                         for (String uidl : uidls) {
    336                                 int id = getIDfromUIDL(uidl);
    337                                 if (id < 0) {
    338                                         // presumed already deleted
    339                                         rv.add(uidl);
    340                                         continue;
    341                                 }
    342                                 SendRecv sr = new SendRecv("DELE " + id, Mode.A1);
    343                                 sr.savedObject = uidl;
    344                                 srs.add(sr);
    345                         }
    346                         if (srs.isEmpty())
    347                                 return rv;
    348                         // TODO don't quit now, just set timer to quit later
    349                         SendRecv quit = new SendRecv("QUIT", Mode.A1);
    350                         srs.add(quit);
    351                         try {
    352                                 sendCmds(srs);
    353                                 // do NOT call close() here, we included QUIT above
    354                                 if (socket != null) {
    355                                         try { socket.close(); } catch (IOException e) {}
    356                                         socket = null;
    357                                         connected = false;
    358                                 }
    359                                 clear();
    360                                 // result of QUIT
    361                                 boolean success = srs.get(srs.size() - 1).result;
    362                                 if (success) {
    363                                         for (int i = 0; i < srs.size() - 1; i++) {
    364                                                 SendRecv sr = srs.get(i);
    365                                                 // ignore sr.result, if it failed it's because
    366                                                 // it's already deleted
    367                                                 rv.add((String) sr.savedObject);
     331                                if (isConnected()) {
     332                                        doDelete(noWait);
     333                                } else {
     334                                        // calls connect() which calls doDelete()
     335                                        checkConnection();
     336                                        sendCmd1a("QUIT");
     337                                        if (socket != null) {
     338                                                try { socket.close(); } catch (IOException e) {}
     339                                                socket = null;
     340                                                connected = false;
    368341                                        }
    369342                                }
    370                                 // why reconnect?
    371                                 //connect();
    372343                        } catch (IOException ioe) {
    373344                                if (_log.shouldDebug()) _log.debug("Error deleting", ioe);
     
    377348                                        connected = false;
    378349                                }
    379                                 // todo maybe
    380                         }
    381                 }
    382                 return rv;
     350                        }
     351                }
    383352        }
    384353       
     
    842811
    843812        /**
    844          * Send STAT, UIDL, LIST. Must be connected.
     813         * Send STAT, UIDL, LIST, and DELE for all pending. Must be connected.
    845814         * Caller must sync.
    846815         * Leaves socket connected. Caller must close on IOE.
     
    875844                else
    876845                        if (_log.shouldDebug()) _log.debug("LIST failed");
     846
     847                // delete all pending deletions
     848                doDelete(false);
     849
    877850                if (socket != null) try { socket.setSoTimeout(300*1000); } catch (IOException ioe) {}
    878851                return ok;
    879852        }
     853
     854        /**
     855         * Send DELE for all pending deletions. Must be connected.
     856         * Caller must sync.
     857         * Leaves socket connected. Caller must close on IOE.
     858         *
     859         * @param noWait fire-and-forget mode
     860         * @throws IOException
     861         * @since 0.9.35 pulled out of delete()
     862         */
     863        private void doDelete(boolean noWait) throws IOException {
     864                // delete all pending deletions
     865                Collection<String> uidls = delayedDeleter.getQueued();
     866                if (uidls.isEmpty())
     867                        return;
     868                List<SendRecv> cmds = new ArrayList<SendRecv>(uidls.size());
     869                for (String uid : uidls) {
     870                        int id = getIDfromUIDL(uid);
     871                        if (id < 0) {
     872                                // presumed already deleted
     873                                delayedDeleter.removeQueued(uid);
     874                                continue;
     875                        }
     876                        if (noWait) {
     877                                sendCmd1aNoWait("DELE " + id);
     878                                delayedDeleter.removeQueued(uid);
     879                                uidlToID.remove(uid);
     880                                sizes.remove(Integer.valueOf(id));
     881                        } else {
     882                                SendRecv sr = new SendRecv("DELE " + id, Mode.A1);
     883                                sr.savedObject = uid;
     884                                cmds.add(sr);
     885                        }
     886                }
     887                if (!cmds.isEmpty()) {
     888                        // ignore rv
     889                        sendCmds(cmds);
     890                        // use isConnected() as a proxy for success
     891                        if (isConnected()) {
     892                                for (SendRecv sr : cmds) {
     893                                        // ignore sr.result, if it failed it's because
     894                                        // it's already deleted
     895                                        String uid = (String) sr.savedObject;
     896                                        delayedDeleter.removeQueued(uid);
     897                                        Integer id = uidlToID.remove(uid);
     898                                        if (id != null)
     899                                                sizes.remove(id);
     900                                }
     901                        }
     902                }
     903        }
    880904       
    881905        /**
     
    12921316                        if (socket != null && socket.isConnected()) {
    12931317                                try {
    1294                                         Collection<String> toDelete = delayedDeleter.getQueued();
    1295                                         Map<String, Integer> sendDelete = new HashMap<String, Integer>(toDelete.size());
    1296                                         for (String uidl : toDelete) {
    1297                                                 int id = getIDfromUIDL(uidl);
    1298                                                 if (id >= 0) {
    1299                                                         sendDelete.put(uidl, Integer.valueOf(id));
    1300                                                 }
    1301                                         }
     1318                                        deletePending(!shouldWait);
    13021319                                        if (shouldWait) {
    1303                                                 if (!sendDelete.isEmpty()) {
    1304                                                         // Verify deleted, remove from the delete queue
    1305                                                         // this does the quit and close
    1306                                                         Collection<String> deleted = delete(sendDelete.keySet());
    1307                                                         for (String uidl : deleted) {
    1308                                                                 delayedDeleter.removeQueued(uidl);
    1309                                                         }
    1310                                                 } else {
    1311                                                         sendCmd1a("QUIT");
    1312                                                 }
     1320                                                sendCmd1a("QUIT");
    13131321                                                if (_log.shouldDebug()) _log.debug("close() with wait complete");
    13141322                                        } else {
    1315                                                 if (!sendDelete.isEmpty()) {
    1316                                                         // spray and pray the deletions, don't remove from delete queue
    1317                                                         for (Integer id : sendDelete.values()) {
    1318                                                                 sendCmd1aNoWait("DELE " + id);
    1319                                                         }
    1320                                                 }
    13211323                                                sendCmd1aNoWait("QUIT");
    13221324                                        }
Note: See TracChangeset for help on using the changeset viewer.