1 /* 2 * %W% %E% 3 * 4 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. 5 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 6 */ 7 8 /* 9 * Java Debug Wire Protocol Transport Service Provider Interface. 10 */ 11 12 #ifndef JDWPTRANSPORT_H 13 #define JDWPTRANSPORT_H 14 15 #include "jni.h" 16 17 enum { 18 JDWPTRANSPORT_VERSION_1_0 = 0x00010000 19 }; 20 21 #ifdef __cplusplus 22 extern "C" { 23 #endif 24 25 struct jdwpTransportNativeInterface_; 26 27 struct _jdwpTransportEnv; 28 29 #ifdef __cplusplus 30 typedef _jdwpTransportEnv jdwpTransportEnv; 31 #else 32 typedef const struct jdwpTransportNativeInterface_ *jdwpTransportEnv; 33 #endif /* __cplusplus */ 34 35 /* 36 * Errors. Universal errors with JVMTI/JVMDI equivalents keep the 37 * values the same. 38 */ 39 typedef enum { 40 JDWPTRANSPORT_ERROR_NONE = 0, 41 JDWPTRANSPORT_ERROR_ILLEGAL_ARGUMENT = 103, 42 JDWPTRANSPORT_ERROR_OUT_OF_MEMORY = 110, 43 JDWPTRANSPORT_ERROR_INTERNAL = 113, 44 JDWPTRANSPORT_ERROR_ILLEGAL_STATE = 201, 45 JDWPTRANSPORT_ERROR_IO_ERROR = 202, 46 JDWPTRANSPORT_ERROR_TIMEOUT = 203, 47 JDWPTRANSPORT_ERROR_MSG_NOT_AVAILABLE = 204 48 } jdwpTransportError; 49 50 51 /* 52 * Structure to define capabilities 53 */ 54 typedef struct { 55 unsigned int can_timeout_attach :1; 56 unsigned int can_timeout_accept :1; 57 unsigned int can_timeout_handshake :1; 58 unsigned int reserved3 :1; 59 unsigned int reserved4 :1; 60 unsigned int reserved5 :1; 61 unsigned int reserved6 :1; 62 unsigned int reserved7 :1; 63 unsigned int reserved8 :1; 64 unsigned int reserved9 :1; 65 unsigned int reserved10 :1; 66 unsigned int reserved11 :1; 67 unsigned int reserved12 :1; 68 unsigned int reserved13 :1; 69 unsigned int reserved14 :1; 70 unsigned int reserved15 :1; 71 } JDWPTransportCapabilities; 72 73 74 /* 75 * Structures to define packet layout. 76 * 77 * See: http://java.sun.com/j2se/1.5/docs/guide/jpda/jdwp-spec.html 78 */ 79 80 enum { 81 JDWPTRANSPORT_FLAGS_NONE = 0x0, 82 JDWPTRANSPORT_FLAGS_REPLY = 0x80 83 }; 84 85 typedef struct { 86 jint len; 87 jint id; 88 jbyte flags; 89 jbyte cmdSet; 90 jbyte cmd; 91 jbyte *data; 92 } jdwpCmdPacket; 93 94 typedef struct { 95 jint len; 96 jint id; 97 jbyte flags; 98 jshort errorCode; 99 jbyte *data; 100 } jdwpReplyPacket; 101 102 typedef struct { 103 union { 104 jdwpCmdPacket cmd; 105 jdwpReplyPacket reply; 106 } type; 107 } jdwpPacket; 108 109 /* 110 * JDWP functions called by the transport. 111 */ 112 typedef struct jdwpTransportCallback { 113 void *(*alloc)(jint numBytes); /* Call this for all allocations */ 114 void (*free)(void *buffer); /* Call this for all deallocations */ 115 } jdwpTransportCallback; 116 117 typedef jint (JNICALL *jdwpTransport_OnLoad_t)(JavaVM *jvm, 118 jdwpTransportCallback *callback, 119 jint version, 120 jdwpTransportEnv** env); 121 122 123 124 /* Function Interface */ 125 126 struct jdwpTransportNativeInterface_ { 127 /* 1 : RESERVED */ 128 void *reserved1; 129 130 /* 2 : Get Capabilities */ 131 jdwpTransportError (JNICALL *GetCapabilities)(jdwpTransportEnv* env, 132 JDWPTransportCapabilities *capabilities_ptr); 133 134 /* 3 : Attach */ 135 jdwpTransportError (JNICALL *Attach)(jdwpTransportEnv* env, 136 const char* address, 137 jlong attach_timeout, 138 jlong handshake_timeout); 139 140 /* 4: StartListening */ 141 jdwpTransportError (JNICALL *StartListening)(jdwpTransportEnv* env, 142 const char* address, 143 char** actual_address); 144 145 /* 5: StopListening */ 146 jdwpTransportError (JNICALL *StopListening)(jdwpTransportEnv* env); 147 148 /* 6: Accept */ 149 jdwpTransportError (JNICALL *Accept)(jdwpTransportEnv* env, 150 jlong accept_timeout, 151 jlong handshake_timeout); 152 153 /* 7: IsOpen */ 154 jboolean (JNICALL *IsOpen)(jdwpTransportEnv* env); 155 156 /* 8: Close */ 157 jdwpTransportError (JNICALL *Close)(jdwpTransportEnv* env); 158 159 /* 9: ReadPacket */ 160 jdwpTransportError (JNICALL *ReadPacket)(jdwpTransportEnv* env, 161 jdwpPacket *pkt); 162 163 /* 10: Write Packet */ 164 jdwpTransportError (JNICALL *WritePacket)(jdwpTransportEnv* env, 165 const jdwpPacket* pkt); 166 167 /* 11: GetLastError */ 168 jdwpTransportError (JNICALL *GetLastError)(jdwpTransportEnv* env, 169 char** error); 170 171 }; 172 173 174 /* 175 * Use inlined functions so that C++ code can use syntax such as 176 * env->Attach("mymachine:5000", 10*1000, 0); 177 * 178 * rather than using C's :- 179 * 180 * (*env)->Attach(env, "mymachine:5000", 10*1000, 0); 181 */ 182 struct _jdwpTransportEnv { 183 const struct jdwpTransportNativeInterface_ *functions; 184 #ifdef __cplusplus 185 186 jdwpTransportError GetCapabilities(JDWPTransportCapabilities *capabilities_ptr) { 187 return functions->GetCapabilities(this, capabilities_ptr); 188 } 189 190 jdwpTransportError Attach(const char* address, jlong attach_timeout, 191 jlong handshake_timeout) { 192 return functions->Attach(this, address, attach_timeout, handshake_timeout); 193 } 194 195 jdwpTransportError StartListening(const char* address, 196 char** actual_address) { 197 return functions->StartListening(this, address, actual_address); 198 } 199 200 jdwpTransportError StopListening(void) { 201 return functions->StopListening(this); 202 } 203 204 jdwpTransportError Accept(jlong accept_timeout, jlong handshake_timeout) { 205 return functions->Accept(this, accept_timeout, handshake_timeout); 206 } 207 208 jboolean IsOpen(void) { 209 return functions->IsOpen(this); 210 } 211 212 jdwpTransportError Close(void) { 213 return functions->Close(this); 214 } 215 216 jdwpTransportError ReadPacket(jdwpPacket *pkt) { 217 return functions->ReadPacket(this, pkt); 218 } 219 220 jdwpTransportError WritePacket(const jdwpPacket* pkt) { 221 return functions->WritePacket(this, pkt); 222 } 223 224 jdwpTransportError GetLastError(char** error) { 225 return functions->GetLastError(this, error); 226 } 227 228 229 #endif /* __cplusplus */ 230 }; 231 232 #ifdef __cplusplus 233 } /* extern "C" */ 234 #endif /* __cplusplus */ 235 236 #endif /* JDWPTRANSPORT_H */ 237 238