source: trunk/src/org/expeditee/network/FrameShare.java@ 309

Last change on this file since 309 was 307, checked in by ra33, 16 years ago

Can navigate with PgUp PgDn Home and End with remote framesets

File size: 8.0 KB
Line 
1package org.expeditee.network;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.StringReader;
6import java.io.StringWriter;
7import java.net.DatagramPacket;
8import java.net.DatagramSocket;
9import java.net.InetAddress;
10import java.net.SocketException;
11import java.net.UnknownHostException;
12import java.util.Collection;
13import java.util.HashMap;
14import java.util.LinkedList;
15import java.util.Map;
16
17import org.expeditee.gui.AttributeValuePair;
18import org.expeditee.gui.Frame;
19import org.expeditee.gui.FrameIO;
20import org.expeditee.gui.MessageBay;
21import org.expeditee.io.ExpReader;
22import org.expeditee.io.ExpWriter;
23import org.expeditee.io.FrameReader;
24import org.expeditee.io.FrameWriter;
25import org.expeditee.items.Text;
26
27public class FrameShare {
28
29 private static final int SOCKET_TIMEOUT = 1000;
30
31 private static Collection<DefaultServer> _servers = new LinkedList<DefaultServer>();
32
33 private static FrameShare _theSession;
34
35 private Map<String, Peer> _peers;
36
37 private int _port = Peer.DEFAULT_PORT;
38
39 public static void init(Frame settingsFrame) {
40 if (settingsFrame == null)
41 return;
42
43 if (_theSession == null)
44 _theSession = new FrameShare(settingsFrame);
45 }
46
47 private FrameShare(Frame settingsFrame) {
48 _peers = new HashMap<String, Peer>();
49
50 // Set the settings
51 for (Text item : settingsFrame.getBodyTextItems(false)) {
52
53 AttributeValuePair avp = new AttributeValuePair(item.getText());
54 if (avp.isAnnotation())
55 continue;
56
57 String attribute = avp.getAttributeOrValue().toLowerCase();
58
59 if (attribute.equals("server")) {
60 try {
61 if (avp.hasPair()) {
62 _port = avp.getIntegerValue();
63 }
64 _servers.add(new FrameServer(_port));
65 _servers.add(new FrameSaver(_port));
66 _servers.add(new MessageReciever(_port));
67 _servers.add(new InfServer(_port));
68 _servers.add(new InfUpdate(_port));
69 } catch (Exception e) {
70 e.printStackTrace();
71 MessageBay.errorMessage("Could not start servers ["
72 + avp.toString() + "]");
73 }
74 continue;
75 }
76
77 if (!avp.hasPair())
78 continue;
79
80 try {
81 _peers.put(attribute, new Peer(avp));
82 } catch (UnknownHostException e) {
83 MessageBay.errorMessage("Could not locate peer ["
84 + avp.toString() + "]");
85 }
86 }
87
88 try {
89 for (DefaultServer server : _servers)
90 server.start();
91 } catch (Exception e) {
92 MessageBay.errorMessage("Error in PeerToPeer setup");
93 }
94 }
95
96 public void finalise() {
97 for (DefaultServer server : _servers)
98 server.close();
99 }
100
101 public static FrameShare getInstance() {
102 return _theSession;
103 }
104
105 /**
106 * TODO check each peer on a different thread.
107 *
108 * @param frameName
109 * @return
110 */
111 public Frame loadFrame(String frameName, String peerName) {
112 String result = null;
113
114 try {
115 // get a datagram socket
116 DatagramSocket socket = new DatagramSocket();
117 socket.setSoTimeout(SOCKET_TIMEOUT * 2);
118 if (peerName == null) {
119 for (Peer peer : _peers.values()) {
120 try {
121 result = getFrameContents(frameName, socket, peer);
122 if(result == null || result.length() == 0)
123 continue;
124
125 peerName = peer.getName();
126 break;
127 } catch (Exception e) {
128 e.printStackTrace();
129 }
130 }
131 } else {
132 try {
133 Peer peer = _peers.get(peerName.toLowerCase());
134 if (peer != null) {
135 result = getFrameContents(frameName, socket, peer);
136 }
137 } catch (Exception e) {
138 e.printStackTrace();
139 }
140 }
141 socket.close();
142 } catch (Exception e) {
143
144 }
145
146 if (result == null || result.length() == 0)
147 return null;
148
149 // Now read the frame from the file contents
150 FrameReader reader = new ExpReader(frameName);
151 Frame frame = null;
152 try {
153 frame = reader.readFrame(new BufferedReader(
154 new StringReader(result)));
155 // Set the path for the frame to indicate it is NOT a local frame
156 // This allows the frame to be saved in the correct location
157 frame.setLocal(false);
158 frame.setPath(peerName);
159 } catch (IOException e) {
160 e.printStackTrace();
161 }
162
163 if (frame == null) {
164 MessageBay.errorMessage("Error: " + frameName
165 + " could not be successfully loaded.");
166 return null;
167 }
168
169 return frame;
170 }
171
172 /**
173 * @param frameName
174 * @param socket
175 * @param peer
176 * @return
177 * @throws IOException
178 */
179 private String getFrameContents(String frameName, DatagramSocket socket, Peer peer) throws IOException {
180 byte[] nameBuf = frameName.getBytes();
181 byte[] buf = new byte[FrameServer.MAX_PACKET_LENGTH];
182 // send request for a frame
183 DatagramPacket packet = new DatagramPacket(nameBuf,
184 nameBuf.length, peer.getAddress(), peer
185 .getPort());
186 socket.send(packet);
187
188 // get response
189 packet = new DatagramPacket(buf, buf.length);
190 socket.receive(packet);
191
192 // store frame contents
193 return new String(packet.getData(), 0, packet
194 .getLength());
195 }
196
197 public boolean sendMessage(String message, String peerName) {
198 Peer peer = _peers.get(peerName.toLowerCase());
199
200 if (peer == null) {
201 return false;
202 }
203
204 try {
205 // get a datagram socket
206 DatagramSocket socket = new DatagramSocket(_port - 1);
207 socket.setSoTimeout(SOCKET_TIMEOUT);
208
209 // message = peerName + " says " + message;
210 byte[] contentsBuf = message.getBytes();
211
212 try {
213 // send save request
214 DatagramPacket packet = new DatagramPacket(contentsBuf,
215 contentsBuf.length, peer.getAddress(), peer.getPort()
216 + MessageReciever.OFFSET);
217 socket.send(packet);
218 } catch (Exception e) {
219 e.printStackTrace();
220 }
221 socket.close();
222
223 } catch (IOException e) {
224 e.printStackTrace();
225 }
226 return true;
227 }
228
229 public String saveFrame(Frame toSave) {
230
231 FrameIO.setSavedProperties(toSave);
232
233 Peer peer = _peers.get(toSave.getPath().toLowerCase());
234 String fileContents = "";
235 // Now read the frame from the file contents
236 FrameWriter writer = new ExpWriter();
237 try {
238 // String tempName = new Date().toString() + ".exp";
239 // writer.setOutputLocation(tempName);
240 // Write out the file to a StringBuffer
241 StringWriter sw = new StringWriter();
242 // First write out the name of the frame
243 sw.write(toSave.getName() + "\n");
244 // Then the version
245 sw.write(toSave.getVersion() + "\n");
246 // Write out the rest of the frame
247 writer.writeFrame(toSave, sw);
248 // Now send the packet
249 fileContents = sw.getBuffer().toString();
250 byte[] contentsBuf = fileContents.getBytes();
251
252 // get a datagram socket
253 DatagramSocket socket = new DatagramSocket(_port - 2);
254 socket.setSoTimeout(SOCKET_TIMEOUT);
255
256 try {
257 // send save request
258 DatagramPacket packet = new DatagramPacket(contentsBuf,
259 contentsBuf.length, peer.getAddress(), peer.getPort()
260 + FrameSaver.OFFSET);
261 socket.send(packet);
262 } catch (Exception e) {
263 e.printStackTrace();
264 }
265 socket.close();
266
267 } catch (IOException e) {
268 e.printStackTrace();
269 }
270 toSave.setSaved();
271 return fileContents;
272 }
273
274 public String getPeerName(int port, InetAddress address) {
275 for (Peer p : _peers.values()) {
276 if (p.getPort() == port && p.getAddress().equals(address))
277 return p.getName();
278 }
279 return null;
280 }
281
282 public int getInfNumber(String peerName, String frameset, boolean update)
283 throws IOException {
284 int result = -1;
285 // get a datagram socket
286 DatagramSocket socket = null;
287 try {
288 socket = new DatagramSocket(_port - 3);
289 socket.setSoTimeout(SOCKET_TIMEOUT);
290
291 byte[] contentsBuf = frameset.getBytes();
292 Peer peer = _peers.get(peerName.toLowerCase());
293 try {
294 // send inf request
295 DatagramPacket packet = new DatagramPacket(
296 contentsBuf,
297 contentsBuf.length,
298 peer.getAddress(),
299 peer.getPort()
300 + (update ? InfUpdate.OFFSET : InfServer.OFFSET));
301 socket.send(packet);
302
303 byte[] buf = new byte[100];
304 // get response
305 packet = new DatagramPacket(buf, buf.length);
306 socket.receive(packet);
307
308 // store frame contents
309 result = Integer.parseInt(new String(packet.getData(), 0,
310 packet.getLength()));
311 peerName = peer.getName();
312
313 } catch (Exception e) {
314 e.printStackTrace();
315 }
316 socket.close();
317 } catch (SocketException e1) {
318 e1.printStackTrace();
319 }
320
321 return result;
322 }
323}
Note: See TracBrowser for help on using the repository browser.