From fdca54706dfe0f2df40b78df45e85ea585bda1ab Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Sat, 30 Nov 2019 17:02:57 -0500 Subject: [PATCH] chunking function, cleanup code --- adb.nim | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/adb.nim b/adb.nim index e6e4b13..926bdec 100644 --- a/adb.nim +++ b/adb.nim @@ -1,4 +1,4 @@ -import net, strutils, parseutils, strformat, osproc, system, sequtils, times +import net, strutils, parseutils, strformat, osproc, system, sequtils, times, math, sugar import options except map type FileStat = ref object of RootObj @@ -12,6 +12,10 @@ type AndroidFile = ref object of RootObj androidFileStat : FileStat androidFile : string +proc chunkString(buf : string) : seq[string] = + let chunkNum = (buf.len / (2^16-1)).ceil.BiggestInt + buf.toSeq.distribute(chunkNum, false).map(chunk => chunk.map(c => $char(c)).join) + proc recvExactly(socket : Socket, length : int) : string = var buf = "" while (buf.len != length): @@ -51,7 +55,7 @@ proc adbConnect() : Socket = proc unrollBytes(n : uint32) : string = let shifts : seq[uint32] = @[0'u32, 8'u32, 16'u32, 24'u32] # shift each byte right by a certain amount and mask off the least-significant byte - map(shifts, proc (shift : uint32) : string = $char((n shr shift) and 0x000000ff)).join + map(shifts, shift => $char((n shr shift) and 0x000000ff)).join proc rollBytes(bs : string) : uint32 = let shifts : seq[uint32] = @[0'u32, 8'u32, 16'u32, 24'u32] @@ -113,7 +117,7 @@ proc recvFile(filename : string) : Option[string] = var buf = "" while (status != "DONE"): - recvResult = socket.recvExactly(8) # 64 kb + 8 bytes + recvResult = socket.recvExactly(8) status = recvResult[0..3] fileLen = recvResult[4..7].rollBytes.int @@ -154,7 +158,7 @@ proc statFile(filename : string) : Option[FileStat] = let statResult : string = socket.recvExactly(16) - let command = map(statResult[0..3], proc (c : char) : string = $char(c)).join + let command = map(statResult[0..3], c => $char(c)).join let fileMode = statResult[4..7].rollBytes.BiggestInt let fileSize = statResult[8..11].rollBytes let fileCreated = statResult[12..15].rollBytes.int64.fromUnix @@ -181,6 +185,8 @@ proc sendFile(buf : string, filename : string) : bool = let remoteFileName = fmt"{filename},{fileMode}" + let chunks = buf.chunkString + echo remoteFileName return true @@ -197,7 +203,7 @@ proc adbPull(filename : string) : Option[AndroidFile] = androidFileStat: stat.get, androidFile: fileBlob)) -proc sendAdb(payload : string) : string = +proc runCommand(payload : string) : string = var socket = adbConnect() socket.send("host:transport-usb".makeMsg) @@ -215,14 +221,14 @@ proc sendAdb(payload : string) : string = return response proc rebootPhone() : Option[string] = - makeMsg("reboot:").sendAdb.parseAdb + makeMsg("reboot:").runCommand.parseAdb proc listCerts() : string = - makeMsg("shell:ls /etc/*").sendAdb.parseAdb.get + makeMsg("shell:ls /etc/*").runCommand.parseAdb.get discard execCmd("adb start-server") -#var devices = makeMsg("host:version").sendAdb.parseAdb +#var devices = makeMsg("host:version").runCommand.parseAdb #if devices.isNone: #quit(1) @@ -239,5 +245,5 @@ echo sendFile("", "/storage/7AFD-17E3/test2.opus") #echo listCerts() -#echo makeMsg("shell:uname -a").sendAdb.parseAdb.get -#echo makeMsg("shell:ls /system/etc/security/cacerts/*").sendAdb.parseAdb.get +#echo makeMsg("shell:uname -a").runCommand.parseAdb.get +#echo makeMsg("shell:ls /system/etc/security/cacerts/*").runCommand.parseAdb.get