Importing the XDebugProxy code in the HEAD. The repo was tagged with T_BEFORE_XDEBUGP...
authorpombredanne <pombredanne>
Thu, 6 Dec 2007 20:48:20 +0000 (20:48 +0000)
committerpombredanne <pombredanne>
Thu, 6 Dec 2007 20:48:20 +0000 (20:48 +0000)
67 files changed:
net.sourceforge.phpeclipse.xdebug.core/META-INF/MANIFEST.MF
net.sourceforge.phpeclipse.xdebug.core/build.properties
net.sourceforge.phpeclipse.xdebug.core/plugin.xml
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/AbstractDebugConnection.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/Base64.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/BreakpointResponseData.java [deleted file]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/DebugConnection.java [deleted file]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IDebugConnection.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IPHPDebugEvent.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IProxyEventListener.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IXDebugPreferenceConstants.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ListenerList.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ListenerMap.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/PHPDebugUtils.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/PathMapItem.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ResponseData.java [deleted file]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/XDebugCorePlugin.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/XDebugProxy.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/ResponseList.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/ResponseListener.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/XDebugConnection.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/IXDebugConstants.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPLaunchConfigurationDelegate.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPRemoteLaunchConfigurationDelegate.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPSourceLookupDirector.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPSourceLookupParticipant.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPSourcePathComputerDelegate.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugAbstractValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugArrayValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugBooleanValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugElement.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugFloatValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugIntValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugLineBreakpoint.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugObjectValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugResourceValue.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStackFrame.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStringValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugTarget.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugThread.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugValue.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugVariable.java
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugWatchExpressionDelegate.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugWatchExpressionResult.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.ui/META-INF/MANIFEST.MF
net.sourceforge.phpeclipse.xdebug.ui/build.properties
net.sourceforge.phpeclipse.xdebug.ui/icons/obj16/xdebug.gif [deleted file]
net.sourceforge.phpeclipse.xdebug.ui/icons/xdebug.gif [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.ui/plugin.xml
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/EditPathMapDialog.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/EnvironmentVariable.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/MultipleInputDialog.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/XDebugUIPlugin.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/XDebugUIPluginImages.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/actions/BreakpointRulerActionDelegate.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/actions/ToggleBreakpointRulerAction.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPDebugModelPresentation.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPEnvironmentTab.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPMainTab.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPPathMapTab.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPRemoteDebug.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPRemoteTabGroup.java [new file with mode: 0644]
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPTabGroup.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/XDebugTab.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/model/PHPBreakpointAdapterFactory.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/model/PHPLineBreakpointAdapter.java
net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/preference/XDebugPreferencePage.java

index 823ab16..48ca86f 100644 (file)
@@ -1,20 +1,18 @@
 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
index 6132541..2ef0d6b 100644 (file)
@@ -3,9 +3,3 @@ output.core.jar = bin/
 bin.includes = META-INF/,\
                core.jar,\
                plugin.xml
-src.includes = src/,\
-               plugin.xml,\
-               build.properties,\
-               META-INF/,\
-               .project,\
-               .classpath
index 5f73f82..69af34e 100644 (file)
             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>
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/AbstractDebugConnection.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/AbstractDebugConnection.java
new file mode 100644 (file)
index 0000000..e3efc17
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * 
+ */
+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
index 1499af2..64cd0ae 100644 (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
-        *      &lt;i&gt;Note: Technically, this makes your encoding non-compliant.&lt;/i&gt;
-        * </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
-        *      &lt;i&gt;Note: Technically, this makes your encoding non-compliant.&lt;/i&gt;
-        * </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
-        *      &lt;i&gt;Note: Technically, this makes your encoding non-compliant.&lt;/i&gt;
-        * </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)
-                *      &lt;i&gt;Note: Technically, this makes your encoding non-compliant.&lt;/i&gt;
-                * </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)
-                *      &lt;i&gt;Note: Technically, this makes your encoding non-compliant.&lt;/i&gt;
-                * </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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/BreakpointResponseData.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/BreakpointResponseData.java
deleted file mode 100644 (file)
index b0f3444..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-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;
-       }
-
-}
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/DebugConnection.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/DebugConnection.java
deleted file mode 100644 (file)
index e28b56b..0000000
+++ /dev/null
@@ -1,431 +0,0 @@
-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);
-       }
-
-}
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IDebugConnection.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IDebugConnection.java
new file mode 100644 (file)
index 0000000..0dfd129
--- /dev/null
@@ -0,0 +1,116 @@
+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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IPHPDebugEvent.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IPHPDebugEvent.java
new file mode 100644 (file)
index 0000000..a35e9ac
--- /dev/null
@@ -0,0 +1,9 @@
+package net.sourceforge.phpeclipse.xdebug.core;
+
+public interface IPHPDebugEvent {
+
+       int BREAKPOINT_HIT = 0;
+       int STEP_END = 1;
+       int STOPPED = 2;
+
+}
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IProxyEventListener.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/IProxyEventListener.java
new file mode 100644 (file)
index 0000000..c3ac70b
--- /dev/null
@@ -0,0 +1,7 @@
+package net.sourceforge.phpeclipse.xdebug.core;
+
+
+public interface IProxyEventListener {
+       public void handleProxyEvent(String ideKey, String initString, AbstractDebugConnection connectin);
+
+}
index 0662af4..51486ae 100644 (file)
@@ -2,8 +2,6 @@ package net.sourceforge.phpeclipse.xdebug.core;
 
 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";
 }
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ListenerList.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ListenerList.java
new file mode 100644 (file)
index 0000000..e6cc007
--- /dev/null
@@ -0,0 +1,128 @@
+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;
+       }
+}
+
+
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ListenerMap.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ListenerMap.java
new file mode 100644 (file)
index 0000000..9b51572
--- /dev/null
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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
index 8bdba0b..8b377a7 100644 (file)
@@ -7,52 +7,51 @@ import org.w3c.dom.NamedNodeMap;
 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();
 
        }
 
+
 }
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/PathMapItem.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/PathMapItem.java
new file mode 100644 (file)
index 0000000..dbe28ac
--- /dev/null
@@ -0,0 +1,132 @@
+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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ResponseData.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/ResponseData.java
deleted file mode 100644 (file)
index 58e4b9b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-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;
-       }
-}
index a7ffee0..bbba27c 100644 (file)
@@ -1,28 +1,34 @@
 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.
         */
@@ -42,6 +48,8 @@ public class XDebugCorePlugin extends AbstractUIPlugin {
         */
        public void stop(BundleContext context) throws Exception {
                super.stop(context);
+               if (fXDebugProxy != null)
+                       fXDebugProxy.stop();
                plugin = null;
        }
 
@@ -51,33 +59,22 @@ public class XDebugCorePlugin extends AbstractUIPlugin {
        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) {
@@ -85,15 +82,38 @@ public class XDebugCorePlugin extends AbstractUIPlugin {
        }
 
        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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/XDebugProxy.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/XDebugProxy.java
new file mode 100644 (file)
index 0000000..3d6396a
--- /dev/null
@@ -0,0 +1,281 @@
+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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/ResponseList.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/ResponseList.java
new file mode 100644 (file)
index 0000000..af980d4
--- /dev/null
@@ -0,0 +1,34 @@
+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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/ResponseListener.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/ResponseListener.java
new file mode 100644 (file)
index 0000000..d700859
--- /dev/null
@@ -0,0 +1,347 @@
+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;
+       }
+       
+}
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/XDebugConnection.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/xdebug/XDebugConnection.java
new file mode 100644 (file)
index 0000000..c2d800c
--- /dev/null
@@ -0,0 +1,538 @@
+/**
+ * 
+ */
+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
index 9dc1bac..a6a3bad 100644 (file)
@@ -4,37 +4,40 @@ package net.sourceforge.phpeclipse.xdebug.php.launching;
  * 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";
 
 }
+
index 5880ca0..d464f64 100644 (file)
@@ -18,6 +18,7 @@ import java.util.Iterator;
 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;
@@ -38,118 +39,104 @@ import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
 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));
        }
 
 }
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPRemoteLaunchConfigurationDelegate.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPRemoteLaunchConfigurationDelegate.java
new file mode 100644 (file)
index 0000000..6ac355d
--- /dev/null
@@ -0,0 +1,50 @@
+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
index b570c4b..7c1ffaa 100644 (file)
@@ -1,12 +1,25 @@
 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
index 59cdae3..3e7a34d 100644 (file)
@@ -1,12 +1,27 @@
 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();
@@ -14,4 +29,127 @@ public class PHPSourceLookupParticipant extends AbstractSourceLookupParticipant
                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
index 909cb8d..60f3455 100644 (file)
@@ -1,5 +1,6 @@
 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;
@@ -10,39 +11,30 @@ import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate;
 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);
                        }
@@ -50,8 +42,8 @@ public class PHPSourcePathComputerDelegate implements
                if (sourceContainer == null) {
                        sourceContainer = new WorkspaceSourceContainer();
                }
-               return new ISourceContainer[] { sourceContainer };
-
+               return new ISourceContainer[]{sourceContainer};
+       
        }
 
 }
index a3c7cdd..37494f7 100644 (file)
@@ -17,158 +17,319 @@ import org.w3c.dom.NodeList;
 
 /**
  * @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
index e7075f8..f0117cd 100644 (file)
@@ -8,15 +8,20 @@ public class XDebugArrayValue extends XDebugAbstractValue {
                        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) {
index 678a955..113f7c2 100644 (file)
@@ -8,47 +8,51 @@ public class XDebugBooleanValue extends XDebugAbstractValue {
                        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;
        }
index 7242bd4..b103f17 100644 (file)
@@ -3,7 +3,8 @@
  */
 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;
@@ -16,53 +17,51 @@ import org.eclipse.debug.core.model.IDebugTarget;
 
 /**
  * @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) {
@@ -71,65 +70,56 @@ public class XDebugElement extends PlatformObject implements IDebugElement {
                }
                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
index 03a6439..0086c2a 100644 (file)
@@ -4,23 +4,29 @@ import org.w3c.dom.Node;
 
 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) {
index 9002c3e..31a35e1 100644 (file)
@@ -4,24 +4,30 @@ import org.w3c.dom.Node;
 
 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);
@@ -30,7 +36,7 @@ public class XDebugIntValue extends XDebugAbstractValue {
                }
                return true;
        }
-
+       
        public String toString() {
                return fValueString;
        }
index bdfe73d..a626e8c 100644 (file)
@@ -1,3 +1,4 @@
+
 /*
  * Created on 25.11.2004
  *
@@ -6,6 +7,7 @@
  */
 package net.sourceforge.phpeclipse.xdebug.php.model;
 
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -20,96 +22,85 @@ import org.eclipse.debug.core.DebugPlugin;
 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);
@@ -117,35 +108,34 @@ public class XDebugLineBreakpoint extends LineBreakpoint {
                        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);
        }
 }
index 2f3c66d..370e44d 100644 (file)
@@ -10,18 +10,18 @@ public class XDebugObjectValue extends XDebugAbstractValue {
        }
 
        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) {
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugResourceValue.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugResourceValue.java
new file mode 100644 (file)
index 0000000..2ce4f1c
--- /dev/null
@@ -0,0 +1,40 @@
+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
index 575520d..1bc38bb 100644 (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
index b2d0231..17168e3 100644 (file)
@@ -5,28 +5,34 @@ import org.w3c.dom.Node;
 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;
        }
index 04099c4..9f31828 100644 (file)
  */
 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.
@@ -401,7 +426,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget,
                        breakpointAdded(breakpoints[i]);
                }
        }
-
+       
        /**
         * Called when this debug target terminates.
         */
@@ -411,228 +436,181 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget,
                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
index 5c7b936..366badf 100644 (file)
@@ -16,77 +16,91 @@ import org.eclipse.debug.core.model.IThread;
 
 /**
  * @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 {
@@ -94,24 +108,18 @@ public class XDebugThread extends XDebugElement implements IThread,
                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() {
@@ -120,171 +128,140 @@ public class XDebugThread extends XDebugElement implements IThread,
                }
                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;
@@ -292,12 +269,10 @@ public class XDebugThread extends XDebugElement implements IThread,
 
        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
index 72a1e70..62f9347 100644 (file)
@@ -7,19 +7,28 @@ public class XDebugValue extends XDebugAbstractValue {
        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;
        }
 
index 21663d3..969c718 100644 (file)
 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 {
@@ -139,72 +147,58 @@ public class XDebugVariable extends XDebugElement implements IVariable {
                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.
         * 
@@ -213,15 +207,24 @@ public class XDebugVariable extends XDebugElement implements IVariable {
        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);
        }
@@ -237,7 +240,7 @@ public class XDebugVariable extends XDebugElement implements IVariable {
        public void setEncoding(String encoding) {
                fEncoding = encoding;
        }
-
+       
        public String toString() {
                return fValue.toString();
        }
@@ -246,4 +249,64 @@ public class XDebugVariable extends XDebugElement implements IVariable {
                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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugWatchExpressionDelegate.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugWatchExpressionDelegate.java
new file mode 100644 (file)
index 0000000..64dbc32
--- /dev/null
@@ -0,0 +1,53 @@
+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
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugWatchExpressionResult.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugWatchExpressionResult.java
new file mode 100644 (file)
index 0000000..4e702f9
--- /dev/null
@@ -0,0 +1,37 @@
+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
index a7b83a3..f304999 100644 (file)
@@ -1,25 +1,21 @@
 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
index 4f6be16..845c8ca 100644 (file)
@@ -1,13 +1,5 @@
-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/
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/icons/obj16/xdebug.gif b/net.sourceforge.phpeclipse.xdebug.ui/icons/obj16/xdebug.gif
deleted file mode 100644 (file)
index 35382c7..0000000
Binary files a/net.sourceforge.phpeclipse.xdebug.ui/icons/obj16/xdebug.gif and /dev/null differ
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/icons/xdebug.gif b/net.sourceforge.phpeclipse.xdebug.ui/icons/xdebug.gif
new file mode 100644 (file)
index 0000000..449bb66
Binary files /dev/null and b/net.sourceforge.phpeclipse.xdebug.ui/icons/xdebug.gif differ
index 5ad53ff..db39686 100644 (file)
@@ -1,73 +1,96 @@
 <?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>
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/EditPathMapDialog.java b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/EditPathMapDialog.java
new file mode 100644 (file)
index 0000000..6f1e882
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Created on 12.02.2004
+ *
+ * To change the template for this generated file go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;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&gt;Preferences&gt;Java&gt;Code Generation&gt;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);
+               
+       }
+
+
+}
index 293bfe4..f615429 100644 (file)
@@ -3,14 +3,16 @@ package net.sourceforge.phpeclipse.xdebug.ui;
 /**
  * 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;
        }
@@ -21,57 +23,54 @@ public class EnvironmentVariable {
         * 
         * @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();
        }
 }
+
index 0f23c3e..3af109a 100644 (file)
@@ -28,34 +28,28 @@ import org.eclipse.swt.widgets.Text;
 
 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) {
@@ -63,12 +57,10 @@ public class MultipleInputDialog extends Dialog {
                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) {
@@ -76,80 +68,66 @@ public class MultipleInputDialog extends Dialog {
                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() {
@@ -162,23 +140,22 @@ public class MultipleInputDialog extends Dialog {
                                }
                        });
                }
-
+               
                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;
@@ -186,8 +163,8 @@ public class MultipleInputDialog extends Dialog {
                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);
                }
@@ -205,45 +182,44 @@ public class MultipleInputDialog extends Dialog {
                                }
                        });
                }
-
-               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;
@@ -251,8 +227,8 @@ public class MultipleInputDialog extends Dialog {
                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);
                }
@@ -270,13 +246,11 @@ public class MultipleInputDialog extends Dialog {
                                }
                        });
                }
-
-               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();
@@ -288,46 +262,42 @@ public class MultipleInputDialog extends Dialog {
                });
 
                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);
@@ -337,60 +307,52 @@ public class MultipleInputDialog extends Dialog {
                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;
index a069314..03dc4a5 100644 (file)
@@ -3,14 +3,14 @@ package net.sourceforge.phpeclipse.xdebug.ui;
 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;
 
 /**
@@ -22,12 +22,13 @@ public class XDebugUIPlugin extends AbstractUIPlugin {
 
        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.
         */
@@ -58,57 +59,51 @@ public class XDebugUIPlugin extends AbstractUIPlugin {
        }
 
        /**
-        * 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);
        }
@@ -116,35 +111,32 @@ public class XDebugUIPlugin extends AbstractUIPlugin {
        /**
         * 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) {
@@ -154,5 +146,5 @@ public class XDebugUIPlugin extends AbstractUIPlugin {
                        return '!' + key + '!';
                }
        }
-
+       
 }
index 1c48a08..69e49cc 100644 (file)
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package net.sourceforge.phpeclipse.xdebug.ui;
 
+
 import java.net.MalformedURLException;
 import java.net.URL;
 
@@ -19,160 +20,143 @@ import org.eclipse.swt.graphics.Image;
 
 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);
-       }
+       }       
+
+
+
 
 }
index d222c4e..5f906be 100644 (file)
@@ -5,13 +5,15 @@ import org.eclipse.jface.text.source.IVerticalRulerInfo;
 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;
        }
 
index 98e294d..d6a03d2 100644 (file)
@@ -1,14 +1,14 @@
 /**********************************************************************
- 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;
@@ -27,52 +27,47 @@ import org.eclipse.ui.IWorkbenchPart;
 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() {
@@ -83,46 +78,45 @@ public class ToggleBreakpointRulerAction extends Action {
                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;
        }
 
index 07b24f1..567771e 100644 (file)
@@ -1,5 +1,9 @@
 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;
@@ -9,21 +13,75 @@ import net.sourceforge.phpeclipse.xdebug.php.model.XDebugVariable;
 
 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
@@ -38,28 +96,26 @@ public class PHPDebugModelPresentation implements IDebugModelPresentation {
                        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);
@@ -67,6 +123,7 @@ public class PHPDebugModelPresentation implements IDebugModelPresentation {
                return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_VARIABLE);
        }
 
+
        public String getText(Object element) {
                // TODO Auto-generated method stub
                return null;
@@ -100,23 +157,24 @@ public class PHPDebugModelPresentation implements IDebugModelPresentation {
        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;
        }
 
index eb99160..e1e0e30 100644 (file)
@@ -419,14 +419,8 @@ public class PHPEnvironmentTab extends AbstractLaunchConfigurationTab {
                        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;
                                }
@@ -762,9 +756,8 @@ public class PHPEnvironmentTab extends AbstractLaunchConfigurationTab {
         * 
         * @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);
        }
 
        /*
@@ -794,8 +787,8 @@ public class PHPEnvironmentTab extends AbstractLaunchConfigurationTab {
                }
 
                protected IDialogSettings getDialogSettings() {
-                       IDialogSettings settings = XDebugCorePlugin.getDefault()
-                                       .getDialogSettings();
+//                     IDialogSettings settings = XDebugCorePlugin.getDefault().getDialogSettings();
+                       IDialogSettings settings = getDialogSettings();
                        IDialogSettings section = settings
                                        .getSection(getDialogSettingsSectionName());
                        if (section == null) {
@@ -833,19 +826,16 @@ public class PHPEnvironmentTab extends AbstractLaunchConfigurationTab {
                // * @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();
+               //              }
        }
 }
index ed5f1b0..ac4628a 100644 (file)
@@ -1,11 +1,13 @@
 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;
@@ -35,27 +37,21 @@ 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 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() {
@@ -64,32 +60,30 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
 
        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);
@@ -99,26 +93,25 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                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();
@@ -127,8 +120,7 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                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) {
@@ -136,26 +128,25 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                        }
                });
        }
-
+       
        /**
         * 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() {
@@ -164,28 +155,27 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                        }
                });
 
-               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.
         */
@@ -198,7 +188,7 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                        fInterpreterButton.setEnabled(true);
                }
        }
-
+       
        /**
         * Returns whether the default appletviewer is to be used
         */
@@ -206,27 +196,28 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                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) {
@@ -248,33 +239,30 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                }
                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();
 
@@ -291,41 +279,36 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                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()) {
@@ -335,11 +318,11 @@ public class PHPMainTab extends AbstractLaunchConfigurationTab {
                }
                return true;
        }
-
+       
        public Image getImage() {
                return PHPUiImages.get(PHPUiImages.IMG_CTOOLS_PHP_PAGE);
        }
-
+       
        public String getName() {
                return "Main";
        }
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPPathMapTab.java b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPPathMapTab.java
new file mode 100644 (file)
index 0000000..0992e5d
--- /dev/null
@@ -0,0 +1,476 @@
+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
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPRemoteDebug.java b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPRemoteDebug.java
new file mode 100644 (file)
index 0000000..d63052f
--- /dev/null
@@ -0,0 +1,222 @@
+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";
+       }
+
+
+}
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPRemoteTabGroup.java b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPRemoteTabGroup.java
new file mode 100644 (file)
index 0000000..4187802
--- /dev/null
@@ -0,0 +1,21 @@
+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()
+               });
+
+       }
+
+}
index 7f2c6e4..72a06e1 100644 (file)
@@ -8,9 +8,14 @@ import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
 
 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()
+               });
        }
 }
index e3ed6ac..70dd943 100644 (file)
@@ -23,9 +23,7 @@ import org.eclipse.swt.widgets.Text;
 public class XDebugTab extends AbstractLaunchConfigurationTab {
 
        private Label fPortLabel;
-
        private Button fUseDefaultPortButton;
-
        private Text fPortText;
 
        public XDebugTab() {
@@ -34,11 +32,10 @@ public class XDebugTab extends AbstractLaunchConfigurationTab {
 
        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);
@@ -46,26 +43,27 @@ public class XDebugTab extends AbstractLaunchConfigurationTab {
                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() {
@@ -74,7 +72,9 @@ public class XDebugTab extends AbstractLaunchConfigurationTab {
                        }
                });
 
-               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);
@@ -85,7 +85,7 @@ public class XDebugTab extends AbstractLaunchConfigurationTab {
                        }
                });
        }
-
+       
        /**
         * Set the appropriate enabled state for the appletviewqer text widget.
         */
@@ -98,7 +98,7 @@ public class XDebugTab extends AbstractLaunchConfigurationTab {
                        fPortLabel.setEnabled(true);
                }
        }
-
+       
        /**
         * Returns whether the default appletviewer is to be used
         */
@@ -106,11 +106,13 @@ public class XDebugTab extends AbstractLaunchConfigurationTab {
                return fUseDefaultPortButton.getSelection();
        }
 
+       
        protected void handleDefaultSellected(SelectionEvent event) {
                setDebugportEnabledState();
                updateLaunchConfigurationDialog();
        }
 
+
        public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
                // TODO Auto-generated method stub
 
@@ -118,42 +120,36 @@ public class XDebugTab extends AbstractLaunchConfigurationTab {
 
        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;
index 7defbc5..1124273 100644 (file)
@@ -13,7 +13,7 @@ public class PHPBreakpointAdapterFactory implements IAdapterFactory {
        }
 
        public Class[] getAdapterList() {
-               return new Class[] { IToggleBreakpointsTarget.class };
+               return new Class[]{IToggleBreakpointsTarget.class};
        }
 
 }
index 0138aee..a7e6cb9 100644 (file)
@@ -18,30 +18,26 @@ public class PHPLineBreakpointAdapter implements IToggleBreakpointsTarget {
 
        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,
index 50435bf..dfec826 100644 (file)
@@ -11,25 +11,24 @@ import org.eclipse.jface.preference.IntegerFieldEditor;
 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);
        }
 
@@ -38,19 +37,24 @@ public class XDebugPreferencePage extends FieldEditorPreferencePage implements
        }
 
        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());
        }
 
+
+
+
 }