зеркало из https://github.com/mozilla/gecko-dev.git
266 строки
6.8 KiB
Java
266 строки
6.8 KiB
Java
/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License
|
|
* Version 1.0 (the "License"); you may not use this file except in
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS"
|
|
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
|
* the License for the specific language governing rights and limitations
|
|
* under the License.
|
|
*
|
|
* The Original Code is the Grendel mail/news client.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
|
* Corporation. Portions created by Netscape are Copyright (C) 1997
|
|
* Netscape Communications Corporation. All Rights Reserved.
|
|
*
|
|
* Created: Terry Weissman <terry@netscape.com>, 24 Nov 1997.
|
|
*/
|
|
|
|
package grendel.storage;
|
|
|
|
import calypso.util.Assert;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
|
|
import java.util.Date;
|
|
|
|
import javax.activation.DataHandler;
|
|
|
|
import javax.mail.Flags;
|
|
import javax.mail.IllegalWriteException;
|
|
import javax.mail.MessagingException;
|
|
import javax.mail.internet.InternetHeaders;
|
|
|
|
class PopMessage extends MessageReadOnly implements MessageExtra {
|
|
InternetHeaders headers;
|
|
String uidl;
|
|
boolean deletedValid;
|
|
boolean deleted;
|
|
boolean recentValid;
|
|
boolean recent = true;
|
|
MessageExtraWrapper extra = null;
|
|
|
|
|
|
PopMessage(PopFolder f, int num) {
|
|
super(f, num);
|
|
}
|
|
|
|
protected InternetHeaders getHeadersObj()
|
|
throws MessagingException
|
|
{
|
|
if (headers == null) {
|
|
synchronized(this) {
|
|
if (headers == null) {
|
|
PopStore store = (PopStore) folder.getStore();
|
|
InputStream stream = store.sendTopOrRetr(msgnum, 0);
|
|
headers = new InternetHeaders(stream);
|
|
try {
|
|
while (stream.read() >= 0) {
|
|
// Spin until we've sucked out all data, so that we know
|
|
// the socket is back into a known state.
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return headers;
|
|
}
|
|
|
|
protected MessageExtra getExtra() {
|
|
if (extra == null) {
|
|
synchronized(this) {
|
|
if (extra == null) {
|
|
extra = new MessageExtraWrapper(this);
|
|
}
|
|
}
|
|
}
|
|
return extra;
|
|
}
|
|
|
|
|
|
public Date getReceivedDate() throws MessagingException {
|
|
return getSentDate(); // What else can we do???
|
|
}
|
|
|
|
public Flags getFlags() throws MessagingException {
|
|
Flags result = new Flags();
|
|
if (isRecent()) result.add(new Flags(Flags.Flag.RECENT));
|
|
if (isDeleted()) result.add(new Flags(Flags.Flag.DELETED));
|
|
return result;
|
|
}
|
|
|
|
public boolean isSet(Flags.Flag flag) throws MessagingException {
|
|
if (flag == Flags.Flag.RECENT) {
|
|
return (isRecent());
|
|
} else if (flag == Flags.Flag.DELETED) {
|
|
return (isDeleted());
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void setFlags(Flags flags, boolean flag) throws MessagingException {
|
|
loadFlags();
|
|
|
|
Flags.Flag list[] = flags.getSystemFlags();
|
|
|
|
for (int i = 0; i < list.length; i++) {
|
|
if (list[i] == Flags.Flag.RECENT) {
|
|
recent = flag;
|
|
recentValid = true;
|
|
} else if (list[i] == Flags.Flag.DELETED) {
|
|
deleted = flag;
|
|
deletedValid = true;
|
|
} else {
|
|
throw new IllegalWriteException("Can't change flag " + list[i] +
|
|
" on message " + this);
|
|
}
|
|
}
|
|
|
|
if (flags.getUserFlags().length > 0) {
|
|
throw new IllegalWriteException("Can't change user flags on message " +
|
|
this);
|
|
}
|
|
}
|
|
|
|
public void writeTo(OutputStream outputStream) throws MessagingException {
|
|
Assert.NotYetImplemented("PopMessage.writeTo");
|
|
}
|
|
|
|
public void saveChanges() throws MessagingException {
|
|
}
|
|
|
|
public int getSize() throws MessagingException {
|
|
return -1;
|
|
}
|
|
|
|
public int getLineCount() throws MessagingException {
|
|
return -1;
|
|
}
|
|
|
|
public InputStream getInputStreamWithHeaders() throws MessagingException {
|
|
PopStore store = (PopStore) folder.getStore();
|
|
return store.sendRetr(msgnum);
|
|
}
|
|
|
|
|
|
|
|
public DataHandler getDataHandler() {
|
|
return null;
|
|
}
|
|
|
|
public Object getContent() {
|
|
return null;
|
|
}
|
|
|
|
|
|
public String getAuthor() throws MessagingException {
|
|
return getExtra().getAuthor();
|
|
}
|
|
|
|
/** The name of the recipient of this message (not this email address). */
|
|
public String getRecipient() throws MessagingException {
|
|
return getExtra().getRecipient();
|
|
}
|
|
|
|
/** The subject, minus any "Re:" part. */
|
|
public String simplifiedSubject() throws MessagingException {
|
|
return getExtra().simplifiedSubject();
|
|
}
|
|
|
|
/** Whether the subject has a "Re:" part." */
|
|
public boolean subjectIsReply() throws MessagingException {
|
|
return getExtra().subjectIsReply();
|
|
}
|
|
|
|
/** A short rendition of the sent date. */
|
|
public String simplifiedDate() throws MessagingException {
|
|
return getExtra().simplifiedDate();
|
|
}
|
|
|
|
/** A unique object representing the message-id for this message. */
|
|
public Object getMessageID() throws MessagingException {
|
|
return getExtra().getMessageID();
|
|
}
|
|
|
|
/** A list of the above messageid objects that this message has references
|
|
to. */
|
|
public Object[] messageThreadReferences() throws MessagingException {
|
|
return getExtra().messageThreadReferences();
|
|
}
|
|
|
|
protected void loadFlags() {
|
|
// ### Write me!!!
|
|
}
|
|
|
|
public boolean isRead() {
|
|
return false;
|
|
}
|
|
public void setIsRead(boolean value) {
|
|
}
|
|
public boolean isReplied() {
|
|
return false;
|
|
}
|
|
public void setReplied(boolean value) {
|
|
}
|
|
public boolean isForwarded() {
|
|
return false;
|
|
}
|
|
public void setForwarded(boolean value) {
|
|
}
|
|
public boolean isFlagged() {
|
|
return false;
|
|
}
|
|
public void setFlagged(boolean value) {
|
|
}
|
|
public boolean isDeleted() throws MessagingException {
|
|
if (!deletedValid) {
|
|
String state = getStateValue();
|
|
deleted = state != null && state.equals(PopFolder.DELETED);
|
|
deletedValid = true;
|
|
}
|
|
return deleted;
|
|
}
|
|
public void setDeleted(boolean value) {
|
|
deletedValid = true;
|
|
deleted = value;
|
|
}
|
|
|
|
public boolean isRecent() throws MessagingException {
|
|
if (!recentValid) {
|
|
recent = (getStateValue() == null);
|
|
recentValid = true;
|
|
}
|
|
return recent;
|
|
}
|
|
public void setRecent(boolean value) {
|
|
recentValid = true;
|
|
recent = value;
|
|
}
|
|
|
|
protected String getStateValue() throws MessagingException {
|
|
return ((PopFolder)folder).getStateValueForMessage(this);
|
|
}
|
|
|
|
public String getUidl() throws MessagingException {
|
|
if (uidl == null) {
|
|
synchronized(this) {
|
|
if (uidl == null) {
|
|
((PopFolder)folder).setUidlForMessage(this);
|
|
}
|
|
}
|
|
}
|
|
return uidl;
|
|
}
|
|
|
|
synchronized public void setUidl(String u) {
|
|
uidl = u;
|
|
}
|
|
}
|