diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java index 974a5790579193e4cde68cf0dcd4828f4eefb32f..328df867afc69c681f09de7c9893459b8472fe34 100644 --- a/src/GUI/PaintGUI.java +++ b/src/GUI/PaintGUI.java @@ -1,6 +1,7 @@ package GUI; import client.Client; +import remote.IDrawingUpdate; import javax.imageio.ImageIO; import javax.swing.*; @@ -12,7 +13,9 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.IOException; import java.rmi.RemoteException; public class PaintGUI extends JPanel { @@ -236,8 +239,49 @@ public class PaintGUI extends JPanel { if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fileChooser.getSelectedFile(); drawingArea.openFile(file); + + try + { + client.getDrawingController().broadcastClearCanvas(client.getUserName()); + } + catch (RemoteException err) + { + err.printStackTrace(); + } + + + SerializableImage serializableImage = new SerializableImage(600, 600, BufferedImage.TYPE_INT_ARGB); + try { + serializableImage.setImage(ImageIO.read(file)); + } catch (IOException ex) { + ex.printStackTrace(); + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + javax.imageio.ImageIO.write(serializableImage, "png", baos); + baos.flush(); + baos.close(); + } + catch (IOException err) { + err.printStackTrace(); + } + + try { + client.getDrawingController().updateImage(baos.toByteArray()); + } catch (RemoteException ex) { + ex.printStackTrace(); + } + + try { + client.getDrawingController().broadcastUpdateImage(client.getUserName()); + } catch (RemoteException ex) { + ex.printStackTrace(); + } } + + /// Save under project directory without filename (PNG file with default filename) /// } else if (e.getSource() == saveBtn) { diff --git a/src/client/DrawingUpdate.java b/src/client/DrawingUpdate.java index 43883b2e581f3067691b42ca1d22592a42b8be66..6ce9968c6ba3f6ecb515e6a513d8584303e0350c 100644 --- a/src/client/DrawingUpdate.java +++ b/src/client/DrawingUpdate.java @@ -84,8 +84,8 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate // BufferedImage bufferedImage = client.getApplicationMain().getPaintGUI().getDrawingArea().getImage(); BufferedImage bufferedImage = javax.imageio.ImageIO.read(new ByteArrayInputStream(rawImage)); client.getApplicationMain().getPaintGUI().getDrawingArea().setImage(bufferedImage); - Graphics2D g2 = (Graphics2D) bufferedImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + client.getApplicationMain().getPaintGUI().getDrawingArea().setG2((Graphics2D) bufferedImage.getGraphics()); + client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); client.getApplicationMain().getPaintGUI().getDrawingArea().repaint(); // do whatever you wish with the image diff --git a/src/client/client.policy b/src/client/client.policy new file mode 100644 index 0000000000000000000000000000000000000000..a8f141af97047fdcc681f3d85b1eee1afa8372c4 --- /dev/null +++ b/src/client/client.policy @@ -0,0 +1,3 @@ +grant { + permission java.net.SocketPermission "10.13.64.162", "accept,connect"; +}; diff --git a/src/remote/IDrawingController.java b/src/remote/IDrawingController.java index 635c490c49e86dd5ee1bee1ed89ca997de08308c..5f0177d4e79af3345ee391b47549532fd9b77d1c 100644 --- a/src/remote/IDrawingController.java +++ b/src/remote/IDrawingController.java @@ -24,6 +24,8 @@ public interface IDrawingController extends Remote { boolean broadcastDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException; boolean broadcastDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException; boolean broadcastClearCanvas(String fromClient) throws RemoteException; + boolean broadcastUpdateImage(String fromClient) throws RemoteException; + boolean updateImage(byte[] rawImage) throws RemoteException; ArrayList<Shape> getShapeList() throws RemoteException; ArrayList<Color> getColorList() throws RemoteException; @@ -35,5 +37,6 @@ public interface IDrawingController extends Remote { // BufferedImage getCurrentImage() throws RemoteException; SerializableImage getCurrentImage() throws RemoteException; void getImage(String fromClient) throws RemoteException; +// void setImage(String fromClient) throws RemoteException; } diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java index d52aebe4592c31b9e5c84be2d689a33490ac17fb..ca93859785887347f808bcee1616320ced536e12 100644 --- a/src/server/DrawingController.java +++ b/src/server/DrawingController.java @@ -21,7 +21,6 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo private Server server; private SerializableImage serializableImage; - private BufferedImage bufferedImage; private Graphics2D g2; private ArrayList<Shape> shapeList; @@ -208,17 +207,69 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo return true; } + + public boolean broadcastUpdateImage(String fromClient) throws RemoteException { + System.out.print("Broadcasting new image loading to everyone..."); + + try { + + // do whatever you wish with the image + IDrawingUpdate client; + + for( User u : server.users ) + { + if (!u.getUserName().equals(fromClient)) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + client = u.getIDrawingUpdate(); + try { + javax.imageio.ImageIO.write(serializableImage, "png", baos); + baos.flush(); + client.receiveImage(baos.toByteArray()); + } + catch (IOException err) { + err.printStackTrace(); + } + baos.close(); + } + } + } + catch (IOException err) { + err.printStackTrace(); + } + + System.out.print("...DONE\n"); + + return true; + } + + public boolean updateImage(byte[] rawImage) throws RemoteException { + try { + BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(rawImage)); + serializableImage.setImage(bufferedImage); + g2 = serializableImage.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // do whatever you wish with the image + } + catch (IOException err) { + err.printStackTrace(); + } + return true; + } + public SerializableImage getCurrentImage() throws RemoteException { return serializableImage; } public void getImage(String fromClient) throws RemoteException { -// if (serializableImage.getImage().) + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + IDrawingUpdate client; + try { javax.imageio.ImageIO.write(serializableImage, "png", baos); baos.flush(); + baos.close(); } catch (IOException err) { err.printStackTrace(); @@ -233,6 +284,7 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo } } + public ArrayList<Shape> getShapeList() { return shapeList; } diff --git a/src/server/Server.java b/src/server/Server.java index cb1ef67e4d58a8f673777b4324c0fc783792b1ec..1063d88fb21da8e2cd3ea5078816e9dff18712e8 100644 --- a/src/server/Server.java +++ b/src/server/Server.java @@ -4,11 +4,15 @@ import remote.IChatController; import remote.IClientController; import remote.IDrawingController; +import javax.naming.NamingEnumeration; import java.net.InetAddress; +import java.net.MalformedURLException; import java.net.UnknownHostException; +import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; public class Server @@ -58,6 +62,10 @@ public class Server { LocateRegistry.createRegistry(1099); Registry registry = LocateRegistry.getRegistry(); +// if (System.getSecurityManager() == null) { +// System.setSecurityManager(new SecurityManager()); +// } +// System.setProperty("java.security.policy", "file:/Users/haiho/OneDrive - The University of Melbourne/Distributed Systems (COMP90015)/Assignment 2/InfinityMonkeys-remaster/comp90015-dsass2-infinitymonkeys-remaster/src/server/server.policy"); String clientControllerName = "ClientController"; String chatControllerName = "ChatController"; @@ -70,6 +78,18 @@ public class Server registry.rebind(clientControllerName, clientController); registry.rebind(chatControllerName, chatController); registry.rebind(drawingControllerName, drawingController); +// registry.rebind(clientControllerName, UnicastRemoteObject.exportObject(clientController, 1099)); +// registry.rebind(chatControllerName, UnicastRemoteObject.exportObject(chatController, 1099)); +// registry.rebind(drawingControllerName, UnicastRemoteObject.exportObject(drawingController, 1099)); + +// try { +// Naming.rebind(clientControllerName, clientController); +// Naming.rebind(chatControllerName, chatController); +// Naming.rebind(drawingControllerName, drawingController); +// } catch (MalformedURLException e) { +// e.printStackTrace(); +// } + System.out.println("Server is ready"); diff --git a/src/server/server.policy b/src/server/server.policy new file mode 100644 index 0000000000000000000000000000000000000000..5c059491c631fa37d14fc62d9654cdb13ce184c0 --- /dev/null +++ b/src/server/server.policy @@ -0,0 +1,3 @@ +grant codeBase "file:/Users/haiho/OneDrive - The University of Melbourne/Distributed Systems (COMP90015)/Assignment 2/InfinityMonkeys-remaster/comp90015-dsass2-infinitymonkeys-remaster/out/production/comp90015-dsass2-infinitymonkeys-remaster/" { + permission java.security.AllPermission; +}; \ No newline at end of file