19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.ddm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.Chunk;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.ChunkHandler;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.DdmServer;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug;
24d693dfa75b7a156898890014e7192a792314b757Siva Velusamyimport android.os.UserHandle;
25e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertzimport dalvik.system.VMRuntime;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.ByteBuffer;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
307b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Handle "hello" messages and feature discovery.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DdmHandleHello extends ChunkHandler {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_HELO = type("HELO");
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_WAIT = type("WAIT");
367b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public static final int CHUNK_FEAT = type("FEAT");
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static DdmHandleHello mInstance = new DdmHandleHello();
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy    private static final String[] FRAMEWORK_FEATURES = new String[] {
41945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        "opengl-tracing",
42945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        "view-hierarchy",
43945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy    };
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* singleton, do not instantiate */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DdmHandleHello() {}
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register for the messages we're interested in.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void register() {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_HELO, mInstance);
537b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        DdmServer.registerHandler(CHUNK_FEAT, mInstance);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the DDM server connects.  The handler is allowed to
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * send messages to the server.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void connected() {
6143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("ddm-hello", "Connected!");
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64e577232406649450a513140bf09cb3fc8c3fe046Andy McFadden        if (false) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /* test spontaneous transmission */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] data = new byte[] { 0, 1, 2, 3, 4, -4, -3, -2, -1, 127 };
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Chunk testChunk =
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new Chunk(ChunkHandler.type("TEST"), data, 1, data.length-2);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DdmServer.sendChunk(testChunk);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the DDM server disconnects.  Can be used to disable
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * periodic transmissions or clean up saved state.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disconnected() {
7843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("ddm-hello", "Disconnected!");
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
837b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle a chunk of data.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Chunk handleChunk(Chunk request) {
8643a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Log.v("ddm-heap", "Handling " + name(request.type) + " chunk");
887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        int type = request.type;
897b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
907b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        if (type == CHUNK_HELO) {
917b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return handleHELO(request);
927b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } else if (type == CHUNK_FEAT) {
937b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return handleFEAT(request);
947b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } else {
957b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            throw new RuntimeException("Unknown packet "
967b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project                + ChunkHandler.name(type));
977b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        }
987b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /*
101406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao     * Handle introductory packet. This is called during JNI_CreateJavaVM
102406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao     * before frameworks native methods are registered, so be careful not
103406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao     * to call any APIs that depend on frameworks native code.
1047b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
1057b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private Chunk handleHELO(Chunk request) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false)
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return createFailChunk(123, "This is a test");
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Process the request.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ByteBuffer in = wrapChunk(request);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int serverProtoVers = in.getInt();
11543a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("ddm-hello", "Server version is " + serverProtoVers);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a response.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String vmName = System.getProperty("java.vm.name", "?");
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String vmVersion = System.getProperty("java.vm.version", "?");
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String vmIdent = vmName + " v" + vmVersion;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //String appName = android.app.ActivityThread.currentPackageName();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //if (appName == null)
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //    appName = "unknown";
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String appName = DdmHandleAppName.getAppName();
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
130e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        VMRuntime vmRuntime = VMRuntime.getRuntime();
131e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        String instructionSetDescription =
132e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz            vmRuntime.is64Bit() ? "64-bit" : "32-bit";
133e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        String vmInstructionSet = vmRuntime.vmInstructionSet();
134e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        if (vmInstructionSet != null && vmInstructionSet.length() > 0) {
135e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz          instructionSetDescription += " (" + vmInstructionSet + ")";
136e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        }
137e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        String vmFlags = "CheckJNI="
138e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz            + (vmRuntime.isCheckJniEnabled() ? "true" : "false");
139e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz
140e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        ByteBuffer out = ByteBuffer.allocate(28
141e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz                            + vmIdent.length() * 2
142e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz                            + appName.length() * 2
143e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz                            + instructionSetDescription.length() * 2
144e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz                            + vmFlags.length() * 2);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.order(ChunkHandler.CHUNK_ORDER);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.putInt(DdmServer.CLIENT_PROTOCOL_VERSION);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.putInt(android.os.Process.myPid());
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.putInt(vmIdent.length());
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.putInt(appName.length());
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        putString(out, vmIdent);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        putString(out, appName);
152d693dfa75b7a156898890014e7192a792314b757Siva Velusamy        out.putInt(UserHandle.myUserId());
153e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        out.putInt(instructionSetDescription.length());
154e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        putString(out, instructionSetDescription);
155e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        out.putInt(vmFlags.length());
156e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz        putString(out, vmFlags);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Chunk reply = new Chunk(CHUNK_HELO, out);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Take the opportunity to inform DDMS if we are waiting for a
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * debugger to attach.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Debug.waitingForDebugger())
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendWAIT(0);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1707b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /*
1717b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle request for list of supported features.
1727b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
1737b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private Chunk handleFEAT(Chunk request) {
1747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        // TODO: query the VM to ensure that support for these features
1757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        // is actually compiled in
1760c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy        final String[] vmFeatures = Debug.getVmFeatureList();
1777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
17843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
17998d493588f0ec55b8b6b3762189b2c02f17005c7Andy McFadden            Log.v("ddm-heap", "Got feature list request");
1807b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
181945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        int size = 4 + 4 * (vmFeatures.length + FRAMEWORK_FEATURES.length);
1820c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy        for (int i = vmFeatures.length-1; i >= 0; i--)
1830c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy            size += vmFeatures[i].length() * 2;
184945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        for (int i = FRAMEWORK_FEATURES.length-1; i>= 0; i--)
185945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy            size += FRAMEWORK_FEATURES[i].length() * 2;
1867b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        ByteBuffer out = ByteBuffer.allocate(size);
1887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        out.order(ChunkHandler.CHUNK_ORDER);
189945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        out.putInt(vmFeatures.length + FRAMEWORK_FEATURES.length);
1900c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy        for (int i = vmFeatures.length-1; i >= 0; i--) {
1910c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy            out.putInt(vmFeatures[i].length());
1920c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy            putString(out, vmFeatures[i]);
1930c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy        }
194945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy        for (int i = FRAMEWORK_FEATURES.length-1; i >= 0; i--) {
195945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy            out.putInt(FRAMEWORK_FEATURES[i].length());
196945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy            putString(out, FRAMEWORK_FEATURES[i]);
1977b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        }
1987b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1997b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        return new Chunk(CHUNK_FEAT, out);
2007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
2017b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send up a WAIT chunk.  The only currently defined value for "reason"
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is zero, which means "waiting for a debugger".
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void sendWAIT(int reason) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[] { (byte) reason };
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Chunk waitChunk = new Chunk(CHUNK_WAIT, data, 0, 1);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.sendChunk(waitChunk);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
213