Browse Source

Implement sync protocol correctly

master
Wesley Kerfoot 5 years ago
parent
commit
d74b69863d
  1. 64
      adb.nim

64
adb.nim

@ -53,51 +53,63 @@ proc syncMode(): Socket =
socket.send("host:transport-usb".makeMsg) socket.send("host:transport-usb".makeMsg)
discard socket.recv(1024) discard socket.recv(1024)
echo "Trying to set sync mode"
socket.send("sync:".makeMsg) socket.send("sync:".makeMsg)
discard socket.recv(1024).parseAdb.get discard socket.recv(1024).parseAdb.get
socket socket
proc recvFile(filename : string) : Option[string] = proc recvFile(filename : string) : Option[string] =
# TODO handle more than one chunk :)
let socket : Socket = syncMode() let socket : Socket = syncMode()
echo fmt"Trying to receive the file {filename}"
let filenameLen : string = filename.len.uint32.unrollBytes let filenameLen : string = filename.len.uint32.unrollBytes
socket.send("RECV" & filenameLen & filename) socket.send("RECV" & filenameLen & filename)
let recvResult = socket.recv(8) # 64 kb + 8 bytes var recvResult : string
var status : string = ""
echo "received the chunk" var fileBody : string
var recvBody : string
var fileLen : int
let status = recvResult[0..3] var buf = ""
if status == "FAIL": while (status != "DONE"):
# Return early if we failed if status == "FAIL":
socket.close() # Return early if we failed
return none(string) socket.close()
return none(string)
recvResult = socket.recv(8) # 64 kb + 8 bytes
status = recvResult[0..3]
fileLen = recvResult[4..7].rollBytes.int
echo "Getting the file length" if (fileLen == 0 or status == "DONE"):
let fileLen = recvResult[4..7].rollBytes.int break
assert(fileLen <= 0xffff, "File Length Should be <=65535!") recvBody = ""
let recvBody = socket.recv(fileLen) # max 64kb length assert(status == "DATA")
assert(fileLen <= 0xffff and fileLen > 0, "File Length Should be <=65535 and > 0")
echo "Getting the file body" # now we have to recv until we have exactly `fileLen` bytes
let fileBody = recvBody[0..fileLen-1] while (recvBody.len != fileLen):
recvBody = recvBody & socket.recv(fileLen - recvBody.len)
assert(recvBody.len == fileLen)
fileBody = recvBody[0..^1]
buf = buf & fileBody
assert(status == "DONE")
assert(fileLen == 0)
socket.close() socket.close()
return some(fileBody) return some(buf)
proc statFile(filename : string) : FileStat = proc statFile(filename : string) : FileStat =
let socket : Socket = syncMode() let socket : Socket = syncMode()
echo fmt"Trying to stat the file {filename}"
let filenameLen : string = filename.len.uint32.unrollBytes let filenameLen : string = filename.len.uint32.unrollBytes
socket.send("STAT" & filenameLen & filename) socket.send("STAT" & filenameLen & filename)
@ -116,12 +128,10 @@ proc statFile(filename : string) : FileStat =
androidFileModified: fileCreated) androidFileModified: fileCreated)
proc adbPull(filename : string) : string = proc adbPull(filename : string) : string =
echo filename.len #echo filename.len
echo filename.statFile.repr #echo filename.statFile.repr
echo filename.recvFile
return "" return filename.recvFile.get
proc sendAdb(payload : string) : string = proc sendAdb(payload : string) : string =
var socket = adbConnect() var socket = adbConnect()
@ -154,7 +164,7 @@ discard execCmd("adb start-server")
#else: #else:
#echo devices.get() #echo devices.get()
echo adbPull("/etc/whitelistedapps.xml") stdout.write adbPull("/storage/7AFD-17E3/muzak/German Cake Rave-yMvDi_lXiQc.opus")
#discard rebootPhone() #discard rebootPhone()

Loading…
Cancel
Save