Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: XDebug Core
+Bundle-Name: XDebug Core Plug-in
Bundle-SymbolicName: net.sourceforge.phpeclipse.xdebug.core;singleton:=true
-Bundle-Version: 0.0.1
+Bundle-Version: 0.0.0
Bundle-ClassPath: core.jar
Bundle-Activator: net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin
-Bundle-Vendor: PHPEclipse project team
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
org.eclipse.debug.core,
- org.eclipse.core.resources
+ org.eclipse.core.resources,
+ net.sourceforge.phpeclipse,
+ net.sourceforge.phpeclipse.externaltools
Provide-Package: net.sourceforge.phpeclipse.xdebug.core,
net.sourceforge.phpeclipse.xdebug.php.launching,
net.sourceforge.phpeclipse.xdebug.php.model
-Export-Package: net.sourceforge.phpeclipse.xdebug.core,
- net.sourceforge.phpeclipse.xdebug.php.launching,
- net.sourceforge.phpeclipse.xdebug.php.model
Bundle-RequiredExecutionEnvironment: J2SE-1.4
Eclipse-LazyStart: true
+Bundle-ManifestVersion: 2
bin.includes = META-INF/,\
core.jar,\
plugin.xml
-src.includes = src/,\
- plugin.xml,\
- build.properties,\
- META-INF/,\
- .project,\
- .classpath
name="PHP XDebug Script"
sourceLocatorId="net.sourceforge.phpeclipse.xdebug.core.sourceLookupDirector.php"
sourcePathComputerId="net.sourceforge.phpeclipse.xdebug.core.sourcePathComputer.php"/>
+ <launchConfigurationType
+ delegate="net.sourceforge.phpeclipse.xdebug.php.launching.PHPRemoteLaunchConfigurationDelegate"
+ id="net.sourceforge.phpeclipse.xdebug.php.remotelaunch"
+ modes="debug"
+ name="PHP XDebug Remote Script"
+ sourceLocatorId="net.sourceforge.phpeclipse.xdebug.core.sourceLookupDirector.php"
+ sourcePathComputerId="net.sourceforge.phpeclipse.xdebug.core.sourcePathComputer.php"/>
</extension>
<extension
point="org.eclipse.debug.core.sourceLocators">
<super type="org.eclipse.debug.core.lineBreakpointMarker"/>
</extension>
+ <extension
+ point="org.eclipse.debug.core.watchExpressionDelegates">
+ <watchExpressionDelegate
+ debugModel="net.sourceforge.phpeclipse.xdebug.php"
+ delegateClass="net.sourceforge.phpeclipse.xdebug.php.model.XDebugWatchExpressionDelegate"/>
+ </extension>
</plugin>
--- /dev/null
+/**
+ *
+ */
+package net.sourceforge.phpeclipse.xdebug.core;
+
+/**
+ * @author Christian Perkonig
+ *
+ */
+public abstract class AbstractDebugConnection implements IDebugConnection {
+ protected boolean fInitialized = false;
+ protected boolean fIsClosed = true;
+
+ protected String fSessionID = "";
+
+ public String getSessionID() {
+ return fSessionID;
+ }
+
+ public boolean isInitialized() {
+ return fInitialized;
+ }
+
+ public boolean isClosed() {
+ return fIsClosed;
+ }
+}
\ No newline at end of file
package net.sourceforge.phpeclipse.xdebug.core;
-
/**
* Encodes and decodes to and from Base64 notation.
- *
+ *
* <p>
* Change Log:
* </p>
* <ul>
- * <li>v2.1 - Cleaned up javadoc comments and unused variables and methods.
- * Added some convenience methods for reading and writing to and from files.</li>
- * <li>v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on
- * systems with other encodings (like EBCDIC).</li>
- * <li>v2.0.1 - Fixed an error when decoding a single byte, that is, when the
- * encoded data was a single byte.</li>
- * <li>v2.0 - I got rid of methods that used booleans to set options. Now
- * everything is more consolidated and cleaner. The code now detects when data
- * that's being decoded is gzip-compressed and will decompress it automatically.
- * Generally things are cleaner. You'll probably have to change some method
- * calls that you were making to support the new options format (<tt>int</tt>s
- * that you "OR" together).</li>
- * <li>v1.5.1 - Fixed bug when decompressing and decoding to a byte[] using
- * <tt>decode( String s, boolean gzipCompressed )</tt>. Added the ability to
- * "suspend" encoding in the Output Stream so you can turn on and off the
- * encoding if you need to embed base64 data in an otherwise "normal" stream
- * (like an XML file).</li>
- * <li>v1.5 - Output stream pases on flush() command but doesn't do anything
- * itself. This helps when using GZIP streams. Added the ability to
- * GZip-compress objects before encoding them.</li>
- * <li>v1.4 - Added helper methods to read/write files.</li>
- * <li>v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.</li>
- * <li>v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input
- * stream where last buffer being read, if not completely full, was not
- * returned.</li>
- * <li>v1.3.4 - Fixed when "improperly padded stream" error was thrown at the
- * wrong time.</li>
- * <li>v1.3.3 - Fixed I/O streams which were totally messed up.</li>
+ * <li>v2.1 - Cleaned up javadoc comments and unused variables and methods. Added
+ * some convenience methods for reading and writing to and from files.</li>
+ * <li>v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems
+ * with other encodings (like EBCDIC).</li>
+ * <li>v2.0.1 - Fixed an error when decoding a single byte, that is, when the
+ * encoded data was a single byte.</li>
+ * <li>v2.0 - I got rid of methods that used booleans to set options.
+ * Now everything is more consolidated and cleaner. The code now detects
+ * when data that's being decoded is gzip-compressed and will decompress it
+ * automatically. Generally things are cleaner. You'll probably have to
+ * change some method calls that you were making to support the new
+ * options format (<tt>int</tt>s that you "OR" together).</li>
+ * <li>v1.5.1 - Fixed bug when decompressing and decoding to a
+ * byte[] using <tt>decode( String s, boolean gzipCompressed )</tt>.
+ * Added the ability to "suspend" encoding in the Output Stream so
+ * you can turn on and off the encoding if you need to embed base64
+ * data in an otherwise "normal" stream (like an XML file).</li>
+ * <li>v1.5 - Output stream pases on flush() command but doesn't do anything itself.
+ * This helps when using GZIP streams.
+ * Added the ability to GZip-compress objects before encoding them.</li>
+ * <li>v1.4 - Added helper methods to read/write files.</li>
+ * <li>v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.</li>
+ * <li>v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream
+ * where last buffer being read, if not completely full, was not returned.</li>
+ * <li>v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.</li>
+ * <li>v1.3.3 - Fixed I/O streams which were totally messed up.</li>
* </ul>
- *
+ *
* <p>
- * I am placing this code in the Public Domain. Do with it as you will. This
- * software comes with no guarantees or warranties but with plenty of
- * well-wishing instead! Please visit <a
- * href="http://iharder.net/base64">http://iharder.net/base64</a> periodically
- * to check for updates or to contribute improvements.
+ * I am placing this code in the Public Domain. Do with it as you will.
+ * This software comes with no guarantees or warranties but with
+ * plenty of well-wishing instead!
+ * Please visit <a href="http://iharder.net/base64">http://iharder.net/base64</a>
+ * periodically to check for updates or to contribute improvements.
* </p>
- *
+ *
* @author Robert Harder
* @author rob@iharder.net
* @version 2.1
*/
-public class Base64 {
-
- /* ******** P U B L I C F I E L D S ******** */
-
- /** No options specified. Value is zero. */
- public final static int NO_OPTIONS = 0;
-
- /** Specify encoding. */
- public final static int ENCODE = 1;
-
- /** Specify decoding. */
- public final static int DECODE = 0;
-
- /** Specify that data should be gzip-compressed. */
- public final static int GZIP = 2;
-
- /** Don't break lines when encoding (violates strict Base64 specification) */
- public final static int DONT_BREAK_LINES = 8;
-
- /* ******** P R I V A T E F I E L D S ******** */
-
- /** Maximum line length (76) of Base64 output. */
- private final static int MAX_LINE_LENGTH = 76;
-
- /** The equals sign (=) as a byte. */
- private final static byte EQUALS_SIGN = (byte) '=';
-
- /** The new line character (\n) as a byte. */
- private final static byte NEW_LINE = (byte) '\n';
-
- /** Preferred encoding. */
- private final static String PREFERRED_ENCODING = "UTF-8";
-
- /** The 64 valid Base64 values. */
- private final static byte[] ALPHABET;
-
- private final static byte[] _NATIVE_ALPHABET = /*
- * May be something funny
- * like EBCDIC
- */
- { (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F',
- (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K',
- (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P',
- (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',
- (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z',
- (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e',
- (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j',
- (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o',
- (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't',
- (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y',
- (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3',
- (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8',
- (byte) '9', (byte) '+', (byte) '/' };
-
- /** Determine which ALPHABET to use. */
- static {
- byte[] __bytes;
- try {
- __bytes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
- .getBytes(PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException use) {
- __bytes = _NATIVE_ALPHABET; // Fall back to native encoding
- } // end catch
- ALPHABET = __bytes;
- } // end static
-
- /**
- * Translates a Base64 value to either its 6-bit reconstruction value or a
- * negative number indicating some other meaning.
- */
- private final static byte[] DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9,
- -9, // Decimal 0 - 8
- -5, -5, // Whitespace: Tab and Linefeed
- -9, -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 -
- // 26
- -9, -9, -9, -9, -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
- 62, // Plus sign at decimal 43
- -9, -9, -9, // Decimal 44 - 46
- 63, // Slash at decimal 47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
- -9, -9, -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9, -9, -9, // Decimal 62 - 64
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A'
- // through 'N'
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O'
- // through 'Z'
- -9, -9, -9, -9, -9, -9, // Decimal 91 - 96
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a'
- // through 'm'
- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n'
- // through 'z'
- -9, -9, -9, -9 // Decimal 123 - 126
- /*
- * ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
- * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255
- */
- };
-
- // I think I end up not using the BAD_ENCODING indicator.
- // private final static byte BAD_ENCODING = -9; // Indicates error in
- // encoding
- private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in
- // encoding
-
- private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in
- // encoding
-
- /** Defeats instantiation. */
- private Base64() {
- }
-
- /* ******** E N C O D I N G M E T H O D S ******** */
-
- /**
- * Encodes up to the first three bytes of array <var>threeBytes</var> and
- * returns a four-byte array in Base64 notation. The actual number of
- * significant bytes in your array is given by <var>numSigBytes</var>. The
- * array <var>threeBytes</var> needs only be as big as <var>numSigBytes</var>.
- * Code can reuse a byte array by passing a four-byte array as <var>b4</var>.
- *
- * @param b4
- * A reusable byte array to reduce array instantiation
- * @param threeBytes
- * the array to convert
- * @param numSigBytes
- * the number of significant bytes in your array
- * @return four byte array in Base64 notation.
- * @since 1.5.1
- */
- private static byte[] encode3to4(byte[] b4, byte[] threeBytes,
- int numSigBytes) {
- encode3to4(threeBytes, 0, numSigBytes, b4, 0);
- return b4;
- } // end encode3to4
-
- /**
- * Encodes up to three bytes of the array <var>source</var> and writes the
- * resulting four Base64 bytes to <var>destination</var>. The source and
- * destination arrays can be manipulated anywhere along their length by
- * specifying <var>srcOffset</var> and <var>destOffset</var>. This method
- * does not check to make sure your arrays are large enough to accomodate
- * <var>srcOffset</var> + 3 for the <var>source</var> array or
- * <var>destOffset</var> + 4 for the <var>destination</var> array. The
- * actual number of significant bytes in your array is given by
- * <var>numSigBytes</var>.
- *
- * @param source
- * the array to convert
- * @param srcOffset
- * the index where conversion begins
- * @param numSigBytes
- * the number of significant bytes in your array
- * @param destination
- * the array to hold the conversion
- * @param destOffset
- * the index where output will be put
- * @return the <var>destination</var> array
- * @since 1.3
- */
- private static byte[] encode3to4(byte[] source, int srcOffset,
- int numSigBytes, byte[] destination, int destOffset) {
- // 1 2 3
- // 01234567890123456789012345678901 Bit position
- // --------000000001111111122222222 Array position from threeBytes
- // --------| || || || | Six bit groups to index ALPHABET
- // >>18 >>12 >> 6 >> 0 Right shift necessary
- // 0x3f 0x3f 0x3f Additional AND
-
- // Create buffer with zero-padding if there are only one or two
- // significant bytes passed in the array.
- // We have to shift left 24 in order to flush out the 1's that appear
- // when Java treats a value as negative that is cast from a byte to an
- // int.
- int inBuff = (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) : 0)
- | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) : 0)
- | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) : 0);
-
- switch (numSigBytes) {
- case 3:
- destination[destOffset] = ALPHABET[(inBuff >>> 18)];
- destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = ALPHABET[(inBuff >>> 6) & 0x3f];
- destination[destOffset + 3] = ALPHABET[(inBuff) & 0x3f];
- return destination;
-
- case 2:
- destination[destOffset] = ALPHABET[(inBuff >>> 18)];
- destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = ALPHABET[(inBuff >>> 6) & 0x3f];
- destination[destOffset + 3] = EQUALS_SIGN;
- return destination;
-
- case 1:
- destination[destOffset] = ALPHABET[(inBuff >>> 18)];
- destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = EQUALS_SIGN;
- destination[destOffset + 3] = EQUALS_SIGN;
- return destination;
-
- default:
- return destination;
- } // end switch
- } // end encode3to4
-
- /**
- * Serializes an object and returns the Base64-encoded version of that
- * serialized object. If the object cannot be serialized or there is another
- * error, the method will return <tt>null</tt>. The object is not
- * GZip-compressed before being encoded.
- *
- * @param serializableObject
- * The object to encode
- * @return The Base64-encoded object
- * @since 1.4
- */
- public static String encodeObject(java.io.Serializable serializableObject) {
- return encodeObject(serializableObject, NO_OPTIONS);
- } // end encodeObject
-
- /**
- * Serializes an object and returns the Base64-encoded version of that
- * serialized object. If the object cannot be serialized or there is another
- * error, the method will return <tt>null</tt>.
- * <p>
- * Valid options:
- *
- * <pre>
- * GZIP: gzip-compresses object before encoding it.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- *
- * <p>
- * Example: <code>encodeObject( myObj, Base64.GZIP )</code> or
- * <p>
- * Example:
- * <code>encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
- *
- * @param serializableObject
- * The object to encode
- * @param options
- * Specified options
- * @return The Base64-encoded object
- * @see Base64#GZIP
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public static String encodeObject(java.io.Serializable serializableObject,
- int options) {
- // Streams
- java.io.ByteArrayOutputStream baos = null;
- java.io.OutputStream b64os = null;
- java.io.ObjectOutputStream oos = null;
- java.util.zip.GZIPOutputStream gzos = null;
-
- // Isolate options
- int gzip = (options & GZIP);
- int dontBreakLines = (options & DONT_BREAK_LINES);
-
- try {
- // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
- baos = new java.io.ByteArrayOutputStream();
- b64os = new Base64.OutputStream(baos, ENCODE | dontBreakLines);
-
- // GZip?
- if (gzip == GZIP) {
- gzos = new java.util.zip.GZIPOutputStream(b64os);
- oos = new java.io.ObjectOutputStream(gzos);
- } // end if: gzip
- else
- oos = new java.io.ObjectOutputStream(b64os);
-
- oos.writeObject(serializableObject);
- } // end try
- catch (java.io.IOException e) {
- e.printStackTrace();
- return null;
- } // end catch
- finally {
- try {
- oos.close();
- } catch (Exception e) {
- }
- try {
- gzos.close();
- } catch (Exception e) {
- }
- try {
- b64os.close();
- } catch (Exception e) {
- }
- try {
- baos.close();
- } catch (Exception e) {
- }
- } // end finally
-
- // Return value according to relevant encoding.
- try {
- return new String(baos.toByteArray(), PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uue) {
- return new String(baos.toByteArray());
- } // end catch
-
- } // end encode
-
- /**
- * Encodes a byte array into Base64 notation. Does not GZip-compress data.
- *
- * @param source
- * The data to convert
- * @since 1.4
- */
- public static String encodeBytes(byte[] source) {
- return encodeBytes(source, 0, source.length, NO_OPTIONS);
- } // end encodeBytes
-
- /**
- * Encodes a byte array into Base64 notation.
- * <p>
- * Valid options:
- *
- * <pre>
- * GZIP: gzip-compresses object before encoding it.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- *
- * <p>
- * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
- * <p>
- * Example:
- * <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
- *
- *
- * @param source
- * The data to convert
- * @param options
- * Specified options
- * @see Base64#GZIP
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public static String encodeBytes(byte[] source, int options) {
- return encodeBytes(source, 0, source.length, options);
- } // end encodeBytes
-
- /**
- * Encodes a byte array into Base64 notation. Does not GZip-compress data.
- *
- * @param source
- * The data to convert
- * @param off
- * Offset in array where conversion should begin
- * @param len
- * Length of data to convert
- * @since 1.4
- */
- public static String encodeBytes(byte[] source, int off, int len) {
- return encodeBytes(source, off, len, NO_OPTIONS);
- } // end encodeBytes
-
- /**
- * Encodes a byte array into Base64 notation.
- * <p>
- * Valid options:
- *
- * <pre>
- * GZIP: gzip-compresses object before encoding it.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- *
- * <p>
- * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
- * <p>
- * Example:
- * <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
- *
- *
- * @param source
- * The data to convert
- * @param off
- * Offset in array where conversion should begin
- * @param len
- * Length of data to convert
- * @param options
- * Specified options
- * @see Base64#GZIP
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public static String encodeBytes(byte[] source, int off, int len,
- int options) {
- // Isolate options
- int dontBreakLines = (options & DONT_BREAK_LINES);
- int gzip = (options & GZIP);
-
- // Compress?
- if (gzip == GZIP) {
- java.io.ByteArrayOutputStream baos = null;
- java.util.zip.GZIPOutputStream gzos = null;
- Base64.OutputStream b64os = null;
-
- try {
- // GZip -> Base64 -> ByteArray
- baos = new java.io.ByteArrayOutputStream();
- b64os = new Base64.OutputStream(baos, ENCODE | dontBreakLines);
- gzos = new java.util.zip.GZIPOutputStream(b64os);
-
- gzos.write(source, off, len);
- gzos.close();
- } // end try
- catch (java.io.IOException e) {
- e.printStackTrace();
- return null;
- } // end catch
- finally {
- try {
- gzos.close();
- } catch (Exception e) {
- }
- try {
- b64os.close();
- } catch (Exception e) {
- }
- try {
- baos.close();
- } catch (Exception e) {
- }
- } // end finally
-
- // Return value according to relevant encoding.
- try {
- return new String(baos.toByteArray(), PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uue) {
- return new String(baos.toByteArray());
- } // end catch
- } // end if: compress
-
- // Else, don't compress. Better not to use streams at all then.
- else {
- // Convert option to boolean in way that code likes it.
- boolean breakLines = dontBreakLines == 0;
-
- int len43 = len * 4 / 3;
- byte[] outBuff = new byte[(len43) // Main 4:3
- + ((len % 3) > 0 ? 4 : 0) // Account for padding
- + (breakLines ? (len43 / MAX_LINE_LENGTH) : 0)]; // New
- // lines
- int d = 0;
- int e = 0;
- int len2 = len - 2;
- int lineLength = 0;
- for (; d < len2; d += 3, e += 4) {
- encode3to4(source, d + off, 3, outBuff, e);
-
- lineLength += 4;
- if (breakLines && lineLength == MAX_LINE_LENGTH) {
- outBuff[e + 4] = NEW_LINE;
- e++;
- lineLength = 0;
- } // end if: end of line
- } // en dfor: each piece of array
-
- if (d < len) {
- encode3to4(source, d + off, len - d, outBuff, e);
- e += 4;
- } // end if: some padding needed
-
- // Return value according to relevant encoding.
- try {
- return new String(outBuff, 0, e, PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uue) {
- return new String(outBuff, 0, e);
- } // end catch
-
- } // end else: don't compress
-
- } // end encodeBytes
-
- /* ******** D E C O D I N G M E T H O D S ******** */
-
- /**
- * Decodes four bytes from array <var>source</var> and writes the resulting
- * bytes (up to three of them) to <var>destination</var>. The source and
- * destination arrays can be manipulated anywhere along their length by
- * specifying <var>srcOffset</var> and <var>destOffset</var>. This method
- * does not check to make sure your arrays are large enough to accomodate
- * <var>srcOffset</var> + 4 for the <var>source</var> array or
- * <var>destOffset</var> + 3 for the <var>destination</var> array. This
- * method returns the actual number of bytes that were converted from the
- * Base64 encoding.
- *
- *
- * @param source
- * the array to convert
- * @param srcOffset
- * the index where conversion begins
- * @param destination
- * the array to hold the conversion
- * @param destOffset
- * the index where output will be put
- * @return the number of decoded bytes converted
- * @since 1.3
- */
- private static int decode4to3(byte[] source, int srcOffset,
- byte[] destination, int destOffset) {
- // Example: Dk==
- if (source[srcOffset + 2] == EQUALS_SIGN) {
- // Two ways to do the same thing. Don't know which way I like best.
- // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6
- // )
- // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
- int outBuff = ((DECODABET[source[srcOffset]] & 0xFF) << 18)
- | ((DECODABET[source[srcOffset + 1]] & 0xFF) << 12);
-
- destination[destOffset] = (byte) (outBuff >>> 16);
- return 1;
- }
-
- // Example: DkL=
- else if (source[srcOffset + 3] == EQUALS_SIGN) {
- // Two ways to do the same thing. Don't know which way I like best.
- // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6
- // )
- // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
- // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
- int outBuff = ((DECODABET[source[srcOffset]] & 0xFF) << 18)
- | ((DECODABET[source[srcOffset + 1]] & 0xFF) << 12)
- | ((DECODABET[source[srcOffset + 2]] & 0xFF) << 6);
-
- destination[destOffset] = (byte) (outBuff >>> 16);
- destination[destOffset + 1] = (byte) (outBuff >>> 8);
- return 2;
- }
-
- // Example: DkLE
- else {
- try {
- // Two ways to do the same thing. Don't know which way I like
- // best.
- // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 )
- // >>> 6 )
- // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
- // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
- // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
- int outBuff = ((DECODABET[source[srcOffset]] & 0xFF) << 18)
- | ((DECODABET[source[srcOffset + 1]] & 0xFF) << 12)
- | ((DECODABET[source[srcOffset + 2]] & 0xFF) << 6)
- | ((DECODABET[source[srcOffset + 3]] & 0xFF));
-
- destination[destOffset] = (byte) (outBuff >> 16);
- destination[destOffset + 1] = (byte) (outBuff >> 8);
- destination[destOffset + 2] = (byte) (outBuff);
-
- return 3;
- } catch (Exception e) {
- System.out.println("" + source[srcOffset] + ": "
- + (DECODABET[source[srcOffset]]));
- System.out.println("" + source[srcOffset + 1] + ": "
- + (DECODABET[source[srcOffset + 1]]));
- System.out.println("" + source[srcOffset + 2] + ": "
- + (DECODABET[source[srcOffset + 2]]));
- System.out.println("" + source[srcOffset + 3] + ": "
- + (DECODABET[source[srcOffset + 3]]));
- return -1;
- } // e nd catch
- }
- } // end decodeToBytes
-
- /**
- * Very low-level access to decoding ASCII characters in the form of a byte
- * array. Does not support automatically gunzipping or any other "fancy"
- * features.
- *
- * @param source
- * The Base64 encoded data
- * @param off
- * The offset of where to begin decoding
- * @param len
- * The length of characters to decode
- * @return decoded data
- * @since 1.3
- */
- public static byte[] decode(byte[] source, int off, int len) {
- int len34 = len * 3 / 4;
- byte[] outBuff = new byte[len34]; // Upper limit on size of output
- int outBuffPosn = 0;
-
- byte[] b4 = new byte[4];
- int b4Posn = 0;
- int i = 0;
- byte sbiCrop = 0;
- byte sbiDecode = 0;
- for (i = off; i < off + len; i++) {
- sbiCrop = (byte) (source[i] & 0x7f); // Only the low seven bits
- sbiDecode = DECODABET[sbiCrop];
-
- if (sbiDecode >= WHITE_SPACE_ENC) // White space, Equals sign or
- // better
- {
- if (sbiDecode >= EQUALS_SIGN_ENC) {
- b4[b4Posn++] = sbiCrop;
- if (b4Posn > 3) {
- outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn);
- b4Posn = 0;
-
- // If that was the equals sign, break out of 'for' loop
- if (sbiCrop == EQUALS_SIGN)
- break;
- } // end if: quartet built
-
- } // end if: equals sign or better
-
- } // end if: white space, equals sign or better
- else {
- System.err.println("Bad Base64 input character at " + i + ": "
- + source[i] + "(decimal)");
- return null;
- } // end else:
- } // each input character
-
- byte[] out = new byte[outBuffPosn];
- System.arraycopy(outBuff, 0, out, 0, outBuffPosn);
- return out;
- } // end decode
-
- /**
- * Decodes data from Base64 notation, automatically detecting
- * gzip-compressed data and decompressing it.
- *
- * @param s
- * the string to decode
- * @return the decoded data
- * @since 1.4
- */
- public static byte[] decode(String s) {
- byte[] bytes;
- try {
- bytes = s.getBytes(PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uee) {
- bytes = s.getBytes();
- } // end catch
- // </change>
-
- // Decode
- bytes = decode(bytes, 0, bytes.length);
-
- // Check to see if it's gzip-compressed
- // GZIP Magic Two-Byte Number: 0x8b1f (35615)
- if (bytes != null && bytes.length >= 4) {
-
- int head = ((int) bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
- if (java.util.zip.GZIPInputStream.GZIP_MAGIC == head) {
- java.io.ByteArrayInputStream bais = null;
- java.util.zip.GZIPInputStream gzis = null;
- java.io.ByteArrayOutputStream baos = null;
- byte[] buffer = new byte[2048];
- int length = 0;
-
- try {
- baos = new java.io.ByteArrayOutputStream();
- bais = new java.io.ByteArrayInputStream(bytes);
- gzis = new java.util.zip.GZIPInputStream(bais);
-
- while ((length = gzis.read(buffer)) >= 0) {
- baos.write(buffer, 0, length);
- } // end while: reading input
-
- // No error? Get new bytes.
- bytes = baos.toByteArray();
-
- } // end try
- catch (java.io.IOException e) {
- // Just return originally-decoded bytes
- } // end catch
- finally {
- try {
- baos.close();
- } catch (Exception e) {
- }
- try {
- gzis.close();
- } catch (Exception e) {
- }
- try {
- bais.close();
- } catch (Exception e) {
- }
- } // end finally
-
- } // end if: gzipped
- } // end if: bytes.length >= 2
-
- return bytes;
- } // end decode
-
- /**
- * Attempts to decode Base64 data and deserialize a Java Object within.
- * Returns <tt>null</tt> if there was an error.
- *
- * @param encodedObject
- * The Base64 data to decode
- * @return The decoded and deserialized object
- * @since 1.5
- */
- public static Object decodeToObject(String encodedObject) {
- // Decode and gunzip if necessary
- byte[] objBytes = decode(encodedObject);
-
- java.io.ByteArrayInputStream bais = null;
- java.io.ObjectInputStream ois = null;
- Object obj = null;
-
- try {
- bais = new java.io.ByteArrayInputStream(objBytes);
- ois = new java.io.ObjectInputStream(bais);
-
- obj = ois.readObject();
- } // end try
- catch (java.io.IOException e) {
- e.printStackTrace();
- obj = null;
- } // end catch
- catch (java.lang.ClassNotFoundException e) {
- e.printStackTrace();
- obj = null;
- } // end catch
- finally {
- try {
- bais.close();
- } catch (Exception e) {
- }
- try {
- ois.close();
- } catch (Exception e) {
- }
- } // end finally
-
- return obj;
- } // end decodeObject
-
- /**
- * Convenience method for encoding data to a file.
- *
- * @param dataToEncode
- * byte array of data to encode in base64 form
- * @param filename
- * Filename for saving encoded data
- * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
- *
- * @since 2.1
- */
- public static boolean encodeToFile(byte[] dataToEncode, String filename) {
- boolean success = false;
- Base64.OutputStream bos = null;
- try {
- bos = new Base64.OutputStream(
- new java.io.FileOutputStream(filename), Base64.ENCODE);
- bos.write(dataToEncode);
- success = true;
- } // end try
- catch (java.io.IOException e) {
-
- success = false;
- } // end catch: IOException
- finally {
- try {
- bos.close();
- } catch (Exception e) {
- }
- } // end finally
-
- return success;
- } // end encodeToFile
-
- /**
- * Convenience method for decoding data to a file.
- *
- * @param dataToDecode
- * Base64-encoded data as a string
- * @param filename
- * Filename for saving decoded data
- * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
- *
- * @since 2.1
- */
- public static boolean decodeToFile(String dataToDecode, String filename) {
- boolean success = false;
- Base64.OutputStream bos = null;
- try {
- bos = new Base64.OutputStream(
- new java.io.FileOutputStream(filename), Base64.DECODE);
- bos.write(dataToDecode.getBytes(PREFERRED_ENCODING));
- success = true;
- } // end try
- catch (java.io.IOException e) {
- success = false;
- } // end catch: IOException
- finally {
- try {
- bos.close();
- } catch (Exception e) {
- }
- } // end finally
-
- return success;
- } // end decodeToFile
-
- /**
- * Convenience method for reading a base64-encoded file and decoding it.
- *
- * @param filename
- * Filename for reading encoded data
- * @return decoded byte array or null if unsuccessful
- *
- * @since 2.1
- */
- public static byte[] decodeFromFile(String filename) {
- byte[] decodedData = null;
- Base64.InputStream bis = null;
- try {
- // Set up some useful variables
- java.io.File file = new java.io.File(filename);
- byte[] buffer = null;
- int length = 0;
- int numBytes = 0;
-
- // Check for size of file
- if (file.length() > Integer.MAX_VALUE) {
- System.err
- .println("File is too big for this convenience method ("
- + file.length() + " bytes).");
- return null;
- } // end if: file too big for int index
- buffer = new byte[(int) file.length()];
-
- // Open a stream
- bis = new Base64.InputStream(new java.io.BufferedInputStream(
- new java.io.FileInputStream(file)), Base64.DECODE);
-
- // Read until done
- while ((numBytes = bis.read(buffer, length, 4096)) >= 0)
- length += numBytes;
-
- // Save in a variable to return
- decodedData = new byte[length];
- System.arraycopy(buffer, 0, decodedData, 0, length);
-
- } // end try
- catch (java.io.IOException e) {
- System.err.println("Error decoding from file " + filename);
- } // end catch: IOException
- finally {
- try {
- bis.close();
- } catch (Exception e) {
- }
- } // end finally
-
- return decodedData;
- } // end decodeFromFile
-
- /**
- * Convenience method for reading a binary file and base64-encoding it.
- *
- * @param filename
- * Filename for reading binary data
- * @return base64-encoded string or null if unsuccessful
- *
- * @since 2.1
- */
- public static String encodeFromFile(String filename) {
- String encodedData = null;
- Base64.InputStream bis = null;
- try {
- // Set up some useful variables
- java.io.File file = new java.io.File(filename);
- byte[] buffer = new byte[(int) (file.length() * 1.4)];
- int length = 0;
- int numBytes = 0;
-
- // Open a stream
- bis = new Base64.InputStream(new java.io.BufferedInputStream(
- new java.io.FileInputStream(file)), Base64.ENCODE);
-
- // Read until done
- while ((numBytes = bis.read(buffer, length, 4096)) >= 0)
- length += numBytes;
-
- // Save in a variable to return
- encodedData = new String(buffer, 0, length,
- Base64.PREFERRED_ENCODING);
-
- } // end try
- catch (java.io.IOException e) {
- System.err.println("Error encoding from file " + filename);
- } // end catch: IOException
- finally {
- try {
- bis.close();
- } catch (Exception e) {
- }
- } // end finally
-
- return encodedData;
- } // end encodeFromFile
-
- /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */
-
- /**
- * A {@link Base64.InputStream} will read data from another
- * <tt>java.io.InputStream</tt>, given in the constructor, and
- * encode/decode to/from Base64 notation on the fly.
- *
- * @see Base64
- * @since 1.3
- */
- public static class InputStream extends java.io.FilterInputStream {
- private boolean encode; // Encoding or decoding
-
- private int position; // Current position in the buffer
-
- private byte[] buffer; // Small buffer holding converted data
-
- private int bufferLength; // Length of buffer (3 or 4)
-
- private int numSigBytes; // Number of meaningful bytes in the buffer
-
- private int lineLength;
-
- private boolean breakLines; // Break lines at less than 80 characters
-
- /**
- * Constructs a {@link Base64.InputStream} in DECODE mode.
- *
- * @param in
- * the <tt>java.io.InputStream</tt> from which to read
- * data.
- * @since 1.3
- */
- public InputStream(java.io.InputStream in) {
- this(in, DECODE);
- } // end constructor
-
- /**
- * Constructs a {@link Base64.InputStream} in either ENCODE or DECODE
- * mode.
- * <p>
- * Valid options:
- *
- * <pre>
- * ENCODE or DECODE: Encode or Decode as data is read.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * (only meaningful when encoding)
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- *
- * <p>
- * Example: <code>new Base64.InputStream( in, Base64.DECODE )</code>
- *
- *
- * @param in
- * the <tt>java.io.InputStream</tt> from which to read
- * data.
- * @param options
- * Specified options
- * @see Base64#ENCODE
- * @see Base64#DECODE
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public InputStream(java.io.InputStream in, int options) {
- super(in);
- this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
- this.encode = (options & ENCODE) == ENCODE;
- this.bufferLength = encode ? 4 : 3;
- this.buffer = new byte[bufferLength];
- this.position = -1;
- this.lineLength = 0;
- } // end constructor
-
- /**
- * Reads enough of the input stream to convert to/from Base64 and
- * returns the next byte.
- *
- * @return next byte
- * @since 1.3
- */
- public int read() throws java.io.IOException {
- // Do we need to get data?
- if (position < 0) {
- if (encode) {
- byte[] b3 = new byte[3];
- int numBinaryBytes = 0;
- for (int i = 0; i < 3; i++) {
- try {
- int b = in.read();
-
- // If end of stream, b is -1.
- if (b >= 0) {
- b3[i] = (byte) b;
- numBinaryBytes++;
- } // end if: not end of stream
-
- } // end try: read
- catch (java.io.IOException e) {
- // Only a problem if we got no data at all.
- if (i == 0)
- throw e;
-
- } // end catch
- } // end for: each needed input byte
-
- if (numBinaryBytes > 0) {
- encode3to4(b3, 0, numBinaryBytes, buffer, 0);
- position = 0;
- numSigBytes = 4;
- } // end if: got data
- else {
- return -1;
- } // end else
- } // end if: encoding
-
- // Else decoding
- else {
- byte[] b4 = new byte[4];
- int i = 0;
- for (i = 0; i < 4; i++) {
- // Read four "meaningful" bytes:
- int b = 0;
- do {
- b = in.read();
- } while (b >= 0
- && DECODABET[b & 0x7f] <= WHITE_SPACE_ENC);
-
- if (b < 0)
- break; // Reads a -1 if end of stream
-
- b4[i] = (byte) b;
- } // end for: each needed input byte
-
- if (i == 4) {
- numSigBytes = decode4to3(b4, 0, buffer, 0);
- position = 0;
- } // end if: got four characters
- else if (i == 0) {
- return -1;
- } // end else if: also padded correctly
- else {
- // Must have broken out from above.
- throw new java.io.IOException(
- "Improperly padded Base64 input.");
- } // end
-
- } // end else: decode
- } // end else: get data
-
- // Got data?
- if (position >= 0) {
- // End of relevant data?
- if ( /* !encode && */position >= numSigBytes)
- return -1;
-
- if (encode && breakLines && lineLength >= MAX_LINE_LENGTH) {
- lineLength = 0;
- return '\n';
- } // end if
- else {
- lineLength++; // This isn't important when decoding
- // but throwing an extra "if" seems
- // just as wasteful.
-
- int b = buffer[position++];
-
- if (position >= bufferLength)
- position = -1;
-
- return b & 0xFF; // This is how you "cast" a byte that's
- // intended to be unsigned.
- } // end else
- } // end if: position >= 0
-
- // Else error
- else {
- // When JDK1.4 is more accepted, use an assertion here.
- throw new java.io.IOException(
- "Error in Base64 code reading stream.");
- } // end else
- } // end read
-
- /**
- * Calls {@link #read()} repeatedly until the end of stream is reached
- * or <var>len</var> bytes are read. Returns number of bytes read into
- * array or -1 if end of stream is encountered.
- *
- * @param dest
- * array to hold values
- * @param off
- * offset for array
- * @param len
- * max number of bytes to read into array
- * @return bytes read into array or -1 if end of stream is encountered.
- * @since 1.3
- */
- public int read(byte[] dest, int off, int len)
- throws java.io.IOException {
- int i;
- int b;
- for (i = 0; i < len; i++) {
- b = read();
-
- // if( b < 0 && i == 0 )
- // return -1;
-
- if (b >= 0)
- dest[off + i] = (byte) b;
- else if (i == 0)
- return -1;
- else
- break; // Out of 'for' loop
- } // end for: each byte read
- return i;
- } // end read
-
- } // end inner class InputStream
-
- /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */
-
- /**
- * A {@link Base64.OutputStream} will write data to another
- * <tt>java.io.OutputStream</tt>, given in the constructor, and
- * encode/decode to/from Base64 notation on the fly.
- *
- * @see Base64
- * @since 1.3
- */
- public static class OutputStream extends java.io.FilterOutputStream {
- private boolean encode;
-
- private int position;
-
- private byte[] buffer;
-
- private int bufferLength;
-
- private int lineLength;
-
- private boolean breakLines;
-
- private byte[] b4; // Scratch used in a few places
-
- private boolean suspendEncoding;
-
- /**
- * Constructs a {@link Base64.OutputStream} in ENCODE mode.
- *
- * @param out
- * the <tt>java.io.OutputStream</tt> to which data will be
- * written.
- * @since 1.3
- */
- public OutputStream(java.io.OutputStream out) {
- this(out, ENCODE);
- } // end constructor
-
- /**
- * Constructs a {@link Base64.OutputStream} in either ENCODE or DECODE
- * mode.
- * <p>
- * Valid options:
- *
- * <pre>
- * ENCODE or DECODE: Encode or Decode as data is read.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * (only meaningful when encoding)
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- *
- * <p>
- * Example: <code>new Base64.OutputStream( out, Base64.ENCODE )</code>
- *
- * @param out
- * the <tt>java.io.OutputStream</tt> to which data will be
- * written.
- * @param options
- * Specified options.
- * @see Base64#ENCODE
- * @see Base64#DECODE
- * @see Base64#DONT_BREAK_LINES
- * @since 1.3
- */
- public OutputStream(java.io.OutputStream out, int options) {
- super(out);
- this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
- this.encode = (options & ENCODE) == ENCODE;
- this.bufferLength = encode ? 3 : 4;
- this.buffer = new byte[bufferLength];
- this.position = 0;
- this.lineLength = 0;
- this.suspendEncoding = false;
- this.b4 = new byte[4];
- } // end constructor
-
- /**
- * Writes the byte to the output stream after converting to/from Base64
- * notation. When encoding, bytes are buffered three at a time before
- * the output stream actually gets a write() call. When decoding, bytes
- * are buffered four at a time.
- *
- * @param theByte
- * the byte to write
- * @since 1.3
- */
- public void write(int theByte) throws java.io.IOException {
- // Encoding suspended?
- if (suspendEncoding) {
- super.out.write(theByte);
- return;
- } // end if: supsended
-
- // Encode?
- if (encode) {
- buffer[position++] = (byte) theByte;
- if (position >= bufferLength) // Enough to encode.
- {
- out.write(encode3to4(b4, buffer, bufferLength));
-
- lineLength += 4;
- if (breakLines && lineLength >= MAX_LINE_LENGTH) {
- out.write(NEW_LINE);
- lineLength = 0;
- } // end if: end of line
-
- position = 0;
- } // end if: enough to output
- } // end if: encoding
-
- // Else, Decoding
- else {
- // Meaningful Base64 character?
- if (DECODABET[theByte & 0x7f] > WHITE_SPACE_ENC) {
- buffer[position++] = (byte) theByte;
- if (position >= bufferLength) // Enough to output.
- {
- int len = Base64.decode4to3(buffer, 0, b4, 0);
- out.write(b4, 0, len);
- // out.write( Base64.decode4to3( buffer ) );
- position = 0;
- } // end if: enough to output
- } // end if: meaningful base64 character
- else if (DECODABET[theByte & 0x7f] != WHITE_SPACE_ENC) {
- throw new java.io.IOException(
- "Invalid character in Base64 data.");
- } // end else: not white space either
- } // end else: decoding
- } // end write
-
- /**
- * Calls {@link #write(int)} repeatedly until <var>len</var> bytes are
- * written.
- *
- * @param theBytes
- * array from which to read bytes
- * @param off
- * offset for array
- * @param len
- * max number of bytes to read into array
- * @since 1.3
- */
- public void write(byte[] theBytes, int off, int len)
- throws java.io.IOException {
- // Encoding suspended?
- if (suspendEncoding) {
- super.out.write(theBytes, off, len);
- return;
- } // end if: supsended
-
- for (int i = 0; i < len; i++) {
- write(theBytes[off + i]);
- } // end for: each byte written
-
- } // end write
-
- /**
- * Method added by PHIL. [Thanks, PHIL. -Rob] This pads the buffer
- * without closing the stream.
- */
- public void flushBase64() throws java.io.IOException {
- if (position > 0) {
- if (encode) {
- out.write(encode3to4(b4, buffer, position));
- position = 0;
- } // end if: encoding
- else {
- throw new java.io.IOException(
- "Base64 input not properly padded.");
- } // end else: decoding
- } // end if: buffer partially full
-
- } // end flush
-
- /**
- * Flushes and closes (I think, in the superclass) the stream.
- *
- * @since 1.3
- */
- public void close() throws java.io.IOException {
- // 1. Ensure that pending characters are written
- flushBase64();
-
- // 2. Actually close the stream
- // Base class both flushes and closes.
- super.close();
-
- buffer = null;
- out = null;
- } // end close
-
- /**
- * Suspends encoding of the stream. May be helpful if you need to embed
- * a piece of base640-encoded data in a stream.
- *
- * @since 1.5.1
- */
- public void suspendEncoding() throws java.io.IOException {
- flushBase64();
- this.suspendEncoding = true;
- } // end suspendEncoding
-
- /**
- * Resumes encoding of the stream. May be helpful if you need to embed a
- * piece of base640-encoded data in a stream.
- *
- * @since 1.5.1
- */
- public void resumeEncoding() {
- this.suspendEncoding = false;
- } // end resumeEncoding
-
- } // end inner class OutputStream
-
-} // end class Base64
+public class Base64
+{
+
+/* ******** P U B L I C F I E L D S ******** */
+
+
+ /** No options specified. Value is zero. */
+ public final static int NO_OPTIONS = 0;
+
+ /** Specify encoding. */
+ public final static int ENCODE = 1;
+
+
+ /** Specify decoding. */
+ public final static int DECODE = 0;
+
+
+ /** Specify that data should be gzip-compressed. */
+ public final static int GZIP = 2;
+
+
+ /** Don't break lines when encoding (violates strict Base64 specification) */
+ public final static int DONT_BREAK_LINES = 8;
+
+
+/* ******** P R I V A T E F I E L D S ******** */
+
+
+ /** Maximum line length (76) of Base64 output. */
+ private final static int MAX_LINE_LENGTH = 76;
+
+
+ /** The equals sign (=) as a byte. */
+ private final static byte EQUALS_SIGN = (byte)'=';
+
+
+ /** The new line character (\n) as a byte. */
+ private final static byte NEW_LINE = (byte)'\n';
+
+
+ /** Preferred encoding. */
+ private final static String PREFERRED_ENCODING = "UTF-8";
+
+
+ /** The 64 valid Base64 values. */
+ private final static byte[] ALPHABET;
+ private final static byte[] _NATIVE_ALPHABET = /* May be something funny like EBCDIC */
+ {
+ (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G',
+ (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N',
+ (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
+ (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
+ (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g',
+ (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
+ (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u',
+ (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z',
+ (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5',
+ (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/'
+ };
+
+ /** Determine which ALPHABET to use. */
+ static
+ {
+ byte[] __bytes;
+ try
+ {
+ __bytes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes( PREFERRED_ENCODING );
+ } // end try
+ catch (java.io.UnsupportedEncodingException use)
+ {
+ __bytes = _NATIVE_ALPHABET; // Fall back to native encoding
+ } // end catch
+ ALPHABET = __bytes;
+ } // end static
+
+
+ /**
+ * Translates a Base64 value to either its 6-bit reconstruction value
+ * or a negative number indicating some other meaning.
+ **/
+ private final static byte[] DECODABET =
+ {
+ -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8
+ -5,-5, // Whitespace: Tab and Linefeed
+ -9,-9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26
+ -9,-9,-9,-9,-9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42
+ 62, // Plus sign at decimal 43
+ -9,-9,-9, // Decimal 44 - 46
+ 63, // Slash at decimal 47
+ 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine
+ -9,-9,-9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9,-9,-9, // Decimal 62 - 64
+ 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N'
+ 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z'
+ -9,-9,-9,-9,-9,-9, // Decimal 91 - 96
+ 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm'
+ 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z'
+ -9,-9,-9,-9 // Decimal 123 - 126
+ /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+ };
+
+ // I think I end up not using the BAD_ENCODING indicator.
+ //private final static byte BAD_ENCODING = -9; // Indicates error in encoding
+ private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding
+ private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding
+
+
+ /** Defeats instantiation. */
+ private Base64(){}
+
+
+
+/* ******** E N C O D I N G M E T H O D S ******** */
+
+
+ /**
+ * Encodes up to the first three bytes of array <var>threeBytes</var>
+ * and returns a four-byte array in Base64 notation.
+ * The actual number of significant bytes in your array is
+ * given by <var>numSigBytes</var>.
+ * The array <var>threeBytes</var> needs only be as big as
+ * <var>numSigBytes</var>.
+ * Code can reuse a byte array by passing a four-byte array as <var>b4</var>.
+ *
+ * @param b4 A reusable byte array to reduce array instantiation
+ * @param threeBytes the array to convert
+ * @param numSigBytes the number of significant bytes in your array
+ * @return four byte array in Base64 notation.
+ * @since 1.5.1
+ */
+ private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes )
+ {
+ encode3to4( threeBytes, 0, numSigBytes, b4, 0 );
+ return b4;
+ } // end encode3to4
+
+
+ /**
+ * Encodes up to three bytes of the array <var>source</var>
+ * and writes the resulting four Base64 bytes to <var>destination</var>.
+ * The source and destination arrays can be manipulated
+ * anywhere along their length by specifying
+ * <var>srcOffset</var> and <var>destOffset</var>.
+ * This method does not check to make sure your arrays
+ * are large enough to accomodate <var>srcOffset</var> + 3 for
+ * the <var>source</var> array or <var>destOffset</var> + 4 for
+ * the <var>destination</var> array.
+ * The actual number of significant bytes in your array is
+ * given by <var>numSigBytes</var>.
+ *
+ * @param source the array to convert
+ * @param srcOffset the index where conversion begins
+ * @param numSigBytes the number of significant bytes in your array
+ * @param destination the array to hold the conversion
+ * @param destOffset the index where output will be put
+ * @return the <var>destination</var> array
+ * @since 1.3
+ */
+ private static byte[] encode3to4(
+ byte[] source, int srcOffset, int numSigBytes,
+ byte[] destination, int destOffset )
+ {
+ // 1 2 3
+ // 01234567890123456789012345678901 Bit position
+ // --------000000001111111122222222 Array position from threeBytes
+ // --------| || || || | Six bit groups to index ALPHABET
+ // >>18 >>12 >> 6 >> 0 Right shift necessary
+ // 0x3f 0x3f 0x3f Additional AND
+
+ // Create buffer with zero-padding if there are only one or two
+ // significant bytes passed in the array.
+ // We have to shift left 24 in order to flush out the 1's that appear
+ // when Java treats a value as negative that is cast from a byte to an int.
+ int inBuff = ( numSigBytes > 0 ? ((source[ srcOffset ] << 24) >>> 8) : 0 )
+ | ( numSigBytes > 1 ? ((source[ srcOffset + 1 ] << 24) >>> 16) : 0 )
+ | ( numSigBytes > 2 ? ((source[ srcOffset + 2 ] << 24) >>> 24) : 0 );
+
+ switch( numSigBytes )
+ {
+ case 3:
+ destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ];
+ destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ];
+ destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ];
+ destination[ destOffset + 3 ] = ALPHABET[ (inBuff ) & 0x3f ];
+ return destination;
+
+ case 2:
+ destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ];
+ destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ];
+ destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ];
+ destination[ destOffset + 3 ] = EQUALS_SIGN;
+ return destination;
+
+ case 1:
+ destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ];
+ destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ];
+ destination[ destOffset + 2 ] = EQUALS_SIGN;
+ destination[ destOffset + 3 ] = EQUALS_SIGN;
+ return destination;
+
+ default:
+ return destination;
+ } // end switch
+ } // end encode3to4
+
+
+
+ /**
+ * Serializes an object and returns the Base64-encoded
+ * version of that serialized object. If the object
+ * cannot be serialized or there is another error,
+ * the method will return <tt>null</tt>.
+ * The object is not GZip-compressed before being encoded.
+ *
+ * @param serializableObject The object to encode
+ * @return The Base64-encoded object
+ * @since 1.4
+ */
+ public static String encodeObject( java.io.Serializable serializableObject )
+ {
+ return encodeObject( serializableObject, NO_OPTIONS );
+ } // end encodeObject
+
+
+
+ /**
+ * Serializes an object and returns the Base64-encoded
+ * version of that serialized object. If the object
+ * cannot be serialized or there is another error,
+ * the method will return <tt>null</tt>.
+ * <p>
+ * Valid options:<pre>
+ * GZIP: gzip-compresses object before encoding it.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>encodeObject( myObj, Base64.GZIP )</code> or
+ * <p>
+ * Example: <code>encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+ *
+ * @param serializableObject The object to encode
+ * @param options Specified options
+ * @return The Base64-encoded object
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeObject( java.io.Serializable serializableObject, int options )
+ {
+ // Streams
+ java.io.ByteArrayOutputStream baos = null;
+ java.io.OutputStream b64os = null;
+ java.io.ObjectOutputStream oos = null;
+ java.util.zip.GZIPOutputStream gzos = null;
+
+ // Isolate options
+ int gzip = (options & GZIP);
+ int dontBreakLines = (options & DONT_BREAK_LINES);
+
+ try
+ {
+ // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
+ baos = new java.io.ByteArrayOutputStream();
+ b64os = new Base64.OutputStream( baos, ENCODE | dontBreakLines );
+
+ // GZip?
+ if( gzip == GZIP )
+ {
+ gzos = new java.util.zip.GZIPOutputStream( b64os );
+ oos = new java.io.ObjectOutputStream( gzos );
+ } // end if: gzip
+ else
+ oos = new java.io.ObjectOutputStream( b64os );
+
+ oos.writeObject( serializableObject );
+ } // end try
+ catch( java.io.IOException e )
+ {
+ e.printStackTrace();
+ return null;
+ } // end catch
+ finally
+ {
+ try{ oos.close(); } catch( Exception e ){}
+ try{ gzos.close(); } catch( Exception e ){}
+ try{ b64os.close(); } catch( Exception e ){}
+ try{ baos.close(); } catch( Exception e ){}
+ } // end finally
+
+ // Return value according to relevant encoding.
+ try
+ {
+ return new String( baos.toByteArray(), PREFERRED_ENCODING );
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ return new String( baos.toByteArray() );
+ } // end catch
+
+ } // end encode
+
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * Does not GZip-compress data.
+ *
+ * @param source The data to convert
+ * @since 1.4
+ */
+ public static String encodeBytes( byte[] source )
+ {
+ return encodeBytes( source, 0, source.length, NO_OPTIONS );
+ } // end encodeBytes
+
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * <p>
+ * Valid options:<pre>
+ * GZIP: gzip-compresses object before encoding it.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+ *
+ *
+ * @param source The data to convert
+ * @param options Specified options
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeBytes( byte[] source, int options )
+ {
+ return encodeBytes( source, 0, source.length, options );
+ } // end encodeBytes
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * Does not GZip-compress data.
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @since 1.4
+ */
+ public static String encodeBytes( byte[] source, int off, int len )
+ {
+ return encodeBytes( source, off, len, NO_OPTIONS );
+ } // end encodeBytes
+
+
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * <p>
+ * Valid options:<pre>
+ * GZIP: gzip-compresses object before encoding it.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+ *
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @param options Specified options
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeBytes( byte[] source, int off, int len, int options )
+ {
+ // Isolate options
+ int dontBreakLines = ( options & DONT_BREAK_LINES );
+ int gzip = ( options & GZIP );
+
+ // Compress?
+ if( gzip == GZIP )
+ {
+ java.io.ByteArrayOutputStream baos = null;
+ java.util.zip.GZIPOutputStream gzos = null;
+ Base64.OutputStream b64os = null;
+
+
+ try
+ {
+ // GZip -> Base64 -> ByteArray
+ baos = new java.io.ByteArrayOutputStream();
+ b64os = new Base64.OutputStream( baos, ENCODE | dontBreakLines );
+ gzos = new java.util.zip.GZIPOutputStream( b64os );
+
+ gzos.write( source, off, len );
+ gzos.close();
+ } // end try
+ catch( java.io.IOException e )
+ {
+ e.printStackTrace();
+ return null;
+ } // end catch
+ finally
+ {
+ try{ gzos.close(); } catch( Exception e ){}
+ try{ b64os.close(); } catch( Exception e ){}
+ try{ baos.close(); } catch( Exception e ){}
+ } // end finally
+
+ // Return value according to relevant encoding.
+ try
+ {
+ return new String( baos.toByteArray(), PREFERRED_ENCODING );
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ return new String( baos.toByteArray() );
+ } // end catch
+ } // end if: compress
+
+ // Else, don't compress. Better not to use streams at all then.
+ else
+ {
+ // Convert option to boolean in way that code likes it.
+ boolean breakLines = dontBreakLines == 0;
+
+ int len43 = len * 4 / 3;
+ byte[] outBuff = new byte[ ( len43 ) // Main 4:3
+ + ( (len % 3) > 0 ? 4 : 0 ) // Account for padding
+ + (breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0) ]; // New lines
+ int d = 0;
+ int e = 0;
+ int len2 = len - 2;
+ int lineLength = 0;
+ for( ; d < len2; d+=3, e+=4 )
+ {
+ encode3to4( source, d+off, 3, outBuff, e );
+
+ lineLength += 4;
+ if( breakLines && lineLength == MAX_LINE_LENGTH )
+ {
+ outBuff[e+4] = NEW_LINE;
+ e++;
+ lineLength = 0;
+ } // end if: end of line
+ } // en dfor: each piece of array
+
+ if( d < len )
+ {
+ encode3to4( source, d+off, len - d, outBuff, e );
+ e += 4;
+ } // end if: some padding needed
+
+
+ // Return value according to relevant encoding.
+ try
+ {
+ return new String( outBuff, 0, e, PREFERRED_ENCODING );
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ return new String( outBuff, 0, e );
+ } // end catch
+
+ } // end else: don't compress
+
+ } // end encodeBytes
+
+
+
+
+
+/* ******** D E C O D I N G M E T H O D S ******** */
+
+
+ /**
+ * Decodes four bytes from array <var>source</var>
+ * and writes the resulting bytes (up to three of them)
+ * to <var>destination</var>.
+ * The source and destination arrays can be manipulated
+ * anywhere along their length by specifying
+ * <var>srcOffset</var> and <var>destOffset</var>.
+ * This method does not check to make sure your arrays
+ * are large enough to accomodate <var>srcOffset</var> + 4 for
+ * the <var>source</var> array or <var>destOffset</var> + 3 for
+ * the <var>destination</var> array.
+ * This method returns the actual number of bytes that
+ * were converted from the Base64 encoding.
+ *
+ *
+ * @param source the array to convert
+ * @param srcOffset the index where conversion begins
+ * @param destination the array to hold the conversion
+ * @param destOffset the index where output will be put
+ * @return the number of decoded bytes converted
+ * @since 1.3
+ */
+ private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset )
+ {
+ // Example: Dk==
+ if( source[ srcOffset + 2] == EQUALS_SIGN )
+ {
+ // Two ways to do the same thing. Don't know which way I like best.
+ //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+ // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
+ int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+ | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 );
+
+ destination[ destOffset ] = (byte)( outBuff >>> 16 );
+ return 1;
+ }
+
+ // Example: DkL=
+ else if( source[ srcOffset + 3 ] == EQUALS_SIGN )
+ {
+ // Two ways to do the same thing. Don't know which way I like best.
+ //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+ // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+ // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
+ int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+ | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
+ | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 );
+
+ destination[ destOffset ] = (byte)( outBuff >>> 16 );
+ destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 );
+ return 2;
+ }
+
+ // Example: DkLE
+ else
+ {
+ try{
+ // Two ways to do the same thing. Don't know which way I like best.
+ //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+ // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+ // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
+ // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
+ int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+ | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
+ | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6)
+ | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) );
+
+
+ destination[ destOffset ] = (byte)( outBuff >> 16 );
+ destination[ destOffset + 1 ] = (byte)( outBuff >> 8 );
+ destination[ destOffset + 2 ] = (byte)( outBuff );
+
+ return 3;
+ }catch( Exception e){
+ System.out.println(""+source[srcOffset]+ ": " + ( DECODABET[ source[ srcOffset ] ] ) );
+ System.out.println(""+source[srcOffset+1]+ ": " + ( DECODABET[ source[ srcOffset + 1 ] ] ) );
+ System.out.println(""+source[srcOffset+2]+ ": " + ( DECODABET[ source[ srcOffset + 2 ] ] ) );
+ System.out.println(""+source[srcOffset+3]+ ": " + ( DECODABET[ source[ srcOffset + 3 ] ] ) );
+ return -1;
+ } //e nd catch
+ }
+ } // end decodeToBytes
+
+
+
+
+ /**
+ * Very low-level access to decoding ASCII characters in
+ * the form of a byte array. Does not support automatically
+ * gunzipping or any other "fancy" features.
+ *
+ * @param source The Base64 encoded data
+ * @param off The offset of where to begin decoding
+ * @param len The length of characters to decode
+ * @return decoded data
+ * @since 1.3
+ */
+ public static byte[] decode( byte[] source, int off, int len )
+ {
+ int len34 = len * 3 / 4;
+ byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output
+ int outBuffPosn = 0;
+
+ byte[] b4 = new byte[4];
+ int b4Posn = 0;
+ int i = 0;
+ byte sbiCrop = 0;
+ byte sbiDecode = 0;
+ for( i = off; i < off+len; i++ )
+ {
+ sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits
+ sbiDecode = DECODABET[ sbiCrop ];
+
+ if( sbiDecode >= WHITE_SPACE_ENC ) // White space, Equals sign or better
+ {
+ if( sbiDecode >= EQUALS_SIGN_ENC )
+ {
+ b4[ b4Posn++ ] = sbiCrop;
+ if( b4Posn > 3 )
+ {
+ outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn );
+ b4Posn = 0;
+
+ // If that was the equals sign, break out of 'for' loop
+ if( sbiCrop == EQUALS_SIGN )
+ break;
+ } // end if: quartet built
+
+ } // end if: equals sign or better
+
+ } // end if: white space, equals sign or better
+ else
+ {
+ System.err.println( "Bad Base64 input character at " + i + ": " + source[i] + "(decimal)" );
+ return null;
+ } // end else:
+ } // each input character
+
+ byte[] out = new byte[ outBuffPosn ];
+ System.arraycopy( outBuff, 0, out, 0, outBuffPosn );
+ return out;
+ } // end decode
+
+
+
+
+ /**
+ * Decodes data from Base64 notation, automatically
+ * detecting gzip-compressed data and decompressing it.
+ *
+ * @param s the string to decode
+ * @return the decoded data
+ * @since 1.4
+ */
+ public static byte[] decode( String s )
+ {
+ byte[] bytes;
+ try
+ {
+ bytes = s.getBytes( PREFERRED_ENCODING );
+ } // end try
+ catch( java.io.UnsupportedEncodingException uee )
+ {
+ bytes = s.getBytes();
+ } // end catch
+ //</change>
+
+ // Decode
+ bytes = decode( bytes, 0, bytes.length );
+
+
+ // Check to see if it's gzip-compressed
+ // GZIP Magic Two-Byte Number: 0x8b1f (35615)
+ if( bytes != null && bytes.length >= 4 )
+ {
+
+ int head = ((int)bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
+ if( java.util.zip.GZIPInputStream.GZIP_MAGIC == head )
+ {
+ java.io.ByteArrayInputStream bais = null;
+ java.util.zip.GZIPInputStream gzis = null;
+ java.io.ByteArrayOutputStream baos = null;
+ byte[] buffer = new byte[2048];
+ int length = 0;
+
+ try
+ {
+ baos = new java.io.ByteArrayOutputStream();
+ bais = new java.io.ByteArrayInputStream( bytes );
+ gzis = new java.util.zip.GZIPInputStream( bais );
+
+ while( ( length = gzis.read( buffer ) ) >= 0 )
+ {
+ baos.write(buffer,0,length);
+ } // end while: reading input
+
+ // No error? Get new bytes.
+ bytes = baos.toByteArray();
+
+ } // end try
+ catch( java.io.IOException e )
+ {
+ // Just return originally-decoded bytes
+ } // end catch
+ finally
+ {
+ try{ baos.close(); } catch( Exception e ){}
+ try{ gzis.close(); } catch( Exception e ){}
+ try{ bais.close(); } catch( Exception e ){}
+ } // end finally
+
+ } // end if: gzipped
+ } // end if: bytes.length >= 2
+
+ return bytes;
+ } // end decode
+
+
+
+
+ /**
+ * Attempts to decode Base64 data and deserialize a Java
+ * Object within. Returns <tt>null</tt> if there was an error.
+ *
+ * @param encodedObject The Base64 data to decode
+ * @return The decoded and deserialized object
+ * @since 1.5
+ */
+ public static Object decodeToObject( String encodedObject )
+ {
+ // Decode and gunzip if necessary
+ byte[] objBytes = decode( encodedObject );
+
+ java.io.ByteArrayInputStream bais = null;
+ java.io.ObjectInputStream ois = null;
+ Object obj = null;
+
+ try
+ {
+ bais = new java.io.ByteArrayInputStream( objBytes );
+ ois = new java.io.ObjectInputStream( bais );
+
+ obj = ois.readObject();
+ } // end try
+ catch( java.io.IOException e )
+ {
+ e.printStackTrace();
+ obj = null;
+ } // end catch
+ catch( java.lang.ClassNotFoundException e )
+ {
+ e.printStackTrace();
+ obj = null;
+ } // end catch
+ finally
+ {
+ try{ bais.close(); } catch( Exception e ){}
+ try{ ois.close(); } catch( Exception e ){}
+ } // end finally
+
+ return obj;
+ } // end decodeObject
+
+
+
+ /**
+ * Convenience method for encoding data to a file.
+ *
+ * @param dataToEncode byte array of data to encode in base64 form
+ * @param filename Filename for saving encoded data
+ * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+ *
+ * @since 2.1
+ */
+ public static boolean encodeToFile( byte[] dataToEncode, String filename )
+ {
+ boolean success = false;
+ Base64.OutputStream bos = null;
+ try
+ {
+ bos = new Base64.OutputStream(
+ new java.io.FileOutputStream( filename ), Base64.ENCODE );
+ bos.write( dataToEncode );
+ success = true;
+ } // end try
+ catch( java.io.IOException e )
+ {
+
+ success = false;
+ } // end catch: IOException
+ finally
+ {
+ try{ bos.close(); } catch( Exception e ){}
+ } // end finally
+
+ return success;
+ } // end encodeToFile
+
+
+ /**
+ * Convenience method for decoding data to a file.
+ *
+ * @param dataToDecode Base64-encoded data as a string
+ * @param filename Filename for saving decoded data
+ * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+ *
+ * @since 2.1
+ */
+ public static boolean decodeToFile( String dataToDecode, String filename )
+ {
+ boolean success = false;
+ Base64.OutputStream bos = null;
+ try
+ {
+ bos = new Base64.OutputStream(
+ new java.io.FileOutputStream( filename ), Base64.DECODE );
+ bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) );
+ success = true;
+ } // end try
+ catch( java.io.IOException e )
+ {
+ success = false;
+ } // end catch: IOException
+ finally
+ {
+ try{ bos.close(); } catch( Exception e ){}
+ } // end finally
+
+ return success;
+ } // end decodeToFile
+
+
+
+
+ /**
+ * Convenience method for reading a base64-encoded
+ * file and decoding it.
+ *
+ * @param filename Filename for reading encoded data
+ * @return decoded byte array or null if unsuccessful
+ *
+ * @since 2.1
+ */
+ public static byte[] decodeFromFile( String filename )
+ {
+ byte[] decodedData = null;
+ Base64.InputStream bis = null;
+ try
+ {
+ // Set up some useful variables
+ java.io.File file = new java.io.File( filename );
+ byte[] buffer = null;
+ int length = 0;
+ int numBytes = 0;
+
+ // Check for size of file
+ if( file.length() > Integer.MAX_VALUE )
+ {
+ System.err.println( "File is too big for this convenience method (" + file.length() + " bytes)." );
+ return null;
+ } // end if: file too big for int index
+ buffer = new byte[ (int)file.length() ];
+
+ // Open a stream
+ bis = new Base64.InputStream(
+ new java.io.BufferedInputStream(
+ new java.io.FileInputStream( file ) ), Base64.DECODE );
+
+ // Read until done
+ while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 )
+ length += numBytes;
+
+ // Save in a variable to return
+ decodedData = new byte[ length ];
+ System.arraycopy( buffer, 0, decodedData, 0, length );
+
+ } // end try
+ catch( java.io.IOException e )
+ {
+ System.err.println( "Error decoding from file " + filename );
+ } // end catch: IOException
+ finally
+ {
+ try{ bis.close(); } catch( Exception e) {}
+ } // end finally
+
+ return decodedData;
+ } // end decodeFromFile
+
+
+
+ /**
+ * Convenience method for reading a binary file
+ * and base64-encoding it.
+ *
+ * @param filename Filename for reading binary data
+ * @return base64-encoded string or null if unsuccessful
+ *
+ * @since 2.1
+ */
+ public static String encodeFromFile( String filename )
+ {
+ String encodedData = null;
+ Base64.InputStream bis = null;
+ try
+ {
+ // Set up some useful variables
+ java.io.File file = new java.io.File( filename );
+ byte[] buffer = new byte[ (int)(file.length() * 1.4) ];
+ int length = 0;
+ int numBytes = 0;
+
+ // Open a stream
+ bis = new Base64.InputStream(
+ new java.io.BufferedInputStream(
+ new java.io.FileInputStream( file ) ), Base64.ENCODE );
+
+ // Read until done
+ while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 )
+ length += numBytes;
+
+ // Save in a variable to return
+ encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING );
+
+ } // end try
+ catch( java.io.IOException e )
+ {
+ System.err.println( "Error encoding from file " + filename );
+ } // end catch: IOException
+ finally
+ {
+ try{ bis.close(); } catch( Exception e) {}
+ } // end finally
+
+ return encodedData;
+ } // end encodeFromFile
+
+
+
+
+ /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */
+
+
+
+ /**
+ * A {@link Base64.InputStream} will read data from another
+ * <tt>java.io.InputStream</tt>, given in the constructor,
+ * and encode/decode to/from Base64 notation on the fly.
+ *
+ * @see Base64
+ * @since 1.3
+ */
+ public static class InputStream extends java.io.FilterInputStream
+ {
+ private boolean encode; // Encoding or decoding
+ private int position; // Current position in the buffer
+ private byte[] buffer; // Small buffer holding converted data
+ private int bufferLength; // Length of buffer (3 or 4)
+ private int numSigBytes; // Number of meaningful bytes in the buffer
+ private int lineLength;
+ private boolean breakLines; // Break lines at less than 80 characters
+
+
+ /**
+ * Constructs a {@link Base64.InputStream} in DECODE mode.
+ *
+ * @param in the <tt>java.io.InputStream</tt> from which to read data.
+ * @since 1.3
+ */
+ public InputStream( java.io.InputStream in )
+ {
+ this( in, DECODE );
+ } // end constructor
+
+
+ /**
+ * Constructs a {@link Base64.InputStream} in
+ * either ENCODE or DECODE mode.
+ * <p>
+ * Valid options:<pre>
+ * ENCODE or DECODE: Encode or Decode as data is read.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * (only meaningful when encoding)
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>new Base64.InputStream( in, Base64.DECODE )</code>
+ *
+ *
+ * @param in the <tt>java.io.InputStream</tt> from which to read data.
+ * @param options Specified options
+ * @see Base64#ENCODE
+ * @see Base64#DECODE
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public InputStream( java.io.InputStream in, int options )
+ {
+ super( in );
+ this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
+ this.encode = (options & ENCODE) == ENCODE;
+ this.bufferLength = encode ? 4 : 3;
+ this.buffer = new byte[ bufferLength ];
+ this.position = -1;
+ this.lineLength = 0;
+ } // end constructor
+
+ /**
+ * Reads enough of the input stream to convert
+ * to/from Base64 and returns the next byte.
+ *
+ * @return next byte
+ * @since 1.3
+ */
+ public int read() throws java.io.IOException
+ {
+ // Do we need to get data?
+ if( position < 0 )
+ {
+ if( encode )
+ {
+ byte[] b3 = new byte[3];
+ int numBinaryBytes = 0;
+ for( int i = 0; i < 3; i++ )
+ {
+ try
+ {
+ int b = in.read();
+
+ // If end of stream, b is -1.
+ if( b >= 0 )
+ {
+ b3[i] = (byte)b;
+ numBinaryBytes++;
+ } // end if: not end of stream
+
+ } // end try: read
+ catch( java.io.IOException e )
+ {
+ // Only a problem if we got no data at all.
+ if( i == 0 )
+ throw e;
+
+ } // end catch
+ } // end for: each needed input byte
+
+ if( numBinaryBytes > 0 )
+ {
+ encode3to4( b3, 0, numBinaryBytes, buffer, 0 );
+ position = 0;
+ numSigBytes = 4;
+ } // end if: got data
+ else
+ {
+ return -1;
+ } // end else
+ } // end if: encoding
+
+ // Else decoding
+ else
+ {
+ byte[] b4 = new byte[4];
+ int i = 0;
+ for( i = 0; i < 4; i++ )
+ {
+ // Read four "meaningful" bytes:
+ int b = 0;
+ do{ b = in.read(); }
+ while( b >= 0 && DECODABET[ b & 0x7f ] <= WHITE_SPACE_ENC );
+
+ if( b < 0 )
+ break; // Reads a -1 if end of stream
+
+ b4[i] = (byte)b;
+ } // end for: each needed input byte
+
+ if( i == 4 )
+ {
+ numSigBytes = decode4to3( b4, 0, buffer, 0 );
+ position = 0;
+ } // end if: got four characters
+ else if( i == 0 ){
+ return -1;
+ } // end else if: also padded correctly
+ else
+ {
+ // Must have broken out from above.
+ throw new java.io.IOException( "Improperly padded Base64 input." );
+ } // end
+
+ } // end else: decode
+ } // end else: get data
+
+ // Got data?
+ if( position >= 0 )
+ {
+ // End of relevant data?
+ if( /*!encode &&*/ position >= numSigBytes )
+ return -1;
+
+ if( encode && breakLines && lineLength >= MAX_LINE_LENGTH )
+ {
+ lineLength = 0;
+ return '\n';
+ } // end if
+ else
+ {
+ lineLength++; // This isn't important when decoding
+ // but throwing an extra "if" seems
+ // just as wasteful.
+
+ int b = buffer[ position++ ];
+
+ if( position >= bufferLength )
+ position = -1;
+
+ return b & 0xFF; // This is how you "cast" a byte that's
+ // intended to be unsigned.
+ } // end else
+ } // end if: position >= 0
+
+ // Else error
+ else
+ {
+ // When JDK1.4 is more accepted, use an assertion here.
+ throw new java.io.IOException( "Error in Base64 code reading stream." );
+ } // end else
+ } // end read
+
+
+ /**
+ * Calls {@link #read()} repeatedly until the end of stream
+ * is reached or <var>len</var> bytes are read.
+ * Returns number of bytes read into array or -1 if
+ * end of stream is encountered.
+ *
+ * @param dest array to hold values
+ * @param off offset for array
+ * @param len max number of bytes to read into array
+ * @return bytes read into array or -1 if end of stream is encountered.
+ * @since 1.3
+ */
+ public int read( byte[] dest, int off, int len ) throws java.io.IOException
+ {
+ int i;
+ int b;
+ for( i = 0; i < len; i++ )
+ {
+ b = read();
+
+ //if( b < 0 && i == 0 )
+ // return -1;
+
+ if( b >= 0 )
+ dest[off + i] = (byte)b;
+ else if( i == 0 )
+ return -1;
+ else
+ break; // Out of 'for' loop
+ } // end for: each byte read
+ return i;
+ } // end read
+
+ } // end inner class InputStream
+
+
+
+
+
+
+ /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */
+
+
+
+ /**
+ * A {@link Base64.OutputStream} will write data to another
+ * <tt>java.io.OutputStream</tt>, given in the constructor,
+ * and encode/decode to/from Base64 notation on the fly.
+ *
+ * @see Base64
+ * @since 1.3
+ */
+ public static class OutputStream extends java.io.FilterOutputStream
+ {
+ private boolean encode;
+ private int position;
+ private byte[] buffer;
+ private int bufferLength;
+ private int lineLength;
+ private boolean breakLines;
+ private byte[] b4; // Scratch used in a few places
+ private boolean suspendEncoding;
+
+ /**
+ * Constructs a {@link Base64.OutputStream} in ENCODE mode.
+ *
+ * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+ * @since 1.3
+ */
+ public OutputStream( java.io.OutputStream out )
+ {
+ this( out, ENCODE );
+ } // end constructor
+
+
+ /**
+ * Constructs a {@link Base64.OutputStream} in
+ * either ENCODE or DECODE mode.
+ * <p>
+ * Valid options:<pre>
+ * ENCODE or DECODE: Encode or Decode as data is read.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * (only meaningful when encoding)
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>new Base64.OutputStream( out, Base64.ENCODE )</code>
+ *
+ * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+ * @param options Specified options.
+ * @see Base64#ENCODE
+ * @see Base64#DECODE
+ * @see Base64#DONT_BREAK_LINES
+ * @since 1.3
+ */
+ public OutputStream( java.io.OutputStream out, int options )
+ {
+ super( out );
+ this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
+ this.encode = (options & ENCODE) == ENCODE;
+ this.bufferLength = encode ? 3 : 4;
+ this.buffer = new byte[ bufferLength ];
+ this.position = 0;
+ this.lineLength = 0;
+ this.suspendEncoding = false;
+ this.b4 = new byte[4];
+ } // end constructor
+
+
+ /**
+ * Writes the byte to the output stream after
+ * converting to/from Base64 notation.
+ * When encoding, bytes are buffered three
+ * at a time before the output stream actually
+ * gets a write() call.
+ * When decoding, bytes are buffered four
+ * at a time.
+ *
+ * @param theByte the byte to write
+ * @since 1.3
+ */
+ public void write(int theByte) throws java.io.IOException
+ {
+ // Encoding suspended?
+ if( suspendEncoding )
+ {
+ super.out.write( theByte );
+ return;
+ } // end if: supsended
+
+ // Encode?
+ if( encode )
+ {
+ buffer[ position++ ] = (byte)theByte;
+ if( position >= bufferLength ) // Enough to encode.
+ {
+ out.write( encode3to4( b4, buffer, bufferLength ) );
+
+ lineLength += 4;
+ if( breakLines && lineLength >= MAX_LINE_LENGTH )
+ {
+ out.write( NEW_LINE );
+ lineLength = 0;
+ } // end if: end of line
+
+ position = 0;
+ } // end if: enough to output
+ } // end if: encoding
+
+ // Else, Decoding
+ else
+ {
+ // Meaningful Base64 character?
+ if( DECODABET[ theByte & 0x7f ] > WHITE_SPACE_ENC )
+ {
+ buffer[ position++ ] = (byte)theByte;
+ if( position >= bufferLength ) // Enough to output.
+ {
+ int len = Base64.decode4to3( buffer, 0, b4, 0 );
+ out.write( b4, 0, len );
+ //out.write( Base64.decode4to3( buffer ) );
+ position = 0;
+ } // end if: enough to output
+ } // end if: meaningful base64 character
+ else if( DECODABET[ theByte & 0x7f ] != WHITE_SPACE_ENC )
+ {
+ throw new java.io.IOException( "Invalid character in Base64 data." );
+ } // end else: not white space either
+ } // end else: decoding
+ } // end write
+
+
+
+ /**
+ * Calls {@link #write(int)} repeatedly until <var>len</var>
+ * bytes are written.
+ *
+ * @param theBytes array from which to read bytes
+ * @param off offset for array
+ * @param len max number of bytes to read into array
+ * @since 1.3
+ */
+ public void write( byte[] theBytes, int off, int len ) throws java.io.IOException
+ {
+ // Encoding suspended?
+ if( suspendEncoding )
+ {
+ super.out.write( theBytes, off, len );
+ return;
+ } // end if: supsended
+
+ for( int i = 0; i < len; i++ )
+ {
+ write( theBytes[ off + i ] );
+ } // end for: each byte written
+
+ } // end write
+
+
+
+ /**
+ * Method added by PHIL. [Thanks, PHIL. -Rob]
+ * This pads the buffer without closing the stream.
+ */
+ public void flushBase64() throws java.io.IOException
+ {
+ if( position > 0 )
+ {
+ if( encode )
+ {
+ out.write( encode3to4( b4, buffer, position ) );
+ position = 0;
+ } // end if: encoding
+ else
+ {
+ throw new java.io.IOException( "Base64 input not properly padded." );
+ } // end else: decoding
+ } // end if: buffer partially full
+
+ } // end flush
+
+
+ /**
+ * Flushes and closes (I think, in the superclass) the stream.
+ *
+ * @since 1.3
+ */
+ public void close() throws java.io.IOException
+ {
+ // 1. Ensure that pending characters are written
+ flushBase64();
+
+ // 2. Actually close the stream
+ // Base class both flushes and closes.
+ super.close();
+
+ buffer = null;
+ out = null;
+ } // end close
+
+
+
+ /**
+ * Suspends encoding of the stream.
+ * May be helpful if you need to embed a piece of
+ * base640-encoded data in a stream.
+ *
+ * @since 1.5.1
+ */
+ public void suspendEncoding() throws java.io.IOException
+ {
+ flushBase64();
+ this.suspendEncoding = true;
+ } // end suspendEncoding
+
+
+ /**
+ * Resumes encoding of the stream.
+ * May be helpful if you need to embed a piece of
+ * base640-encoded data in a stream.
+ *
+ * @since 1.5.1
+ */
+ public void resumeEncoding()
+ {
+ this.suspendEncoding = false;
+ } // end resumeEncoding
+
+
+
+ } // end inner class OutputStream
+
+
+} // end class Base64
+++ /dev/null
-package net.sourceforge.phpeclipse.xdebug.core;
-
-public class BreakpointResponseData extends ResponseData {
-
- private int BreakpointID = -1;
-
- BreakpointResponseData(int transactionID, int breakpointID) {
- super(transactionID);
- BreakpointID = breakpointID;
- }
-
- // public BreakpointResponseData(ResponseData data,int breakpointID) {
- // setTransactionID(data.getTransactionID());
- // BreakpointID=breakpointID;
- // }
-
- public int getBreakpointID() {
- return BreakpointID;
- }
-
- public void setBreakpointID(int breakpointID) {
- BreakpointID = breakpointID;
- }
-
-}
+++ /dev/null
-package net.sourceforge.phpeclipse.xdebug.core;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import net.sourceforge.phpeclipse.xdebug.php.model.XDebugLineBreakpoint;
-import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-
-public class DebugConnection {
-
- private ServerSocket fDebugServerSocket;
-
- private DebugResponse lastResponse;
-
- private Socket fDebugSocket;
-
- private OutputStreamWriter fDebugWriter;
-
- private DataInputStream fDebugReader;
-
- private ResponseListenerJob fResponseListener;
-
- // Settings for Debug Process
- private int fTransactionID = 0;
-
- private String fileuri = "";
-
- private String appID = "";
-
- private String lastCommand = "";
-
- private XDebugTarget fDebugTarget;
-
- private HashMap ResponseList;
-
- public class DebugResponse {
-
- private Node parentNode;
-
- private int fTransactionID = -1;
-
- private String fCommand = "";
-
- private String fStatus;
-
- private String fReason;
-
- private String fName;
-
- private boolean fError;
-
- public synchronized void setParentNode(String xmlInput) {
- DocumentBuilderFactory factory = DocumentBuilderFactory
- .newInstance();
- DocumentBuilder builder = null;
- Document doc = null;
- try {
- builder = factory.newDocumentBuilder();
- } catch (ParserConfigurationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- ByteArrayInputStream InputXMLStream = new ByteArrayInputStream(
- xmlInput.getBytes());
-
- try {
- doc = builder.parse(InputXMLStream);
- } catch (SAXException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- parentNode = doc.getFirstChild();
- fName = parentNode.getNodeName();
- String idStr = getAttributeValue("transaction_id");
- if (idStr != "")
- fTransactionID = Integer.parseInt(idStr);
- fCommand = getAttributeValue("command");
- fStatus = getAttributeValue("status");
- fReason = getAttributeValue("reason");
- // notifyAll();
- }
-
- public String getAttributeValue(String AttributeName) {
- String strValue = "";
- if (parentNode.hasAttributes()) {
- NamedNodeMap listAttribute = parentNode.getAttributes();
- Node attribute = listAttribute.getNamedItem(AttributeName);
- if (attribute != null)
- strValue = attribute.getNodeValue();
- }
- return strValue;
- }
-
- public synchronized Node getParentNode() {
- return parentNode;
- }
-
- public synchronized String getCommand() {
- return fCommand;
- }
-
- public synchronized String getName() {
- return fName;
- }
-
- DebugResponse() {
- fTransactionID = -1;
- fCommand = "";
- fStatus = "";
- fReason = "";
- fName = "";
- }
-
- DebugResponse(String XMLInput) {
- setParentNode(XMLInput);
- }
-
- public synchronized String getReason() {
- return fReason;
- }
-
- public synchronized String getStatus() {
- return fStatus;
- }
-
- public synchronized int getTransactionID() {
- return fTransactionID;
- }
-
- private synchronized DebugResponse waitforTransactionID(int id) {
- while (fTransactionID != id) {
- try {
- wait();
- } catch (InterruptedException e) {
- }
- }
- // XDebugCorePlugin.log(IStatus.INFO,"got TransID: "+id);
-
- return this;
- }
-
- public boolean isError() {
- return fError;
- }
-
- public void setError(boolean error) {
- fError = error;
- }
-
- protected synchronized void notifyWait() {
- notifyAll();
- }
- }
-
- /**
- * Listens to events from the XDebug and fires corresponding debug events.
- */
- class ResponseListenerJob extends Job {
-
- public ResponseListenerJob() {
- super("XDebug Event Dispatch");
- setSystem(true);
-
- }
-
- private void checkResponse(DebugResponse response) {
- Node node = response.getParentNode();
- if (node.hasChildNodes()) {
- Node child = node.getFirstChild();
- if (child.getNodeName().equals("error")) {
- int code = Integer.parseInt(PHPDebugUtils
- .getAttributeValue(child, "code"));
- String text = (child.getFirstChild()).getNodeValue();
- XDebugCorePlugin.log(IStatus.ERROR, lastCommand + " ERROR "
- + code + ": " + text);
- lastResponse.setError(true);
- return;
- }
- }
- lastResponse.setError(false);
- if (response.getStatus().equals("stopped"))
- terminated();
- else if (response.getStatus().equals("break")
- && response.getReason().equals("ok")) {
- if (response.getCommand().equals("run")) { // breakpoint hit
- int id = -1;
- try {
- id = sendRequest("stack_get");
- } catch (DebugException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- String InputXML = readData();
- if (InputXML != null) {
- XDebugCorePlugin.log(IStatus.INFO, InputXML);
- lastResponse.setParentNode(InputXML);
- fDebugTarget
- .breakpointHit(lastResponse.getParentNode());
- }
-
- } else if (response.getCommand().equals("step_into")) { // step_into
- fDebugTarget.suspended(DebugEvent.STEP_END);
- // XDebugCorePlugin.log(IStatus.INFO,response.getCommand()+"
- // STEP_END sent");
- } else if (response.getCommand().equals("step_over")) { // step_over
- fDebugTarget.suspended(DebugEvent.STEP_END);
- // XDebugCorePlugin.log(IStatus.INFO,response.getCommand()+"
- // STEP_END sent");
- } else if (response.getCommand().equals("step_out")) { // step_over
- fDebugTarget.suspended(DebugEvent.STEP_END);
- // XDebugCorePlugin.log(IStatus.INFO,response.getCommand()+"
- // STEP_END sent");
- }
- } else if (response.getCommand().equals("breakpoint_set")) { // step_over
- String idStr = response.getAttributeValue("id");
- if (idStr != "") {
- int targetID = response.getTransactionID();
- BreakpointResponseData ResponseData = new BreakpointResponseData(
- response.getTransactionID(), Integer
- .parseInt(idStr));
-
- fDebugTarget.fireDebugResponseEvent(ResponseData);
- IBreakpoint[] breakpoints = XDebugCorePlugin
- .getBreakpoints();
- for (int i = 0; i < breakpoints.length; i++) {
- XDebugLineBreakpoint breakpoint = (XDebugLineBreakpoint) breakpoints[i];
- try {
- if (breakpoint.getID() == targetID)
- breakpoint.setID(Integer.parseInt(idStr));
- } catch (NumberFormatException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (CoreException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
- */
- protected IStatus run(IProgressMonitor monitor) {
- String InputXML = "";
- while (!fDebugTarget.isTerminated() && (InputXML != null)) {
- InputXML = readData();
- if (InputXML != null) {
- XDebugCorePlugin.log(IStatus.INFO, InputXML);
- lastResponse.setParentNode(InputXML);
- if (lastResponse.getName() == "init") {
- Node myNode = lastResponse.getParentNode();
- appID = PHPDebugUtils
- .getAttributeValue(myNode, "appid");
- fileuri = PHPDebugUtils.getAttributeValue(myNode,
- "fileuri");
- // fDebugTarget.started();
- fDebugTarget.fireCreationEvent();
- } else if (lastResponse.getName() == "response") {
- checkResponse(lastResponse);
- }
- ResponseList.put(new Integer(lastResponse
- .getTransactionID()), lastResponse);
- lastResponse.notifyWait();
- }
- }
- return Status.OK_STATUS;
- }
-
- }
-
- public DebugConnection(XDebugTarget debugTarget, int debugPort) {
- fDebugTarget = debugTarget;
- lastResponse = new DebugResponse();
- ResponseList = new HashMap();
-
- try {
- fDebugServerSocket = new ServerSocket(debugPort);
- fDebugSocket = fDebugServerSocket.accept();
- fDebugWriter = new OutputStreamWriter(fDebugSocket
- .getOutputStream(), "UTF8");
- fDebugReader = new DataInputStream(fDebugSocket.getInputStream());
- // fDebugReader = new BufferedReader(new
- // InputStreamReader(fDebugSocket.getInputStream()));
-
- } catch (UnknownHostException e) {
- // abort("Unable to connect to PHP Debuger", e);
- } catch (IOException e) {
- // abort("Unable to connect to PHP Debuger", e);
- }
- fResponseListener = new ResponseListenerJob();
- fResponseListener.schedule();
-
- }
-
- private void terminated() {
- try {
- fDebugReader.close();
- fDebugWriter.close();
- fDebugSocket.close();
- fDebugServerSocket.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- fDebugTarget.terminated();
-
- }
-
- private String readData() {
- byte byteBuffer[] = null, b;
- int count = 0;
-
- try {
- while ((b = fDebugReader.readByte()) != 0) {
- count = count * 10 + b - '0';
- // count=count*10+Integer.parseInt(b);
- }
- // System.out.println(count);
- byteBuffer = new byte[count];
- int readCount = 0;
- int attempts = 0;
- while ((count > 0) && (attempts < 5)) {
- int rc = fDebugReader.read(byteBuffer, readCount, count);
- count -= rc;
- readCount += rc;
- attempts++;
- }
- if ((b = fDebugReader.readByte()) != 0) // reads the NULL Byte at
- // the end;
- System.out.println("NULL-Byte missing!!");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- if (e instanceof EOFException == false)
- e.printStackTrace();
- return null;
- }
- return new String(byteBuffer);
- }
-
- /**
- * Sends a request to the Debugengine and waits for an OK.
- *
- * @param command
- * debug command
- * @throws DebugException
- * if the request fails
- */
-
- public int sendRequest(String command) throws DebugException {
- return sendRequest(command, "");
- }
-
- /**
- * Sends a request to the Debugengine and waits for an OK.
- *
- * @param command
- * debug command
- * @arguments arguments for the command
- * @throws DebugException
- * if the request fails
- */
-
- public synchronized int sendRequest(String command, String arguments)
- throws DebugException {
-
- // System.out.println(command+" -i "+transactionID+" "+arguments);
- XDebugCorePlugin.log(IStatus.INFO, command + " -i " + fTransactionID
- + " " + arguments);
- synchronized (fDebugSocket) {
- try {
- fDebugWriter.write(command);
- fDebugWriter.write(" -i " + fTransactionID);
- if (arguments != "")
- fDebugWriter.write(" " + arguments);
- fDebugWriter.write(0);
- fDebugWriter.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return fTransactionID++;
- }
-
- public DebugResponse waitforTransID(int id) {
- if (ResponseList.containsKey(new Integer(id))) {
- // return (DebugResponse)ResponseList.get(new Integer(id));
- return (DebugResponse) ResponseList.remove(new Integer(id));
- } else
- return lastResponse.waitforTransactionID(id);
- }
-
- public DebugResponse getResponse(int id) {
- if (ResponseList.containsKey(new Integer(id)))
- return (DebugResponse) ResponseList.get(new Integer(id));
- else
- return waitforTransID(id);
- }
-
-}
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core;
+
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugStackFrame;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugThread;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.debug.core.model.IVariable;
+
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.DebugResponse;
+
+public interface IDebugConnection {
+ /**
+ *
+ * @param featureName
+ * @return true if debugger supports feature
+ */
+ DebugResponse featureGet(String featureName);
+
+ boolean featureSet(String featureName, String value);
+
+ DebugResponse sendRequestA(String command, String parameter);
+
+ /**
+ *
+ * @param breakpoint breakpoint to set
+ * @throws DebugException
+ */
+ void addBreakpoint(IBreakpoint breakpoint, IPath filePath) throws DebugException;
+
+ /**
+ *
+ * @param breakpoint breakpoint to remove
+ * @throws DebugException
+ */
+ void removeBreakpoint(IBreakpoint breakpoint) throws DebugException;
+
+ /**
+ *
+ * @param thread
+ * @return stackframes
+ * @throws DebugException
+ */
+ IStackFrame[] getStackFrames(XDebugThread thread) throws DebugException;
+
+ /**
+ * Single stepOver the interpreter.
+ *
+ * @throws DebugException if the request fails
+ */
+ void stepOver() throws DebugException;
+
+ /**
+ * Single Stepinto the interpreter.
+ *
+ * @throws DebugException if the request fails
+ * @throws
+ */
+ void stepInto() throws DebugException;
+
+ /**
+ * Single stepOut the interpreter.
+ *
+ * @throws DebugException if the request fails
+ */
+ void stepOut() throws DebugException;
+
+ /**
+ * Resume the debug process.
+ *
+ * @throws DebugException if the request fails
+ */
+ void run() throws DebugException;
+
+ /**
+ * Stops the debug process.
+ *
+ * @throws DebugException if the request fails
+ */
+ void stop() throws DebugException;
+
+
+ boolean isClosed();
+
+ /**
+ *
+ * @param name variable name
+ * @param value value of the variable
+ * @return true if successfull
+ */
+
+ public boolean setVarValue(String name, String value);
+
+ boolean isInitialized();
+
+ /**
+ * Get the SessionID of the current Connection.
+ *
+ * @throws DebugException if the request fails
+ */
+ String getSessionID();
+
+ void setResponseListerner(Job listener);
+
+ void startListener();
+ /**
+ *
+ * @param frame
+ * @param level context-level
+ * @return the variables for the context
+ */
+ public IVariable[] getVariables(XDebugStackFrame frame ,int level);
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core;
+
+public interface IPHPDebugEvent {
+
+ int BREAKPOINT_HIT = 0;
+ int STEP_END = 1;
+ int STOPPED = 2;
+
+}
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core;
+
+
+public interface IProxyEventListener {
+ public void handleProxyEvent(String ideKey, String initString, AbstractDebugConnection connectin);
+
+}
public interface IXDebugPreferenceConstants {
public static final String DEBUGPORT_PREFERENCE = "debugport";
-
public static final int DEFAULT_DEBUGPORT = 9000;
-
public static final String PHP_INTERPRETER_PREFERENCE = "phpInterpreter";
}
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core;
+
+
+/**
+ * Local version of org.eclipse.jface.util.ListenerList (modified)s
+ */
+public class ListenerList {
+ /**
+ * The current number of listeners.
+ * Maintains invariant: 0 <= fSize <= listeners.length.
+ */
+ private int fSize;
+
+ /**
+ * The list of listeners. Initially <code>null</code> but initialized
+ * to an array of size capacity the first time a listener is added.
+ * Maintains invariant: listeners != null if and only if fSize != 0
+ */
+ private Object[] fListeners= null;
+
+ /**
+ * The empty array singleton instance, returned by getListeners()
+ * when size == 0.
+ */
+ private static final Object[] EmptyArray= new Object[0];
+
+ /**
+ * Creates a listener list with the given initial capacity.
+ *
+ * @param capacity the number of listeners which this list can initially accept
+ * without growing its internal representation; must be at least 1
+ */
+ public ListenerList(int capacity) {
+ if (capacity < 1) {
+ throw new IllegalArgumentException();
+ }
+ fListeners= new Object[capacity];
+ fSize= 0;
+ }
+
+ /**
+ * Adds a listener to the list.
+ * Has no effect if an identical listener is already registered.
+ *
+ * @param listener a listener
+ */
+ public synchronized void add(Object listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException();
+ }
+ // check for duplicates using identity
+ for (int i= 0; i < fSize; ++i) {
+ if (fListeners[i] == listener) {
+ return;
+ }
+ }
+ // grow array if necessary
+ if (fSize == fListeners.length) {
+ Object[] temp= new Object[(fSize * 2) + 1];
+ System.arraycopy(fListeners, 0, temp, 0, fSize);
+ fListeners= temp;
+ }
+ fListeners[fSize++]= listener;
+ }
+
+ /**
+ * Returns an array containing all the registered listeners.
+ * The resulting array is unaffected by subsequent adds or removes.
+ * If there are no listeners registered, the result is an empty array
+ * singleton instance (no garbage is created).
+ * Use this method when notifying listeners, so that any modifications
+ * to the listener list during the notification will have no effect on the
+ * notification itself.
+ */
+ public synchronized Object[] getListeners() {
+ if (fSize == 0) {
+ return EmptyArray;
+ }
+ Object[] result= new Object[fSize];
+ System.arraycopy(fListeners, 0, result, 0, fSize);
+ return result;
+ }
+
+ /**
+ * Removes a listener from the list.
+ * Has no effect if an identical listener was not already registered.
+ *
+ * @param listener a listener
+ */
+ public synchronized void remove(Object listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException();
+ }
+
+ for (int i= 0; i < fSize; ++i) {
+ if (fListeners[i] == listener) {
+ if (--fSize == 0) {
+ fListeners= new Object[1];
+ } else {
+ if (i < fSize) {
+ fListeners[i]= fListeners[fSize];
+ }
+ fListeners[fSize]= null;
+ }
+ return;
+ }
+ }
+ }
+
+ /**
+ * Removes all the listeners from the list.
+ */
+ public synchronized void removeAll() {
+ fListeners= new Object[0];
+ fSize= 0;
+ }
+
+ /**
+ * Returns the number of registered listeners
+ *
+ * @return the number of registered listeners
+ */
+ public int size() {
+ return fSize;
+ }
+}
+
+
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.xdebug.core;
+
+import java.util.HashMap;
+
+
+/**
+ * Local version of org.eclipse.jface.util.ListenerList (modified)s
+ */
+public class ListenerMap {
+ /**
+ * The current number of listeners.
+ * Maintains invariant: 0 <= fSize <= listeners.length.
+ */
+ private int fSize;
+
+ /**
+ * The map of listeners. Initially <code>null</code> but initialized
+ * to an array of size capacity the first time a listener is added.
+ * Maintains invariant: listeners != null if and only if fSize != 0
+ */
+ private HashMap fListeners = null;
+// private HashMap<String,Object> fListeners = null;
+
+ /**
+ * Creates a listener map with the given initial capacity.
+ *
+ * @param capacity the number of listeners which this list can initially accept
+ * without growing its internal representation; must be at least 1
+ */
+ public ListenerMap(int capacity) {
+ if (capacity < 1) {
+ throw new IllegalArgumentException();
+ }
+ fListeners = new HashMap(capacity);
+ fSize = 0;
+ }
+
+ /**
+ * Adds a listener to the Map.
+ * Overwrites an existing listener with the same IDE_Key.
+ *
+ * @param listener a listener
+ * @param ideKey IDE-key of the listener
+ */
+ public synchronized void add(Object listener,String ideKey) {
+ if (listener == null) {
+ throw new IllegalArgumentException();
+ }
+ // check for duplicates using identity
+ if (fListeners.get(ideKey) != null)
+ fSize++;
+ fListeners.put(ideKey,listener);
+ }
+
+ /**
+ * Returns a map containing all the registered listeners.
+ * The resulting map is unaffected by subsequent adds or removes.
+ * If there are no listeners registered, the result is an empty map.
+ * Use this method when notifying listeners, so that any modifications
+ * to the listener list during the notification will have no effect on the
+ * notification itself.
+ */
+ public synchronized HashMap getListeners() {
+ if (fSize == 0) {
+ return null;
+ }
+ HashMap result = new HashMap(fListeners);
+ return result;
+ }
+
+ /**
+ * Returns the listener associated with the ideKey.
+ * If there is no listener registered, the result is null.
+ * Use this method when notifying listeners, so that any modifications
+ * to the listener list during the notification will have no effect on the
+ * notification itself.
+ */
+ public synchronized Object getListener(String ideKey) {
+ return fListeners.get(ideKey);
+ }
+
+ /**
+ * Removes a listener from the list.
+ * Has no effect if an identical listener was not already registered.
+ *
+ * @param listener a listener
+ */
+ public synchronized void remove(Object listener,String ideKey) {
+ if (listener == null) {
+ throw new IllegalArgumentException();
+ }
+
+ if (fListeners.get(ideKey) == listener) {
+ fListeners.remove(ideKey);
+ fSize--;
+ }
+ }
+
+ /**
+ * Removes all the listeners from the list.
+ */
+ public synchronized void removeAll() {
+ fListeners.clear();
+ fSize = 0;
+ }
+
+ /**
+ * Returns the number of registered listeners
+ *
+ * @return the number of registered listeners
+ */
+ public int size() {
+ return fSize;
+ }
+}
\ No newline at end of file
import org.w3c.dom.Node;
public class PHPDebugUtils {
- public static String getAttributeValue(Node CurrentNode,
- String AttributeName) {
+ public static String getAttributeValue (Node CurrentNode, String AttributeName) {
String strValue = "";
if (CurrentNode.hasAttributes()) {
NamedNodeMap listAttribute = CurrentNode.getAttributes();
Node attribute = listAttribute.getNamedItem(AttributeName);
- if (attribute != null)
+ if (attribute !=null)
strValue = attribute.getNodeValue();
}
return strValue;
}
-
+
public static String escapeString(String string) {
- StringBuffer escString = new StringBuffer();
- Pattern pattern = Pattern.compile("[a-zA-Z0-9\\._-]");
- Matcher matcher;
- for (int i = 0; i < string.length(); i++) {
- char c = string.charAt(i);
- matcher = pattern.matcher("" + c);
- if (matcher.find())
+ StringBuffer escString=new StringBuffer();
+ Pattern pattern = Pattern.compile("[a-zA-Z0-9\\._-]");
+ Matcher matcher;
+ for (int i= 0; i<string.length(); i++) {
+ char c=string.charAt(i);
+ matcher = pattern.matcher(""+c);
+ if(matcher.find())
escString.append(c);
else {
- int hexval = (byte) c;
- escString.append("%"
- + Integer.toHexString(hexval).toUpperCase());
+ int hexval=(byte)c;
+ escString.append("%"+Integer.toHexString(hexval).toUpperCase());
}
}
return escString.toString();
}
-
+
public static String unescapeString(String escString) {
- StringBuffer string = new StringBuffer();
- if (escString.indexOf('%') == -1)
+ StringBuffer string=new StringBuffer();
+ if (escString.indexOf('%')==-1)
return escString;
- String[] s = escString.split("%");
+ String[] s= escString.split("%");
string.append(s[0]);
- for (int i = 1; i < s.length; i++) {
- int c = Integer.parseInt(s[i].substring(0, 2), 16);
- string.append((char) c);
- if (s[i].length() > 2)
- string.append(s[i].substring(2));
-
+ for(int i=1 ; i<s.length;i++) {
+ int c =Integer.parseInt(s[i].substring(0,2),16);
+ string.append((char)c);
+ if(s[i].length()>2)
+ string.append(s[i].substring(2));
+
}
return string.toString();
}
+
}
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core;
+
+//import java.net.MalformedURLException;
+//import java.net.URL;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+public class PathMapItem {
+ private IPath local;
+ private IPath remote;
+
+ // String.split() uses regular expressions
+ static final String DELIMITER_REGEX = "\\+\\*\\+";
+ static final String DELIMITER = "+*+";
+
+ static private String MakeStringData(IPath local, IPath remote) {
+ //IPath b = new Path("file:/var/www/index.php");
+
+ if(local.getDevice() == "file://") {
+ local = local.setDevice("");
+ }
+ String data = local.toString()+DELIMITER+remote.toString();
+ return data;
+ }
+
+ public PathMapItem(String newLocal, String newRemote) {
+ IPath localPath = sanitizePath(newLocal);
+ IPath remotePath = sanitizePath(newRemote);
+ local = localPath;
+ remote = remotePath;
+ }
+
+ private IPath sanitizePath(String newPath) {
+ IPath sanitizePath = null;
+ IPath computePath = new Path(newPath);
+ /*if(computePath.getDevice() == null) {
+ sanitizePath = new Path("file://", newPath);
+ } else {
+ if(computePath.getDevice() == "file:") {
+ sanitizePath = computePath;
+ } else {*/
+ sanitizePath = computePath;
+ /*}
+ }*/
+ return sanitizePath;
+ }
+
+ public PathMapItem(String data) {
+ String[] strData = data.split(DELIMITER_REGEX);
+ IPath localPath = sanitizePath(strData[0]);
+ IPath remotePath = sanitizePath(strData[1]);
+ local = localPath;
+ remote = remotePath;
+ }
+
+ public String getStringData() {
+ return PathMapItem.MakeStringData(local, remote);
+ }
+
+ /**
+ * Returns the local path, which serves as the key in the local/remote
+ * pair this variable represents
+ *
+ * @return local path
+ */
+ public IPath getLocalPath() {
+ return new Path(local.toString());
+ }
+
+ /**
+ * Returns the remote path.
+ *
+ * @return remote path
+ */
+ public IPath getRemotePath() {
+ return new Path(remote.toString());
+ }
+
+ /**
+ * Sets the local path
+ * @param local path
+ * @throws MalformedURLException
+ */
+ public void setLocalPath(String path) {
+ this.local = sanitizePath(path);
+ }
+
+ /**
+ * Sets the local path
+ * @param local path
+ */
+ public void setLocalPath(IPath path) {
+ this.local = path;
+ }
+
+ /**
+ * Sets the remote path
+ * @param remote path
+ */
+ public void setRemotePath(IPath path) {
+ this.remote = path;
+ }
+
+ /**
+ * Sets the remote path
+ * @param remote path
+ * @throws MalformedURLException
+ */
+ public void setRemotePath(String path) {
+ this.remote = sanitizePath(path);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ return local.toString()+"->"+remote.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ boolean equal = false;
+ if (obj instanceof PathMapItem) {
+ PathMapItem var = (PathMapItem) obj;
+ equal = var.getLocalPath().equals(local);
+ }
+ return equal;
+ }
+}
\ No newline at end of file
+++ /dev/null
-package net.sourceforge.phpeclipse.xdebug.core;
-
-public class ResponseData {
-
- private int fTransactionID = -1;
-
- ResponseData(int transactionID) {
- fTransactionID = transactionID;
- }
-
- public int getTransactionID() {
- return fTransactionID;
- }
-
- public void setTransactionID(int transactionID) {
- fTransactionID = transactionID;
- }
-}
package net.sourceforge.phpeclipse.xdebug.core;
-import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
+import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
+//import org.eclipse.ui.plugin.AbstractUIPlugin;// *;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+//import org.eclipse.core.resources.IWorkspace;
+//import org.eclipse.core.resources.ResourcesPlugin;
+//import org.eclipse.core.resources.IWorkspace;
+//import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+//import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.jface.preference.IPreferenceStore;
+//import org.eclipse.jface.resource.ImageDescriptor;
import org.osgi.framework.BundleContext;
-/**
- * The main plugin class to be used in the desktop.
- */
-public class XDebugCorePlugin extends AbstractUIPlugin {
-
- // The shared instance.
+public class XDebugCorePlugin extends Plugin {
private static XDebugCorePlugin plugin;
-
public static final String PLUGIN_ID = "net.sourceforge.phpeclipse.xdebug.core"; //$NON-NLS-1$
+
+ private XDebugProxy fXDebugProxy;
+
+ private ScopedPreferenceStore preferenceStore;
+
/**
* The constructor.
*/
*/
public void stop(BundleContext context) throws Exception {
super.stop(context);
+ if (fXDebugProxy != null)
+ fXDebugProxy.stop();
plugin = null;
}
public static XDebugCorePlugin getDefault() {
return plugin;
}
-
+
+ /*public static IWorkspace getWorkspace() {
+ return ResourcesPlugin.getWorkspace();
+ }*/
+
public static IBreakpoint[] getBreakpoints() {
- return getBreakpointManager().getBreakpoints(
- IXDebugConstants.ID_PHP_DEBUG_MODEL);
+ return getBreakpointManager().getBreakpoints(IXDebugConstants.ID_PHP_DEBUG_MODEL);
}
-
- public static IBreakpointManager getBreakpointManager() {
+
+ public static /*static*/ IBreakpointManager getBreakpointManager() {
return DebugPlugin.getDefault().getBreakpointManager();
}
- /**
- * Returns an image descriptor for the image file at the given plug-in
- * relative path.
- *
- * @param path
- * the path
- * @return the image descriptor
- */
- public static ImageDescriptor getImageDescriptor(String path) {
- return AbstractUIPlugin.imageDescriptorFromPlugin(
- "net.sourceforge.phpeclipse.xdebug.core", path);
- }
-
public static void log(int severity, String message) {
- Status status = new Status(severity, PLUGIN_ID, IStatus.OK, message,
- null);
- XDebugCorePlugin.log(status);
+ Status status = new Status(severity, PLUGIN_ID, IStatus.OK, message, null) ;
+ XDebugCorePlugin.log(status) ;
}
public static void log(IStatus status) {
}
public static void log(Throwable e) {
- log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR,
- "PHPLaunchingPlugin.internalErrorOccurred", e)); //$NON-NLS-1$
+ log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, "PHPLaunchingPlugin.internalErrorOccurred", e)); //$NON-NLS-1$
}
-
- /**
- * Returns the workspace instance.
- */
- public static IWorkspace getWorkspace() {
- return ResourcesPlugin.getWorkspace();
+
+ public static String getUniqueIdentifier() {
+ return PLUGIN_ID;
+ }
+
+ public void setProxyPort(int port) {
+ if(fXDebugProxy!=null) {
+ if (fXDebugProxy.isRunning()) {
+ fXDebugProxy.stop();
+ }
+ fXDebugProxy=null;
+ }
}
-}
+ public XDebugProxy getXDebugProxy() {
+ if (fXDebugProxy == null) {
+ int debugPort=getPreferenceStore().getInt(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE);
+ if (debugPort<1024)
+ debugPort=IXDebugPreferenceConstants.DEFAULT_DEBUGPORT;
+ fXDebugProxy= new XDebugProxy(debugPort);
+ }
+ return fXDebugProxy;
+ }
+
+ public IPreferenceStore getPreferenceStore() {
+ // Create the preference store lazily.
+ if (preferenceStore == null) {
+ preferenceStore = new ScopedPreferenceStore(new InstanceScope(),getBundle().getSymbolicName());
+
+ }
+ return preferenceStore;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.XDebugConnection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.IDebugEventFilter;
+import org.eclipse.debug.core.IDebugEventSetListener;
+
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
+
+public class XDebugProxy {
+ private XDebugTarget fTarget;
+
+ protected String fInitString;
+ protected String fIdeKey;
+
+ protected AbstractDebugConnection fConnection;
+
+ class ProxyListenerJob extends Job {
+ public ProxyListenerJob() {
+ super("XDebug Proxy Connection Dispatch");
+ setSystem(true);
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ protected IStatus run(IProgressMonitor monitor) {
+ boolean timeout;
+ boolean error;
+ Socket socket=null;
+ DataInputStream reader=null;
+ OutputStreamWriter writer=null;
+
+ while (!fTerminate) {
+ timeout = false;
+ error = false;
+ socket=null;
+ reader=null;
+ writer=null;
+ if (monitor.isCanceled()) return Status.CANCEL_STATUS;
+ try {
+ socket = fProxyServerSocket.accept();
+ } catch (java.net.SocketTimeoutException e) {
+ timeout=true;
+ } catch (IOException e) {
+ error=true;
+// e.printStackTrace();
+ }
+ if (!(timeout || error)) {
+ XDebugCorePlugin.log(IStatus.INFO,"Proxy: someone tries to connect");
+
+ try {
+ writer = new OutputStreamWriter(socket.getOutputStream(), "UTF8");
+ reader = new DataInputStream(socket.getInputStream());
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ fConnection=(AbstractDebugConnection) new XDebugConnection(socket,reader,writer);
+ if (fConnection.isInitialized()) {
+ fIdeKey=fConnection.getSessionID();
+ XDebugCorePlugin.log(IStatus.INFO,"<init idekey \""+fIdeKey+"\">");
+
+ fireProxyEvent();
+ }
+ }
+
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ /**
+ * Filters and dispatches events in a safe runnable to handle any
+ * exceptions.
+ */
+ class EventNotifier implements ISafeRunnable {
+
+ private IProxyEventListener fListener;
+
+ /**
+ * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
+ */
+ public void handleException(Throwable exception) {
+ IStatus status = new Status(IStatus.ERROR, XDebugCorePlugin.getUniqueIdentifier(), IStatus.ERROR, "An exception occurred while dispatching proxy", exception); //$NON-NLS-1$
+ XDebugCorePlugin.log(status);
+ }
+
+ /**
+ * @see org.eclipse.core.runtime.ISafeRunnable#run()
+ */
+ public void run() throws Exception {
+
+ fListener.handleProxyEvent(fIdeKey, fInitString, fConnection);
+ }
+
+ /**
+ * Filter and dispatch the given events. If an exception occurs in one
+ * listener, events are still fired to subsequent listeners.
+ *
+ * @param events debug events
+ */
+ public void dispatch() {
+ fListener = (IProxyEventListener) getEventListener(fIdeKey);
+ if (fListener==null) { // no listener is found so start the script
+ try {
+ fConnection.run();
+ } catch (DebugException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ } else
+ Platform.run(this);
+ fListener = null;
+ }
+
+ }
+
+
+ private ServerSocket fProxyServerSocket;
+ private ProxyListenerJob fProxyListener;
+ private boolean fTerminate;
+ private int fProxyPort;
+ private ListenerMap fEventListeners;
+ private boolean fIsRunning;
+
+
+ public XDebugProxy (int port) {
+ fProxyPort=port;
+ }
+
+ public void setTarget( XDebugTarget Target ) {
+ fTarget = Target;
+ }
+
+ public XDebugTarget getTarget() {
+ return fTarget;
+ }
+
+ public void start() {
+ if (fIsRunning)
+ return;
+ try {
+ fProxyServerSocket = new ServerSocket(fProxyPort);
+ // set 5sek as timeout
+ fProxyServerSocket.setSoTimeout(5000);
+ XDebugCorePlugin.log(IStatus.INFO,"Proxy listens on port "+fProxyPort);
+
+// fDebugReader = new BufferedReader(new InputStreamReader(fDebugSocket.getInputStream()));
+
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+// abort("Unable to connect to PHP Debuger", e);
+ } catch (IOException e) {
+ e.printStackTrace();
+// abort("Unable to connect to PHP Debuger", e);
+ }
+ fTerminate=false;
+ fProxyListener = new ProxyListenerJob();
+ fProxyListener.schedule();
+ fIsRunning=true;
+
+ }
+
+/* public void stop() {
+ if (!fIsRunning)
+ return;
+ fTerminate=true;
+ fProxyListener.cancel();
+ try {
+ fProxyServerSocket.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ fIsRunning = false;
+ XDebugCorePlugin.log(IStatus.INFO,"Proxy stopped");
+
+ }*/
+
+ public void stop() {
+ if (fIsRunning) {
+ fProxyListener.cancel();
+ fTerminate = true;
+ try {
+ fProxyServerSocket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ fIsRunning = false;
+ XDebugCorePlugin.log(IStatus.INFO,"Proxy stopped");
+ }
+ }
+
+ /**
+ * Adds the given listener to the collection of registered proxy
+ * event listeners. Has no effect if an identical listener is already
+ * registered.
+ *
+ * @param listener the listener to add
+
+ */
+ public void addProxyEventListener(IProxyEventListener listener, String key) {
+ if (fEventListeners == null) {
+ fEventListeners = new ListenerMap(5);
+ }
+ fEventListeners.add(listener, key);
+ }
+
+ /**
+ * Removes the given listener from the collection of registered proxy
+ * event listeners. Has no effect if an identical listener is not already
+ * registered.
+ *
+ * @param listener the listener to remove
+ */
+ public void removeProxyEventListener(IProxyEventListener listener,String key) {
+ if (fEventListeners != null) {
+ fEventListeners.remove(listener,key);
+ }
+ }
+
+ /**
+ * Notifies all registered proxy event set listeners of the given
+ * proxy events. Events which are filtered by a registered debug event
+ * filter are not fired.
+ *
+ * @param events array of debug events to fire
+ * @see IDebugEventFilter
+ * @see IDebugEventSetListener
+ * @since 2.0
+ */
+ public void fireProxyEvent() {
+ EventNotifier fNotifier = new EventNotifier();
+ fNotifier.dispatch();
+ }
+
+ /**
+ * Returns the collection of registered proxy event listeners
+ *
+ * @return list of registered proxy event listeners, instances
+ * of <code>IProxyEventListeners</code>
+ */
+ /*private Map getEventListeners() {
+ return fEventListeners.getListeners();
+ }*/
+
+ private Object getEventListener(String ideKey) {
+ return fEventListeners.getListener(ideKey);
+ }
+
+ /**
+ * @return Returns the fProxyPort.
+ */
+ public int getProxyPort() {
+ return fProxyPort;
+ }
+
+ public boolean isRunning() {
+ return fIsRunning;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core.xdebug;
+
+import java.util.HashMap;
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.DebugResponse;
+
+public class ResponseList {
+ int fLastId;
+ HashMap fList;
+
+ public ResponseList() {
+ fLastId = -1;
+ fList = new HashMap();
+ }
+
+ public synchronized void add(DebugResponse response, int id) {
+ fList.put(new Integer(id), response);
+ fLastId = id;
+ notifyAll();
+ }
+
+ public synchronized DebugResponse get(int id) {
+ while (id > fLastId) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ if (fList.containsKey(new Integer(id)))
+ return (DebugResponse) fList.remove(new Integer(id));
+ else
+ return null;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.core.xdebug;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import net.sourceforge.phpeclipse.xdebug.core.IPHPDebugEvent;
+import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;
+import net.sourceforge.phpeclipse.xdebug.core.PathMapItem;
+import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugLineBreakpoint;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.ILineBreakpoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+import org.w3c.dom.CDATASection;
+
+/**
+ * Listens to events from the XDebug and fires corresponding
+ * debug events.
+ */
+
+public class ResponseListener extends Job {
+
+
+ public class DebugResponse {
+
+ private Node parentNode;
+ private int fTransactionID=-1;
+ private String fCommand="";
+ private String fStatus;
+ private String fReason;
+ private String fName;
+ private boolean fError;
+
+ private String fValue;
+ private String fType;
+ private String fAddress;
+
+ public synchronized void setParentNode (String xmlInput){
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder=null;
+ Document doc=null;
+ try {
+ builder = factory.newDocumentBuilder();
+ } catch (ParserConfigurationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ ByteArrayInputStream InputXMLStream = new ByteArrayInputStream(xmlInput.getBytes());
+
+ try {
+ doc = builder.parse(InputXMLStream);
+ } catch (SAXException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+
+ parentNode=doc.getFirstChild();
+
+ fName=parentNode.getNodeName();
+ String idStr = getAttributeValue("transaction_id");
+ if (!"".equals(idStr))
+ fTransactionID = Integer.parseInt(idStr);
+ fCommand = getAttributeValue("command");
+ fStatus = getAttributeValue("status");
+ fReason = getAttributeValue("reason");
+
+ if( fCommand.compareTo("eval") == 0 ) {
+ try {
+ Node property = parentNode.getFirstChild();
+
+ NamedNodeMap listAttribute = property.getAttributes();
+ Node attribute = listAttribute.getNamedItem("type");
+ if (attribute !=null) {
+ fType = attribute.getNodeValue();
+ }
+
+ Node attribute1 = listAttribute.getNamedItem("address");
+ if (attribute1 !=null) {
+ fAddress = attribute1.getNodeValue();
+ }
+
+ Node firstChild1 = (Node) property.getFirstChild();
+
+ if( firstChild1 != null ) {
+ fValue = firstChild1.getNodeValue();
+ }
+ } catch (Exception e) {
+ // TODO: handle exception
+ }
+ } else {
+ try {
+ CDATASection firstChild = (CDATASection) parentNode.getFirstChild();
+
+ if( firstChild != null ) {
+ fValue = parentNode.getFirstChild().getNodeValue();
+ }
+ } catch (Exception e) {
+ // TODO: handle exception
+ }
+ }
+ }
+
+ public String getAttributeValue (String AttributeName) {
+ String strValue = "";
+ if (parentNode.hasAttributes()) {
+ NamedNodeMap listAttribute = parentNode.getAttributes();
+ Node attribute = listAttribute.getNamedItem(AttributeName);
+ if (attribute !=null)
+ strValue = attribute.getNodeValue();
+ }
+ return strValue;
+ }
+
+ public synchronized Node getParentNode(){
+ return parentNode;
+ }
+
+ public synchronized String getCommand() {
+ return fCommand;
+ }
+ public synchronized String getName() {
+ return fName;
+ }
+
+ public synchronized String getValue() {
+ return fValue;
+ }
+
+ public synchronized String getType() {
+ return fType;
+ }
+
+ public synchronized String getAddress() {
+ return fAddress;
+ }
+
+ DebugResponse () {
+ fTransactionID = -1;
+ fCommand = "";
+ fStatus = "";
+ fReason = "";
+ fName= "";
+ }
+
+ DebugResponse (String XMLInput) {
+ setParentNode(XMLInput);
+ }
+
+ public synchronized String getReason() {
+ return fReason;
+ }
+
+ public synchronized String getStatus() {
+ return fStatus;
+ }
+
+ public synchronized int getTransactionID() {
+ return fTransactionID;
+ }
+
+ public boolean isError() {
+ return fError;
+ }
+
+ public void setError(boolean error) {
+ fError = error;
+ }
+
+ }
+
+
+ private XDebugConnection fConnection;
+ //private XDebugTarget fDebugTarget;
+ private DebugResponse lastResponse;
+
+ public ResponseListener(XDebugConnection connection) {
+ super("XDebug Event Dispatch");
+ setSystem(true);
+ fConnection=connection;
+ lastResponse= new DebugResponse();
+ }
+
+
+
+
+ private void checkResponse(DebugResponse response) {
+ Node node=response.getParentNode();
+ if (node.hasChildNodes()) {
+ Node child=node.getFirstChild();
+ if (child.getNodeName().equals("error")) {
+ int code = Integer.parseInt(PHPDebugUtils.getAttributeValue(child, "code"));
+ String text=(child.getFirstChild()).getNodeValue();
+ XDebugCorePlugin.log(IStatus.ERROR," ERROR "+code+": "+text);
+ lastResponse.setError(true);
+ return;
+ }
+ }
+ lastResponse.setError(false);
+ if (response.getStatus().equals("stopping")) {
+ //if (response.getStatus().equals("stopped")) {
+ fConnection.close();
+ fireEvent(IPHPDebugEvent.STOPPED);
+ } else if (response.getStatus().equals("break") && response.getReason().equals("ok")){
+ if (response.getCommand().equals("run")) { // breakpoint hit
+ int id=-1;
+ try {
+ id=fConnection.sendRequest("stack_get");
+ } catch (DebugException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ String InputXML = fConnection.readData();
+ if (InputXML != null) {
+ XDebugCorePlugin.log(IStatus.INFO, InputXML);
+ lastResponse.setParentNode(InputXML);
+ breakpointHit(lastResponse.getParentNode());
+ }
+
+ } else if (response.getCommand().equals("step_into")) { // step_into
+ fireEvent(IPHPDebugEvent.STEP_END);
+// XDebugCorePlugin.log(IStatus.INFO,response.getCommand()+" STEP_END sent");
+ } else if (response.getCommand().equals("step_over")) { // step_over
+ fireEvent(IPHPDebugEvent.STEP_END);
+// XDebugCorePlugin.log(IStatus.INFO,response.getCommand()+" STEP_END sent");
+ } else if (response.getCommand().equals("step_out")) { // step_over
+ fireEvent(IPHPDebugEvent.STEP_END);
+// XDebugCorePlugin.log(IStatus.INFO,response.getCommand()+" STEP_END sent");
+ }
+ }
+
+ }
+
+ protected void fireEvent(int detail) {
+ DebugEvent event = new DebugEvent(this, DebugEvent.MODEL_SPECIFIC, detail);
+ DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
+ }
+
+ protected void fireEvent(int detail, Object data) {
+ DebugEvent event = new DebugEvent(this, DebugEvent.MODEL_SPECIFIC, detail);
+ event.setData(data);
+ DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
+ }
+
+
+ protected void breakpointHit(Node node) {
+ Node child=node.getFirstChild();
+ if (child.getNodeName().equals("stack")) {
+ int lineNumber = Integer.parseInt(PHPDebugUtils.getAttributeValue(child, "lineno"));
+ String filename=PHPDebugUtils.getAttributeValue(child, "filename");
+ IBreakpoint[] breakpoints = XDebugCorePlugin.getBreakpoints();
+ for (int i = 0; i < breakpoints.length; i++) {
+ IBreakpoint breakpoint = breakpoints[i];
+ if (supportsBreakpoint(breakpoint)) {
+ if (breakpoint instanceof ILineBreakpoint) {
+ ILineBreakpoint lineBreakpoint = (ILineBreakpoint) breakpoint;
+ try {
+ if (breakpoint.isEnabled()) {
+ IMarker marker = breakpoint.getMarker();
+ if (marker != null) {
+ String endfilename;
+
+ if( XDebugCorePlugin.getDefault().getXDebugProxy().getTarget().getProcess() == null ) {
+ endfilename = marker.getResource().getLocation().lastSegment();
+ } else {
+ endfilename = marker.getResource().getLocation().toOSString();
+ }
+
+ if(PHPDebugUtils.unescapeString(filename).endsWith(endfilename) && (lineBreakpoint.getLineNumber() == lineNumber) ) {
+ fireEvent(IPHPDebugEvent.BREAKPOINT_HIT,breakpoint);
+ break;
+ }
+ }
+ }
+ } catch (CoreException e) {
+ }
+ }
+ }
+ }
+ }
+
+// DebugEvent event = new DebugEvent(this, DebugEvent.MODEL_SPECIFIC, IPHPDebugEvent.STEP_END);
+// DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
+ }
+
+ private boolean supportsBreakpoint(IBreakpoint breakpoint) {
+ if (breakpoint.getModelIdentifier().equals(IXDebugConstants.ID_PHP_DEBUG_MODEL)) {
+ return true;
+ }
+ return false;
+ }
+
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ protected IStatus run(IProgressMonitor monitor) {
+ String InputXML = "";
+ while (!fConnection.isClosed() && (InputXML != null)) {
+ InputXML = fConnection.readData();
+ if (InputXML != null) {
+ XDebugCorePlugin.log(IStatus.INFO, InputXML);
+ lastResponse.setParentNode(InputXML);
+// if (lastResponse.getName() == "init") {
+// Node myNode=lastResponse.getParentNode();
+// appID = PHPDebugUtils.getAttributeValue(myNode, "appid");
+// fileuri = PHPDebugUtils.getAttributeValue(myNode, "fileuri");
+// fDebugTarget.started();
+// fDebugTarget.fireCreationEvent();
+ if (lastResponse.getName() == "response") {
+ fConnection.addResponse(lastResponse,lastResponse.getTransactionID());
+ checkResponse(lastResponse);
+ }
+// fConnection.addResponse(lastResponse,lastResponse.getTransactionID());
+// lastResponse.notifyWait();
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+}
--- /dev/null
+/**
+ *
+ */
+package net.sourceforge.phpeclipse.xdebug.core.xdebug;
+
+import java.io.DataInputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+//import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.Socket;
+import java.net.URL;
+
+import net.sourceforge.phpeclipse.xdebug.core.AbstractDebugConnection;
+import net.sourceforge.phpeclipse.xdebug.core.Base64;
+import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;
+import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.DebugResponse;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugAbstractValue;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugLineBreakpoint;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugStackFrame;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugThread;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugVariable;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+//import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.ILineBreakpoint;
+import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.debug.core.model.IVariable;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Christian Perkonig
+ *
+ */
+public class XDebugConnection extends AbstractDebugConnection {
+ int fTransactionID = 0;
+ private Socket fDebugSocket;
+ private OutputStreamWriter fDebugWriter;
+ private DataInputStream fDebugReader;
+ private ResponseList fResponseList;
+ private ResponseListener fResponseListener;
+
+
+ public XDebugConnection(Socket debugSocket, DataInputStream reader, OutputStreamWriter writer) {
+ fResponseList = new ResponseList();
+ fDebugWriter = writer;
+ fDebugReader = reader;
+ fDebugSocket = debugSocket;
+ fTransactionID = 0;
+ init();
+ }
+
+ private void init() {
+ fInitialized = false;
+ String initString=readData();
+ XDebugCorePlugin.log(IStatus.INFO,initString);
+
+ int startIdx=initString.indexOf("idekey=\"");
+ if (startIdx==-1)
+ return;
+ startIdx+=8;
+ int endIdx=initString.indexOf('"',startIdx);
+ if (endIdx==-1)
+ return;
+ fSessionID=initString.substring(startIdx,endIdx);
+
+ fInitialized=true;
+ fIsClosed=false;
+ fResponseListener=new ResponseListener(this);
+ }
+
+ protected String readData() {
+ byte byteBuffer[]=null,b;
+ int count=0;
+
+ try {
+ while ((b =fDebugReader.readByte()) != 0) {
+ count = count * 10 + b - '0';
+// count=count*10+Integer.parseInt(b);
+ }
+// System.out.println(count);
+ byteBuffer = new byte[count];
+ int readCount=0;
+ int attempts=0;
+ while ((count >0) && (attempts < 50)) {
+// while ((count >0) && (attempts <5)) {
+ int rc=fDebugReader.read(byteBuffer,readCount,count);
+ count-=rc;
+ readCount+=rc;
+ if (count>65530)
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException e) {
+ }
+ else
+ attempts++;
+ }
+ if((b= fDebugReader.readByte())!=0) // reads the NULL Byte at the end;
+ System.out.println("NULL-Byte missing!!");
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ if (e instanceof EOFException==false)
+ e.printStackTrace();
+ return null;
+ }
+ return new String(byteBuffer);
+ }
+
+
+ /**
+ * Sends a request to the Debugengine and waits for an OK.
+ *
+ * @param command debug command
+ * @throws DebugException if the request fails
+ */
+
+
+ public int sendRequest(String command) throws DebugException {
+ return sendRequest(command,"");
+ }
+
+ public DebugResponse sendRequestA(String command, String parameter) {
+ int result = -1;
+
+ try {
+ result = sendRequest(command, parameter);
+ } catch( DebugException e ){
+ e.printStackTrace();
+ }
+
+ DebugResponse response = getResponse(result);
+
+ return response;
+ }
+
+ /**
+ * Sends a request to the Debugengine.
+ *
+ * @param command debug command
+ * @arguments arguments for the command
+ * @throws DebugException if the request fails
+ */
+
+ public synchronized int sendRequest(String command, String arguments) throws DebugException {
+
+ XDebugCorePlugin.log(IStatus.INFO,command+" -i "+fTransactionID+" "+arguments);
+ synchronized (fDebugSocket) {
+ try {
+ fDebugWriter.write(command);
+ fDebugWriter.write(" -i " + fTransactionID);
+ if (!"".equals(arguments))
+ fDebugWriter.write(" " + arguments);
+ fDebugWriter.write(0);
+ fDebugWriter.flush();
+ } catch (IOException e) {
+ //e.printStackTrace();
+ }
+ }
+ return fTransactionID++;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#featureGet(java.lang.String)
+ */
+ public DebugResponse featureGet(String featureName) {
+ int id=-1;
+
+ try {
+ id= sendRequest("feature_get","-n "+featureName);
+ } catch (DebugException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ DebugResponse response = getResponse(id);
+
+ return response;
+ }
+
+ public boolean featureSet(String featureName, String value) {
+ int id=-1;
+
+ try {
+ id= sendRequest("feature_set","-n "+featureName + " -v " + value);
+ } catch (DebugException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ if (getResponse(id).getAttributeValue("success").equals("1") )
+ return true;
+ else
+ return false;
+ }
+
+ protected DebugResponse getResponse(int id) {
+ return fResponseList.get(id);
+ }
+
+ protected void addResponse(DebugResponse response, int id) {
+ fResponseList.add(response,id);
+
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#addBreakpoint(org.eclipse.debug.core.model.IBreakpoint)
+ */
+ public void addBreakpoint(IBreakpoint breakpoint, IPath filePath) throws DebugException {
+ try {
+ if (breakpoint.isEnabled()) {
+ IMarker marker = breakpoint.getMarker();
+ if (marker != null) {
+ try {
+ String arg;
+
+ arg = "-t line -f file://"+PHPDebugUtils.escapeString(filePath.toString())+" -n "+((ILineBreakpoint)breakpoint).getLineNumber();
+ int id = sendRequest("breakpoint_set", arg);
+ String bpid = getResponse(id).getAttributeValue("id");
+
+ if (!"".equals(bpid))
+ marker.setAttribute(XDebugLineBreakpoint.BREAKPOINT_ID,Integer.parseInt(bpid));
+
+ } catch (CoreException e) {
+ XDebugCorePlugin.log(IStatus.INFO,"Exception set break point");
+ }
+ }
+ }
+ } catch (CoreException e) {
+ XDebugCorePlugin.log(IStatus.INFO,"Exception in breakpoint");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#removeBreakpoint(int)
+ */
+ public void removeBreakpoint(IBreakpoint breakpoint) throws DebugException {
+ try {
+ int id =((XDebugLineBreakpoint)breakpoint).getID();
+ if (id >0)
+ sendRequest("breakpoint_remove","-d "+id);
+ } catch (CoreException e) {
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#getStackFrames(net.sourceforge.phpeclipse.xdebug.php.model.XDebugThread)
+ */
+ public IStackFrame[] getStackFrames(XDebugThread thread) throws DebugException {
+ int id = sendRequest("stack_get");
+ DebugResponse lastResponse = getResponse(id);
+ if (lastResponse.isError())
+ return new IStackFrame[0];
+ Node response = lastResponse.getParentNode();
+ NodeList frames = response.getChildNodes();
+ IStackFrame[] theFrames = new IStackFrame[frames.getLength()];
+ for (int i = 0; i < frames.getLength(); i++) {
+ Node stackNode = frames.item(i);
+ XDebugStackFrame frame = new XDebugStackFrame(thread, i);
+ String level =PHPDebugUtils.getAttributeValue(stackNode,"level");
+ if (!"".equals(level))
+ frame.setLevel(Integer.parseInt(level));
+
+ frame.setType(PHPDebugUtils.getAttributeValue(stackNode,"type"));
+ String fileName=PHPDebugUtils.unescapeString(PHPDebugUtils.getAttributeValue(stackNode,"filename"));
+ String lineNo=PHPDebugUtils.getAttributeValue(stackNode,"lineno");
+
+ if (!"".equals(lineNo))
+ frame.setLineNumber(Integer.parseInt(lineNo));
+
+ frame.setWhere(PHPDebugUtils.getAttributeValue(stackNode,"where"));
+
+ try {
+ frame.setFullName(new URL(fileName));
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+
+ frame.incrementStepCounter();
+
+ theFrames[i] = frame;
+ }
+
+ return theFrames;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#stepOver()
+ */
+ public void stepOver() throws DebugException {
+ sendRequest ("step_over");
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#stepInto()
+ */
+ public void stepInto() throws DebugException {
+ sendRequest("step_into");
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#stepOut()
+ */
+ public void stepOut() throws DebugException {
+ sendRequest ("step_out");
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#run()
+ */
+ public void run() throws DebugException {
+ sendRequest ("run");
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#stop()
+ */
+ public void stop() throws DebugException {
+ sendRequest ("stop");
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#setResponseListerner(org.eclipse.core.runtime.jobs.Job)
+ */
+ public void setResponseListerner(Job listener) {
+// fResponseListener=(ResponseListener)listener;;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sourceforge.phpeclipse.xdebug.core.IDebugConnection#startListener()
+ */
+ public void startListener() {
+ fResponseListener.schedule();
+ }
+
+ public boolean setVarValue(String name, String value) {
+ int id=-1;
+ String str=Base64.encodeBytes(value.getBytes());
+ int len=str.length();
+
+ try {
+ id =sendRequest("property_set","-n "+name+" -l "+len + " -- "+str);
+ } catch (DebugException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ DebugResponse dr=getResponse(id);
+ if ((dr.getAttributeValue("success")).equals("1"))
+ return true;
+
+ return false;
+
+ }
+
+ public void close() {
+ fResponseListener.cancel();
+ try {
+ fDebugReader.close();
+ fDebugWriter.close();
+ fDebugSocket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ fIsClosed=true;
+ }
+
+
+ public XDebugVariable getVariableFromNodeA(XDebugStackFrame frame, Node property) {
+ String address = PHPDebugUtils.getAttributeValue(property, "address");
+ String varName;
+ String Name = PHPDebugUtils.getAttributeValue(property,"name");
+ if ("".equals(Name)) {
+ varName = address;
+ } else {
+ varName = Name;
+ }
+
+ String varEncoding=PHPDebugUtils.getAttributeValue(property,"encoding");
+ int varNumChildren = 0;
+ if (PHPDebugUtils.getAttributeValue(property,"numchildren").equals(""))
+ varNumChildren = 0;
+ else
+ varNumChildren=Integer.parseInt(PHPDebugUtils.getAttributeValue(property,"numchildren"));
+
+ String typeName=PHPDebugUtils.getAttributeValue(property,"type");
+
+ XDebugVariable variable = new XDebugVariable(typeName, varName);
+ variable.setEncoding(varEncoding);
+ variable.setNumChildren(varNumChildren);
+ XDebugAbstractValue val=null;
+ try {
+ val = (XDebugAbstractValue) variable.getValue();
+ } catch (DebugException e1) {
+ e1.printStackTrace();
+ }
+ if (val.getType()!= XDebugAbstractValue.VALUETYPE_UNINITIALIZED) {
+ if (variable.hasChildren()) {
+ NodeList varNodes = property.getChildNodes();
+ val.renderValueString(""+varNodes.getLength());
+ IVariable[] variables = new IVariable[varNodes.getLength()];
+ for (int i = 0; i<varNodes.getLength(); i++) {
+ Node propertyNode = varNodes.item(i);
+ variables[i] = getVariableFromNodeA(frame, propertyNode);
+ }
+ val.setChildVariables(variables);
+ }else {
+ String str="";
+ try {
+ str=property.getFirstChild().getNodeValue();
+ } catch (NullPointerException e) {
+ str="";
+ }
+ if (variable.getEncoding().equals("base64")) {
+ if (str.length()!=0)
+ str=new String(Base64.decode(str));
+ else
+ str="";
+ }
+ val.renderValueString(str);
+ }
+
+ String className=PHPDebugUtils.getAttributeValue(property,"classname");
+ if(!"".equals(className))
+ val.renderValueString(className);
+ }
+ return variable;
+
+ }
+
+ private XDebugVariable getVariableFromNode(XDebugStackFrame frame, Node property) {
+ String varFullName = PHPDebugUtils.getAttributeValue(property, "fullname");
+ String varName = PHPDebugUtils.getAttributeValue(property, "name");
+ String varEncoding = PHPDebugUtils.getAttributeValue(property, "encoding");
+
+ int varNumChildren = 0;
+ if (PHPDebugUtils.getAttributeValue(property, "numchildren").equals("")) {
+ varNumChildren = 0;
+ } else {
+ varNumChildren = Integer.parseInt(PHPDebugUtils.getAttributeValue(property, "numchildren"));
+ }
+
+ String typeName = PHPDebugUtils.getAttributeValue(property,"type");
+
+ XDebugVariable variable = new XDebugVariable(frame,varFullName,varName,typeName);
+ variable.setEncoding(varEncoding);
+ variable.setNumChildren(varNumChildren);
+ XDebugAbstractValue val=null;
+ try {
+ val = (XDebugAbstractValue) variable.getValue();
+ } catch (DebugException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ if (val.getType()!= XDebugAbstractValue.VALUETYPE_UNINITIALIZED) {
+ if (variable.hasChildren()) {
+ NodeList varNodes = property.getChildNodes();
+ val.renderValueString(""+varNodes.getLength());
+ IVariable[] variables = new IVariable[varNodes.getLength()];
+ for (int i = 0; i<varNodes.getLength(); i++) {
+ Node propertyNode = varNodes.item(i);
+ variables[i] = getVariableFromNode(frame, propertyNode);
+ }
+ val.setChildVariables(variables);
+ }else {
+ String str="";
+ try {
+ str=property.getFirstChild().getNodeValue();
+ } catch (NullPointerException e) {
+ str="";
+ }
+ if (variable.getEncoding().equals("base64")) {
+ if (str.length()!=0)
+ str=new String(Base64.decode(str));
+ else
+ str="";
+ }
+ val.renderValueString(str);
+ }
+
+ String className=PHPDebugUtils.getAttributeValue(property,"classname");
+ if(!"".equals(className))
+ val.renderValueString(className);
+ }
+ return variable;
+
+ }
+
+ public IVariable[] getVariables(XDebugStackFrame frame,int level) {
+ IVariable[] variables = null;
+
+ int idLocal = -1;
+ try {
+ idLocal = sendRequest("context_get", "-d " + level);
+ } catch (DebugException e) {
+ e.printStackTrace();
+ }
+ DebugResponse response = getResponse(idLocal);
+ Node responseNode = response.getParentNode();
+ NodeList property = responseNode.getChildNodes();
+
+ int idSuperGlobal = -1;
+ try {
+ idSuperGlobal = sendRequest("context_get", "-d " + level + " -c 1");
+ } catch (DebugException e) {
+ e.printStackTrace();
+ }
+ DebugResponse responseGlobal = getResponse(idSuperGlobal);
+ Node responseGlobalNode = responseGlobal.getParentNode();
+ NodeList propertyGlobal = responseGlobalNode.getChildNodes();
+
+ variables = new IVariable[property.getLength() + propertyGlobal.getLength()];
+// variables = new IVariable[property.getLength()]; // + propertyGlobal.getLength()];
+
+ int length = property.getLength();
+ for (int i = 0; i < length; i++) {
+ Node propertyNode = property.item(i);
+ XDebugVariable var=getVariableFromNode(frame,propertyNode);
+ variables[i]=var;
+ }
+
+ int globalLength = propertyGlobal.getLength();
+ for (int k = 0; k < globalLength; k++) {
+ Node propertyGlobalNode = propertyGlobal.item(k);
+ XDebugVariable var=getVariableFromNode(frame,propertyGlobalNode);
+ variables[k + length]=var;
+ }
+
+ return variables;
+ }
+}
\ No newline at end of file
* Constants for the PDA debugger.
*/
public interface IXDebugConstants {
-
+
/**
- * Unique identifier for the PHP debug model (value
+ * Unique identifier for the PHP debug model (value
* <code>et.sourceforge.phpeclipse.debug.</code>).
*/
public static final String ID_PHP_DEBUG_MODEL = "net.sourceforge.phpeclipse.xdebug.php";
-
+
/**
- * Launch configuration key. Value is a PHPProject name program. The path is
- * a string representing a full path to a perl program in the workspace.
+ * Launch configuration key. Value is a PHPProject name
+ * program. The path is a string representing a full path
+ * to a perl program in the workspace.
*/
- public static final String ATTR_PHP_PROJECT = ID_PHP_DEBUG_MODEL
- + ".ATTR_PDA_PROFECT";
-
+ public static final String ATTR_PHP_PROJECT = ID_PHP_DEBUG_MODEL + ".ATTR_PDA_PROFECT";
/**
- * Launch configuration key. Value is a php program. The path is a string
- * representing a relative path to a php program in the project.
+ * Launch configuration key. Value is a php program.
+ * The path is a string representing a relative path
+ * to a php program in the project.
*/
- public static final String ATTR_PHP_FILE = ID_PHP_DEBUG_MODEL
- + ".ATTR_PDA_FILE";
+ public static final String ATTR_PHP_FILE = ID_PHP_DEBUG_MODEL + ".ATTR_PDA_FILE";
+
+ public static final String ATTR_PHP_DEFAULT_INTERPRETER = ID_PHP_DEBUG_MODEL + ".ATTR_PHP_DEFAULT_INTERPRETER";
- public static final String ATTR_PHP_DEFAULT_INTERPRETER = ID_PHP_DEBUG_MODEL
- + ".ATTR_PHP_DEFAULT_INTERPRETER";
+ public static final String ATTR_PHP_INTERPRETER = ID_PHP_DEBUG_MODEL + ".ATTR_PHP_INTERPRETER";
- public static final String ATTR_PHP_INTERPRETER = ID_PHP_DEBUG_MODEL
- + ".ATTR_PHP_INTERPRETER";
+ public static final String ATTR_PHP_DEFAULT_DEBUGPORT = ID_PHP_DEBUG_MODEL + ".ATTR_PHP_DEFAULT_DEBUGPORT";
- public static final String ATTR_PHP_DEFAULT_DEBUGPORT = ID_PHP_DEBUG_MODEL
- + ".ATTR_PHP_DEFAULT_DEBUGPORT";
+ public static final String ATTR_PHP_DEBUGPORT = ID_PHP_DEBUG_MODEL + ".ATTR_PHP_DEBUGPORT";
+
+ public static final String ATTR_PHP_IDE_ID = ID_PHP_DEBUG_MODEL + ".ATTR_PHP_IDE_ID";
+
+ public static final String ATTR_PHP_REMOTE_LOCATION = ID_PHP_DEBUG_MODEL + ".ATTR_PHP_REMOTE_LOCATION";
+
+ public static final String ATTR_PHP_PATHMAP = ID_PHP_DEBUG_MODEL + ".ATTR_PHP_PATHMAP";
- public static final String ATTR_PHP_DEBUGPORT = ID_PHP_DEBUG_MODEL
- + ".ATTR_PHP_DEBUGPORT";
}
+
import java.util.List;
import java.util.Map;
+import net.sourceforge.phpeclipse.externaltools.ExternalToolsPlugin;
import net.sourceforge.phpeclipse.xdebug.core.IXDebugPreferenceConstants;
import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
-public class PHPLaunchConfigurationDelegate extends LaunchConfigurationDelegate {
+public class PHPLaunchConfigurationDelegate extends LaunchConfigurationDelegate {
+
/**
- * @see ILaunchConfigurationDelegate#launch(ILaunchConfiguration, String,
- * ILaunch, IProgressMonitor)
+ * @see ILaunchConfigurationDelegate#launch(ILaunchConfiguration, String, ILaunch, IProgressMonitor)
*/
- public void launch(ILaunchConfiguration configuration, String mode,
- ILaunch launch, IProgressMonitor monitor) throws CoreException {
+ public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
List commandList = new ArrayList();
-
- String phpInterpreter = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_INTERPRETER, (String) null);
- boolean useDefaultInterpreter = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_DEFAULT_INTERPRETER, true);
-
- if (useDefaultInterpreter)
- phpInterpreter = XDebugCorePlugin
- .getDefault()
- .getPreferenceStore()
- .getString(
- IXDebugPreferenceConstants.PHP_INTERPRETER_PREFERENCE);
-
+
+ String phpInterpreter = configuration.getAttribute(IXDebugConstants.ATTR_PHP_INTERPRETER, (String)null);
+ boolean useDefaultInterpreter= configuration.getAttribute(IXDebugConstants.ATTR_PHP_DEFAULT_INTERPRETER, true);
+
+ if (useDefaultInterpreter) {
+ phpInterpreter=XDebugCorePlugin.getDefault().getPreferenceStore().getString(IXDebugPreferenceConstants.PHP_INTERPRETER_PREFERENCE);
+ if (phpInterpreter=="") {
+ phpInterpreter=ExternalToolsPlugin.getDefault().getPreferenceStore().getString(ExternalToolsPlugin.PHP_RUN_PREF);
+ }
+ }
File exe = new File(phpInterpreter);
// Just to get sure that the interpreter exists
if (!exe.exists()) {
- abort(
- MessageFormat
- .format(
- "Specified PHP executable {0} does not exist. Check value of PHP-Interpreter.",
- new String[] { phpInterpreter }), null);
+ abort(MessageFormat.format("Specified PHP executable {0} does not exist. Check value of PHP-Interpreter.", new String[]{phpInterpreter}), null);
}
commandList.add(phpInterpreter);
-
+
// Project name
- String projectName = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_PROJECT, (String) null);
- IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
- projectName);
- // Just to get sure that the project exists
+ String projectName = configuration.getAttribute(IXDebugConstants.ATTR_PHP_PROJECT, (String)null);
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+// Just to get sure that the project exists
if (project == null) {
abort("Project does not exist.", null);
}
- String fileName = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_FILE, (String) null);
+ String fileName = configuration.getAttribute(IXDebugConstants.ATTR_PHP_FILE, (String)null);
IFile file = project.getFile(fileName);
// Just to get sure that the script exists
if (!file.exists()) {
- abort(MessageFormat.format("PHP-Script {0} does not exist.",
- new String[] { file.getFullPath().toString() }), null);
+ abort(MessageFormat.format("PHP-Script {0} does not exist.", new String[] {file.getFullPath().toString()}), null);
}
-
+
commandList.add(file.getLocation().toOSString());
- // Get de Debugport form the Launchconfiguration or from the preferences
- int debugPort = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_DEBUGPORT, -1);
- boolean useDefaultPort = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_DEFAULT_DEBUGPORT, true);
- if (useDefaultPort)
- debugPort = XDebugCorePlugin.getDefault().getPreferenceStore()
- .getInt(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE);
- if (debugPort < 1024)
- debugPort = IXDebugPreferenceConstants.DEFAULT_DEBUGPORT;
+ // Get the Debugport from the preferences
+ int debugPort=XDebugCorePlugin.getDefault().getPreferenceStore().getInt(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE);
+
+ // check for default port
+ if (debugPort==0)
+ debugPort=IXDebugPreferenceConstants.DEFAULT_DEBUGPORT;
- String[] envp = DebugPlugin.getDefault().getLaunchManager()
- .getEnvironment(configuration);
+ String[] envp=DebugPlugin.getDefault().getLaunchManager().getEnvironment(configuration);
// appends the environment to the native environment
- if (envp == null) {
- Map stringVars = DebugPlugin.getDefault().getLaunchManager()
- .getNativeEnvironment();
- int idx = 0;
- envp = new String[stringVars.size()];
+ if (envp==null) {
+ Map stringVars = DebugPlugin.getDefault().getLaunchManager().getNativeEnvironment();
+ int idx=0;
+ envp= new String[stringVars.size()];
for (Iterator i = stringVars.keySet().iterator(); i.hasNext();) {
String key = (String) i.next();
String value = (String) stringVars.get(key);
- envp[idx++] = key + "=" + value;
+ envp[idx++]=key+"="+value;
}
}
+ String idekey=fileName+"-"+(int)(Math.random()*100000);
if (mode.equals(ILaunchManager.DEBUG_MODE)) {
- String[] env = new String[envp.length + 1];
- for (int i = 0; i < envp.length; i++)
- env[i + 1] = envp[i];
- env[0] = "XDEBUG_CONFIG=idekey=xdebug_test remote_enable=1";
- envp = env;
+ String[] env = new String[envp.length+1];
+ for(int i=0;i<envp.length;i++)
+ env[i+1]=envp[i];
+ env[0]="XDEBUG_CONFIG=idekey="+idekey+" remote_enable=1 remote_port="+debugPort;
+ envp=env;
}
+ System.out.println("ideKey= "+idekey);
+
+ String[] commandLine = (String[]) commandList.toArray(new String[commandList.size()]);
- String[] commandLine = (String[]) commandList
- .toArray(new String[commandList.size()]);
- Process process = DebugPlugin.exec(commandLine, null, envp);
+ XDebugTarget target=null;
+ if (mode.equals(ILaunchManager.DEBUG_MODE)) {
+ target = new XDebugTarget(launch, null, idekey);
+ }
+ Process process = DebugPlugin.exec(commandLine, null,envp);
IProcess p = DebugPlugin.newProcess(launch, process, phpInterpreter);
+
if (mode.equals(ILaunchManager.DEBUG_MODE)) {
- IDebugTarget target = new XDebugTarget(launch, p, debugPort);
+ target.addProcess(p);
launch.addDebugTarget(target);
}
- }
+ }
+
/**
- * Throws an exception with a new status containing the given message and
- * optional exception.
+ * Throws an exception with a new status containing the given
+ * message and optional exception.
*
- * @param message
- * error message
- * @param e
- * underlying exception
+ * @param message error message
+ * @param e underlying exception
* @throws CoreException
*/
private void abort(String message, Throwable e) throws CoreException {
- // TODO: the plug-in code should be the example plug-in, not Perl debug
- // model id
- throw new CoreException(new Status(IStatus.ERROR,
- IXDebugConstants.ID_PHP_DEBUG_MODEL, 0, message, e));
+ // TODO: the plug-in code should be the example plug-in, not Perl debug model id
+ throw new CoreException(new Status(IStatus.ERROR, IXDebugConstants.ID_PHP_DEBUG_MODEL, 0, message, e));
}
}
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.php.launching;
+
+import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+import net.sourceforge.phpeclipse.xdebug.core.XDebugProxy;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
+import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
+
+public class PHPRemoteLaunchConfigurationDelegate extends LaunchConfigurationDelegate implements ILaunchConfigurationDelegate {
+ public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
+ String projectName = configuration.getAttribute(IXDebugConstants.ATTR_PHP_PROJECT, (String)null);
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+// Just to get sure that the project exists
+ if (project == null) {
+ abort("Project does not exist.", null);
+ }
+
+ XDebugProxy proxy = XDebugCorePlugin.getDefault().getXDebugProxy();
+ proxy.start();
+ String ideID = configuration.getAttribute(IXDebugConstants.ATTR_PHP_IDE_ID, "testID");
+
+ if (mode.equals(ILaunchManager.DEBUG_MODE)) {
+ IDebugTarget target = new XDebugTarget(launch, null, ideID);
+ launch.addDebugTarget(target);
+ }
+ }
+
+ /**
+ * Throws an exception with a new status containing the given
+ * message and optional exception.
+ *
+ * @param message error message
+ * @param e underlying exception
+ * @throws CoreException
+ */
+ private void abort(String message, Throwable e) throws CoreException {
+ throw new CoreException(new Status(IStatus.ERROR, IXDebugConstants.ID_PHP_DEBUG_MODEL, 0, message, e));
+ }
+}
\ No newline at end of file
package net.sourceforge.phpeclipse.xdebug.php.launching;
+
+import java.util.List;
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
public class PHPSourceLookupDirector extends AbstractSourceLookupDirector {
public void initializeParticipants() {
- addParticipants(new ISourceLookupParticipant[] { new PHPSourceLookupParticipant() });
+ setFindDuplicates(true);
+ addParticipants(new ISourceLookupParticipant[] {new PHPSourceLookupParticipant()});
}
-
-}
+
+ public Object getSourceElement(Object element) {
+ List sources = doSourceLookup(element);
+ if(sources.size() == 1) {
+ return sources.get(0);
+ } else if(sources.size() > 1) {
+ return resolveSourceElement(element, sources);
+ } else {
+ return null;
+ }
+ }
+}
\ No newline at end of file
package net.sourceforge.phpeclipse.xdebug.php.launching;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.xdebug.core.PathMapItem;
import net.sourceforge.phpeclipse.xdebug.php.model.XDebugStackFrame;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
public class PHPSourceLookupParticipant extends AbstractSourceLookupParticipant {
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#getSourceName(Object)
+ */
public String getSourceName(Object object) throws CoreException {
if (object instanceof XDebugStackFrame) {
return ((XDebugStackFrame) object).getSourceName();
return null;
}
-}
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#findSourceElements(java.lang.Object)
+ */
+ public Object[] findSourceElements(Object object) throws CoreException {
+ if (object == null) {
+ return new Object[] {};
+ }
+ XDebugStackFrame stackFrame = null;
+ if (object instanceof XDebugStackFrame) {
+ stackFrame = (XDebugStackFrame) object;
+ } else {
+ return new Object[] {};
+ }
+
+ List results = null;
+ CoreException single = null;
+ MultiStatus multiStatus = null;
+
+ if (isFindDuplicates()) {
+ results = new ArrayList();
+ }
+
+ String name = getSourceName(object);
+ if (name == null || name.length() == 0) {
+ return new Object[] {};
+ }
+
+ // here our stackframe is guaranteed not to be null
+ IPath sLocalPath = null;
+
+ if (((XDebugStackFrame) object).getThread() == null) {
+ IPath sPath = new Path(stackFrame.getFullName().getPath());
+ List pathMap = getDirector().getLaunchConfiguration()
+ .getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null);
+
+ PathMapItem pmi = null;
+ for (int k = 0; k < pathMap.size(); k++) {
+ pmi = new PathMapItem((String) pathMap.get(k));
+
+ IPath local = new Path(pmi.getLocalPath().toString())/* .removeFirstSegments(1) */;
+ IPath remote = new Path(pmi.getRemotePath().toString())/* .removeFirstSegments(1) */;
+
+ if (remote.matchingFirstSegments(sPath) == remote.segmentCount()) {
+ sLocalPath = local;
+ }
+ }
+ } else {
+
+ }
+
+ String Type = stackFrame.getType();
+
+ if (Type.equals("eval")) {
+ results.add("pippo");
+ return results.toArray();
+ }
+
+ ISourceContainer[] containers = getSourceContainers();
+ for (int i = 0; i < containers.length; i++) {
+ ISourceContainer container = getDelegateContainer(containers[i]);
+ if (container == null) {
+ continue;
+ }
+
+ try {
+ Object[] objects = container.findSourceElements(name);
+ if (objects.length > 0) {
+ if (isFindDuplicates()) {
+ if (((XDebugStackFrame) object).getThread() == null) {
+ addMatching(results, sLocalPath, objects);
+ } else {
+ return objects;
+ }
+ } else {
+ if (objects.length == 1) {
+ return objects;
+ }
+ return new Object[] { objects[0] };
+ }
+ }
+ } catch (CoreException e) {
+ if (single == null) {
+ single = e;
+ } else if (multiStatus == null) {
+ multiStatus = new MultiStatus(DebugPlugin
+ .getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR,
+ new IStatus[] { single.getStatus() },
+ SourceLookupMessages.CompositeSourceContainer_0,
+ null);
+ multiStatus.add(e.getStatus());
+ } else {
+ multiStatus.add(e.getStatus());
+ }
+ }
+ }
+ if (results == null) {
+ if (multiStatus != null) {
+ throw new CoreException(multiStatus);
+ } else if (single != null) {
+ throw single;
+ }
+ return EMPTY;
+ }
+ return results.toArray();
+ }
+
+ static void addMatching(List results, IPath localPath, Object[] objects) {
+ if (results == null || localPath == null || objects == null) {
+ return;
+ }
+ for (int j = 0; j < objects.length; j++) {
+ if (objects[j] == null || !(objects[j] instanceof IFile)) {
+ continue;
+ }
+ IFile file = (IFile) objects[j];
+
+ IPath path = new Path(file.getLocation().toString());
+ if (localPath.matchingFirstSegments(path) == localPath
+ .segmentCount()) {
+ results.add(objects[j]);
+ }
+ }
+ }
+}
\ No newline at end of file
package net.sourceforge.phpeclipse.xdebug.php.launching;
+
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.WorkspaceSourceContainer;
-public class PHPSourcePathComputerDelegate implements
- ISourcePathComputerDelegate {
+public class PHPSourcePathComputerDelegate implements ISourcePathComputerDelegate {
- public ISourceContainer[] computeSourceContainers(
- ILaunchConfiguration configuration, IProgressMonitor monitor)
- throws CoreException {
- // String path =
- // configuration.getAttribute(IXDebugConstants.ATTR_PHP_PROGRAM,
- // (String)null);
- // ISourceContainer sourceContainer = null;
- // if (path != null) {
- // IResource resource =
- // ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
- // if (resource != null) {
- // IContainer container = resource.getParent();
- // if (container.getType() == IResource.PROJECT) {
- // sourceContainer = new ProjectSourceContainer((IProject)container,
- // false);
- // } else if (container.getType() == IResource.FOLDER) {
- // sourceContainer = new FolderSourceContainer(container, false);
- // }
- // }
- // }
- // if (sourceContainer == null) {
- // sourceContainer = new WorkspaceSourceContainer();
- // }
- // return new ISourceContainer[]{sourceContainer};
- String project = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_PROJECT, (String) null);
+ public ISourceContainer[] computeSourceContainers(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException {
+// String path = configuration.getAttribute(IXDebugConstants.ATTR_PHP_PROGRAM, (String)null);
+// ISourceContainer sourceContainer = null;
+// if (path != null) {
+// IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
+// if (resource != null) {
+// IContainer container = resource.getParent();
+// if (container.getType() == IResource.PROJECT) {
+// sourceContainer = new ProjectSourceContainer((IProject)container, false);
+// } else if (container.getType() == IResource.FOLDER) {
+// sourceContainer = new FolderSourceContainer(container, false);
+// }
+// }
+// }
+// if (sourceContainer == null) {
+// sourceContainer = new WorkspaceSourceContainer();
+// }
+// return new ISourceContainer[]{sourceContainer};
+ String project = configuration.getAttribute(IXDebugConstants.ATTR_PHP_PROJECT, (String)null);
ISourceContainer sourceContainer = null;
if (project != null) {
- IProject resource = ResourcesPlugin.getWorkspace().getRoot()
- .getProject(project);
+ IProject resource = ResourcesPlugin.getWorkspace().getRoot().getProject(project);
if (resource != null) {
sourceContainer = new ProjectSourceContainer(resource, false);
}
if (sourceContainer == null) {
sourceContainer = new WorkspaceSourceContainer();
}
- return new ISourceContainer[] { sourceContainer };
-
+ return new ISourceContainer[]{sourceContainer};
+
}
}
/**
* @author Axel
- *
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
*/
-public abstract class XDebugAbstractValue extends XDebugElement implements
- IValue {
-
+public abstract class XDebugAbstractValue extends XDebugElement implements IValue {
+
public static final int VALUETYPE_UNKNOWN = -1;
-
public static final int VALUETYPE_UNINITIALIZED = 0;
-
public static final int VALUETYPE_STRING = 1;
-
public static final int VALUETYPE_INT = 4;
-
public static final int VALUETYPE_FLOAT = 5;
-
public static final int VALUETYPE_BOOLEAN = 6;
-
public static final int VALUETYPE_ARRAY = 8;
-
public static final int VALUETYPE_HASH = 9;
-
public static final int VALUETYPE_OBJECT = 10;
+ public static final int VALUETYPE_RESOURCE = 11;
+
protected XDebugVariable fVariable;
-
private IVariable[] fVariables;
-
protected String fValueString;
-
protected int fType;
-
protected String fTypeName;
+
+ private boolean fhasChanged;
+
+ public XDebugAbstractValue(XDebugVariable variable, String typeName) {
+ super((XDebugTarget) variable.getDebugTarget());
+ fVariable = variable;
+ setType(typeName);
+ fVariables= new IVariable[0];
+ }
- public XDebugAbstractValue(XDebugVariable variable, Node varNode,
- String typeName) {
+
+ public XDebugAbstractValue(XDebugVariable variable,Node varNode,String typeName) {
super((XDebugTarget) variable.getDebugTarget());
fVariable = variable;
- if (varNode == null) {
+ if (varNode==null){
try {
- System.out.println(variable.getName() + "=null");
+ System.out.println(variable.getName()+"=null");
} catch (DebugException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
- return;
+ return;
}
setType(typeName);
NodeList property = varNode.getChildNodes();
if (variable.hasChildren()) {
- renderValueString("" + property.getLength());
+ renderValueString(""+property.getLength());
fVariables = new IVariable[property.getLength()];
- for (int i = 0; i < property.getLength(); i++) {
+ for (int i = 0; i<property.getLength(); i++) {
Node propertyNode = property.item(i);
- fVariables[i] = new XDebugVariable(variable.getStackFrame(),
- propertyNode);
+ fVariables[i] = new XDebugVariable(variable.getStackFrame(), propertyNode);
}
- } else {
- // fDataString="";
+ }else {
+// fDataString="";
fVariables = new IVariable[0];
- // if (variable.getType()== XDebugVariable.VARTYPE_UNINITIALIZED)
- // fValueString="uninitialized";
- // else {
- String str = "";
+// if (variable.getType()== XDebugVariable.VARTYPE_UNINITIALIZED)
+// fValueString="uninitialized";
+// else {
+ String str="";
try {
- str = varNode.getFirstChild().getNodeValue();
+ str=varNode.getFirstChild().getNodeValue();
} catch (NullPointerException e) {
- str = "";
+ str="";
}
if (variable.getEncoding().equals("base64")) {
- if (str.length() != 0)
- str = new String(Base64.decode(str));
+ if (str.length()!=0)
+ str=new String(Base64.decode(str));
else
- str = "";
+ str="";
}
renderValueString(str);
- // }
+// }
}
- String className = PHPDebugUtils
- .getAttributeValue(varNode, "classname");
- if (className != "")
+ String className=PHPDebugUtils.getAttributeValue(varNode,"classname");
+ if(!"".equals(className))
renderValueString(className);
}
-
- /*
- * (non-Javadoc)
- *
+
+ public boolean hasChanged() {
+ return fhasChanged;
+ }
+
+ public void sethasChanged(boolean hasChanged) {
+ fhasChanged = hasChanged;
+ }
+
+ public void setChildVariables(IVariable[] newChildVariables) {
+ fVariables = newChildVariables;
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
*/
public String getReferenceTypeName() throws DebugException {
return fTypeName;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValue#getValueString()
*/
public String getValueString() throws DebugException {
return fValueString;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValue#isAllocated()
*/
public boolean isAllocated() throws DebugException {
return true;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValue#getVariables()
*/
public IVariable[] getVariables() throws DebugException {
return fVariables;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValue#hasVariables()
*/
public boolean hasVariables() throws DebugException {
return (fVariables.length > 0);
}
-
+
public boolean isArray() {
return ((fType & VALUETYPE_ARRAY) > 0);
}
-
+
public abstract void setType(String typeName);
-
public abstract void renderValueString(String data);
public abstract boolean verifyValue(String expression);
-
+
public boolean setValue(String expression) {
if (!verifyValue(expression))
return false;
- if (fTarget.setVarValue(fVariable.getFullName(), expression)) {
- renderValueString(expression);
- return true;
- }
+ if( fTarget == null ) {
+ renderValueString(expression);
+ } else {
+ if(fTarget.setVarValue(fVariable.getFullName(),expression)) {
+ renderValueString(expression);
+ return true;
+ }
+ }
return false;
}
+
+ public boolean setValueA(String expression) {
+ if(! fValueString.toString().equals(expression)) {
+ fVariables= new IVariable[0];
+ fValueString = expression;
+ fhasChanged = true;
+ } else {
+ fhasChanged = false;
+ }
+
+ return true;
+ }
+
+ public boolean setValueB(IValue value) {
+ try {
+ fTypeName = value.getReferenceTypeName();
+ } catch (DebugException e) {
+ }
+
+ fhasChanged = false;
+
+ switch (((XDebugAbstractValue) value). getType()) {
+ case VALUETYPE_UNINITIALIZED:
+ case VALUETYPE_STRING:
+ case VALUETYPE_INT:
+ case VALUETYPE_FLOAT:
+ case VALUETYPE_BOOLEAN:
+ try {
+ if (! fValueString.equals(value.getValueString())) {
+ fValueString = value.getValueString();
+ fhasChanged = true;
+ }
+ } catch (DebugException e) {
+ int a = 10;
+ a++;
+ }
+ break;
+
+ case VALUETYPE_RESOURCE:
+ try {
+ if (! fValueString.equals(value.getValueString())) {
+ fValueString = value.getValueString();
+ fhasChanged = true;
+ }
+ } catch (DebugException e) {
+ int a = 10;
+ a++;
+ }
+ break;
+
+ case VALUETYPE_HASH:
+ int a = 20;
+ a = a +2;
+ break;
+
+ case VALUETYPE_OBJECT:
+ case VALUETYPE_ARRAY:
+ try {
+ IVariable[] newVariable = value.getVariables();
+
+ if (fVariables.length == 0) {
+ if (newVariable.length > 0) {
+ fValueString = value.getValueString();
+ fVariables = newVariable;
+ fhasChanged = true;
+ }
+ } else {
+ for(int i = 0; i < fVariables.length; i++) {
+ // da capire quando e perche'
+ try {
+ if (! ((XDebugVariable)fVariables[i]).equals(((XDebugVariable)newVariable[i]))) {
+ //fVariables[i].setValue(newVariable[i].getValue());
+ fhasChanged = true;
+ }
+ } catch (Exception e) {
+ int b = 1;
+ }
+ }
+ if (fhasChanged) {
+ fValueString = value.getValueString();
+ for(int i = 0; i < fVariables.length; i++) {
+ try {
+ fVariables[i].setValue(newVariable[i].getValue());
+ } catch (Exception e) {
+ int b = 1;
+ }
+ }
+ }
+ }
+ } catch (DebugException e) {
+ int b = 10;
+ b++;
+ }
+
+ break;
+ }
+
+ return true;
+ }
+
+ public boolean setValueBOld(IValue value) {
+ fhasChanged = false;
+
+ switch (((XDebugAbstractValue) value). getType()) {
+ case VALUETYPE_UNINITIALIZED:
+ case VALUETYPE_STRING:
+ case VALUETYPE_INT:
+ case VALUETYPE_FLOAT:
+ case VALUETYPE_BOOLEAN:
+ try {
+ if (! fValueString.equals(value.getValueString())) {
+ fValueString = value.getValueString();
+ fhasChanged = true;
+ }
+ } catch (DebugException e) {
+ }
+ break;
+
+ case VALUETYPE_HASH:
+ int a = 20;
+ a = a +2;
+ break;
+
+ case VALUETYPE_OBJECT:
+ case VALUETYPE_ARRAY:
+ try {
+ IVariable[] newVariable = value.getVariables();
+
+ if (fVariables.length == 0) {
+ if (newVariable.length > 0) {
+ fValueString = value.getValueString();
+ fVariables = newVariable;
+ fhasChanged = true;
+ }
+ } else {
+ for(int i = 0; i < fVariables.length; i++) {
+ if (! ((XDebugVariable)fVariables[i]).equals(((XDebugVariable)newVariable[i]))) {
+ //fVariables[i].setValue(newVariable[i].getValue());
+ fhasChanged = true;
+ }
+ }
+ if (fhasChanged) {
+ fValueString = value.getValueString();
+ for(int i = 0; i < fVariables.length; i++) {
+ fVariables[i].setValue(newVariable[i].getValue());
+ }
+ }
+ }
+ } catch (DebugException e) {
+ }
+
+ break;
+ }
+
+ return true;
+ }
+
+ public int getType() {
+ return fType;
+ }
public boolean supportsValueModification() {
return false;
}
-}
+}
\ No newline at end of file
String typeName) {
super(variable, varNode, typeName);
}
+
+ public XDebugArrayValue(XDebugVariable variable, String typeName) {
+ super(variable, typeName);
+ }
+
public void setType(String typeName) {
- fType = XDebugAbstractValue.VALUETYPE_ARRAY;
- fTypeName = typeName;
+ fType=XDebugAbstractValue.VALUETYPE_ARRAY;
+ fTypeName=typeName;
}
public void renderValueString(String data) {
- fValueString = data + " element(s)";
+ fValueString= data +" element(s)";
}
public boolean verifyValue(String expression) {
String typeName) {
super(variable, varNode, typeName);
}
+
+ public XDebugBooleanValue(XDebugVariable variable,String typeName) {
+ super(variable, typeName);
+ }
+
public boolean supportsValueModification() {
return true;
}
public void setType(String typeName) {
- fType = XDebugAbstractValue.VALUETYPE_BOOLEAN;
- fTypeName = typeName;
- }
+ fType=XDebugAbstractValue.VALUETYPE_BOOLEAN;
+ fTypeName=typeName; }
public void renderValueString(String data) {
- int value = -1;
+ int value=-1;
try {
- value = Integer.parseInt(data);
+ value=Integer.parseInt(data);
} catch (NumberFormatException e) {
- data = data.toLowerCase();
+ data=data.toLowerCase();
if (data.equals("true") || data.equals("false"))
- fValueString = data;
+ fValueString=data;
else
- fValueString = "not defined";
+ fValueString="not defined";
}
- if (value == 0)
- fValueString = "false";
- else if (value == 1)
- fValueString = "true";
+ if (value==0)
+ fValueString="false";
+ else if (value==1)
+ fValueString="true";
else
- fValueString = "not defined";
+ fValueString="not defined";
}
public boolean verifyValue(String expression) {
- int value = -1;
+ int value=-1;
try {
- value = Integer.parseInt(expression);
+ value=Integer.parseInt(expression);
} catch (NumberFormatException e) {
- expression = expression.toLowerCase();
+ expression=expression.toLowerCase();
if (expression.equals("true") || expression.equals("false"))
return true;
else
return false;
}
- if ((value >= 0) && (value <= 1))
+ if ((value>=0)&& (value <=1))
return true;
return false;
}
*/
package net.sourceforge.phpeclipse.xdebug.php.model;
-import net.sourceforge.phpeclipse.xdebug.core.ResponseData;
+
+
import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
import org.eclipse.core.runtime.PlatformObject;
/**
* @author Christian
- *
+ *
*/
public class XDebugElement extends PlatformObject implements IDebugElement {
-
- // containing target
+
+ // containing target
protected XDebugTarget fTarget;
-
+
/**
- * Constructs a new debug element contained in the given debug target.
+ * Constructs a new debug element contained in the given
+ * debug target.
*
- * @param target
- * debug target (PDA VM)
+ * @param target debug target (PDA VM)
*/
public XDebugElement(XDebugTarget target) {
fTarget = target;
}
-
- /*
- * (non-Javadoc)
- *
+
+ public XDebugElement() {
+ fTarget = null;
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
*/
public String getModelIdentifier() {
return IXDebugConstants.ID_PHP_DEBUG_MODEL;
}
-
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
*/
public IDebugTarget getDebugTarget() {
return fTarget;
}
+
+ public void setDebugTarget(XDebugTarget target) {
+ fTarget=target;
+ }
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
*/
public ILaunch getLaunch() {
return getDebugTarget().getLaunch();
}
-
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
}
return super.getAdapter(adapter);
}
-
+
protected void abort(String message, Throwable e) throws DebugException {
- /*
- * Axel auskommentiert throw new DebugException(new
- * Status(IStatus.ERROR,
- * DebugExamplesPlugin.getDefault().getDescriptor().getUniqueIdentifier(),
- * DebugPlugin.INTERNAL_ERROR, message, e));
- */
- }
-
+/* Axel auskommentiert
+ throw new DebugException(new Status(IStatus.ERROR, DebugExamplesPlugin.getDefault().getDescriptor().getUniqueIdentifier(),
+ DebugPlugin.INTERNAL_ERROR, message, e));
+*/
+ }
+
/**
* Fires a debug event
*
- * @param event
- * the event to be fired
+ * @param event the event to be fired
*/
protected void fireEvent(DebugEvent event) {
- DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { event });
+ DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
}
-
+
/**
* Fires a <code>CREATE</code> event for this element.
*/
public void fireCreationEvent() {
fireEvent(new DebugEvent(this, DebugEvent.CREATE));
- }
-
+ }
+
/**
- * Fires a <code>RESUME</code> event for this element with the given
- * detail.
+ * Fires a <code>RESUME</code> event for this element with
+ * the given detail.
*
- * @param detail
- * event detail code
+ * @param detail event detail code
*/
public void fireResumeEvent(int detail) {
fireEvent(new DebugEvent(this, DebugEvent.RESUME, detail));
}
/**
- * Fires a <code>SUSPEND</code> event for this element with the given
- * detail.
+ * Fires a <code>SUSPEND</code> event for this element with
+ * the given detail.
*
- * @param detail
- * event detail code
+ * @param detail event detail code
*/
public void fireSuspendEvent(int detail) {
fireEvent(new DebugEvent(this, DebugEvent.SUSPEND, detail));
}
-
+
/**
* Fires a <code>TERMINATE</code> event for this element.
*/
protected void fireTerminateEvent() {
fireEvent(new DebugEvent(this, DebugEvent.TERMINATE));
}
+
- public void fireDebugResponseEvent(ResponseData data) {
- DebugEvent de = new DebugEvent(this, DebugEvent.MODEL_SPECIFIC);
- de.setData(data);
- fireEvent(de);
- }
}
\ No newline at end of file
public class XDebugFloatValue extends XDebugAbstractValue {
- public XDebugFloatValue(XDebugVariable variable, Node varNode,
- String TypeName) {
- super(variable, varNode, TypeName);
-
+ public XDebugFloatValue(XDebugVariable variable, Node varNode,String TypeName) {
+ super(variable, varNode,TypeName);
+
+ }
+
+ public XDebugFloatValue(XDebugVariable variable,String TypeName) {
+ super(variable,TypeName);
+
}
+
public boolean supportsValueModification() {
return true;
}
+
public void setType(String typeName) {
- fType = XDebugAbstractValue.VALUETYPE_FLOAT;
- fTypeName = typeName;
+ fType=XDebugAbstractValue.VALUETYPE_FLOAT;
+ fTypeName=typeName;
}
public void renderValueString(String data) {
- fValueString = data;
+ fValueString=data;
}
public boolean verifyValue(String expression) {
public class XDebugIntValue extends XDebugAbstractValue {
- public XDebugIntValue(XDebugVariable variable, Node varNode, String TypeName) {
- super(variable, varNode, TypeName);
-
+ public XDebugIntValue(XDebugVariable variable, Node varNode,String TypeName) {
+ super(variable, varNode,TypeName);
+
}
-
+
+ public XDebugIntValue(XDebugVariable variable,String TypeName) {
+ super(variable,TypeName);
+
+ }
+
public void setType(String typeName) {
- fType = XDebugAbstractValue.VALUETYPE_INT;
- fTypeName = typeName;
+ fType=XDebugAbstractValue.VALUETYPE_INT;
+ fTypeName=typeName;
}
-
+
public boolean supportsValueModification() {
return true;
}
-
+
public void renderValueString(String dataString) {
- fValueString = dataString;
+ fValueString=dataString;
}
+
public boolean verifyValue(String expression) {
try {
Integer.parseInt(expression);
}
return true;
}
-
+
public String toString() {
return fValueString;
}
+
/*
* Created on 25.11.2004
*
*/
package net.sourceforge.phpeclipse.xdebug.php.model;
+
import java.util.HashMap;
import java.util.Map;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.LineBreakpoint;
+
/**
* @author Axel
- *
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
*/
-public class XDebugLineBreakpoint extends LineBreakpoint {
-
+public class XDebugLineBreakpoint extends LineBreakpoint {
+
/**
- * Default constructor is required for the breakpoint manager to re-create
- * persisted breakpoints. After instantiating a breakpoint, the
- * <code>setMarker(...)</code> method is called to restore this
- * breakpoint's attributes.
+ * Default constructor is required for the breakpoint manager
+ * to re-create persisted breakpoints. After instantiating a breakpoint,
+ * the <code>setMarker(...)</code> method is called to restore
+ * this breakpoint's attributes.
*/
private static final String XDEBUG_LINE_BREAKPOINT = "net.sourceforge.phpeclipse.xdebug.core.XDebugLineBreakpoint"; //$NON-NLS-1$
/**
- * Breakpoint attribute storing the fully qualified name of the type this
- * breakpoint is located in. (value
- * <code>"net.sourceforge.phpeclipse.debug.typeName"</code>). This
- * attribute is a <code>String</code>.
+ * Breakpoint attribute storing the fully qualified name of the type
+ * this breakpoint is located in.
+ * (value <code>"net.sourceforge.phpeclipse.debug.typeName"</code>). This attribute is a <code>String</code>.
*/
protected static final String TYPE_NAME = "net.sourceforge.phpeclipse.debug.typeName"; //$NON-NLS-1$
- // public PHPLineBreakpoint() {
- // }
- //
- // public PHPLineBreakpoint(IResource resource, int lineNumber, int
- // charStart, int charEnd, int hitCount, boolean add, Map attributes) throws
- // DebugException {
- // this(resource, lineNumber, charStart, charEnd, hitCount, add, attributes,
- // PHP_LINE_BREAKPOINT);
- // }
- //
- // public PHPLineBreakpoint(IResource resource, int lineNumber, int
- // hitCount, boolean add, Map attributes) throws DebugException {
- // this(resource, lineNumber, -1, -1, hitCount, add, attributes,
- // PHP_LINE_BREAKPOINT);
- // }
-
- public static final String BREAKPOINT_ID = "XDebugLineBreakpointID";
-
+// public PHPLineBreakpoint() {
+// }
+//
+// public PHPLineBreakpoint(IResource resource, int lineNumber, int charStart, int charEnd, int hitCount, boolean add, Map attributes) throws DebugException {
+// this(resource, lineNumber, charStart, charEnd, hitCount, add, attributes, PHP_LINE_BREAKPOINT);
+// }
+//
+// public PHPLineBreakpoint(IResource resource, int lineNumber, int hitCount, boolean add, Map attributes) throws DebugException {
+// this(resource, lineNumber, -1, -1, hitCount, add, attributes, PHP_LINE_BREAKPOINT);
+// }
+
+
+ public static final String BREAKPOINT_ID ="XDebugLineBreakpointID";
+
public XDebugLineBreakpoint() {
}
-
+
/**
- * Constructs a line breakpoint on the given resource at the given line
- * number. The line number is 1-based (i.e. the first line of a file is line
- * number 1).
+ * Constructs a line breakpoint on the given resource at the given
+ * line number. The line number is 1-based (i.e. the first line of a
+ * file is line number 1).
*
- * @param resource
- * file on which to set the breakpoint
- * @param lineNumber
- * 1-based line number of the breakpoint
- * @throws CoreException
- * if unable to create the breakpoint
+ * @param resource file on which to set the breakpoint
+ * @param lineNumber 1-based line number of the breakpoint
+ * @throws CoreException if unable to create the breakpoint
*/
- public XDebugLineBreakpoint(final IResource resource, final int lineNumber)
- throws CoreException {
- // IMarker marker =
- // resource.createMarker("net.sourceforge.phpeclipse.xdebug.core.XDebugLineBreakpoint");
- // setMarker(marker);
- // setEnabled(true);
- // XDebugCorePlugin.log(IStatus.INFO,"Markertype: "+ marker.getType());
- // ensureMarker().setAttribute(IMarker.LINE_NUMBER, lineNumber);
- // ensureMarker().setAttribute(IBreakpoint.ID,
- // IXDebugConstants.ID_PHP_DEBUG_MODEL);
- // ensureMarker().setAttribute(BREAKPOINT_ID,-1);
- IWorkspaceRunnable wr = new IWorkspaceRunnable() {
+ public XDebugLineBreakpoint(final IResource resource, final int lineNumber) throws CoreException {
+// IMarker marker = resource.createMarker("net.sourceforge.phpeclipse.xdebug.core.XDebugLineBreakpoint");
+// setMarker(marker);
+// setEnabled(true);
+// XDebugCorePlugin.log(IStatus.INFO,"Markertype: "+ marker.getType());
+// ensureMarker().setAttribute(IMarker.LINE_NUMBER, lineNumber);
+// ensureMarker().setAttribute(IBreakpoint.ID, IXDebugConstants.ID_PHP_DEBUG_MODEL);
+// ensureMarker().setAttribute(BREAKPOINT_ID,-1);
+ IWorkspaceRunnable wr= new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
-
+
// create the marker
setMarker(resource.createMarker(XDEBUG_LINE_BREAKPOINT));
// add attributes
Map attributes = new HashMap(10);
- addLineBreakpointAttributes(attributes, getModelIdentifier(),
- true, lineNumber, -1, -1);
+ addLineBreakpointAttributes(attributes, getModelIdentifier(), true, lineNumber, -1, -1);
// set attributes
ensureMarker().setAttributes(attributes);
-
+
// add to breakpoint manager if requested
- register(true);
+ register(true);
}
};
run(getMarkerRule(resource), wr);
}
-
+
protected void register(boolean register) throws CoreException {
if (register) {
DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(this);
setRegistered(false);
}
}
-
- public void addLineBreakpointAttributes(Map attributes,
- String modelIdentifier, boolean enabled, int lineNumber,
- int charStart, int charEnd) {
+
+ public void addLineBreakpointAttributes(Map attributes, String modelIdentifier, boolean enabled, int lineNumber, int charStart, int charEnd) {
attributes.put(IBreakpoint.ID, modelIdentifier);
attributes.put(IBreakpoint.ENABLED, new Boolean(enabled));
attributes.put(IMarker.LINE_NUMBER, new Integer(lineNumber));
- if (charStart != -1) {
+ if (charStart!=-1)
+ {
attributes.put(IMarker.CHAR_START, new Integer(charStart));
attributes.put(IMarker.CHAR_END, new Integer(charEnd));
}
attributes.put(TYPE_NAME, "typeName");
- attributes.put(BREAKPOINT_ID, new Integer(-1));
- }
+ attributes.put(BREAKPOINT_ID,new Integer(-1));
+ }
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IBreakpoint#getModelIdentifier()
*/
public String getModelIdentifier() {
return IXDebugConstants.ID_PHP_DEBUG_MODEL;
}
-
- public void setID(int id) throws CoreException {
- ensureMarker().setAttribute(BREAKPOINT_ID, id);
+
+ public void setID(int id) throws CoreException
+ {
+ ensureMarker().setAttribute(BREAKPOINT_ID,id);
}
-
- public int getID() throws CoreException {
- return ensureMarker().getAttribute(BREAKPOINT_ID, -1);
+ public int getID() throws CoreException
+ {
+ return ensureMarker().getAttribute(BREAKPOINT_ID,-1);
}
}
}
public void setType(String typeName) {
- fType = XDebugAbstractValue.VALUETYPE_OBJECT;
- fTypeName = typeName;
+ fType=XDebugAbstractValue.VALUETYPE_OBJECT;
+ fTypeName=typeName;
}
public void renderValueString(String data) {
- fValueString = data;
+ fValueString= data;
}
-
+
public String toString() {
- return "class " + fValueString;
+ return "class "+fValueString;
}
public boolean verifyValue(String expression) {
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.php.model;
+
+import org.w3c.dom.Node;
+
+public class XDebugResourceValue extends XDebugAbstractValue {
+ private String fDataString;
+
+ public XDebugResourceValue(XDebugVariable variable, Node varNode, String typeName) {
+ super(variable, varNode, typeName);
+ fDataString=null;
+ }
+
+ public XDebugResourceValue(XDebugVariable variable, String typeName) {
+ super(variable, typeName);
+ fDataString=null;
+ }
+
+
+ public void setType(String typeName) {
+ fType = XDebugAbstractValue.VALUETYPE_RESOURCE;
+ fTypeName = typeName;
+ }
+
+ public void renderValueString(String data) {
+ fDataString = data;
+ fValueString = "\""+data+"\"";
+ }
+
+ public boolean supportsValueModification() {
+ return true;
+ }
+
+ public String toString() {
+ return fDataString;
+ }
+
+ public boolean verifyValue(String expression) {
+ return true;
+ }
+}
\ No newline at end of file
*/
package net.sourceforge.phpeclipse.xdebug.php.model;
-import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;
-import net.sourceforge.phpeclipse.xdebug.core.DebugConnection.DebugResponse;
+//import java.net.MalformedURLException;
+import java.net.URL;
-import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IRegisterGroup;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IVariable;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+//import net.sourceforge.phpeclipse.xdebug.core.IDebugConnection;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
/**
+ * @author PHPeclipse team
* @author Axel
- *
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
+ *
*/
-public class XDebugStackFrame extends XDebugElement implements IStackFrame {
-
+public class XDebugStackFrame extends XDebugElement implements IStackFrame {
private XDebugThread fThread;
- // private String fName;
- private int fLineNo;
-
- private String fFileName;
-
private int fId;
-
- private IVariable[] fVariables;
-
- private String fLevel;
-
+
+ //private IPath fName;
+
+ private URL fName;
+
+ private int fLineNumber;
+ private int fLevel;
private String fType;
-
private String fWhere;
+ private IVariable[] fVariables;
+
+ private int fStepCount = 0;
+ //private int fCurrentStepCount = 0;
+
/**
- * Constructs a stack frame in the given thread with the given frame data.
+ * Constructs a stack frame in the given thread with the given
+ * frame data.
*
* @param thread
- * @param data
- * frame data
- * @param id
- * stack frame id (0 is the bottom of the stack)
+ * @param data frame data
+ * @param id stack frame id (0 is the bottom of the stack)
*/
- public XDebugStackFrame(XDebugThread thread, Node stackNode, int id) {
- super((XDebugTarget) thread.getDebugTarget());
+ public XDebugStackFrame(XDebugThread thread, int id) {
+ super(thread == null ? null : (XDebugTarget) thread.getDebugTarget());
fId = id;
fThread = thread;
- init(stackNode);
}
-
- /**
- * Initializes this frame based on its data
- *
- * @param data
- */
- private void init(Node stackNode) {
-
- fLevel = PHPDebugUtils.getAttributeValue(stackNode, "level");
- fType = PHPDebugUtils.getAttributeValue(stackNode, "type");
- String fileName = PHPDebugUtils.unescapeString(PHPDebugUtils
- .getAttributeValue(stackNode, "filename"));
- String lineNo = PHPDebugUtils.getAttributeValue(stackNode, "lineno");
-
- if (lineNo != "")
- fLineNo = Integer.parseInt(lineNo);
-
- fWhere = PHPDebugUtils.getAttributeValue(stackNode, "where");
-
- fFileName = (new Path(fileName)).lastSegment();
- int id = -1;
- try {
- id = ((XDebugTarget) getDebugTarget()).sendRequest("context_get",
- "-d " + fLevel);
- } catch (DebugException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- DebugResponse response = ((XDebugTarget) getDebugTarget())
- .getResponse(id);
- Node responseNode = response.getParentNode();
- NodeList property = responseNode.getChildNodes();
- fVariables = new IVariable[property.getLength()];
- for (int i = 0; i < property.getLength(); i++) {
- Node propertyNode = property.item(i);
- fVariables[i] = new XDebugVariable(this, propertyNode);
- }
-
- // int numVars = strings.length - 3;
- // fVariables = new IVariable[numVars];
- // for (int i = 0; i < numVars; i++) {
- // fVariables[i] = new XDebugVariable(this, strings[i + 3]);
- // }
+
+ public void incrementStepCounter() {
+ fStepCount++;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getThread()
*/
public IThread getThread() {
return fThread;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.model.IStackFrame#getVariables()
- */
+
public IVariable[] getVariables() throws DebugException {
+ if (fVariables == null) {
+ fVariables = fTarget.getVariables(this, fLevel);
+ }
+
return fVariables;
}
-
- /*
- * (non-Javadoc)
- *
+
+ public void evaluateChange(IStackFrame OldStackFrame) throws DebugException {
+ IVariable[] OldVariable = ((XDebugStackFrame) OldStackFrame).getVariables();
+ for (int i = 0; i < fVariables.length; i++) {
+ ((XDebugVariable) fVariables[i]).setChange(OldVariable[i]);
+ }
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#hasVariables()
*/
public boolean hasVariables() throws DebugException {
- return fVariables.length > 0;
+ /*return fVariables.length > 0;*/
+ return true;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getLineNumber()
*/
public int getLineNumber() throws DebugException {
- return fLineNo;
+ return fLineNumber;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getCharStart()
*/
public int getCharStart() throws DebugException {
return -1;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getCharEnd()
*/
public int getCharEnd() throws DebugException {
return -1;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)fName
* @see org.eclipse.debug.core.model.IStackFrame#getName()
*/
public String getName() throws DebugException {
- return fFileName + "::" + fWhere + " : lineno " + fLineNo;
+ //String a = fName.getFile();
+ //return fName.lastSegment().toString()+"::"+fWhere+ " line: "+ fLineNumber;
+ return fName.toString()+"::"+fWhere+ " line: "+ fLineNumber;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups()
*/
public IRegisterGroup[] getRegisterGroups() throws DebugException {
return null;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups()
*/
public boolean hasRegisterGroups() throws DebugException {
return false;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepInto()
*/
public boolean canStepInto() {
- return getThread().canStepInto();
+ return fThread.canStepInto();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepOver()
*/
public boolean canStepOver() {
- return getThread().canStepOver();
+ return fThread.canStepOver();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepReturn()
*/
public boolean canStepReturn() {
- return getThread().canStepReturn();
+ return fThread.canStepReturn();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#isStepping()
*/
public boolean isStepping() {
- return getThread().isStepping();
+ return fThread.isStepping();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepInto()
*/
public void stepInto() throws DebugException {
- getThread().stepInto();
+ fThread.stepInto();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepOver()
*/
public void stepOver() throws DebugException {
- getThread().stepOver();
+ fThread.stepOver();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepReturn()
*/
public void stepReturn() throws DebugException {
- getThread().stepReturn();
+ fThread.stepReturn();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
*/
public boolean canResume() {
- return getThread().canResume();
+ return fThread.canResume();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
*/
public boolean canSuspend() {
- return getThread().canSuspend();
+ return fThread.canSuspend();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
*/
public boolean isSuspended() {
- return getThread().isSuspended();
+ return fThread.isSuspended();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
*/
public void resume() throws DebugException {
- getThread().resume();
+ fThread.resume();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
*/
public void suspend() throws DebugException {
- getThread().suspend();
+ fThread.suspend();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
*/
public boolean canTerminate() {
- return getThread().canTerminate();
+ return fThread.canTerminate();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
*/
public boolean isTerminated() {
- return getThread().isTerminated();
+ return fThread.isTerminated();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#terminate()
*/
public void terminate() throws DebugException {
- getThread().terminate();
+ fThread.terminate();
}
-
+
/**
- * Returns the name of the source file this stack frame is associated with.
+ * Returns the name of the source file this stack frame is associated
+ * with.
*
- * @return the name of the source file this stack frame is associated with
+ * @return the name of the source file this stack frame is associated
+ * with. If the file associated with this frame does not exists, it returns null.
*/
public String getSourceName() {
- return fFileName;
+ if (fName == null) {
+ return null;
+ }
+ IPath a = new Path(fName.getFile());
+ return a.lastSegment();
}
- /*
- * (non-Javadoc)
- *
+ public boolean isSameStackFrame(Object obj) {
+ boolean isSameStackFrame = false;
+
+ if (obj instanceof XDebugStackFrame) {
+ XDebugStackFrame sf = (XDebugStackFrame)obj;
+ //try {
+ isSameStackFrame = sf.getSourceName().equals(getSourceName()) &&
+ /*sf.getLineNumber() == getLineNumber() &&*/
+ /*sf.getLevel() == getLevel() &&*/
+ sf.getType().equals(getType()) &&
+ sf.getWhere().equals(getWhere()); //&&
+ /*sf.fId == fId;*/
+ /*} catch (DebugException e) {
+ }*/
+ }
+
+ return isSameStackFrame;
+ }
+
+ /* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (obj instanceof XDebugStackFrame) {
- XDebugStackFrame sf = (XDebugStackFrame) obj;
+ XDebugStackFrame sf = (XDebugStackFrame)obj;
try {
- return sf.getSourceName().equals(getSourceName())
- && sf.getLineNumber() == getLineNumber()
- && sf.fId == fId;
+ return sf.getSourceName().equals(getSourceName()) &&
+ sf.getLineNumber() == getLineNumber() &&
+ sf.getLevel() == getLevel() &&
+ sf.getType().equals(getType()) &&
+ sf.getWhere().equals(getWhere());
+/* sf.getType() == getType() &&
+ sf.getWhere() == getWhere() &&*/
+ /*sf.fId == fId;*/
} catch (DebugException e) {
}
}
+
return false;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equalsOld(Object obj) {
+ if (obj instanceof XDebugStackFrame) {
+ XDebugStackFrame sf = (XDebugStackFrame)obj;
+ try {
+ return sf.getSourceName().equals(getSourceName()) &&
+ sf.getLineNumber() == getLineNumber() &&
+ sf.fId == fId;
+ } catch (DebugException e) {
+ }
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
- return getSourceName().hashCode() + fId;
+// return getSourceName().hashCode() + fId;
+ return getSourceName().hashCode() + fLevel;
}
-
+
/**
- * Returns this stack frame's unique identifier within its thread
*
* @return this stack frame's unique identifier within its thread
*/
protected int getIdentifier() {
return fId;
}
-}
+
+
+ public void setFullName(URL name) {
+ fName = name;
+ }
+
+
+ public URL getFullName() {
+ return fName;
+ }
+
+
+ public int getLevel() {
+ return fLevel;
+ }
+
+ public void setLevel(int level) {
+ fLevel = level;
+ fId = level;
+ }
+
+ public String getType() {
+ return fType;
+ }
+
+ public void setType(String type) {
+ fType = type;
+ }
+
+ public String getWhere() {
+ return fWhere;
+ }
+
+ public void setWhere(String where) {
+ fWhere = where;
+ }
+
+ public void setLineNumber(int newlineNumber) {
+ fLineNumber = newlineNumber;
+ }
+}
\ No newline at end of file
public class XDebugStringValue extends XDebugAbstractValue {
private String fDataString;
-
public XDebugStringValue(XDebugVariable variable, Node varNode,
String typeName) {
super(variable, varNode, typeName);
- fDataString = null;
+ fDataString=null;
+ }
+
+ public XDebugStringValue(XDebugVariable variable, String typeName) {
+ super(variable, typeName);
+ fDataString=null;
}
+
public void setType(String typeName) {
- fType = XDebugAbstractValue.VALUETYPE_STRING;
- fTypeName = typeName;
+ fType=XDebugAbstractValue.VALUETYPE_STRING;
+ fTypeName=typeName;
}
public void renderValueString(String data) {
- fDataString = data;
- fValueString = "\"" + data + "\"";
+ fDataString=data;
+ fValueString="\""+data+"\"";
}
public boolean supportsValueModification() {
return true;
}
+
public String toString() {
return fDataString;
}
*/
package net.sourceforge.phpeclipse.xdebug.php.model;
-import net.sourceforge.phpeclipse.xdebug.core.Base64;
-import net.sourceforge.phpeclipse.xdebug.core.DebugConnection;
-import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.xdebug.core.AbstractDebugConnection;
+import net.sourceforge.phpeclipse.xdebug.core.IDebugConnection;
+import net.sourceforge.phpeclipse.xdebug.core.IPHPDebugEvent;
+import net.sourceforge.phpeclipse.xdebug.core.IProxyEventListener;
+import net.sourceforge.phpeclipse.xdebug.core.PathMapItem;
import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
-import net.sourceforge.phpeclipse.xdebug.core.DebugConnection.DebugResponse;
+import net.sourceforge.phpeclipse.xdebug.core.XDebugProxy;
import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.ILaunch;
+
+import org.eclipse.debug.core.ILaunchListener;
+
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IValue;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+import org.eclipse.debug.core.model.IVariable;
+
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.DebugResponse;
/**
* @author Christian
- *
+ *
*/
-public class XDebugTarget extends XDebugElement implements IDebugTarget,
- IDebugEventSetListener {
+public class XDebugTarget extends XDebugElement implements IDebugTarget, ILaunchListener, IDebugEventSetListener, IProxyEventListener{
// associated system process (VM)
private IProcess fProcess;
-
+
// containing launch object
private ILaunch fLaunch;
-
+
// debugPort
private int fDebugPort;
-
- // program name
- // private String fName;
-
+
// suspend state
- private boolean fSuspended = true;
-
+ private boolean fSuspended = false;
+
// terminated state
private boolean fTerminated = false;
-
+
// threads
private XDebugThread fThread;
-
private IThread[] fThreads;
+
+ private AbstractDebugConnection fDebugConnection;
- // event dispatch job
- // private EventDispatchJob fEventDispatch;
+ private String fIdeKey;
- private DebugConnection fDebugConnection;
- // private DebugResponse lastResponse;
+ public XDebugTarget() {
+ super(null);
+ }
/**
- * Constructs a new debug target in the given launch for the associated PDA
- * VM process.
+ * Constructs a new debug target in the given launch and waits until
+ * someone with the ideKey connects to the Debugproxy
+ *
*
- * @param launch
- * containing launch
- * @param debugPort
- * port to read events from
- * @exception CoreException
- * if unable to connect to host
- */
- public XDebugTarget(ILaunch launch, IProcess process, int debugPort)
- throws CoreException {
+ * @param launch containing launch
+ * @param process process of the interpreter
+ * @param ideKey
+ * @exception CoreException if unable to connect to host
+ */
+
+ public XDebugTarget(ILaunch launch, IProcess process, String ideKey) throws CoreException {
+ init(launch, process, ideKey);
+ }
+
+ /**
+ * Constructs a new debug target in the given launch and waits until
+ * someone with the ideKey connects to the Debugproxy
+ *
+ *
+ * @param launch containing launch
+ * @param process process of the interpreter
+ * @param ideKey
+ * @param pathMap Pathmap for the debug session
+ * @exception CoreException if unable to connect to host
+ */
+
+ /*public XDebugTarget(ILaunch launch, IProcess process, String ideKey, List<String> pathMap) throws CoreException {
super(null);
+ init(launch, process, ideKey,pathMap);
+ }*/
+
+ private void init(ILaunch launch, IProcess process, String ideKey/*,List<String> pathMap*/) {
fLaunch = launch;
fProcess = process;
fTarget = this;
- fDebugConnection = new DebugConnection(this, debugPort);
- fThread = new XDebugThread(this);
- fThreads = new IThread[] { fThread };
- DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(
- this);
+ fDebugConnection = null;
+ fThread = null;
+ fThreads = new IThread[0];
+ fIdeKey = ideKey;
+
+ XDebugProxy proxy = XDebugCorePlugin.getDefault().getXDebugProxy();
+ proxy.addProxyEventListener(this,ideKey);
+ if (!proxy.isRunning())
+ proxy.start();
+
+ proxy.setTarget(this);
+
+ fDebugPort = proxy.getProxyPort();
+
+ DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
DebugPlugin.getDefault().addDebugEventListener(this);
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugTarget#getProcess()
*/
public IProcess getProcess() {
return fProcess;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugTarget#getThreads()
*/
public IThread[] getThreads() throws DebugException {
return fThreads;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugTarget#hasThreads()
*/
public boolean hasThreads() throws DebugException {
- return (fThreads.length > 0);
+ return (fThreads.length>0);
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugTarget#getName()
*/
public String getName() throws DebugException {
return "PHP XDebug Client at localhost:" + fDebugPort;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugTarget#supportsBreakpoint(org.eclipse.debug.core.model.IBreakpoint)
*/
public boolean supportsBreakpoint(IBreakpoint breakpoint) {
- if (breakpoint.getModelIdentifier().equals(
- IXDebugConstants.ID_PHP_DEBUG_MODEL)) {
+ if (breakpoint.getModelIdentifier().equals(IXDebugConstants.ID_PHP_DEBUG_MODEL)) {
return true;
}
return false;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
*/
public IDebugTarget getDebugTarget() {
return this;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
*/
public ILaunch getLaunch() {
return fLaunch;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
*/
public boolean canTerminate() {
- return getProcess().canTerminate();
- // return false;
+ if (getProcess()!=null) // ther is no running Process in remote debugging
+ return getProcess().canTerminate();
+ return true;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
*/
public boolean isTerminated() {
- // return getProcess().isTerminated();
+// return getProcess().isTerminated();
return fTerminated;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#terminate()
*/
public void terminate() throws DebugException {
- fDebugConnection.sendRequest("stop");
+ //IThread t = fThreads.length();
+ //fTerminated=true;
+ XDebugProxy proxy=XDebugCorePlugin.getDefault().getXDebugProxy();
+ proxy.stop();
+ proxy.removeProxyEventListener(this,fIdeKey);
+ System.out.println("XDebug.Target: ProxyEventlistener removed");
+ fTerminated = true;
+ //fDisconnected = true;
+ fSuspended = false;
+ XDebugCorePlugin.getBreakpointManager().removeBreakpointListener(this);
+ fireTerminateEvent();
+ DebugPlugin.getDefault().removeDebugEventListener(this);
+ if (fThread!=null)
+ fThread.removeEventListeners();
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
*/
public boolean canResume() {
- return !isTerminated() && isSuspended();
+// return !isTerminated() && isSuspended();
+ return false;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
*/
public boolean canSuspend() {
- return !isTerminated() && !isSuspended();
+// return !isTerminated() && !isSuspended();
+ return false;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
*/
public boolean isSuspended() {
return fSuspended;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
*/
public void resume() throws DebugException {
- fDebugConnection.sendRequest("run");
+ if (fDebugConnection != null) {
+ fThread.setBreakpoints(null);
+ fDebugConnection.run();
+ }
}
-
+
/**
* Notification the target has resumed for the given reason
*
- * @param detail
- * reason for the resume
+ * @param detail reason for the resume
*/
private void resumed(int detail) {
fSuspended = false;
fThread.fireResumeEvent(detail);
}
-
+
/**
* Notification the target has suspended for the given reason
*
- * @param detail
- * reason for the suspend
+ * @param detail reason for the suspend
*/
public void suspended(int detail) {
fSuspended = true;
fThread.fireSuspendEvent(detail);
- }
-
- /*
- * (non-Javadoc)
- *
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
*/
public void suspend() throws DebugException {
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.IBreakpointListener#breakpointAdded(org.eclipse.debug.core.model.IBreakpoint)
*/
public void breakpointAdded(IBreakpoint breakpoint) {
+ IMarker marker = breakpoint.getMarker();
+ IPath path = marker.getResource().getLocation();
+ IPath cp = path.removeLastSegments(1);
+ List pathMap = null;
+ try {
+ pathMap = fLaunch.getLaunchConfiguration().getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP,(List)null);
+ } catch (CoreException e2) {
+ // TODO Auto-generated catch block
+ e2.printStackTrace();
+ }
- if (supportsBreakpoint(breakpoint)) {
- try {
- if (breakpoint.isEnabled()) {
- IMarker marker = breakpoint.getMarker();
- if (marker != null) {
- try {
- String fileName = PHPDebugUtils.escapeString(marker
- .getResource().getLocation().toString());
- String arg = "-t line -f file:///"
- + fileName
- + " -n "
- + ((ILineBreakpoint) breakpoint)
- .getLineNumber();
- int id = fDebugConnection.sendRequest(
- "breakpoint_set", arg);
- // set the marker Attribute to make later
- // idetification possible
- // TODO: make sure that attribute is set before
- // response from debugger is beeing prosessed
- marker.setAttribute(
- XDebugLineBreakpoint.BREAKPOINT_ID, id);
-
- } catch (CoreException e) {
+ if (!fDebugConnection.isClosed()) {
+ if (fProcess == null) {
+ PathMapItem pmi = null;
+ for (int i = 0; i < pathMap.size(); i++) {
+ pmi = new PathMapItem((String) pathMap.get(i));
+ IPath local = (IPath)pmi.getLocalPath().clone();
+ local = local./*removeFirstSegments(1).*/makeAbsolute();
+ int matchedSegments = local.segmentCount();
+ if (local.matchingFirstSegments(cp) == matchedSegments) {
+ IPath newPath = pmi.getRemotePath();
+ //newPath = newPath.removeFirstSegments(1);
+ newPath = newPath.append(path.removeFirstSegments(matchedSegments));
+ newPath = newPath.makeAbsolute();
+ if (supportsBreakpoint(breakpoint)) {
+ try {
+ fDebugConnection.addBreakpoint(breakpoint, newPath);
+ } catch (DebugException e) {
+ e.printStackTrace();
+ }
}
}
+ }
+ } else {
+ if (supportsBreakpoint(breakpoint)) {
+ try {
+ fDebugConnection.addBreakpoint(breakpoint, path);
+ } catch (DebugException e) {
+ e.printStackTrace();
+ }
}
- } catch (CoreException e) {
-
}
}
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(org.eclipse.debug.core.model.IBreakpoint,
- * org.eclipse.core.resources.IMarkerDelta)
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
*/
public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
if (supportsBreakpoint(breakpoint)) {
try {
- int id = ((XDebugLineBreakpoint) breakpoint).getID();
- if (id > 0)
- fDebugConnection.sendRequest("breakpoint_remove", "-d "
- + id);
+ fDebugConnection.removeBreakpoint(breakpoint);
} catch (CoreException e) {
}
}
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.IBreakpointListener#breakpointChanged(org.eclipse.debug.core.model.IBreakpoint,
- * org.eclipse.core.resources.IMarkerDelta)
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.IBreakpointListener#breakpointChanged(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
*/
public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) {
- // if (supportsBreakpoint(breakpoint)) {
- // try {
- // if (breakpoint.isEnabled()) {
- // breakpointAdded(breakpoint);
- // } else {
- // breakpointRemoved(breakpoint, null);
- // }
- // } catch (CoreException e) {
- // }
- // }
- }
-
- /*
- * (non-Javadoc)
- *
+// if (supportsBreakpoint(breakpoint)) {
+// try {
+// if (breakpoint.isEnabled()) {
+// breakpointAdded(breakpoint);
+// } else {
+// breakpointRemoved(breakpoint, null);
+// }
+// } catch (CoreException e) {
+// }
+// }
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDisconnect#canDisconnect()
*/
public boolean canDisconnect() {
return false;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDisconnect#disconnect()
*/
public void disconnect() throws DebugException {
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDisconnect#isDisconnected()
*/
public boolean isDisconnected() {
- return false;
+ return (fDebugConnection==null);
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IMemoryBlockRetrieval#supportsStorageRetrieval()
*/
public boolean supportsStorageRetrieval() {
return false;
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.model.IMemoryBlockRetrieval#getMemoryBlock(long,
- * long)
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.model.IMemoryBlockRetrieval#getMemoryBlock(long, long)
*/
- public IMemoryBlock getMemoryBlock(long startAddress, long length)
- throws DebugException {
+ public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException {
return null;
}
/**
- * Notification we have connected to the PHP debugger and it has started.
+ * Notification we have connected to the PHP debugger and it has been started.
* Resume the the debugger.
*/
- public void started() {
-
+ public void started() throws DebugException {
fThread.setBreakpoints(null);
fThread.setStepping(false);
+ /*boolean CanDisconnect =*/ Integer.parseInt(fDebugConnection.featureGet("detach").getValue()) /*!= 0*/;
+
+ System.out.println("in Target.started()");
+ DebugResponse response = fDebugConnection.featureGet("max_children");
+ String a1 = response.getValue();
+ System.out.println("max children:"+a1);
+ DebugResponse response1 = fDebugConnection.featureGet("max_children");
+ String a2 = response1.getValue();
+ System.out.println("max depth:"+a2);
+
+
+ boolean res = fDebugConnection.featureSet("max_depth", "100" );
+ if( res == true ) {
+ System.out.println("Set depth to 100 (hack)");
+ }
+
installDeferredBreakpoints();
try {
resume();
- // step();
+// step();
} catch (DebugException e) {
+ e.printStackTrace();
}
}
-
+
/**
* Install breakpoints that are already registered with the breakpoint
* manager.
breakpointAdded(breakpoints[i]);
}
}
-
+
/**
* Called when this debug target terminates.
*/
XDebugCorePlugin.getBreakpointManager().removeBreakpointListener(this);
fireTerminateEvent();
DebugPlugin.getDefault().removeDebugEventListener(this);
- fThread.removeEventListeners();
+ fThread.removeEventListeners();
}
-
+
/**
* Returns the current stack frames in the target.
*
* @return the current stack frames in the target
- * @throws DebugException
- * if unable to perform the request
+ * @throws DebugException if unable to perform the request
*/
protected IStackFrame[] getStackFrames() throws DebugException {
- int id = fDebugConnection.sendRequest("stack_get");
- DebugResponse lastResponse = fDebugConnection.waitforTransID(id);
- if (lastResponse.isError())
- return new IStackFrame[0];
- Node response = lastResponse.getParentNode();
- NodeList frames = response.getChildNodes();
- IStackFrame[] theFrames = new IStackFrame[frames.getLength()];
- for (int i = 0; i < frames.getLength(); i++) {
- Node stackNode = frames.item(i);
- theFrames[i] = new XDebugStackFrame(fThread, stackNode, i);
- }
- return theFrames;
+ return fDebugConnection.getStackFrames(fThread);
}
-
+
/**
* Single step the interpreter.
*
- * @throws DebugException
- * if the request fails
+ * @throws DebugException if the request fails
*/
protected void step_over() throws DebugException {
fThread.setStepping(true);
resumed(DebugEvent.STEP_OVER);
- fDebugConnection.sendRequest("step_over");
+ fDebugConnection.stepOver();
}
-
+
/**
* Single step the interpreter.
*
- * @throws DebugException
- * if the request fails
+ * @throws DebugException if the request fails
*/
protected void step_into() throws DebugException {
fThread.setStepping(true);
resumed(DebugEvent.STEP_INTO);
- fDebugConnection.sendRequest("step_into");
+ fDebugConnection.stepInto();
}
-
+
/**
* Single step the interpreter.
*
- * @throws DebugException
- * if the request fails
+ * @throws DebugException if the request fails
*/
protected void step_out() throws DebugException {
fThread.setStepping(true);
resumed(DebugEvent.STEP_RETURN);
- fDebugConnection.sendRequest("step_out");
+ fDebugConnection.stepOut();
}
-
+
/**
* Returns the current value of the given variable.
*
* @param variable
* @return variable value
- * @throws DebugException
- * if the request fails
- */
- protected IValue getVariableValue(XDebugVariable variable)
- throws DebugException {
- // synchronized (fDebugSocket) {
- // fDebugConnection.sendRequest("var","" +
- // variable.getStackFrame().getIdentifier() + " " + variable.getName());
- // try {
- // String value = fDebugReader.readLine();
- // //return new XDebugValue(this, value);
- //
- // } catch (IOException e) {
- // abort(MessageFormat.format("Unable to retrieve value for variable
- // {0}", new String[]{variable.getName()}), e);
- // }
- // }
+ * @throws DebugException if the request fails
+ */
+ protected IValue getVariableValue(XDebugVariable variable) throws DebugException {
return null;
}
-
+
/**
* Returns the values on the data stack (top down)
*
* @return the values on the data stack (top down)
*/
public IValue[] getDataStack() throws DebugException {
- // synchronized (fDebugSocket) {
- // fDebugConnection.sendRequest ("data");
- // try {
- // String valueString = fDebugReader.readLine();
- // if (valueString != null && valueString.length() > 0) {
- // String[] values = valueString.split("\\|");
- // IValue[] theValues = new IValue[values.length];
- // for (int i = 0; i < values.length; i++) {
- // String value = values[values.length - i - 1];
- // // theValues[i] = new XDebugValue(this, value);
- // }
- // return theValues;
- // }
- // } catch (IOException e) {
- // abort("Unable to retrieve data stack", e);
- // }
- // }
- return new IValue[0];
+ return new IValue[0];
}
-
+
public boolean setVarValue(String name, String value) {
- int id = -1;
- String str = Base64.encodeBytes(value.getBytes());
- int len = str.length();
-
- try {
- id = fDebugConnection.sendRequest("property_set", "-n " + name
- + " -l " + len + " -- " + str);
- } catch (DebugException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ return fDebugConnection.setVarValue(name,value);
+ }
+
+ public void handleDebugEvents(DebugEvent[] events) {
+ for (int i=0;i<events.length;i++) {
+ DebugEvent event=events[i];
+ if(event.getKind()==DebugEvent.MODEL_SPECIFIC) {
+ if (event.getDetail()==IPHPDebugEvent.BREAKPOINT_HIT) {
+ IBreakpoint breakpoint = (IBreakpoint) event.getData();
+ fThread.setBreakpoints(new IBreakpoint[]{breakpoint});
+ fThread.incrementStepCounter();
+ suspended(DebugEvent.BREAKPOINT);
+ } else if (event.getDetail()==IPHPDebugEvent.STEP_END) {
+ fThread.incrementStepCounter();
+ suspended(DebugEvent.STEP_END);
+ } else if (event.getDetail()==IPHPDebugEvent.STOPPED) {
+ //fDebugConnection.removeBreakpoint(breakpoint);
+ fThread.removeEventListeners();
+ fThread=null;
+ fThreads= new IThread[0];
+ fSuspended=false;
+ // TODO Dirty hack to check debugging mode (remote or local)
+ if (fProcess!=null) {
+ try {
+ terminate();
+ } catch (DebugException e) {
+ e.printStackTrace();
+ }
+ } else {
+ fDebugConnection = null;
+ fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CONTENT));
+ }
+ } else {
+ int a = 20;
+ a *= 10;
+ }
+ } else {
+ int b = 10;
+ b *= 1;
+ }
}
- DebugResponse dr = getResponse(id);
- if ((dr.getAttributeValue("success")).equals("1"))
- return true;
-
- return false;
+
+ }
+
+ public void handleProxyEvent(String ideKey, String initString, AbstractDebugConnection connection) {
+ System.out.println("* New Connection - XDebug.Target: "+ideKey);
+ setDebugConnection(connection);
+
+ XDebugProxy proxy=XDebugCorePlugin.getDefault().getXDebugProxy();
+ fDebugPort=proxy.getProxyPort();
+ fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CHANGE));
+
+
+// proxy.removeProxyEventListener(this,ideKey);
+// System.out.println("XDebug.Target: ProxyEventlistener removed");
+ fThread = new XDebugThread(this);
+ fThreads = new IThread[] {fThread};
+ try {
+ started();
+ } catch( DebugException e ){
+ e.printStackTrace();
+ }
}
- public DebugResponse getResponse(int id) {
- return fDebugConnection.waitforTransID(id);
+ private void setDebugConnection(AbstractDebugConnection connection) {
+ if (connection != null) {
+ fDebugConnection = connection;
+ fDebugConnection.startListener();
+ }
}
-
+
/**
- * Sends a request to the Debugengine and waits for an OK.
- *
- * @param command
- * debug command
- * @throws DebugException
- * if the request fails
+ * @return Returns the fDebugConnection.
*/
+ public IDebugConnection getDebugConnection() {
+ return fDebugConnection;
+ }
+
+ public void addProcess(IProcess p) {
+ fProcess = p;
+
+ }
- public int sendRequest(String command) throws DebugException {
- return fDebugConnection.sendRequest(command, "");
+ public void launchRemoved(ILaunch launch) {
}
/**
- * Sends a request to the Debugengine and waits for an OK.
+ * Notifies this listener that the specified launch
+ * has been added.
*
- * @param command
- * debug command
- * @arguments arguments for the command
- * @throws DebugException
- * if the request fails
+ * @param launch the newly added launch
+ * @since 2.0
*/
-
- public int sendRequest(String command, String arguments)
- throws DebugException {
- return fDebugConnection.sendRequest(command, arguments);
+ public void launchAdded(ILaunch launch){
}
/**
- * Notification a breakpoint was encountered. Determine which breakpoint was
- * hit and fire a suspend event.
+ * Notifies this listener that the specified launch
+ * has changed. For example, a process or debug target
+ * has been added to the launch.
*
- * @param event
- * debug event
- */
- public void breakpointHit(Node node) {
- // determine which breakpoint was hit, and set the thread's breakpoint
- Node child = node.getFirstChild();
- if (child.getNodeName().equals("stack")) {
- int lineNumber = Integer.parseInt(PHPDebugUtils.getAttributeValue(
- child, "lineno"));
- String filename = PHPDebugUtils
- .getAttributeValue(child, "filename").substring(8); // remove
- // file:///
- IBreakpoint[] breakpoints = XDebugCorePlugin.getBreakpoints();
- for (int i = 0; i < breakpoints.length; i++) {
- IBreakpoint breakpoint = breakpoints[i];
- if (supportsBreakpoint(breakpoint)) {
- if (breakpoint instanceof ILineBreakpoint) {
- ILineBreakpoint lineBreakpoint = (ILineBreakpoint) breakpoint;
- try {
- if (breakpoint.isEnabled()) {
- IMarker marker = breakpoint.getMarker();
- if (marker != null) {
-
- String name = marker.getResource()
- .getLocation().toOSString();
- if (name.equals(PHPDebugUtils
- .unescapeString(filename))
- && (lineBreakpoint.getLineNumber() == lineNumber)) {
- fThread
- .setBreakpoints(new IBreakpoint[] { breakpoint });
- break;
- }
- }
-
- }
- } catch (CoreException e) {
- }
- }
- }
- }
- }
- suspended(DebugEvent.BREAKPOINT);
+ * @param launch the changed launch
+ * @since 2.0
+ */
+ public void launchChanged(ILaunch launch) {
}
-
- public void handleDebugEvents(DebugEvent[] events) {
- for (int i = 0; i < events.length; i++) {
- DebugEvent event = events[i];
- if ((event.getKind() == DebugEvent.CREATE)
- && (event.getSource() instanceof XDebugElement)) {
- if (((XDebugElement) event.getSource()).getModelIdentifier() == IXDebugConstants.ID_PHP_DEBUG_MODEL) {
- if (event.getKind() == DebugEvent.CREATE)
- started();
- }
- }
- }
-
+
+ public IVariable[] getVariables(XDebugStackFrame StackFrame, int Level) {
+ return fDebugConnection.getVariables(StackFrame, Level);
}
}
\ No newline at end of file
/**
* @author Axel
- *
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
*/
-public class XDebugThread extends XDebugElement implements IThread,
- IDebugEventSetListener {
-
- /**
- * Breakpoints this thread is suspended at or <code>null</code> if none.
- */
-
- private IStackFrame[] fStackFrames = null;
-
+public class XDebugThread extends XDebugElement implements IThread, IDebugEventSetListener {
+ private IStackFrame[] fStackFrames;
+
private IBreakpoint[] fBreakpoints;
-
- /**
- * Whether this thread is stepping
- */
+
+ /* Whether this thread is stepping */
private boolean fStepping = false;
-
+ private boolean fTerminated = false;
+
+ private int fStepCount = 0;
+ private int fCurrentStepCount = 0;
+
/**
* Constructs a new thread for the given target
*
- * @param target
- * VM
+ * @param target VM
*/
public XDebugThread(XDebugTarget target) {
super(target);
DebugPlugin.getDefault().addDebugEventListener(this);
+ fStackFrames = null;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.model.IThread#getStackFrames()
- */
+
+ public void incrementStepCounter() {
+ fStepCount++;
+ }
+
public IStackFrame[] getStackFrames() throws DebugException {
- if (isSuspended()) {
- if (fStackFrames == null) {
- // XDebugCorePlugin.log(IStatus.INFO,"vor getStackFrames");
- fStackFrames = ((XDebugTarget) getDebugTarget())
- .getStackFrames();
- // XDebugCorePlugin.log(IStatus.INFO,"nach getStackFrames");
+ IStackFrame[] newStackFrames = null;
+
+ if (isSuspended()) {
+ if (fStepCount > fCurrentStepCount) {
+ newStackFrames = ((XDebugTarget) getDebugTarget()).getStackFrames();
+
+ for (int i = 0; i < newStackFrames.length; i++) {
+ ((XDebugStackFrame)newStackFrames[i]).getVariables();
+ }
+
+ if (fStackFrames != null) {
+ if (newStackFrames.length >= fStackFrames.length) {
+ int delta = newStackFrames.length - fStackFrames.length + 1;
+
+ for (int i = fStackFrames.length - 1; i >= 0; i--) {
+ if (((XDebugStackFrame) fStackFrames[i]).equals(((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]))) {
+ int b = 2; b++;
+ //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]);
+ } else if (((XDebugStackFrame) fStackFrames[i]).isSameStackFrame(newStackFrames[newStackFrames.length - delta])) {
+ //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]);
+ }
+
+ delta ++;
+ }
+ } else {
+ }
+ }
+
+ fCurrentStepCount++;
+
+ fStackFrames = newStackFrames;
}
return fStackFrames;
} else {
return new IStackFrame[0];
}
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IThread#hasStackFrames()
*/
public boolean hasStackFrames() throws DebugException {
return isSuspended();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IThread#getPriority()
*/
public int getPriority() throws DebugException {
return 0;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
*/
public IStackFrame getTopStackFrame() throws DebugException {
if (frames.length > 0) {
return frames[0];
}
+
return null;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IThread#getName()
*/
public String getName() throws DebugException {
- // if (fStackFrames!=null)
- // return fStackFrames[0].getName();
- // else
return "Thread[1]";
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IThread#getBreakpoints()
*/
public IBreakpoint[] getBreakpoints() {
}
return fBreakpoints;
}
-
+
/**
* Sets the breakpoints this thread is suspended at, or <code>null</code>
* if none.
*
- * @param breakpoints
- * the breakpoints this thread is suspended at, or
- * <code>null</code> if none
+ * @param breakpoints the breakpoints this thread is suspended at, or <code>null</code>
+ * if none
*/
protected void setBreakpoints(IBreakpoint[] breakpoints) {
fBreakpoints = breakpoints;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
*/
public boolean canResume() {
return isSuspended();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
*/
public boolean canSuspend() {
- return !isSuspended();
+ return !isTerminated() && !isSuspended();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
*/
public boolean isSuspended() {
- return getDebugTarget().isSuspended();
+ return fTarget.isSuspended();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
*/
public void resume() throws DebugException {
- fStackFrames = null;
- fBreakpoints = null;
- getDebugTarget().resume();
+ fBreakpoints=null;
+ fTarget.resume();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
*/
public void suspend() throws DebugException {
- getDebugTarget().suspend();
+ fTarget.suspend();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepInto()
*/
public boolean canStepInto() {
return isSuspended();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepOver()
*/
public boolean canStepOver() {
return isSuspended();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepReturn()
*/
public boolean canStepReturn() {
- if (fStackFrames != null)
+ if (fStackFrames != null) {
return (fStackFrames.length > 1);
- else
+ } else {
return false;
+ }
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#isStepping()
*/
public boolean isStepping() {
return fStepping;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepInto()
*/
public void stepInto() throws DebugException {
- fStackFrames = null;
- fBreakpoints = null;
- ((XDebugTarget) getDebugTarget()).step_into();
+ fBreakpoints=null;
+ fTarget.step_into();
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepOver()
*/
public void stepOver() throws DebugException {
- fStackFrames = null;
- fBreakpoints = null;
- ((XDebugTarget) getDebugTarget()).step_over();
+ fBreakpoints=null;
+ fTarget.step_over();
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepReturn()
*/
public void stepReturn() throws DebugException {
- fStackFrames = null;
- fBreakpoints = null;
- ((XDebugTarget) getDebugTarget()).step_out();
-
+ fBreakpoints=null;
+ fTarget.step_out();
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
*/
public boolean canTerminate() {
return !isTerminated();
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
*/
public boolean isTerminated() {
- return getDebugTarget().isTerminated();
+ return fTerminated;
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#terminate()
*/
public void terminate() throws DebugException {
- getDebugTarget().terminate();
+ fTarget.getDebugConnection().stop();
+ fTerminated = true;
+ }
+
+ public void terminated() throws DebugException {
+ fTerminated = true;
}
/**
* Sets whether this thread is stepping
*
- * @param stepping
- * whether stepping
+ * @param stepping whether stepping
*/
protected void setStepping(boolean stepping) {
fStepping = stepping;
public void handleDebugEvents(DebugEvent[] events) {
DebugEvent de = events[0];
- System.out.println(de.toString());
-
+ System.out.println(de.toString());
}
public void removeEventListeners() {
DebugPlugin.getDefault().removeDebugEventListener(this);
-
}
-}
+}
\ No newline at end of file
public XDebugValue(XDebugVariable variable, Node varNode, String typeName) {
super(variable, varNode, typeName);
// TODO Auto-generated constructor stub
+ fValueString="uninitialized";
+ fType=XDebugAbstractValue.VALUETYPE_UNINITIALIZED;
+ fTypeName="unknown";
+
}
+
+ public XDebugValue(XDebugVariable variable, String typeName) {
+ super(variable, typeName);
+ fValueString="uninitialized";
+ fType=XDebugAbstractValue.VALUETYPE_UNINITIALIZED;
+ fTypeName="unknown";
- public void setType(String typeName) {
- fType = XDebugAbstractValue.VALUETYPE_UNINITIALIZED;
- fTypeName = "unknown";
}
+
+ public void setType(String typeName) {
+ }
+
public void renderValueString(String data) {
- fValueString = "uninitialized";
}
public boolean verifyValue(String expression) {
- // TODO Auto-generated method stub
return false;
}
package net.sourceforge.phpeclipse.xdebug.php.model;
import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;
-
-import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.w3c.dom.Node;
/**
* @author Axel
- *
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
*/
-public class XDebugVariable extends XDebugElement implements IVariable {
-
+public class XDebugVariable extends XDebugElement implements IVariable {
public static final int VARTYPE_UNKNOWN = -1;
-
public static final int VARTYPE_UNINITIALIZED = 0;
-
public static final int VARTYPE_STRING = 1;
-
public static final int VARTYPE_INT = 2;
-
public static final int VARTYPE_FLOAT = 3;
-
public static final int VARTYPE_ARRAY = 8;
-
public static final int VARTYPE_HASH = 9;
-
public static final int VARTYPE_OBJECT = 10;
-
+ public static final int VARTYPE_RESOURCE = 11;
+
// name & stack frmae
private String fName;
-
private XDebugStackFrame fFrame;
-
private String fFullName;
-
- // private String fTypeName;
- // private int fType;
private XDebugAbstractValue fValue;
-
private String fEncoding;
-
private int fNumChildren;
-
- // private Node fVariableNode;
-
+
/**
- * Constructs a variable contained in the given stack frame with the given
- * name.
+ * Constructs a variable contained in the given stack frame
+ * with the given name.
*
- * @param frame
- * owning stack frame
- * @param name
- * variable name
+ * @param frame owning stack frame
+ * @param name variable name
*/
+ public XDebugVariable( String typeName, String fullname ) {
+ fFullName = fullname;
+ fName = fullname;
+ if (typeName.equals("int") )
+ fValue= new XDebugIntValue(this,typeName);
+ else if (typeName.equals("float") )
+ fValue= new XDebugFloatValue(this,typeName);
+ else if (typeName.equals("bool") )
+ fValue= new XDebugBooleanValue(this,typeName);
+ else if (typeName.equals("string") )
+ fValue= new XDebugStringValue(this,typeName);
+ else if (typeName.equals("array") )
+ fValue= new XDebugArrayValue(this,typeName);
+ else if (typeName.equals("hash") )
+ fValue= new XDebugArrayValue(this,typeName);
+ else if (typeName.equals("object") )
+ fValue= new XDebugArrayValue(this,typeName);
+ else if (typeName.equals("resource") )
+ fValue= new XDebugResourceValue(this,typeName);
+ else
+ fValue= new XDebugValue(this,typeName);
+ }
+
public XDebugVariable(XDebugStackFrame frame, Node property) {
super((XDebugTarget) frame.getDebugTarget());
fFrame = frame;
init(property);
-
}
-
- private void init(Node property) {
- fFullName = PHPDebugUtils.getAttributeValue(property, "fullname");
- fName = PHPDebugUtils.getAttributeValue(property, "name");
- fEncoding = PHPDebugUtils.getAttributeValue(property, "encoding");
- if (PHPDebugUtils.getAttributeValue(property, "numchildren").equals(""))
+
+ public XDebugVariable(XDebugStackFrame frame, String fullname, String name, String typeName) {
+ super((XDebugTarget) frame.getDebugTarget());
+ fFrame = frame;
+ fFullName = fullname;
+ fName = name;
+ if (typeName.equals("int") )
+ fValue= new XDebugIntValue(this,typeName);
+ else if (typeName.equals("float") )
+ fValue= new XDebugFloatValue(this,typeName);
+ else if (typeName.equals("bool") )
+ fValue= new XDebugBooleanValue(this,typeName);
+ else if (typeName.equals("string") )
+ fValue= new XDebugStringValue(this,typeName);
+ else if (typeName.equals("array") )
+ fValue= new XDebugArrayValue(this,typeName);
+ else if (typeName.equals("hash") )
+ fValue= new XDebugArrayValue(this,typeName);
+ else if (typeName.equals("object") )
+ fValue= new XDebugArrayValue(this,typeName);
+ else if (typeName.equals("resource") )
+ fValue= new XDebugResourceValue(this,typeName);
+ else
+ fValue= new XDebugValue(this,typeName);
+ }
+
+ private void init(Node property) {
+ fFullName=PHPDebugUtils.getAttributeValue(property,"fullname");
+ fName=PHPDebugUtils.getAttributeValue(property,"name");
+ fEncoding=PHPDebugUtils.getAttributeValue(property,"encoding");
+ if (PHPDebugUtils.getAttributeValue(property,"numchildren").equals(""))
fNumChildren = 0;
else
- fNumChildren = Integer.parseInt(PHPDebugUtils.getAttributeValue(
- property, "numchildren"));
-
- String typeName = PHPDebugUtils.getAttributeValue(property, "type");
-
- // if (typeName.equals("uninitialized") )
- // fValue= new XDebugValue(this,property,typeName);
- if (typeName.equals("int"))
- fValue = new XDebugIntValue(this, property, typeName);
- else if (typeName.equals("float"))
- fValue = new XDebugFloatValue(this, property, typeName);
- else if (typeName.equals("bool"))
- fValue = new XDebugBooleanValue(this, property, typeName);
- else if (typeName.equals("string"))
- fValue = new XDebugStringValue(this, property, typeName);
- else if (typeName.equals("array"))
- fValue = new XDebugArrayValue(this, property, typeName);
- else if (typeName.equals("hash"))
- fValue = new XDebugArrayValue(this, property, typeName);
- else if (typeName.equals("object"))
- fValue = new XDebugArrayValue(this, property, typeName);
+ fNumChildren=Integer.parseInt(PHPDebugUtils.getAttributeValue(property,"numchildren"));
+
+ String typeName=PHPDebugUtils.getAttributeValue(property,"type");
+
+// if (typeName.equals("uninitialized") )
+// fValue= new XDebugValue(this,property,typeName);
+ if (typeName.equals("int") )
+ fValue= new XDebugIntValue(this,property,typeName);
+ else if (typeName.equals("float") )
+ fValue= new XDebugFloatValue(this,property,typeName);
+ else if (typeName.equals("bool") )
+ fValue= new XDebugBooleanValue(this,property,typeName);
+ else if (typeName.equals("string") )
+ fValue= new XDebugStringValue(this,property,typeName);
+ else if (typeName.equals("array") )
+ fValue= new XDebugArrayValue(this,property,typeName);
+ else if (typeName.equals("hash") )
+ fValue= new XDebugArrayValue(this,property,typeName);
+ else if (typeName.equals("object") )
+ fValue= new XDebugArrayValue(this,property,typeName);
else
- fValue = new XDebugValue(this, property, typeName);
-
- // else if (typeName.equals("float") )
- // fTypeName= VARTYPE_FLOAT;
- // else if (typeName.equals("string") )
- // fTypeName= VARTYPE_STRING;
- // else if (typeName.equals("hash") )
- // fTypeName= VARTYPE_HASH;
- // else if (typeName.equals("array") )
- // fTypeName= VARTYPE_ARRAY;
- // else if (typeName.equals("object") )
- // fTypeName= VARTYPE_OBJECT;
-
- // fTypeName=type;
- //
- // fValue= new XDebugValue(this,property);
- }
-
- /*
- * (non-Javadoc)
- *
+ fValue= new XDebugValue(this,property,typeName);
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IVariable#getValue()
*/
public IValue getValue() throws DebugException {
return fValue;
- // return ((XDebugTarget)getDebugTarget()).getVariableValue(this);
+// return ((XDebugTarget)getDebugTarget()).getVariableValue(this);
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IVariable#getName()
*/
public String getName() throws DebugException {
else
return fName;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
*/
public String getReferenceTypeName() throws DebugException {
return fValue.getReferenceTypeName();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
*/
public boolean hasValueChanged() throws DebugException {
- // TODO Auto-generated method stub
- return false;
+ return fValue.hasChanged();
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String)
*/
public void setValue(String expression) throws DebugException {
- if (fValue.setValue(expression))
- fireEvent(new DebugEvent(this, DebugEvent.CHANGE,
- DebugEvent.CONTENT));
+ if(fValue.setValue(expression))
+ fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CONTENT));
+ //fValue.setValueA(expression);
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.debug.core.model.IValue)
*/
public void setValue(IValue value) throws DebugException {
+ fValue.setValueB(value);
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#supportsValueModification()
*/
public boolean supportsValueModification() {
return fValue.supportsValueModification();
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang.String)
*/
public boolean verifyValue(String expression) throws DebugException {
return fValue.verifyValue(expression);
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse.debug.core.model.IValue)
*/
public boolean verifyValue(IValue value) throws DebugException {
return false;
}
-
+
/**
* Returns the stack frame owning this variable.
*
protected XDebugStackFrame getStackFrame() {
return fFrame;
}
+
+ public void setStackFrame(XDebugStackFrame frame) {
+ fFrame=frame;
+ super.setDebugTarget((XDebugTarget)frame.getDebugTarget());
+ }
- // public int getType() {
- // return fType;
- // }
+// public int getType() {
+// return fType;
+// }
public String getValueString() throws DebugException {
return fValue.getValueString();
}
-
+
+ /*public setValueString(String newValueStrig) throws DebugException {
+ fValue.setValueString getValueString();
+ }*/
+
public boolean hasChildren() {
return (fNumChildren > 0);
}
public void setEncoding(String encoding) {
fEncoding = encoding;
}
-
+
public String toString() {
return fValue.toString();
}
return fFullName;
}
-}
+ public int getNumChildren() {
+ return fNumChildren;
+ }
+
+ public void setNumChildren(int numChildren) {
+ fNumChildren = numChildren;
+ }
+
+ public void setChange(IVariable oldVariable) throws DebugException {
+ XDebugAbstractValue oldValue = null;
+ IVariable[] newVariable = null;
+ IVariable[] oldVariable1 = null;
+
+ try {
+ oldValue = (XDebugAbstractValue) oldVariable.getValue();
+ } catch (DebugException e) {
+ }
+
+ try {
+ oldVariable1 = ((XDebugVariable)oldVariable).getValue().getVariables();
+ newVariable = fValue.getVariables();
+ } catch (DebugException e) {
+ }
+
+
+ if(((XDebugVariable) oldVariable).getNumChildren() > 0) {
+ if ( this.getNumChildren() == 0) {
+ try {
+ if (!fValue.getValueString().equals(((XDebugAbstractValue)oldValue).getValueString())) {
+ fValue.sethasChanged(true);
+ } else {
+ fValue.sethasChanged(false);
+ }
+ } catch (DebugException e) {
+ }
+ } else {
+ for(int i = 0; i < newVariable.length; i++) {
+ ((XDebugVariable)newVariable[i]).setChange(((XDebugVariable)oldVariable1[i]));
+ }
+ }
+ } else {
+ if ( this.getNumChildren() == 0) {
+ // controllare anche il tipo (unknow)
+ //if (!fValue.getValueString().equals("uninitialized")) {
+ if (!fValue.getValueString().equals(oldValue.getValueString())) {
+ fValue.sethasChanged(true);
+ } else {
+ fValue.sethasChanged(false);
+ }
+ } else {
+ IVariable dummy = new XDebugVariable("UNKNOWN", "");
+ dummy.setValue("uninitialized");
+ for(int i = 0; i < newVariable.length; i++) {
+ ((XDebugVariable)newVariable[i]).setChange(dummy);
+ }
+ fValue.sethasChanged(true);
+ }
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.php.model;
+
+
+import net.sourceforge.phpeclipse.xdebug.core.Base64;
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.XDebugConnection;
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.DebugResponse;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugVariable;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IWatchExpressionDelegate;
+import org.eclipse.debug.core.model.IWatchExpressionListener;
+import org.eclipse.debug.core.model.IWatchExpressionResult;
+import org.w3c.dom.Node;
+
+public class XDebugWatchExpressionDelegate implements IWatchExpressionDelegate {
+ public void evaluateExpression(String expression, IDebugElement context, IWatchExpressionListener listener) {
+ IWatchExpressionResult x;
+ XDebugConnection connection;
+ XDebugTarget s;
+
+ x = new XDebugWatchExpressionResult(expression, null, null);
+
+ s = (XDebugTarget) context.getDebugTarget();
+ connection = (XDebugConnection) s.getDebugConnection();
+
+ if( connection != null ) {
+ try {
+ if( ! connection.isClosed() ) {
+ String encoded = Base64.encodeBytes(expression.getBytes());
+ DebugResponse evalCommand = connection.sendRequestA( "eval", "-- "+encoded );
+
+ Node evalNode = evalCommand.getParentNode();
+ XDebugVariable var= connection.getVariableFromNodeA( null, evalNode.getFirstChild());
+ XDebugVariable result[] = {var};
+
+ if (result.length == 0) {
+ x = new XDebugWatchExpressionResult(expression, null, null);
+ } else {
+ x = new XDebugWatchExpressionResult(expression, result[0].getValue(), null);
+ }
+ }
+ } catch (Exception e) {
+ String[] s1;
+
+ s1 = new String[1];
+ s1[0] = e.toString();
+ x = new XDebugWatchExpressionResult(expression, null, s1);
+ }
+ }
+
+ listener.watchEvaluationFinished(x);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.php.model;
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.model.IWatchExpressionResult;
+
+public class XDebugWatchExpressionResult implements IWatchExpressionResult {
+ private String text;
+ private IValue result;
+ private String[] err;
+
+ public XDebugWatchExpressionResult(String t, IValue v, String[] e) {
+ text = t;
+ result = v;
+ err = e;
+ }
+
+ public IValue getValue() {
+ return result;
+ }
+
+ public boolean hasErrors() {
+ return err != null;
+ }
+
+ public String[] getErrorMessages() {
+ return err;
+ }
+
+ public String getExpressionText() {
+ return text;
+ }
+
+ public DebugException getException() {
+ return null;
+ }
+}
\ No newline at end of file
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
-Bundle-Name: XDebug UI
-Bundle-SymbolicName: net.sourceforge.phpeclipse.xdebug.ui ; singleton:=true
-Bundle-Version: 0.0.1
+Bundle-Name: XDebug Ui Plug-in
+Bundle-SymbolicName: net.sourceforge.phpeclipse.xdebug.ui;singleton:=true
+Bundle-Version: 0.0.0
+Bundle-ClassPath: ui.jar
Bundle-Activator: net.sourceforge.phpeclipse.xdebug.ui.XDebugUIPlugin
-Bundle-Vendor: PHPEclipse project team
Require-Bundle: org.eclipse.core.resources,
org.eclipse.core.runtime,
org.eclipse.debug.core,
org.eclipse.debug.ui,
org.eclipse.jface.text,
org.eclipse.ui,
+ org.eclipse.ui.editors,
org.eclipse.ui.ide,
org.eclipse.ui.workbench.texteditor,
net.sourceforge.phpeclipse,
net.sourceforge.phpeclipse.externaltools,
net.sourceforge.phpeclipse.xdebug.core
-Export-Package: net.sourceforge.phpeclipse.xdebug.ui,
- net.sourceforge.phpeclipse.xdebug.ui.actions,
- net.sourceforge.phpeclipse.xdebug.ui.php.launching,
- net.sourceforge.phpeclipse.xdebug.ui.php.model,
- net.sourceforge.phpeclipse.xdebug.ui.preference
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
-source.. = src/
-output.. = bin/
+source.ui.jar = src/
+output.ui.jar = bin/
bin.includes = META-INF/,\
- .,\
- icons/,\
- plugin.xml
-src.includes = src/,\
plugin.xml,\
- icons/,\
- build.properties,\
- META-INF/,\
- .project,\
- .classpath
+ icons/
<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
+<?eclipse version="3.0"?>
<plugin>
<extension
- point="org.eclipse.debug.ui.launchConfigurationTabGroups">
- <launchConfigurationTabGroup
- class="net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPTabGroup"
- id="net.sourceforge.phpeclipse.xdebug.ui.php.launchTabGroup"
- type="net.sourceforge.phpeclipse.xdebug.php.launch"/>
+ point="org.eclipse.debug.ui.launchConfigurationTypeImages">
+ <launchConfigurationTypeImage
+ configTypeID="net.sourceforge.phpeclipse.xdebug.php.launch"
+ icon="icons/xdebug.gif"
+ id="net.sourceforge.phpeclipse.xdebug.ui.php.launchConfigurationTypeImage"/>
+ <launchConfigurationTypeImage
+ configTypeID="net.sourceforge.phpeclipse.xdebug.php.remotelaunch"
+ icon="icons/xdebug.gif"
+ id="net.sourceforge.phpeclipse.xdebug.ui.php.remoteLaunchConfigurationTypeImage"/>
</extension>
<extension
- point="org.eclipse.debug.ui.debugModelPresentations">
- <debugModelPresentation
- class="net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPDebugModelPresentation"
- id="net.sourceforge.phpeclipse.xdebug.php"/>
+ point="org.eclipse.debug.ui.launchConfigurationTabGroups">
+ <launchConfigurationTabGroup
+ class="net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPTabGroup"
+ id="net.sourceforge.phpeclipse.xdebug.ui.php.launchTabGroup"
+ type="net.sourceforge.phpeclipse.xdebug.php.launch"/>
+ <launchConfigurationTabGroup
+ class="net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPRemoteTabGroup"
+ id="net.sourceforge.phpeclipse.xdebug.ui.php.remoteLaunchTabGroup"
+ type="net.sourceforge.phpeclipse.xdebug.php.remotelaunch"/>
</extension>
<extension
- point="org.eclipse.core.runtime.adapters">
- <factory
- adaptableType="net.sourceforge.phpeclipse.phpeditor.PHPUnitEditor"
- class="net.sourceforge.phpeclipse.xdebug.ui.php.model.PHPBreakpointAdapterFactory">
- <adapter type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget"/>
- </factory>
+ point="org.eclipse.debug.ui.debugModelPresentations">
+ <debugModelPresentation
+ class="net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPDebugModelPresentation"
+ id="net.sourceforge.phpeclipse.xdebug.php"/>
</extension>
<extension
- point="org.eclipse.ui.editorActions">
- <editorContribution
- id="net.sourceforge.phpeclipse.PHPUnitEditor.BreakpointRulerActions"
- targetID="net.sourceforge.phpeclipse.phpeditor.PHPUnitEditor">
- <action
- actionID="RulerDoubleClick"
- class="net.sourceforge.phpeclipse.xdebug.ui.actions.BreakpointRulerActionDelegate"
- id="net.sourceforge.phpeclipse.xdebug.ui.ManageBreakpointRulerActions"
- label="Test label"
- />
- </editorContribution>
+ point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="net.sourceforge.phpeclipse.phpeditor.PHPUnitEditor"
+ class="net.sourceforge.phpeclipse.xdebug.ui.php.model.PHPBreakpointAdapterFactory">
+ <adapter type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget"/>
+ </factory>
</extension>
<extension
- point="org.eclipse.ui.contexts">
- <context
- id=".sourceforge.phpeclipse.debug.ui.debugging"
- name="XDebug Context"
- parentId="org.eclipse.debug.ui.debugging"/>
+ point="org.eclipse.ui.editorActions">
+ <editorContribution
+ id="net.sourceforge.phpeclipse.PHPUnitEditor.BreakpointRulerActions"
+ targetID="net.sourceforge.phpeclipse.PHPUnitEditor">
+ <action
+ actionID="RulerDoubleClick"
+ class="net.sourceforge.phpeclipse.xdebug.ui.actions.BreakpointRulerActionDelegate"
+ id="net.sourceforge.phpeclipse.xdebug.ui.ManageBreakpointRulerActions"
+ label="Toggle Breakpoint"
+ />
+ </editorContribution>
</extension>
<extension
- point="org.eclipse.ui.popupMenus">
- <viewerContribution
- id="net.sourceforge.phpeclipse.xdebug.PHPUnitEditorPopupActions"
- targetID="#PHPRulerContext">
- <action
- class="net.sourceforge.phpeclipse.xdebug.ui.actions.BreakpointRulerActionDelegate"
- helpContextId="manage_breakpoint_action_context"
- id="net.sourceforge.phpeclipse.xdebug.ui.action1"
- label="Toggle Breakpoint"
- menubarPath="debug"/>
- </viewerContribution>
+ point="org.eclipse.ui.views">
+ <view
+ category="net.sourceforge.phpeclipse.xdebug.ui"
+ class="net.sourceforge.phpeclipse.xdebug.ui.views.logview.LogView"
+ icon="icons/eview16/error_log.gif"
+ id="net.sourceforge.phpeclipse.xdebug.ui.Logview"
+ name="PHP Debug Log"/>
+ <category
+ id="net.sourceforge.phpeclipse.xdebug.ui"
+ name="PHPeclipse Debug Core"/>
</extension>
<extension
- point="org.eclipse.ui.preferencePages">
- <page
- category="net.sourceforge.phpeclipse.ui.preferencePage"
- class="net.sourceforge.phpeclipse.xdebug.ui.preference.XDebugPreferencePage"
- id="net.sourceforge.phpeclipse.xdebug.ui.XDebugPreferencePages"
- name="XDebug"/>
+ point="org.eclipse.ui.contexts">
+ <context
+ id=".sourceforge.phpeclipse.debug.ui.debugging"
+ name="XDebug Context"
+ parentId="org.eclipse.debug.ui.debugging"/>
</extension>
<extension
- point="org.eclipse.debug.ui.launchConfigurationTypeImages">
- <launchConfigurationTypeImage
- configTypeID="net.sourceforge.phpeclipse.xdebug.php.launch"
- icon="icons/obj16/xdebug.gif"
- id="net.sourceforge.phpeclipse.xdebug.ui.launchImage"/>
+ point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ id="net.sourceforge.phpeclipse.xdebug.PHPUnitEditorPopupActions"
+ targetID="#PHPRulerContext">
+ <action
+ class="net.sourceforge.phpeclipse.xdebug.ui.actions.BreakpointRulerActionDelegate"
+ helpContextId="manage_breakpoint_action_context"
+ id="net.sourceforge.phpeclipse.xdebug.ui.action1"
+ label="Toggle Breakpoint"
+ menubarPath="debug"/>
+ </viewerContribution>
</extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="net.sourceforge.phpeclipse.ui.preferencePage"
+ class="net.sourceforge.phpeclipse.xdebug.ui.preference.XDebugPreferencePage"
+ id="net.sourceforge.phpeclipse.xdebug.ui.XDebugPreferencePages"
+ name="XDebug"/>
+ </extension>
+
+
+
</plugin>
--- /dev/null
+/*
+ * Created on 12.02.2004
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package net.sourceforge.phpeclipse.xdebug.ui;
+
+import net.sourceforge.phpdt.internal.ui.dialogs.StatusDialog;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Christian
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class EditPathMapDialog extends StatusDialog {
+
+
+ private Text fLocalPathText;
+ private Text fRemotePathText;
+ private String[] fInitialValues;
+ private String fLocalPath;
+ private String fRemotePath;
+
+ public EditPathMapDialog(Shell parentShell, String aDialogTitle, String[] initialValues) {
+ super(parentShell);
+ setTitle(aDialogTitle);
+ fInitialValues= initialValues;
+ }
+
+ protected void okPressed() {
+ fLocalPath= fLocalPathText.getText();
+ fRemotePath = fRemotePathText.getText();
+ super.okPressed();
+ }
+ protected Control createDialogArea(Composite composite) {
+ Composite comp = new Composite(composite, SWT.NONE);
+ comp.setLayout(new GridLayout());
+
+ Composite fileComp= new Composite(comp,SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 3;
+// gridLayout.marginHeight = 0;
+// gridLayout.marginWidth = 0;
+ fileComp.setLayout(gridLayout);
+
+ Label label= new Label(fileComp,SWT.NONE);
+ label.setText("Local_Path");
+
+
+ fLocalPathText = new Text(fileComp,SWT.SINGLE | SWT.BORDER);
+ GridData gd = new GridData();
+ gd.widthHint=250;
+ fLocalPathText.setLayoutData(gd);
+ fLocalPathText.setText(fInitialValues[0]);
+ Button button= new Button(fileComp, SWT.PUSH);
+ button.setText("Browse");
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleBrowseButtonSelected();
+ }
+ });
+ label= new Label(fileComp,SWT.NONE);
+ label.setText("Remote Path");
+ fRemotePathText = new Text(fileComp,SWT.SINGLE | SWT.BORDER);
+ fRemotePathText.setText(fInitialValues[1]);
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan = 2;
+ fRemotePathText.setLayoutData(gd);
+
+ return composite;
+ }
+
+ public String[] getPathPair() {
+ return new String[] {fLocalPath,fRemotePath};
+ }
+
+
+ private void handleBrowseButtonSelected() {
+ DirectoryDialog dd = new DirectoryDialog(getShell(),SWT.OPEN);
+ dd.setMessage("Select the directory to map");
+ String path=dd.open();
+
+ if (path != null)
+ fLocalPathText.setText(path);
+
+ }
+
+
+}
/**
* A key/value set whose data is passed into Runtime.exec(...)
*/
-public class EnvironmentVariable {
+public class EnvironmentVariable
+{
// The name of the environment variable
private String name;
-
+
// The value of the environment variable
private String value;
-
- public EnvironmentVariable(String name, String value) {
+
+ public EnvironmentVariable(String name, String value)
+ {
this.name = name;
this.value = value;
}
*
* @return this variable's name
*/
- public String getName() {
+ public String getName()
+ {
return name;
}
-
+
/**
* Returns this variables value.
*
* @return this variable's value
*/
- public String getValue() {
+ public String getValue()
+ {
return value;
}
-
+
/**
* Sets this variable's value
- *
* @param value
*/
- public void setValue(String value) {
+ public void setValue(String value)
+ {
this.value = value;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return getName();
}
-
- /*
- * (non-Javadoc)
- *
+
+
+ /* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
boolean equal = false;
if (obj instanceof EnvironmentVariable) {
- EnvironmentVariable var = (EnvironmentVariable) obj;
+ EnvironmentVariable var = (EnvironmentVariable)obj;
equal = var.getName().equals(name);
}
- return equal;
+ return equal;
}
-
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return name.hashCode();
}
}
+
public class MultipleInputDialog extends Dialog {
protected static final String FIELD_NAME = "FIELD_NAME"; //$NON-NLS-1$
-
protected static final int TEXT = 100;
-
protected static final int BROWSE = 101;
-
protected static final int VARIABLE = 102;
-
+
protected Composite panel;
-
+
protected List fieldList = new ArrayList();
-
protected List controlList = new ArrayList();
-
protected List validators = new ArrayList();
-
protected Map valueMap = new HashMap();
private String title;
-
+
+
+
public MultipleInputDialog(Shell shell, String title) {
super(shell);
this.title = title;
setShellStyle(getShellStyle() | SWT.RESIZE);
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell shell) {
if (title != null) {
shell.setText(title);
}
-
+
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
protected Control createButtonBar(Composite parent) {
validateFields();
return bar;
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
- Composite container = (Composite) super.createDialogArea(parent);
+ Composite container = (Composite)super.createDialogArea(parent);
container.setLayout(new GridLayout(2, false));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
+
panel = new Composite(container, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
panel.setLayout(layout);
panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
+
for (Iterator i = fieldList.iterator(); i.hasNext();) {
- FieldSummary field = (FieldSummary) i.next();
- switch (field.type) {
- case TEXT:
- createTextField(field.name, field.initialValue,
- field.allowsEmpty);
- break;
- case BROWSE:
- createBrowseField(field.name, field.initialValue,
- field.allowsEmpty);
- break;
- case VARIABLE:
- createVariablesField(field.name, field.initialValue,
- field.allowsEmpty);
- break;
+ FieldSummary field = (FieldSummary)i.next();
+ switch(field.type) {
+ case TEXT:
+ createTextField(field.name, field.initialValue, field.allowsEmpty);
+ break;
+ case BROWSE:
+ createBrowseField(field.name, field.initialValue, field.allowsEmpty);
+ break;
+ case VARIABLE:
+ createVariablesField(field.name, field.initialValue, field.allowsEmpty);
+ break;
}
}
-
+
fieldList = null; // allow it to be gc'd
Dialog.applyDialogFont(container);
return container;
}
-
- public void addBrowseField(String labelText, String initialValue,
- boolean allowsEmpty) {
- fieldList.add(new FieldSummary(BROWSE, labelText, initialValue,
- allowsEmpty));
+
+ public void addBrowseField(String labelText, String initialValue, boolean allowsEmpty) {
+ fieldList.add(new FieldSummary(BROWSE, labelText, initialValue, allowsEmpty));
}
-
- public void addTextField(String labelText, String initialValue,
- boolean allowsEmpty) {
- fieldList.add(new FieldSummary(TEXT, labelText, initialValue,
- allowsEmpty));
+ public void addTextField(String labelText, String initialValue, boolean allowsEmpty) {
+ fieldList.add(new FieldSummary(TEXT, labelText, initialValue, allowsEmpty));
}
-
- public void addVariablesField(String labelText, String initialValue,
- boolean allowsEmpty) {
- fieldList.add(new FieldSummary(VARIABLE, labelText, initialValue,
- allowsEmpty));
+ public void addVariablesField(String labelText, String initialValue, boolean allowsEmpty) {
+ fieldList.add(new FieldSummary(VARIABLE, labelText, initialValue, allowsEmpty));
}
- protected void createTextField(String labelText, String initialValue,
- boolean allowEmpty) {
+ protected void createTextField(String labelText, String initialValue, boolean allowEmpty) {
Label label = new Label(panel, SWT.NONE);
label.setText(labelText);
label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
+
final Text text = new Text(panel, SWT.SINGLE | SWT.BORDER);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
text.setData(FIELD_NAME, labelText);
-
+
// make sure rows are the same height on both panels.
- label.setSize(label.getSize().x, text.getSize().y);
-
+ label.setSize(label.getSize().x, text.getSize().y);
+
if (initialValue != null) {
text.setText(initialValue);
}
-
+
if (!allowEmpty) {
validators.add(new Validator() {
public boolean validate() {
}
});
}
-
+
controlList.add(text);
}
-
- protected void createBrowseField(String labelText, String initialValue,
- boolean allowEmpty) {
+
+ protected void createBrowseField(String labelText, String initialValue, boolean allowEmpty) {
Label label = new Label(panel, SWT.NONE);
label.setText(labelText);
label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
+
Composite comp = new Composite(panel, SWT.NONE);
GridLayout layout = new GridLayout();
- layout.marginHeight = 0;
- layout.marginWidth = 0;
+ layout.marginHeight=0;
+ layout.marginWidth=0;
comp.setLayout(layout);
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
+
final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 200;
text.setData(FIELD_NAME, labelText);
// make sure rows are the same height on both panels.
- label.setSize(label.getSize().x, text.getSize().y);
-
+ label.setSize(label.getSize().x, text.getSize().y);
+
if (initialValue != null) {
text.setText(initialValue);
}
}
});
}
-
- Button button = createButton(comp, IDialogConstants.IGNORE_ID,
- "&Browse...", false);
+
+ Button button = createButton(comp, IDialogConstants.IGNORE_ID, "&Browse...", false);
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(getShell());
- dialog.setMessage("Select a file:");
+ dialog.setMessage("Select a file:");
String currentWorkingDir = text.getText();
if (!currentWorkingDir.trim().equals("")) { //$NON-NLS-1$
File path = new File(currentWorkingDir);
if (path.exists()) {
dialog.setFilterPath(currentWorkingDir);
- }
+ }
}
-
+
String selectedDirectory = dialog.open();
if (selectedDirectory != null) {
text.setText(selectedDirectory);
- }
+ }
}
});
controlList.add(text);
-
+
}
-
- public void createVariablesField(String labelText, String initialValue,
- boolean allowEmpty) {
+
+
+ public void createVariablesField(String labelText, String initialValue, boolean allowEmpty) {
Label label = new Label(panel, SWT.NONE);
label.setText(labelText);
label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
+
Composite comp = new Composite(panel, SWT.NONE);
GridLayout layout = new GridLayout();
- layout.marginHeight = 0;
- layout.marginWidth = 0;
+ layout.marginHeight=0;
+ layout.marginWidth=0;
comp.setLayout(layout);
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
+
final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 200;
text.setData(FIELD_NAME, labelText);
// make sure rows are the same height on both panels.
- label.setSize(label.getSize().x, text.getSize().y);
-
+ label.setSize(label.getSize().x, text.getSize().y);
+
if (initialValue != null) {
text.setText(initialValue);
}
}
});
}
-
- Button button = createButton(comp, IDialogConstants.IGNORE_ID,
- "Varia&bles...", false);
+
+ Button button = createButton(comp, IDialogConstants.IGNORE_ID, "Varia&bles...", false);
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
- StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(
- getShell());
+ StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
int code = dialog.open();
if (code == IDialogConstants.OK_ID) {
String variable = dialog.getVariableExpression();
});
controlList.add(text);
-
+
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
- for (Iterator i = controlList.iterator(); i.hasNext();) {
- Control control = (Control) i.next();
+ for (Iterator i = controlList.iterator(); i.hasNext(); ) {
+ Control control = (Control)i.next();
if (control instanceof Text) {
- valueMap.put(control.getData(FIELD_NAME), ((Text) control)
- .getText());
+ valueMap.put(control.getData(FIELD_NAME), ((Text)control).getText());
}
}
controlList = null;
super.okPressed();
}
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.jface.window.Window#open()
*/
public int open() {
applyDialogFont(panel);
return super.open();
}
-
+
public Object getValue(String key) {
return valueMap.get(key);
}
-
+
public String getStringValue(String key) {
- return (String) getValue(key);
+ return (String) getValue(key);
}
-
+
public void validateFields() {
- for (Iterator i = validators.iterator(); i.hasNext();) {
+ for(Iterator i = validators.iterator(); i.hasNext(); ) {
Validator validator = (Validator) i.next();
if (!validator.validate()) {
getButton(IDialogConstants.OK_ID).setEnabled(false);
getButton(IDialogConstants.OK_ID).setEnabled(true);
}
- // /* (non-Javadoc)
- // * @see
- // org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
- // */
- // protected Point getInitialLocation(Point initialSize) {
- // Point initialLocation=
- // DialogSettingsHelper.getInitialLocation(getDialogSettingsSectionName());
- // if (initialLocation != null) {
- // return initialLocation;
- // }
- // return super.getInitialLocation(initialSize);
- // }
-
+// /* (non-Javadoc)
+// * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
+// */
+// protected Point getInitialLocation(Point initialSize) {
+// Point initialLocation= DialogSettingsHelper.getInitialLocation(getDialogSettingsSectionName());
+// if (initialLocation != null) {
+// return initialLocation;
+// }
+// return super.getInitialLocation(initialSize);
+// }
+
+
protected String getDialogSettingsSectionName() {
return IDebugUIConstants.PLUGIN_ID + ".MULTIPLE_INPUT_DIALOG_2"; //$NON-NLS-1$
}
-
- // /* (non-Javadoc)
- // * @see org.eclipse.jface.window.Window#getInitialSize()
- // */
- // protected Point getInitialSize() {
- // Point size = super.getInitialSize();
- // return
- // DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(),
- // size);
- // }
-
- // /* (non-Javadoc)
- // * @see org.eclipse.jface.window.Window#close()
- // */
- // public boolean close() {
- // DialogSettingsHelper.persistShellGeometry(getShell(),
- // getDialogSettingsSectionName());
- // return super.close();
- // }
+
+// /* (non-Javadoc)
+// * @see org.eclipse.jface.window.Window#getInitialSize()
+// */
+// protected Point getInitialSize() {
+// Point size = super.getInitialSize();
+// return DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(), size);
+// }
+
+// /* (non-Javadoc)
+// * @see org.eclipse.jface.window.Window#close()
+// */
+// public boolean close() {
+// DialogSettingsHelper.persistShellGeometry(getShell(), getDialogSettingsSectionName());
+// return super.close();
+// }
protected class FieldSummary {
int type;
-
String name;
-
String initialValue;
-
boolean allowsEmpty;
-
- public FieldSummary(int type, String name, String initialValue,
- boolean allowsEmpty) {
+
+ public FieldSummary(int type, String name, String initialValue, boolean allowsEmpty) {
this.type = type;
this.name = name;
this.initialValue = initialValue;
this.allowsEmpty = allowsEmpty;
}
}
-
+
protected class Validator {
boolean validate() {
return true;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.plugin.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
/**
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
.getBundle(BUNDLE_NAME);
+
+ private static final String PLUGIN_ID ="net.sourceforge.phpeclipse.xdebug.ui";
- private static final String PLUGIN_ID = "net.sourceforge.phpeclipse.xdebug.ui";
-
- // The shared instance.
+
+ //The shared instance.
private static XDebugUIPlugin plugin;
-
+
/**
* The constructor.
*/
}
/**
- * Returns an image descriptor for the image file at the given plug-in
- * relative path.
- *
- * @param path
- * the path
+ * Returns an image descriptor for the image file at the given
+ * plug-in relative path.
+ *
+ * @param path the path
* @return the image descriptor
*/
public static ImageDescriptor getImageDescriptor(String path) {
- return AbstractUIPlugin.imageDescriptorFromPlugin(
- "net.sourceforge.phpeclipse.xdebug.ui", path);
+ return AbstractUIPlugin.imageDescriptorFromPlugin("net.sourceforge.phpeclipse.xdebug.ui", path);
}
-
+
/**
* Convenience method which returns the unique identifier of this plugin.
*/
public static String getUniqueIdentifier() {
return PLUGIN_ID;
}
-
+
/**
* Utility method with conventions
*/
- public static void errorDialog(Shell shell, String title, String message,
- IStatus s) {
- // if the 'message' resource string and the IStatus' message are the
- // same,
+ public static void errorDialog(Shell shell, String title, String message, IStatus s) {
+ // if the 'message' resource string and the IStatus' message are the same,
// don't show both in the dialog
if (s != null && message.equals(s.getMessage())) {
- message = null;
+ message= null;
}
ErrorDialog.openError(shell, title, message, s);
}
+
/**
* Utility method with conventions
*/
- public static void errorDialog(Shell shell, String title, String message,
- Throwable t) {
+ public static void errorDialog(Shell shell, String title, String message, Throwable t) {
IStatus status;
if (t instanceof CoreException) {
- status = ((CoreException) t).getStatus();
- // if the 'message' resource string and the IStatus' message are the
- // same,
+ status= ((CoreException)t).getStatus();
+ // if the 'message' resource string and the IStatus' message are the same,
// don't show both in the dialog
if (status != null && message.equals(status.getMessage())) {
- message = null;
+ message= null;
}
} else {
- status = new Status(IStatus.ERROR, getUniqueIdentifier(),
- IStatus.ERROR, "Error within Debug UI: ", t); //$NON-NLS-1$
- log(status);
+ status= new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, "Error within Debug UI: ", t); //$NON-NLS-1$
+ log(status);
}
ErrorDialog.openError(shell, title, message, status);
}
/**
* Logs the specified status with this plug-in's log.
*
- * @param status
- * status to log
+ * @param status status to log
*/
public static void log(IStatus status) {
getDefault().getLog().log(status);
}
-
+
/**
* Logs an internal error with the specified throwable
*
- * @param e
- * the exception to be logged
- */
+ * @param e the exception to be logged
+ */
public static void log(Throwable e) {
- log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR,
- "Internal Error", e));
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, "Internal Error", e));
}
-
+
/**
- * Returns the standard display to be used. The method first checks, if the
- * thread calling this method has an associated display. If so, this display
- * is returned. Otherwise the method returns the default display.
+ * Returns the standard display to be used. The method first checks, if
+ * the thread calling this method has an associated display. If so, this
+ * display is returned. Otherwise the method returns the default display.
*/
public static Display getStandardDisplay() {
Display display;
- display = Display.getCurrent();
+ display= Display.getCurrent();
if (display == null)
- display = Display.getDefault();
- return display;
+ display= Display.getDefault();
+ return display;
}
public static String getString(String key) {
return '!' + key + '!';
}
}
-
+
}
*******************************************************************************/
package net.sourceforge.phpeclipse.xdebug.ui;
+
import java.net.MalformedURLException;
import java.net.URL;
public class XDebugUIPluginImages {
+
/* Declare Common paths */
- private static URL ICON_BASE_URL = null;
+ private static URL ICON_BASE_URL= null;
static {
String pathSuffix = "icons/"; //$NON-NLS-1$
- ICON_BASE_URL = XDebugUIPlugin.getDefault().getBundle().getEntry(
- pathSuffix);
+ ICON_BASE_URL= XDebugUIPlugin.getDefault().getBundle().getEntry(pathSuffix);
}
-
+
// The plugin registry
private static ImageRegistry fgImageRegistry = null;
-
+
/*
* Set of predefined Image Descriptors.
*/
- private static final String T_OBJ = "obj16/"; //$NON-NLS-1$
- // private static final String T_OVR= "ovr16/"; //$NON-NLS-1$
-
- private static final String T_EVIEW = "eview16/"; //$NON-NLS-1$
-
- private static final String T_LCL = "elcl16/";
+ private static final String T_OBJ= "obj16/"; //$NON-NLS-1$
+// private static final String T_OVR= "ovr16/"; //$NON-NLS-1$
+ private static final String T_EVIEW= "eview16/"; //$NON-NLS-1$
+ private static final String T_LCL="elcl16/";
public static final String IMG_EVIEW_ARGUMENTS_TAB = "IMG_EVIEW_ARGUMENTS_TAB";
-
public static final String IMG_EVIEW_ENVIROMENT_TAB = "IMG_EVIEW_ENVIROMENT_TAB";
- public static final String IMG_PREV_EVENT = "IMG_PREV_EVENT";
-
- public static final String DESC_NEXT_EVENT = "DESC_NEXT_EVENT";
+
+ public static final String IMG_PREV_EVENT="IMG_PREV_EVENT";
+ public static final String DESC_NEXT_EVENT="DESC_NEXT_EVENT";
+ public static final String IMG_ERROR_ST_OBJ="IMG_ERROR_ST_OBJ";
+ public static final String IMG_WARNING_ST_OBJ="IMG_WARNING_ST_OBJ";
+ public static final String IMG_INFO_ST_OBJ="IMG_INFO_ST_OBJ";
+ public static final String IMG_ERROR_STACK_OBJ="IMG_ERROR_STACK_OBJ";
- public static final String IMG_ERROR_ST_OBJ = "IMG_ERROR_ST_OBJ";
- public static final String IMG_WARNING_ST_OBJ = "IMG_WARNING_ST_OBJ";
+ public static final String IMG_PROPERTIES = "IMG_PROPERTIES";
+// public static final String IMG_PROPERTIES_DISABLED = "IMG_PROPERTIES_DISABLED";
+ public static final String IMG_CLEAR = "IMG_CLEAR";
+// public static final String IMG_CLEAR_DISABLED = "IMG_CLEAR_DISABLED";
+ public static final String IMG_READ_LOG = "IMG_READ_LOG";
+// public static final String IMG_READ_LOG_DISABLED = "IMG_READ_LOG_DISABLED";
+ public static final String IMG_REMOVE_LOG = "IMG_REMOVE_LOG";
+// public static final String IMG_REMOVE_LOG_DISABLED = "IMG_REMOVE_LOG_DISABLED";
+ public static final String IMG_FILTER = "IMG_FILTER";
+// public static final String IMG_FILTER_DISABLED = "IMG_FILTER_DISABLED";
+ public static final String IMG_EXPORT = "IMG_EXPORT";
+// public static final String IMG_EXPORT_DISABLED = "IMG_EXPORT_DISABLED";
+ public static final String IMG_IMPORT = "IMG_IMPORT";
+// public static final String IMG_IMPORT_DISABLED = "IMG_IMPORT_DISABLED";
+ public static final String IMG_OPEN_LOG = "IMG_OPEN_LOG";
- public static final String IMG_INFO_ST_OBJ = "IMG_INFO_ST_OBJ";
- public static final String IMG_ERROR_STACK_OBJ = "IMG_ERROR_STACK_OBJ";
- public static final String IMG_PROPERTIES = "IMG_PROPERTIES";
- // public static final String IMG_PROPERTIES_DISABLED =
- // "IMG_PROPERTIES_DISABLED";
- public static final String IMG_CLEAR = "IMG_CLEAR";
-
- // public static final String IMG_CLEAR_DISABLED = "IMG_CLEAR_DISABLED";
- public static final String IMG_READ_LOG = "IMG_READ_LOG";
-
- // public static final String IMG_READ_LOG_DISABLED =
- // "IMG_READ_LOG_DISABLED";
- public static final String IMG_REMOVE_LOG = "IMG_REMOVE_LOG";
-
- // public static final String IMG_REMOVE_LOG_DISABLED =
- // "IMG_REMOVE_LOG_DISABLED";
- public static final String IMG_FILTER = "IMG_FILTER";
-
- // public static final String IMG_FILTER_DISABLED = "IMG_FILTER_DISABLED";
- public static final String IMG_EXPORT = "IMG_EXPORT";
-
- // public static final String IMG_EXPORT_DISABLED = "IMG_EXPORT_DISABLED";
- public static final String IMG_IMPORT = "IMG_IMPORT";
-
- // public static final String IMG_IMPORT_DISABLED = "IMG_IMPORT_DISABLED";
- public static final String IMG_OPEN_LOG = "IMG_OPEN_LOG";
/**
* Returns the image managed under the given key in this registry.
*
- * @param key
- * the image's key
+ * @param key the image's key
* @return the image managed under the given key
- */
+ */
public static Image get(String key) {
return getImageRegistry().get(key);
}
-
+
/**
* Returns the <code>ImageDescriptor</code> identified by the given key,
* or <code>null</code> if it does not exist.
*/
public static ImageDescriptor getImageDescriptor(String key) {
return getImageRegistry().getDescriptor(key);
- }
-
+ }
+
/*
* Helper method to access the image registry from the XDebugUIPlugin class.
*/
- public static ImageRegistry getImageRegistry() {
+ public static ImageRegistry getImageRegistry() {
if (fgImageRegistry == null) {
initializeImageRegistry();
}
return fgImageRegistry;
}
-
+
public static void initializeImageRegistry() {
- fgImageRegistry = new ImageRegistry(XDebugUIPlugin.getStandardDisplay());
+ fgImageRegistry= new ImageRegistry(XDebugUIPlugin.getStandardDisplay());
declareImages();
}
-
+
private static void declareImages() {
- declareRegistryImage(IMG_EVIEW_ARGUMENTS_TAB, T_EVIEW
- + "arguments_tab.gif"); //$NON-NLS-1$
- declareRegistryImage(IMG_EVIEW_ENVIROMENT_TAB, T_EVIEW
- + "environment_tab.gif"); //$NON-NLS-1$
-
- declareRegistryImage(IMG_ERROR_ST_OBJ, T_OBJ + "error_st_obj.gif");
- declareRegistryImage(IMG_WARNING_ST_OBJ, T_OBJ + "warning_st_obj.gif");
- declareRegistryImage(IMG_INFO_ST_OBJ, T_OBJ + "info_st_obj.gif");
- declareRegistryImage(IMG_ERROR_STACK_OBJ, T_OBJ + "error_stack.gif");
-
- declareRegistryImage(IMG_PROPERTIES, T_LCL + "properties.gif");
- // declareRegistryImage(IMG_PROPERTIES_DISABLED
- declareRegistryImage(IMG_CLEAR, T_LCL + "clear_log.gif");
- // declareRegistryImage(IMG_CLEAR_DISABLED
- declareRegistryImage(IMG_READ_LOG, T_LCL + "restore_log.gif");
- // declareRegistryImage(IMG_READ_LOG_DISABLED
- declareRegistryImage(IMG_REMOVE_LOG, T_LCL + "remove_log.gif");
- // declareRegistryImage(IMG_REMOVE_LOG_DISABLED
- declareRegistryImage(IMG_FILTER, T_LCL + "filter_log.gif");
- // declareRegistryImage(IMG_FILTER_DISABLED
- declareRegistryImage(IMG_EXPORT, T_LCL + "export_log.gif");
- // declareRegistryImage(IMG_EXPORT_DISABLED
- declareRegistryImage(IMG_IMPORT, T_LCL + "import_log.gif");
- // declareRegistryImage(IMG_IMPORT_DISABLED
- declareRegistryImage(IMG_OPEN_LOG, T_LCL + "open_log.gif");
-
- }
-
+ declareRegistryImage(IMG_EVIEW_ARGUMENTS_TAB, T_EVIEW + "arguments_tab.gif"); //$NON-NLS-1$
+ declareRegistryImage(IMG_EVIEW_ENVIROMENT_TAB, T_EVIEW + "environment_tab.gif"); //$NON-NLS-1$
+
+ declareRegistryImage(IMG_ERROR_ST_OBJ,T_OBJ+"error_st_obj.gif");
+ declareRegistryImage(IMG_WARNING_ST_OBJ,T_OBJ + "warning_st_obj.gif");
+ declareRegistryImage(IMG_INFO_ST_OBJ,T_OBJ +"info_st_obj.gif");
+ declareRegistryImage(IMG_ERROR_STACK_OBJ,T_OBJ +"error_stack.gif");
+
+ declareRegistryImage(IMG_PROPERTIES,T_LCL + "properties.gif");
+// declareRegistryImage(IMG_PROPERTIES_DISABLED
+ declareRegistryImage(IMG_CLEAR,T_LCL + "clear_log.gif");
+// declareRegistryImage(IMG_CLEAR_DISABLED
+ declareRegistryImage(IMG_READ_LOG ,T_LCL + "restore_log.gif");
+// declareRegistryImage(IMG_READ_LOG_DISABLED
+ declareRegistryImage(IMG_REMOVE_LOG,T_LCL + "remove_log.gif");
+// declareRegistryImage(IMG_REMOVE_LOG_DISABLED
+ declareRegistryImage(IMG_FILTER,T_LCL + "filter_log.gif");
+// declareRegistryImage(IMG_FILTER_DISABLED
+ declareRegistryImage(IMG_EXPORT,T_LCL + "export_log.gif");
+// declareRegistryImage(IMG_EXPORT_DISABLED
+ declareRegistryImage(IMG_IMPORT,T_LCL + "import_log.gif");
+// declareRegistryImage(IMG_IMPORT_DISABLED
+ declareRegistryImage(IMG_OPEN_LOG,T_LCL + "open_log.gif");
+
+ }
+
/**
* Declare an Image in the registry table.
- *
- * @param key
- * The key to use when registering the image
- * @param path
- * The path where the image can be found. This path is relative
- * to where this plugin class is found (i.e. typically the
- * packages directory)
+ * @param key The key to use when registering the image
+ * @param path The path where the image can be found. This path is relative to where
+ * this plugin class is found (i.e. typically the packages directory)
*/
private final static void declareRegistryImage(String key, String path) {
- ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
+ ImageDescriptor desc= ImageDescriptor.getMissingImageDescriptor();
try {
- desc = ImageDescriptor.createFromURL(makeIconFileURL(path));
+ desc= ImageDescriptor.createFromURL(makeIconFileURL(path));
} catch (MalformedURLException me) {
XDebugUIPlugin.log(me);
}
fgImageRegistry.put(key, desc);
- }
-
- private static URL makeIconFileURL(String iconPath)
- throws MalformedURLException {
+ }
+
+ private static URL makeIconFileURL(String iconPath) throws MalformedURLException {
if (ICON_BASE_URL == null) {
throw new MalformedURLException();
}
-
+
return new URL(ICON_BASE_URL, iconPath);
- }
+ }
+
+
+
}
import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
import org.eclipse.ui.texteditor.ITextEditor;
+
+
public class BreakpointRulerActionDelegate extends AbstractRulerActionDelegate {
private ToggleBreakpointRulerAction fTargetAction;
protected IAction createAction(ITextEditor editor,
IVerticalRulerInfo rulerInfo) {
- fTargetAction = new ToggleBreakpointRulerAction(editor, rulerInfo);
+ fTargetAction = new ToggleBreakpointRulerAction( editor, rulerInfo );
return fTargetAction;
}
/**********************************************************************
- Copyright (c) 2000, 2002 IBM Corp. and others.
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Common Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/cpl-v10.html
-
- Contributors:
- IBM Corporation - Initial implementation
- Vicente Fernando - www.alfersoft.com.ar
- **********************************************************************/
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+ Vicente Fernando - www.alfersoft.com.ar
+**********************************************************************/
package net.sourceforge.phpeclipse.xdebug.ui.actions;
import net.sourceforge.phpeclipse.xdebug.ui.XDebugUIPlugin;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
-public class ToggleBreakpointRulerAction extends Action {
-
+public class ToggleBreakpointRulerAction extends Action {
+
static class EmptySelection implements ISelection {
public boolean isEmpty() {
return true;
- }
+ }
}
-
+
private IVerticalRulerInfo fRuler;
-
private IWorkbenchPart fTargetPart;
-
private PHPLineBreakpointAdapter fBreakpointAdapter;
+ private static final ISelection EMPTY_SELECTION = new EmptySelection();
+
+ public ToggleBreakpointRulerAction( IWorkbenchPart part, IVerticalRulerInfo ruler ) {
+ super( "Toggle Breakpoint" ); //$NON-NLS-1$
- private static final ISelection EMPTY_SELECTION = new EmptySelection();
-
- public ToggleBreakpointRulerAction(IWorkbenchPart part,
- IVerticalRulerInfo ruler) {
- super("Toggle Breakpoint"); //$NON-NLS-1$
-
- fRuler = ruler;
+ fRuler= ruler;
fRuler = ruler;
- setTargetPart(part);
+ setTargetPart( part );
fBreakpointAdapter = new PHPLineBreakpointAdapter();
- // part.getSite().getWorkbenchWindow().getWorkbench().getHelpSystem().setHelp(
- // this, ICDebugHelpContextIds.TOGGLE_BREAKPOINT_ACTION );
- // setId( IInternalCDebugUIConstants.ACTION_TOGGLE_BREAKPOINT );
+// part.getSite().getWorkbenchWindow().getWorkbench().getHelpSystem().setHelp( this, ICDebugHelpContextIds.TOGGLE_BREAKPOINT_ACTION );
+// setId( IInternalCDebugUIConstants.ACTION_TOGGLE_BREAKPOINT );
}
-
+
+
/**
* @see Action#run()
*/
public void run() {
try {
- fBreakpointAdapter.toggleLineBreakpoints(getTargetPart(),
- getTargetSelection());
- } catch (CoreException e) {
- XDebugUIPlugin.errorDialog(getTargetPart().getSite().getShell(),
- "Error", "Operation failed", e.getStatus());
+ fBreakpointAdapter.toggleLineBreakpoints( getTargetPart(), getTargetSelection() );
+ }
+ catch( CoreException e ) {
+ XDebugUIPlugin.errorDialog( getTargetPart().getSite().getShell(),"Error", "Operation failed" , e.getStatus() );
}
}
-
+
/**
* Returns this action's vertical ruler info.
- *
+ *
* @return this action's vertical ruler
*/
protected IVerticalRulerInfo getVerticalRulerInfo() {
return this.fTargetPart;
}
- private void setTargetPart(IWorkbenchPart targetPart) {
+ private void setTargetPart( IWorkbenchPart targetPart ) {
this.fTargetPart = targetPart;
}
/**
- * Returns the current selection in the active part, possibly and empty
- * selection, but never <code>null</code>.
+ * Returns the current selection in the active part, possibly
+ * and empty selection, but never <code>null</code>.
*
* @return the selection in the active part, possibly empty
*/
private ISelection getTargetSelection() {
IDocument doc = getDocument();
- if (doc != null) {
- int line = getVerticalRulerInfo()
- .getLineOfLastMouseButtonActivity();
+ if ( doc != null ) {
+ int line = getVerticalRulerInfo().getLineOfLastMouseButtonActivity();
try {
- IRegion region = doc.getLineInformation(line);
- return new TextSelection(doc, region.getOffset(), region
- .getLength());
- } catch (BadLocationException e) {
- DebugPlugin.log(e);
+ IRegion region = doc.getLineInformation( line );
+ return new TextSelection( doc, region.getOffset(), region.getLength() );
}
+ catch( BadLocationException e ) {
+ DebugPlugin.log( e );
+ }
}
return EMPTY_SELECTION;
}
private IDocument getDocument() {
IWorkbenchPart targetPart = getTargetPart();
- if (targetPart instanceof ITextEditor) {
- ITextEditor textEditor = (ITextEditor) targetPart;
+ if ( targetPart instanceof ITextEditor ) {
+ ITextEditor textEditor = (ITextEditor)targetPart;
IDocumentProvider provider = textEditor.getDocumentProvider();
- if (provider != null)
- return provider.getDocument(textEditor.getEditorInput());
+ if ( provider != null )
+ return provider.getDocument( textEditor.getEditorInput() );
}
- // else if ( targetPart instanceof DisassemblyView ) {
- // DisassemblyView dv = (DisassemblyView)targetPart;
- // IDocumentProvider provider = dv.getDocumentProvider();
- // if ( provider != null )
- // return provider.getDocument( dv.getInput() );
- // }
+// else if ( targetPart instanceof DisassemblyView ) {
+// DisassemblyView dv = (DisassemblyView)targetPart;
+// IDocumentProvider provider = dv.getDocumentProvider();
+// if ( provider != null )
+// return provider.getDocument( dv.getInput() );
+// }
return null;
}
package net.sourceforge.phpeclipse.xdebug.ui.php.launching;
+
+
+import java.io.File;
+
import net.sourceforge.phpeclipse.xdebug.php.model.XDebugLineBreakpoint;
import net.sourceforge.phpeclipse.xdebug.php.model.XDebugStackFrame;
import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.IValueDetailListener;
+import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
public class PHPDebugModelPresentation implements IDebugModelPresentation {
+
+ class StorageEditorInput extends PlatformObject implements
+ IStorageEditorInput {
+ private File fFile;
+
+ private IStorage fStorage;
+
+ public StorageEditorInput(IStorage storage, File file) {
+ super();
+ fStorage = storage;
+ fFile = file;
+ }
+
+ public IStorage getStorage() {
+ return fStorage;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getName() {
+ return getStorage().getName();
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return getStorage().getFullPath().toOSString();
+ }
+
+ public boolean equals(Object object) {
+ return object instanceof StorageEditorInput
+ && getStorage().equals(
+ ((StorageEditorInput) object).getStorage());
+ }
+
+ public int hashCode() {
+ return getStorage().hashCode();
+ }
+
+ public boolean exists() {
+ return fFile.exists();
+ }
+ }
+
public void setAttribute(String attribute, Object value) {
// TODO Auto-generated method stub
return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT);
} else if (element instanceof IMarker) {
return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT);
- } else if (element instanceof XDebugStackFrame
- || element instanceof XDebugThread
- || element instanceof XDebugTarget) {
+ } else if (element instanceof XDebugStackFrame || element instanceof XDebugThread || element instanceof XDebugTarget) {
return null;
} else if (element instanceof XDebugVariable) {
- return getVariableImage((XDebugVariable) element);
+ return getVariableImage((XDebugVariable)element);
} else if (element instanceof XDebugValue) {
- return getValueImage((XDebugValue) element);
+ return getValueImage((XDebugValue)element);
}
return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT);
}
-
private Image getVariableImage(XDebugVariable phpVar) {
- /*
- * if (phpVar != null) { if (phpVar.isLocal()) return
- * DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE); if
- * (phpVar.isHashValue()) return
- * DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE); }
+ /* if (phpVar != null) {
+ if (phpVar.isLocal())
+ return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE);
+ if (phpVar.isHashValue())
+ return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE);
+ }
*/
return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE);
}
-
+
private Image getValueImage(XDebugValue phpVar) {
if (phpVar != null) {
return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE);
return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE);
}
+
public String getText(Object element) {
// TODO Auto-generated method stub
return null;
public IEditorInput getEditorInput(Object element) {
if (element instanceof IFile) {
- return new FileEditorInput((IFile) element);
+ return new FileEditorInput((IFile)element);
+ }
+ if( element instanceof LocalFileStorage) {
+ LocalFileStorage lfc= (LocalFileStorage)element;
+ return new StorageEditorInput(lfc,lfc.getFile());
}
if (element instanceof ILineBreakpoint) {
- return new FileEditorInput((IFile) ((ILineBreakpoint) element)
- .getMarker().getResource());
+ return new FileEditorInput((IFile)((ILineBreakpoint)element).getMarker().getResource());
}
return null;
}
public String getEditorId(IEditorInput input, Object element) {
- IEditorRegistry registry = PlatformUI.getWorkbench()
- .getEditorRegistry();
- IEditorDescriptor descriptor = registry.getDefaultEditor(input
- .getName());
+ IEditorRegistry registry= PlatformUI.getWorkbench().getEditorRegistry();
+ IEditorDescriptor descriptor= registry.getDefaultEditor(input.getName());
if (descriptor != null)
return descriptor.getId();
-
+
return null;
}
EnvironmentVariable existingVariable = (EnvironmentVariable) items[i]
.getData();
if (existingVariable.getName().equals(name)) {
- boolean overWrite = MessageDialog
- .openQuestion(
- getShell(),
- "Overwrite variable?",
- MessageFormat
- .format(
- "A variable named {0} already exists. Overwrite?",
- new String[] { name }));
+ boolean overWrite = MessageDialog.openQuestion(getShell(),"Overwrite variable?",
+ MessageFormat.format("A variable named {0} already exists. Overwrite?",new String[] { name }));
if (!overWrite) {
return false;
}
*
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
*/
- public Image getImage() {
- return XDebugUIPluginImages
- .get(XDebugUIPluginImages.IMG_EVIEW_ENVIROMENT_TAB);
+ public Image getImage() {
+ return XDebugUIPluginImages.get(XDebugUIPluginImages.IMG_EVIEW_ENVIROMENT_TAB);
}
/*
}
protected IDialogSettings getDialogSettings() {
- IDialogSettings settings = XDebugCorePlugin.getDefault()
- .getDialogSettings();
+// IDialogSettings settings = XDebugCorePlugin.getDefault().getDialogSettings();
+ IDialogSettings settings = getDialogSettings();
IDialogSettings section = settings
.getSection(getDialogSettingsSectionName());
if (section == null) {
// * @see org.eclipse.jface.window.Window#getInitialSize()
// */
// protected Point getInitialSize() {
- // Point size = super.getInitialSize();
- // return
- // DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(),
- // size);
- // }
-
- // /* (non-Javadoc)
- // * @see org.eclipse.jface.window.Window#close()
- // */
- // public boolean close() {
- // DialogSettingsHelper.persistShellGeometry(getShell(),
- // getDialogSettingsSectionName());
- // return super.close();
- // }
+ // Point size = super.getInitialSize();
+ // return DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(), size);
+ // }
+
+ // /* (non-Javadoc)
+ // * @see org.eclipse.jface.window.Window#close()
+ // */
+ // public boolean close() {
+ // DialogSettingsHelper.persistShellGeometry(getShell(), getDialogSettingsSectionName());
+ // return super.close();
+ // }
}
}
package net.sourceforge.phpeclipse.xdebug.ui.php.launching;
import java.io.File;
+//import java.text.MessageFormat;
import net.sourceforge.phpdt.internal.ui.PHPUiImages;
import net.sourceforge.phpdt.internal.ui.util.PHPFileSelector;
import net.sourceforge.phpdt.internal.ui.util.PHPProjectSelector;
-import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+//import net.sourceforge.phpeclipse.xdebug.core.IXDebugPreferenceConstants;
+//import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
public class PHPMainTab extends AbstractLaunchConfigurationTab {
// Project UI widgets
protected Text fProjText;
-
protected Button fProjButton;
// Main class UI widgets
protected Text fMainText;
-
protected Button fSearchButton;
-
protected PHPProjectSelector projectSelector;
-
protected PHPFileSelector fileSelector;
-
private Button fUseDefaultInterpreterButton;
-
private Button fInterpreterButton;
-
private Text fInterpreterText;
public PHPMainTab() {
public void createControl(Composite parent) {
Font font = parent.getFont();
-
+
Composite comp = new Composite(parent, SWT.NONE);
setControl(comp);
- // PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
- // IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB);
+// PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB);
GridLayout topLayout = new GridLayout();
topLayout.verticalSpacing = 0;
comp.setLayout(topLayout);
comp.setFont(font);
-
+
createProjectEditor(comp);
createVerticalSpacer(comp, 1);
createMainTypeEditor(comp);
createVerticalSpacer(comp, 1);
createInterpreterEditor(comp);
}
-
+
/**
* Creates the widgets for specifying a main type.
*
- * @param parent
- * the parent composite
+ * @param parent the parent composite
*/
private void createProjectEditor(Composite parent) {
- Font font = parent.getFont();
- Group group = new Group(parent, SWT.NONE);
+ Font font= parent.getFont();
+ Group group= new Group(parent, SWT.NONE);
group.setText("Project:");
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
group.setLayoutData(gd);
group.setFont(font);
projectSelector = new PHPProjectSelector(group);
- projectSelector
- .setBrowseDialogMessage("Choose the project containing the application entry point:");
+ projectSelector.setBrowseDialogMessage("Choose the project containing the application entry point:");
projectSelector.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
projectSelector.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent evt) {
updateLaunchConfigurationDialog();
}
});
- }
+ }
+
/**
* Creates the widgets for specifying a php file.
*
- * @param parent
- * the parent composite
+ * @param parent the parent composite
*/
private void createMainTypeEditor(Composite parent) {
- Font font = parent.getFont();
- Group mainGroup = new Group(parent, SWT.NONE);
- mainGroup.setText("File: ");
+ Font font= parent.getFont();
+ Group mainGroup= new Group(parent, SWT.NONE);
+ mainGroup.setText("File: ");
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
mainGroup.setLayoutData(gd);
GridLayout layout = new GridLayout();
mainGroup.setFont(font);
fileSelector = new PHPFileSelector(mainGroup, projectSelector);
- fileSelector
- .setBrowseDialogMessage("Choose the PHP file that represents the application entry point:");
+ fileSelector.setBrowseDialogMessage("Choose the PHP file that represents the application entry point:");
fileSelector.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fileSelector.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent evt) {
}
});
}
-
+
/**
* Creates the widgets for specifying debug settings.
*
- * @param parent
- * the parent composite
+ * @param parent the parent composite
*/
private void createInterpreterEditor(Composite parent) {
- Font font = parent.getFont();
- Group interpreterGroup = new Group(parent, SWT.NONE);
- interpreterGroup.setText("Interpreter: ");
+ Font font= parent.getFont();
+ Group interpreterGroup= new Group(parent, SWT.NONE);
+ interpreterGroup.setText("Interpreter: ");
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
interpreterGroup.setLayoutData(gd);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
interpreterGroup.setLayout(layout);
interpreterGroup.setFont(font);
-
- fInterpreterText = new Text(interpreterGroup, SWT.SINGLE | SWT.BORDER);
- gd = new GridData(GridData.FILL_HORIZONTAL);
+
+ fInterpreterText= new Text(interpreterGroup, SWT.SINGLE | SWT.BORDER);
+ gd= new GridData(GridData.FILL_HORIZONTAL);
fInterpreterText.setLayoutData(gd);
fInterpreterText.setFont(font);
fInterpreterText.addModifyListener(new ModifyListener() {
}
});
- fInterpreterButton = createPushButton(interpreterGroup, "Browse..",
- null);
+
+ fInterpreterButton= createPushButton(interpreterGroup,"Browse..", null);
fInterpreterButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
handleBrowseSellected(event);
}
});
-
- fUseDefaultInterpreterButton = new Button(interpreterGroup, SWT.CHECK);
+
+ fUseDefaultInterpreterButton = new Button(interpreterGroup,SWT.CHECK);
fUseDefaultInterpreterButton.setText("Use default interpreter");
gd = new GridData(GridData.FILL_HORIZONTAL);
fUseDefaultInterpreterButton.setLayoutData(gd);
fUseDefaultInterpreterButton.setFont(font);
- fUseDefaultInterpreterButton
- .addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent event) {
- handleDefaultSellected(event);
- }
- });
+ fUseDefaultInterpreterButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ handleDefaultSellected(event);
+ }
+ });
}
-
+
/**
* Set the appropriate enabled state for the appletviewqer text widget.
*/
fInterpreterButton.setEnabled(true);
}
}
-
+
/**
* Returns whether the default appletviewer is to be used
*/
return fUseDefaultInterpreterButton.getSelection();
}
+
+
protected void handleDefaultSellected(SelectionEvent event) {
setInterpreterTextEnabledState();
updateLaunchConfigurationDialog();
- // if (isDefaultInterpreter()) {
- // fInterpreterText.setText("default Interpreter");
- // }
+// if (isDefaultInterpreter()) {
+// fInterpreterText.setText("default Interpreter");
+// }
}
protected void handleBrowseSellected(SelectionEvent event) {
- FileDialog dlg = new FileDialog(getShell(), SWT.OPEN);
- String fileName = dlg.open();
- if (fileName != null) {
+ FileDialog dlg=new FileDialog(getShell(),SWT.OPEN);
+ String fileName=dlg.open();
+ if (fileName!=null) {
fInterpreterText.setText(fileName);
updateLaunchConfigurationDialog();
}
}
protected IProject getContext() {
- IWorkbenchPage page = XDebugCorePlugin.getDefault().getWorkbench()
- .getActiveWorkbenchWindow().getActivePage();
+ IWorkbenchPage page= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
if (page != null) {
ISelection selection = page.getSelection();
if (selection instanceof IStructuredSelection) {
}
return null;
}
+
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
IProject project = getContext();
if (project != null)
- configuration.setAttribute(IXDebugConstants.ATTR_PHP_PROJECT,
- project.getName());
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_PROJECT, project.getName());
}
+
public void initializeFrom(ILaunchConfiguration configuration) {
try {
- String project = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_PROJECT, (String) null);
+ String project = configuration.getAttribute(IXDebugConstants.ATTR_PHP_PROJECT, (String)null);
if (project != null) {
projectSelector.setSelectionText(project);
}
- String file = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_FILE, (String) null);
+ String file = configuration.getAttribute(IXDebugConstants.ATTR_PHP_FILE, (String)null);
if (file != null) {
fileSelector.setSelectionText(file);
}
-
- String interpreterFile = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_INTERPRETER, (String) null);
- if (interpreterFile != null)
+
+ String interpreterFile=configuration.getAttribute(IXDebugConstants.ATTR_PHP_INTERPRETER, (String) null);
+ if(interpreterFile!=null)
fInterpreterText.setText(interpreterFile);
- boolean selection = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_DEFAULT_INTERPRETER, true);
+ boolean selection=configuration.getAttribute(IXDebugConstants.ATTR_PHP_DEFAULT_INTERPRETER, true);
fUseDefaultInterpreterButton.setSelection(selection);
setInterpreterTextEnabledState();
configuration.setAttribute(IXDebugConstants.ATTR_PHP_PROJECT, project);
IFile file = fileSelector.getSelection();
- configuration.setAttribute(IXDebugConstants.ATTR_PHP_FILE,
- file == null ? "" : file.getProjectRelativePath().toString());
- configuration.setAttribute(
- IXDebugConstants.ATTR_PHP_DEFAULT_INTERPRETER,
- this.fUseDefaultInterpreterButton.getSelection());
- configuration.setAttribute(IXDebugConstants.ATTR_PHP_INTERPRETER,
- this.fInterpreterText.getText());
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_FILE, file == null ? "" : file.getProjectRelativePath()
+ .toString());
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_DEFAULT_INTERPRETER, this.fUseDefaultInterpreterButton.getSelection());
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_INTERPRETER, this.fInterpreterText.getText());
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
*/
public boolean isValid(ILaunchConfiguration launchConfig) {
setErrorMessage(null);
- String projectName = projectSelector.getSelectionText().trim();
- IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
- projectName);
+ String projectName=projectSelector.getSelectionText().trim();
+ IProject project=ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if (!project.exists()) {
setErrorMessage("Project does not exist");
return false;
}
- String fileName = fileSelector.getSelectionText().trim();
- if (fileName.equals("")) {
- setErrorMessage("No file selected.");
- return false;
- }
- IFile file = project.getFile(fileName);
- if (!file.exists()) {
+ String fileString=fileSelector.getSelectionText().trim();
+ if (!"".equals(fileString)) {
+ IFile file=project.getFile(fileSelector.getSelectionText().trim());
+ if (!file.exists()) {
+ setErrorMessage("File does not exist");
+ return false;
+ }
+ } else {
setErrorMessage("File does not exist");
return false;
}
- if (!fUseDefaultInterpreterButton.getSelection()) {
+ if (!fUseDefaultInterpreterButton.getSelection()) {
File exe = new File(fInterpreterText.getText());
System.out.println(exe.toString());
if (!exe.exists()) {
}
return true;
}
-
+
public Image getImage() {
return PHPUiImages.get(PHPUiImages.IMG_CTOOLS_PHP_PAGE);
}
-
+
public String getName() {
return "Main";
}
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.ui.php.launching;
+
+import java.text.MessageFormat;
+//import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+//import java.util.Map;
+import java.util.Vector;
+
+import net.sourceforge.phpeclipse.xdebug.core.PathMapItem;
+import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
+import net.sourceforge.phpeclipse.xdebug.ui.EditPathMapDialog;
+/*import net.sourceforge.phpeclipse.xdebug.ui.EnvironmentVariable;
+import net.sourceforge.phpeclipse.xdebug.ui.MultipleInputDialog;
+import net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPEnvironmentTab.EnvironmentVariableContentProvider;
+import net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPEnvironmentTab.EnvironmentVariableLabelProvider;
+*/
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+//import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+//import org.eclipse.jface.viewers.ViewerSorter;
+//import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+public class PHPPathMapTab extends AbstractLaunchConfigurationTab {
+ protected TableViewer fPathMapTable;
+ protected Button fAddButton;
+ protected Button envAddCGIButton;
+ protected Button fEditButton;
+ protected Button fRemoveButton;
+ protected Button fUpButton;
+ protected Button fDownButton;
+
+
+ protected String[] fPathMapTableColumnHeaders = { "Local", "Remote" };
+
+ protected ColumnLayoutData[] fPathMapTableColumnLayouts = {
+ new ColumnWeightData(50), new ColumnWeightData(50) };
+
+ protected static final String P_REMOTE = "remote"; //$NON-NLS-1$
+ protected static final String P_LOCAL = "local"; //$NON-NLS-1$
+ protected static String[] fPathMapTableColumnProperties = { P_REMOTE, P_LOCAL };
+
+
+ /**
+ * Content provider for the environment table
+ */
+ protected class PathMapContentProvider implements IStructuredContentProvider {
+ public Object[] getElements(Object inputElement) {
+ PathMapItem[] elements = new PathMapItem[0];
+ ILaunchConfiguration config = (ILaunchConfiguration) inputElement;
+ List l;
+ try {
+ l = config.getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null);
+ } catch (CoreException e) {
+ XDebugCorePlugin.log(new Status(IStatus.ERROR,
+ XDebugCorePlugin.PLUGIN_ID, IStatus.ERROR,
+ "Error reading configuration", e)); //$NON-NLS-1$
+ return elements;
+ }
+ if (l != null && !l.isEmpty()) {
+ elements = new PathMapItem[l.size()];
+ for (int i = 0; i < l.size(); i++) {
+ elements[i] = new PathMapItem((String) l.get(i));
+ }
+ }
+
+ return elements;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ /**
+ * Label provider for the environment table
+ */
+ public class PathMapItemLabelProvider extends LabelProvider
+ implements ITableLabelProvider {
+ public String getColumnText(Object element, int columnIndex) {
+ String result = null;
+ if (element != null) {
+ PathMapItem var = (PathMapItem) element;
+ switch (columnIndex) {
+ case 0: // local
+ result = var.getLocalPath().toOSString();
+ break;
+ case 1: // remote
+ result = var.getRemotePath().toString();
+ break;
+ }
+ }
+ return result;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+ }
+
+
+ public void createControl(Composite parent) {
+ // Create main composite
+ Composite mainComposite = new Composite(parent, SWT.NONE);
+ setControl(mainComposite);
+ // WorkbenchHelp.setHelp(getControl(),
+ // IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ENVIRONMENT_TAB);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ mainComposite.setLayout(layout);
+ mainComposite.setLayoutData(gridData);
+ mainComposite.setFont(parent.getFont());
+
+ createPathMapTable(mainComposite);
+ createTableButtons(mainComposite);
+
+ Dialog.applyDialogFont(mainComposite);
+ }
+
+ /**
+ * Creates the add/edit/remove buttons for the environment table
+ *
+ * @param parent
+ * the composite in which the buttons should be created
+ */
+ protected void createTableButtons(Composite parent) {
+ // Create button composite
+ Composite buttonComposite = new Composite(parent, SWT.NONE);
+ GridLayout glayout = new GridLayout();
+ glayout.marginHeight = 0;
+ glayout.marginWidth = 0;
+ glayout.numColumns = 1;
+ GridData gdata = new GridData(GridData.VERTICAL_ALIGN_BEGINNING
+ | GridData.HORIZONTAL_ALIGN_END);
+ buttonComposite.setLayout(glayout);
+ buttonComposite.setLayoutData(gdata);
+ buttonComposite.setFont(parent.getFont());
+
+ createVerticalSpacer(buttonComposite, 1);
+ // Create buttons
+ fAddButton = createPushButton(buttonComposite, "New", null);
+ fAddButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ handleAddButtonSelected();
+ }
+ });
+
+ fEditButton = createPushButton(buttonComposite, "Edit", null);
+ fEditButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ handleEditButtonSelected();
+ }
+ });
+ fEditButton.setEnabled(false);
+
+ fRemoveButton = createPushButton(buttonComposite, "Remove", null);
+ fRemoveButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ handleRemoveButtonSelected();
+ }
+ });
+ fRemoveButton.setEnabled(false);
+
+ fUpButton = createPushButton(buttonComposite, "Up", null);
+ fUpButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ handleUpButtonSelected();
+ }
+ });
+ fUpButton.setEnabled(false);
+
+ fDownButton = createPushButton(buttonComposite, "Down", null);
+ fDownButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ handleDownButtonSelected();
+ }
+ });
+ fDownButton.setEnabled(false);
+ }
+
+
+ /**
+ * Creates and configures the table that displayed the key/value pairs that
+ * comprise the environment.
+ *
+ * @param parent
+ * the composite in which the table should be created
+ */
+ protected void createPathMapTable(Composite parent) {
+ Font font = parent.getFont();
+ // Create table composite
+ Composite tableComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.numColumns = 1;
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 150;
+ tableComposite.setLayout(layout);
+ tableComposite.setLayoutData(gridData);
+ tableComposite.setFont(font);
+ // Create label
+ Label label = new Label(tableComposite, SWT.NONE);
+ label.setFont(font);
+ label.setText("&Map remote path to local path");
+ // Create table
+ fPathMapTable = new TableViewer(tableComposite, SWT.BORDER
+ | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
+ Table table = fPathMapTable.getTable();
+ TableLayout tableLayout = new TableLayout();
+ table.setLayout(tableLayout);
+ table.setHeaderVisible(true);
+ table.setFont(font);
+ gridData = new GridData(GridData.FILL_BOTH);
+ fPathMapTable.getControl().setLayoutData(gridData);
+ fPathMapTable.setContentProvider(new PathMapContentProvider());
+ fPathMapTable.setLabelProvider(new PathMapItemLabelProvider());
+ fPathMapTable.setColumnProperties(fPathMapTableColumnProperties);
+ fPathMapTable.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ handleTableSelectionChanged(event);
+ }
+ });
+ fPathMapTable.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ if (!fPathMapTable.getSelection().isEmpty()) {
+ handleEditButtonSelected();
+ }
+ }
+ });
+ // Create columns
+ for (int i = 0; i < fPathMapTableColumnHeaders.length; i++) {
+ tableLayout.addColumnData(fPathMapTableColumnLayouts[i]);
+ TableColumn tc = new TableColumn(table, SWT.NONE, i);
+ tc.setResizable(fPathMapTableColumnLayouts[i].resizable);
+ tc.setText(fPathMapTableColumnHeaders[i]);
+ }
+ }
+
+ /**
+ * Responds to a selection changed event in the environment table
+ * @param event the selection change event
+ */
+ protected void handleTableSelectionChanged(SelectionChangedEvent event) {
+ int size = ((IStructuredSelection)event.getSelection()).size();
+ int idx = fPathMapTable.getTable().getSelectionIndex();
+ int count = fPathMapTable.getTable().getItemCount();
+ if (size==1) {
+ fEditButton.setEnabled(idx>0);
+ fUpButton.setEnabled(idx>0);
+ fDownButton.setEnabled((idx>=0)&&(idx<count-1));
+ }
+
+ fRemoveButton.setEnabled(size > 0);
+ }
+
+ /**
+ * Creates an editor for the value of the selected environment variable.
+ */
+ private void handleUpButtonSelected() {
+ IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+ PathMapItem mapItem = (PathMapItem) sel.getFirstElement();
+ boolean found=false;
+ if (mapItem == null) {
+ return;
+ }
+ IPath local = mapItem.getLocalPath();
+ TableItem[] items = fPathMapTable.getTable().getItems();
+ int i;
+ for (i = 0; i < items.length; i++) {
+ PathMapItem item = (PathMapItem) items[i].getData();
+ if (item.getLocalPath().equals(local)) {
+ found=true;
+ break;
+ }
+ }
+ if ((i>0) && found) {
+ fPathMapTable.getControl().setRedraw(false);
+ fPathMapTable.remove(mapItem);
+ fPathMapTable.insert(mapItem,i-1);
+ fPathMapTable.getControl().setRedraw(true);
+ fPathMapTable.setSelection(new StructuredSelection(mapItem),true);
+ updateLaunchConfigurationDialog();
+ }
+ }
+
+ private void handleDownButtonSelected() {
+ IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+ PathMapItem mapItem = (PathMapItem) sel.getFirstElement();
+ boolean found=false;
+ if (mapItem == null) {
+ return;
+ }
+ IPath local = mapItem.getLocalPath();
+ TableItem[] items = fPathMapTable.getTable().getItems();
+ int i;
+ for (i = 0; i < items.length; i++) {
+ PathMapItem item = (PathMapItem) items[i].getData();
+ if (item.getLocalPath().equals(local)) {
+ found=true;
+ break;
+ }
+ }
+
+ if ((i<items.length-1) && found) {
+ fPathMapTable.getControl().setRedraw(false);
+ fPathMapTable.remove(mapItem);
+ fPathMapTable.insert(mapItem,i+1);
+ fPathMapTable.getControl().setRedraw(true);
+ fPathMapTable.setSelection(new StructuredSelection(mapItem),true);
+ updateLaunchConfigurationDialog();
+ }
+ }
+
+ /**
+ * Creates an editor for the value of the selected environment variable.
+ */
+ private void handleEditButtonSelected() {
+ IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+ PathMapItem item = (PathMapItem) sel.getFirstElement();
+ if (item == null) {
+ return;
+ }
+
+ EditPathMapDialog dialog = new EditPathMapDialog(getShell(), "Edit pathmap", new String[] { item.getLocalPath().toString(),item.getRemotePath().toString() });
+
+ if (dialog.open() != EditPathMapDialog.OK) {
+ return;
+ }
+ String[] pathPair = dialog.getPathPair();
+ String newLocalPath=pathPair[0];
+ String newRemotePath=pathPair[1];
+
+ if (!item.getLocalPath().toString().equals(newLocalPath)) {
+ if (addVariable(new PathMapItem(newLocalPath,newRemotePath))) {
+ fPathMapTable.remove(item);
+ }
+ } else {
+ item.setRemotePath(newRemotePath);
+ fPathMapTable.update(item, null);
+ updateLaunchConfigurationDialog();
+ }
+ }
+
+ /**
+ * Adds a new environment variable to the table.
+ */
+ protected void handleAddButtonSelected() {
+ EditPathMapDialog dialog = new EditPathMapDialog(getShell(), "Edit File Map", new String[] { "", "" });
+ if (dialog.open() != EditPathMapDialog.OK) {
+ return;
+ }
+ String[] pathPair = dialog.getPathPair();
+
+ Path local = new Path(pathPair[0]);
+ Path remote = new Path(pathPair[1]);
+
+ String strlocal = local.toString();
+ String strremote = remote.toString();
+ if (strlocal != null && strremote != null && strlocal.length() > 0 && strremote.length() > 0) {
+ addVariable(new PathMapItem(strlocal,strremote));
+ }
+ }
+
+ /**
+ * Removes the selected environment variable from the table.
+ */
+ private void handleRemoveButtonSelected() {
+ IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+ fPathMapTable.getControl().setRedraw(false);
+ for (Iterator i = sel.iterator(); i.hasNext();) {
+ PathMapItem item = (PathMapItem) i.next();
+ fPathMapTable.remove(item);
+ }
+ fPathMapTable.getControl().setRedraw(true);
+ updateLaunchConfigurationDialog();
+ }
+
+ /**
+ * Attempts to add the given variable. Returns whether the variable was
+ * added or not (as when the user answers not to overwrite an existing
+ * variable).
+ *
+ * @param variable the variable to add
+ * @return whether the variable was added
+ */
+ protected boolean addVariable(PathMapItem mapItem) {
+ IPath local = mapItem.getLocalPath();
+ TableItem[] items = fPathMapTable.getTable().getItems();
+ for (int i = 0; i < items.length; i++) {
+ PathMapItem item = (PathMapItem) items[i].getData();
+ if (item.getLocalPath().equals(local)) {
+ boolean overWrite = MessageDialog.openQuestion(getShell(),"Overwrite variable?",
+ MessageFormat.format("A local path named {0} already exists. Overwrite?",new String[] { local.toString() }));
+ if (!overWrite) {
+ return false;
+ }
+ fPathMapTable.remove(item);
+ break;
+ }
+ }
+ fPathMapTable.add(mapItem);
+ updateLaunchConfigurationDialog();
+ return true;
+ }
+
+
+
+ public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void initializeFrom(ILaunchConfiguration configuration) {
+ fPathMapTable.setInput(configuration);
+ }
+
+ public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+ // Convert the table's items into a List so that this can be saved in the
+ // configuration's attributes.
+ TableItem[] items = fPathMapTable.getTable().getItems();
+ List vec = new Vector(items.length);
+ for (int i = 0; i < items.length; i++) {
+ PathMapItem item = (PathMapItem) items[i].getData();
+ vec.add(item.getStringData());
+ }
+ if (vec.size() == 0) {
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null);
+ } else {
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, vec);
+ }
+ }
+
+ public String getName() {
+ return "Pathmap";
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.ui.php.launching;
+
+import net.sourceforge.phpdt.internal.ui.PHPUiImages;
+import net.sourceforge.phpdt.internal.ui.util.PHPProjectSelector;
+//import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
+import net.sourceforge.phpeclipse.xdebug.ui.EditPathMapDialog;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+//import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+//import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+//import org.eclipse.swt.events.MouseAdapter;
+//import org.eclipse.swt.events.MouseEvent;
+//import org.eclipse.swt.events.SelectionAdapter;
+//import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+//import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+//import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+//import org.eclipse.swt.widgets.Table;
+//import org.eclipse.swt.widgets.TableColumn;
+//import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+public class PHPRemoteDebug extends AbstractLaunchConfigurationTab {
+
+ private PHPProjectSelector projectSelector;
+ private Text fIdeIDText;
+ private Text fRemoteLocationText;
+
+ public void createControl(Composite parent) {
+ Font font = parent.getFont();
+
+ Composite comp = new Composite(parent, SWT.NONE);
+ setControl(comp);
+// PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB);
+ GridLayout topLayout = new GridLayout();
+ topLayout.verticalSpacing = 0;
+ comp.setLayout(topLayout);
+ comp.setFont(font);
+
+ createProjectEditor(comp);
+ createVerticalSpacer(comp, 1);
+ createIdeIDEditor(comp);
+
+ }
+
+ /**
+ * Creates the widgets for specifying a main type.
+ *
+ * @param parent the parent composite
+ */
+ private void createProjectEditor(Composite parent) {
+ Font font= parent.getFont();
+ Group group= new Group(parent, SWT.NONE);
+ group.setText("Project:");
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ group.setLayoutData(gd);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ group.setLayout(layout);
+ group.setFont(font);
+
+ projectSelector = new PHPProjectSelector(group);
+ projectSelector.setBrowseDialogMessage("Choose the project containing the application entry point:");
+ projectSelector.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ projectSelector.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent evt) {
+ updateLaunchConfigurationDialog();
+ }
+ });
+
+ Label remoteLabel= new Label(group,SWT.NONE);
+ remoteLabel.setText("Remote Location:");
+
+ fRemoteLocationText = new Text(group,SWT.SINGLE | SWT.BORDER);
+ gd= new GridData(GridData.FILL_HORIZONTAL);
+ fRemoteLocationText.setLayoutData(gd);
+ fRemoteLocationText.setFont(font);
+ fRemoteLocationText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent evt) {
+ updateLaunchConfigurationDialog();
+ }
+ });
+ }
+
+ private void createIdeIDEditor(Composite parent) {
+ Font font= parent.getFont();
+ Group group= new Group(parent, SWT.NONE);
+ group.setText("Ide Identification String :");
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ group.setLayoutData(gd);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ group.setLayout(layout);
+ group.setFont(font);
+
+
+ fIdeIDText = new Text(group, SWT.SINGLE | SWT.BORDER);
+ gd= new GridData(GridData.FILL_HORIZONTAL);
+ fIdeIDText.setLayoutData(gd);
+ fIdeIDText.setFont(font);
+ fIdeIDText.setTextLimit(48);
+ fIdeIDText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent evt) {
+ updateLaunchConfigurationDialog();
+ }
+ });
+
+ }
+
+
+
+ protected IProject getContext() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ //IWorkbenchPage page= XDebugCorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ ISelection selection = page.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection ss = (IStructuredSelection) selection;
+ if (!ss.isEmpty()) {
+ Object obj = ss.getFirstElement();
+ if (obj instanceof IResource)
+ return ((IResource) obj).getProject();
+ }
+ }
+ IEditorPart part = page.getActiveEditor();
+ if (part != null) {
+ IEditorInput input = part.getEditorInput();
+ IResource file = (IResource) input.getAdapter(IResource.class);
+ if (file != null) {
+ return file.getProject();
+ }
+ }
+ }
+ return null;
+ }
+
+ public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+ IProject project = getContext();
+ if (project != null)
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_PROJECT, project.getName());
+ }
+
+ public void initializeFrom(ILaunchConfiguration configuration) {
+ try {
+ String project = configuration.getAttribute(IXDebugConstants.ATTR_PHP_PROJECT, (String)null);
+ if (project != null) {
+ projectSelector.setSelectionText(project);
+ }
+ String ideID = configuration.getAttribute(IXDebugConstants.ATTR_PHP_IDE_ID, "testID");
+ fIdeIDText.setText(ideID);
+
+ String remoteLocation=configuration.getAttribute(IXDebugConstants.ATTR_PHP_REMOTE_LOCATION, "");
+ fRemoteLocationText.setText(remoteLocation);
+
+ } catch (CoreException e) {
+ setErrorMessage(e.getMessage());
+ }
+
+
+
+ }
+
+ public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+ String project = projectSelector.getSelectionText().trim();
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_PROJECT, project);
+ String ideID = fIdeIDText.getText().trim();
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_IDE_ID, ideID);
+ String remoteLocation = fRemoteLocationText.getText().trim();
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_REMOTE_LOCATION, remoteLocation);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
+ */
+ public boolean isValid(ILaunchConfiguration launchConfig) {
+ setErrorMessage(null);
+ String projectName=projectSelector.getSelectionText().trim();
+ IProject project=ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+ if (!project.exists()) {
+ setErrorMessage("Project does not exist");
+ return false;
+ }
+ String ideID=fIdeIDText.getText();
+ if (ideID.indexOf(' ')>0) {
+ setErrorMessage("No spaces in Identification String allowed");
+ return false;
+ }
+ return true;
+ }
+
+ public Image getImage() {
+ return PHPUiImages.get(PHPUiImages.IMG_CTOOLS_PHP_PAGE);
+ }
+
+ public String getName() {
+ return "Main";
+ }
+
+
+}
--- /dev/null
+package net.sourceforge.phpeclipse.xdebug.ui.php.launching;
+
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
+
+public class PHPRemoteTabGroup extends AbstractLaunchConfigurationTabGroup {
+
+ public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
+ setTabs(new ILaunchConfigurationTab[] {
+ new PHPRemoteDebug(),
+ new PHPPathMapTab(),
+ new SourceLookupTab(),
+ new CommonTab()
+ });
+
+ }
+
+}
public class PHPTabGroup extends AbstractLaunchConfigurationTabGroup {
+
public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
- setTabs(new ILaunchConfigurationTab[] { new PHPMainTab(),
- new XDebugTab(), new SourceLookupTab(),
- new PHPEnvironmentTab(), new CommonTab() });
+ setTabs(new ILaunchConfigurationTab[] {
+ new PHPMainTab(),
+// new XDebugTab(),
+ new SourceLookupTab(),
+ new PHPEnvironmentTab(),
+ new CommonTab()
+ });
}
}
public class XDebugTab extends AbstractLaunchConfigurationTab {
private Label fPortLabel;
-
private Button fUseDefaultPortButton;
-
private Text fPortText;
public XDebugTab() {
public void createControl(Composite parent) {
Font font = parent.getFont();
-
+
Composite comp = new Composite(parent, SWT.NONE);
setControl(comp);
- // PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
- // IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB);
+// PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB);
GridLayout topLayout = new GridLayout();
topLayout.verticalSpacing = 0;
comp.setLayout(topLayout);
createDebugPortEditor(comp);
}
-
+
private void createDebugPortEditor(Composite parent) {
- Font font = parent.getFont();
- Group debugGroup = new Group(parent, SWT.NONE);
- debugGroup.setText("Debug: ");
+ Font font= parent.getFont();
+ Group debugGroup= new Group(parent, SWT.NONE);
+ debugGroup.setText("Debug: ");
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
debugGroup.setLayoutData(gd);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
debugGroup.setLayout(layout);
debugGroup.setFont(font);
-
+
fPortLabel = new Label(debugGroup, SWT.NONE);
fPortLabel.setText("&DebugPort:");
- // gd = new GridData(GridData.BEGINNING);
- // fPortLabel.setLayoutData(gd);
+// gd = new GridData(GridData.BEGINNING);
+// fPortLabel.setLayoutData(gd);
fPortLabel.setFont(font);
+
fPortText = new Text(debugGroup, SWT.SINGLE | SWT.BORDER);
- gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd= new GridData(GridData.FILL_HORIZONTAL);
fPortText.setLayoutData(gd);
fPortText.setFont(font);
fPortText.addModifyListener(new ModifyListener() {
}
});
- fUseDefaultPortButton = new Button(debugGroup, SWT.CHECK);
+
+
+ fUseDefaultPortButton = new Button(debugGroup,SWT.CHECK);
fUseDefaultPortButton.setText("Use default interpreter");
gd = new GridData(GridData.FILL_HORIZONTAL);
fUseDefaultPortButton.setLayoutData(gd);
}
});
}
-
+
/**
* Set the appropriate enabled state for the appletviewqer text widget.
*/
fPortLabel.setEnabled(true);
}
}
-
+
/**
* Returns whether the default appletviewer is to be used
*/
return fUseDefaultPortButton.getSelection();
}
+
protected void handleDefaultSellected(SelectionEvent event) {
setDebugportEnabledState();
updateLaunchConfigurationDialog();
}
+
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
// TODO Auto-generated method stub
public void initializeFrom(ILaunchConfiguration configuration) {
try {
- String portText = ""
- + configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_DEBUGPORT, 9000);
+ String portText=""+configuration.getAttribute(IXDebugConstants.ATTR_PHP_DEBUGPORT, 9000);
fPortText.setText(portText);
- boolean selection = configuration.getAttribute(
- IXDebugConstants.ATTR_PHP_DEFAULT_DEBUGPORT, true);
+ boolean selection=configuration.getAttribute(IXDebugConstants.ATTR_PHP_DEFAULT_DEBUGPORT, true);
fUseDefaultPortButton.setSelection(selection);
setDebugportEnabledState();
} catch (CoreException e) {
setErrorMessage(e.getMessage());
}
+
}
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
- configuration.setAttribute(IXDebugConstants.ATTR_PHP_DEFAULT_DEBUGPORT,
- this.fUseDefaultPortButton.getSelection());
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_DEFAULT_DEBUGPORT, this.fUseDefaultPortButton.getSelection());
try {
- configuration.setAttribute(IXDebugConstants.ATTR_PHP_DEBUGPORT,
- Integer.parseInt(this.fPortText.getText().trim()));
+ configuration.setAttribute(IXDebugConstants.ATTR_PHP_DEBUGPORT, Integer.parseInt(this.fPortText.getText().trim()));
} catch (NumberFormatException nfe) {
}
}
-
- /*
- * (non-Javadoc)
- *
+
+ /* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
*/
public boolean isValid(ILaunchConfiguration launchConfig) {
setErrorMessage(null);
try {
Integer.parseInt(fPortText.getText().trim());
- } catch (NumberFormatException nfe) {
- setErrorMessage("Debugport is not a valid integer");
+ } catch(NumberFormatException nfe) {
+ setErrorMessage("Debugport is not a valid integer");
return false;
}
return true;
}
public Class[] getAdapterList() {
- return new Class[] { IToggleBreakpointsTarget.class };
+ return new Class[]{IToggleBreakpointsTarget.class};
}
}
public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection)
throws CoreException {
- IEditorPart editorPart = (IEditorPart) part;
+ IEditorPart editorPart = (IEditorPart)part;
- IResource resource = (IResource) editorPart.getEditorInput()
- .getAdapter(IResource.class);
+ IResource resource = (IResource) editorPart.getEditorInput().getAdapter(IResource.class);
ITextSelection textSelection = (ITextSelection) selection;
- int lineNumber = textSelection.getStartLine() + 1;
- IBreakpoint[] breakpoints = DebugPlugin.getDefault()
- .getBreakpointManager().getBreakpoints(
- IXDebugConstants.ID_PHP_DEBUG_MODEL);
+ int lineNumber = textSelection.getStartLine()+1;
+ IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(IXDebugConstants.ID_PHP_DEBUG_MODEL);
for (int i = 0; i < breakpoints.length; i++) {
IBreakpoint breakpoint = breakpoints[i];
if (resource.equals(breakpoint.getMarker().getResource())) {
- if (((ILineBreakpoint) breakpoint).getLineNumber() == (lineNumber)) {
- // remove
+ if (((ILineBreakpoint)breakpoint).getLineNumber() == (lineNumber )) {
+ // remove
breakpoint.delete();
return;
}
}
}
- // create line breakpoint (doc line numbers start at 0)
- XDebugLineBreakpoint lineBreakpoint = new XDebugLineBreakpoint(
- resource, lineNumber);
- // DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(lineBreakpoint);
-
+ // create line breakpoint (doc line numbers start at 0)
+ XDebugLineBreakpoint lineBreakpoint = new XDebugLineBreakpoint(resource, lineNumber);
+ DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(lineBreakpoint);
+
}
public boolean canToggleLineBreakpoints(IWorkbenchPart part,
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
+
public class XDebugPreferencePage extends FieldEditorPreferencePage implements
IWorkbenchPreferencePage {
/* Preference page for the default XDebug-Settings */
+
+ private IntegerFieldEditor debugPort;
public XDebugPreferencePage() {
super(FieldEditorPreferencePage.GRID);
// Set the preference store for the preference page.
- IPreferenceStore store = XDebugCorePlugin.getDefault()
- .getPreferenceStore();
- store.setDefault(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE,
- IXDebugPreferenceConstants.DEFAULT_DEBUGPORT);
- // get the default form the externalToolsPlugin
- String interpreter = ExternalToolsPlugin.getDefault()
- .getPreferenceStore().getString(
- ExternalToolsPlugin.PHP_RUN_PREF);
- store.setDefault(IXDebugPreferenceConstants.PHP_INTERPRETER_PREFERENCE,
- interpreter);
+ IPreferenceStore store =
+ XDebugCorePlugin.getDefault().getPreferenceStore();
+ store.setDefault(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE,IXDebugPreferenceConstants.DEFAULT_DEBUGPORT);
+ // get the default form the externalToolsPlugin
+ String interpreter=ExternalToolsPlugin.getDefault().getPreferenceStore().getString(ExternalToolsPlugin.PHP_RUN_PREF);
+ store.setDefault(IXDebugPreferenceConstants.PHP_INTERPRETER_PREFERENCE,interpreter);
setPreferenceStore(store);
}
}
protected void createFieldEditors() {
- IntegerFieldEditor debugPort = new IntegerFieldEditor(
- IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE, "&Debugport:",
- getFieldEditorParent(), 5);
- debugPort.setValidRange(1025, 65535);
+ debugPort = new IntegerFieldEditor(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE, "&Debugport:", getFieldEditorParent(),5);
+ debugPort.setValidRange(1025,65535);
+
debugPort.setErrorMessage("Debugport must be between 1024 and 65536");
addField(debugPort);
-
- FileFieldEditor phpInterpreter = new FileFieldEditor(
- IXDebugPreferenceConstants.PHP_INTERPRETER_PREFERENCE,
- "PHP &Interpreter:", true, getFieldEditorParent());
- phpInterpreter.setErrorMessage("File not found");
+
+ FileFieldEditor phpInterpreter = new FileFieldEditor(IXDebugPreferenceConstants.PHP_INTERPRETER_PREFERENCE, "PHP &Interpreter:",true,getFieldEditorParent());
+ phpInterpreter.setErrorMessage("File not found");
addField(phpInterpreter);
-
+
+ }
+
+ public void performApply() {
+ super.performApply();
+ XDebugCorePlugin.getDefault().setProxyPort(debugPort.getIntValue());
}
+
+
+
}