in geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/main/java/org/apache/geronimo/mail/store/imap/IMAPFolder.java [2129:2208]
public boolean handleResponse(IMAPUntaggedResponse response) {
// "you've got mail". The message count has been updated. There
// are two posibilities. Either there really are new messages, or
// this is an update following an expunge. If there are new messages,
// we need to update the message cache and broadcast the change to
// any listeners.
if (response.isKeyword("EXISTS")) {
// we need to update our cache, and also retrieve the new messages and
// send them out in a broadcast update.
int oldCount = maxSequenceNumber;
maxSequenceNumber = ((IMAPSizeResponse)response).getSize();
// has the size grown? We have to send the "you've got mail" announcement.
if (oldCount < maxSequenceNumber) {
try {
Message[] messages = getMessages(oldCount + 1, maxSequenceNumber);
notifyMessageAddedListeners(messages);
} catch (MessagingException e) {
// should never happen in this context
}
}
return true;
}
// "you had mail". A message was expunged from the server. This MUST
// be processed immediately, as any subsequent expunge messages will
// shift the message numbers as a result of previous messages getting
// removed. We need to keep our internal cache in sync with the server.
else if (response.isKeyword("EXPUNGE")) {
int messageNumber = ((IMAPSizeResponse)response).getSize();
try {
Message message = expungeMessage(messageNumber);
// broadcast the message update.
notifyMessageRemovedListeners(false, new Message[] {message});
} catch (MessagingException e) {
}
// we handled this one.
return true;
}
// just an update of recently arrived stuff? Just update the field.
else if (response.isKeyword("RECENT")) {
recentMessages = ((IMAPSizeResponse)response).getSize();
return true;
}
// The spec is not particularly clear what types of unsolicited
// FETCH response can be sent. The only one that is specifically
// spelled out is flag updates. If this is one of those, then
// handle it.
else if (response.isKeyword("FETCH")) {
IMAPFetchResponse fetch = (IMAPFetchResponse)response;
IMAPFlags flags = (IMAPFlags)fetch.getDataItem(IMAPFetchDataItem.FLAGS);
// if this is a flags response, get the message and update
if (flags != null) {
try {
// get the updated message and update the internal state.
IMAPMessage message = (IMAPMessage)getMessage(fetch.sequenceNumber);
// this shouldn't happen, but it might have been expunged too.
if (message != null) {
message.updateMessageInformation(fetch);
}
notifyMessageChangedListeners(MessageChangedEvent.FLAGS_CHANGED, message);
} catch (MessagingException e) {
}
return true;
}
}
// this is a BYE response on our connection. This forces us to close, but
// when we return the connection, the pool needs to get rid of it.
else if (response.isKeyword("BYE")) {
// this is essentially a close event. We need to clean everything up
// and make sure our connection is not returned to the general pool.
try {
cleanupFolder(false, true);
} catch (MessagingException e) {
}
return true;
}
// not a response the folder knows how to deal with.
return false;
}