1:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46:
47: import ;
48:
49:
54: public final class DirectoryListing
55: implements Iterator
56: {
57:
58: private static final String DOT = ".";
59:
60: private LineInputStream in;
61: private boolean doneRead = false;
62: private DirectoryEntry current;
63:
64: DirectoryListing(InputStream in)
65: {
66: this.in = new LineInputStream(in);
67: }
68:
69:
72: public boolean hasNext()
73: {
74: try
75: {
76: fetch();
77: }
78: catch (IOException e)
79: {
80: return false;
81: }
82: return (current != null);
83: }
84:
85:
88: public Object next()
89: {
90: try
91: {
92: return nextEntry();
93: }
94: catch (IOException e)
95: {
96: throw new NoSuchElementException("I/O error: " + e.getMessage());
97: }
98: }
99:
100:
103: public void remove()
104: {
105: throw new UnsupportedOperationException();
106: }
107:
108:
111: public DirectoryEntry nextEntry()
112: throws IOException
113: {
114: fetch();
115: if (current == null)
116: {
117: throw new NoSuchElementException();
118: }
119: doneRead = false;
120: return current;
121: }
122:
123: void fetch()
124: throws IOException
125: {
126: if (doneRead)
127: {
128: return;
129: }
130: String line = in.readLine();
131: if (DOT.equals(line))
132: {
133: current = null;
134: }
135: else
136: {
137:
138: int type = DirectoryEntry.ERROR;
139: switch(line.charAt(0))
140: {
141: case '0':
142: type = DirectoryEntry.FILE;
143: break;
144: case '1':
145: type = DirectoryEntry.DIRECTORY;
146: break;
147: case '2':
148: type = DirectoryEntry.CSO_PHONE_BOOK;
149: break;
150: case '3':
151: type = DirectoryEntry.ERROR;
152: break;
153: case '4':
154: type = DirectoryEntry.BINHEX;
155: break;
156: case '5':
157: type = DirectoryEntry.DOS_ARCHIVE;
158: break;
159: case '6':
160: type = DirectoryEntry.UUENCODED;
161: break;
162: case '7':
163: type = DirectoryEntry.INDEX_SEARCH;
164: break;
165: case '8':
166: type = DirectoryEntry.TELNET;
167: break;
168: case '9':
169: type = DirectoryEntry.BINARY;
170: break;
171: case '+':
172: type = DirectoryEntry.REDUNDANT;
173: break;
174: case 'T':
175: type = DirectoryEntry.TN3270;
176: break;
177: case 'g':
178: type = DirectoryEntry.GIF;
179: break;
180: case 'I':
181: type = DirectoryEntry.IMAGE;
182: break;
183: }
184: int start = 1;
185: int end = line.indexOf('\t', start);
186: if (end == -1)
187: {
188: throw new ProtocolException("Invalid directory entry: " + line);
189: }
190: String title = line.substring(start, end);
191: start = end + 1;
192: end = line.indexOf('\t', start);
193: if (end == -1)
194: {
195: throw new ProtocolException("Invalid directory entry: " + line);
196: }
197: String selector = line.substring(start, end);
198: start = end + 1;
199: end = line.indexOf('\t', start);
200: if (end == -1)
201: {
202: throw new ProtocolException("Invalid directory entry: " + line);
203: }
204: String hostname = line.substring(start, end);
205: start = end + 1;
206: int port = Integer.parseInt(line.substring(start));
207: current = new DirectoryEntry(type, title, selector, hostname, port);
208: }
209: }
210:
211: }