jdwp_priv.h revision 68a5e3c9115f9ba396563ce3b72df9cb036bc665
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant/*
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * Copyright (C) 2008 The Android Open Source Project
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant *
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * Licensed under the Apache License, Version 2.0 (the "License");
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant * you may not use this file except in compliance with the License.
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant * You may obtain a copy of the License at
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *      http://www.apache.org/licenses/LICENSE-2.0
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * Unless required by applicable law or agreed to in writing, software
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * distributed under the License is distributed on an "AS IS" BASIS,
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * See the License for the specific language governing permissions and
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * limitations under the License.
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant */
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant/*
171b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow * JDWP internal interfaces.
18061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow */
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef ART_JDWP_JDWPPRIV_H_
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define ART_JDWP_JDWPPRIV_H_
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "debugger.h"
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "jdwp/jdwp.h"
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "jdwp/jdwp_event.h"
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <pthread.h>
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <sys/uio.h>
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant/*
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * JDWP constants.
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant */
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define kJDWPHeaderLen  11
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define kJDWPFlagReply  0x80
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define kMagicHandshake     "JDWP-Handshake"
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define kMagicHandshakeLen  (sizeof(kMagicHandshake)-1)
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant/* DDM support */
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define kJDWPDdmCmdSet  199     /* 0xc7, or 'G'+128 */
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define kJDWPDdmCmd     1
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace art {
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace JDWP {
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct JdwpState;
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant/*
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * Transport functions.
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant */
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct JdwpTransport {
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool (*startup)(JdwpState* state, const JdwpOptions* options);
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool (*accept)(JdwpState* state);
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool (*establish)(JdwpState* state, const JdwpOptions* options);
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  void (*shutdown)(JdwpState* state);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  void (*free)(JdwpState* state);
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool (*processIncoming)(JdwpState* state);
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst JdwpTransport* SocketTransport();
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst JdwpTransport* AndroidAdbTransport();
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant/*
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant * Base class for the adb and socket JdwpNetState implementations.
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant */
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass JdwpNetStateBase {
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant public:
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  int clientSock;     /* active connection to debugger */
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  enum { kInputBufferSize = 8192 };
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  unsigned char inputBuffer[kInputBufferSize];
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  size_t inputCount;
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  JdwpNetStateBase();
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  void ConsumeBytes(size_t byte_count);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool IsConnected();
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool IsAwaitingHandshake();
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  void SetAwaitingHandshake(bool new_state);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool HaveFullPacket();
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  void Close();
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  ssize_t WritePacket(ExpandBuf* pReply);
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  ssize_t WriteBufferedPacket(const iovec* iov, int iov_count);
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant private:
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  // Used to serialize writes to the socket.
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  Mutex socket_lock_;
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  // Are we waiting for the JDWP handshake?
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  bool awaiting_handshake_;
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}  // namespace JDWP
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}  // namespace art
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif  // ART_JDWP_JDWPPRIV_H_
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant