Changeset 581
- Timestamp:
- 12/30/09 13:22:16 (2 years ago)
- Location:
- trunk/LogicMail/src/org/logicprobe/LogicMail/mail
- Files:
-
- 2 edited
-
LocalMailStore.java (modified) (4 diffs)
-
MaildirFolder.java (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/LocalMailStore.java
r579 r581 112 112 113 113 public boolean hasUndelete() { 114 return false;114 return true; 115 115 } 116 116 … … 182 182 public void requestMessage(MessageToken messageToken) { 183 183 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 184 185 184 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 186 185 187 if(requestFolder != null && requestFolder != null) {186 if(requestFolder != null) { 188 187 threadQueue.invokeLater(new RequestMessageRunnable(requestFolder, localMessageToken)); 189 188 } … … 230 229 231 230 public void requestMessageDelete(MessageToken messageToken, MessageFlags messageFlags) { 232 throw new UnsupportedOperationException("Not yet implemented"); 231 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 232 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 233 234 if(requestFolder != null && !messageFlags.isDeleted()) { 235 MessageFlags newFlags = copyMessageFlags(messageFlags); 236 newFlags.setDeleted(true); 237 threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags)); 238 } 233 239 } 234 240 235 241 public void requestMessageUndelete(MessageToken messageToken, MessageFlags messageFlags) { 236 throw new UnsupportedOperationException("Not yet implemented"); 242 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 243 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 244 245 if(requestFolder != null && messageFlags.isDeleted()) { 246 MessageFlags newFlags = copyMessageFlags(messageFlags); 247 newFlags.setDeleted(false); 248 threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags)); 249 } 237 250 } 238 251 239 252 public void requestMessageAnswered(MessageToken messageToken, MessageFlags messageFlags) { 240 throw new UnsupportedOperationException("Not yet implemented"); 241 } 242 253 LocalMessageToken localMessageToken = (LocalMessageToken)messageToken; 254 FolderTreeItem requestFolder = getMatchingFolderTreeItem(localMessageToken.getFolderPath()); 255 256 if(requestFolder != null && !messageFlags.isAnswered()) { 257 MessageFlags newFlags = copyMessageFlags(messageFlags); 258 newFlags.setAnswered(true); 259 threadQueue.invokeLater(new UpdateMessageFlagsRunnable(requestFolder, localMessageToken, newFlags)); 260 } 261 } 262 263 private class UpdateMessageFlagsRunnable extends MaildirRunnable { 264 private LocalMessageToken localMessageToken; 265 private MessageFlags messageFlags; 266 267 public UpdateMessageFlagsRunnable( 268 FolderTreeItem requestFolder, 269 LocalMessageToken localMessageToken, 270 MessageFlags messageFlags) { 271 super(requestFolder); 272 this.localMessageToken = localMessageToken; 273 this.messageFlags = messageFlags; 274 } 275 276 public void run() { 277 boolean flagsUpdated = false; 278 try { 279 maildirFolder.open(); 280 flagsUpdated = maildirFolder.setMessageFlags(localMessageToken, messageFlags); 281 maildirFolder.close(); 282 } catch (IOException e) { 283 System.err.println("Unable to read folder: " + e.toString()); 284 } 285 286 if(flagsUpdated) { 287 fireMessageFlagsChanged(localMessageToken, messageFlags); 288 } 289 } 290 } 291 243 292 public void requestMessageAppend(FolderTreeItem folder, String rawMessage, MessageFlags initialFlags) { 244 293 FolderTreeItem requestFolder = getMatchingFolderTreeItem(folder.getPath()); … … 333 382 } 334 383 } 384 385 private static MessageFlags copyMessageFlags(MessageFlags sourceFlags) { 386 return new MessageFlags( 387 sourceFlags.isSeen(), 388 sourceFlags.isAnswered(), 389 sourceFlags.isFlagged(), 390 sourceFlags.isDeleted(), 391 sourceFlags.isDraft(), 392 sourceFlags.isRecent(), 393 sourceFlags.isJunk()); 394 } 335 395 } -
trunk/LogicMail/src/org/logicprobe/LogicMail/mail/MaildirFolder.java
r407 r581 325 325 } 326 326 327 // Get the filename unique id prefix, and shortcut out if not found 328 String uniqueId = localMessageToken.getMessageUid(); 329 if(uniqueId == null) { 330 return null; 331 } 332 333 // Find the file matching the unique id, and shortcut out if not found 334 String matchingFile; 335 Enumeration e = fileConnection.list(uniqueId + '*', false); 336 if(e.hasMoreElements()) { 337 matchingFile = (String)e.nextElement(); 338 } 339 else { 340 return null; 341 } 327 String matchingFile = getFileForToken(localMessageToken); 328 if(matchingFile == null) { return null; } 342 329 343 330 // Open the file, and read its contents … … 382 369 return buf.toString(); 383 370 } 384 371 385 372 /** 386 373 * Appends a message to the maildir. … … 407 394 String uniqueId = buf.toString(); 408 395 409 buf.append("_2,"); 410 if(initialFlags.isAnswered()) { buf.append('R'); } 411 if(initialFlags.isDeleted()) { buf.append('T'); } 412 if(initialFlags.isDraft()) { buf.append('D'); } 413 if(initialFlags.isFlagged()) { buf.append('F'); } 414 if(initialFlags.isSeen()) { buf.append('S'); } 396 appendFlagsToBuffer(buf, initialFlags); 415 397 416 398 if (EventLogger.getMinimumLevel() >= EventLogger.DEBUG_INFO) { … … 465 447 return result; 466 448 } 449 450 /** 451 * Sets the flags of an existing message. 452 * 453 * @param localMessageToken The token for the message to set flags for 454 * @param messageFlags The flags to set 455 * @return True if message flags were updated, false otherwise 456 */ 457 public boolean setMessageFlags(LocalMessageToken localMessageToken, MessageFlags messageFlags) throws IOException { 458 if (EventLogger.getMinimumLevel() >= EventLogger.DEBUG_INFO) { 459 EventLogger.logEvent(AppInfo.GUID, 460 ("setMessageFlags(): " + localMessageToken.getMessageUid()).getBytes(), 461 EventLogger.DEBUG_INFO); 462 } 463 if(fileConnection == null) { 464 throw new IOException("Maildir not open"); 465 } 466 467 // Get the current filename 468 String messageFilename = getFileForToken(localMessageToken); 469 if(messageFilename == null) { return false; } 470 471 // Create the new filename, and verify that it is different 472 StringBuffer buf = new StringBuffer(); 473 buf.append(localMessageToken.getMessageUid()); 474 appendFlagsToBuffer(buf, messageFlags); 475 String updatedFilename = buf.toString(); 476 if(messageFilename.equals(updatedFilename)) { return false; } 477 478 FileConnection mailFileConnection = 479 (FileConnection)Connector.open(fileConnection.getURL() + '/' + messageFilename); 480 if(mailFileConnection.exists() && !mailFileConnection.isDirectory() && mailFileConnection.canRead()) { 481 mailFileConnection.rename(updatedFilename); 482 return true; 483 } 484 else { 485 return false; 486 } 487 } 488 489 /** 490 * Get the filename matching a message token. 491 * 492 * @param localMessageToken Token to find the file for 493 * @return Filename if found, or null if not found 494 */ 495 private String getFileForToken(LocalMessageToken localMessageToken) throws IOException { 496 // Get the filename unique id prefix, and shortcut out if not found 497 String uniqueId = localMessageToken.getMessageUid(); 498 if(uniqueId == null) { 499 return null; 500 } 501 502 // Find the file matching the unique id, and shortcut out if not found 503 String matchingFile; 504 Enumeration e = fileConnection.list(uniqueId + '*', false); 505 if(e.hasMoreElements()) { 506 matchingFile = (String)e.nextElement(); 507 } 508 else { 509 return null; 510 } 511 return matchingFile; 512 } 513 514 private static void appendFlagsToBuffer(StringBuffer buf, MessageFlags messageFlags) { 515 buf.append("_2,"); 516 if(messageFlags.isAnswered()) { buf.append('R'); } 517 if(messageFlags.isDeleted()) { buf.append('T'); } 518 if(messageFlags.isDraft()) { buf.append('D'); } 519 if(messageFlags.isFlagged()) { buf.append('F'); } 520 if(messageFlags.isSeen()) { buf.append('S'); } 521 } 467 522 }
Note: See TracChangeset
for help on using the changeset viewer.
