Guest User

Untitled

a guest
Feb 20th, 2010
1,051
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.44 KB | None | 0 0
  1. package droidnewz;
  2.  
  3. import java.io.*;
  4. import java.net.*;
  5. import java.lang.StringBuffer;
  6.  
  7. public class NNTPclient {
  8.  
  9.     private Socket nntpClient;
  10.     private Boolean requiresLogin;
  11.     private Boolean postingAllowed;
  12.     private String userName;
  13.     private String passWord;
  14.     private String hostName;
  15.     private int port;
  16.     private SocketAddress sockAdd;
  17.     private int connectTimeoutMs;
  18.     BufferedReader in = null;
  19.     InputStreamReader isr;
  20.     private OutputStream nntpWriter;
  21.     private InputStream nntpReader;
  22.     private byte[] buffer;
  23.     private final int BUFFER_SIZE = 4 * 1024; //4KB
  24.  
  25.     NNTPclient() {
  26.  
  27.         loadConfig();
  28.         try {
  29.             InetAddress addr = InetAddress.getByName(hostName);
  30.             sockAdd = new InetSocketAddress(addr, port);
  31.             nntpClient = new Socket();
  32.             nntpClient.connect(sockAdd, connectTimeoutMs);
  33.  
  34.  
  35.             nntpReader = nntpClient.getInputStream();
  36.  
  37.             nntpWriter = nntpClient.getOutputStream();
  38.             buffer = new byte[BUFFER_SIZE];
  39.  
  40.             isr = new InputStreamReader(nntpReader, "UTF-8");
  41.  
  42.             in = new BufferedReader(isr);
  43.  
  44.  
  45.  
  46.             NNTPresponse currentRes = getResponse(null);
  47.  
  48.             if ((currentRes.Code != 200) && (currentRes.Code != 201)) {
  49.                 disconnect();
  50.                 throw new UnknownHostException(currentRes.Info);
  51.             }
  52.             if (currentRes.Code == 200) {
  53.                 postingAllowed = true;
  54.             } else {
  55.                 postingAllowed = false;
  56.             }
  57.  
  58.             if (requiresLogin) {
  59.                 Authenticate(userName, passWord);
  60.             }
  61.  
  62.         } catch (UnknownHostException e) {
  63.  
  64.             System.out.print(e.toString());
  65.  
  66.         } catch (SocketTimeoutException e) {
  67.  
  68.             System.out.print(e.toString());
  69.  
  70.         } catch (IOException e) {
  71.  
  72.             System.out.print(e.toString());
  73.  
  74.         }
  75.  
  76.     }
  77.  
  78.     protected void finalize() {
  79.         disconnect();
  80.     }
  81.  
  82.     Boolean isConnected() {
  83.         return nntpClient.isConnected();
  84.     }
  85.  
  86.     private void loadConfig() {
  87.         //This is where XML Settings load should go
  88.         requiresLogin = true;
  89.         hostName = "news.astraweb.com";
  90.         port = 119;
  91.         userName = "yhnujm";
  92.         passWord = "i1bxl5ao";
  93.         connectTimeoutMs = 2000;
  94.  
  95.     }
  96.  
  97.     public void selectGroup(String group) {
  98.         NNTPresponse res = getResponse("GROUP " + group);
  99.         if (res.Code != 211) {
  100.             //Throw Exception
  101.             }
  102.     }
  103.  
  104.     public void DownloadBody2(String articleID, File f) {
  105.         NNTPresponse res = readLine("BODY <" + articleID + ">");
  106.  
  107.         //  StringBuffer Body = new StringBuffer(512 * 1024);
  108.         byte[] newLine = new byte[2];
  109.         newLine[0] = 13;
  110.         newLine[1] = 10;
  111.         int iRx = 0;
  112.         Boolean Done = false;
  113.         String response;
  114.         if (res.Code != 222) {
  115.             //Problem handle
  116.             }
  117.  
  118.         try {
  119.             in.readLine(); //read off CR/LF
  120.             FileOutputStream fw = new FileOutputStream(f);
  121.             while (!Done) {
  122.                 response = in.readLine();
  123.  
  124.                 if (response.equals(".")) {
  125.                     Done = true;
  126.                 }
  127.  
  128.                 if (response.startsWith("..")) {
  129.                 }//response = response.substring(1, response.length());
  130.  
  131.                 iRx += response.length();
  132.                 fw.write(response.getBytes(), 0, response.length());
  133.                 fw.write(newLine, 0, 2);
  134.  
  135.             }
  136.             // System.out.print(new String(Buffer,0, iRx - 5));
  137.  
  138.  
  139.  
  140.             fw.close();
  141.  
  142.  
  143.         } catch (Exception e) {
  144.             //TODO handle exception
  145.             System.out.print(e.toString());
  146.             int o = 1;
  147.         }
  148.  
  149.  
  150.     }
  151.  
  152.     public void DownloadBody3(String articleID, File f) {
  153.         NNTPresponse res = readLine("BODY <" + articleID + ">");
  154.  
  155.         //  StringBuffer Body = new StringBuffer(512 * 1024);
  156.         byte[] newLine = {13, 10};
  157.         int iRx = 0;
  158.         byte[] b = new byte[5];
  159.  
  160.         Boolean Done = false;
  161.  
  162.         if (res.Code != 222) {
  163.             //Problem handle
  164.             }
  165.  
  166.         try {
  167.             nntpReader.read(newLine, 0, 2); //read off first crlf
  168.             FileOutputStream fw = new FileOutputStream(f);
  169.             while (!Done) {
  170.  
  171.                 nntpReader.read(b, 0, 1);
  172.  
  173.                 if (b[0] == 13) {
  174.                     nntpReader.read(b, 1, 4);
  175.                     if (b[1] == 10 && b[2] == 46 && b[3] == 13 && b[4] == 10) { //If \r\n.\r\n ... the end of the file has been reached.
  176.                         Done = true;
  177.                         fw.write(b, 0, 2);
  178.                     } else if ((b[1] == 10) && (b[2] == 46) && (b[3] == 46)) //If the beginning of the line has two dots, remove one.
  179.                     {
  180.                        fw.write(b, 0, 1);
  181.                        fw.write(b, 1, 1);
  182.                         fw.write(b, 2, 1);
  183.                        fw.write(b, 4, 1);
  184.                         // fw.write(b, 0, 5);
  185.                     } else {
  186.                         fw.write(b, 0, 5); //CR with no other special chars
  187.                     }
  188.                 } else {
  189.                     fw.write(b, 0, 1);
  190.                 }
  191.  
  192.               //  
  193.             }
  194. fw.flush();
  195.             fw.close();
  196.  
  197.  
  198.         } catch (Exception e) {
  199.             //TODO handle exception
  200.             System.out.print(e.toString());
  201.             int o = 1;
  202.         }
  203.  
  204.  
  205.     }
  206.  
  207.     public void DownloadBody(String articleID, File f) {
  208.         NNTPresponse res = readLine("BODY <" + articleID + ">");
  209.  
  210.         //  StringBuffer Body = new StringBuffer(512 * 1024);
  211.         byte[] newLine = {13, 10};
  212.         int iRx = 0;
  213.         byte[] b = new byte[5];
  214.  
  215.         Boolean Done = false;
  216.  
  217.         if (res.Code != 222) {
  218.             //Problem handle
  219.             }
  220.  
  221.         try {
  222.             nntpReader.read(newLine, 0, 2); //read off first crlf
  223.             FileOutputStream fw = new FileOutputStream(f);
  224.             while (!Done) {
  225.  
  226.                 nntpReader.read(b, 0, 1);
  227.                 fw.write(b,0,1);
  228.  
  229.  
  230.                 if (b[0] == 13) {
  231.                     nntpReader.read(b, 1, 1);
  232.                     fw.write(b,1,1);
  233.  
  234.  
  235.                     if (b[1] == 10) {
  236.                         nntpReader.read(b, 2, 1);
  237.                         if (b[2] == 46) {
  238.                             nntpReader.read(b, 3, 1);
  239.                             if(b[3] == 46)
  240.                             {
  241.                                 fw.write(b,2,1);
  242.                             }
  243.                             else if(b[3] == 13)
  244.                             {
  245.                                 nntpReader.read(b, 4, 1);
  246.                                if(b[4]==10)
  247.                                 {
  248.                                  Done = true;
  249.                                 }else
  250.                                 {
  251.                                     fw.write(b,2,3);
  252.                                 }
  253.  
  254.                             }
  255.  
  256.                         }
  257.                     }
  258.                 }
  259.                 fw.flush();
  260.             }
  261.  
  262.                     fw.close();
  263.  
  264.  
  265.                 } catch  (Exception e) {
  266.             //TODO handle exception
  267.             System.out.print(e.toString());
  268.             int o = 1;
  269.         }
  270.  
  271.     }
  272.  
  273.     public void sendLine(String message) {
  274.         // Ensures that a CR/LF is sent at the end of every line
  275.         message += "\r\n";
  276.         byte[] byteMsg = message.getBytes();
  277.  
  278.         try {
  279.             nntpWriter.write(byteMsg);
  280.             nntpWriter.flush();
  281.         } catch (IOException e) {
  282.             //TODO add error handling for close sockets etc..
  283.         }
  284.         System.out.print(new String(byteMsg, 0, byteMsg.length - 1));
  285.     }
  286.  
  287.     public Boolean Authenticate(String Username, String Password) {
  288.         NNTPresponse res;
  289.  
  290.         res = getResponse("AUTHINFO USER " + userName);
  291.  
  292.         if (res.Code == 381) //More Authentication Information Required
  293.         {
  294.             res = getResponse("AUTHINFO PASS " + passWord);
  295.         }
  296.         if (res.Code != 281) //Authentication rejected
  297.         {
  298.             //TODO Throw NTNP exception
  299.         }
  300.  
  301.         return true;
  302.     }
  303.  
  304.     public void disconnect() {
  305.         try {
  306.             getResponse("QUIT");
  307.             nntpClient.close();
  308.             nntpWriter = null;
  309.             nntpReader = null;
  310.             buffer = null;
  311.         } catch (IOException e) {
  312.             //TODO handle error
  313.         }
  314.     }
  315.  
  316.     private NNTPresponse readLine(String message) {
  317.  
  318.         if (message != null) {
  319.             sendLine(message);
  320.         }
  321.         byte b = -1;
  322.         try {
  323.             for (int i = 0;; i++) {
  324.  
  325.                 b = (byte) nntpReader.read();
  326.  
  327.                 if (b == 13) { //Check for CR
  328.                     b = (byte) nntpReader.read();
  329.                     if (b == 10) //Next should be LF
  330.                     {
  331.  
  332.  
  333.                         return new NNTPresponse(buffer, i - 1);
  334.                     } else {
  335.                         //TODO Throw Exception
  336.                     }
  337.                 } else if (b == -1) //Read failed
  338.                 {
  339.                     //TODO ERROR handle....
  340.                 }
  341.                 buffer[i] = b;
  342.             }
  343.         } catch (IOException e) {
  344.             //TODO Handle Exception
  345.         }
  346.         return null;
  347.     }
  348.  
  349.     public NNTPresponse getResponse(String message) {
  350.         if (message != null) {
  351.             sendLine(message);
  352.         }
  353.  
  354.         int iRx = -1;
  355.         try {
  356.             iRx = nntpReader.read(buffer);
  357.             System.out.print(new String(buffer, 0, iRx));
  358.         } catch (IOException e) {
  359.             //TODO handle exception
  360.         }
  361.         return new NNTPresponse(buffer, iRx);
  362.  
  363.     }
  364.  
  365.     public class NNTPresponse {
  366.  
  367.         public int Code;
  368.         public String Info;
  369.  
  370.         public NNTPresponse(String fullResponse) {
  371.  
  372.             Code = Integer.parseInt(fullResponse.substring(0, 3));
  373.             Info = fullResponse;
  374.         }
  375.  
  376.         public NNTPresponse(int code, String fullResponse) {
  377.             Code = code;
  378.             Info = fullResponse;
  379.         }
  380.  
  381.         public NNTPresponse(byte[] readBytes, int numOfBytes) {
  382.             Info = new String(readBytes, 0, numOfBytes);
  383.             Code = Integer.parseInt(Info.substring(0, 3));
  384.         }
  385.     }
  386. }
  387.  
Advertisement
Add Comment
Please, Sign In to add comment