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

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

Updated mail stuff and networking stuff!!

File size: 3.6 KB
Line 
1package org.expeditee.network;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.StringReader;
6import java.net.DatagramPacket;
7import java.net.DatagramSocket;
8import java.net.UnknownHostException;
9import java.util.HashMap;
10import java.util.Map;
11
12import org.expeditee.gui.AttributeValuePair;
13import org.expeditee.gui.Frame;
14import org.expeditee.gui.MessageBay;
15import org.expeditee.io.ExpReader;
16import org.expeditee.io.FrameReader;
17import org.expeditee.items.Text;
18
19public class FrameShare {
20
21 private static FrameShare _theSession = null;
22
23 private static FrameServer _server = null;
24
25 private Map<String, Peer> _peers;
26
27 public static void init(Frame settingsFrame) {
28 if (settingsFrame == null)
29 return;
30
31 if (_theSession == null)
32 _theSession = new FrameShare(settingsFrame);
33 }
34
35 private FrameShare(Frame settingsFrame) {
36 _peers = new HashMap<String, Peer>();
37
38 // Set the settings
39 for (Text item : settingsFrame.getBodyTextItems(false)) {
40
41 AttributeValuePair avp = new AttributeValuePair(item.getText());
42 if (avp.isAnnotation())
43 continue;
44
45 String attribute = avp.getAttributeOrValue().toLowerCase();
46
47 if (attribute.equals("server")) {
48 try {
49 if (!avp.hasPair()) {
50 _server = new FrameServer();
51 } else {
52 _server = new FrameServer("FrameServer", avp
53 .getIntegerValue());
54 }
55 } catch (Exception e) {
56 e.printStackTrace();
57 MessageBay.errorMessage("Could not start frame server ["
58 + avp.toString() + "]");
59 }
60 continue;
61 }
62
63 if (!avp.hasPair())
64 continue;
65
66 try {
67 _peers.put(attribute, new Peer(avp));
68 } catch (UnknownHostException e) {
69 MessageBay.errorMessage("Could not locate peer ["
70 + avp.toString() + "]");
71 }
72 }
73
74 try {
75 if (_server != null) {
76 _server.start();
77 }
78 } catch (Exception e) {
79 MessageBay.errorMessage("Error in PeerToPeer setup");
80 }
81 }
82
83 public void finalise() {
84 _server.close();
85 }
86
87 public static FrameShare getInstance() {
88 return _theSession;
89 }
90
91 /**
92 * TODO check each peer on a different thread.
93 *
94 * @param frameName
95 * @return
96 */
97 public Frame loadFrame(String frameName) {
98 byte[] nameBuf = frameName.getBytes();
99 byte[] buf = new byte[2056];
100
101 String result = null;
102 String peerName = null;
103 try {
104 // get a datagram socket
105 DatagramSocket socket = new DatagramSocket();
106 socket.setSoTimeout(1000);
107
108 for (Peer peer : _peers.values()) {
109 try {
110 // send request for a frame
111 DatagramPacket packet = new DatagramPacket(nameBuf,
112 nameBuf.length, peer.getAddress(), peer.getPort());
113 socket.send(packet);
114
115 // get response
116 packet = new DatagramPacket(buf, buf.length);
117 socket.receive(packet);
118
119 // store frame contents
120 result = new String(packet.getData(), 0, packet.getLength());
121 peerName = peer.getName();
122 break;
123 } catch (Exception e) {
124 e.printStackTrace();
125 }
126 }
127 socket.close();
128 } catch (Exception e) {
129
130 }
131
132 if(result == null)
133 return null;
134
135 // Now read the frame from the file contents
136 FrameReader reader = new ExpReader(frameName);
137 Frame frame = null;
138 try {
139 frame = reader.readFrame(new BufferedReader(
140 new StringReader(result)));
141 // Set the path for the frame to indicate it is NOT a local frame
142 // This allows the frame to be saved in the correct location
143 frame.setLocal(false);
144 frame.setPath(peerName);
145 } catch (IOException e) {
146 e.printStackTrace();
147 }
148
149 if (frame == null) {
150 MessageBay.errorMessage("Error: " + frameName
151 + " could not be successfully loaded.");
152 return null;
153 }
154
155 return frame;
156 }
157}
Note: See TracBrowser for help on using the repository browser.