libs.net: complete network functionality
[WeStealzYourDataz.git] / src / uk / ac / ntu / n0521366 / wsyd / libs / net / NetworkServerTCP.java
index 710e443..e68987f 100644 (file)
@@ -30,8 +30,11 @@ import java.net.Socket;
 import java.net.SocketException;
 import java.net.SocketTimeoutException;
 import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import uk.ac.ntu.n0521366.wsyd.libs.message.MessageNetworkStream;
 
 /**
  * Dual-use multithreading network TCP server that can be used stand-alone
@@ -45,6 +48,8 @@ public class NetworkServerTCP extends NetworkServerAbstract {
     ServerSocket _serverSocket;
     
     NetworkStreamManager _streamManager;
+    
+    protected ArrayList<ConnectionEstablishedEventListener> _ConnectionEstablishedEventListeners;
 
      /**
      * Construct the server with a Logger.
@@ -60,6 +65,7 @@ public class NetworkServerTCP extends NetworkServerAbstract {
     public NetworkServerTCP(WSYD_SocketAddress socketAddress, String title, ServiceAddressMap serviceToHostMap, NetworkStreamManager manager, Logger logger) {
         super(socketAddress, title, serviceToHostMap, logger);
         this._streamManager = manager;
+        this._ConnectionEstablishedEventListeners = new ArrayList<>();
     }
 
     /**
@@ -149,8 +155,17 @@ public class NetworkServerTCP extends NetworkServerAbstract {
             //System.err.println("Before");
             Socket connectionSocket = _serverSocket.accept();
             NetworkStream newStream = new NetworkStream(connectionSocket, _streamManager);
-            _streamManager.addStream(0, newStream);
+            long userID = _streamManager.addStream(0, newStream);
+            // workaround to enable firing a ConnectionEstablishedEvent in process() on the owner thread
+            NetworkMessage temp = new NetworkMessage("triggerConnectionEstablishedEvent", null, new MessageNetworkStream(newStream));
+            publish(temp);
             log(Level.INFO, _title, MessageFormat.format("Incoming connection from {0}:{1}", connectionSocket.getInetAddress().getCanonicalHostName(), Integer.toString(connectionSocket.getPort())));
+            
+            // add or update the last-seen time of the Sender host in the known services map
+            ServiceAddressMap.LastSeenHost host = new ServiceAddressMap.LastSeenHost((InetSocketAddress)connectionSocket.getRemoteSocketAddress());
+            this._serviceToHostMap.put(Long.toString(userID), host);
+            log(Level.INFO, _title, MessageFormat.format("Added \"{0}\" to service map", userID));
+            System.err.println("Added new TCP stream successfully");
         }
         catch (SocketTimeoutException e) {
             //Nothing to be done
@@ -163,6 +178,26 @@ public class NetworkServerTCP extends NetworkServerAbstract {
         return false;
     }
 
+    private void fireConnectionEstablishedEvent(NetworkStream stream) {
+        ConnectionEstablishedEvent event = new ConnectionEstablishedEvent(this, stream);
+        for (ConnectionEstablishedEventListener listener: this._ConnectionEstablishedEventListeners) {
+            listener.connectionEstablished(event);
+        }
+        
+    }
+    public synchronized void addConnectionEstablisedEventListener(ConnectionEstablishedEventListener listener) {
+        _ConnectionEstablishedEventListeners.add(listener);
+    }
+    
+    public synchronized void removeConnectionEstablishedEventListener(ConnectionEstablishedEventListener listener) {
+        for (ConnectionEstablishedEventListener el : _ConnectionEstablishedEventListeners)
+            if (el == listener) {
+                _ConnectionEstablishedEventListeners.remove(listener);
+                break;
+            }
+    }
+    
+    
     /* XXX: Methods below here all execute on the GUI Event Dispatch Thread */
     
     /**
@@ -174,4 +209,20 @@ public class NetworkServerTCP extends NetworkServerAbstract {
     protected  void done() {
         
     }
+
+    @Override
+    protected NetworkMessage sendMessage() {
+        return null;
+    }
+    
+    @Override
+    protected void process(List<NetworkMessage> list) {
+        System.err.println("process()");
+        for (NetworkMessage nm: list) {
+            MessageNetworkStream message = (MessageNetworkStream)nm.getMessage();
+            System.err.println("ConnectionEstablished dispatched for " + message._stream._key);
+            fireConnectionEstablishedEvent(message._stream);
+
+        }
+    }
 }