summaryrefslogtreecommitdiffstats
path: root/devtools/client/shared/remote-debugging/adb/adb-client.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/shared/remote-debugging/adb/adb-client.js')
-rw-r--r--devtools/client/shared/remote-debugging/adb/adb-client.js82
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;