You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/11/28 18:49:31 UTC

svn commit: r480141 [15/38] - in /harmony/enhanced/jdktools/trunk/modules/jpda: ./ doc/ doc/images/ make/ src/ src/common/ src/common/other/ src/common/other/jpda/ src/common/other/jpda/jdwp/ src/common/other/jpda/jdwp/agent/ src/common/other/jpda/jdwp...

Added: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.cpp?view=auto&rev=480141
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.cpp (added)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.cpp Tue Nov 28 09:49:08 2006
@@ -0,0 +1,342 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @author Viacheslav G. Rybalov
+ * @version $Revision: 1.14 $
+ */
+// TransportManager.cpp
+//
+
+#include "TransportManager.h"
+
+using namespace jdwp;
+
+static void* 
+Alloc(jint numBytes) 
+{
+    return AgentBase::GetMemoryManager().AllocateNoThrow(numBytes JDWP_FILE_LINE);
+}
+
+static void 
+Free(void *buffer) 
+{
+    AgentBase::GetMemoryManager().Free(buffer JDWP_FILE_LINE);
+}
+
+static jdwpTransportCallback callback = {Alloc, Free};
+
+typedef void (JNICALL *jdwpTransport_UnLoad_Type)(jdwpTransportEnv** env);
+
+TransportManager::TransportManager() : AgentBase()
+{
+    m_connectTimeout = 0;
+    m_handshakeTimeout = 0;
+    m_ConnectionPrepared = false;
+    m_address = 0;
+    m_loadedLib = 0;
+    m_env = 0;
+    m_isServer = true;
+    m_lastErrorMessage = 0;
+} //TransportManager::TransportManager()
+
+TransportManager::~TransportManager()
+{
+    if (m_address != 0) {
+        GetMemoryManager().Free(m_address JDWP_FILE_LINE);
+    }
+    if (m_loadedLib != 0) {
+        jdwpTransport_UnLoad_Type UnloadFunc = reinterpret_cast<jdwpTransport_UnLoad_Type>
+                (GetProcAddress(m_loadedLib, unLoadDecFuncName)); 
+        if ((UnloadFunc != 0) && (m_env != 0)) {
+            (UnloadFunc) (&m_env); 
+        }
+        FreeLibrary(m_loadedLib); 
+    }
+} //TransportManager::~TransportManager()
+
+void 
+TransportManager::Init(const char* transportName, 
+                const char* libPath) throw(TransportException)
+{
+    JDWP_TRACE_ENTRY("Init(" << JDWP_CHECK_NULL(transportName) << ',' << JDWP_CHECK_NULL(libPath) << ')');
+
+    JDWP_TRACE_PROG("Init: transport name=" << JDWP_CHECK_NULL(transportName )
+        << " libPath=" << JDWP_CHECK_NULL(libPath));
+
+    JDWP_ASSERT(m_loadedLib == 0);
+
+    const char* begin = libPath;
+    do {
+        const char* end = strchr(begin, pathSeparator);
+        if (end != 0) {
+            char* dirName = static_cast<char *>(GetMemoryManager().Allocate(end - begin + 1 JDWP_FILE_LINE));
+            AgentAutoFree afv(dirName JDWP_FILE_LINE);
+            strncpy(dirName , begin, end - begin);
+            dirName[end - begin] = 0;
+            if (strlen(dirName) != 0) {
+                m_loadedLib = LoadTransport(dirName, transportName);
+            }
+            if (*(end + 1) != 0) {
+                begin = end + 1;
+            } else {
+                break;
+            }
+        } else {
+            m_loadedLib = LoadTransport(begin, transportName);
+            break;
+        }
+    } while (m_loadedLib == 0);
+    if (m_loadedLib == 0) {
+        m_loadedLib = LoadTransport(0, transportName);
+    }
+    if (m_loadedLib == 0) {
+        if (m_lastErrorMessage != 0) {
+            GetMemoryManager().Free(m_lastErrorMessage JDWP_FILE_LINE);
+        }
+        size_t length = strlen("Loading of  failed") + strlen(transportName) + 1;
+        m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        sprintf(m_lastErrorMessage, "Loading of %s failed", transportName);
+        JDWP_ERROR("Loading of " << transportName << " failed");
+        throw TransportException(JDWP_ERROR_TRANSPORT_LOAD);
+    }
+
+    jdwpTransport_OnLoad_t transportOnLoad = reinterpret_cast<jdwpTransport_OnLoad_t>
+            (GetProcAddress(m_loadedLib, onLoadDecFuncName));
+    if (transportOnLoad == 0) {
+        if (m_lastErrorMessage != 0) {
+            GetMemoryManager().Free(m_lastErrorMessage JDWP_FILE_LINE);
+        }
+        size_t length = strlen(" function not found in ") + strlen(transportName)
+            + strlen(onLoadDecFuncName) + 1;
+        m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        sprintf(m_lastErrorMessage, "%s function not found in %s", onLoadDecFuncName, transportName);
+        JDWP_ERROR(onLoadDecFuncName << " function not found in " << transportName);
+        throw TransportException();
+    }
+    jint res = (*transportOnLoad)(GetJavaVM(), &callback, JDWPTRANSPORT_VERSION_1_0, &m_env);
+    if (res == JNI_ENOMEM) {
+        if (m_lastErrorMessage != 0) {
+            GetMemoryManager().Free(m_lastErrorMessage JDWP_FILE_LINE);
+        }
+        size_t length = strlen("Out of memeory");
+        m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        sprintf(m_lastErrorMessage, "Out of memeory");
+        throw TransportException(JDWP_ERROR_OUT_OF_MEMORY);
+    } else if (res != JNI_OK) {
+        if (m_lastErrorMessage != 0) {
+            GetMemoryManager().Free(m_lastErrorMessage JDWP_FILE_LINE);
+        }
+        size_t length = strlen("Invoking of  failed") + strlen(onLoadDecFuncName) + 1;
+        m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        sprintf(m_lastErrorMessage, "Invoking of %s failed", onLoadDecFuncName);
+        JDWP_ERROR("Invoking of " << onLoadDecFuncName << " failed");
+        throw TransportException();
+    }
+    if (m_env == 0) {
+        if (m_lastErrorMessage != 0) {
+            GetMemoryManager().Free(m_lastErrorMessage JDWP_FILE_LINE);
+        }
+        size_t length = strlen("Transport provided invalid environment");
+        m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        sprintf(m_lastErrorMessage, "Transport provided invalid environment");
+        JDWP_ERROR("Transport provided invalid environment");
+        throw TransportException();
+    }
+
+} // TransportManager::Init()
+
+void 
+TransportManager::PrepareConnection(const char* address, bool isServer, 
+                jlong connectTimeout, jlong handshakeTimeout) throw(TransportException)
+{
+    JDWP_TRACE_ENTRY("PrepareConnection(" << JDWP_CHECK_NULL(address) << ',' << isServer 
+        << ',' << connectTimeout << ',' << handshakeTimeout << ')');
+    
+    JDWP_TRACE_PROG("PrepareConnection: address=" << JDWP_CHECK_NULL(address) 
+        << " connectTimeout=" << connectTimeout 
+        << " handshakeTimeout=" << handshakeTimeout 
+        << " isServer=" << isServer);
+
+    JDWP_ASSERT((m_loadedLib != 0) && (!m_ConnectionPrepared));
+
+    m_lastErrorMessage = 0;
+
+    m_connectTimeout = connectTimeout;
+    m_handshakeTimeout = handshakeTimeout;
+    m_isServer = isServer;
+
+    JDWPTransportCapabilities capabilities;
+    jdwpTransportError err = m_env->GetCapabilities(&capabilities);
+    CheckReturnStatus(err);
+    if ((connectTimeout != 0) && isServer && (!capabilities.can_timeout_accept)) {
+        JDWP_INFO("Warning: transport does not support accept timeout");
+    }
+    if ((connectTimeout != 0) && (!isServer) && (!capabilities.can_timeout_attach)) {
+        JDWP_INFO("Warning: transport does not support attach timeout");
+    }
+    if ((handshakeTimeout != 0) && (!capabilities.can_timeout_handshake)) {
+        JDWP_INFO("Warning: transport does not support handshake timeout");
+    }
+
+    if (isServer) {
+        char* actualAddress;
+        err = m_env->StartListening(address, &actualAddress); 
+        CheckReturnStatus(err);
+        JDWP_INFO("transport is listening on " << actualAddress);
+        JDWP_TRACE_PROG("PrepareConnection: listening on " << actualAddress);
+        AgentBase::GetMemoryManager().Free(actualAddress JDWP_FILE_LINE);
+    } else {
+        m_address = static_cast<char *>(GetMemoryManager().Allocate(strlen(address) + 1 JDWP_FILE_LINE));
+        strcpy(m_address, address);
+    }
+
+    m_ConnectionPrepared = true;
+
+} // TransportManager::PrepareConnection()
+
+void 
+TransportManager::Connect() throw(TransportException)
+{
+    JDWP_TRACE_PROG("Connect: isServer=" << m_isServer);
+    JDWP_ASSERT(m_ConnectionPrepared);
+    jdwpTransportError err;
+    if (m_isServer) {
+        err = m_env->Accept(m_connectTimeout, m_handshakeTimeout);
+        CheckReturnStatus(err);
+    } else {
+        err = m_env->Attach(m_address, m_connectTimeout, m_handshakeTimeout);
+        CheckReturnStatus(err);
+    }
+    JDWP_TRACE_PROG("Connect: connection established");
+} // TransportManager::Start()
+
+void 
+TransportManager::Launch(const char* command) throw(TransportException)
+{
+    JDWP_TRACE_PROG("Launch: " << JDWP_CHECK_NULL(command));
+    JDWP_ASSERT(m_ConnectionPrepared);
+    StartDebugger(command);
+    Connect();
+} // TransportManager::Launch()
+
+void 
+TransportManager::Read(jdwpPacket* packet) throw(TransportException)
+{
+    JDWP_ASSERT(m_ConnectionPrepared);
+    JDWP_TRACE_PACKET("read packet");
+    jdwpTransportError err = m_env->ReadPacket(packet);
+    CheckReturnStatus(err);
+    TracePacket("rcvt", packet);
+} // TransportManager::Read()
+
+void 
+TransportManager::Write(const jdwpPacket *packet) throw(TransportException)
+{
+    JDWP_ASSERT(m_ConnectionPrepared);
+    JDWP_TRACE_PACKET("send packet");
+    jdwpTransportError err = m_env->WritePacket(packet);
+    CheckReturnStatus(err);
+    TracePacket("sent", packet);
+} // TransportManager::Write()
+
+void 
+TransportManager::Reset() throw(TransportException)
+{
+    JDWP_TRACE_PROG("Reset: close connection");
+    if(m_env != 0) {
+        JDWP_ASSERT(m_ConnectionPrepared);
+        jdwpTransportError err = m_env->Close();
+        CheckReturnStatus(err);
+    }
+    JDWP_TRACE_PROG("Reset: connection closed");
+} // TransportManager::Close()
+
+
+void 
+TransportManager::Clean() throw(TransportException)
+{
+    JDWP_ASSERT(m_ConnectionPrepared);
+    JDWP_TRACE_PROG("Clean: close connection and stop listening");
+    if (m_env != 0) {
+        m_env->Close();
+        m_env->StopListening();
+    }
+    JDWP_TRACE_PROG("Clean: connection closed and listening stopped");
+} // TransportManager::Clean()
+
+bool 
+
+TransportManager::IsOpen()
+{
+    if (!m_ConnectionPrepared) {
+        return false;
+    }
+    if (m_env->IsOpen() == JNI_TRUE) {
+        return true;
+    } else {
+        return false;
+    }
+} // TransportManager::IsOpen()
+
+char* 
+TransportManager::GetLastTransportError() throw(TransportException)
+{
+    char* lastErrorMessage = 0;
+    if (m_lastErrorMessage != 0) {
+        lastErrorMessage = m_lastErrorMessage;
+        m_lastErrorMessage = 0;
+    } else {
+        JDWP_ASSERT(m_env != 0);
+        m_env->GetLastError(&lastErrorMessage);
+    }
+    JDWP_TRACE_PROG("GetLastTransportError: " << JDWP_CHECK_NULL(lastErrorMessage));
+    return lastErrorMessage;
+} // TransportManager::GetLastTransportError()
+
+void 
+TransportManager::CheckReturnStatus(jdwpTransportError err) throw(TransportException)
+{
+    if (err == JDWPTRANSPORT_ERROR_NONE) {
+        return;
+    }
+    if (err == JDWPTRANSPORT_ERROR_OUT_OF_MEMORY) {
+        throw TransportException(JDWP_ERROR_OUT_OF_MEMORY, JDWPTRANSPORT_ERROR_OUT_OF_MEMORY);
+    }
+    char* lastErrorMessage = GetLastTransportError();
+    AgentBase::GetMemoryManager().Free(lastErrorMessage JDWP_FILE_LINE);
+    throw TransportException(JDWP_ERROR_TRANSPORT_INIT, err);
+} // TransportManager::CheckReturnStatus()
+
+inline void 
+TransportManager::TracePacket(const char* message, const jdwpPacket* packet) 
+{ 
+    if (packet->type.cmd.flags & JDWPTRANSPORT_FLAGS_REPLY) { 
+        JDWP_TRACE_PACKET(message 
+                <<" length=" << packet->type.cmd.len 
+                << " Id=" << packet->type.cmd.id 
+                << " flag=REPLY " 
+                << " errorCode=" << (short)(packet->type.reply.errorCode));
+    } else { 
+        JDWP_TRACE_PACKET(message 
+                <<" length=" << packet->type.cmd.len 
+                << " Id=" << packet->type.cmd.id 
+                << " flag=NONE"
+                << " cmdSet=" << (int)(packet->type.cmd.cmdSet) 
+                << " cmd=" << (int)(packet->type.cmd.cmd)); 
+    } 
+} // TracePacket()

Propchange: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.h?view=auto&rev=480141
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.h (added)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.h Tue Nov 28 09:49:08 2006
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors, 
+ * as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @author Viacheslav G. Rybalov
+ * @version $Revision: 1.10.2.1 $
+ */
+
+/**
+ * @file
+ * TransportManager.h
+ *
+ */
+
+#ifndef _TRANSPORT_MANAGER_H_
+#define _TRANSPORT_MANAGER_H_
+
+#include "jdwpTransport.h"
+#include "AgentBase.h"
+#include "AgentException.h"
+#include "Log.h"
+#include "TransportManager_pd.h"
+
+namespace jdwp {
+
+    /**
+     * The given class provides a high level interface with the JDWP transport.
+     * At first the function Init() must be invoked. It loads and
+     * initializes specified transport. Further the function 
+     * PrepareConnection() must be invoked. It makes some 
+     * preparations for establishing connection. To connect with the debugger, 
+     * function Connect() must be invoked.
+     */
+    class TransportManager : public AgentBase {
+    public:
+
+        /**
+         * A constructor.
+         */
+        TransportManager();
+
+        /**
+         * A destructor.
+         */
+        ~TransportManager();
+
+        /**
+         * Transport library initialization.
+         *
+         * @param transportName  - the name of the transport (library)
+         * @param libPath        - the library path
+         *
+         * @exception TransportException() - transport initialization
+         *            error happens.
+         */
+        void Init(const char* transportName, 
+                const char* libPath) throw(TransportException);
+
+        /**
+         * Connection preparation. If the agent is server, then starts listening.
+         * Must be invoked first.
+         *
+         * @param address           - the string representing the address of 
+         *                            the debugger ("host:port")
+         * @param isServer          - if the agent is a server then <code>TRUE</code>, 
+         *                            otherwise <code>FALSE</code>
+         * @param connectTimeout    - attach either accept time-out
+         * @param handshakeTimeout  - the handshake time-out
+         *
+         * @exception TransportException() - transport error happens.
+         */
+        void PrepareConnection(const char* address, bool isServer, 
+                jlong connectTimeout, jlong handshakeTimeout) throw(TransportException);
+        
+        /**
+         * Establish connection with the debugger.
+         * Must be invoked after Init().
+         *
+         * @exception TransportException() - transport error happens.
+         */
+        void Connect() throw(TransportException);
+        
+        /**
+         * Launch the debugger and establish connection.
+         *
+         * @param command - a command line to start the debugger
+         *
+         * @exception TransportException() - transport error happens.
+         */
+        void Launch(const char* command) throw(TransportException);
+        
+        /**
+         * The given function does a blocking read on an open connection.
+         *
+         * @param packet - the <code>jdwpPacket</code> structure address 
+         *                 populated by this function
+         *
+         * @exception TransportException() - transport error happens.
+         */
+        void Read(jdwpPacket* packet) throw(TransportException);
+        
+        /**
+         * Writes a JDWP packet to an open connection.
+         *
+         * @param packet - the <code>jdwpPacket</code> structure address
+         * 
+         * @exception TransportException() - transport error 
+         *            happens.
+         */
+        void Write(const jdwpPacket *packet) throw(TransportException);
+        
+        /**
+         * Close an open connection. The connection may be established again.
+         * 
+         * @exception TransportException() - transport error happens.
+         */
+        void Reset() throw(TransportException);
+
+        void Clean() throw(TransportException);
+        
+        /**
+         * Check the connection.
+         * @return Returns <code>TRUE</code> if connection is open, otherwise <code>FALSE</code>.
+         */
+        bool IsOpen();
+
+        /**
+         * Returns the string representation of the last transport error.
+         * The caller is responsible to free the returned string.
+         *
+         * @exception TransportException() - transport error happens.
+         */
+        char* GetLastTransportError() throw(TransportException);
+
+    protected:
+
+    private:
+        jlong m_connectTimeout;                  // attachTimeout or acceptTimeout timeout
+        jlong m_handshakeTimeout;                // handshakeTimeout
+        bool m_ConnectionPrepared;               // if true PrepareConnection done
+        bool m_isServer;                         // is jdwp agent server or not
+        char* m_address;                         // transport address
+        jdwpTransportEnv* m_env;                 // jdwpTransport environment
+        LoadedLibraryHandler m_loadedLib;        // transport library handler
+        char* m_lastErrorMessage;                // last error message
+
+        void CheckReturnStatus(jdwpTransportError err) throw(TransportException);
+        void StartDebugger(const char* command) throw(AgentException);
+        void TracePacket(const char* message, const jdwpPacket* packet);
+        LoadedLibraryHandler LoadTransport(const char* dirName, const char* transportName);
+
+        static const char* onLoadDecFuncName;
+        static const char* unLoadDecFuncName;
+        static const char pathSeparator;
+
+    };//class TransportManager
+
+}//jdwp
+
+#endif // _TRANSPORT_MANAGER_H_

Propchange: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/TransportManager.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/jdwpTypes.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/jdwpTypes.h?view=auto&rev=480141
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/jdwpTypes.h (added)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/jdwpTypes.h Tue Nov 28 09:49:08 2006
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors, 
+ * as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @author Pavel N. Vyssotski
+ * @version $Revision: 1.7.2.1 $
+ */
+
+/**
+ * @file
+ * jdwpTypes.h
+ *
+ */
+
+#ifndef _JDWP_TYPES_H_
+#define _JDWP_TYPES_H_
+
+#include "jni.h"
+#include "jdwp.h"
+
+// Defined to parse bytes order for x86 platform
+#define IS_BIG_ENDIAN_PLATFORM 1
+
+namespace jdwp {
+
+    typedef jlong FieldID;
+    typedef jlong MethodID;
+    typedef jlong ObjectID;
+    typedef ObjectID ReferenceTypeID;
+    typedef jlong FrameID;
+
+    const size_t FIELD_ID_SIZE          = sizeof(FieldID);
+    const size_t METHOD_ID_SIZE         = sizeof(MethodID);
+    const size_t OBJECT_ID_SIZE         = sizeof(ObjectID);
+    const size_t REFERENCE_TYPE_ID_SIZE = sizeof(ReferenceTypeID);
+    const size_t FRAME_ID_SIZE          = sizeof(FrameID);
+
+    typedef jint PacketID;
+    typedef jint RequestID;
+
+    /**
+     * The structure containing the Java value with the associated JDWP tag.
+     */
+    struct jdwpTaggedValue {
+        jdwpTag tag;
+        jvalue value;
+    };
+
+    /**
+     * The structure containing all JDWP capabilities.
+     * One bit per capability.
+     */
+    struct jdwpCapabilities {
+        unsigned int canWatchFieldModification : 1;
+        unsigned int canWatchFieldAccess : 1;
+        unsigned int canGetBytecodes : 1;
+        unsigned int canGetSyntheticAttribute : 1;
+        unsigned int canGetOwnedMonitorInfo : 1;
+        unsigned int canGetCurrentContendedMonitor : 1;
+        unsigned int canGetMonitorInfo : 1;
+        unsigned int canRedefineClasses : 1;
+        unsigned int canAddMethod : 1;
+        unsigned int canUnrestrictedlyRedefineClasses : 1;
+        unsigned int canPopFrames : 1;
+        unsigned int canUseInstanceFilters : 1;
+        unsigned int canGetSourceDebugExtension : 1;
+        unsigned int canRequestVMDeathEvent : 1;
+        unsigned int canSetDefaultStratum : 1;
+        unsigned int : 17;
+    };
+
+    /**
+     * The structure containing JDWP location information.
+     */
+    struct jdwpLocation {
+        jdwpTypeTag typeTag;
+        jclass classID;
+        jmethodID methodID;
+        jlocation loc;
+    };
+
+    /**
+     * Representation of the null value for the jobject JNI type and types
+     * derived from the jobject, jclass and so on.
+     */
+    #define JOBJECT_NULL 0
+
+    /**
+     * Access flags for class, field, and method
+     * as defined in the JVM specification.
+     */
+    enum {
+        ACC_PUBLIC       = 0x0001,
+        ACC_PRIVATE      = 0x0002,
+        ACC_PROTECTED    = 0x0004,
+        ACC_STATIC       = 0x0008,
+        ACC_FINAL        = 0x0010,
+        ACC_SYNCHRONIZED = 0x0020,
+        ACC_SUPER        = 0x0020,
+        ACC_VOLATILE     = 0x0040,
+        ACC_TRANSIENT    = 0x0080,
+        ACC_VARARGS      = 0x0080,
+        ACC_NATIVE       = 0x0100,
+        ACC_INTERFACE    = 0x0200,
+        ACC_ABSTRACT     = 0x0400,
+        ACC_STRICT       = 0x0800,
+        ACC_SYNTHETIC    = 0x1000,
+        ACC_ANNOTATION   = 0x2000,
+        ACC_ENUM         = 0x4000
+    };
+
+}
+
+#endif // _JDWP_TYPES_H_

Propchange: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/agent/core/jdwpTypes.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwp.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwp.h?view=auto&rev=480141
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwp.h (added)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwp.h Tue Nov 28 09:49:08 2006
@@ -0,0 +1,359 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors,
+ * as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @author Pavel N. Vyssotski
+ * @version $Revision: 1.5.2.1 $
+ */
+
+/**
+ * @file
+ * jdwp.h
+ *
+ */
+
+#ifndef _JDWP_H_
+#define _JDWP_H_
+
+/* JDWP Version */
+#define JDWP_VERSION_MAJOR 1
+#define JDWP_VERSION_MINOR 5
+
+/* General JDWP constants */
+#define JDWP_FLAG_REPLY_PACKET ((jbyte)0x80)
+#define JDWP_MIN_PACKET_LENGTH 11
+
+/* Command Sets */
+typedef enum jdwpCommandSet {
+    JDWP_COMMAND_SET_VIRTUAL_MACHINE = 1,
+    JDWP_COMMAND_SET_REFERENCE_TYPE = 2,
+    JDWP_COMMAND_SET_CLASS_TYPE = 3,
+    JDWP_COMMAND_SET_ARRAY_TYPE = 4,
+    JDWP_COMMAND_SET_INTERFACE_TYPE = 5,
+    JDWP_COMMAND_SET_METHOD = 6,
+    JDWP_COMMAND_SET_FIELD = 8,
+    JDWP_COMMAND_SET_OBJECT_REFERENCE = 9,
+    JDWP_COMMAND_SET_STRING_REFERENCE = 10,
+    JDWP_COMMAND_SET_THREAD_REFERENCE = 11,
+    JDWP_COMMAND_SET_THREAD_GROUP_REFERENCE = 12,
+    JDWP_COMMAND_SET_ARRAY_REFERENCE = 13,
+    JDWP_COMMAND_SET_CLASS_LOADER_REFERENCE = 14,
+    JDWP_COMMAND_SET_EVENT_REQUEST = 15,
+    JDWP_COMMAND_SET_STACK_FRAME = 16,
+    JDWP_COMMAND_SET_CLASS_OBJECT_REFERENCE = 17,
+    JDWP_COMMAND_SET_EVENT = 64
+} jdwpCommandSet;
+
+
+typedef enum jdwpCommand {
+
+    /* Commands VirtualMachine */
+    JDWP_COMMAND_VM_VERSION = 1,
+    JDWP_COMMAND_VM_CLASSES_BY_SIGNATURE = 2,
+    JDWP_COMMAND_VM_ALL_CLASSES = 3,
+    JDWP_COMMAND_VM_ALL_THREADS = 4,
+    JDWP_COMMAND_VM_TOP_LEVEL_THREAD_GROUPS = 5,
+    JDWP_COMMAND_VM_DISPOSE = 6,
+    JDWP_COMMAND_VM_ID_SIZES = 7,
+    JDWP_COMMAND_VM_SUSPEND = 8,
+    JDWP_COMMAND_VM_RESUME = 9,
+    JDWP_COMMAND_VM_EXIT = 10,
+    JDWP_COMMAND_VM_CREATE_STRING = 11,
+    JDWP_COMMAND_VM_CAPABILITIES = 12,
+    JDWP_COMMAND_VM_CLASS_PATHS = 13,
+    JDWP_COMMAND_VM_DISPOSE_OBJECTS = 14,
+    JDWP_COMMAND_VM_HOLD_EVENTS = 15,
+    JDWP_COMMAND_VM_RELEASE_EVENTS = 16,
+    JDWP_COMMAND_VM_CAPABILITIES_NEW = 17,
+    JDWP_COMMAND_VM_REDEFINE_CLASSES = 18,
+    JDWP_COMMAND_VM_SET_DEFAULT_STRATUM = 19,
+    JDWP_COMMAND_VM_ALL_CLASSES_WITH_GENERIC= 20,
+
+    /* Commands ReferenceType */
+    JDWP_COMMAND_RT_SIGNATURE = 1,
+    JDWP_COMMAND_RT_CLASS_LOADER = 2,
+    JDWP_COMMAND_RT_MODIFIERS = 3,
+    JDWP_COMMAND_RT_FIELDS = 4,
+    JDWP_COMMAND_RT_METHODS = 5,
+    JDWP_COMMAND_RT_GET_VALUES = 6,
+    JDWP_COMMAND_RT_SOURCE_FILE = 7,
+    JDWP_COMMAND_RT_NESTED_TYPES = 8,
+    JDWP_COMMAND_RT_STATUS = 9,
+    JDWP_COMMAND_RT_INTERFACES = 10,
+    JDWP_COMMAND_RT_CLASS_OBJECT = 11,
+    JDWP_COMMAND_RT_SOURCE_DEBUG_EXTENSION = 12,
+    JDWP_COMMAND_RT_SIGNATURE_WITH_GENERIC = 13,
+    JDWP_COMMAND_RT_FIELDS_WITH_GENERIC = 14,
+    JDWP_COMMAND_RT_METHODS_WITH_GENERIC = 15,
+
+    /* Commands ClassType */
+    JDWP_COMMAND_CT_SUPERCLASS = 1,
+    JDWP_COMMAND_CT_SET_VALUES = 2,
+    JDWP_COMMAND_CT_INVOKE_METHOD = 3,
+    JDWP_COMMAND_CT_NEW_INSTANCE = 4,
+
+    /* Commands ArrayType */
+    JDWP_COMMAND_AT_NEW_INSTANCE = 1,
+
+    /* Commands Method */
+    JDWP_COMMAND_M_LINE_TABLE = 1,
+    JDWP_COMMAND_M_VARIABLE_TABLE = 2,
+    JDWP_COMMAND_M_BYTECODES = 3,
+    JDWP_COMMAND_M_OBSOLETE = 4,
+    JDWP_COMMAND_M_VARIABLE_TABLE_WITH_GENERIC = 5,
+
+    /* Commands ObjectReference */
+    JDWP_COMMAND_OR_REFERENCE_TYPE = 1,
+    JDWP_COMMAND_OR_GET_VALUES = 2,
+    JDWP_COMMAND_OR_SET_VALUES = 3,
+    JDWP_COMMAND_OR_MONITOR_INFO = 5,
+    JDWP_COMMAND_OR_INVOKE_METHOD = 6,
+    JDWP_COMMAND_OR_DISABLE_COLLECTION = 7,
+    JDWP_COMMAND_OR_ENABLE_COLLECTION = 8,
+    JDWP_COMMAND_OR_IS_COLLECTED = 9,
+
+    /* Commands StringReference */
+    JDWP_COMMAND_SR_VALUE = 1,
+
+    /* Commands ThreadReference */
+    JDWP_COMMAND_TR_NAME = 1,
+    JDWP_COMMAND_TR_SUSPEND = 2,
+    JDWP_COMMAND_TR_RESUME = 3,
+    JDWP_COMMAND_TR_STATUS = 4,
+    JDWP_COMMAND_TR_THREAD_GROUP = 5,
+    JDWP_COMMAND_TR_FRAMES = 6,
+    JDWP_COMMAND_TR_FRAME_COUNT = 7,
+    JDWP_COMMAND_TR_OWNED_MONITORS = 8,
+    JDWP_COMMAND_TR_CURRENT_CONTENDED_MONITOR = 9,
+    JDWP_COMMAND_TR_STOP = 10,
+    JDWP_COMMAND_TR_INTERRUPT = 11,
+    JDWP_COMMAND_TR_SUSPEND_COUNT = 12,
+
+    /* Commands ThreadGroupReference */
+    JDWP_COMMAND_TGR_NAME = 1,
+    JDWP_COMMAND_TGR_PARENT = 2,
+    JDWP_COMMAND_TGR_CHILDREN = 3,
+
+    /* Commands ArrayReference */
+    JDWP_COMMAND_AR_LENGTH = 1,
+    JDWP_COMMAND_AR_GET_VALUES = 2,
+    JDWP_COMMAND_AR_SET_VALUES = 3,
+
+    /* Commands ClassLoaderReference */
+    JDWP_COMMAND_CLR_VISIBLE_CLASSES = 1,
+
+    /* Commands EventRequest */
+    JDWP_COMMAND_ER_SET = 1,
+    JDWP_COMMAND_ER_CLEAR = 2,
+    JDWP_COMMAND_ER_CLEAR_ALL_BREAKPOINTS = 3,
+
+    /* Commands StackFrame */
+    JDWP_COMMAND_SF_GET_VALUES = 1,
+    JDWP_COMMAND_SF_SET_VALUES = 2,
+    JDWP_COMMAND_SF_THIS_OBJECT = 3,
+    JDWP_COMMAND_SF_POP_FRAME = 4,
+
+    /* Commands ClassObjectReference */
+    JDWP_COMMAND_COR_REFLECTED_TYPE = 1,
+
+    /* Commands Event */
+    JDWP_COMMAND_E_COMPOSITE = 100
+
+} jdwpCommand;
+
+
+/* Error Constants */
+typedef enum jdwpError {
+    JDWP_ERROR_NONE = 0,
+    JDWP_ERROR_INVALID_THREAD = 10,
+    JDWP_ERROR_INVALID_THREAD_GROUP = 11,
+    JDWP_ERROR_INVALID_PRIORITY = 12,
+    JDWP_ERROR_THREAD_NOT_SUSPENDED = 13,
+    JDWP_ERROR_THREAD_SUSPENDED = 14,
+    JDWP_ERROR_INVALID_OBJECT = 20,
+    JDWP_ERROR_INVALID_CLASS = 21,
+    JDWP_ERROR_CLASS_NOT_PREPARED = 22,
+    JDWP_ERROR_INVALID_METHODID = 23,
+    JDWP_ERROR_INVALID_LOCATION = 24,
+    JDWP_ERROR_INVALID_FIELDID = 25,
+    JDWP_ERROR_INVALID_FRAMEID = 30,
+    JDWP_ERROR_NO_MORE_FRAMES = 31,
+    JDWP_ERROR_OPAQUE_FRAME = 32,
+    JDWP_ERROR_NOT_CURRENT_FRAME = 33,
+    JDWP_ERROR_TYPE_MISMATCH = 34,
+    JDWP_ERROR_INVALID_SLOT = 35,
+    JDWP_ERROR_DUPLICATE = 40,
+    JDWP_ERROR_NOT_FOUND = 41,
+    JDWP_ERROR_INVALID_MONITOR = 50,
+    JDWP_ERROR_NOT_MONITOR_OWNER = 51,
+    JDWP_ERROR_INTERRUPT = 52,
+    JDWP_ERROR_INVALID_CLASS_FORMAT = 60,
+    JDWP_ERROR_CIRCULAR_CLASS_DEFINITION = 61,
+    JDWP_ERROR_FAILS_VERIFICATION = 62,
+    JDWP_ERROR_ADD_METHOD_NOT_IMPLEMENTED = 63,
+    JDWP_ERROR_SCHEMA_CHANGE_NOT_IMPLEMENTED = 64,
+    JDWP_ERROR_INVALID_TYPESTATE = 65,
+    JDWP_ERROR_HIERARCHY_CHANGE_NOT_IMPLEMENTED = 66,
+    JDWP_ERROR_DELETE_METHOD_NOT_IMPLEMENTED = 67,
+    JDWP_ERROR_UNSUPPORTED_VERSION = 68,
+    JDWP_ERROR_NAMES_DONT_MATCH = 69,
+    JDWP_ERROR_CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED = 70,
+    JDWP_ERROR_METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED = 71,
+    JDWP_ERROR_NOT_IMPLEMENTED = 99,
+    JDWP_ERROR_NULL_POINTER = 100,
+    JDWP_ERROR_ABSENT_INFORMATION = 101,
+    JDWP_ERROR_INVALID_EVENT_TYPE = 102,
+    JDWP_ERROR_ILLEGAL_ARGUMENT = 103,
+    JDWP_ERROR_OUT_OF_MEMORY = 110,
+    JDWP_ERROR_ACCESS_DENIED = 111,
+    JDWP_ERROR_VM_DEAD = 112,
+    JDWP_ERROR_INTERNAL = 113,
+    JDWP_ERROR_UNATTACHED_THREAD = 115,
+    JDWP_ERROR_INVALID_TAG = 500,
+    JDWP_ERROR_ALREADY_INVOKING = 502,
+    JDWP_ERROR_INVALID_INDEX = 503,
+    JDWP_ERROR_INVALID_LENGTH = 504,
+    JDWP_ERROR_INVALID_STRING = 506,
+    JDWP_ERROR_INVALID_CLASS_LOADER = 507,
+    JDWP_ERROR_INVALID_ARRAY = 508,
+    JDWP_ERROR_TRANSPORT_LOAD = 509,
+    JDWP_ERROR_TRANSPORT_INIT = 510,
+    JDWP_ERROR_NATIVE_METHOD = 511,
+    JDWP_ERROR_INVALID_COUNT = 512
+} jdwpError;
+
+
+/* EventKind Constants */
+typedef enum jdwpEventKind {
+    JDWP_EVENT_SINGLE_STEP = 1,
+    JDWP_EVENT_BREAKPOINT = 2,
+    JDWP_EVENT_FRAME_POP = 3,
+    JDWP_EVENT_EXCEPTION = 4,
+    JDWP_EVENT_USER_DEFINED = 5,
+    JDWP_EVENT_THREAD_START = 6,
+    JDWP_EVENT_THREAD_END = 7,
+    JDWP_EVENT_THREAD_DEATH = JDWP_EVENT_THREAD_END,
+    JDWP_EVENT_CLASS_PREPARE = 8,
+    JDWP_EVENT_CLASS_UNLOAD = 9,
+    JDWP_EVENT_CLASS_LOAD = 10,
+    JDWP_EVENT_FIELD_ACCESS = 20,
+    JDWP_EVENT_FIELD_MODIFICATION = 21,
+    JDWP_EVENT_EXCEPTION_CATCH = 30,
+    JDWP_EVENT_METHOD_ENTRY = 40,
+    JDWP_EVENT_METHOD_EXIT = 41,
+    JDWP_EVENT_VM_INIT = 90,
+    JDWP_EVENT_VM_START = JDWP_EVENT_VM_INIT,
+    JDWP_EVENT_VM_DEATH = 99,
+    JDWP_EVENT_VM_DISCONNECTED = 100
+} jdwpEventKind;
+
+/* EventRequest/ModifierKind Constants */
+typedef enum jdwpRequestModifier {
+    JDWP_MODIFIER_NONE = 0,
+    JDWP_MODIFIER_COUNT = 1,
+    JDWP_MODIFIER_CONDITIONAL = 2,
+    JDWP_MODIFIER_THREAD_ONLY = 3,
+    JDWP_MODIFIER_CLASS_ONLY = 4,
+    JDWP_MODIFIER_CLASS_MATCH = 5,
+    JDWP_MODIFIER_CLASS_EXCLUDE = 6,
+    JDWP_MODIFIER_LOCATION_ONLY = 7,
+    JDWP_MODIFIER_EXCEPTION_ONLY = 8,
+    JDWP_MODIFIER_FIELD_ONLY = 9,
+    JDWP_MODIFIER_STEP = 10,
+    JDWP_MODIFIER_INSTANCE_ONLY = 11
+} jdwpRequestModifier;
+
+/* ThreadStatus Constants */
+typedef enum jdwpThreadStatus {
+    JDWP_THREAD_STATUS_UNKNOWN = -1,
+    JDWP_THREAD_STATUS_ZOMBIE = 0,
+    JDWP_THREAD_STATUS_RUNNING = 1,
+    JDWP_THREAD_STATUS_SLEEPING = 2,
+    JDWP_THREAD_STATUS_MONITOR = 3,
+    JDWP_THREAD_STATUS_WAIT = 4,
+    JDWP_THREAD_STATUS_NOT_STARTED = 5
+} jdwpThreadStatus;
+
+/* SuspendStatus Constants */
+#define JDWP_SUSPEND_STATUS_SUSPENDED 0x1
+
+/* ClassStatus Constants */
+typedef enum jdwpClassStatus {
+    JDWP_CLASS_STATUS_VERIFIED = 1,
+    JDWP_CLASS_STATUS_PREPARED = 2,
+    JDWP_CLASS_STATUS_INITIALIZED = 4,
+    JDWP_CLASS_STATUS_ERROR = 8
+} jdwpClassStatus;
+
+/* TypeTag Constants */
+typedef enum jdwpTypeTag {
+    JDWP_TYPE_TAG_CLASS = 1,
+    JDWP_TYPE_TAG_INTERFACE = 2,
+    JDWP_TYPE_TAG_ARRAY = 3
+} jdwpTypeTag;
+
+/* Tag Constants */
+typedef enum jdwpTag {
+    JDWP_TAG_NONE = 0,
+    JDWP_TAG_ARRAY = 91,
+    JDWP_TAG_BYTE = 66,
+    JDWP_TAG_CHAR = 67,
+    JDWP_TAG_OBJECT = 76,
+    JDWP_TAG_FLOAT = 70,
+    JDWP_TAG_DOUBLE = 68,
+    JDWP_TAG_INT = 73,
+    JDWP_TAG_LONG = 74,
+    JDWP_TAG_SHORT = 83,
+    JDWP_TAG_VOID = 86,
+    JDWP_TAG_BOOLEAN = 90,
+    JDWP_TAG_STRING = 115,
+    JDWP_TAG_THREAD = 116,
+    JDWP_TAG_THREAD_GROUP = 103,
+    JDWP_TAG_CLASS_LOADER = 108,
+    JDWP_TAG_CLASS_OBJECT = 99
+} jdwpTag;
+
+/* representation of null ObjectID */
+#define JDWP_OBJECT_ID_NULL 0
+
+/* StepDepth Constants */
+typedef enum jdwpStepDepth {
+    JDWP_STEP_INTO = 0,
+    JDWP_STEP_OVER = 1,
+    JDWP_STEP_OUT = 2
+} jdwpStepDepth;
+
+/* StepSize Constants */
+typedef enum jdwpStepSize {
+    JDWP_STEP_MIN = 0,
+    JDWP_STEP_LINE = 1
+} jdwpStepSize;
+
+/* SuspendPolicy Constants */
+typedef enum jdwpSuspendPolicy {
+    JDWP_SUSPEND_NONE = 0,
+    JDWP_SUSPEND_EVENT_THREAD = 1,
+    JDWP_SUSPEND_ALL = 2
+} jdwpSuspendPolicy;
+
+/* Invoke options constants */
+#define JDWP_INVOKE_SINGLE_THREADED 0x01
+#define JDWP_INVOKE_NONVIRTUAL 0x02
+
+
+#endif /* _JDWP_H_ */

Propchange: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwp.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwpTransport.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwpTransport.h?view=auto&rev=480141
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwpTransport.h (added)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwpTransport.h Tue Nov 28 09:49:08 2006
@@ -0,0 +1,467 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors, 
+ * as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @author Viacheslav G. Rybalov
+ * @version $Revision: 1.8.2.1 $
+ */
+
+/**
+ * @file
+ * jdwpTransport.h
+ *
+ */
+
+#ifndef _JDWPTRANSPORT_H_
+#define _JDWPTRANSPORT_H_
+
+#include "jni.h"
+
+#ifdef __cplusplus 
+extern "C" { 
+#endif 
+
+struct jdwpTransportNativeInterface_; 
+
+struct _jdwpTransportEnv; 
+
+#ifdef __cplusplus 
+typedef _jdwpTransportEnv jdwpTransportEnv; 
+#else 
+typedef const struct jdwpTransportNativeInterface_ *jdwpTransportEnv; 
+#endif 
+
+/**
+ * JDWP transport version number.
+ */
+enum {
+    JDWPTRANSPORT_VERSION_1_0               = 0x00010000 
+};
+
+/**
+ * The list of JDWP transport error codes.
+ */
+typedef enum {
+    JDWPTRANSPORT_ERROR_MSG_NOT_AVAILABLE   = 204,
+    JDWPTRANSPORT_ERROR_TIMEOUT             = 203,
+    JDWPTRANSPORT_ERROR_IO_ERROR            = 202,
+    JDWPTRANSPORT_ERROR_ILLEGAL_STATE       = 201,
+    JDWPTRANSPORT_ERROR_INTERNAL            = 113,
+    JDWPTRANSPORT_ERROR_OUT_OF_MEMORY       = 110,
+    JDWPTRANSPORT_ERROR_ILLEGAL_ARGUMENT    = 103,
+    JDWPTRANSPORT_ERROR_NONE                = 0
+} jdwpTransportError;
+    
+/**
+ * The structure contains JDWP transport capabilities.
+ * One bit per capability.
+ */
+typedef struct {
+    unsigned int can_timeout_attach         :1;
+    unsigned int can_timeout_accept         :1;
+    unsigned int can_timeout_handshake      :1;
+    unsigned int reserved3                  :1;
+    unsigned int reserved4                  :1;
+    unsigned int reserved5                  :1;
+    unsigned int reserved6                  :1;
+    unsigned int reserved7                  :1;
+    unsigned int reserved8                  :1;
+    unsigned int reserved9                  :1;
+    unsigned int reserved10                 :1;
+    unsigned int reserved11                 :1;
+    unsigned int reserved12                 :1;
+    unsigned int reserved13                 :1;
+    unsigned int reserved14                 :1;
+    unsigned int reserved15                 :1;
+} JDWPTransportCapabilities;
+
+/**
+ * JDWP transport flags.
+ */
+enum {
+    JDWPTRANSPORT_FLAGS_REPLY               = 0x80,
+    JDWPTRANSPORT_FLAGS_NONE                = 0x0
+};
+
+/**
+ * The JDWP transport callback function type.
+ * See the JVM JPDA/JDWP specification for details.
+ */
+typedef struct jdwpTransportCallback {
+    void *(*alloc)(jint numBytes);
+    void (*free)(void *buffer);
+} jdwpTransportCallback;
+
+/**
+ * The structure for the JDWP reply packet.
+ * See the JVM JPDA/JDWP specification for details.
+ */
+typedef struct {
+
+    /**
+     * The entire packet size in bytes.
+     */
+    jint len;
+
+    /**
+     * The packet identification number.
+     */
+    jint id;
+
+    /**
+     * The packet type flag = JDWPTRANSPORT_FLAGS_REPLY.
+     */
+    jbyte flags;
+
+    /**
+     * The error code for the command packet that was replied to.
+     */
+    jshort errorCode;
+
+    /**
+     * Specific packet data.
+     */
+    jbyte *data;
+
+} jdwpReplyPacket;
+
+/**
+ * The structure for the JDWP command packet.
+ * See the JVM JPDA/JDWP specification for details.
+ */
+typedef struct {
+
+    /**
+     * The entire packet size in bytes.
+     */
+    jint len;
+
+    /**
+     * The packet identification number.
+     */
+    jint id;
+
+    /**
+     * The packet type flag = JDWPTRANSPORT_FLAGS_NONE.
+     */
+    jbyte flags;
+
+    /**
+     * The command set number.
+     */
+    jbyte cmdSet;
+
+    /**
+     * The command number.
+     */
+    jbyte cmd;
+
+    /**
+     * The specific packet data.
+     */
+    jbyte *data;
+
+} jdwpCmdPacket;
+
+/**
+ * The unified structure for the JDWP command or reply packet.
+ */
+typedef struct {
+    union {
+
+        /**
+         * The command packet.
+         */
+        jdwpCmdPacket cmd;
+
+        /**
+         * The reply packet.
+         */
+        jdwpReplyPacket reply;
+
+    } type;
+} jdwpPacket; 
+
+typedef jint (JNICALL *jdwpTransport_OnLoad_t)(JavaVM *jvm,
+            jdwpTransportCallback *callback,
+            jint version, jdwpTransportEnv** env);
+
+/**
+ * The structure representing transport-native interface with capabilities
+ * to establish a connection with the debugger as well as to communicate with it.
+ */
+struct jdwpTransportNativeInterface_ {
+
+    void *reserved1;
+
+    /**
+     * Gets capabilities of the used transport component.
+     *
+     * @param[in]  env              - the transport environment pointer
+     * @param[out] capabilitiesPtr  - the pointer to capabilities descriptor
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *GetCapabilities)(jdwpTransportEnv* env,
+            JDWPTransportCapabilities *capabilitiesPtr);
+
+    /**
+     * Connects to the debugger listening on the specified address
+     * and establishes a communication channel after a successful handshake.
+     *
+     * @param[in] env              - the transport environment pointer
+     * @param[out] address         - the address at which the debugger listens
+     * @param[in] attachTimeout    - the time-out for connection to the debugger
+     * @param[in] handshakeTimeout - the time-out for handshake with the debugger
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *Attach)(jdwpTransportEnv* env,
+            const char* address, jlong attachTimeout, jlong handshakeTimeout);
+
+    /**
+     * Starts listening at the specified address.
+     *
+     * @param[in] env             - the ransport environment pointer
+     * @param[in] address         - the address at which the listen starts
+     * @param[out] actualAddress  - the real address at which the listen will 
+     *                              start
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *StartListening)(jdwpTransportEnv* env,
+            const char* address, char** actualAddress);
+
+    /**
+     * Stops listening operation.
+     *
+     * @param[in] env - the transport environment pointer
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *StopListening)(jdwpTransportEnv* env);
+
+    /**
+     * Accepts the debugger and establishes a communication channel after a 
+     * successful handshake.
+     *
+     * @param[in] env              - the transport environment pointer
+     * @param[in] attachTimeout    - the time-out for connection to the debugger
+     * @param[in] handshakeTimeout - the time-out for handshake with the debugger
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *Accept)(jdwpTransportEnv* env,
+            jlong acceptTimeout, jlong handshakeTimeout);
+
+    /**
+     * Checks whether the communication channel is opened.
+     *
+     * @param[in] env - the transport environment pointer
+     *
+     * @return Boolean.
+     */
+    jboolean (JNICALL *IsOpen)(jdwpTransportEnv* env);
+
+    /**
+     * Closes the opened communication channel.
+     *
+     * @param[in] env - the transport environment pointer
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *Close)(jdwpTransportEnv* env);
+
+    /**
+     * Reads a packet from the debugger.
+     *
+     * @param[in] env     - the transport environment pointer
+     * @param[out] packet - the packet structure
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *ReadPacket)(jdwpTransportEnv* env,
+            jdwpPacket *packet);
+
+    /**
+     * Sends the given packet to the debugger.
+     *
+     * @param[in] env    - the transport environment pointer
+     * @param[in] packet - the packet structure
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *WritePacket)(jdwpTransportEnv* env,
+            const jdwpPacket* packet);
+
+    /**
+     * Gets the last transport-error description.
+     *
+     * @param[in] env   - the transport environment pointer
+     * @param[out] msg  - the pointer to the string buffer for an error message
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError (JNICALL *GetLastError)(jdwpTransportEnv* env,
+            char** msg);
+
+};
+
+/**
+ * The structure contain pointer to the Transport native interface and
+ * wraps its code into C++ style members.
+ */
+struct _jdwpTransportEnv {
+
+    const struct jdwpTransportNativeInterface_ *functions;
+
+#ifdef __cplusplus
+
+    /**
+     * Gets capabilities of the used transport component.
+     *
+     * @param[out] capabilitiesPtr  - the pointer to capabilities descriptor
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError GetCapabilities(JDWPTransportCapabilities *capabilitiesPtr)
+    {
+        return functions->GetCapabilities(this, capabilitiesPtr);
+    }
+
+    /**
+     * Connects to the debugger listening on the specified address
+     * and establishes a communication channel after a successful handshake.
+     *
+     * @param[in] address           - the address at which the debugger listens
+     * @param[in] attachTimeout     - the time-out for connection to the debugger
+     * @param[in] handshakeTimeout  - the time-out for handshake with the debugger
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError Attach(const char* address, jlong attachTimeout,
+            jlong handshakeTimeout)
+    {
+        return functions->Attach(this, address, attachTimeout, handshakeTimeout);
+    }
+
+    /**
+     * Starts listening at the specified address.
+     *
+     * @param[in] address        - the address at which our listen starts
+     * @param[out] actualAddress - the real address at which the listen will 
+     *                             start
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError StartListening(const char* address,
+            char** actualAddress)
+    {
+        return functions->StartListening(this, address, actualAddress);
+    }
+
+    /**
+     * Stops listening operation.
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError StopListening(void)
+    {
+        return functions->StopListening(this);
+    }
+
+    /**
+     * Accepts the debugger and establishes a communication channel after a 
+     * successful handshake.
+     *
+     * @param[in] acceptTimeout     - the time-out for accepting connection  
+     *                                from the debugger
+     * @param[in] handshakeTimeout  - the time-out for a handshake with the 
+     *                                debugger
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError Accept(jlong acceptTimeout, jlong handshakeTimeout)
+    {
+        return functions->Accept(this, acceptTimeout, handshakeTimeout);
+    }
+
+    /**
+     * Checks whether the communication channel is opened.
+     *
+     * @return Boolean.
+     */
+    jboolean IsOpen(void)
+    {
+        return functions->IsOpen(this);
+    }
+
+    /**
+     * Closes the opened communication channel.
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError Close(void)
+    {
+        return functions->Close(this);
+    }
+
+    /**
+     * Reads a packet from the debugger.
+     *
+     * @param[out] packet - the packet structure
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError ReadPacket(jdwpPacket *packet) 
+    {
+        return functions->ReadPacket(this, packet);
+    }
+
+    /**
+     * Sends the given packet to the debugger.
+     *
+     * @param[in] packet - the packet structure
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError WritePacket(const jdwpPacket* packet) 
+    {
+        return functions->WritePacket(this, packet);
+    }
+
+    /**
+     * Gets the last transport error description.
+     *
+     * @param[out] msg - the pointer to the string buffer for an error message
+     *
+     * @return The transport-error code.
+     */
+    jdwpTransportError GetLastError(char** msg) 
+    {
+        return functions->GetLastError(this, msg);
+    }
+
+#endif
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

Propchange: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/generic/jdwpTransport.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.cpp?view=auto&rev=480141
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.cpp (added)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.cpp Tue Nov 28 09:49:08 2006
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @author Viacheslav G. Rybalov
+ * @version $Revision: 1.6 $
+ */
+#include "SocketTransport_pd.h"
+
+void (*LastTransportError::m_free)(void *buffer) = 0;
+
+LastTransportError::LastTransportError(const char* messagePtr, int errorStatus, 
+        void* (*alloc)(jint numBytes), void (*free)(void *buffer))
+{
+    m_treadId = GetCurrentThreadId();
+    m_lastErrorMessage = messagePtr;
+    m_lastErrorMessagePrefix = "";
+    m_lastErrorStatus = errorStatus;
+    m_alloc = alloc;
+    m_free = free;
+    m_next = 0;
+}
+
+LastTransportError::~LastTransportError(void)
+{
+    if (m_next != 0) {
+        delete m_next;
+    }
+}
+
+void* 
+LastTransportError::operator new(size_t bytes, void* (*alloc)(jint numBytes), void (*free)(void *buffer))
+{
+    return (*alloc)((jint)bytes);
+}
+
+void 
+LastTransportError::operator delete(void* address)
+{
+    (*m_free)(address);
+}
+
+void 
+LastTransportError::operator delete(void* address, void* (*alloc)(jint numBytes), void (*free)(void *buffer))
+{
+    (*free)(address);
+}
+
+
+jdwpTransportError
+LastTransportError::insertError(const char* messagePtr, int errorStatus)
+{
+    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+        m_lastErrorMessage = messagePtr;
+        m_lastErrorStatus = errorStatus;
+        m_lastErrorMessagePrefix = "";
+    } else if (m_next != 0) {
+        return m_next->insertError(messagePtr, errorStatus);
+    } else {
+        m_next = new(m_alloc, m_free) LastTransportError(messagePtr, errorStatus, m_alloc, m_free);
+        if (m_next == 0) {
+            return JDWPTRANSPORT_ERROR_OUT_OF_MEMORY;
+        }
+    }
+    return JDWPTRANSPORT_ERROR_NONE;
+}
+
+jdwpTransportError 
+LastTransportError::addErrorMessagePrefix(const char* prefixPtr)
+{
+    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+        m_lastErrorMessagePrefix = (prefixPtr == 0 ? "" : prefixPtr);
+    } else if (m_next != 0) {
+        return m_next->addErrorMessagePrefix(prefixPtr);
+    }
+    return JDWPTRANSPORT_ERROR_NONE;
+}
+
+int 
+LastTransportError::GetLastErrorStatus()
+{
+    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+        return m_lastErrorStatus;
+    } else if (m_next != 0) {
+        return m_next->GetLastErrorStatus();
+    }
+    return 0;
+}
+
+char* 
+LastTransportError::GetLastErrorMessage() 
+{
+    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+        char buf[32];
+        sprintf(buf, "%d", m_lastErrorStatus);
+
+        size_t strLength = (m_lastErrorStatus == 0) ? 
+            strlen(m_lastErrorMessagePrefix) + strlen(m_lastErrorMessage) + 1 :
+            strlen(m_lastErrorMessagePrefix) + strlen(m_lastErrorMessage) + strlen(" (error code: )") + strlen(buf) + 1;
+
+        char* message = (char*)(*m_alloc)((jint)strLength);
+        if (message == 0) {
+            return 0;
+        }
+
+        if (m_lastErrorStatus == 0) {
+            sprintf(message, "%s%s", m_lastErrorMessagePrefix, m_lastErrorMessage);
+        } else {
+            sprintf(message, "%s%s (error code: %s)", m_lastErrorMessagePrefix, m_lastErrorMessage, buf);
+        }
+        return message;
+
+    } else if (m_next != 0) {
+        return m_next->GetLastErrorMessage();
+    }
+    return 0;
+}

Propchange: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.h?view=auto&rev=480141
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.h (added)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.h Tue Nov 28 09:49:08 2006
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors, 
+ * as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @author Viacheslav G. Rybalov
+ * @version $Revision: 1.9.2.1 $
+ */
+
+/**
+ * @file
+ * LastTransportError.h
+ *
+ */
+
+#ifndef _LASTTRANSPORTERROR_H
+#define _LASTTRANSPORTERROR_H
+
+#include "SocketTransport_pd.h"
+
+/**
+ * The given class is a container for message and status code of the last 
+ * transport error.
+ */
+class LastTransportError
+{
+public:
+    /**
+     * A constructor.
+     *
+     * @param messagePtr  - the pointer to the string with diagnostics for the 
+     *                      last failed operation 
+     * @param errorStatus - the error status for the last failed operation 
+     * @param alloc       - the pointer to the function allocating the memory 
+     *                      area 
+     * @param free        - the pointer to the function deallocating the memory 
+     *                      area 
+     */
+    LastTransportError(const char* messagePtr, int errorStatus, 
+        void* (*alloc)(jint numBytes), void (*free)(void *buffer));
+
+    /**
+     * A destructor.
+     */
+    ~LastTransportError();
+
+    /**
+     * Inserts new Error data for the current thread.
+     *
+     * @param messagePtr  - the pointer to the string with diagnostics for the 
+     *                      last failed operation
+     * @param errorStatus - the error status for the last failed operation
+     *
+     * @return Returns JDWPTRANSPORT_ERROR_OUT_OF_MEMORY if out of memory, 
+     *         otherwise JDWPTRANSPORT_ERROR_NONE.
+     */
+    jdwpTransportError insertError(const char* messagePtr, int errorStatus);
+
+    /**
+     * Adds a message prefix for the current thread.
+     *
+     * @param prefixPtr - the pointer to the string with the message prefix
+     *
+     * @return Returns JDWPTRANSPORT_ERROR_OUT_OF_MEMORY if out of memory, 
+     *         otherwise JDWPTRANSPORT_ERROR_NONE.
+     */
+    jdwpTransportError addErrorMessagePrefix(const char* prefixPtr);
+
+    /**
+     * Returns the pointer to the string with diagnostics for the last failed 
+     * operation in the current thread.
+     *
+     * @return Returns the pointer to the string with diagnostics for the last 
+     *         failed operation.
+     */
+    char* GetLastErrorMessage();
+
+    /**
+     * Returns the error status for the last failed operation in the current 
+     * thread.
+     *
+     * @return Returns the error status for the last failed operation.
+     */
+    int GetLastErrorStatus();
+
+    void* operator new(size_t bytes, void* (*alloc)(jint numBytes), void (*free)(void *buffer));
+    void operator delete(void* address);
+    void operator delete(void* address, void* (*alloc)(jint numBytes), void (*free)(void *buffer));
+
+private:
+    ThreadId_t m_treadId;             // the thread Id
+    const char* m_lastErrorMessage;   // diagnostics for the last failed operation 
+    const char* m_lastErrorMessagePrefix;   // diagnostics prefix for the last failed operation  
+    int m_lastErrorStatus;            // the error status for the last failed operation 
+    LastTransportError* m_next;       // pointer to the next LastTransportError
+    void* (*m_alloc)(jint numBytes);  // function allocating the memory area, provided by the agent 
+    static void (*m_free)(void *buffer);     // function deallocating the memory area, provided by the agent
+
+};
+
+#endif // _LASTTRANSPORTERROR_H

Propchange: harmony/enhanced/jdktools/trunk/modules/jpda/src/common/other/jpda/jdwp/transport/common/LastTransportError.h
------------------------------------------------------------------------------
    svn:eol-style = native