diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
index 974a5790579193e4cde68cf0dcd4828f4eefb32f..7f8e024d960bfaa3001f404bdae4ee55288b7ed0 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,37 @@ 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();
+ }
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try {
+ javax.imageio.ImageIO.write(ImageIO.read(file), "png", baos);
+ baos.flush();
+ baos.close();
+ }
+ catch (IOException err) {
+ err.printStackTrace();
+ }
+
+ try {
+ if (client.getDrawingController().updateImage(baos.toByteArray())) {
+ 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..68c8f9ae6c6b685aa99eca6a0ee64b4bf61bd230 100644
--- a/src/client/DrawingUpdate.java
+++ b/src/client/DrawingUpdate.java
@@ -22,9 +22,9 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate
@Override
public boolean notifyTextDrawing(String fromClient, String text, Font font, Point startPoint) throws RemoteException {
- Graphics2D g2 = client.getApplicationMain().getPaintGUI().getDrawingArea().getG2();
- g2.setFont(font);
- g2.drawString(text, startPoint.x, startPoint.y);
+ client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().setFont(font);
+ client.getApplicationMain().getPaintGUI().getDrawingArea().getG2().drawString(text, startPoint.x, startPoint.y);
client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
return true;
}
@@ -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 df062613d0f9144d0139326c74bac84d764507cd..be96a215a69686225e4db0ecfc69958a25396b33 100644
--- a/src/remote/IDrawingController.java
+++ b/src/remote/IDrawingController.java
@@ -1,13 +1,8 @@
package remote;
-
-import client.Client;
-
import java.awt.*;
-import java.awt.image.BufferedImage;
import java.rmi.Remote;
import java.rmi.RemoteException;
-import java.util.ArrayList;
/**
@@ -24,15 +19,7 @@ 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;
-
- ArrayList<Shape> getShapeList() throws RemoteException;
- ArrayList<Color> getColorList() throws RemoteException;
- ArrayList<Integer> getStrokeSizeList() throws RemoteException;
-
- ArrayList<String> getTextList() throws RemoteException;
- ArrayList<Font> getFontList() throws RemoteException;
- ArrayList<Point> getTextStartPointList() throws RemoteException;
-// BufferedImage getCurrentImage() throws RemoteException;
+ boolean broadcastUpdateImage(String fromClient) throws RemoteException;
+ boolean updateImage(byte[] rawImage) throws RemoteException;
void getImage(String fromClient) throws RemoteException;
-
}
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
index d604e62caef94cdf0cd343071d76596d6e28bc69..00d42fc5e09937a1e7d587f062ad4e7221218754 100644
--- a/src/server/DrawingController.java
+++ b/src/server/DrawingController.java
@@ -8,7 +8,6 @@ import java.awt.image.BufferedImage;
import java.io.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
-import java.util.ArrayList;
public class DrawingController extends UnicastRemoteObject implements IDrawingController {
@@ -16,50 +15,25 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
private final static int AREA_HEIGHT = 600;
private Server server;
-// private SerializableImage bufferedImage;
private BufferedImage bufferedImage;
private Graphics2D g2;
- private ArrayList<Shape> shapeList;
- private ArrayList<Color> colorList;
- private ArrayList<Integer> strokeSizeList;
-
- private ArrayList<String> textList;
- private ArrayList<Font> fontList;
- private ArrayList<Point> textStartPointList;
-
protected DrawingController(Server server) throws RemoteException {
this.server = server;
-// this.bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
-// g2 = (Graphics2D) bufferedImage.getGraphics();
-// g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
this.bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
- this.shapeList = new ArrayList<Shape>();
- this.colorList = new ArrayList<Color>();
- this.strokeSizeList = new ArrayList<Integer>();
-
- this.textList = new ArrayList<String>();
- this.fontList = new ArrayList<Font>();
- this.textStartPointList = new ArrayList<Point>();
}
@Override
public boolean broadcastText(String fromClient, String text, Font font, Point startPoint) throws RemoteException {
System.out.print("Broadcasting drawing to everyone...");
- textList.add(text);
- fontList.add(font);
- textStartPointList.add(startPoint);
-
-
g2 = (Graphics2D) bufferedImage.getGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(font);
// g2.setPaint(Color.BLACK);
g2.drawString(text, startPoint.x, startPoint.y);
@@ -87,10 +61,6 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
public boolean broadcastDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
System.out.print("Broadcasting drawing to everyone...");
- shapeList.add(drawing);
- colorList.add(color);
- strokeSizeList.add(strokeSize);
-
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
switch (mode) {
@@ -109,12 +79,10 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
default:
break;
}
- g2 = (Graphics2D) bufferedImage.getGraphics();
+ g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setColor(color);
-
-
IDrawingUpdate client;
for( User u : server.users )
@@ -133,12 +101,6 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
public boolean broadcastDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
System.out.print("Broadcasting dragging drawing to everyone...");
- if (mode.equals("FREEHAND")) {
- shapeList.add(drawing);
- colorList.add(color);
- strokeSizeList.add(strokeSize);
- }
-
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
switch (mode) {
@@ -157,11 +119,10 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
default:
break;
}
- g2 = (Graphics2D) bufferedImage.getGraphics();
+ g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setColor(color);
-
IDrawingUpdate client;
for( User u : server.users )
@@ -182,16 +143,8 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
IDrawingUpdate client;
- this.shapeList.clear();
- this.colorList.clear();
- this.strokeSizeList.clear();
-
- this.textList.clear();
- this.fontList.clear();
- this.textStartPointList.clear();
-
- BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
- g2 = (Graphics2D) image.getGraphics();
+ bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+ g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for( User u : server.users )
@@ -207,17 +160,64 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
return true;
}
- public BufferedImage getCurrentImage() throws RemoteException {
- return bufferedImage;
+
+ 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(bufferedImage, "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 = ImageIO.read(new ByteArrayInputStream(rawImage));
+ g2 = (Graphics2D) bufferedImage.getGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g2.drawImage(bufferedImage, null, 0, 0);
+ }
+ catch (IOException err) {
+ err.printStackTrace();
+ }
+ return true;
}
public void getImage(String fromClient) throws RemoteException {
-// if (bufferedImage.getImage().)
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
IDrawingUpdate client;
+
try {
javax.imageio.ImageIO.write(bufferedImage, "png", baos);
baos.flush();
+ baos.close();
}
catch (IOException err) {
err.printStackTrace();
@@ -231,28 +231,4 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
}
}
}
-
- public ArrayList<Shape> getShapeList() {
- return shapeList;
- }
-
- public ArrayList<Color> getColorList() {
- return colorList;
- }
-
- public ArrayList<Integer> getStrokeSizeList() {
- return strokeSizeList;
- }
-
- public ArrayList<String> getTextList() {
- return textList;
- }
-
- public ArrayList<Font> getFontList() {
- return fontList;
- }
-
- public ArrayList<Point> getTextStartPointList() {
- return textStartPointList;
- }
}
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