diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/Client.java b/guacamole/web-client/src/net/sourceforge/guacamole/Client.java index 93000aaf4..e57d479a0 100644 --- a/guacamole/web-client/src/net/sourceforge/guacamole/Client.java +++ b/guacamole/web-client/src/net/sourceforge/guacamole/Client.java @@ -20,8 +20,6 @@ package net.sourceforge.guacamole; */ import net.sourceforge.guacamole.GuacamoleException; -import net.sourceforge.guacamole.event.KeyEvent; -import net.sourceforge.guacamole.event.PointerEvent; public abstract class Client { diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/GuacamoleClient.java b/guacamole/web-client/src/net/sourceforge/guacamole/GuacamoleClient.java index f79e8a1b4..f0748d8df 100644 --- a/guacamole/web-client/src/net/sourceforge/guacamole/GuacamoleClient.java +++ b/guacamole/web-client/src/net/sourceforge/guacamole/GuacamoleClient.java @@ -32,10 +32,6 @@ import java.io.Writer; import java.io.OutputStreamWriter; import net.sourceforge.guacamole.GuacamoleException; -import net.sourceforge.guacamole.event.EventQueue; -import net.sourceforge.guacamole.event.EventHandler; -import net.sourceforge.guacamole.event.KeyEvent; -import net.sourceforge.guacamole.event.PointerEvent; public class GuacamoleClient extends Client { diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/LegacyClient.java b/guacamole/web-client/src/net/sourceforge/guacamole/LegacyClient.java deleted file mode 100644 index 83f680098..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/LegacyClient.java +++ /dev/null @@ -1,35 +0,0 @@ - -package net.sourceforge.guacamole; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import net.sourceforge.guacamole.instruction.Instruction; -import net.sourceforge.guacamole.GuacamoleException; -import net.sourceforge.guacamole.event.KeyEvent; -import net.sourceforge.guacamole.event.PointerEvent; - -public abstract class LegacyClient { - - public abstract void send(KeyEvent event) throws GuacamoleException; - public abstract void send(PointerEvent event) throws GuacamoleException; - public abstract void setClipboard(String clipboard) throws GuacamoleException; - public abstract void disconnect() throws GuacamoleException; - public abstract Instruction nextInstruction(boolean blocking) throws GuacamoleException; - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/event/Event.java b/guacamole/web-client/src/net/sourceforge/guacamole/event/Event.java deleted file mode 100644 index 8fa047f1b..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/event/Event.java +++ /dev/null @@ -1,55 +0,0 @@ - -package net.sourceforge.guacamole.event; - -/* - * Guacamole - Clientless Remote Desktop - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public abstract class Event implements Comparable { - - private long time; - private int index; - - public Event(int index) { - this.time = System.currentTimeMillis(); - this.index = index; - } - - public int getIndex() { - return index; - } - - public long getTime() { - return time; - } - - public int hashCode() { - return index; - } - - @Override - public boolean equals(Object o) { - if (o == null) return false; - if (getClass() != o.getClass()) return false; - return getIndex() == ((Event) o).getIndex(); - } - - public int compareTo(Event e) { - return getIndex() - e.getIndex(); - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/event/EventHandler.java b/guacamole/web-client/src/net/sourceforge/guacamole/event/EventHandler.java deleted file mode 100644 index bae027a2e..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/event/EventHandler.java +++ /dev/null @@ -1,28 +0,0 @@ - -package net.sourceforge.guacamole.event; - -/* - * Guacamole - Clientless Remote Desktop - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import java.io.IOException; - -public interface EventHandler { - - public void handle(E e) throws IOException; - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/event/EventQueue.java b/guacamole/web-client/src/net/sourceforge/guacamole/event/EventQueue.java deleted file mode 100644 index a1d7a5246..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/event/EventQueue.java +++ /dev/null @@ -1,191 +0,0 @@ - -package net.sourceforge.guacamole.event; - -/* - * Guacamole - Clientless Remote Desktop - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import java.io.IOException; -import java.util.PriorityQueue; - -public class EventQueue { - - private int nextIndex = 0; - private final PriorityQueue queue = new PriorityQueue(); - private EventHandler handler; - - private final int deadline; - - private AutoflushThread autoflush = new AutoflushThread(); - - private class AutoflushThread extends Thread { - - private IOException error; - private long deadline; - private static final long ONE_YEAR = 31536000; - - private boolean killed = false; - - public AutoflushThread() { - this.deadline = ONE_YEAR; - start(); - } - - public void run() { - while (!killed) { - try { - if (deadline > 0) sleep(deadline); - dropPendingEvents(); - flush(); - } - catch (InterruptedException e) { - // Interrupt indicates event handled, or thread killed - if (killed) return; - } - catch (IOException e) { - error = e; - break; - } - } - } - - public void setDeadline(long deadline) { - this.deadline = deadline; - interrupt(); - } - - public void checkError() throws IOException { - if (error != null) throw error; - } - - public void kill() { - killed = true; - interrupt(); - } - - } - - public void close() { - autoflush.kill(); - } - - // Starts autoflush wait thread for any waiting events on the queue - private void startDeadlineAutoflush() { - synchronized (queue) { - - // No need to autoflush if nothing waiting - if (queue.size() == 0) return; - - // Get waiting event - E waiting = queue.peek(); - - if (waiting != null) { - long untilDeadline = deadline + waiting.getTime() - System.currentTimeMillis(); - - // Start autoflush thread which waits for time remaining until next - // event's deadline. - autoflush.setDeadline(untilDeadline); - } - else - autoflush.setDeadline(AutoflushThread.ONE_YEAR); - - } - } - - public EventQueue(EventHandler handler, int deadline) { - this.handler = handler; - this.deadline = deadline; - } - - public void add(E event) throws IOException { - synchronized (queue) { - - autoflush.checkError(); - - if (event.getIndex() < nextIndex) { - //System.err.println("Past event dropped."); - return; - } - - if (event == null) - throw new Error("Cannot add null event."); - - queue.add(event); - } - - flush(); - } - - private E next() { - synchronized (queue) { - // If no events, return nothing. - if (queue.size() == 0) return null; - - // If still waiting for true next event, return nothing. - E event = queue.peek(); - if (event.getIndex() != nextIndex) - return null; - - // If event found, expect next event, remove and return current. - queue.remove(); - nextIndex++; - return event; - } - } - - // Return number of waiting events - public int getWaiting() { - synchronized (queue) { - // If no events, then none waiting. - if (queue.size() == 0) return 0; - - // If we have the next event, then none waiting. - E event = queue.peek(); - if (event.getIndex() == nextIndex) - return 0; - - // Otherwise, all events are waiting. - return queue.size(); - } - } - - // Stop waiting for any unreceived events - private void dropPendingEvents() { - synchronized (queue) { - // If no events, nothing needs to be changed; - if (queue.size() == 0) return; - - // Otherwise, update nextIndex to index of next event - E event = queue.peek(); - nextIndex = event.getIndex(); - } - } - - // Attempts to flush queue - // If any events remain, an autoflush thread is started. - private void flush() throws IOException { - synchronized (queue) { - E nextEvent; - while ((nextEvent = next()) != null) - handler.handle(nextEvent); - } - - // Start autoflush thread for any remaining events. - startDeadlineAutoflush(); - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/event/KeyEvent.java b/guacamole/web-client/src/net/sourceforge/guacamole/event/KeyEvent.java deleted file mode 100644 index a287dd448..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/event/KeyEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.sourceforge.guacamole.event; - -/* - * Guacamole - Clientless Remote Desktop - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public class KeyEvent extends Event { - - private int keysym; - private boolean pressed; - - public KeyEvent(int index, int keysym, boolean pressed) { - super(index); - this.keysym = keysym; - this.pressed = pressed; - } - - public int getKeySym() { - return keysym; - } - - public boolean getPressed() { - return pressed; - } -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/event/PointerEvent.java b/guacamole/web-client/src/net/sourceforge/guacamole/event/PointerEvent.java deleted file mode 100644 index 05692ada1..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/event/PointerEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.sourceforge.guacamole.event; - -/* - * Guacamole - Clientless Remote Desktop - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public class PointerEvent extends Event { - - private boolean leftButtonPressed; - private boolean middleButtonPressed; - private boolean rightButtonPressed; - private boolean upButtonPressed; - private boolean downButtonPressed; - private int x; - private int y; - - public PointerEvent(int index, boolean leftButtonPressed, boolean middleButtonPressed, boolean rightButtonPressed, boolean upButtonPressed, boolean downButtonPressed, int x, int y) { - super(index); - this.leftButtonPressed = leftButtonPressed; - this.middleButtonPressed = middleButtonPressed; - this.rightButtonPressed = rightButtonPressed; - this.upButtonPressed = upButtonPressed; - this.downButtonPressed = downButtonPressed; - this.x = x; - this.y = y; - } - - public boolean isLeftButtonPressed() { - return leftButtonPressed; - } - - public boolean isMiddleButtonPressed() { - return middleButtonPressed; - } - - public boolean isRightButtonPressed() { - return rightButtonPressed; - } - - public boolean isUpButtonPressed() { - return upButtonPressed; - } - - public boolean isDownButtonPressed() { - return downButtonPressed; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/ClipboardInstruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/ClipboardInstruction.java deleted file mode 100644 index f5e62d1ab..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/ClipboardInstruction.java +++ /dev/null @@ -1,39 +0,0 @@ - -package net.sourceforge.guacamole.instruction; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public class ClipboardInstruction extends Instruction { - - private String data; - - public ClipboardInstruction(String data) { - this.data = data; - } - - public String getData() { - return data; - } - - @Override - public String toString() { - return "clipboard:" + escape(getData()) + ";"; - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/ErrorInstruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/ErrorInstruction.java deleted file mode 100644 index 36c337784..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/ErrorInstruction.java +++ /dev/null @@ -1,39 +0,0 @@ - -package net.sourceforge.guacamole.instruction; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public class ErrorInstruction extends Instruction { - - private String error; - - public ErrorInstruction(String error) { - this.error = error; - } - - public String getError() { - return error; - } - - @Override - public String toString() { - return "error:" + escape(getError()) + ";"; - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/Instruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/Instruction.java deleted file mode 100644 index b7ed3553f..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/Instruction.java +++ /dev/null @@ -1,63 +0,0 @@ - -package net.sourceforge.guacamole.instruction; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public abstract class Instruction { - - - // All Instructions must provide a toString() implementation - // which returns the properly formatted instruction: - // OPCODE:parm1,parm2,...,parmN; - - @Override - public abstract String toString(); - - public String escape(String str) { - - StringBuffer sb = new StringBuffer(); - - for (int i=0; i. - */ - -public class NameInstruction extends Instruction { - - private String name; - - public NameInstruction(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return "name:" + escape(getName()) + ";"; - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/SizeInstruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/SizeInstruction.java deleted file mode 100644 index 4d4ece13c..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/SizeInstruction.java +++ /dev/null @@ -1,47 +0,0 @@ - -package net.sourceforge.guacamole.instruction; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public class SizeInstruction extends Instruction { - - private int width; - private int height; - - public SizeInstruction(int width, int height) { - this.width = width; - this.height = height; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - @Override - public String toString() { - return "size:" - + getWidth() + "," - + getHeight() + ";"; - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/CopyRectInstruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/CopyRectInstruction.java deleted file mode 100644 index 42cc3b930..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/CopyRectInstruction.java +++ /dev/null @@ -1,78 +0,0 @@ - -package net.sourceforge.guacamole.instruction.framebuffer; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import net.sourceforge.guacamole.instruction.Instruction; - -public class CopyRectInstruction extends Instruction { - - private final int x; - private final int y; - private final int width; - private final int height; - - private final int srcX; - private final int srcY; - - public CopyRectInstruction(int x, int y, int width, int height, int srcX, int srcY) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.srcX = srcX; - this.srcY = srcY; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public int getSrcX() { - return srcX; - } - - public int getSrcY() { - return srcY; - } - - @Override - public String toString() { - return "copy:" - + getSrcX() + "," - + getSrcY() + "," - + getWidth() + "," - + getHeight() + "," - + getX() + "," - + getY() + ";"; - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/CursorInstruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/CursorInstruction.java deleted file mode 100644 index 9122f6f6b..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/CursorInstruction.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.sourceforge.guacamole.instruction.framebuffer; - -import net.sourceforge.guacamole.net.Base64; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import net.sourceforge.guacamole.instruction.Instruction; - -public class CursorInstruction extends Instruction { - - private int x; - private int y; - private PNGImage image; - - public CursorInstruction(int x, int y, PNGImage image) { - this.x = x; - this.y = y; - this.image = image; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public PNGImage getImage() { - return image; - } - - public int getWidth() { - return getImage().getWidth(); - } - - public int getHeight() { - return getImage().getHeight(); - } - - @Override - public String toString() { - return "cursor:" - + getX() + "," - + getY() + "," - + Base64.toString(getImage().getData()) + ";"; - } - - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/DrawRectInstruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/DrawRectInstruction.java deleted file mode 100644 index 5da8ac271..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/DrawRectInstruction.java +++ /dev/null @@ -1,72 +0,0 @@ - -package net.sourceforge.guacamole.instruction.framebuffer; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import net.sourceforge.guacamole.instruction.Instruction; - -public class DrawRectInstruction extends Instruction { - - private final int x; - private final int y; - private final int width; - private final int height; - private final int color; - - public DrawRectInstruction(int x, int y, int width, int height, int color) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.color = color; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public int getColor() { - return color; - } - - @Override - public String toString() { - - return "rect:" - + getX() + "," - + getY() + "," - + getWidth() + "," - + getHeight() + "," - + String.format("#%06X", getColor()) + ";"; - - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/PNGImage.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/PNGImage.java deleted file mode 100644 index 4a74d4a5e..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/PNGImage.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.sourceforge.guacamole.instruction.framebuffer; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Iterator; -import javax.imageio.IIOImage; -import javax.imageio.ImageIO; -import javax.imageio.ImageWriter; -import javax.imageio.stream.ImageOutputStream; -import net.sourceforge.guacamole.GuacamoleException; - -public class PNGImage { - - private int width; - private int height; - private byte[] data; - - public PNGImage(BufferedImage image) throws GuacamoleException { - - width = image.getWidth(); - height = image.getHeight(); - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - try { - writeImage(image, bos); - bos.flush(); - } - catch (IOException e) { - throw new GuacamoleException("I/O Error while creating PNG.", e); - } - - data = bos.toByteArray(); - } - - public byte[] getData() { - return data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - private static void writeImage(BufferedImage image, OutputStream outputStream) throws GuacamoleException, IOException { - - // Obtain list of image writers - // If no such writers exist, fail with error, exit. - Iterator writers = ImageIO.getImageWritersByMIMEType("image/png"); - if (!writers.hasNext()) - throw new GuacamoleException("No useful image writers found."); - - // Obtain JPEG writer - ImageWriter imageWriter = writers.next(); - - // Setup image parameters (including compression quality) - /*ImageWriteParam imageParameters = new JPEGImageWriteParam(Locale.ENGLISH); - imageParameters.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - imageParameters.setCompressionQuality(0.6f); // 60% quality, currently... - imageParameters.setProgressiveMode(ImageWriteParam.MODE_DEFAULT);*/ - - ImageOutputStream out = ImageIO.createImageOutputStream(outputStream); - - // Write image - imageWriter.setOutput(out); - imageWriter.write(null, new IIOImage(image, null, null), null/*imageParameters*/); - imageWriter.dispose(); - - out.flush(); - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/PNGInstruction.java b/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/PNGInstruction.java deleted file mode 100644 index b7f113489..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/instruction/framebuffer/PNGInstruction.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.sourceforge.guacamole.instruction.framebuffer; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import net.sourceforge.guacamole.instruction.Instruction; -import net.sourceforge.guacamole.net.Base64; - -public class PNGInstruction extends Instruction { - - private int x; - private int y; - private PNGImage image; - - public PNGInstruction(int x, int y, PNGImage image) { - this.x = x; - this.y = y; - this.image = image; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public PNGImage getImage() { - return image; - } - - public int getWidth() { - return getImage().getWidth(); - } - - public int getHeight() { - return getImage().getHeight(); - } - - @Override - public String toString() { - return "png:" - + getX() + "," - + getY() + "," - + Base64.toString(getImage().getData()) + ";"; - } - - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java b/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java index d00f4037a..b97931d6a 100644 --- a/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java +++ b/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java @@ -27,8 +27,6 @@ import javax.servlet.http.HttpSessionBindingListener; import net.sourceforge.guacamole.Client; import net.sourceforge.guacamole.GuacamoleClient; import net.sourceforge.guacamole.GuacamoleException; -import net.sourceforge.guacamole.event.KeyEvent; -import net.sourceforge.guacamole.event.PointerEvent; public class GuacamoleSession { diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/InputOutputStream.java b/guacamole/web-client/src/net/sourceforge/guacamole/vnc/InputOutputStream.java deleted file mode 100644 index a796522e9..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/InputOutputStream.java +++ /dev/null @@ -1,63 +0,0 @@ - -package net.sourceforge.guacamole.vnc; - -import java.io.IOException; -import java.io.InputStream; -import java.util.LinkedList; - -public class InputOutputStream extends InputStream { - - private int pos = 0; - private byte[] current = null; - private LinkedList buffer = new LinkedList(); - - public void write(byte[] data) { - - if (data.length == 0) - return; - - if (current == null) - current = data; - else - buffer.addLast(data); - } - - @Override - public int read() throws IOException { - - if (pos >= current.length) { - if (buffer.size() == 0) - throw new IOException("Buffer underrun."); - - current = buffer.removeFirst(); - pos = 0; - } - - return 0xFF & current[pos++]; - - } - - @Override - public int read(byte[] data) throws IOException { - return read(data, 0, data.length); - } - - @Override - public int read(byte[] data, int off, int len) throws IOException { - - if (pos >= current.length) { - if (buffer.size() == 0) - throw new IOException("Buffer underrun."); - - current = buffer.removeFirst(); - pos = 0; - } - - int amountRead = Math.min(current.length - pos, len); - System.arraycopy(current, pos, data, off, amountRead); - pos += amountRead; - - return amountRead; - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCClient.java b/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCClient.java deleted file mode 100644 index 4f5783895..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCClient.java +++ /dev/null @@ -1,1113 +0,0 @@ -package net.sourceforge.guacamole.vnc; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import java.awt.image.WritableRaster; -import net.sourceforge.guacamole.instruction.framebuffer.PNGInstruction; -import net.sourceforge.guacamole.instruction.framebuffer.CursorInstruction; -import net.sourceforge.guacamole.instruction.framebuffer.CopyRectInstruction; -import net.sourceforge.guacamole.event.PointerEvent; -import net.sourceforge.guacamole.event.EventQueue; -import net.sourceforge.guacamole.event.KeyEvent; -import net.sourceforge.guacamole.event.EventHandler; -import java.awt.image.BufferedImage; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; - -import java.net.Socket; -import java.net.InetSocketAddress; -import java.net.SocketTimeoutException; -import java.net.UnknownHostException; -import java.util.LinkedList; - -import javax.crypto.Cipher; -import javax.crypto.spec.DESKeySpec; -import javax.crypto.SecretKeyFactory; -import javax.crypto.BadPaddingException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.IllegalBlockSizeException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.spec.InvalidKeySpecException; -import java.util.zip.InflaterInputStream; -import java.util.zip.Inflater; -import net.sourceforge.guacamole.LegacyClient; - -import net.sourceforge.guacamole.instruction.ClipboardInstruction; -import net.sourceforge.guacamole.instruction.Instruction; -import net.sourceforge.guacamole.instruction.NameInstruction; -import net.sourceforge.guacamole.instruction.SizeInstruction; -import net.sourceforge.guacamole.instruction.framebuffer.PNGImage; -import net.sourceforge.guacamole.GuacamoleException; - -public class VNCClient extends LegacyClient { - - private static final int SECURITY_TYPE_INVALID = 0; - private static final int SECURITY_TYPE_NONE = 1; - private static final int SECURITY_TYPE_VNC_AUTHENTICATION = 2; - - private static final int SECURITY_RESULT_OK = 0; - private static final int SECURITY_RESULT_FAILED = 1; - - private static final int MESSAGE_SET_PIXEL_FORMAT = 0; - private static final int MESSAGE_SET_ENCODINGS = 2; - private static final int MESSAGE_FRAMEBUFFER_UPDATE_REQUEST = 3; - private static final int MESSAGE_KEY_EVENT = 4; - private static final int MESSAGE_POINTER_EVENT = 5; - private static final int MESSAGE_CLIENT_CUT_TEXT = 6; - - private static final int MESSAGE_FRAMEBUFFER_UPDATE = 0; - private static final int MESSAGE_SET_COLORMAP_ENTRIES = 1; - private static final int MESSAGE_BELL = 2; - private static final int MESSAGE_SERVER_CUT_TEXT = 3; - - private static final int HEXTILE_FLAG_RAW = 1; - private static final int HEXTILE_FLAG_BACKGROUND_SPECIFIED = 2; - private static final int HEXTILE_FLAG_FOREGROUND_SPECIFIED = 4; - private static final int HEXTILE_FLAG_ANY_SUBRECTS = 8; - private static final int HEXTILE_FLAG_SUBRECTS_COLORED = 16; - - private static final int ENCODING_RAW = 0; - private static final int ENCODING_COPYRECT = 1; - private static final int ENCODING_RRE = 2; - private static final int ENCODING_HEXTILE = 5; - private static final int ENCODING_ZRLE = 16; - private static final int ENCODING_CURSOR = -239; - - private final Socket sock; - private final DataInputStream input; - private final DataOutputStream output; - - private int frameBufferWidth; - private int frameBufferHeight; - private String name; - - private boolean needRefresh = true; - private VNCImageReader rawReader = null; - - private InputOutputStream toZlib; - private DataInputStream fromZlib; - - public int getFrameBufferHeight() { - return frameBufferHeight; - } - - public int getFrameBufferWidth() { - return frameBufferWidth; - } - - public String getName() { - return name; - } - - public byte reverse(byte b) { - - int input = b & 0xFF; - int output = 0; - - for (int i=0; i<8; i++) { - - output <<= 1; - - if ((input & 0x01) != 0) - output |= 0x01; - - input >>= 1; - - } - - return (byte) output; - } - - // Generates VNC key from string - private byte[] generateVNCAuthKey(String password) throws VNCException { - - try { - // Get password bytes - byte[] passwordBytes = password.getBytes("iso-8859-1"); - if (passwordBytes.length > 8) - throw new VNCException("Password must be 8 characters (bytes) or less."); - - // Reverse bit order of all bytes in array - for (int i=0; i 0 && height > 0) { - BufferedImage image = rawReader.readImage(input, width, height); - - // Construct FramebufferUpdate - PNGInstruction update = new PNGInstruction(dstX, dstY, new PNGImage(image)); - instructions.addLast(update); - - // If full-screen refresh, reset refresh flag. - if (dstX == 0 && dstY == 0 && width == frameBufferWidth && height == frameBufferHeight) - needRefresh = false; - } - } - else if (type == ENCODING_COPYRECT) { - - // Read CopyRect encoding - int srcX = input.readUnsignedShort(); - int srcY = input.readUnsignedShort(); - - // Construct FramebufferUpdate - - if (width > 0 && height > 0) { - CopyRectInstruction update = new CopyRectInstruction(dstX, dstY, width, height, srcX, srcY); - instructions.addLast(update); - } - } - else if (type == ENCODING_RRE) { - - int numSubRects = input.readInt(); - int background = rawReader.readPixel(input); - - BufferedImage image = null; - - if (width > 0 && height > 0) { - image = rawReader.generateBlankImage(width, height); - } - - //instructions.addLast(new DrawRectInstruction(dstX, dstY, width, height, background)); - if (image != null) { - fillRect(image, 0, 0, width, height, background); - } - - for (int j=0; j 0 && height > 0) { - BufferedImage image = rawReader.generateBlankImage(width, height); - WritableRaster raster = image.getWritableTile(0, 0); - - int backgroundColor = 0; - int foregroundColor = 0; - - // For all 16x16 tiles in left-to-right, top-to-bottom order - for (int tileOffsetY = 0; tileOffsetY < height; tileOffsetY += 16) { - - int tileHeight = Math.min(16, height - tileOffsetY); - - for (int tileOffsetX = 0; tileOffsetX < width; tileOffsetX += 16) { - - int tileWidth = Math.min(16, width - tileOffsetX); - - int flags = input.read(); - - // If RAW flag is set, other flags are irrelevant. - if ((flags & HEXTILE_FLAG_RAW) != 0) { - - // Read and draw raw tile - BufferedImage tile = rawReader.readImage(input, tileWidth, tileHeight); - raster.setRect(tileOffsetX, tileOffsetY, tile.getData()); - - } - - // RAW = 0 - else { - - // If background specified, read pixel value - if ((flags & HEXTILE_FLAG_BACKGROUND_SPECIFIED) != 0) - backgroundColor = rawReader.readPixel(input); - - // Draw background - fillRect(image, tileOffsetX, tileOffsetY, tileWidth, tileHeight, backgroundColor); - - // If foreground specified, read pixel value - if ((flags & HEXTILE_FLAG_FOREGROUND_SPECIFIED) != 0) - foregroundColor = rawReader.readPixel(input); - - // If subrects present, read subrects - if ((flags & HEXTILE_FLAG_ANY_SUBRECTS) != 0) { - - // Read number of subrects, determine whether they are colored - int numSubRects = input.read(); - boolean colored = (flags & HEXTILE_FLAG_SUBRECTS_COLORED) != 0; - - int color = foregroundColor; - for (int j=0; j> 4; - int y = position & 0x0F; - - // Read dimensions - int dimensions = input.read(); - int w = (dimensions >> 4) + 1; - int h = (dimensions & 0x0F) + 1; - - fillRect(image, tileOffsetX+x, tileOffsetY+y, w, h, color); - } - - } - - } // end if not raw - - } - } - - // Send as png instruction (rects are too inefficient) - PNGInstruction update = new PNGInstruction(dstX, dstY, new PNGImage(image)); - instructions.addLast(update); - - // If full-screen refresh, reset refresh flag. - if (dstX == 0 && dstY == 0 && width == frameBufferWidth && height == frameBufferHeight) - needRefresh = false; - } - - } - else if (type == ENCODING_ZRLE) { - - // Read ZLIB data - int length = input.readInt(); - byte[] zlibData = new byte[length]; - input.readFully(zlibData); - - // Write data to ZLIB stream - toZlib.write(zlibData); - - - if (width > 0 && height > 0) { - BufferedImage image = rawReader.generateBlankImage(width, height); - WritableRaster raster = image.getWritableTile(0, 0); - - // For all 64x64 tiles in left-to-right, top-to-bottom order - for (int tileOffsetY = 0; tileOffsetY < height; tileOffsetY += 64) { - - int tileHeight = Math.min(64, height - tileOffsetY); - - for (int tileOffsetX = 0; tileOffsetX < width; tileOffsetX += 64) { - - int tileWidth = Math.min(64, width - tileOffsetX); - - // Get subencoding type (RLE flag + palette size) - int subencodingType = fromZlib.read(); - - // If RAW, just read raw image - if (subencodingType == 0) { - - // Read and draw raw tile - if (image != null) { - BufferedImage tile = rawReader.readCImage(fromZlib, tileWidth, tileHeight); - raster.setRect(tileOffsetX, tileOffsetY, tile.getData()); - } - - } - - // If single color... - else if (subencodingType == 1) { - - // Read color - int color = rawReader.readCPixel(fromZlib); - - // Draw solid rectangle - if (image != null) { - fillRect(image, tileOffsetX, tileOffsetY, tileWidth, tileHeight, color); - } - - } - - // Packed palette - else if (subencodingType >= 2 && subencodingType <= 16) { - - int paletteSize = subencodingType; - int[] palette = new int[paletteSize]; - - // Read palette - for (int j=0; j> (8 - indexBits); - buffer <<= indexBits; - bitsAvailable -= indexBits; - - // Write pixel to image - image.setRGB(tileOffsetX+x, tileOffsetY+y, 0xFF000000 | palette[index]); - - } - } - - } - - // Plain RLE - else if (subencodingType == 128) { - - int color = -1; - int runRemaining= 0; - - for (int y=0; y= 130 && subencodingType <= 255) { - - int paletteSize = subencodingType - 128; - int[] palette = new int[paletteSize]; - - // Read palette - for (int j=0; j 0 && height > 0) { - BufferedImage image = rawReader.readImage(input, width, height); - - // Read cursor mask - for (int y=0; y> 8; - int green = input.readUnsignedShort() >> 8; - int blue = input.readUnsignedShort() >> 8; - - reds[i] = (byte) red; - greens[i] = (byte) green; - blues[i] = (byte) blue; - alphas[i] = (byte) 0xFF; - } - - // Set reader - rawReader = new VNCIndexedImageReader(reds, greens, blues); - } - - private void handleBell() { - // Do nothing, currently - // This message has no data, so no need to dummy-read. - log("BELL!"); - } - - private void handleServerCutText() throws IOException { - - byte[] padding = new byte[3]; - input.readFully(padding); - - int length = input.readInt(); - byte[] textBytes = new byte[length]; - input.readFully(textBytes); - - String clipboard = new String(textBytes, "UTF-8"); - instructions.addLast(new ClipboardInstruction(clipboard)); - } - - private void setPixelFormat(int bitsPerPixel, int depth, - boolean bigEndian, boolean trueColor, - int redMax, int greenMax, int blueMax, - int redShift, int greenShift, int blueShift) - throws IOException { - - synchronized (output) { - output.writeByte(MESSAGE_SET_PIXEL_FORMAT); - output.writeBytes(" "); // Padding - output.writeByte(bitsPerPixel); - output.writeByte(depth); - output.writeBoolean(bigEndian); - output.writeBoolean(trueColor); - output.writeShort(redMax); - output.writeShort(greenMax); - output.writeShort(blueMax); - output.writeByte(redShift); - output.writeByte(greenShift); - output.writeByte(blueShift); - output.writeBytes(" "); // Padding - output.flush(); - } - - } - - // Last is most recent message. - private final Object instructionLock = new Object(); - private LinkedList instructions = new LinkedList(); - - @Override - public void setClipboard(String clipboard) throws GuacamoleException { - try { - sendClipboard(clipboard); - } - catch (IOException e) { - throw new GuacamoleException("Could not send clipboard data to VNC server (network error).", e); - } - } - - @Override - public void send(KeyEvent event) throws GuacamoleException { - try { - // Add to queue - keyEvents.add(event); - } - catch (IOException e) { - throw new GuacamoleException("Could not send keyboard event to VNC server (network error).", e); - } - } - - @Override - public void send(PointerEvent event) throws GuacamoleException { - try { - // Add to queue - pointerEvents.add(event); - } - catch (IOException e) { - throw new GuacamoleException("Could not send pointer event to VNC server (network error).", e); - } - } - - private static final int EVENT_DEADLINE = 500; - - private EventQueue keyEvents = new EventQueue(new EventHandler() { - - public void handle(KeyEvent e) throws IOException { - sendKeyEvent(e.getPressed(), e.getKeySym()); - } - - }, EVENT_DEADLINE); - - private EventQueue pointerEvents = new EventQueue(new EventHandler() { - - public void handle(PointerEvent e) throws IOException { - sendPointerEvent( - e.isLeftButtonPressed(), - e.isMiddleButtonPressed(), - e.isRightButtonPressed(), - e.isUpButtonPressed(), - e.isDownButtonPressed(), - e.getX(), - e.getY() - ); - } - - }, EVENT_DEADLINE); - - private void sendClipboard(String clipboard) throws IOException { - - synchronized (output) { - output.writeByte(MESSAGE_CLIENT_CUT_TEXT); - output.writeBytes(" "); // Padding - - byte[] encodedString = clipboard.getBytes("UTF-8"); - - output.writeInt(encodedString.length); - output.write(encodedString); - output.flush(); - } - - } - - private void sendKeyEvent(boolean pressed, int keysym) throws IOException { - - synchronized (output) { - output.writeByte(MESSAGE_KEY_EVENT); - output.writeBoolean(pressed); - output.writeBytes(" "); // Padding - output.writeInt(keysym); - output.flush(); - } - - //log("Sent key event."); - } - - private void sendPointerEvent(boolean left, boolean middle, boolean right, boolean up, boolean down, int x, int y) throws IOException { - - int buttonMask = 0; - if (left) buttonMask |= 1; - if (middle) buttonMask |= 2; - if (right) buttonMask |= 4; - if (up) buttonMask |= 8; - if (down) buttonMask |= 16; - - synchronized (output) { - output.writeByte(MESSAGE_POINTER_EVENT); - output.writeByte(buttonMask); - output.writeShort(x); - output.writeShort(y); - output.flush(); - } - - //log("Sent pointer event."); - } - - private void sendEncodings(int... encodings) throws IOException { - - synchronized (output) { - output.writeByte(MESSAGE_SET_ENCODINGS); - output.writeBytes(" "); // padding - output.writeShort(encodings.length); - - for (int encoding : encodings) - output.writeInt(encoding); - } - - } - - @Override - public Instruction nextInstruction(boolean blocking) - throws GuacamoleException { - - synchronized (instructionLock) { - if (instructions.size() == 0) { - - if (blocking) { - try { - // Send framebuffer update request - synchronized (output) { - output.writeByte(MESSAGE_FRAMEBUFFER_UPDATE_REQUEST); - output.writeBoolean(!needRefresh); // Incremental - output.writeShort(0); // x - output.writeShort(0); // y - output.writeShort(frameBufferWidth); // width - output.writeShort(frameBufferHeight); // height - output.flush(); - } - } - catch (IOException e) { - throw new GuacamoleException("Could not send framebuffer update request to VNC server (network error).", e); - } - } - - // Handle incoming messages, blocking until one message exists - try { - handleMessages(blocking); - } - catch (IOException e) { - throw new GuacamoleException("Could not read messages from VNC server (network error).", e); - } - catch (VNCException e) { - throw new GuacamoleException(e); - } - - } - - // If no messages, return null. - if (instructions.size() == 0) - return null; - - // Send messages, oldest first - return instructions.removeFirst(); - } - - } - - private void log(String str) { - System.err.println(str); - } - - @Override - public void disconnect() throws GuacamoleException { - try { - - // Close event queues - keyEvents.close(); - pointerEvents.close(); - - // Close socket - sock.close(); - } - catch (IOException e) { - throw new GuacamoleException("Network error while closing socket.", e); - } - } -} - diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCConfiguration.java b/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCConfiguration.java deleted file mode 100644 index a0a68ad3a..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCConfiguration.java +++ /dev/null @@ -1,60 +0,0 @@ - -package net.sourceforge.guacamole.vnc; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import net.sourceforge.guacamole.net.Configuration; -import net.sourceforge.guacamole.GuacamoleException; -import javax.servlet.ServletContext; - -public class VNCConfiguration extends Configuration { - - private String hostname; - private int port; - private String password; - private int bpp; - - public VNCConfiguration(ServletContext context) throws GuacamoleException { - - super(context); - - hostname = readParameter("host", null); - port = readIntParameter("port", null); - password = context.getInitParameter("password"); - bpp = readIntParameter("bpp", 24, 8, 16, 24); - - } - - public int getBPP() { - return bpp; - } - - public String getPassword() { - return password; - } - - public String getHostname() { - return hostname; - } - - public int getPort() { - return port; - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCException.java b/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCException.java deleted file mode 100644 index ae14c65bd..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCException.java +++ /dev/null @@ -1,32 +0,0 @@ - -package net.sourceforge.guacamole.vnc; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -public class VNCException extends Exception { - - public VNCException(String message, Throwable cause) { - super(message, cause); - } - - public VNCException(String message) { - super(message); - } - -} diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCFullColorImageReader.java b/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCFullColorImageReader.java deleted file mode 100644 index 9509d4204..000000000 --- a/guacamole/web-client/src/net/sourceforge/guacamole/vnc/VNCFullColorImageReader.java +++ /dev/null @@ -1,239 +0,0 @@ -package net.sourceforge.guacamole.vnc; - -/* - * Guacamole - Pure JavaScript/HTML VNC Client - * Copyright (C) 2010 Michael Jumper - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import java.awt.image.BufferedImage; -import java.awt.image.IndexColorModel; -import java.io.DataInputStream; -import java.io.IOException; - - -public class VNCFullColorImageReader extends VNCImageReader { - - private int bpp; - private int depth; - - private int redBits; - private int greenBits; - private int blueBits; - - private int redMax; - private int greenMax; - private int blueMax; - - private int redShift; - private int greenShift; - private int blueShift; - - private boolean readAsIndexed; - private boolean bigEndian; - - private boolean swapRedAndBlue; - - public boolean isBigEndian() { - return bigEndian; - } - - public int getBitsPerPixel() { - return bpp; - } - - public int getDepth() { - return depth; - } - - public int getRedMax() { - return redMax; - } - - public int getGreenMax() { - return greenMax; - } - - public int getBlueMax() { - return blueMax; - } - - public int getRedShift() { - return redShift; - } - - public int getGreenShift() { - return greenShift; - } - - public int getBlueShift() { - return blueShift; - } - - // Set up BGR reader - public VNCFullColorImageReader(boolean bigEndian, int redBits, int greenBits, int blueBits, int outputBPP, boolean swapRedAndBlue) throws VNCException { - - this.swapRedAndBlue = swapRedAndBlue; - - depth = redBits + greenBits + blueBits; - - if (depth > 0 && depth <= 8) - bpp = 8; - else if (depth <= 16) - bpp = 16; - else if (depth <= 32) - bpp = 32; - else - throw new VNCException("Illegal bit depth for VNC images: " + bpp); - - this.redBits = redBits; - this.greenBits = greenBits; - this.blueBits = blueBits; - - blueMax = (1 << blueBits) - 1; - greenMax = (1 << greenBits) - 1; - redMax = (1 << redBits) - 1; - - redShift = greenBits + blueBits; - greenShift = blueBits; - blueShift = 0; - - if (outputBPP == 8) - this.readAsIndexed = true; - else if (outputBPP == 24) - this.readAsIndexed = false; - else - throw new VNCException("Only 8-bit or 24-bit output is supported."); - - } - - @Override - public int readCPixel(DataInputStream input) throws IOException { - - if (redBits != 8 || greenBits != 8 || blueBits != 8) - return readPixel(input); - - int red; - int green; - int blue; - - if (bigEndian) { - red = input.read(); - green = input.read(); - blue = input.read(); - } - else { - blue = input.read(); - green = input.read(); - red = input.read(); - } - - if (swapRedAndBlue) - return (blue << 16) | (green << 8) | red; - else - return (red << 16) | (green << 8) | blue; - } - - @Override - public int readPixel(DataInputStream input) throws IOException { - int value; - switch (bpp) { - case 8: - value = input.read(); - break; - case 16: - - short inputShort = input.readShort(); - if (!bigEndian) inputShort = Short.reverseBytes(inputShort); - - value = inputShort; - break; - case 32: - - int inputInt = input.readInt(); - if (!bigEndian) inputInt = Integer.reverseBytes(inputInt); - - value = inputInt; - break; - default: - throw new IOException("Invalid BPP."); - } - - int red = (value >> redShift) & redMax; - int green = (value >> greenShift) & greenMax; - int blue = (value >> blueShift) & blueMax; - - red <<= 8 - redBits; - green <<= 8 - greenBits; - blue <<= 8 - blueBits; - - if (swapRedAndBlue) - return (blue << 16) | (green << 8) | red; - else - return (red << 16) | (green << 8) | blue; - } - - @Override - public BufferedImage generateBlankImage(int width, int height) { - if (readAsIndexed) - return new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED, COLOR_MODEL); - return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - } - - // Load color model - public static final IndexColorModel COLOR_MODEL; - static { - // Construct color model - byte[] colorShade = {0, (byte) 51, (byte) 104, (byte) 153, (byte) 204, (byte) 255}; - byte[] greyShade = new byte[39]; - for (int i=1; i<40; i++) - greyShade[i-1] = (byte) (6*i); - - byte[] red = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - byte[] green = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - byte[] blue = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - byte[] alpha = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - - int color = 0; - for (int r=0; r. - */ - -import java.awt.image.BufferedImage; -import java.io.DataInputStream; -import java.io.IOException; - -public abstract class VNCImageReader { - - public BufferedImage readCImage(DataInputStream input, int width, int height) throws IOException { - - BufferedImage image = generateBlankImage(width, height); - // Read image - - for (int pixelY=0; pixelY. - */ - -import java.awt.image.BufferedImage; -import java.awt.image.IndexColorModel; -import java.io.DataInputStream; -import java.io.IOException; - - -public class VNCIndexedImageReader extends VNCImageReader { - - private IndexColorModel palette; - private byte[] red; - private byte[] green; - private byte[] blue; - - // Set up BGR reader - public VNCIndexedImageReader(byte[] red, byte[] green, byte[] blue) throws VNCException { - - this.red = red; - this.green = green; - this.blue = blue; - - palette = new IndexColorModel(8, 256, red, green, blue); - if (palette.getMapSize() != 256) - throw new VNCException("Currently, only 256-color maps are supported."); - - } - - @Override - public int readPixel(DataInputStream input) throws IOException { - int value = input.read(); - int color = (red[value] << 16) | (green[value] << 8) | blue[value]; - return color; - } - - @Override - public BufferedImage generateBlankImage(int width, int height) { - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED, palette); - return image; - } - - // Load color model - public static final IndexColorModel COLOR_MODEL; - static { - // Construct color model - byte[] colorShade = {0, (byte) 51, (byte) 104, (byte) 153, (byte) 204, (byte) 255}; - byte[] greyShade = new byte[39]; - for (int i=1; i<40; i++) - greyShade[i-1] = (byte) (6*i); - - byte[] red = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - byte[] green = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - byte[] blue = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - byte[] alpha = new byte[colorShade.length*colorShade.length*colorShade.length+greyShade.length+1]; - - int color = 0; - for (int r=0; r