Changeset 564


Ignore:
Timestamp:
12/28/09 17:27:58 (2 years ago)
Author:
octorian
Message:

Cache progress fixes

Location:
trunk
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailConnectionHandler.java

    r471 r564  
    657657                        } 
    658658                        else if(type == MailProgressHandler.TYPE_PROCESSING && max > 0){ 
    659                                 if(count > 0) { count = count / max; } 
     659                                if(count > 0) { count = (count * 100) / max; } 
    660660                                showStatus(messageStart + count + processingMessageEnd); 
    661661                        } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailConnectionHandler.java

    r562 r564  
    271271            } 
    272272 
    273             if(resultMessages != null && listener != null) { 
    274                 if(param == null) { 
    275                     listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages }); 
     273            if(listener != null) { 
     274                if(resultMessages != null) { 
     275                    if(param == null) { 
     276                        listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages }); 
     277                    } 
     278                    else { 
     279                        listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages, param }); 
     280                    } 
    276281                } 
    277                 else { 
    278                     listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages, param }); 
     282                 
     283                // If this is the last update of the sequence, make sure we notify 
     284                // the listener with a null array so it knows we are done. 
     285                if(folderMessage == null) { 
     286                    if(param == null) { 
     287                        listener.mailConnectionRequestComplete(type, new Object[] { folder, null }); 
     288                    } 
     289                    else { 
     290                        listener.mailConnectionRequestComplete(type, new Object[] { folder, null, param }); 
     291                    } 
    279292                } 
    280293            } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/imap/ImapClient.java

    r562 r564  
    624624                callback.folderMessageUpdate(result[i]); 
    625625            } 
     626            callback.folderMessageUpdate(null); 
    626627        } 
    627628        else { 
     
    644645                uids[i] = ((ImapMessageToken)messageTokens[i]).getImapMessageUid(); 
    645646        } 
     647         
    646648        imapProtocol.executeFetchEnvelopeUid(uids, new ImapFetchEnvelopeCallback(callback), progressHandler); 
    647649        } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/pop/PopClient.java

    r562 r564  
    3636import java.util.Hashtable; 
    3737 
     38import net.rim.device.api.util.Arrays; 
     39 
    3840import org.logicprobe.LogicMail.conf.AccountConfig; 
    3941import org.logicprobe.LogicMail.conf.ConnectionConfig; 
     
    389391                        indices[i] = ((PopMessageToken)messageTokens[i]).getMessageIndex(); 
    390392                } 
     393                Arrays.sort(indices, 0, indices.length); 
     394                 
     395                if(!globalConfig.getDispOrder()) { 
     396                    int[] reverseIndices = new int[indices.length]; 
     397                    for(int i=0; i<indices.length; i++) { 
     398                        reverseIndices[indices.length - i - 1] = indices[i]; 
     399                    } 
     400                    indices = reverseIndices; 
     401                } 
    391402                 
    392403                getFolderMessagesImpl(indices, false, callback, progressHandler); 
     
    398409        String uid; 
    399410        MessageEnvelope env; 
    400         int preCount; 
    401         int postCount = connection.getBytesReceived(); 
    402411        for(int i=0; i<indices.length; i++) { 
    403             preCount = postCount; 
    404412            if(!flagsOnly) { 
    405413                headerText = popProtocol.executeTop(indices[i], 0); 
     
    413421                    new PopMessageToken(indices[i], uid), 
    414422                    env, indices[i], uid.hashCode()); 
    415             postCount = connection.getBytesReceived(); 
    416             if(progressHandler != null) { progressHandler.mailProgress(MailProgressHandler.TYPE_NETWORK, (postCount - preCount), -1); } 
     423            if(progressHandler != null) { progressHandler.mailProgress(MailProgressHandler.TYPE_PROCESSING, i + 1, indices.length); } 
    417424 
    418425            callback.folderMessageUpdate(folderMessage); 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/AccountNode.java

    r562 r564  
    8181    private boolean shutdown = false; 
    8282    private DataStore accountDataStore; 
     83     
     84    /** Map of folders to message to fetch for them. */ 
     85    private Hashtable folderMessagesToFetch; 
     86     
    8387    private MailSenderListener mailSenderListener = new MailSenderListener() { 
    8488            public void messageSent(MessageSentEvent e) { 
     
    106110        this.rootMailbox = null; 
    107111        this.pathMailboxMap = new Hashtable(); 
     112        this.folderMessagesToFetch = new Hashtable(); 
    108113 
    109114        this.mailStore = mailStore; 
     
    578583                // be checked and additional actions requested accordingly. 
    579584                //TODO: Implement flags-only logic 
    580                 Vector messagesToFetch = null; 
    581585                    for (int i = 0; i < folderMessages.length; i++) { 
    582586                        MessageNode messageNode = 
     
    591595                        } 
    592596                        else { 
    593                                 if(messagesToFetch == null) { messagesToFetch = new Vector(); } 
    594                                 messagesToFetch.addElement(folderMessages[i].getMessageToken()); 
     597                            synchronized(folderMessagesToFetch) { 
     598                                Vector messagesToFetch = (Vector)folderMessagesToFetch.get(e.getFolder()); 
     599                                if(messagesToFetch == null) { 
     600                                    messagesToFetch = new Vector(); 
     601                                    folderMessagesToFetch.put(e.getFolder(), messagesToFetch); 
     602                                } 
     603                                messagesToFetch.addElement(folderMessages[i].getMessageToken()); 
     604                            } 
    595605                        } 
    596                     } 
    597                     if(messagesToFetch != null) { 
    598                         MessageToken[] fetchArray = new MessageToken[messagesToFetch.size()]; 
    599                         messagesToFetch.copyInto(fetchArray); 
    600                         mailStore.requestFolderMessagesSet(e.getFolder(), fetchArray); 
    601606                    } 
    602607            } 
     
    612617                    addedMessages.copyInto(addedMessagesArray); 
    613618                    mailboxNode.addMessages(addedMessagesArray); 
     619            } 
     620        } 
     621        else { 
     622            synchronized(folderMessagesToFetch) { 
     623                Vector messagesToFetch = (Vector)folderMessagesToFetch.remove(e.getFolder()); 
     624                if(messagesToFetch != null) { 
     625                    MessageToken[] fetchArray = new MessageToken[messagesToFetch.size()]; 
     626                    messagesToFetch.copyInto(fetchArray); 
     627                    mailStore.requestFolderMessagesSet(e.getFolder(), fetchArray); 
     628                } 
    614629            } 
    615630        } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/MailFileManager.java

    r549 r564  
    216216        } 
    217217         
     218    public void readMessageNodes(MailboxNode mailboxNode, MessageNodeCallback callback) throws IOException { 
     219        if(cacheUrl == null) { callback.messageNodeUpdated(null); } 
     220 
     221        FileConnection fileConnection = getMailboxFileConnection(mailboxNode); 
     222        String mailboxUrl = fileConnection.getURL(); 
     223        Enumeration e = fileConnection.list(MSG_FILTER, false); 
     224        while(e.hasMoreElements()) { 
     225            String fileUrl = mailboxUrl + e.nextElement(); 
     226            MessageNode messageNode = readMessageNode(fileUrl); 
     227            if(messageNode != null) { 
     228                callback.messageNodeUpdated(messageNode); 
     229            } 
     230        } 
     231        fileConnection.close(); 
     232        callback.messageNodeUpdated(null); 
     233    } 
     234         
    218235        public MessageNode readMessageNode(MailboxNode mailboxNode, MessageToken messageToken, boolean loadContent) throws IOException { 
    219236                if(cacheUrl == null) { return null; } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/MailboxNode.java

    r563 r564  
    7272        private boolean hasAppend; 
    7373         
     74        private Object fetchLock = new Object(); 
     75        private RefreshMessagesThread fetchThread; 
     76         
    7477        public final static int TYPE_NORMAL = 0; 
    7578        public final static int TYPE_INBOX  = 1; 
     
    701704    public void refreshMessages() { 
    702705        // Fetch messages stored in the cache 
    703         if(parentAccount.getAccountConfig() != null) { 
    704                 //TODO: Make this thread-safe and prevent redundant calls 
    705                 Thread fetchThread = new Thread() { 
    706                         public void run() { 
    707                                 try { 
    708                                         MessageNode[] messages = 
    709                                                 MailFileManager.getInstance().readMessageNodes(MailboxNode.this); 
    710                                         MailboxNode.this.addMessages(messages); 
    711                                 } catch (IOException e) { 
    712                                         EventLogger.logEvent(AppInfo.GUID, 
    713                                         ("Unable to read messages from cache\r\n" 
    714                                                 + e.getMessage()).getBytes(), 
    715                                         EventLogger.ERROR); 
    716                                 } 
    717                                  
    718                         // Request flags and tokens for recent messages from the mail store 
    719                         parentAccount.getMailStore().requestFolderMessagesRecent(folderTreeItem, true); 
    720                         } 
    721                 }; 
    722                 fetchThread.start(); 
    723         } 
    724         else { 
    725                 parentAccount.getMailStore().requestFolderMessagesRecent(this.folderTreeItem); 
    726         } 
     706        synchronized(fetchLock) { 
     707            if(parentAccount.getAccountConfig() != null) { 
     708                if(fetchThread == null || !fetchThread.isAlive()) { 
     709                    fetchThread = new RefreshMessagesThread(); 
     710                    fetchThread.run(); 
     711                } 
     712            } 
     713            else { 
     714                parentAccount.getMailStore().requestFolderMessagesRecent(this.folderTreeItem); 
     715            } 
     716        } 
     717    } 
     718     
     719    private class RefreshMessagesThread extends Thread implements MessageNodeCallback { 
     720 
     721        public RefreshMessagesThread() { 
     722             
     723        } 
     724         
     725        public void run() { 
     726            try { 
     727                MailFileManager.getInstance().readMessageNodes(MailboxNode.this, this); 
     728            } catch (IOException e) { 
     729                EventLogger.logEvent(AppInfo.GUID, 
     730                        ("Unable to read messages from cache\r\n" 
     731                                + e.getMessage()).getBytes(), 
     732                                EventLogger.ERROR); 
     733            } 
     734        } 
     735 
     736        public void messageNodeUpdated(MessageNode messageNode) { 
     737            if(messageNode != null) { 
     738                MailboxNode.this.addMessage(messageNode); 
     739            } 
     740            else { 
     741                // Request flags and tokens for recent messages from the mail store 
     742                parentAccount.getMailStore().requestFolderMessagesRecent(folderTreeItem, true); 
     743            } 
     744        }         
    727745    } 
    728746     
  • trunk/LogicMailTests/src/org/logicprobe/LogicMail/mail/NetworkMailStoreTest.java

    r562 r564  
    213213            assertNotNull(event); 
    214214            assertEquals("INBOX", event.getFolder().getName()); 
    215             assertNotNull(event.getMessages()); 
    216215             
    217             // Collect folder messages within the event 
    218216            FolderMessage[] messages = event.getMessages(); 
    219             for(int j=0; j<messages.length; j++) { 
    220                 folderMessagesAvailable.addElement(messages[j]); 
     217            if(i < eventCount - 1) { 
     218                assertNotNull(messages); 
     219 
     220                // Collect folder messages within the event 
     221                for(int j=0; j<messages.length; j++) { 
     222                    folderMessagesAvailable.addElement(messages[j]); 
     223                } 
    221224            } 
    222225        } 
Note: See TracChangeset for help on using the changeset viewer.