pjs/grendel/storage/FolderBase.java

146 строки
4.0 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>, 22 Aug 1997.
*/
package grendel.storage;
import calypso.util.Assert;
import calypso.util.NullJavaEnumeration;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector; // Yes, I want the fully synchronized version.
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Store;
abstract class FolderBase extends Folder implements FolderExtra {
Vector fMessages;
ByteStringTable fTable;
MessageIDTable id_table;
Vector observers = new Vector();
FolderBase(Store s) {
super(s);
fMessages = new Vector();
}
public synchronized Message getMessage(int msgnum) {
ensureLoaded();
return (Message) fMessages.elementAt(msgnum - 1);
}
public synchronized Message[] getMessages() {
ensureLoaded();
Message[] result = new Message[fMessages.size()];
fMessages.copyInto(result);
return result;
}
public synchronized Message[] getMessages(int start,
int end) {
ensureLoaded();
Message[] result = new Message[end - start + 1];
for (int i=start ; i<=end ; i++) {
result[i - start] = (Message) fMessages.elementAt(i - 1);
}
return result;
}
public synchronized Message[] getMessages(int msgnums[]) {
ensureLoaded();
Message[] result = new Message[msgnums.length];
for (int i=msgnums.length - 1 ; i>=0 ; i--) {
result[i] = (Message) fMessages.elementAt(msgnums[i] - 1);
}
return result;
}
void ensureLoaded() {
}
/** Returns the total number of messages in the folder, or -1 if unknown.
This includes deleted and unread messages.
*/
public int getMessageCount() {
if (fMessages == null)
return -1;
else
return fMessages.size();
}
void noticeInitialMessage(Message m) {
fMessages.addElement(m);
// #### How the hell are we supposed to do this?
// m.setMessageNumber(fMessages.size() - 1);
}
ByteStringTable getStringTable() {
if (fTable == null) {
synchronized(this) {
// Check again, making sure a different thread didn't just do this.
if (fTable == null) {
fTable = new ByteStringTable();
}
}
}
return fTable;
}
MessageIDTable getMessageIDTable() {
if (id_table == null) {
synchronized(this) {
// Check again, making sure a different thread didn't just do this.
if (id_table == null) {
id_table = new MessageIDTable();
}
}
}
return id_table;
}
// This is just silly. javamail won't let me call this directly, because
// they protected the method; I have to put this stupid intermediate call in.
void doNotifyMessageChangedListeners(int i, Message message) {
notifyMessageChangedListeners(i, message);
}
static Flags permflags = null;
public Flags getPermanentFlags() {
if (permflags == null) {
Flags result = new Flags();
for (int i=0 ; i < MessageBase.FLAGDEFS.length ; i++) {
if (MessageBase.FLAGDEFS[i].builtin != null)
result.add(MessageBase.FLAGDEFS[i].builtin);
else
result.add(MessageBase.FLAGDEFS[i].non_builtin);
}
permflags = result;
}
return permflags;
}
}