Changeset 617
- Timestamp:
- 01/18/10 22:25:45 (2 years ago)
- Location:
- trunk
- Files:
-
- 13 edited
- 1 moved
-
LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailConnectionHandler.java (modified) (8 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailSender.java (modified) (1 diff)
-
LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailStore.java (modified) (29 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailConnectionHandler.java (modified) (24 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/mail/LocalMailStore.java (modified) (22 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/mail/MailConnectionHandlerListener.java (modified) (2 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/mail/MailStoreListener.java (modified) (1 diff)
-
LogicMail/src/org/logicprobe/LogicMail/mail/MailStoreRequestCallback.java (moved) (moved from trunk/LogicMail/src/org/logicprobe/LogicMail/mail/RequestEvent.java) (1 diff)
-
LogicMail/src/org/logicprobe/LogicMail/mail/NetworkMailSender.java (modified) (3 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/mail/NetworkMailStore.java (modified) (3 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/mail/OutgoingMailConnectionHandler.java (modified) (4 diffs)
-
LogicMail/src/org/logicprobe/LogicMail/model/AccountNode.java (modified) (3 diffs)
-
LogicMailTests/src/org/logicprobe/LogicMail/mail/NetworkMailStoreTest.java (modified) (9 diffs)
-
LogicMailTests/src/org/logicprobe/LogicMail/model/AccountNodeTest.java (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailConnectionHandler.java
r616 r617 163 163 * @param params Parameters passed to the corresponding 164 164 * 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) { 167 168 synchronized(requestQueue) { 168 169 if(!shutdownInProgress) { 169 requestQueue.add(new Object[] {new Integer(type), params });170 requestQueue.add(new Object[] {new Integer(type), params, tag}); 170 171 requestQueue.notifyAll(); 171 172 } … … 260 261 int type = ((Integer)request[0]).intValue(); 261 262 Object[] params = (Object[])request[1]; 263 Object tag = request[2]; 262 264 263 265 // Delegate to subclasses to handle the specific request 264 266 requestInProgress = request; 265 handleRequest(type, params );267 handleRequest(type, params, tag); 266 268 requestInProgress = null; 267 269 … … 285 287 * @param type Type identifier for the request. 286 288 * @param params Parameters for the request. 289 * @param tag Tag reference to pass along with the request 287 290 * @throws IOException on I/O errors 288 291 * @throws MailException on protocol errors 289 292 */ 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; 291 294 292 295 /** … … 297 300 * </p> 298 301 * 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 299 305 * @param exception Exception that was thrown to fail the request, 300 306 * or null if it failed due to a queue flush 301 307 */ 302 protected void handleRequestFailed(int type, Object[] params, Throwable exception) {308 protected void handleRequestFailed(int type, Object[] params, Object tag, Throwable exception) { 303 309 if(this.listener != null) { 304 310 listener.mailConnectionRequestFailed(type, params, exception); … … 532 538 ((Integer)requestInProgress[0]).intValue(), 533 539 (Object[])requestInProgress[1], 540 requestInProgress[2], 534 541 e); 535 542 requestInProgress = null; … … 562 569 ((Integer)requestInProgress[0]).intValue(), 563 570 (Object[])requestInProgress[1], 571 requestInProgress[2], 564 572 e); 565 573 requestInProgress = null; … … 591 599 ((Integer)requestInProgress[0]).intValue(), 592 600 (Object[])requestInProgress[1], 601 requestInProgress[2], 593 602 t); 594 603 requestInProgress = null; … … 610 619 ((Integer)request[0]).intValue(), 611 620 (Object[])request[1], 621 request[2], 612 622 null); 613 623 element = requestQueue.element(); -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailSender.java
r588 r617 74 74 */ 75 75 public abstract void requestSendMessage(MessageEnvelope envelope, Message message); 76 76 77 77 /** 78 78 * Adds a <tt>MailSenderListener</tt> to the mail sender. -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/AbstractMailStore.java
r616 r617 52 52 public abstract class AbstractMailStore { 53 53 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 75 75 /** 76 76 * Returns whether the mail store supports mail folders. … … 90 90 */ 91 91 public abstract boolean hasMessageParts(); 92 92 93 93 /** 94 94 * Returns whether the mail store supports message flags. … … 97 97 */ 98 98 public abstract boolean hasFlags(); 99 99 100 100 /** 101 101 * Returns whether the mail store supports appending messages. … … 104 104 */ 105 105 public abstract boolean hasAppend(); 106 106 107 107 /** 108 108 * Returns whether the mail store supports server-side copying of messages between mailboxes. … … 110 110 * @return True if message copying is supported 111 111 */ 112 public abstract boolean hasCopy();113 112 public abstract boolean hasCopy(); 113 114 114 /** 115 115 * Returns whether the mail store supports undeletion of messages. … … 125 125 */ 126 126 public abstract boolean hasExpunge(); 127 127 128 128 /** 129 129 * Requests the regeneration of the mail folder tree. … … 134 134 * <p>This can be an expensive operation, so it should 135 135 * 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 139 154 /** 140 155 * Requests that a folder be expunged of deleted messages. … … 144 159 * 145 160 * @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 149 177 /** 150 178 * Requests the current message counts of a group of folders. … … 154 182 * 155 183 * @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 159 200 /** 160 201 * Requests the message listing from a particular folder. … … 166 207 * @param firstIndex The index of the first message to get headers for. 167 208 * @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 171 227 /** 172 228 * Requests the message listing from a particular folder. … … 179 235 * @param folder The folder to request a message listing for. 180 236 * @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 184 256 /** 185 257 * Requests the recent message listing from a particular folder. … … 195 267 * @param folder The folder to request a message listing for. 196 268 * @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 200 273 /** 201 274 * Requests the recent message listing from a particular folder. 202 275 * 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> 205 283 * 206 284 * @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. 207 311 */ 208 312 public void requestFolderMessagesRecent(FolderTreeItem folder) { 209 requestFolderMessagesRecent(folder, false);210 } 211 313 requestFolderMessagesRecent(folder, false, null); 314 } 315 212 316 /** 213 317 * Requests a particular message to be loaded. … … 217 321 * 218 322 * @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 222 339 /** 223 340 * Requests a particular message part to be loaded. … … 232 349 * @param messageToken The token used to identify the message 233 350 * @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 237 372 /** 238 373 * Requests a particular message to be deleted. … … 243 378 * @param messageToken The token used to identify the message 244 379 * @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 248 397 /** 249 398 * Requests a particular message to be undeleted. … … 258 407 * @param messageToken The token used to identify the message 259 408 * @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 263 430 /** 264 431 * Requests a particular message to be marked as answered. … … 273 440 * @param messageToken The token used to identify the message 274 441 * @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 278 463 /** 279 464 * Requests a message to be appended to a folder. … … 293 478 * @param rawMessage The raw source of the message to add 294 479 * @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 298 506 /** 299 507 * Requests a message to be copied into a folder on the server-side. … … 312 520 * @param messageToken The token used to identify the message 313 521 * @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 318 547 /** 319 548 * Adds a <tt>MailStoreListener</tt> to the mail store. … … 332 561 listenerList.remove(MailStoreListener.class, l); 333 562 } 334 563 335 564 /** 336 565 * Returns an array of all <tt>MailStoreListener</tt>s … … 360 589 listenerList.remove(FolderListener.class, l); 361 590 } 362 591 363 592 /** 364 593 * Returns an array of all <tt>FolderListener</tt>s … … 389 618 listenerList.remove(MessageListener.class, l); 390 619 } 391 620 392 621 /** 393 622 * Returns an array of all <tt>MessageListener</tt>s … … 400 629 return (MessageListener[])listenerList.getListeners(MessageListener.class); 401 630 } 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 439 632 /** 440 633 * Notifies all registered <tt>MailStoreListener</tt>s that … … 453 646 } 454 647 } 455 648 456 649 /** 457 650 * Notifies all registered <tt>FolderListener</tt>s that … … 489 682 } 490 683 } 491 684 492 685 /** 493 686 * Notifies all registered <tt>FolderListener</tt>s that … … 526 719 } 527 720 } 528 721 529 722 /** 530 723 * Notifies all registered <tt>MessageListener</tt>s that … … 544 737 } 545 738 } 546 739 547 740 /** 548 741 * Notifies all registered <tt>MessageListener</tt>s that … … 562 755 } 563 756 } 564 757 565 758 /** 566 759 * Notifies all registered <tt>MessageListener</tt>s that … … 580 773 } 581 774 } 582 775 583 776 /** 584 777 * Notifies all registered <tt>MessageListener</tt>s that -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailConnectionHandler.java
r616 r617 84 84 * @param type Type identifier for the request. 85 85 * @param params Parameters for the request. 86 * @param tag Tag reference to pass along with the request. 86 87 * @throws IOException on I/O errors 87 88 * @throws MailException on protocol errors 88 89 */ 89 protected void handleRequest(int type, Object[] params ) throws IOException, MailException {90 protected void handleRequest(int type, Object[] params, Object tag) throws IOException, MailException { 90 91 switch(type) { 91 92 case REQUEST_FOLDER_TREE: 92 handleRequestFolderTree( );93 handleRequestFolderTree(tag); 93 94 break; 94 95 case REQUEST_FOLDER_EXPUNGE: 95 handleRequestFolderExpunge((FolderTreeItem)params[0] );96 handleRequestFolderExpunge((FolderTreeItem)params[0], tag); 96 97 break; 97 98 case REQUEST_FOLDER_STATUS: 98 handleRequestFolderStatus((FolderTreeItem[])params[0] );99 handleRequestFolderStatus((FolderTreeItem[])params[0], tag); 99 100 break; 100 101 case REQUEST_FOLDER_MESSAGES_RANGE: … … 102 103 (FolderTreeItem)params[0], 103 104 ((Integer)params[1]).intValue(), 104 ((Integer)params[2]).intValue()); 105 ((Integer)params[2]).intValue(), 106 tag); 105 107 break; 106 108 case REQUEST_FOLDER_MESSAGES_SET: 107 109 handleRequestFolderMessagesSet( 108 110 (FolderTreeItem)params[0], 109 (MessageToken[])params[1]); 111 (MessageToken[])params[1], 112 tag); 110 113 break; 111 114 case REQUEST_FOLDER_MESSAGES_RECENT: 112 115 handleRequestFolderMessagesRecent( 113 (FolderTreeItem)params[0], ((Boolean)params[1]).booleanValue() );116 (FolderTreeItem)params[0], ((Boolean)params[1]).booleanValue(), tag); 114 117 break; 115 118 case REQUEST_MESSAGE: 116 handleRequestMessage((MessageToken)params[0] );119 handleRequestMessage((MessageToken)params[0], tag); 117 120 break; 118 121 case REQUEST_MESSAGE_PARTS: 119 handleRequestMessageParts((MessageToken)params[0], (MimeMessagePart[])params[1] );122 handleRequestMessageParts((MessageToken)params[0], (MimeMessagePart[])params[1], tag); 120 123 break; 121 124 case REQUEST_MESSAGE_DELETE: 122 handleRequestMessageDelete((MessageToken)params[0], (MessageFlags)params[1] );125 handleRequestMessageDelete((MessageToken)params[0], (MessageFlags)params[1], tag); 123 126 break; 124 127 case REQUEST_MESSAGE_UNDELETE: 125 handleRequestMessageUndelete((MessageToken)params[0], (MessageFlags)params[1] );128 handleRequestMessageUndelete((MessageToken)params[0], (MessageFlags)params[1], tag); 126 129 break; 127 130 case REQUEST_MESSAGE_ANSWERED: 128 handleRequestMessageAnswered((MessageToken)params[0], (MessageFlags)params[1] );131 handleRequestMessageAnswered((MessageToken)params[0], (MessageFlags)params[1], tag); 129 132 break; 130 133 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); 132 135 break; 133 136 case REQUEST_MESSAGE_COPY: 134 handleRequestMessageCopy((MessageToken)params[0], (FolderTreeItem)params[1] );137 handleRequestMessageCopy((MessageToken)params[0], (FolderTreeItem)params[1], tag); 135 138 } 136 139 } … … 150 153 addRequest( 151 154 IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT, 152 new Object[] { incomingClient.getActiveFolder() }); 155 new Object[] { incomingClient.getActiveFolder() }, 156 null); 153 157 endIdle = true; 154 158 } … … 177 181 addRequest( 178 182 IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT, 179 new Object[] { incomingClient.getActiveFolder() }); 183 new Object[] { incomingClient.getActiveFolder() }, 184 null); 180 185 } 181 186 else { … … 205 210 } 206 211 207 private void handleRequestFolderTree( ) throws IOException, MailException {212 private void handleRequestFolderTree(Object tag) throws IOException, MailException { 208 213 String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_TREE); 209 214 showStatus(message); … … 212 217 MailConnectionHandlerListener listener = getListener(); 213 218 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 { 219 224 String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_EXPUNGE); 220 225 showStatus(message); … … 224 229 MailConnectionHandlerListener listener = getListener(); 225 230 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 { 231 236 String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_STATUS); 232 237 showStatus(message); … … 235 240 MailConnectionHandlerListener listener = getListener(); 236 241 if(listener != null) { 237 listener.mailConnectionRequestComplete(REQUEST_FOLDER_STATUS, folders );242 listener.mailConnectionRequestComplete(REQUEST_FOLDER_STATUS, folders, tag); 238 243 } 239 244 } … … 244 249 private FolderTreeItem folder; 245 250 private MailConnectionHandlerListener listener; 251 private Object tag; 246 252 private Object param; 247 253 private FolderMessage[] folderMessages; 248 254 private int count; 249 255 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) { 255 261 this.maxCount = maxCount; 256 262 this.type = type; … … 258 264 this.listener = listener; 259 265 this.param = param; 266 this.tag = tag; 260 267 this.count = 0; 261 268 } … … 289 296 if(resultMessages != null) { 290 297 if(param == null) { 291 listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages } );298 listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages }, tag); 292 299 } 293 300 else { 294 listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages, param } );301 listener.mailConnectionRequestComplete(type, new Object[] { folder, resultMessages, param }, tag); 295 302 } 296 303 } … … 300 307 if(folderMessage == null) { 301 308 if(param == null) { 302 listener.mailConnectionRequestComplete(type, new Object[] { folder, null } );309 listener.mailConnectionRequestComplete(type, new Object[] { folder, null }, tag); 303 310 } 304 311 else { 305 listener.mailConnectionRequestComplete(type, new Object[] { folder, null, param } );312 listener.mailConnectionRequestComplete(type, new Object[] { folder, null, param }, tag); 306 313 } 307 314 } … … 310 317 }; 311 318 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 { 313 320 String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_MESSAGES); 314 321 showStatus(message + "..."); … … 321 328 REQUEST_FOLDER_MESSAGES_RANGE, 322 329 folder, 323 getListener() ),330 getListener(), tag), 324 331 getProgressHandler(message)); 325 332 } 326 333 327 private void handleRequestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens ) throws IOException, MailException {334 private void handleRequestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens, Object tag) throws IOException, MailException { 328 335 String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_MESSAGES); 329 336 showStatus(message + "..."); … … 336 343 REQUEST_FOLDER_MESSAGES_SET, 337 344 folder, 338 getListener() ),345 getListener(), tag), 339 346 getProgressHandler(message)); 340 347 } 341 348 342 private void handleRequestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly ) throws IOException, MailException {349 private void handleRequestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly, Object tag) throws IOException, MailException { 343 350 String message = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_FOLDER_MESSAGES); 344 351 showStatus(message + "..."); … … 352 359 folder, 353 360 getListener(), 354 new Boolean(flagsOnly) ),361 new Boolean(flagsOnly), tag), 355 362 getProgressHandler(message)); 356 363 } … … 371 378 } 372 379 373 private void handleRequestMessage(MessageToken messageToken ) throws IOException, MailException {380 private void handleRequestMessage(MessageToken messageToken, Object tag) throws IOException, MailException { 374 381 String statusMessage = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE); 375 382 showStatus(statusMessage); … … 380 387 MailConnectionHandlerListener listener = getListener(); 381 388 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 { 387 394 String statusMessage = resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE); 388 395 showStatus(statusMessage); … … 410 417 MailConnectionHandlerListener listener = getListener(); 411 418 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 { 417 424 showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_DELETE)); 418 425 checkActiveFolder(messageToken); … … 422 429 MailConnectionHandlerListener listener = getListener(); 423 430 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 { 429 436 showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_UNDELETE)); 430 437 checkActiveFolder(messageToken); … … 434 441 MailConnectionHandlerListener listener = getListener(); 435 442 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 { 441 448 showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_ANSWERED)); 442 449 // Replace this with a more general method: … … 448 455 MailConnectionHandlerListener listener = getListener(); 449 456 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 { 455 462 showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_APPEND)); 456 463 // Clean up this interface: … … 462 469 if(listener != null) { 463 470 // 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 { 469 476 showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_MESSAGE_COPY)); 470 477 if(incomingClient.hasCopy()) { … … 476 483 if(listener != null) { 477 484 // 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); 479 486 } 480 487 } -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/LocalMailStore.java
r616 r617 53 53 import org.logicprobe.LogicMail.util.ThreadQueue; 54 54 55 56 55 /** 57 56 * This class manages local mail folders on the device. … … 109 108 110 109 public boolean hasCopy() { 111 // TODO Implement copy for local messages 112 return false; 110 return true; 113 111 } 114 112 … … 121 119 } 122 120 123 public void requestFolderTree( ) {124 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_TREE);121 public void requestFolderTree(MailStoreRequestCallback callback) { 122 if(callback != null) { callback.mailStoreRequestComplete(); } 125 123 fireFolderTreeUpdated(rootFolder); 126 124 } 127 125 128 public void requestFolderExpunge(FolderTreeItem folder ) {126 public void requestFolderExpunge(FolderTreeItem folder, MailStoreRequestCallback callback) { 129 127 FolderTreeItem requestFolder = getMatchingFolderTreeItem(folder.getPath()); 130 128 131 129 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); } 133 134 } 134 135 } 135 136 136 137 private class ExpungeFolderRunnable extends MaildirRunnable { 137 public ExpungeFolderRunnable(FolderTreeItem requestFolder ) {138 super(requestFolder );138 public ExpungeFolderRunnable(FolderTreeItem requestFolder, MailStoreRequestCallback callback) { 139 super(requestFolder, callback); 139 140 } 140 141 … … 153 154 154 155 if(expunged) { 155 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_EXPUNGE);156 if(callback != null) { callback.mailStoreRequestComplete(); } 156 157 fireFolderExpunged(requestFolder); 157 158 } 158 159 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) { 165 166 // Make every entry in the provided array match the local folder 166 167 // objects just in case they do not. Then, fire change events … … 173 174 if (folders[i].getPath().equals(localFolders[j].getPath())) { 174 175 folders[i] = localFolders[j]; 175 176 176 break; 177 177 } … … 179 179 } 180 180 181 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_STATUS);181 if(callback != null) { callback.mailStoreRequestComplete(); } 182 182 for (int i = 0; i < folders.length; i++) { 183 183 fireFolderStatusChanged(folders[i]); … … 185 185 } 186 186 187 public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex ) {187 public void requestFolderMessagesRange(FolderTreeItem folder, int firstIndex, int lastIndex, MailStoreRequestCallback callback) { 188 188 throw new UnsupportedOperationException("Not yet implemented"); 189 189 } 190 190 191 public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens ) {191 public void requestFolderMessagesSet(FolderTreeItem folder, MessageToken[] messageTokens, MailStoreRequestCallback callback) { 192 192 throw new UnsupportedOperationException("Not yet implemented"); 193 193 } 194 194 195 public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly ) {195 public void requestFolderMessagesRecent(FolderTreeItem folder, boolean flagsOnly, MailStoreRequestCallback callback) { 196 196 // The flagsOnly parameter has no effect on local mail stores, 197 197 // and it is not likely to ever be called on them anyways. … … 199 199 200 200 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); } 202 205 } 203 206 } 204 207 205 208 private class RequestFolderMessagesRecentRunnable extends MaildirRunnable { 206 public RequestFolderMessagesRecentRunnable(FolderTreeItem requestFolder ) {207 super(requestFolder );209 public RequestFolderMessagesRecentRunnable(FolderTreeItem requestFolder, MailStoreRequestCallback callback) { 210 super(requestFolder, callback); 208 211 } 209 212 … … 221 224 222 225 if(folderMessages != null) { 223 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_RECENT);226 if(callback != null) { callback.mailStoreRequestComplete(); } 224 227 fireFolderMessagesAvailable(requestFolder, folderMessages, false); 225 228 } 226 229 else { 227 fireMailStoreRequestFailed(RequestEvent.TYPE_FOLDER_MESSAGES_RECENT, new Object[] { requestFolder }, throwable);230 if(callback != null) { callback.mailStoreRequestFailed(throwable); } 228 231 } 229 232 } 230 233 } 231 234 232 public void requestMessage(MessageToken messageToken ) {235 public void requestMessage(MessageToken messageToken, MailStoreRequestCallback callback) { 233 236 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 234 237 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 235 238 236 239 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); } 238 244 } 239 245 } … … 242 248 private LocalMessageToken localMessageToken; 243 249 244 public RequestMessageRunnable(FolderTreeItem requestFolder, LocalMessageToken localMessageToken ) {245 super(requestFolder );250 public RequestMessageRunnable(FolderTreeItem requestFolder, LocalMessageToken localMessageToken, MailStoreRequestCallback callback) { 251 super(requestFolder, callback); 246 252 this.localMessageToken = localMessageToken; 247 253 } … … 273 279 274 280 if(message != null && messageSource != null) { 275 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE);281 if(callback != null) { callback.mailStoreRequestComplete(); } 276 282 fireMessageAvailable(localMessageToken, message.getStructure(), message.getAllContent(), messageSource); 277 283 } 278 284 else { 279 fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE, new Object[] { localMessageToken }, throwable);285 if(callback != null) { callback.mailStoreRequestFailed(throwable); } 280 286 } 281 287 } 282 288 } 283 289 284 public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts ) {290 public void requestMessageParts(MessageToken messageToken, MimeMessagePart[] messageParts, MailStoreRequestCallback callback) { 285 291 throw new UnsupportedOperationException(); 286 292 } 287 293 288 public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags ) {294 public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags, MailStoreRequestCallback callback) { 289 295 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 290 296 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); … … 293 299 MessageFlags newFlags = copyMessageFlags(messageFlags); 294 300 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) { 300 309 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 301 310 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); … … 304 313 MessageFlags newFlags = copyMessageFlags(messageFlags); 305 314 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) { 311 323 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 312 324 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); … … 315 327 MessageFlags newFlags = copyMessageFlags(messageFlags); 316 328 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); } 318 333 } 319 334 } … … 322 337 private LocalMessageToken localMessageToken; 323 338 private MessageFlags messageFlags; 324 private int requestType;325 339 326 340 public UpdateMessageFlagsRunnable( … … 328 342 LocalMessageToken localMessageToken, 329 343 MessageFlags messageFlags, 330 int requestType) {331 super(requestFolder );344 MailStoreRequestCallback callback) { 345 super(requestFolder, callback); 332 346 this.localMessageToken = localMessageToken; 333 347 this.messageFlags = messageFlags; 334 this.requestType = requestType;335 348 } 336 349 … … 351 364 352 365 if(success) { 353 fireMailStoreRequestComplete(requestType);366 if(callback != null) { callback.mailStoreRequestComplete(); } 354 367 } 355 368 else { 356 fireMailStoreRequestFailed(requestType, new Object[] { localMessageToken, messageFlags }, throwable);357 } 358 369 if(callback != null) { callback.mailStoreRequestFailed(throwable); } 370 } 371 359 372 if(flagsUpdated) { 360 373 fireMessageFlagsChanged(localMessageToken, messageFlags); … … 363 376 } 364 377 365 public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags ) {378 public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags, MailStoreRequestCallback callback) { 366 379 FolderTreeItem requestFolder = getMatchingFolderTreeItem(folder.getPath()); 367 380 368 381 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); } 370 386 } 371 387 } … … 375 391 private MessageFlags initialFlags; 376 392 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); 379 395 this.rawMessage = rawMessage; 380 396 this.initialFlags = initialFlags; … … 394 410 395 411 if(folderMessage != null) { 396 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_APPEND);412 if(callback != null) { callback.mailStoreRequestComplete(); } 397 413 fireFolderMessagesAvailable(requestFolder, new FolderMessage[] { folderMessage }, false); 398 414 } 399 415 else { 400 fireMailStoreRequestFailed(RequestEvent.TYPE_MESSAGE_APPEND, new Object[] { requestFolder, rawMessage, initialFlags }, throwable);416 if(callback != null) { callback.mailStoreRequestFailed(throwable); } 401 417 } 402 418 } … … 406 422 * @see org.logicprobe.LogicMail.mail.AbstractMailStore#requestMessageCopy(org.logicprobe.LogicMail.mail.MessageToken, org.logicprobe.LogicMail.mail.FolderTreeItem) 407 423 */ 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 } 410 478 } 411 479 … … 434 502 protected FolderTreeItem requestFolder; 435 503 protected MaildirFolder maildirFolder; 504 protected MailStoreRequestCallback callback; 436 505 437 public MaildirRunnable(FolderTreeItem requestFolder ) {506 public MaildirRunnable(FolderTreeItem requestFolder, MailStoreRequestCallback callback) { 438 507 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; 461 510 } 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; 462 537 } 463 538 -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MailConnectionHandlerListener.java
r616 r617 42 42 * @param type The type of the request. 43 43 * @param result The data returned from the request. 44 * @param tag Tag reference to pass along with the request 44 45 */ 45 public void mailConnectionRequestComplete(int type, Object result );46 public void mailConnectionRequestComplete(int type, Object result, Object tag); 46 47 47 48 /** … … 49 50 * 50 51 * @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 52 53 * @param exception The exception that caused the request to fail, if applicable. 53 54 */ 54 public void mailConnectionRequestFailed(int type, Object [] params, Throwable exception);55 public void mailConnectionRequestFailed(int type, Object tag, Throwable exception); 55 56 } -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MailStoreListener.java
r616 r617 38 38 */ 39 39 public interface MailStoreListener extends EventListener { 40 /**41 * Invoked when a mail store request is completed.42 *43 * @param e the event data44 */45 void mailStoreRequestComplete(RequestEvent e);46 47 /**48 * Invoked when a mail store request fails.49 *50 * @param e the event data51 */52 void mailStoreRequestFailed(RequestEvent e);53 54 40 /** 55 41 * Invoked when the folder tree is updated. -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MailStoreRequestCallback.java
r616 r617 32 32 33 33 /** 34 * Object for mail store request events.34 * Callback interface for mail store requests. 35 35 */ 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; 36 public interface MailStoreRequestCallback { 37 /** 38 * Invoked when the mail store request is completed. 39 */ 40 void mailStoreRequestComplete(); 54 41 55 42 /** 56 * Creates a new instance of MessageEvent.43 * Invoked when the mail store request fails. 57 44 * 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 62 46 */ 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); 96 48 } -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/NetworkMailSender.java
r616 r617 47 47 this.connectionHandler = new OutgoingMailConnectionHandler(client); 48 48 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); 51 51 } 52 52 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); 55 55 } 56 56 }); … … 88 88 89 89 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 }); 91 91 } 92 92 93 private void connectionHandler_mailConnectionRequestComplete(int type, Object result) {93 private void connectionHandler_mailConnectionRequestComplete(int type, Object tag, Object result) { 94 94 Object[] results; 95 95 switch(type) { … … 101 101 } 102 102 103 private void connectionHandler_mailConnectionRequestFailed(int type, Object [] params, Throwable exception) {103 private void connectionHandler_mailConnectionRequestFailed(int type, Object tag, Throwable exception) { 104 104 switch(type) { 105 105 case OutgoingMailConnectionHandler.REQUEST_SEND_MESSAGE: 106 Object[] params = (Object[])tag; 106 107 fireMessageSendFailed((MessageEnvelope)params[0], (Message)params[1]); 107 108 break; -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/NetworkMailStore.java
r616 r617 51 51 this.connectionHandler = new IncomingMailConnectionHandler(client); 52 52 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); 55 55 } 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); 58 58 } 59 59 }); … … 121 121 } 122 122 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) { 136 136 connectionHandler.addRequest( 137 137 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) { 142 143 connectionHandler.addRequest( 143 144 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) { 148 150 connectionHandler.addRequest( 149 151 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) { 166 169 if(!client.hasUndelete()) { 167 170 throw new UnsupportedOperationException(); 168 171 } 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) { 173 176 if(!this.hasFlags()) { 174 177 throw new UnsupportedOperationException(); 175 178 } 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) { 180 183 if(!this.hasAppend()) { 181 184 throw new UnsupportedOperationException(); 182 185 } 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) { 187 190 if(!this.hasCopy()) { 188 191 throw new UnsupportedOperationException(); 189 192 } 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 194 205 Object[] results; 195 206 switch(type) { 196 207 case IncomingMailConnectionHandler.REQUEST_FOLDER_TREE: 197 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_TREE);208 if(callback != null) { callback.mailStoreRequestComplete(); } 198 209 fireFolderTreeUpdated((FolderTreeItem)result); 199 210 break; 200 211 case IncomingMailConnectionHandler.REQUEST_FOLDER_EXPUNGE: 201 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_EXPUNGE); 212 if(callback != null) { callback.mailStoreRequestComplete(); } 202 213 fireFolderExpunged((FolderTreeItem)result); 203 214 break; 204 215 case IncomingMailConnectionHandler.REQUEST_FOLDER_STATUS: 205 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_STATUS); 216 if(callback != null) { callback.mailStoreRequestComplete(); } 206 217 FolderTreeItem[] folders = (FolderTreeItem[])result; 207 218 for(int i=0; i<folders.length; i++) { … … 210 221 break; 211 222 case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RANGE: 212 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_RANGE); 223 if(callback != null) { callback.mailStoreRequestComplete(); } 213 224 results = (Object[])result; 214 225 fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], false); 215 226 break; 216 227 case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_SET: 217 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_SET); 228 if(callback != null) { callback.mailStoreRequestComplete(); } 218 229 results = (Object[])result; 219 230 fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], false); 220 231 break; 221 232 case IncomingMailConnectionHandler.REQUEST_FOLDER_MESSAGES_RECENT: 222 fireMailStoreRequestComplete(RequestEvent.TYPE_FOLDER_MESSAGES_RECENT); 233 if(callback != null) { callback.mailStoreRequestComplete(); } 223 234 results = (Object[])result; 224 235 fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], ((Boolean)results[2]).booleanValue()); 225 236 break; 226 237 case IncomingMailConnectionHandler.REQUEST_MESSAGE: 227 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE); 238 if(callback != null) { callback.mailStoreRequestComplete(); } 228 239 results = (Object[])result; 229 240 fireMessageAvailable((MessageToken)results[0], (MimeMessagePart)results[1], (MimeMessageContent[])results[2], null); 230 241 break; 231 242 case IncomingMailConnectionHandler.REQUEST_MESSAGE_PARTS: 232 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_PARTS); 243 if(callback != null) { callback.mailStoreRequestComplete(); } 233 244 results = (Object[])result; 234 245 fireMessageContentAvailable((MessageToken)results[0], (MimeMessageContent[])results[1]); 235 246 break; 236 247 case IncomingMailConnectionHandler.REQUEST_MESSAGE_DELETE: 237 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_DELETE); 248 if(callback != null) { callback.mailStoreRequestComplete(); } 238 249 results = (Object[])result; 239 250 fireMessageDeleted((MessageToken)results[0], (MessageFlags)results[1]); 240 251 break; 241 252 case IncomingMailConnectionHandler.REQUEST_MESSAGE_UNDELETE: 242 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_UNDELETE); 253 if(callback != null) { callback.mailStoreRequestComplete(); } 243 254 results = (Object[])result; 244 255 fireMessageUndeleted((MessageToken)results[0], (MessageFlags)results[1]); 245 256 break; 246 257 case IncomingMailConnectionHandler.REQUEST_MESSAGE_ANSWERED: 247 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_ANSWERED); 258 if(callback != null) { callback.mailStoreRequestComplete(); } 248 259 results = (Object[])result; 249 260 fireMessageFlagsChanged((MessageToken)results[0], (MessageFlags)results[1]); 250 261 break; 251 262 case IncomingMailConnectionHandler.REQUEST_MESSAGE_APPEND: 252 fireMailStoreRequestComplete(RequestEvent.TYPE_MESSAGE_APPEND); 263 if(callback != null) { callback.mailStoreRequestComplete(); } 253 264 results = (Object[])result; 254 265 fireFolderMessagesAvailable((FolderTreeItem)results[0], (FolderMessage[])results[1], false); 255 266 break; 256 267 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); } 304 283 } 305 284 } -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/OutgoingMailConnectionHandler.java
r616 r617 44 44 * @param type Type identifier for the request. 45 45 * @param params Parameters for the request. 46 * @param tag Tag reference to pass along with the request 46 47 * @throws IOException on I/O errors 47 48 * @throws MailException on protocol errors 48 49 */ 49 protected void handleRequest(int type, Object[] params ) throws IOException, MailException {50 protected void handleRequest(int type, Object[] params, Object tag) throws IOException, MailException { 50 51 if(connectionTimerTask != null) { 51 52 connectionTimerTask.cancel(); … … 55 56 case REQUEST_SEND_MESSAGE: 56 57 handleRequestSendMessage( 57 (MessageEnvelope)params[0], (Message)params[1] );58 (MessageEnvelope)params[0], (Message)params[1], tag); 58 59 break; 59 60 } … … 94 95 } 95 96 96 private void handleRequestSendMessage(MessageEnvelope envelope, Message message ) throws IOException, MailException {97 private void handleRequestSendMessage(MessageEnvelope envelope, Message message, Object tag) throws IOException, MailException { 97 98 showStatus(resources.getString(LogicMailResource.MAILCONNECTION_REQUEST_SEND_MESSAGE)); 98 99 String messageSource = outgoingClient.sendMessage(envelope, message); … … 100 101 MailConnectionHandlerListener listener = getListener(); 101 102 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); 103 104 } 104 105 } -
trunk/LogicMail/src/org/logicprobe/LogicMail/model/AccountNode.java
r616 r617 43 43 import org.logicprobe.LogicMail.mail.MessageToken; 44 44 import org.logicprobe.LogicMail.mail.NetworkMailStore; 45 import org.logicprobe.LogicMail.mail.RequestEvent;46 45 import org.logicprobe.LogicMail.message.FolderMessage; 47 46 import org.logicprobe.LogicMail.message.Message; … … 54 53 import java.util.Hashtable; 55 54 import java.util.Vector; 56 57 55 58 56 /** … … 116 114 117 115 this.mailStore.addMailStoreListener(new MailStoreListener() { 118 public void mailStoreRequestComplete(RequestEvent e) {119 }120 public void mailStoreRequestFailed(RequestEvent e) {121 }122 116 public void folderTreeUpdated(FolderEvent e) { 123 117 mailStore_FolderTreeUpdated(e); -
trunk/LogicMailTests/src/org/logicprobe/LogicMail/mail/NetworkMailStoreTest.java
r616 r617 63 63 private FakeIncomingMailClient fakeIncomingMailClient; 64 64 65 private RequestEvent eventMailStoreRequestCompleted;66 private RequestEvent eventMailStoreRequestFailed;67 65 private FolderEvent eventFolderTreeUpdated; 68 66 private Vector eventFolderMessagesAvailable = new Vector(); … … 86 84 87 85 instance.addMailStoreListener(new MailStoreListener() { 88 public void mailStoreRequestComplete(RequestEvent e) {89 eventMailStoreRequestCompleted = e;90 }91 public void mailStoreRequestFailed(RequestEvent e) {92 eventMailStoreRequestFailed = e;93 }94 86 public void folderTreeUpdated(FolderEvent e) { 95 87 eventFolderTreeUpdated = e; … … 182 174 public void testRequestFolderTree() { 183 175 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); 190 183 191 184 assertNotNull(eventFolderTreeUpdated); … … 197 190 FolderTreeItem folder = new FolderTreeItem("INBOX", "INBOX", "."); 198 191 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); 205 199 206 200 assertNotNull(eventFolderStatusChanged); … … 215 209 }; 216 210 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); 223 218 224 219 // Cannot assume the number of events that will be fired, … … 263 258 fakeIncomingMailClient.message.putContent(part, content); 264 259 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); 271 267 272 268 assertNotNull(eventMessageAvailable); … … 288 284 MessageFlags messageFlags = new MessageFlags(); 289 285 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); 296 293 297 294 assertNotNull(eventMessageDeleted); … … 310 307 MessageFlags messageFlags = new MessageFlags(); 311 308 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); 318 316 319 317 assertNotNull(eventMessageUndeleted); … … 455 453 public boolean isLoadable() { return true; } 456 454 } 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 } 457 470 } -
trunk/LogicMailTests/src/org/logicprobe/LogicMail/model/AccountNodeTest.java
r584 r617 35 35 import org.logicprobe.LogicMail.mail.AbstractMailStore; 36 36 import org.logicprobe.LogicMail.mail.FolderTreeItem; 37 import org.logicprobe.LogicMail.mail.MailStoreRequestCallback; 37 38 import org.logicprobe.LogicMail.mail.MessageToken; 38 39 import org.logicprobe.LogicMail.message.MessageFlags; … … 240 241 } 241 242 242 public void requestFolderTree( ) {243 public void requestFolderTree(MailStoreRequestCallback callback) { 243 244 fireFolderTreeUpdated(rootFolder); 244 245 } 245 246 246 public void requestFolderStatus(FolderTreeItem[] folders ) {247 public void requestFolderStatus(FolderTreeItem[] folders, MailStoreRequestCallback callback) { 247 248 fireFolderStatusChanged(statusUpdatedRootFolder); 248 249 } 249 250 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) { } 255 256 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) { } 263 264 } 264 265 }
Note: See TracChangeset
for help on using the changeset viewer.
