Changeset 581


Ignore:
Timestamp:
12/30/09 13:22:16 (2 years ago)
Author:
octorian
Message:

Added flags-changing support (delete/undelete/replied) to the local mail store

Location:
trunk/LogicMail/src/org/logicprobe/LogicMail/mail
Files:
2 edited

Legend:

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

    r579 r581  
    112112     
    113113    public boolean hasUndelete() { 
    114         return false; 
     114        return true; 
    115115    } 
    116116 
     
    182182    public void requestMessage(MessageToken messageToken) { 
    183183        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
    184          
    185184        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
    186185         
    187         if(requestFolder != null && requestFolder != null) { 
     186        if(requestFolder != null) { 
    188187                threadQueue.invokeLater(new RequestMessageRunnable(requestFolder, localMessageToken)); 
    189188        } 
     
    230229     
    231230    public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags) { 
    232         throw new UnsupportedOperationException("Not yet implemented"); 
     231        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
     232        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
     233         
     234        if(requestFolder != null && !messageFlags.isDeleted()) { 
     235            MessageFlags newFlags = copyMessageFlags(messageFlags); 
     236            newFlags.setDeleted(true); 
     237            threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags)); 
     238        } 
    233239    } 
    234240 
    235241    public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags) { 
    236         throw new UnsupportedOperationException("Not yet implemented"); 
     242        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
     243        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
     244         
     245        if(requestFolder != null && messageFlags.isDeleted()) { 
     246            MessageFlags newFlags = copyMessageFlags(messageFlags); 
     247            newFlags.setDeleted(false); 
     248            threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags)); 
     249        } 
    237250    } 
    238251 
    239252    public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags) { 
    240         throw new UnsupportedOperationException("Not yet implemented"); 
    241     } 
    242  
     253        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
     254        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
     255         
     256        if(requestFolder != null && !messageFlags.isAnswered()) { 
     257            MessageFlags newFlags = copyMessageFlags(messageFlags); 
     258            newFlags.setAnswered(true); 
     259            threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags)); 
     260        } 
     261    } 
     262 
     263    private class UpdateMessageFlagsRunnable extends MaildirRunnable { 
     264        private LocalMessageToken localMessageToken; 
     265        private MessageFlags messageFlags; 
     266         
     267        public UpdateMessageFlagsRunnable( 
     268                FolderTreeItem requestFolder, 
     269                LocalMessageToken localMessageToken, 
     270                MessageFlags messageFlags) { 
     271            super(requestFolder); 
     272            this.localMessageToken = localMessageToken; 
     273            this.messageFlags = messageFlags; 
     274        } 
     275 
     276        public void run() { 
     277            boolean flagsUpdated = false; 
     278            try { 
     279                maildirFolder.open(); 
     280                flagsUpdated = maildirFolder.setMessageFlags(localMessageToken, messageFlags); 
     281                maildirFolder.close(); 
     282            } catch (IOException e) { 
     283                System.err.println("Unable to read folder: " + e.toString()); 
     284            } 
     285             
     286            if(flagsUpdated) { 
     287                fireMessageFlagsChanged(localMessageToken, messageFlags); 
     288            } 
     289        } 
     290    } 
     291     
    243292    public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags) { 
    244293        FolderTreeItem requestFolder = getMatchingFolderTreeItem(folder.getPath()); 
     
    333382        } 
    334383    } 
     384     
     385    private static MessageFlags copyMessageFlags(MessageFlags sourceFlags) { 
     386        return new MessageFlags( 
     387                sourceFlags.isSeen(), 
     388                sourceFlags.isAnswered(), 
     389                sourceFlags.isFlagged(), 
     390                sourceFlags.isDeleted(), 
     391                sourceFlags.isDraft(), 
     392                sourceFlags.isRecent(), 
     393                sourceFlags.isJunk()); 
     394    } 
    335395} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MaildirFolder.java

    r407 r581  
    325325                } 
    326326                 
    327                 // Get the filename unique id prefix, and shortcut out if not found 
    328                 String uniqueId = localMessageToken.getMessageUid(); 
    329                 if(uniqueId == null) { 
    330                         return null; 
    331                 } 
    332                  
    333                 // Find the file matching the unique id, and shortcut out if not found 
    334                 String matchingFile; 
    335                 Enumeration e = fileConnection.list(uniqueId + '*', false); 
    336                 if(e.hasMoreElements()) { 
    337                         matchingFile = (String)e.nextElement(); 
    338                 } 
    339                 else { 
    340                         return null; 
    341                 } 
     327                String matchingFile = getFileForToken(localMessageToken); 
     328                if(matchingFile == null) { return null; } 
    342329 
    343330                // Open the file, and read its contents 
     
    382369                return buf.toString(); 
    383370        } 
    384  
     371         
    385372        /** 
    386373         * Appends a message to the maildir. 
     
    407394                String uniqueId = buf.toString(); 
    408395                 
    409                 buf.append("_2,"); 
    410                 if(initialFlags.isAnswered()) { buf.append('R'); } 
    411                 if(initialFlags.isDeleted()) { buf.append('T'); } 
    412                 if(initialFlags.isDraft()) { buf.append('D'); } 
    413                 if(initialFlags.isFlagged()) { buf.append('F'); } 
    414                 if(initialFlags.isSeen()) { buf.append('S'); } 
     396                appendFlagsToBuffer(buf, initialFlags); 
    415397 
    416398                if (EventLogger.getMinimumLevel() >= EventLogger.DEBUG_INFO) { 
     
    465447                return result; 
    466448        } 
     449 
     450        /** 
     451         * Sets the flags of an existing message. 
     452         *  
     453         * @param localMessageToken The token for the message to set flags for 
     454         * @param messageFlags The flags to set 
     455         * @return True if message flags were updated, false otherwise 
     456         */ 
     457    public boolean setMessageFlags(LocalMessageToken localMessageToken, MessageFlags messageFlags) throws IOException { 
     458        if (EventLogger.getMinimumLevel() >= EventLogger.DEBUG_INFO) { 
     459            EventLogger.logEvent(AppInfo.GUID, 
     460                ("setMessageFlags(): " + localMessageToken.getMessageUid()).getBytes(), 
     461                EventLogger.DEBUG_INFO); 
     462        } 
     463        if(fileConnection == null) { 
     464            throw new IOException("Maildir not open"); 
     465        } 
     466         
     467        // Get the current filename 
     468        String messageFilename = getFileForToken(localMessageToken); 
     469        if(messageFilename == null) { return false; } 
     470         
     471        // Create the new filename, and verify that it is different 
     472        StringBuffer buf = new StringBuffer(); 
     473        buf.append(localMessageToken.getMessageUid()); 
     474        appendFlagsToBuffer(buf, messageFlags); 
     475        String updatedFilename = buf.toString(); 
     476        if(messageFilename.equals(updatedFilename)) { return false; } 
     477 
     478        FileConnection mailFileConnection = 
     479            (FileConnection)Connector.open(fileConnection.getURL() + '/' + messageFilename); 
     480        if(mailFileConnection.exists() && !mailFileConnection.isDirectory() && mailFileConnection.canRead()) { 
     481            mailFileConnection.rename(updatedFilename); 
     482            return true; 
     483        } 
     484        else { 
     485            return false; 
     486        } 
     487    } 
     488 
     489    /** 
     490     * Get the filename matching a message token. 
     491     *  
     492     * @param localMessageToken Token to find the file for 
     493     * @return Filename if found, or null if not found 
     494     */ 
     495    private String getFileForToken(LocalMessageToken localMessageToken) throws IOException { 
     496        // Get the filename unique id prefix, and shortcut out if not found 
     497        String uniqueId = localMessageToken.getMessageUid(); 
     498        if(uniqueId == null) { 
     499            return null; 
     500        } 
     501         
     502        // Find the file matching the unique id, and shortcut out if not found 
     503        String matchingFile; 
     504        Enumeration e = fileConnection.list(uniqueId + '*', false); 
     505        if(e.hasMoreElements()) { 
     506            matchingFile = (String)e.nextElement(); 
     507        } 
     508        else { 
     509            return null; 
     510        } 
     511        return matchingFile; 
     512    } 
     513 
     514    private static void appendFlagsToBuffer(StringBuffer buf, MessageFlags messageFlags) { 
     515        buf.append("_2,"); 
     516        if(messageFlags.isAnswered()) { buf.append('R'); } 
     517        if(messageFlags.isDeleted()) { buf.append('T'); } 
     518        if(messageFlags.isDraft()) { buf.append('D'); } 
     519        if(messageFlags.isFlagged()) { buf.append('F'); } 
     520        if(messageFlags.isSeen()) { buf.append('S'); } 
     521    } 
    467522} 
Note: See TracChangeset for help on using the changeset viewer.