Changeset 617


Ignore:
Timestamp:
01/18/10 22:25:45 (2 years ago)
Author:
octorian
Message:

Refactored the request-level notification infrastructure to use callback methods, so it can be very granular when necessary, and completely ignored when irrelevant.

Location:
trunk
Files:
13 edited
1 moved

Legend:

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

    r616 r617  
    163163         * @param params Parameters passed to the corresponding 
    164164         *               AbstractMailStore.requestXXXX() method.  
    165          */ 
    166         public void addRequest(int type, Object[] params) { 
     165     * @param tag Tag reference to pass along with the request 
     166         */ 
     167        public void addRequest(int type, Object[] params, Object tag) { 
    167168                synchronized(requestQueue) { 
    168169                        if(!shutdownInProgress) { 
    169                                 requestQueue.add(new Object[] {new Integer(type), params}); 
     170                                requestQueue.add(new Object[] {new Integer(type), params, tag}); 
    170171                                requestQueue.notifyAll(); 
    171172                        } 
     
    260261                        int type = ((Integer)request[0]).intValue(); 
    261262                        Object[] params = (Object[])request[1]; 
     263            Object tag = request[2]; 
    262264                         
    263265                        // Delegate to subclasses to handle the specific request 
    264266                        requestInProgress = request; 
    265                         handleRequest(type, params); 
     267                        handleRequest(type, params, tag); 
    266268                        requestInProgress = null; 
    267269                         
     
    285287         * @param type Type identifier for the request. 
    286288         * @param params Parameters for the request. 
     289     * @param tag Tag reference to pass along with the request 
    287290     * @throws IOException on I/O errors 
    288291     * @throws MailException on protocol errors 
    289292         */ 
    290         protected abstract void handleRequest(int type, Object[] params) throws IOException, MailException; 
     293        protected abstract void handleRequest(int type, Object[] params, Object tag) throws IOException, MailException; 
    291294         
    292295        /** 
     
    297300         * </p> 
    298301         *  
     302     * @param type Type identifier for the request. 
     303     * @param params Parameters for the request. 
     304     * @param tag Tag reference to pass along with the request 
    299305         * @param exception Exception that was thrown to fail the request, 
    300306         * or null if it failed due to a queue flush 
    301307         */ 
    302         protected void handleRequestFailed(int type, Object[] params, Throwable exception) { 
     308        protected void handleRequestFailed(int type, Object[] params, Object tag, Throwable exception) { 
    303309        if(this.listener != null) { 
    304310            listener.mailConnectionRequestFailed(type, params, exception); 
     
    532538                    ((Integer)requestInProgress[0]).intValue(), 
    533539                    (Object[])requestInProgress[1], 
     540                    requestInProgress[2], 
    534541                    e); 
    535542            requestInProgress = null; 
     
    562569                    ((Integer)requestInProgress[0]).intValue(), 
    563570                    (Object[])requestInProgress[1], 
     571                    requestInProgress[2], 
    564572                    e); 
    565573            requestInProgress = null; 
     
    591599                    ((Integer)requestInProgress[0]).intValue(), 
    592600                    (Object[])requestInProgress[1], 
     601                    requestInProgress[2], 
    593602                    t); 
    594603            requestInProgress = null; 
     
    610619                        ((Integer)request[0]).intValue(), 
    611620                        (Object[])request[1], 
     621                        request[2], 
    612622                        null); 
    613623                    element = requestQueue.element(); 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailSender.java

    r588 r617  
    7474     */ 
    7575        public abstract void requestSendMessage(MessageEnvelope envelope, Message message); 
    76          
     76 
    7777    /** 
    7878     * Adds a <tt>MailSenderListener</tt> to the mail sender. 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailStore.java

    r616 r617  
    5252public abstract class AbstractMailStore { 
    5353    private EventListenerList listenerList = new EventListenerList(); 
    54          
    55         protected AbstractMailStore() { 
    56         } 
    57          
    58         /** 
    59         * Shutdown the mail store. 
    60         * <p> 
    61         * Only relevant for non-local stores which have stateful connections. 
    62         * </p> 
    63         *  
    64         * @param wait If true, wait for all pending requests to finish. 
    65         */ 
    66         public abstract void shutdown(boolean wait); 
    67          
    68         /** 
    69         * Returns whether the mail store is local or remote. 
    70         *  
    71         * @return True if local, false if remote. 
    72         */ 
    73         public abstract boolean isLocal(); 
    74          
     54 
     55    protected AbstractMailStore() { 
     56    } 
     57 
     58    /** 
     59    * Shutdown the mail store. 
     60    * <p> 
     61    * Only relevant for non-local stores which have stateful connections. 
     62    * </p> 
     63    *  
     64    * @param wait If true, wait for all pending requests to finish. 
     65    */ 
     66    public abstract void shutdown(boolean wait); 
     67 
     68    /** 
     69    * Returns whether the mail store is local or remote. 
     70    *  
     71    * @return True if local, false if remote. 
     72    */ 
     73    public abstract boolean isLocal(); 
     74 
    7575    /** 
    7676     * Returns whether the mail store supports mail folders. 
     
    9090     */ 
    9191    public abstract boolean hasMessageParts(); 
    92      
     92 
    9393    /** 
    9494     * Returns whether the mail store supports message flags. 
     
    9797     */ 
    9898    public abstract boolean hasFlags(); 
    99      
     99 
    100100    /** 
    101101     * Returns whether the mail store supports appending messages. 
     
    104104     */ 
    105105    public abstract boolean hasAppend(); 
    106      
     106 
    107107    /** 
    108108     * Returns whether the mail store supports server-side copying of messages between mailboxes. 
     
    110110     * @return True if message copying is supported 
    111111     */ 
    112         public abstract boolean hasCopy(); 
    113          
     112    public abstract boolean hasCopy(); 
     113 
    114114    /** 
    115115     * Returns whether the mail store supports undeletion of messages. 
     
    125125     */ 
    126126    public abstract boolean hasExpunge(); 
    127      
     127 
    128128    /** 
    129129     * Requests the regeneration of the mail folder tree. 
     
    134134     * <p>This can be an expensive operation, so it should 
    135135     * be called sparingly on non-local mail stores. 
    136      */ 
    137     public abstract void requestFolderTree(); 
    138      
     136     *  
     137     * @param callback The callback to receive success or failure notifications about the request 
     138     */ 
     139    public abstract void requestFolderTree(MailStoreRequestCallback callback); 
     140 
     141    /** 
     142     * Requests the regeneration of the mail folder tree. 
     143     *  
     144     * <p>Successful completion is indicated by a call to 
     145     * {@link MailStoreListener#folderTreeUpdated(FolderEvent)}. 
     146     *  
     147     * <p>This can be an expensive operation, so it should 
     148     * be called sparingly on non-local mail stores. 
     149     */ 
     150    public void requestFolderTree() { 
     151        requestFolderTree(null); 
     152    } 
     153 
    139154    /** 
    140155     * Requests that a folder be expunged of deleted messages. 
     
    144159     *  
    145160     * @param folder The folder to expunge 
    146      */ 
    147     public abstract void requestFolderExpunge(FolderTreeItem folder); 
    148      
     161     * @param callback The callback to receive success or failure notifications about the request 
     162     */ 
     163    public abstract void requestFolderExpunge(FolderTreeItem folder, MailStoreRequestCallback callback); 
     164 
     165    /** 
     166     * Requests that a folder be expunged of deleted messages. 
     167     *  
     168     * <p>Successful completion is indicated by a call to 
     169     * {@link FolderListener#folderExpunged(FolderEvent)}. 
     170     *  
     171     * @param folder The folder to expunge 
     172     */ 
     173    public void requestFolderExpunge(FolderTreeItem folder) { 
     174        requestFolderExpunge(folder, null); 
     175    } 
     176 
    149177    /** 
    150178     * Requests the current message counts of a group of folders. 
     
    154182     *  
    155183     * @param folders The folder tree items to refresh. 
    156      */ 
    157     public abstract void requestFolderStatus(FolderTreeItem[] folders); 
    158      
     184     * @param callback The callback to receive success or failure notifications about the request 
     185     */ 
     186    public abstract void requestFolderStatus(FolderTreeItem[] folders, MailStoreRequestCallback callback); 
     187 
     188    /** 
     189     * Requests the current message counts of a group of folders. 
     190     *  
     191     * <p>Successful completion is indicated by calls to 
     192     * {@link FolderListener#folderStatusChanged(FolderEvent)}. 
     193     *  
     194     * @param folders The folder tree items to refresh. 
     195     */ 
     196    public void requestFolderStatus(FolderTreeItem[] folders) { 
     197        requestFolderStatus(folders, null); 
     198    } 
     199 
    159200    /** 
    160201     * Requests the message listing from a particular folder. 
     
    166207     * @param firstIndex The index of the first message to get headers for. 
    167208     * @param lastIndex The index of the last message to get headers for. 
    168      */ 
    169     public abstract void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex); 
    170      
     209     * @param callback The callback to receive success or failure notifications about the request 
     210     */ 
     211    public abstract void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex, MailStoreRequestCallback callback); 
     212 
     213    /** 
     214     * Requests the message listing from a particular folder. 
     215     *  
     216     * <p>Successful completion is indicated by a call to 
     217     * {@link FolderListener#folderMessagesAvailable(FolderMessagesEvent)}. 
     218     *  
     219     * @param folder The folder to request a message listing for. 
     220     * @param firstIndex The index of the first message to get headers for. 
     221     * @param lastIndex The index of the last message to get headers for. 
     222     */ 
     223    public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex) { 
     224        requestFolderMessagesRange(folder, firstIndex, lastIndex, null); 
     225    } 
     226 
    171227    /** 
    172228     * Requests the message listing from a particular folder. 
     
    179235     * @param folder The folder to request a message listing for. 
    180236     * @param messageTokens The set of tokens for the messages to get headers for. 
    181      */ 
    182     public abstract void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens); 
    183      
     237     * @param callback The callback to receive success or failure notifications about the request 
     238     */ 
     239    public abstract void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens, MailStoreRequestCallback callback); 
     240 
     241    /** 
     242     * Requests the message listing from a particular folder. 
     243     * All message tokens must refer to messages that exist within the provided 
     244     * folder item, or the results may be unexpected. 
     245     *  
     246     * <p>Successful completion is indicated by a call to 
     247     * {@link FolderListener#folderMessagesAvailable(FolderMessagesEvent)}. 
     248     *  
     249     * @param folder The folder to request a message listing for. 
     250     * @param messageTokens The set of tokens for the messages to get headers for. 
     251     */ 
     252    public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens) { 
     253        requestFolderMessagesSet(folder, messageTokens, null); 
     254    } 
     255 
    184256    /** 
    185257     * Requests the recent message listing from a particular folder. 
     
    195267     * @param folder The folder to request a message listing for. 
    196268     * @param flagsOnly If true, only tokens and flags will be fetched 
    197      */ 
    198     public abstract void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly); 
    199      
     269     * @param callback The callback to receive success or failure notifications about the request 
     270     */ 
     271    public abstract void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly, MailStoreRequestCallback callback); 
     272 
    200273    /** 
    201274     * Requests the recent message listing from a particular folder. 
    202275     *  
    203      * <p>Successful completion is indicated by a call to 
    204      * {@link FolderListener#folderMessagesAvailable(FolderMessagesEvent)}. 
     276     * <p> 
     277     * Successful completion is indicated by a call to 
     278     * {@link FolderListener#folderMessagesAvailable(FolderMessagesEvent)}. 
     279     * If <tt>flagsOnly</tt> is set to <b>true</b>, then the envelope and 
     280     * structure fields of the returned <tt>FolderMessage</tt> objects 
     281     * will be set to <b>null</b>. 
     282     * </p> 
    205283     *  
    206284     * @param folder The folder to request a message listing for. 
     285     * @param flagsOnly If true, only tokens and flags will be fetched 
     286     */ 
     287    public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly) { 
     288        requestFolderMessagesRecent(folder, flagsOnly, null); 
     289    } 
     290 
     291    /** 
     292     * Requests the recent message listing from a particular folder. 
     293     *  
     294     * <p>Successful completion is indicated by a call to 
     295     * {@link FolderListener#folderMessagesAvailable(FolderMessagesEvent)}. 
     296     *  
     297     * @param folder The folder to request a message listing for. 
     298     * @param callback The callback to receive success or failure notifications about the request 
     299     */ 
     300    public void requestFolderMessagesRecent(FolderTreeItem folder, MailStoreRequestCallback callback) { 
     301        requestFolderMessagesRecent(folder, false, callback); 
     302    } 
     303 
     304    /** 
     305     * Requests the recent message listing from a particular folder. 
     306     *  
     307     * <p>Successful completion is indicated by a call to 
     308     * {@link FolderListener#folderMessagesAvailable(FolderMessagesEvent)}. 
     309     *  
     310     * @param folder The folder to request a message listing for. 
    207311     */ 
    208312    public void requestFolderMessagesRecent(FolderTreeItem folder) { 
    209         requestFolderMessagesRecent(folder, false); 
    210     } 
    211      
     313        requestFolderMessagesRecent(folder, false, null); 
     314    } 
     315 
    212316    /** 
    213317     * Requests a particular message to be loaded. 
     
    217321     *  
    218322     * @param messageToken The token used to identify the message 
    219      */ 
    220     public abstract void requestMessage(MessageToken messageToken); 
    221      
     323     * @param callback The callback to receive success or failure notifications about the request 
     324     */ 
     325    public abstract void requestMessage(MessageToken messageToken, MailStoreRequestCallback callback); 
     326 
     327    /** 
     328     * Requests a particular message to be loaded. 
     329     *  
     330     * <p>Successful completion is indicated by a call to 
     331     * {@link MessageListener#messageAvailable(MessageEvent)}. 
     332     *  
     333     * @param messageToken The token used to identify the message 
     334     */ 
     335    public void requestMessage(MessageToken messageToken) { 
     336        requestMessage(messageToken, null); 
     337    } 
     338 
    222339    /** 
    223340     * Requests a particular message part to be loaded. 
     
    232349     * @param messageToken The token used to identify the message 
    233350     * @param messagePart The part of the message to load 
    234      */ 
    235     public abstract void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts); 
    236      
     351     * @param callback The callback to receive success or failure notifications about the request 
     352     */ 
     353    public abstract void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts, MailStoreRequestCallback callback); 
     354 
     355    /** 
     356     * Requests a particular message part to be loaded. 
     357     *  
     358     * <p>Successful completion is indicated by a call to 
     359     * {@link MessageListener#messageAvailable(MessageEvent)}. 
     360     *  
     361     * <p>If <tt>hasMessageParts()</tt> returns <tt>False</tt>, 
     362     * then this method should throw an 
     363     * <tt>UnsupportedOperationException</tt>. 
     364     *  
     365     * @param messageToken The token used to identify the message 
     366     * @param messagePart The part of the message to load 
     367     */ 
     368    public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts) { 
     369        requestMessageParts(messageToken, messageParts, null); 
     370    } 
     371 
    237372    /** 
    238373     * Requests a particular message to be deleted. 
     
    243378     * @param messageToken The token used to identify the message 
    244379     * @param messageFlags The flags currently associated with the message 
    245      */ 
    246     public abstract void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags); 
    247      
     380     * @param callback The callback to receive success or failure notifications about the request 
     381     */ 
     382    public abstract void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback); 
     383 
     384    /** 
     385     * Requests a particular message to be deleted. 
     386     *  
     387     * <p>Successful completion is indicated by a call to 
     388     * {@link MessageListener#messageDeleted(MessageEvent)}. 
     389     *  
     390     * @param messageToken The token used to identify the message 
     391     * @param messageFlags The flags currently associated with the message 
     392     */ 
     393    public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags) { 
     394        requestMessageDelete(messageToken, messageFlags, null); 
     395    } 
     396 
    248397    /** 
    249398     * Requests a particular message to be undeleted. 
     
    258407     * @param messageToken The token used to identify the message 
    259408     * @param messageFlags The flags currently associated with the message 
    260      */ 
    261     public abstract void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags); 
    262      
     409     * @param callback The callback to receive success or failure notifications about the request 
     410     */ 
     411    public abstract void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback); 
     412 
     413    /** 
     414     * Requests a particular message to be undeleted. 
     415     *  
     416     * <p>Successful completion is indicated by a call to 
     417     * {@link MessageListener#messageUndeleted(MessageEvent)}. 
     418     *  
     419     * <p>If <tt>hasUndelete()</tt> returns <tt>False</tt>, 
     420     * then this method should throw an 
     421     * <tt>UnsupportedOperationException</tt>. 
     422     *  
     423     * @param messageToken The token used to identify the message 
     424     * @param messageFlags The flags currently associated with the message 
     425     */ 
     426    public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags) { 
     427        requestMessageUndelete(messageToken, messageFlags, null); 
     428    } 
     429 
    263430    /** 
    264431     * Requests a particular message to be marked as answered. 
     
    273440     * @param messageToken The token used to identify the message 
    274441     * @param messageFlags The flags currently associated with the message 
    275      */ 
    276     public abstract void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags); 
    277      
     442     * @param callback The callback to receive success or failure notifications about the request 
     443     */ 
     444    public abstract void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback); 
     445 
     446    /** 
     447     * Requests a particular message to be marked as answered. 
     448     *  
     449     * <p>Successful completion is indicated by a call to 
     450     * {@link MessageListener#messageFlagsChanged(MessageEvent)}. 
     451     *  
     452     * <p>If <tt>hasFlags()</tt> returns <tt>False</tt>, 
     453     * then this method should throw an 
     454     * <tt>UnsupportedOperationException</tt>. 
     455     *  
     456     * @param messageToken The token used to identify the message 
     457     * @param messageFlags The flags currently associated with the message 
     458     */ 
     459    public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags) { 
     460        requestMessageAnswered(messageToken, messageFlags, null); 
     461    } 
     462 
    278463    /** 
    279464     * Requests a message to be appended to a folder. 
     
    293478     * @param rawMessage The raw source of the message to add 
    294479     * @param initialFlags The initial flags for the message 
    295      */ 
    296     public abstract void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags); 
    297      
     480     * @param callback The callback to receive success or failure notifications about the request 
     481     */ 
     482    public abstract void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags, MailStoreRequestCallback callback); 
     483 
     484    /** 
     485     * Requests a message to be appended to a folder. 
     486     *  
     487     * <p>Unlike other methods, this method requires the raw source of a message 
     488     * in order to add it.  This is because we are often trying to save an 
     489     * exact message that was returned by an operation such as sending mail. 
     490     *  
     491     * <p>Successful completion is indicated by a call to 
     492     * {@link FolderListener#folderMessagesAvailable(FolderMessagesEvent)}. 
     493     *  
     494     * <p>If <tt>hasAppend()</tt> returns <tt>False</tt>, 
     495     * then this method should throw an 
     496     * <tt>UnsupportedOperationException</tt>. 
     497     *  
     498     * @param folder The folder to add the message to 
     499     * @param rawMessage The raw source of the message to add 
     500     * @param initialFlags The initial flags for the message 
     501     */ 
     502    public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags) { 
     503        requestMessageAppend(folder, rawMessage, initialFlags, null); 
     504    } 
     505 
    298506    /** 
    299507     * Requests a message to be copied into a folder on the server-side. 
     
    312520     * @param messageToken The token used to identify the message 
    313521     * @param destinationFolder The folder to copy the message into 
    314      */ 
    315     public abstract void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder); 
    316         //TODO Come up with a notification event for copy 
    317      
     522     * @param callback The callback to receive success or failure notifications about the request 
     523     */ 
     524    public abstract void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder, MailStoreRequestCallback callback); 
     525 
     526    /** 
     527     * Requests a message to be copied into a folder on the server-side. 
     528     *  
     529     * <p> 
     530     * If <tt>hasCopy()</tt> returns <tt>false</tt>, 
     531     * then this method should throw an 
     532     * <tt>UnsupportedOperationException</tt>. 
     533     * </p> 
     534     *  
     535     * <p> 
     536     * Notification of successful completion is not directly provided, 
     537     * however the destination folder should contain the message if queried. 
     538     * </p> 
     539     *  
     540     * @param messageToken The token used to identify the message 
     541     * @param destinationFolder The folder to copy the message into 
     542     */ 
     543    public void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder) { 
     544        requestMessageCopy(messageToken, destinationFolder, null); 
     545    } 
     546 
    318547    /** 
    319548     * Adds a <tt>MailStoreListener</tt> to the mail store. 
     
    332561        listenerList.remove(MailStoreListener.class, l); 
    333562    } 
    334      
     563 
    335564    /** 
    336565     * Returns an array of all <tt>MailStoreListener</tt>s 
     
    360589        listenerList.remove(FolderListener.class, l); 
    361590    } 
    362      
     591 
    363592    /** 
    364593     * Returns an array of all <tt>FolderListener</tt>s 
     
    389618        listenerList.remove(MessageListener.class, l); 
    390619    } 
    391      
     620 
    392621    /** 
    393622     * Returns an array of all <tt>MessageListener</tt>s 
     
    400629        return (MessageListener[])listenerList.getListeners(MessageListener.class); 
    401630    } 
    402      
    403     /** 
    404      * Notifies all registered <tt>MailStoreListener</tt>s that 
    405      * a mail store request as completed.  
    406      *  
    407      * @param type The type of the event, which should be a constant defined on <code>RequestEvent</code>. 
    408      */ 
    409     protected void fireMailStoreRequestComplete(int type) { 
    410         Object[] listeners = listenerList.getListeners(MailStoreListener.class); 
    411         RequestEvent e = null; 
    412         for(int i=0; i<listeners.length; i++) { 
    413             if(e == null) { 
    414                 e = new RequestEvent(this, type, null, null); 
    415             } 
    416             ((MailStoreListener)listeners[i]).mailStoreRequestComplete(e); 
    417         } 
    418     } 
    419      
    420     /** 
    421      * Notifies all registered <tt>MailStoreListener</tt>s that 
    422      * a mail store request has failed. 
    423      *  
    424      * @param root The type of the event, which should be a constant defined on <code>RequestEvent</code>. 
    425      * @param params The parameters passed along with the request. 
    426      * @param exception The exception that caused the request to fail, if applicable. 
    427      */ 
    428     protected void fireMailStoreRequestFailed(int type, Object[] params, Throwable exception) { 
    429         Object[] listeners = listenerList.getListeners(MailStoreListener.class); 
    430         RequestEvent e = null; 
    431         for(int i=0; i<listeners.length; i++) { 
    432             if(e == null) { 
    433                 e = new RequestEvent(this, type, params, exception); 
    434             } 
    435             ((MailStoreListener)listeners[i]).mailStoreRequestFailed(e); 
    436         } 
    437     } 
    438      
     631 
    439632    /** 
    440633     * Notifies all registered <tt>MailStoreListener</tt>s that 
     
    453646        } 
    454647    } 
    455      
     648 
    456649    /** 
    457650     * Notifies all registered <tt>FolderListener</tt>s that 
     
    489682        } 
    490683    } 
    491      
     684 
    492685    /** 
    493686     * Notifies all registered <tt>FolderListener</tt>s that 
     
    526719        } 
    527720    } 
    528      
     721 
    529722    /** 
    530723     * Notifies all registered <tt>MessageListener</tt>s that 
     
    544737        } 
    545738    } 
    546      
     739 
    547740    /** 
    548741     * Notifies all registered <tt>MessageListener</tt>s that 
     
    562755        } 
    563756    } 
    564      
     757 
    565758    /** 
    566759     * Notifies all registered <tt>MessageListener</tt>s that 
     
    580773        } 
    581774    } 
    582      
     775 
    583776    /** 
    584777     * Notifies all registered <tt>MessageListener</tt>s that 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailConnectionHandler.java

    r616 r617  
    8484     * @param type Type identifier for the request. 
    8585     * @param params Parameters for the request. 
     86     * @param tag Tag reference to pass along with the request. 
    8687     * @throws IOException on I/O errors 
    8788     * @throws MailException on protocol errors 
    8889     */ 
    89     protected void handleRequest(int type, Object[] params) throws IOException, MailException { 
     90    protected void handleRequest(int type, Object[] params, Object tag) throws IOException, MailException { 
    9091        switch(type) { 
    9192        case REQUEST_FOLDER_TREE: 
    92             handleRequestFolderTree(); 
     93            handleRequestFolderTree(tag); 
    9394            break; 
    9495        case REQUEST_FOLDER_EXPUNGE: 
    95             handleRequestFolderExpunge((FolderTreeItem)params[0]); 
     96            handleRequestFolderExpunge((FolderTreeItem)params[0], tag); 
    9697            break; 
    9798        case REQUEST_FOLDER_STATUS: 
    98             handleRequestFolderStatus((FolderTreeItem[])params[0]); 
     99            handleRequestFolderStatus((FolderTreeItem[])params[0], tag); 
    99100            break; 
    100101        case REQUEST_FOLDER_MESSAGES_RANGE: 
     
    102103                    (FolderTreeItem)params[0], 
    103104                    ((Integer)params[1]).intValue(), 
    104                     ((Integer)params[2]).intValue()); 
     105                    ((Integer)params[2]).intValue(), 
     106                    tag); 
    105107            break; 
    106108        case REQUEST_FOLDER_MESSAGES_SET: 
    107109            handleRequestFolderMessagesSet( 
    108110                    (FolderTreeItem)params[0], 
    109                     (MessageToken[])params[1]); 
     111                    (MessageToken[])params[1], 
     112                    tag); 
    110113            break; 
    111114        case REQUEST_FOLDER_MESSAGES_RECENT: 
    112115            handleRequestFolderMessagesRecent( 
    113                     (FolderTreeItem)params[0], ((Boolean)params[1]).booleanValue()); 
     116                    (FolderTreeItem)params[0], ((Boolean)params[1]).booleanValue(), tag); 
    114117            break; 
    115118        case REQUEST_MESSAGE: 
    116             handleRequestMessage((MessageToken)params[0]); 
     119            handleRequestMessage((MessageToken)params[0], tag); 
    117120            break; 
    118121        case REQUEST_MESSAGE_PARTS: 
    119             handleRequestMessageParts((MessageToken)params[0], (MimeMessagePart[])params[1]); 
     122            handleRequestMessageParts((MessageToken)params[0], (MimeMessagePart[])params[1], tag); 
    120123            break; 
    121124        case REQUEST_MESSAGE_DELETE: 
    122             handleRequestMessageDelete((MessageToken)params[0], (MessageFlags)params[1]); 
     125            handleRequestMessageDelete((MessageToken)params[0], (MessageFlags)params[1], tag); 
    123126            break; 
    124127        case REQUEST_MESSAGE_UNDELETE: 
    125             handleRequestMessageUndelete((MessageToken)params[0], (MessageFlags)params[1]); 
     128            handleRequestMessageUndelete((MessageToken)params[0], (MessageFlags)params[1], tag); 
    126129            break; 
    127130        case REQUEST_MESSAGE_ANSWERED: 
    128             handleRequestMessageAnswered((MessageToken)params[0], (MessageFlags)params[1]); 
     131            handleRequestMessageAnswered((MessageToken)params[0], (MessageFlags)params[1], tag); 
    129132            break; 
    130133        case REQUEST_MESSAGE_APPEND: 
    131             handleRequestMessageAppend((FolderTreeItem)params[0], (String)params[1], (MessageFlags)params[2]); 
     134            handleRequestMessageAppend((FolderTreeItem)params[0], (String)params[1], (MessageFlags)params[2], tag); 
    132135            break; 
    133136        case REQUEST_MESSAGE_COPY: 
    134             handleRequestMessageCopy((MessageToken)params[0], (FolderTreeItem)params[1]); 
     137            handleRequestMessageCopy((MessageToken)params[0], (FolderTreeItem)params[1], tag); 
    135138        } 
    136139    } 
     
    150153                    addRequest( 
    151154                            IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT, 
    152                             new Object[] { incomingClient.getActiveFolder() }); 
     155                            new Object[] { incomingClient.getActiveFolder() }, 
     156                            null); 
    153157                    endIdle = true; 
    154158                } 
     
    177181                    addRequest( 
    178182                            IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT, 
    179                             new Object[] { incomingClient.getActiveFolder() }); 
     183                            new Object[] { incomingClient.getActiveFolder() }, 
     184                            null); 
    180185                } 
    181186                else { 
     
    205210    } 
    206211 
    207     private void handleRequestFolderTree() throws IOException, MailException { 
     212    private void handleRequestFolderTree(Object tag) throws IOException, MailException { 
    208213        String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_TREE); 
    209214        showStatus(message); 
     
    212217        MailConnectionHandlerListener listener = getListener(); 
    213218        if(root != null && listener != null) { 
    214             listener.mailConnectionRequestComplete(REQUEST_FOLDER_TREE, root); 
    215         } 
    216     } 
    217  
    218     private void handleRequestFolderExpunge(FolderTreeItem folder) throws IOException, MailException { 
     219            listener.mailConnectionRequestComplete(REQUEST_FOLDER_TREE, root, tag); 
     220        } 
     221    } 
     222 
     223    private void handleRequestFolderExpunge(FolderTreeItem folder, Object tag) throws IOException, MailException { 
    219224        String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_EXPUNGE); 
    220225        showStatus(message); 
     
    224229        MailConnectionHandlerListener listener = getListener(); 
    225230        if(listener != null) { 
    226             listener.mailConnectionRequestComplete(REQUEST_FOLDER_EXPUNGE, folder); 
    227         } 
    228     } 
    229  
    230     private void handleRequestFolderStatus(FolderTreeItem[] folders) throws IOException, MailException { 
     231            listener.mailConnectionRequestComplete(REQUEST_FOLDER_EXPUNGE, folder, tag); 
     232        } 
     233    } 
     234 
     235    private void handleRequestFolderStatus(FolderTreeItem[] folders, Object tag) throws IOException, MailException { 
    231236        String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_STATUS); 
    232237        showStatus(message); 
     
    235240        MailConnectionHandlerListener listener = getListener(); 
    236241        if(listener != null) { 
    237             listener.mailConnectionRequestComplete(REQUEST_FOLDER_STATUS, folders); 
     242            listener.mailConnectionRequestComplete(REQUEST_FOLDER_STATUS, folders, tag); 
    238243        } 
    239244    } 
     
    244249        private FolderTreeItem folder; 
    245250        private MailConnectionHandlerListener listener; 
     251        private Object tag; 
    246252        private Object param; 
    247253        private FolderMessage[] folderMessages; 
    248254        private int count; 
    249255 
    250         public GetFolderMessageCallback(int maxCount, int type, FolderTreeItem folder, MailConnectionHandlerListener listener) { 
    251             this(maxCount, type, folder, listener, null); 
    252         } 
    253  
    254         public GetFolderMessageCallback(int maxCount, int type, FolderTreeItem folder, MailConnectionHandlerListener listener, Object param) { 
     256        public GetFolderMessageCallback(int maxCount, int type, FolderTreeItem folder, MailConnectionHandlerListener listener, Object tag) { 
     257            this(maxCount, type, folder, listener, null, tag); 
     258        } 
     259 
     260        public GetFolderMessageCallback(int maxCount, int type, FolderTreeItem folder, MailConnectionHandlerListener listener, Object param, Object tag) { 
    255261            this.maxCount = maxCount; 
    256262            this.type = type; 
     
    258264            this.listener = listener; 
    259265            this.param = param; 
     266            this.tag = tag; 
    260267            this.count = 0; 
    261268        } 
     
    289296                if(resultMessages != null) { 
    290297                    if(param == null) { 
    291                         listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages }); 
     298                        listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages }, tag); 
    292299                    } 
    293300                    else { 
    294                         listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages, param }); 
     301                        listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages, param }, tag); 
    295302                    } 
    296303                } 
     
    300307                if(folderMessage == null) { 
    301308                    if(param == null) { 
    302                         listener.mailConnectionRequestComplete(type, new Object[] { folder, null }); 
     309                        listener.mailConnectionRequestComplete(type, new Object[] { folder, null }, tag); 
    303310                    } 
    304311                    else { 
    305                         listener.mailConnectionRequestComplete(type, new Object[] { folder, null, param }); 
     312                        listener.mailConnectionRequestComplete(type, new Object[] { folder, null, param }, tag); 
    306313                    } 
    307314                } 
     
    310317    }; 
    311318 
    312     private void handleRequestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex) throws IOException, MailException { 
     319    private void handleRequestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex, Object tag) throws IOException, MailException { 
    313320        String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_MESSAGES); 
    314321        showStatus(message + "..."); 
     
    321328                        REQUEST_FOLDER_MESSAGES_RANGE, 
    322329                        folder, 
    323                         getListener()), 
     330                        getListener(), tag), 
    324331                        getProgressHandler(message)); 
    325332    } 
    326333     
    327     private void handleRequestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens) throws IOException, MailException { 
     334    private void handleRequestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens, Object tag) throws IOException, MailException { 
    328335        String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_MESSAGES); 
    329336        showStatus(message + "..."); 
     
    336343                        REQUEST_FOLDER_MESSAGES_SET, 
    337344                        folder, 
    338                         getListener()), 
     345                        getListener(), tag), 
    339346                        getProgressHandler(message)); 
    340347    } 
    341348     
    342     private void handleRequestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly) throws IOException, MailException { 
     349    private void handleRequestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly, Object tag) throws IOException, MailException { 
    343350        String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_MESSAGES); 
    344351        showStatus(message + "..."); 
     
    352359                        folder, 
    353360                        getListener(), 
    354                         new Boolean(flagsOnly)), 
     361                        new Boolean(flagsOnly), tag), 
    355362                        getProgressHandler(message)); 
    356363    } 
     
    371378    } 
    372379     
    373     private void handleRequestMessage(MessageToken messageToken) throws IOException, MailException { 
     380    private void handleRequestMessage(MessageToken messageToken, Object tag) throws IOException, MailException { 
    374381        String statusMessage = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE); 
    375382        showStatus(statusMessage); 
     
    380387        MailConnectionHandlerListener listener = getListener(); 
    381388        if(message != null && listener != null) { 
    382             listener.mailConnectionRequestComplete(REQUEST_MESSAGE, new Object[] { messageToken, message.getStructure(), message.getAllContent() }); 
    383         } 
    384     } 
    385      
    386     private void handleRequestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts) throws IOException, MailException { 
     389            listener.mailConnectionRequestComplete(REQUEST_MESSAGE, new Object[] { messageToken, message.getStructure(), message.getAllContent() }, tag); 
     390        } 
     391    } 
     392     
     393    private void handleRequestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts, Object tag) throws IOException, MailException { 
    387394        String statusMessage = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE); 
    388395        showStatus(statusMessage); 
     
    410417        MailConnectionHandlerListener listener = getListener(); 
    411418        if(messageContent != null && listener != null) { 
    412             listener.mailConnectionRequestComplete(REQUEST_MESSAGE_PARTS, new Object[] { messageToken, messageContent }); 
    413         } 
    414     } 
    415  
    416     private void handleRequestMessageDelete(MessageToken messageToken, MessageFlags messageFlags) throws IOException, MailException { 
     419            listener.mailConnectionRequestComplete(REQUEST_MESSAGE_PARTS, new Object[] { messageToken, messageContent }, tag); 
     420        } 
     421    } 
     422 
     423    private void handleRequestMessageDelete(MessageToken messageToken, MessageFlags messageFlags, Object tag) throws IOException, MailException { 
    417424        showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_DELETE)); 
    418425        checkActiveFolder(messageToken); 
     
    422429        MailConnectionHandlerListener listener = getListener(); 
    423430        if(listener != null) { 
    424             listener.mailConnectionRequestComplete(REQUEST_MESSAGE_DELETE, new Object[] { messageToken, messageFlags }); 
    425         } 
    426     } 
    427      
    428     private void handleRequestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags) throws IOException, MailException { 
     431            listener.mailConnectionRequestComplete(REQUEST_MESSAGE_DELETE, new Object[] { messageToken, messageFlags }, tag); 
     432        } 
     433    } 
     434     
     435    private void handleRequestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags, Object tag) throws IOException, MailException { 
    429436        showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_UNDELETE)); 
    430437        checkActiveFolder(messageToken); 
     
    434441        MailConnectionHandlerListener listener = getListener(); 
    435442        if(listener != null) { 
    436             listener.mailConnectionRequestComplete(REQUEST_MESSAGE_UNDELETE, new Object[] { messageToken, messageFlags }); 
    437         } 
    438     } 
    439      
    440     private void handleRequestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags) throws IOException, MailException { 
     443            listener.mailConnectionRequestComplete(REQUEST_MESSAGE_UNDELETE, new Object[] { messageToken, messageFlags }, tag); 
     444        } 
     445    } 
     446     
     447    private void handleRequestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags, Object tag) throws IOException, MailException { 
    441448        showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_ANSWERED)); 
    442449        // Replace this with a more general method: 
     
    448455        MailConnectionHandlerListener listener = getListener(); 
    449456        if(listener != null) { 
    450             listener.mailConnectionRequestComplete(REQUEST_MESSAGE_ANSWERED, new Object[] { messageToken, messageFlags }); 
    451         } 
    452     } 
    453      
    454     private void handleRequestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags) throws IOException, MailException { 
     457            listener.mailConnectionRequestComplete(REQUEST_MESSAGE_ANSWERED, new Object[] { messageToken, messageFlags }, tag); 
     458        } 
     459    } 
     460     
     461    private void handleRequestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags, Object tag) throws IOException, MailException { 
    455462        showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_APPEND)); 
    456463        // Clean up this interface: 
     
    462469        if(listener != null) { 
    463470            // Using a null FolderMessage since no information is returned on the appended message: 
    464             listener.mailConnectionRequestComplete(REQUEST_MESSAGE_APPEND, new Object[] { folder, null }); 
    465         } 
    466     } 
    467      
    468     private void handleRequestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder) throws IOException, MailException { 
     471            listener.mailConnectionRequestComplete(REQUEST_MESSAGE_APPEND, new Object[] { folder, null }, tag); 
     472        } 
     473    } 
     474     
     475    private void handleRequestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder, Object tag) throws IOException, MailException { 
    469476        showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_COPY)); 
    470477        if(incomingClient.hasCopy()) { 
     
    476483        if(listener != null) { 
    477484            // Using a null FolderMessage since no information is returned on the appended message: 
    478             listener.mailConnectionRequestComplete(REQUEST_MESSAGE_COPY, new Object[] { messageToken, destinationFolder }); 
     485            listener.mailConnectionRequestComplete(REQUEST_MESSAGE_COPY, new Object[] { messageToken, destinationFolder }, tag); 
    479486        } 
    480487    } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/LocalMailStore.java

    r616 r617  
    5353import org.logicprobe.LogicMail.util.ThreadQueue; 
    5454 
    55  
    5655/** 
    5756 * This class manages local mail folders on the device. 
     
    109108 
    110109    public boolean hasCopy() { 
    111         // TODO Implement copy for local messages 
    112         return false; 
     110        return true; 
    113111    } 
    114112     
     
    121119    } 
    122120     
    123     public void requestFolderTree() { 
    124         fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_TREE); 
     121    public void requestFolderTree(MailStoreRequestCallback callback) { 
     122        if(callback != null) { callback.mailStoreRequestComplete(); } 
    125123        fireFolderTreeUpdated(rootFolder); 
    126124    } 
    127125 
    128     public void requestFolderExpunge(FolderTreeItem folder) { 
     126    public void requestFolderExpunge(FolderTreeItem folder, MailStoreRequestCallback callback) { 
    129127        FolderTreeItem requestFolder = getMatchingFolderTreeItem(folder.getPath()); 
    130128         
    131129        if(requestFolder != null) { 
    132             threadQueue.invokeLater(new ExpungeFolderRunnable(requestFolder)); 
     130            threadQueue.invokeLater(new ExpungeFolderRunnable(requestFolder, callback)); 
     131        } 
     132        else { 
     133            if(callback != null) { callback.mailStoreRequestFailed(null); } 
    133134        } 
    134135    } 
    135136     
    136137    private class ExpungeFolderRunnable extends MaildirRunnable { 
    137         public ExpungeFolderRunnable(FolderTreeItem requestFolder) { 
    138             super(requestFolder); 
     138        public ExpungeFolderRunnable(FolderTreeItem requestFolder, MailStoreRequestCallback callback) { 
     139            super(requestFolder, callback); 
    139140        } 
    140141         
     
    153154             
    154155            if(expunged) { 
    155                 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_EXPUNGE); 
     156                if(callback != null) { callback.mailStoreRequestComplete(); } 
    156157                fireFolderExpunged(requestFolder); 
    157158            } 
    158159            else { 
    159                 fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_EXPUNGE, new Object[] { requestFolder }, throwable); 
    160             } 
    161         } 
    162     } 
    163      
    164     public void requestFolderStatus(FolderTreeItem[] folders) { 
     160                if(callback != null) { callback.mailStoreRequestFailed(throwable); } 
     161            } 
     162        } 
     163    } 
     164     
     165    public void requestFolderStatus(FolderTreeItem[] folders, MailStoreRequestCallback callback) { 
    165166        // Make every entry in the provided array match the local folder 
    166167        // objects just in case they do not.  Then, fire change events 
     
    173174                if (folders[i].getPath().equals(localFolders[j].getPath())) { 
    174175                    folders[i] = localFolders[j]; 
    175  
    176176                    break; 
    177177                } 
     
    179179        } 
    180180         
    181         fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_STATUS); 
     181        if(callback != null) { callback.mailStoreRequestComplete(); } 
    182182        for (int i = 0; i < folders.length; i++) { 
    183183            fireFolderStatusChanged(folders[i]); 
     
    185185    } 
    186186 
    187     public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex) { 
     187    public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex, MailStoreRequestCallback callback) { 
    188188        throw new UnsupportedOperationException("Not yet implemented"); 
    189189        } 
    190190 
    191         public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens) { 
     191        public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens, MailStoreRequestCallback callback) { 
    192192                throw new UnsupportedOperationException("Not yet implemented"); 
    193193        } 
    194194 
    195     public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly) { 
     195    public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly, MailStoreRequestCallback callback) { 
    196196        // The flagsOnly parameter has no effect on local mail stores, 
    197197        // and it is not likely to ever be called on them anyways. 
     
    199199         
    200200        if(requestFolder != null) { 
    201                 threadQueue.invokeLater(new RequestFolderMessagesRecentRunnable(requestFolder)); 
     201                threadQueue.invokeLater(new RequestFolderMessagesRecentRunnable(requestFolder, callback)); 
     202        } 
     203        else { 
     204            if(callback != null) { callback.mailStoreRequestFailed(null); } 
    202205        } 
    203206    } 
    204207 
    205208    private class RequestFolderMessagesRecentRunnable extends MaildirRunnable { 
    206         public RequestFolderMessagesRecentRunnable(FolderTreeItem requestFolder) { 
    207                 super(requestFolder); 
     209        public RequestFolderMessagesRecentRunnable(FolderTreeItem requestFolder, MailStoreRequestCallback callback) { 
     210                super(requestFolder, callback); 
    208211        } 
    209212         
     
    221224                 
    222225                if(folderMessages != null) { 
    223                     fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_RECENT); 
     226                if(callback != null) { callback.mailStoreRequestComplete(); } 
    224227                        fireFolderMessagesAvailable(requestFolder, folderMessages, false); 
    225228                } 
    226229                else { 
    227                     fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_MESSAGES_RECENT, new Object[] { requestFolder }, throwable); 
     230                if(callback != null) { callback.mailStoreRequestFailed(throwable); } 
    228231                } 
    229232                } 
    230233    } 
    231234     
    232     public void requestMessage(MessageToken messageToken) { 
     235    public void requestMessage(MessageToken messageToken, MailStoreRequestCallback callback) { 
    233236        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
    234237        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
    235238         
    236239        if(requestFolder != null) { 
    237                 threadQueue.invokeLater(new RequestMessageRunnable(requestFolder, localMessageToken)); 
     240                threadQueue.invokeLater(new RequestMessageRunnable(requestFolder, localMessageToken, callback)); 
     241        } 
     242        else { 
     243            if(callback != null) { callback.mailStoreRequestFailed(null); } 
    238244        } 
    239245    } 
     
    242248        private LocalMessageToken localMessageToken; 
    243249         
    244         public RequestMessageRunnable(FolderTreeItem requestFolder, LocalMessageToken localMessageToken) { 
    245                 super(requestFolder); 
     250        public RequestMessageRunnable(FolderTreeItem requestFolder, LocalMessageToken localMessageToken, MailStoreRequestCallback callback) { 
     251                super(requestFolder, callback); 
    246252                this.localMessageToken = localMessageToken; 
    247253        } 
     
    273279                 
    274280                if(message != null && messageSource != null) { 
    275                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE); 
     281                if(callback != null) { callback.mailStoreRequestComplete(); } 
    276282                        fireMessageAvailable(localMessageToken, message.getStructure(), message.getAllContent(), messageSource); 
    277283                } 
    278284                else { 
    279                     fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE, new Object[] { localMessageToken }, throwable); 
     285                if(callback != null) { callback.mailStoreRequestFailed(throwable); } 
    280286                } 
    281287                } 
    282288    } 
    283289 
    284     public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts) { 
     290    public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts, MailStoreRequestCallback callback) { 
    285291        throw new UnsupportedOperationException(); 
    286292    } 
    287293     
    288     public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags) { 
     294    public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { 
    289295        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
    290296        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
     
    293299            MessageFlags newFlags = copyMessageFlags(messageFlags); 
    294300            newFlags.setDeleted(true); 
    295             threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags, RequestEvent.TYPE_MESSAGE_DELETE)); 
    296         } 
    297     } 
    298  
    299     public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags) { 
     301            threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags, callback)); 
     302        } 
     303        else { 
     304            if(callback != null) { callback.mailStoreRequestFailed(null); } 
     305        } 
     306    } 
     307 
     308    public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { 
    300309        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
    301310        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
     
    304313            MessageFlags newFlags = copyMessageFlags(messageFlags); 
    305314            newFlags.setDeleted(false); 
    306             threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags, RequestEvent.TYPE_MESSAGE_UNDELETE)); 
    307         } 
    308     } 
    309  
    310     public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags) { 
     315            threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags, callback)); 
     316        } 
     317        else { 
     318            if(callback != null) { callback.mailStoreRequestFailed(null); } 
     319        } 
     320    } 
     321 
     322    public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { 
    311323        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
    312324        FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
     
    315327            MessageFlags newFlags = copyMessageFlags(messageFlags); 
    316328            newFlags.setAnswered(true); 
    317             threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags, RequestEvent.TYPE_MESSAGE_ANSWERED)); 
     329            threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags, callback)); 
     330        } 
     331        else { 
     332            if(callback != null) { callback.mailStoreRequestFailed(null); } 
    318333        } 
    319334    } 
     
    322337        private LocalMessageToken localMessageToken; 
    323338        private MessageFlags messageFlags; 
    324         private int requestType; 
    325339         
    326340        public UpdateMessageFlagsRunnable( 
     
    328342                LocalMessageToken localMessageToken, 
    329343                MessageFlags messageFlags, 
    330                 int requestType) { 
    331             super(requestFolder); 
     344                MailStoreRequestCallback callback) { 
     345            super(requestFolder, callback); 
    332346            this.localMessageToken = localMessageToken; 
    333347            this.messageFlags = messageFlags; 
    334             this.requestType = requestType; 
    335348        } 
    336349 
     
    351364             
    352365            if(success) { 
    353                 fireMailStoreRequestComplete(requestType); 
     366                if(callback != null) { callback.mailStoreRequestComplete(); } 
    354367            } 
    355368            else { 
    356                 fireMailStoreRequestFailed(requestType, new Object[] { localMessageToken, messageFlags }, throwable); 
    357             } 
    358              
     369                if(callback != null) { callback.mailStoreRequestFailed(throwable); } 
     370            } 
     371 
    359372            if(flagsUpdated) { 
    360373                fireMessageFlagsChanged(localMessageToken, messageFlags); 
     
    363376    } 
    364377     
    365     public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags) { 
     378    public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags, MailStoreRequestCallback callback) { 
    366379        FolderTreeItem requestFolder = getMatchingFolderTreeItem(folder.getPath()); 
    367380         
    368381        if(requestFolder != null && rawMessage != null && rawMessage.length() > 0 && initialFlags != null) { 
    369                 threadQueue.invokeLater(new RequestMessageAppendRunnable(requestFolder, rawMessage, initialFlags)); 
     382                threadQueue.invokeLater(new RequestMessageAppendRunnable(requestFolder, rawMessage, initialFlags, callback)); 
     383        } 
     384        else { 
     385            if(callback != null) { callback.mailStoreRequestFailed(null); } 
    370386        } 
    371387    } 
     
    375391        private MessageFlags initialFlags; 
    376392         
    377         public RequestMessageAppendRunnable(FolderTreeItem requestFolder, String rawMessage, MessageFlags initialFlags) { 
    378                 super(requestFolder); 
     393        public RequestMessageAppendRunnable(FolderTreeItem requestFolder, String rawMessage, MessageFlags initialFlags, MailStoreRequestCallback callback) { 
     394                super(requestFolder, callback); 
    379395                this.rawMessage = rawMessage; 
    380396                this.initialFlags = initialFlags; 
     
    394410                 
    395411                if(folderMessage != null) { 
    396                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_APPEND); 
     412                if(callback != null) { callback.mailStoreRequestComplete(); } 
    397413                        fireFolderMessagesAvailable(requestFolder, new FolderMessage[] { folderMessage }, false); 
    398414                } 
    399415                else { 
    400                     fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_APPEND, new Object[] { requestFolder, rawMessage, initialFlags }, throwable); 
     416                if(callback != null) { callback.mailStoreRequestFailed(throwable); } 
    401417                } 
    402418                } 
     
    406422     * @see org.logicprobe.LogicMail.mail.AbstractMailStore#requestMessageCopy(org.logicprobe.LogicMail.mail.MessageToken, org.logicprobe.LogicMail.mail.FolderTreeItem) 
    407423     */ 
    408     public void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder) { 
    409         throw new UnsupportedOperationException(); 
     424    public void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder, MailStoreRequestCallback callback) { 
     425        LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 
     426        FolderTreeItem fromFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 
     427        FolderTreeItem toFolder = getMatchingFolderTreeItem(destinationFolder.getPath()); 
     428        if(fromFolder != null && toFolder != null) { 
     429            threadQueue.invokeLater(new MessageCopyRunnable(localMessageToken, fromFolder, toFolder, callback)); 
     430        } 
     431        else { 
     432            if(callback != null) { callback.mailStoreRequestFailed(null); } 
     433        } 
     434    } 
     435     
     436    private class MessageCopyRunnable implements Runnable { 
     437        private LocalMessageToken localMessageToken; 
     438        private FolderTreeItem toFolder; 
     439        private MaildirFolder fromMaildirFolder; 
     440        private MaildirFolder toMaildirFolder; 
     441        private MailStoreRequestCallback callback; 
     442 
     443        public MessageCopyRunnable(LocalMessageToken localMessageToken, FolderTreeItem fromFolder, FolderTreeItem toFolder, MailStoreRequestCallback callback) { 
     444            this.localMessageToken = localMessageToken; 
     445            this.toFolder = toFolder; 
     446            this.fromMaildirFolder = getMaildirFolder(fromFolder); 
     447            this.toMaildirFolder = getMaildirFolder(toFolder); 
     448            this.callback = callback; 
     449        } 
     450 
     451        public void run() { 
     452            Throwable throwable = null; 
     453            FolderMessage copiedMessage = null; 
     454            try { 
     455                fromMaildirFolder.open(); 
     456                toMaildirFolder.open(); 
     457 
     458                String messageSource = fromMaildirFolder.getMessageSource(localMessageToken); 
     459                copiedMessage = toMaildirFolder.appendMessage( 
     460                        messageSource, 
     461                        new MessageFlags(false, false, false, false, false, true, false)); 
     462 
     463                toMaildirFolder.close(); 
     464                fromMaildirFolder.close(); 
     465            } catch (IOException e) { 
     466                EventLogger.logEvent(AppInfo.GUID, ("Unable to read folder: " + e.toString()).getBytes(), EventLogger.ERROR); 
     467                throwable = e; 
     468            } 
     469             
     470            if(copiedMessage != null) { 
     471                if(callback != null) { callback.mailStoreRequestComplete(); } 
     472                fireFolderMessagesAvailable(toFolder, new FolderMessage[] { copiedMessage }, false); 
     473            } 
     474            else { 
     475                if(callback != null) { callback.mailStoreRequestFailed(throwable); } 
     476            } 
     477        } 
    410478    } 
    411479     
     
    434502        protected FolderTreeItem requestFolder; 
    435503        protected MaildirFolder maildirFolder; 
     504        protected MailStoreRequestCallback callback; 
    436505         
    437         public MaildirRunnable(FolderTreeItem requestFolder) { 
     506        public MaildirRunnable(FolderTreeItem requestFolder, MailStoreRequestCallback callback) { 
    438507                this.requestFolder = requestFolder; 
    439  
    440                 if(folderMaildirMap.containsKey(requestFolder)) { 
    441                         maildirFolder = (MaildirFolder)folderMaildirMap.get(requestFolder); 
    442                 } 
    443                 else { 
    444                         String folderUrl = globalConfig.getLocalDataLocation() + "local/"; 
    445                         try { 
    446                                 FileConnection fileConnection = (FileConnection)Connector.open(folderUrl); 
    447                                 if(!fileConnection.exists()) { 
    448                                         fileConnection.mkdir(); 
    449                                 } 
    450                                 fileConnection.close(); 
    451                         } catch (IOException e) { 
    452                     EventLogger.logEvent(AppInfo.GUID, ("Error preparing root path: " + e.toString()).getBytes(), EventLogger.ERROR); 
    453                         } 
    454                          
    455                 StringBuffer buf = new StringBuffer(); 
    456                 buf.append(folderUrl); 
    457                 buf.append(requestFolder.getPath()); 
    458                         maildirFolder = new MaildirFolder(requestFolder.getPath(), buf.toString()); 
    459                         folderMaildirMap.put(requestFolder, maildirFolder); 
    460                 } 
     508                this.maildirFolder = getMaildirFolder(requestFolder); 
     509                this.callback = callback; 
    461510        } 
     511    } 
     512     
     513    private MaildirFolder getMaildirFolder(FolderTreeItem requestFolder) { 
     514        MaildirFolder maildirFolder; 
     515        if(folderMaildirMap.containsKey(requestFolder)) { 
     516            maildirFolder = (MaildirFolder)folderMaildirMap.get(requestFolder); 
     517        } 
     518        else { 
     519            String folderUrl = globalConfig.getLocalDataLocation() + "local/"; 
     520            try { 
     521                FileConnection fileConnection = (FileConnection)Connector.open(folderUrl); 
     522                if(!fileConnection.exists()) { 
     523                    fileConnection.mkdir(); 
     524                } 
     525                fileConnection.close(); 
     526            } catch (IOException e) { 
     527                EventLogger.logEvent(AppInfo.GUID, ("Error preparing root path: " + e.toString()).getBytes(), EventLogger.ERROR); 
     528            } 
     529             
     530            StringBuffer buf = new StringBuffer(); 
     531            buf.append(folderUrl); 
     532            buf.append(requestFolder.getPath()); 
     533            maildirFolder = new MaildirFolder(requestFolder.getPath(), buf.toString()); 
     534            folderMaildirMap.put(requestFolder, maildirFolder); 
     535        } 
     536        return maildirFolder; 
    462537    } 
    463538     
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MailConnectionHandlerListener.java

    r616 r617  
    4242         * @param type The type of the request. 
    4343         * @param result The data returned from the request. 
     44     * @param tag Tag reference to pass along with the request 
    4445         */ 
    45         public void mailConnectionRequestComplete(int type, Object result); 
     46        public void mailConnectionRequestComplete(int type, Object result, Object tag); 
    4647         
    4748    /** 
     
    4950     *  
    5051     * @param type The type of the request. 
    51      * @param params The parameters passed along with the request. 
     52     * @param tag Tag reference to pass along with the request 
    5253     * @param exception The exception that caused the request to fail, if applicable. 
    5354     */ 
    54     public void mailConnectionRequestFailed(int type, Object[] params, Throwable exception); 
     55    public void mailConnectionRequestFailed(int type, Object tag, Throwable exception); 
    5556} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MailStoreListener.java

    r616 r617  
    3838 */ 
    3939public interface MailStoreListener extends EventListener { 
    40     /** 
    41      * Invoked when a mail store request is completed. 
    42      *  
    43      * @param e the event data 
    44      */ 
    45     void mailStoreRequestComplete(RequestEvent e); 
    46      
    47     /** 
    48      * Invoked when a mail store request fails. 
    49      *  
    50      * @param e the event data 
    51      */ 
    52     void mailStoreRequestFailed(RequestEvent e); 
    53      
    5440        /** 
    5541         * Invoked when the folder tree is updated. 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MailStoreRequestCallback.java

    r616 r617  
    3232 
    3333/** 
    34  * Object for mail store request events.  
     34 * Callback interface for mail store requests. 
    3535 */ 
    36 public class RequestEvent extends MailStoreEvent { 
    37     private int type; 
    38     private Object[] params; 
    39     private Throwable exception; 
    40      
    41     public final static int TYPE_FOLDER_TREE = 0; 
    42     public final static int TYPE_FOLDER_EXPUNGE = 1; 
    43     public final static int TYPE_FOLDER_STATUS = 2; 
    44     public final static int TYPE_FOLDER_MESSAGES_RANGE = 3; 
    45     public final static int TYPE_FOLDER_MESSAGES_SET = 4; 
    46     public final static int TYPE_FOLDER_MESSAGES_RECENT = 5; 
    47     public final static int TYPE_MESSAGE = 6; 
    48     public final static int TYPE_MESSAGE_PARTS = 7; 
    49     public final static int TYPE_MESSAGE_DELETE = 8; 
    50     public final static int TYPE_MESSAGE_UNDELETE = 9; 
    51     public final static int TYPE_MESSAGE_ANSWERED = 10; 
    52     public final static int TYPE_MESSAGE_APPEND = 11; 
    53     public final static int TYPE_MESSAGE_COPY = 12; 
     36public interface MailStoreRequestCallback { 
     37    /** 
     38     * Invoked when the mail store request is completed. 
     39     */ 
     40    void mailStoreRequestComplete(); 
    5441     
    5542    /** 
    56      * Creates a new instance of MessageEvent. 
     43     * Invoked when the mail store request fails. 
    5744     *  
    58      * @param source the source of the event 
    59      * @param type the type of the event 
    60      * @param params the parameters passed along with the request. 
    61      * @param exception the exception that caused the request to fail, if applicable. 
     45     * @param exception the exception that caused the request to fail, if applicable 
    6246     */ 
    63     public RequestEvent(Object source, int type, Object[] params, Throwable exception) { 
    64         super(source); 
    65         this.type = type; 
    66         this.params = params; 
    67         this.exception = exception; 
    68     } 
    69  
    70     /** 
    71      * Gets the type of this request event. 
    72      *  
    73      * @return Event type. 
    74      */ 
    75     public int getType() { 
    76         return this.type; 
    77     } 
    78      
    79     /** 
    80      * Gets the parameters passed along with the request. 
    81      *  
    82      * @return the parameters passed along with the request 
    83      */ 
    84     public Object[] getParameters() { 
    85         return params; 
    86     } 
    87      
    88     /** 
    89      * Gets the exception that caused the request to fail, if applicable. 
    90      *  
    91      * @return the exception that caused the request to fail, if applicable 
    92      */ 
    93     public Throwable getException() { 
    94         return exception; 
    95     } 
     47    void mailStoreRequestFailed(Throwable exception); 
    9648} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/NetworkMailSender.java

    r616 r617  
    4747                this.connectionHandler = new OutgoingMailConnectionHandler(client); 
    4848                this.connectionHandler.setListener(new MailConnectionHandlerListener() { 
    49                         public void mailConnectionRequestComplete(int type, Object result) { 
    50                                 connectionHandler_mailConnectionRequestComplete(type, result); 
     49                        public void mailConnectionRequestComplete(int type, Object tag, Object result) { 
     50                                connectionHandler_mailConnectionRequestComplete(type, tag, result); 
    5151                        } 
    5252 
    53             public void mailConnectionRequestFailed(int type, Object[] params, Throwable exception) { 
    54                 connectionHandler_mailConnectionRequestFailed(type, params, exception); 
     53            public void mailConnectionRequestFailed(int type, Object tag, Throwable exception) { 
     54                connectionHandler_mailConnectionRequestFailed(type, tag, exception); 
    5555            } 
    5656                }); 
     
    8888         
    8989        public void requestSendMessage(MessageEnvelope envelope, Message message) { 
    90                 connectionHandler.addRequest(OutgoingMailConnectionHandler.REQUEST_SEND_MESSAGE, new Object[] { envelope, message }); 
     90                connectionHandler.addRequest(OutgoingMailConnectionHandler.REQUEST_SEND_MESSAGE, new Object[] { envelope, message }, new Object[] { envelope, message }); 
    9191        } 
    9292         
    93         private void connectionHandler_mailConnectionRequestComplete(int type, Object result) { 
     93        private void connectionHandler_mailConnectionRequestComplete(int type, Object tag, Object result) { 
    9494                Object[] results; 
    9595                switch(type) { 
     
    101101        } 
    102102         
    103         private void connectionHandler_mailConnectionRequestFailed(int type, Object[] params, Throwable exception) { 
     103        private void connectionHandler_mailConnectionRequestFailed(int type, Object tag, Throwable exception) { 
    104104        switch(type) { 
    105105        case OutgoingMailConnectionHandler.REQUEST_SEND_MESSAGE: 
     106            Object[] params = (Object[])tag; 
    106107            fireMessageSendFailed((MessageEnvelope)params[0], (Message)params[1]); 
    107108            break; 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/NetworkMailStore.java

    r616 r617  
    5151                this.connectionHandler = new IncomingMailConnectionHandler(client); 
    5252                this.connectionHandler.setListener(new MailConnectionHandlerListener() { 
    53                         public void mailConnectionRequestComplete(int type, Object result) { 
    54                                 connectionHandler_mailConnectionRequestComplete(type, result); 
     53                        public void mailConnectionRequestComplete(int type, Object tag, Object result) { 
     54                                connectionHandler_mailConnectionRequestComplete(type, tag, result); 
    5555                        } 
    56             public void mailConnectionRequestFailed(int type, Object[] params, Throwable exception) { 
    57                 connectionHandler_mailConnectionRequestFailed(type, params, exception); 
     56            public void mailConnectionRequestFailed(int type, Object tag, Throwable exception) { 
     57                connectionHandler_mailConnectionRequestFailed(type, tag, exception); 
    5858            } 
    5959                }); 
     
    121121        } 
    122122 
    123         public void requestFolderTree() { 
    124                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_FOLDER_TREE, new Object[] { }); 
    125         } 
    126  
    127         public void requestFolderExpunge(FolderTreeItem folder) { 
    128             connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_FOLDER_EXPUNGE, new Object[] { folder }); 
    129         } 
    130          
    131         public void requestFolderStatus(FolderTreeItem[] folders) { 
    132                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_FOLDER_STATUS, new Object[] { folders }); 
    133         } 
    134  
    135         public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex) { 
     123        public void requestFolderTree(MailStoreRequestCallback callback) { 
     124                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_FOLDER_TREE, new Object[] { }, callback); 
     125        } 
     126 
     127        public void requestFolderExpunge(FolderTreeItem folder, MailStoreRequestCallback callback) { 
     128            connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_FOLDER_EXPUNGE, new Object[] { folder }, callback); 
     129        } 
     130         
     131        public void requestFolderStatus(FolderTreeItem[] folders, MailStoreRequestCallback callback) { 
     132                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_FOLDER_STATUS, new Object[] { folders }, callback); 
     133        } 
     134 
     135        public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex, MailStoreRequestCallback callback) { 
    136136                connectionHandler.addRequest( 
    137137                                IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RANGE, 
    138                                 new Object[] { folder, new Integer(firstIndex), new Integer(lastIndex) }); 
    139         } 
    140  
    141         public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens) { 
     138                                new Object[] { folder, new Integer(firstIndex), new Integer(lastIndex) }, 
     139                                callback); 
     140        } 
     141 
     142        public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens, MailStoreRequestCallback callback) { 
    142143                connectionHandler.addRequest( 
    143144                                IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_SET, 
    144                                 new Object[] { folder, messageTokens }); 
    145         } 
    146          
    147         public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly) { 
     145                                new Object[] { folder, messageTokens }, 
     146                                callback); 
     147        } 
     148         
     149        public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly, MailStoreRequestCallback callback) { 
    148150                connectionHandler.addRequest( 
    149151                                IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT, 
    150                                 new Object[] { folder, new Boolean(flagsOnly) }); 
    151         } 
    152          
    153         public void requestMessage(MessageToken messageToken) { 
    154                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE, new Object[] { messageToken }); 
    155         } 
    156  
    157         public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts) { 
    158                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_PARTS, new Object[] { messageToken, messageParts }); 
    159         } 
    160          
    161         public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags) { 
    162                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_DELETE, new Object[] { messageToken, messageFlags }); 
    163         } 
    164  
    165         public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags) { 
     152                                new Object[] { folder, new Boolean(flagsOnly) }, 
     153                                callback); 
     154        } 
     155         
     156        public void requestMessage(MessageToken messageToken, MailStoreRequestCallback callback) { 
     157                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE, new Object[] { messageToken }, callback); 
     158        } 
     159 
     160        public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts, MailStoreRequestCallback callback) { 
     161                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_PARTS, new Object[] { messageToken, messageParts }, callback); 
     162        } 
     163         
     164        public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { 
     165                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_DELETE, new Object[] { messageToken, messageFlags }, callback); 
     166        } 
     167 
     168        public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { 
    166169                if(!client.hasUndelete()) { 
    167170                        throw new UnsupportedOperationException(); 
    168171                } 
    169                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_UNDELETE, new Object[] { messageToken, messageFlags }); 
    170         } 
    171  
    172         public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags) { 
     172                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_UNDELETE, new Object[] { messageToken, messageFlags }, callback); 
     173        } 
     174 
     175        public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { 
    173176                if(!this.hasFlags()) { 
    174177                        throw new UnsupportedOperationException(); 
    175178                } 
    176                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_ANSWERED, new Object[] { messageToken, messageFlags }); 
    177         } 
    178  
    179         public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags) { 
     179                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_ANSWERED, new Object[] { messageToken, messageFlags }, callback); 
     180        } 
     181 
     182        public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags, MailStoreRequestCallback callback) { 
    180183                if(!this.hasAppend()) { 
    181184                        throw new UnsupportedOperationException(); 
    182185                } 
    183                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_APPEND, new Object[] { folder, rawMessage, initialFlags }); 
    184         } 
    185          
    186         public void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder) { 
     186                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_APPEND, new Object[] { folder, rawMessage, initialFlags }, callback); 
     187        } 
     188         
     189        public void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder, MailStoreRequestCallback callback) { 
    187190                if(!this.hasCopy()) { 
    188191                        throw new UnsupportedOperationException(); 
    189192                } 
    190                 connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_COPY, new Object[] { messageToken, destinationFolder }); 
    191         } 
    192          
    193         private void connectionHandler_mailConnectionRequestComplete(int type, Object result) { 
     193                connectionHandler.addRequest(IncomingMailConnectionHandler.REQUEST_MESSAGE_COPY, new Object[] { messageToken, destinationFolder }, callback); 
     194        } 
     195         
     196        private void connectionHandler_mailConnectionRequestComplete(int type, Object result, Object tag) { 
     197        MailStoreRequestCallback callback; 
     198        if(tag instanceof MailStoreRequestCallback) { 
     199            callback = (MailStoreRequestCallback)tag; 
     200        } 
     201        else { 
     202            callback = null; 
     203        } 
     204             
    194205                Object[] results; 
    195206                switch(type) { 
    196207                case IncomingMailConnectionHandler.REQUEST_FOLDER_TREE: 
    197                     fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_TREE); 
     208                    if(callback != null) { callback.mailStoreRequestComplete(); } 
    198209                        fireFolderTreeUpdated((FolderTreeItem)result); 
    199210                        break; 
    200211                case IncomingMailConnectionHandler.REQUEST_FOLDER_EXPUNGE: 
    201                     fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_EXPUNGE); 
     212            if(callback != null) { callback.mailStoreRequestComplete(); } 
    202213                    fireFolderExpunged((FolderTreeItem)result); 
    203214                    break; 
    204215                case IncomingMailConnectionHandler.REQUEST_FOLDER_STATUS: 
    205                     fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_STATUS); 
     216            if(callback != null) { callback.mailStoreRequestComplete(); } 
    206217                        FolderTreeItem[] folders = (FolderTreeItem[])result; 
    207218                        for(int i=0; i<folders.length; i++) { 
     
    210221                        break; 
    211222                case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RANGE: 
    212                     fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_RANGE); 
     223            if(callback != null) { callback.mailStoreRequestComplete(); } 
    213224            results = (Object[])result; 
    214225            fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], false); 
    215226                    break; 
    216227                case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_SET: 
    217                     fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_SET); 
     228            if(callback != null) { callback.mailStoreRequestComplete(); } 
    218229                        results = (Object[])result; 
    219230                        fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], false); 
    220231                        break; 
    221232                case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT: 
    222                     fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_RECENT); 
     233            if(callback != null) { callback.mailStoreRequestComplete(); } 
    223234                        results = (Object[])result; 
    224235                        fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], ((Boolean)results[2]).booleanValue()); 
    225236                        break; 
    226237                case IncomingMailConnectionHandler.REQUEST_MESSAGE: 
    227                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE); 
     238            if(callback != null) { callback.mailStoreRequestComplete(); } 
    228239                        results = (Object[])result; 
    229240                        fireMessageAvailable((MessageToken)results[0], (MimeMessagePart)results[1], (MimeMessageContent[])results[2], null); 
    230241                        break; 
    231242                case IncomingMailConnectionHandler.REQUEST_MESSAGE_PARTS: 
    232                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_PARTS); 
     243            if(callback != null) { callback.mailStoreRequestComplete(); } 
    233244                        results = (Object[])result; 
    234245                        fireMessageContentAvailable((MessageToken)results[0], (MimeMessageContent[])results[1]); 
    235246                        break; 
    236247                case IncomingMailConnectionHandler.REQUEST_MESSAGE_DELETE: 
    237                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_DELETE); 
     248            if(callback != null) { callback.mailStoreRequestComplete(); } 
    238249                        results = (Object[])result; 
    239250                        fireMessageDeleted((MessageToken)results[0], (MessageFlags)results[1]); 
    240251                        break; 
    241252                case IncomingMailConnectionHandler.REQUEST_MESSAGE_UNDELETE: 
    242                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_UNDELETE); 
     253            if(callback != null) { callback.mailStoreRequestComplete(); } 
    243254                        results = (Object[])result; 
    244255                        fireMessageUndeleted((MessageToken)results[0], (MessageFlags)results[1]); 
    245256                        break; 
    246257                case IncomingMailConnectionHandler.REQUEST_MESSAGE_ANSWERED: 
    247                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_ANSWERED); 
     258            if(callback != null) { callback.mailStoreRequestComplete(); } 
    248259                        results = (Object[])result; 
    249260                        fireMessageFlagsChanged((MessageToken)results[0], (MessageFlags)results[1]); 
    250261                        break; 
    251262                case IncomingMailConnectionHandler.REQUEST_MESSAGE_APPEND: 
    252                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_APPEND); 
     263            if(callback != null) { callback.mailStoreRequestComplete(); } 
    253264                        results = (Object[])result; 
    254265                        fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], false); 
    255266                        break; 
    256267                case IncomingMailConnectionHandler.REQUEST_MESSAGE_COPY: 
    257                     fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_COPY); 
    258                         break; 
    259                 } 
    260         } 
    261          
    262         private void connectionHandler_mailConnectionRequestFailed(int type, Object[] params, Throwable exception) { 
    263         switch(type) { 
    264         case IncomingMailConnectionHandler.REQUEST_FOLDER_TREE: 
    265             fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_TREE, params, exception); 
    266             break; 
    267         case IncomingMailConnectionHandler.REQUEST_FOLDER_EXPUNGE: 
    268             fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_EXPUNGE, params, exception); 
    269             break; 
    270         case IncomingMailConnectionHandler.REQUEST_FOLDER_STATUS: 
    271             fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_STATUS, params, exception); 
    272             break; 
    273         case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RANGE: 
    274             fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_MESSAGES_RANGE, params, exception); 
    275             break; 
    276         case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_SET: 
    277             fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_MESSAGES_SET, params, exception); 
    278             break; 
    279         case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT: 
    280             fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_MESSAGES_RECENT, params, exception); 
    281             break; 
    282         case IncomingMailConnectionHandler.REQUEST_MESSAGE: 
    283             fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE, params, exception); 
    284             break; 
    285         case IncomingMailConnectionHandler.REQUEST_MESSAGE_PARTS: 
    286             fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_PARTS, params, exception); 
    287             break; 
    288         case IncomingMailConnectionHandler.REQUEST_MESSAGE_DELETE: 
    289             fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_DELETE, params, exception); 
    290             break; 
    291         case IncomingMailConnectionHandler.REQUEST_MESSAGE_UNDELETE: 
    292             fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_UNDELETE, params, exception); 
    293             break; 
    294         case IncomingMailConnectionHandler.REQUEST_MESSAGE_ANSWERED: 
    295             fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_ANSWERED, params, exception); 
    296             break; 
    297         case IncomingMailConnectionHandler.REQUEST_MESSAGE_APPEND: 
    298             fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_APPEND, params, exception); 
    299             break; 
    300         case IncomingMailConnectionHandler.REQUEST_MESSAGE_COPY: 
    301             fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_COPY, params, exception); 
    302             break; 
    303         } 
     268            if(callback != null) { callback.mailStoreRequestComplete(); } 
     269                        break; 
     270                } 
     271        } 
     272         
     273        private void connectionHandler_mailConnectionRequestFailed(int type, Object tag, Throwable exception) { 
     274        MailStoreRequestCallback callback; 
     275        if(tag instanceof MailStoreRequestCallback) { 
     276            callback = (MailStoreRequestCallback)tag; 
     277        } 
     278        else { 
     279            callback = null; 
     280        } 
     281         
     282        if(callback != null) { callback.mailStoreRequestFailed(exception); } 
    304283        } 
    305284} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/mail/OutgoingMailConnectionHandler.java

    r616 r617  
    4444         * @param type Type identifier for the request. 
    4545         * @param params Parameters for the request. 
     46         * @param tag Tag reference to pass along with the request 
    4647     * @throws IOException on I/O errors 
    4748     * @throws MailException on protocol errors 
    4849         */ 
    49         protected void handleRequest(int type, Object[] params) throws IOException, MailException { 
     50        protected void handleRequest(int type, Object[] params, Object tag) throws IOException, MailException { 
    5051                if(connectionTimerTask != null) { 
    5152                        connectionTimerTask.cancel(); 
     
    5556                case REQUEST_SEND_MESSAGE: 
    5657                        handleRequestSendMessage( 
    57                                         (MessageEnvelope)params[0], (Message)params[1]); 
     58                                        (MessageEnvelope)params[0], (Message)params[1], tag); 
    5859                        break; 
    5960                } 
     
    9495        } 
    9596         
    96         private void handleRequestSendMessage(MessageEnvelope envelope, Message message) throws IOException, MailException { 
     97        private void handleRequestSendMessage(MessageEnvelope envelope, Message message, Object tag) throws IOException, MailException { 
    9798                showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_SEND_MESSAGE)); 
    9899                String messageSource = outgoingClient.sendMessage(envelope, message); 
     
    100101                MailConnectionHandlerListener listener = getListener(); 
    101102                if(messageSource != null && messageSource.length() > 0 && listener != null) { 
    102                         listener.mailConnectionRequestComplete(REQUEST_SEND_MESSAGE, new Object[] { envelope, message, messageSource }); 
     103                        listener.mailConnectionRequestComplete(REQUEST_SEND_MESSAGE, new Object[] { envelope, message, messageSource }, tag); 
    103104                } 
    104105        } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/AccountNode.java

    r616 r617  
    4343import org.logicprobe.LogicMail.mail.MessageToken; 
    4444import org.logicprobe.LogicMail.mail.NetworkMailStore; 
    45 import org.logicprobe.LogicMail.mail.RequestEvent; 
    4645import org.logicprobe.LogicMail.message.FolderMessage; 
    4746import org.logicprobe.LogicMail.message.Message; 
     
    5453import java.util.Hashtable; 
    5554import java.util.Vector; 
    56  
    5755 
    5856/** 
     
    116114 
    117115        this.mailStore.addMailStoreListener(new MailStoreListener() { 
    118             public void mailStoreRequestComplete(RequestEvent e) { 
    119             } 
    120             public void mailStoreRequestFailed(RequestEvent e) { 
    121             } 
    122116            public void folderTreeUpdated(FolderEvent e) { 
    123117                mailStore_FolderTreeUpdated(e); 
  • trunk/LogicMailTests/src/org/logicprobe/LogicMail/mail/NetworkMailStoreTest.java

    r616 r617  
    6363        private FakeIncomingMailClient fakeIncomingMailClient; 
    6464 
    65         private RequestEvent eventMailStoreRequestCompleted; 
    66     private RequestEvent eventMailStoreRequestFailed; 
    6765        private FolderEvent eventFolderTreeUpdated; 
    6866        private Vector eventFolderMessagesAvailable = new Vector(); 
     
    8684 
    8785        instance.addMailStoreListener(new MailStoreListener() { 
    88             public void mailStoreRequestComplete(RequestEvent e) { 
    89                 eventMailStoreRequestCompleted = e; 
    90             } 
    91             public void mailStoreRequestFailed(RequestEvent e) { 
    92                 eventMailStoreRequestFailed = e; 
    93             } 
    9486                        public void folderTreeUpdated(FolderEvent e) { 
    9587                                eventFolderTreeUpdated = e; 
     
    182174    public void testRequestFolderTree() { 
    183175        fakeIncomingMailClient.folderTree = new FolderTreeItem("INBOX", "INBOX", "."); 
    184         instance.requestFolderTree(); 
    185         instance.shutdown(true); 
    186          
    187         assertNotNull(eventMailStoreRequestCompleted); 
    188         assertEquals(RequestEvent.TYPE_FOLDER_TREE, eventMailStoreRequestCompleted.getType()); 
    189         assertNull(eventMailStoreRequestFailed); 
     176        TestCallback callback = new TestCallback(); 
     177        instance.requestFolderTree(callback); 
     178        instance.shutdown(true); 
     179 
     180        assertTrue(callback.completed); 
     181        assertTrue(!callback.failed); 
     182        assertNull(callback.exception); 
    190183         
    191184        assertNotNull(eventFolderTreeUpdated); 
     
    197190        FolderTreeItem folder = new FolderTreeItem("INBOX", "INBOX", "."); 
    198191        folder.setMsgCount(0); 
    199         instance.requestFolderStatus(new FolderTreeItem[] { folder }); 
    200         instance.shutdown(true); 
    201          
    202         assertNotNull(eventMailStoreRequestCompleted); 
    203         assertEquals(RequestEvent.TYPE_FOLDER_STATUS, eventMailStoreRequestCompleted.getType()); 
    204         assertNull(eventMailStoreRequestFailed); 
     192        TestCallback callback = new TestCallback(); 
     193        instance.requestFolderStatus(new FolderTreeItem[] { folder }, callback); 
     194        instance.shutdown(true); 
     195         
     196        assertTrue(callback.completed); 
     197        assertTrue(!callback.failed); 
     198        assertNull(callback.exception); 
    205199         
    206200        assertNotNull(eventFolderStatusChanged); 
     
    215209        }; 
    216210        FolderTreeItem folder = new FolderTreeItem("INBOX", "INBOX", "."); 
    217         instance.requestFolderMessagesRange(folder, 42, 43); 
    218         instance.shutdown(true); 
    219          
    220         assertNotNull(eventMailStoreRequestCompleted); 
    221         assertEquals(RequestEvent.TYPE_FOLDER_MESSAGES_RANGE, eventMailStoreRequestCompleted.getType()); 
    222         assertNull(eventMailStoreRequestFailed); 
     211        TestCallback callback = new TestCallback(); 
     212        instance.requestFolderMessagesRange(folder, 42, 43, callback); 
     213        instance.shutdown(true); 
     214         
     215        assertTrue(callback.completed); 
     216        assertTrue(!callback.failed); 
     217        assertNull(callback.exception); 
    223218         
    224219        // Cannot assume the number of events that will be fired, 
     
    263258        fakeIncomingMailClient.message.putContent(part, content); 
    264259        FakeMessageToken messageToken = new FakeMessageToken(1); 
    265         instance.requestMessage(messageToken); 
    266         instance.shutdown(true); 
    267          
    268         assertNotNull(eventMailStoreRequestCompleted); 
    269         assertEquals(RequestEvent.TYPE_MESSAGE, eventMailStoreRequestCompleted.getType()); 
    270         assertNull(eventMailStoreRequestFailed); 
     260        TestCallback callback = new TestCallback(); 
     261        instance.requestMessage(messageToken, callback); 
     262        instance.shutdown(true); 
     263         
     264        assertTrue(callback.completed); 
     265        assertTrue(!callback.failed); 
     266        assertNull(callback.exception); 
    271267         
    272268        assertNotNull(eventMessageAvailable); 
     
    288284        MessageFlags messageFlags = new MessageFlags(); 
    289285        messageFlags.setDeleted(false); 
    290         instance.requestMessageDelete(messageToken, messageFlags); 
    291         instance.shutdown(true); 
    292          
    293         assertNotNull(eventMailStoreRequestCompleted); 
    294         assertEquals(RequestEvent.TYPE_MESSAGE_DELETE, eventMailStoreRequestCompleted.getType()); 
    295         assertNull(eventMailStoreRequestFailed); 
     286        TestCallback callback = new TestCallback(); 
     287        instance.requestMessageDelete(messageToken, messageFlags, callback); 
     288        instance.shutdown(true); 
     289         
     290        assertTrue(callback.completed); 
     291        assertTrue(!callback.failed); 
     292        assertNull(callback.exception); 
    296293         
    297294        assertNotNull(eventMessageDeleted); 
     
    310307        MessageFlags messageFlags = new MessageFlags(); 
    311308        messageFlags.setDeleted(true); 
    312         instance.requestMessageUndelete(messageToken, messageFlags); 
    313         instance.shutdown(true); 
    314          
    315         assertNotNull(eventMailStoreRequestCompleted); 
    316         assertEquals(RequestEvent.TYPE_MESSAGE_UNDELETE, eventMailStoreRequestCompleted.getType()); 
    317         assertNull(eventMailStoreRequestFailed); 
     309        TestCallback callback = new TestCallback(); 
     310        instance.requestMessageUndelete(messageToken, messageFlags, callback); 
     311        instance.shutdown(true); 
     312         
     313        assertTrue(callback.completed); 
     314        assertTrue(!callback.failed); 
     315        assertNull(callback.exception); 
    318316         
    319317        assertNotNull(eventMessageUndeleted); 
     
    455453        public boolean isLoadable() { return true; } 
    456454        } 
     455         
     456        private class TestCallback implements MailStoreRequestCallback { 
     457            public boolean completed; 
     458            public boolean failed; 
     459            public Throwable exception; 
     460             
     461        public void mailStoreRequestComplete() { 
     462            this.completed = true; 
     463        } 
     464 
     465        public void mailStoreRequestFailed(Throwable exception) { 
     466            this.failed = true; 
     467            this.exception = exception; 
     468        } 
     469        } 
    457470} 
  • trunk/LogicMailTests/src/org/logicprobe/LogicMail/model/AccountNodeTest.java

    r584 r617  
    3535import org.logicprobe.LogicMail.mail.AbstractMailStore; 
    3636import org.logicprobe.LogicMail.mail.FolderTreeItem; 
     37import org.logicprobe.LogicMail.mail.MailStoreRequestCallback; 
    3738import org.logicprobe.LogicMail.mail.MessageToken; 
    3839import org.logicprobe.LogicMail.message.MessageFlags; 
     
    240241                } 
    241242 
    242                 public void requestFolderTree() { 
     243                public void requestFolderTree(MailStoreRequestCallback callback) { 
    243244                        fireFolderTreeUpdated(rootFolder); 
    244245                } 
    245246                 
    246                 public void requestFolderStatus(FolderTreeItem[] folders) { 
     247                public void requestFolderStatus(FolderTreeItem[] folders, MailStoreRequestCallback callback) { 
    247248                        fireFolderStatusChanged(statusUpdatedRootFolder); 
    248249                } 
    249250                 
    250                 public void requestMessage(MessageToken messageToken) { } 
    251                 public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts) { } 
    252                 public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags) { } 
    253                 public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags) { } 
    254                 public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags) { } 
     251                public void requestMessage(MessageToken messageToken, MailStoreRequestCallback callback) { } 
     252                public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts, MailStoreRequestCallback callback) { } 
     253                public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { } 
     254                public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { } 
     255                public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { } 
    255256                public void shutdown(boolean wait) { } 
    256                 public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex) { } 
    257                 public void requestFolderMessagesRecent(FolderTreeItem folder) { } 
    258                 public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags) { } 
    259                 public void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder) { } 
    260                 public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly) { } 
    261                 public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens) { } 
    262         public void requestFolderExpunge(FolderTreeItem folder) { } 
     257                public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex, MailStoreRequestCallback callback) { } 
     258                public void requestFolderMessagesRecent(FolderTreeItem folder, MailStoreRequestCallback callback) { } 
     259                public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags, MailStoreRequestCallback callback) { } 
     260                public void requestMessageCopy(MessageToken messageToken, FolderTreeItem destinationFolder, MailStoreRequestCallback callback) { } 
     261                public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly, MailStoreRequestCallback callback) { } 
     262                public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens, MailStoreRequestCallback callback) { } 
     263        public void requestFolderExpunge(FolderTreeItem folder, MailStoreRequestCallback callback) { } 
    263264    } 
    264265} 
Note: See TracChangeset for help on using the changeset viewer.