diff options
Diffstat (limited to 'devtools/client/shared/remote-debugging/adb/adb-client.js')
-rw-r--r-- | devtools/client/shared/remote-debugging/adb/adb-client.js | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/devtools/client/shared/remote-debugging/adb/adb-client.js b/devtools/client/shared/remote-debugging/adb/adb-client.js new file mode 100644 index 0000000000..ff238d6392 --- /dev/null +++ b/devtools/client/shared/remote-debugging/adb/adb-client.js @@ -0,0 +1,82 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * A module to track device changes + * Adapted from adb.js at + * https://github.com/mozilla/adbhelper/tree/f44386c2d8cb7635a7d2c5a51191c89b886f8327 + */ + +"use strict"; + +const { + AdbSocket, +} = require("resource://devtools/client/shared/remote-debugging/adb/adb-socket.js"); +const { dumpn } = require("resource://devtools/shared/DevToolsUtils.js"); + +const OKAY = 0x59414b4f; +const FAIL = 0x4c494146; + +// Return buffer, which differs between Gecko versions +function getBuffer(packet) { + return packet.buffer ? packet.buffer : packet; +} + +// @param aPacket The packet to get the length from. +// @param aIgnoreResponse True if this packet has no OKAY/FAIL. +// @return A js object { length:...; data:... } +function unpackPacket(packet, ignoreResponse) { + const buffer = getBuffer(packet); + dumpn("Len buffer: " + buffer.byteLength); + if (buffer.byteLength === 4 && !ignoreResponse) { + dumpn("Packet empty"); + return { length: 0, data: "" }; + } + const lengthView = new Uint8Array(buffer, ignoreResponse ? 0 : 4, 4); + const decoder = new TextDecoder(); + const length = parseInt(decoder.decode(lengthView), 16); + const text = new Uint8Array(buffer, ignoreResponse ? 4 : 8, length); + return { length, data: decoder.decode(text) }; +} + +// Checks if the response is expected (defaults to OKAY). +// @return true if response equals expected. +function checkResponse(packet, expected = OKAY) { + const buffer = getBuffer(packet); + const view = new Uint32Array(buffer, 0, 1); + if (view[0] == FAIL) { + dumpn("Response: FAIL"); + } + dumpn("view[0] = " + view[0]); + return view[0] == expected; +} + +// @param aCommand A protocol-level command as described in +// http://androidxref.com/4.0.4/xref/system/core/adb/OVERVIEW.TXT and +// http://androidxref.com/4.0.4/xref/system/core/adb/SERVICES.TXT +// @return A 8 bit typed array. +function createRequest(command) { + let length = command.length.toString(16).toUpperCase(); + while (length.length < 4) { + length = "0" + length; + } + + const encoder = new TextEncoder(); + dumpn("Created request: " + length + command); + return encoder.encode(length + command); +} + +function connect() { + return new AdbSocket(); +} + +const client = { + getBuffer, + unpackPacket, + checkResponse, + createRequest, + connect, +}; + +module.exports = client; |