POP3Folder.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:7k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2.  * POP3Folder.java
  3.  * Copyright (C) 1999 dog <dog@dog.net.uk>
  4.  * 
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  * 
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  * 
  19.  * You may retrieve the latest version of this library from
  20.  * http://www.dog.net.uk/knife/
  21.  */
  22. package dog.mail.pop3;
  23. import java.io.*;
  24. import java.util.*;
  25. import javax.mail.*;
  26. import javax.mail.event.*;
  27. /**
  28.  * The folder class implementing the POP3 mail protocol.
  29.  *
  30.  * @author dog@dog.net.uk
  31.  * @version 1.1
  32.  */
  33. public class POP3Folder extends Folder {
  34. Hashtable messages = new Hashtable();
  35. boolean readonly = false, open = false;
  36. int type;
  37. Folder inbox;
  38. /**
  39.  * Constructor.
  40.  */
  41. protected POP3Folder(Store store, int type) {
  42. super(store);
  43. this.type = type;
  44. }
  45. /**
  46.  * Returns the name of this folder.
  47.  */
  48. public String getName() {
  49. switch (type) {
  50.   case HOLDS_FOLDERS:
  51. return "/";
  52.   case HOLDS_MESSAGES:
  53. return "INBOX";
  54.   default:
  55. return "(Unknown)";
  56. }
  57. }
  58. /**
  59.  * Returns the full name of this folder.
  60.  */
  61. public String getFullName() {
  62. return getName();
  63. }
  64. /**
  65.  * Returns the type of this folder.
  66.  * @exception MessagingException if a messaging error occurred
  67.  */
  68. public int getType() throws MessagingException {
  69. return type;
  70. }
  71. /**
  72.  * Indicates whether this folder exists.
  73.  * @exception MessagingException if a messaging error occurred
  74.  */
  75. public boolean exists() throws MessagingException {
  76. return (type==HOLDS_MESSAGES);
  77. }
  78. /**
  79.  * Indicates whether this folder contains new messages.
  80.  * @exception MessagingException if a messaging error occurred
  81.  */
  82. public boolean hasNewMessages() throws MessagingException {
  83. return getNewMessageCount()>0;
  84. }
  85. /**
  86.  * Opens this folder.
  87.  * @exception MessagingException if a messaging error occurred
  88.  */
  89. public void open(int mode) throws MessagingException {
  90. switch (mode) {
  91.   case READ_WRITE:
  92. readonly = false;
  93. break;
  94.   case READ_ONLY:
  95. readonly = true;
  96. break;
  97. }
  98. open = true;
  99. notifyConnectionListeners(ConnectionEvent.OPENED);
  100. }
  101. /**
  102.  * Closes this folder.
  103.  * @param expunge if the folder is to be expunged before it is closed
  104.  * @exception MessagingException if a messaging error occurred
  105.  */
  106. public void close(boolean expunge) throws MessagingException {
  107. if (!open)
  108. throw new MessagingException("Folder is not open");
  109. if (expunge)
  110. expunge();
  111. open = false;
  112. notifyConnectionListeners(ConnectionEvent.CLOSED);
  113. }
  114. /**
  115.  * Expunges this folder.
  116.  * This deletes all the messages marked as deleted.
  117.  * @exception MessagingException if a messaging error occurred
  118.  */
  119. public Message[] expunge() throws MessagingException {
  120. if (!open)
  121. throw new MessagingException("Folder is not open");
  122. if (readonly)
  123. throw new MessagingException("Folder was opened read-only");
  124.         Vector vector = new Vector();
  125. for (Enumeration enum = messages.elements(); enum.hasMoreElements(); ) {
  126.             Message message = (Message)enum.nextElement();
  127. Flags flags = message.getFlags();
  128. if (flags.contains(Flags.Flag.DELETED))
  129. vector.addElement(message);
  130. }
  131. Message[] delete = new Message[vector.size()]; vector.copyInto(delete);
  132. for (int i=0; i<delete.length; i++)
  133. ((POP3Store)store).delete(delete[i].getMessageNumber());
  134.         messages.clear();
  135. return delete;
  136. }
  137. /**
  138.  * Indicates whether this folder is open.
  139.  */
  140. public boolean isOpen() {
  141. return open;
  142. }
  143. /**
  144.  * Returns the permanent flags for this folder.
  145.  */
  146. public Flags getPermanentFlags() { return new Flags(); }
  147. /**
  148.  * Returns the number of messages in this folder.
  149.  * This results in a STAT call to the POP3 server, so the latest
  150.  * count is always delivered.
  151.  * @exception MessagingException if a messaging error occurred
  152.  */
  153. public int getMessageCount() throws MessagingException {
  154. return ((POP3Store)store).getMessageCount();
  155. }
  156. /**
  157.  * Returns the specified message number from this folder.
  158.  * The message is only retrieved once from the server.
  159.  * Subsequent getMessage() calls to the same message are cached.
  160.  * Since POP3 does not provide a mechanism for retrieving only part of
  161.  * the message (headers, etc), the entire message is retrieved.
  162.  * @exception MessagingException if a messaging error occurred
  163.  */
  164. public Message getMessage(int msgnum) throws MessagingException {
  165. if (!open)
  166. throw new MessagingException("Folder is not open");
  167. Message message = (Message)messages.get(new Integer(msgnum));
  168. if (message==null) {
  169. message = ((POP3Store)store).getMessage(this, msgnum);
  170. messages.put(new Integer(msgnum), message);
  171. }
  172. return message;
  173. }
  174. /**
  175.  * You can't append messages to a POP3 folder.
  176.  */
  177. public void appendMessages(Message amessage[]) throws MessagingException {
  178. throw new MessagingException("Can't append messages to a POP3 folder");
  179. }
  180. /**
  181.  * Does nothing.
  182.  * The messages <i>must</i> be fetched in their entirety by getMessage(int) -
  183.  * this is the nature of the POP3 protocol.
  184.  * @exception MessagingException ignore
  185.  */
  186. public void fetch(Message amessage[], FetchProfile fetchprofile) throws MessagingException {
  187. }
  188. /**
  189.  * Returns the subfolders for this folder.
  190.  */
  191. public Folder[] list() throws MessagingException {
  192. switch (type) {
  193.   case HOLDS_FOLDERS:
  194. if (inbox==null) inbox = new POP3Folder(store, HOLDS_MESSAGES);
  195. Folder[] folders = { inbox };
  196. return folders;
  197.   default:
  198. throw new MessagingException("This folder can't contain subfolders");
  199. }
  200. }
  201. /**
  202.  * Returns the subfolders for this folder.
  203.  */
  204. public Folder[] list(String pattern) throws MessagingException {
  205. return list();
  206. }
  207. /**
  208.  * POP3 folders can't have parents.
  209.  */
  210. public Folder getParent() throws MessagingException {
  211. switch (type) {
  212.   case HOLDS_MESSAGES:
  213. return ((POP3Store)store).root;
  214.   default:
  215. throw new MessagingException("Root folders can't have a parent");
  216. }
  217. }
  218. /**
  219.  * POP3 folders can't contain subfolders.
  220.  */
  221. public Folder getFolder(String s) throws MessagingException {
  222. switch (type) {
  223.   case HOLDS_FOLDERS:
  224. if (inbox==null) inbox = new POP3Folder(store, HOLDS_MESSAGES);
  225. return inbox;
  226.   default:
  227. throw new MessagingException("This folder can't contain subfolders");
  228. }
  229. }
  230. /**
  231.  * Returns the path separator charcter.
  232.  */
  233. public char getSeparator() throws MessagingException {
  234. return 'u0000';
  235. }
  236. // -- These must be overridden to throw exceptions --
  237. /**
  238.  * POP3 folders can't be created, deleted, or renamed.
  239.  */
  240. public boolean create(int i) throws MessagingException {
  241. throw new MessagingException("Folder can't be created");
  242. }
  243. /**
  244.  * POP3 folders can't be created, deleted, or renamed.
  245.  */
  246. public boolean delete(boolean flag) throws MessagingException {
  247. throw new MessagingException("Folder can't be deleted");
  248. }
  249. /**
  250.  * POP3 folders can't be created, deleted, or renamed.
  251.  */
  252. public boolean renameTo(Folder folder) throws MessagingException {
  253. throw new MessagingException("Folder can't be renamed");
  254. }
  255. }