From 5f0a0f12e1e317d6ac2e053cea71925aedd3009c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Fri, 29 Nov 2013 09:16:07 +0000 Subject: [PATCH] ... --- tutorials/java/build/built-jar.properties | 2 +- tutorials/java/dist/phpdbg-ui.jar | Bin 26065 -> 26211 bytes tutorials/java/src/phpdbg/ui/DBGThread.java | 99 +++++ tutorials/java/src/phpdbg/ui/History.java | 49 +++ .../java/src/phpdbg/ui/JTerminalPane.java | 162 ++++++++ tutorials/java/src/phpdbg/ui/Main.form | 179 +++++++++ tutorials/java/src/phpdbg/ui/Main.java | 364 ++++++++++++++++++ 7 files changed, 854 insertions(+), 1 deletion(-) create mode 100644 tutorials/java/src/phpdbg/ui/DBGThread.java create mode 100644 tutorials/java/src/phpdbg/ui/History.java create mode 100644 tutorials/java/src/phpdbg/ui/JTerminalPane.java create mode 100644 tutorials/java/src/phpdbg/ui/Main.form create mode 100644 tutorials/java/src/phpdbg/ui/Main.java diff --git a/tutorials/java/build/built-jar.properties b/tutorials/java/build/built-jar.properties index 3a123e3581..e642ca0347 100644 --- a/tutorials/java/build/built-jar.properties +++ b/tutorials/java/build/built-jar.properties @@ -1,4 +1,4 @@ -#Fri, 29 Nov 2013 08:22:06 +0000 +#Fri, 29 Nov 2013 09:01:15 +0000 /usr/src/phpdbg/tutorials/java= diff --git a/tutorials/java/dist/phpdbg-ui.jar b/tutorials/java/dist/phpdbg-ui.jar index c4dbea33ad1cba28fa6ffb2120431dcb90dbea60..a2c3c7521e1e31523199ea80585084ed35b529a5 100644 GIT binary patch delta 9851 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 VE0S=_ii2I;t!1s_ew?P<{|8uwF!lfd delta 9641 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 diff --git a/tutorials/java/src/phpdbg/ui/DBGThread.java b/tutorials/java/src/phpdbg/ui/DBGThread.java new file mode 100644 index 0000000000..ee778258fc --- /dev/null +++ b/tutorials/java/src/phpdbg/ui/DBGThread.java @@ -0,0 +1,99 @@ +package phpdbg.ui; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * Manage input and output data + * @author krakjoe + */ +public class DBGThread extends Socket implements Runnable { + private final Boolean reader; + private final Main main; + private Boolean quit; + + public DBGThread(final String host, final Integer port, final Main main, Boolean reader) throws IOException { + super(host, port); + + this.main = main; + this.reader = reader; + this.quit = false; + + synchronized(main) { + if (!main.isConnected()) { + main.setConnected(true); + } + } + } + + public void quit() { + synchronized(this) { + quit = true; + this.notifyAll(); + } + } + + @Override public void run() { + try { + synchronized(this) { + do { + if (reader) { + String command; + OutputStream output = getOutputStream(); + + this.wait(); + + command = main.getInputField().getText(); + /* send command to stdin socket */ + if (command != null) { + output.write( + command.getBytes()); + output.write("\n".getBytes()); + output.flush(); + } + main.getInputField().setText(null); + } else { + InputStream input = getInputStream(); + /* get data from stdout socket */ + byte[] bytes = new byte[1]; + do { + /* this is some of the laziest programming I ever done */ + if (input.available() == 0) { + this.wait(400); + continue; + } + + if (input.read(bytes, 0, 1) > -1) { + main.getOutputField() + .appendANSI(new String(bytes)); + } + } while (!quit); + } + } while(!quit); + } + } catch (IOException | InterruptedException ex) { + if (!quit) { + main.messageBox(ex.getMessage()); + } + } finally { + try { + close(); + } catch (IOException ex) { /* naughty me */ } finally { + synchronized(main) { + if (main.isConnected()) { + main.setConnected(false); + } + } + } + } + } +} diff --git a/tutorials/java/src/phpdbg/ui/History.java b/tutorials/java/src/phpdbg/ui/History.java new file mode 100644 index 0000000000..2950087ef8 --- /dev/null +++ b/tutorials/java/src/phpdbg/ui/History.java @@ -0,0 +1,49 @@ +package phpdbg.ui; + + +import java.util.ArrayList; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * Implement a simple history list for command input + * @author krakjoe + */ +public class History extends ArrayList { + private Integer position = new Integer(0); + + public History() { + super(); + } + + @Override public boolean add(String text) { + String last = last(); + if (text != null) { + if (last == null || !last.equals(text)) { + if (super.add(text)) { + position = size(); + return true; + } + } + } + return false; + } + + public String last() { + if (position >= 1) { + position--; + return get(position); + } else return new String(); + } + + public String next() { + if (position+1 < size()) { + position++; + return get(position); + } else return new String(); + } +} \ No newline at end of file diff --git a/tutorials/java/src/phpdbg/ui/JTerminalPane.java b/tutorials/java/src/phpdbg/ui/JTerminalPane.java new file mode 100644 index 0000000000..eb93891688 --- /dev/null +++ b/tutorials/java/src/phpdbg/ui/JTerminalPane.java @@ -0,0 +1,162 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package phpdbg.ui; + +/** + * + * @author krakjoe + */ +import javax.swing.*; +import javax.swing.text.*; +import java.awt.Color; + +public class JTerminalPane extends JTextPane { + + private static final Color D_Black = Color.getHSBColor( 0.000f, 0.000f, 0.000f ); + private static final Color D_Red = Color.getHSBColor( 0.000f, 1.000f, 0.502f ); + private static final Color D_Blue = Color.getHSBColor( 0.667f, 1.000f, 0.502f ); + private static final Color D_Magenta = Color.getHSBColor( 0.833f, 1.000f, 0.502f ); + private static final Color D_Green = Color.getHSBColor( 0.333f, 1.000f, 0.502f ); + private static final Color D_Yellow = Color.getHSBColor( 0.167f, 1.000f, 0.502f ); + private static final Color D_Cyan = Color.getHSBColor( 0.500f, 1.000f, 0.502f ); + private static final Color D_White = Color.getHSBColor( 0.000f, 0.000f, 0.753f ); + private static final Color B_Black = Color.getHSBColor( 0.000f, 0.000f, 0.502f ); + private static final Color B_Red = Color.getHSBColor( 0.000f, 1.000f, 1.000f ); + private static final Color B_Blue = Color.getHSBColor( 0.667f, 1.000f, 1.000f ); + private static final Color B_Magenta = Color.getHSBColor( 0.833f, 1.000f, 1.000f ); + private static final Color B_Green = Color.getHSBColor( 0.333f, 1.000f, 1.000f ); + private static final Color B_Yellow = Color.getHSBColor( 0.167f, 1.000f, 1.000f ); + private static final Color B_Cyan = Color.getHSBColor( 0.500f, 1.000f, 1.000f ); + private static final Color B_White = Color.getHSBColor( 0.000f, 0.000f, 1.000f ); + private static final Color cReset = Color.getHSBColor( 0.000f, 0.000f, 0.000f ); + + private Color colorCurrent = cReset; + private String remaining = ""; + + public JTerminalPane() { + super(); + } + + public void append(Color c, String s) { + StyleContext sc = StyleContext.getDefaultStyleContext(); + AttributeSet aset = sc.addAttribute( + SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c); + setCaretPosition(getDocument().getLength()); + setCharacterAttributes(aset, false); + replaceSelection(s); + } + + public void appendANSI(String s) { + int aPos = 0; + int aIndex; + int mIndex; + String tmpString; + boolean stillSearching; + + String addString = remaining + s; + + remaining = ""; + + if (addString.length() > 0) { + aIndex = addString.indexOf("\u001B"); + if (aIndex == -1) { + append(colorCurrent,addString); + return; + } + + if (aIndex > 0) { + tmpString = addString.substring(0,aIndex); + append(colorCurrent, tmpString); + aPos = aIndex; + } + + stillSearching = true; + while (stillSearching) { + mIndex = addString.indexOf("m",aPos); + if (mIndex < 0) { + remaining = addString.substring(aPos,addString.length()); + stillSearching = false; + continue; + } + else { + tmpString = addString.substring(aPos,mIndex+1); + colorCurrent = getANSIColor(tmpString); + } + aPos = mIndex + 1; + + aIndex = addString.indexOf("\u001B", aPos); + + if (aIndex == -1) { + tmpString = addString.substring(aPos,addString.length()); + append(colorCurrent, tmpString); + stillSearching = false; + continue; + } + tmpString = addString.substring(aPos,aIndex); + aPos = aIndex; + append(colorCurrent, tmpString); + } + } + } + + public Color getANSIColor(String ANSIColor) { + switch (ANSIColor) { + case "\u001B[30m": + return D_Black; + case "\u001B[31m": + return D_Red; + case "\u001B[32m": + return D_Green; + case "\u001B[33m": + return D_Yellow; + case "\u001B[34m": + return D_Blue; + case "\u001B[35m": + return D_Magenta; + case "\u001B[36m": + return D_Cyan; + case "\u001B[37m": + return D_White; + case "\u001B[0;30m": + return D_Black; + case "\u001B[0;31m": + return D_Red; + case "\u001B[0;32m": + return D_Green; + case "\u001B[0;33m": + return D_Yellow; + case "\u001B[0;34m": + return D_Blue; + case "\u001B[0;35m": + return D_Magenta; + case "\u001B[0;36m": + return D_Cyan; + case "\u001B[0;37m": + return D_White; + case "\u001B[1;30m": + return B_Black; + case "\u001B[1;31m": + return B_Red; + case "\u001B[1;32m": + return B_Green; + case "\u001B[1;33m": + return B_Yellow; + case "\u001B[1;34m": + return B_Blue; + case "\u001B[1;35m": + return B_Magenta; + case "\u001B[1;36m": + return B_Cyan; + case "\u001B[1;37m": + return B_White; + case "\u001B[0m": + return cReset; + default: + return B_White; + } + } +} diff --git a/tutorials/java/src/phpdbg/ui/Main.form b/tutorials/java/src/phpdbg/ui/Main.form new file mode 100644 index 0000000000..4d4323517e --- /dev/null +++ b/tutorials/java/src/phpdbg/ui/Main.form @@ -0,0 +1,179 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/tutorials/java/src/phpdbg/ui/Main.java b/tutorials/java/src/phpdbg/ui/Main.java new file mode 100644 index 0000000000..62942cbcd8 --- /dev/null +++ b/tutorials/java/src/phpdbg/ui/Main.java @@ -0,0 +1,364 @@ +package phpdbg.ui; + + +import static java.awt.event.KeyEvent.VK_DOWN; +import static java.awt.event.KeyEvent.VK_ENTER; +import static java.awt.event.KeyEvent.VK_UP; +import java.io.IOException; +import javax.swing.JOptionPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author krakjoe + */ +public class Main extends javax.swing.JDialog { + /** + * Creates user interface + * @param parent + * @param modal + */ + public Main(java.awt.Frame parent, boolean modal) { + super(parent, modal); + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + stdoutPopupMenu = new javax.swing.JPopupMenu(); + resetStdout = new javax.swing.JMenuItem(); + mainSplit = new javax.swing.JSplitPane(); + input = new javax.swing.JTextField(); + outputScrollPane = new javax.swing.JScrollPane(); + output = new phpdbg.ui.JTerminalPane(); + host = new javax.swing.JTextField(); + stdoutPort = new javax.swing.JTextField(); + stdinCheckBox = new javax.swing.JCheckBox(); + stdoutCheckBox = new javax.swing.JCheckBox(); + openButton = new javax.swing.JButton(); + stdinPort = new javax.swing.JTextField(); + hostLabel = new javax.swing.JLabel(); + + resetStdout.setText("Clear"); + resetStdout.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + resetStdoutActionPerformed(evt); + } + }); + stdoutPopupMenu.add(resetStdout); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("phpdbg jui"); + + mainSplit.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + mainSplit.setToolTipText(""); + + input.setToolTipText(""); + input.setEnabled(false); + input.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + inputKeyReleased(evt); + } + }); + mainSplit.setLeftComponent(input); + + outputScrollPane.setViewportView(output); + + mainSplit.setRightComponent(outputScrollPane); + + host.setText("127.0.0.1"); + host.setToolTipText("Set the hostname, or IPv4 address of the machine running the phpdbg remote console server"); + + stdoutPort.setText("8000"); + stdoutPort.setToolTipText(""); + + stdinCheckBox.setSelected(true); + stdinCheckBox.setText("stdin:"); + stdinCheckBox.setToolTipText("Set the port for stdin, or uncheck to disable stdin"); + + stdoutCheckBox.setSelected(true); + stdoutCheckBox.setText("stdout:"); + stdoutCheckBox.setToolTipText("Set the port for stdout, or unset to disable stdout"); + + openButton.setActionCommand("open"); + openButton.setLabel("open"); + openButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + openButtonActionPerformed(evt); + } + }); + + stdinPort.setText("4000"); + stdinPort.setToolTipText(""); + + hostLabel.setText("Hostname:"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(mainSplit) + .addGroup(layout.createSequentialGroup() + .addComponent(hostLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(host, javax.swing.GroupLayout.DEFAULT_SIZE, 359, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(stdinCheckBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(stdinPort, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(stdoutCheckBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(stdoutPort, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(openButton))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(mainSplit, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(host, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(openButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(stdoutPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(stdinCheckBox) + .addComponent(stdoutCheckBox) + .addComponent(stdinPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(hostLabel))) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void inputKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inputKeyReleased + switch (evt.getKeyCode()) { + case VK_ENTER: { + if (in != null) { + history.add(input.getText()); + synchronized(in) { + in.notifyAll(); + } + } + } break; + + case VK_UP: { + String last = history.last(); + if (last.length() > 0) { + input.setText(last); + } + } break; + + case VK_DOWN: { + String next = history.next(); + if (next.length() > 0) { + input.setText(next); + } + } break; + } + }//GEN-LAST:event_inputKeyReleased + + private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed + try { + if (!connected) { + Integer ports[] = new Integer[2]; + String address = getHost(); + + if (address != null) { + ports[0] = stdinCheckBox.isSelected() ? getStdinPort() : -1; + ports[1] = stdoutCheckBox.isSelected() ? getStdoutPort() : -1; + + if (ports[0] != 0 && ports[1] != 0) { + if (stdinCheckBox.isSelected()) { + if (ports[0] > 0) { + in = new DBGThread( + address, ports[0], this, true); + new Thread(in).start(); + } + } + + if (stdoutCheckBox.isSelected()) { + if (ports[1] > 0) { + out = new DBGThread( + address, ports[1], this, false); + new Thread(out).start(); + } + } + } + } + } else { + if (in != null) { + in.quit(); + } + if (out != null) { + out.quit(); + } + } + } catch (IOException ex) { + messageBox(ex.getMessage()); + } + }//GEN-LAST:event_openButtonActionPerformed + + private void resetStdoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetStdoutActionPerformed + // TODO add your handling code here: + output.setText(null); + }//GEN-LAST:event_resetStdoutActionPerformed + + public Boolean isConnected() { + return connected; + } + + public void setConnected(Boolean isConnected) { + synchronized(this) { + if (isConnected) { + connected = true; + openButton.setText("Disconnect"); + host.setEnabled(false); + stdinPort.setEnabled(false); + stdinCheckBox.setEnabled(false); + if (stdinCheckBox.isSelected()) { + input.setEnabled(true); + } else input.setEnabled(false); + stdoutPort.setEnabled(false); + stdoutCheckBox.setEnabled(false); + } else { + connected = false; + openButton.setText("Connect"); + host.setEnabled(true); + stdinPort.setEnabled(true); + input.setEnabled(false); + stdinCheckBox.setEnabled(true); + stdoutPort.setEnabled(true); + stdoutCheckBox.setEnabled(true); + } + } + } + + public JTextField getInputField() { return input; } + public JTerminalPane getOutputField() { return output; } + + public String getHost() { + String address = host.getText(); + if (address != null && address.length() > 0) { + return address; + } else { + messageBox("Invalid hostname provided !"); + } + + return null; + } + + public Integer getStdinPort() { + try { + return Integer.parseInt(stdinPort.getText()); + } catch (NumberFormatException ex) { + messageBox("Invalid stdin port provided !"); + } + + return 0; + } + + public Integer getStdoutPort() { + try { + return Integer.parseInt(stdoutPort.getText()); + } catch (NumberFormatException ex) { + messageBox("Invalid stdout port provided !"); + } + + return 0; + } + + public synchronized void messageBox(String message) { + JOptionPane.showMessageDialog(this, message); + } + /** + * @param args the command line arguments + */ + public static void main(final String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the dialog */ + java.awt.EventQueue.invokeLater(new Runnable() { + @Override public void run() { + dialog = new Main(new javax.swing.JFrame(), true); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent e) { + if (in != null) + in.quit(); + + if (out != null) + out.quit(); + + System.exit(0); + } + }); + dialog.setVisible(true); + } + }); + } + + private static DBGThread in; + private static DBGThread out; + private static Main dialog; + private static Boolean connected = false; + private static History history = new History(); + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField host; + private javax.swing.JLabel hostLabel; + private javax.swing.JTextField input; + private javax.swing.JSplitPane mainSplit; + private javax.swing.JButton openButton; + private phpdbg.ui.JTerminalPane output; + private javax.swing.JScrollPane outputScrollPane; + private javax.swing.JMenuItem resetStdout; + private javax.swing.JCheckBox stdinCheckBox; + private javax.swing.JTextField stdinPort; + private javax.swing.JCheckBox stdoutCheckBox; + private javax.swing.JPopupMenu stdoutPopupMenu; + private javax.swing.JTextField stdoutPort; + // End of variables declaration//GEN-END:variables +} -- 2.50.1