📄 nntpstore.java
字号:
throw new MessagingException("unexpected server response: "+response); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } // Returns the content for an article. synchronized byte[] getContent(Article article) throws MessagingException { String mid = article.messageId; if (mid==null) { Newsgroup group = (Newsgroup)article.getFolder(); if (!current.equals(group)) open(group); mid = Integer.toString(article.getMessageNumber()); } try { send("BODY "+mid); switch (getResponse()) { case ARTICLE_RETRIEVED_BODY: boolean debug = session.getDebug(); if (debug) System.out.println("DEBUG: nntp: retrieving body"); int max = fetchsize, len; byte b[] = new byte[max]; MessageInputStream min = new MessageInputStream(in, debug); ByteArrayOutputStream bout = new ByteArrayOutputStream(); while ((len = min.read(b, 0, max))!=-1) bout.write(b, 0, len); if (debug) System.out.println("DEBUG: nntp: done retrieving body"); return bout.toByteArray(); case NO_GROUP_SELECTED: throw new MessagingException("No group selected"); case NO_ARTICLE_SELECTED: throw new MessagingException("No article selected"); case NO_SUCH_ARTICLE_IN_GROUP: throw new MessagingException("No such article in group"); case NO_SUCH_ARTICLE: throw new MessagingException("No such article"); case SERVER_ERROR: if (response.toLowerCase().indexOf("timeout")>-1) { close(); connect(); return getContent(article); } default: throw new MessagingException("unexpected server response: "+response); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } /** * Post an article. * @param article the article * @param addresses the addresses to post to. * @exception MessagingException if a messaging exception occurred or there were no newsgroup recipients */ public void postArticle(Message article, Address[] addresses) throws MessagingException { Vector v = new Vector(); for (int i=0; i<addresses.length; i++) { // get unique newsgroup addresses if (addresses[i] instanceof NewsAddress && !v.contains(addresses[i])) v.addElement(addresses[i]); } NewsAddress[] a = new NewsAddress[v.size()]; v.copyInto(a); if (a.length==0) throw new MessagingException("No newsgroups specified as recipients"); for (int i=0; i<a.length; i++) post(article, a[i]); } // Posts an article to the specified newsgroup. synchronized void post(Message article, NewsAddress address) throws MessagingException { String group = address.getNewsgroup(); try { send("POST"); switch (getResponse()) { case SEND_ARTICLE: if (session.getDebug()) article.writeTo(System.out); MessageOutputStream mout = new MessageOutputStream(out); article.writeTo(mout); out.write("\n.\n".getBytes()); out.flush(); switch (getResponse()) { case ARTICLE_POSTED: break; case POSTING_FAILED: throw new MessagingException("Posting failed: "+response); default: throw new MessagingException(response); } break; case POSTING_NOT_ALLOWED: throw new MessagingException("Posting not allowed"); case POSTING_FAILED: throw new MessagingException("Posting failed"); case SERVER_ERROR: if (response.toLowerCase().indexOf("timeout")>-1) { connect(); post(article, address); break; } default: throw new MessagingException("unexpected server response: "+response); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } // Attempts to discover which newsgroups exist and which articles have been read. void readNewsrc() { try { File newsrc = new File(System.getProperty("user.home")+File.separator+".newsrc-"+getHostName()); if (!newsrc.exists()) newsrc = new File(System.getProperty("user.home")+File.separator+".newsrc"); BufferedReader reader = new BufferedReader(new FileReader(newsrc)); String line; while ((line = reader.readLine())!=null) { StringTokenizer st = new StringTokenizer(line, ":!", true); try { String name = st.nextToken(); Newsgroup group = new Newsgroup(this, name); group.subscribed = ":".equals(st.nextToken()); if (st.hasMoreTokens()) group.newsrcline = st.nextToken().trim(); newsgroups.put(name, group); } catch (NoSuchElementException e) {} } } catch (FileNotFoundException e) { } catch (IOException e) { } catch (SecurityException e) { // not allowed to read file } } // Returns the newsgroups available in this store via the specified listing command. Newsgroup[] getNewsgroups(String command, boolean retry) throws MessagingException { Vector vector = new Vector(); try { send(command); switch (getResponse()) { case LISTING: String line; for (line=in.readLine(); line!=null && !".".equals(line); line = in.readLine()) { StringTokenizer st = new StringTokenizer(line, " "); String name = st.nextToken(); int last = Integer.parseInt(st.nextToken()); int first = Integer.parseInt(st.nextToken()); boolean posting = ("y".equals(st.nextToken().toLowerCase())); Newsgroup group = (Newsgroup)getFolder(name); group.first = first; group.last = last; group.postingAllowed = posting; vector.addElement(group); } break; case SERVER_ERROR: if (!retry) { if (response.toLowerCase().indexOf("timeout")>-1) { close(); connect(); return getNewsgroups(command, true); } else return getNewsgroups("LIST", false); // backward compatibility with rfc977 } default: throw new MessagingException(command+" failed: "+response); } } catch (IOException e) { throw new MessagingException(command+" failed", e); } catch (NumberFormatException e) { throw new MessagingException(command+" failed", e); } Newsgroup[] groups = new Newsgroup[vector.size()]; vector.copyInto(groups); return groups; } // Returns the articles for a newsgroup. Article[] getArticles(Newsgroup newsgroup) throws MessagingException { try { return getOverview(newsgroup); } catch (MessagingException e) { // try rfc977 return getNewArticles(newsgroup, new Date(0L)); } } /** * Returns the newsgroups added to this store since the specified date. * @exception MessagingException if a messaging error occurred */ Newsgroup[] getNewFolders(Date date) throws MessagingException { String datetime = getDateTimeString(date); Vector vector = new Vector(); try { send("NEWGROUPS "+datetime); switch (getResponse()) { case LISTING_NEW: String line; for (line=in.readLine(); line!=null && !".".equals(line); line = in.readLine()) { StringTokenizer st = new StringTokenizer(line, " "); String name = st.nextToken(); int last = Integer.parseInt(st.nextToken()); int first = Integer.parseInt(st.nextToken()); boolean posting = ("y".equals(st.nextToken().toLowerCase())); Newsgroup group = (Newsgroup)getFolder(name); group.first = first; group.last = last; group.postingAllowed = posting; vector.addElement(group); } break; default: throw new MessagingException("Listing failed: "+response); } } catch (IOException e) { throw new MessagingException("Listing failed", e); } catch (NumberFormatException e) { throw new MessagingException("Listing failed", e); } Newsgroup[] groups = new Newsgroup[vector.size()]; vector.copyInto(groups); return groups; } // Returns the articles added to the specified newsgroup since the specified date. Article[] getNewArticles(Newsgroup newsgroup, Date date) throws MessagingException { String command = "NEWNEWS "+newsgroup.getName()+" "+getDateTimeString(date); Vector vector = new Vector(); try { send(command); switch (getResponse()) { case LISTING_ARTICLES: String line; for (line=in.readLine(); line!=null && !".".equals(line); line = in.readLine()) { Message article = getArticle(newsgroup, line); vector.addElement(article); } break; default: throw new MessagingException(command+" failed: "+response); } } catch (IOException e) { throw new MessagingException(command+" failed", e); } catch (NumberFormatException e) { throw new MessagingException(command+" failed", e); } Article[] articles = new Article[vector.size()]; vector.copyInto(articles); return articles; } // Returns a GMT date-time formatted string for the specified date, // suitable as an argument to NEWGROUPS and NEWNEWS commands. String getDateTimeString(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTimeZone(TimeZone.getTimeZone("GMT")); calendar.setTime(date); StringBuffer buffer = new StringBuffer(); int field; String ZERO = "0"; // leading zero field = calendar.get(Calendar.YEAR)%100; buffer.append((field<10) ? ZERO+field : Integer.toString(field)); field = calendar.get(Calendar.MONTH)+1; buffer.append((field<10) ? ZERO+field : Integer.toString(field)); field = calendar.get(Calendar.DAY_OF_MONTH); buffer.append((field<10) ? ZERO+field : Integer.toString(field)); buffer.append(" "); field = calendar.get(Calendar.HOUR_OF_DAY); buffer.append((field<10) ? ZERO+field : Integer.toString(field)); field = calendar.get(Calendar.MINUTE); buffer.append((field<10) ? ZERO+field : Integer.toString(field)); field = calendar.get(Calendar.SECOND); buffer.append((field<10) ? ZERO+field : Integer.toString(field)); buffer.append(" GMT"); return buffer.toString(); } /** * Returns the root folder. */ public Folder getDefaultFolder() throws MessagingException { synchronized (this) { if (root==null) root = new Root(this); } return root; } /** * Returns the newsgroup with the specified name. */ public Folder getFolder(String name) throws MessagingException { return getNewsgroup(name); } /** * Returns the newsgroup specified as part of a URLName. */ public Folder getFolder(URLName urlname) throws MessagingException { String group = urlname.getFile(); int hashIndex = group.indexOf('#'); if (hashIndex>-1) group = group.substring(0, hashIndex); return getNewsgroup(group); } Newsgroup getNewsgroup(String name) { Newsgroup newsgroup = (Newsgroup)newsgroups.get(name); if (newsgroup==null) { newsgroup = new Newsgroup(this, name); newsgroups.put(name, newsgroup); } return newsgroup; } // Returns the article with the specified message-id for the newsgroup. Article getArticle(Newsgroup newsgroup, String mid) throws MessagingException { Article article = (Article)articles.get(mid); if (article==null) { article = new Article(newsgroup, mid); articles.put(mid, article); } return article; } // -- NNTP extensions -- int[] getArticleNumbers(Newsgroup newsgroup) throws MessagingException { String command = "LISTGROUP "+newsgroup.getName(); Vector vector = new Vector(); synchronized (this) { try { send(command); switch (getResponse()) { case GROUP_SELECTED: String line; for (line=in.readLine(); line!=null && !".".equals(line); line = in.readLine()) { vector.addElement(line); } break; case NO_GROUP_SELECTED: case PERMISSION_DENIED: default: throw new MessagingException(command+" failed: "+response); } } catch (IOException e) { throw new MessagingException(command+" failed", e); } catch (NumberFormatException e) { throw new MessagingException(command+" failed", e); } } int[] numbers = new int[vector.size()]; for (int i=0; i<numbers.length; i++) numbers[i] = Integer.parseInt((String)vector.elementAt(i)); return numbers; } private String[] overviewFormat, strippedOverviewFormat; String[] getOverviewFormat(boolean strip) throws MessagingException { if (overviewFormat==null) { String command = "LIST OVERVIEW.FMT"; synchronized (this) { Vector vector = new Vector(), vector2 = new Vector(); try { send(command); switch (getResponse()) { case LISTING: String line; for (line=in.readLine(); line!=null && !".".equals(line); line = in.readLine()) { vector.addElement(line); vector2.addElement(line.substring(0, line.indexOf(':'))); } break; case SERVER_ERROR: default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -