proc getNumberSelection() loop let selection = try(stringtonum(csinputline("Please enter your selection?")), 0) csdraw() if (selection !== 0) then return selection endif endloop endproc proc selectActionScreen() println("What do you want to do?") println("1. Add files to the catalog") println("2. Check files in catalog") println("3. Mount sources") if (selection == 1) then return "ADD_FILES" elseif (selection == 2) then return "CHECK_FILES" elseif (selecton == 3) then return "MOUNT_SOURCE" endif endproc proc getCatalogPath() return inputline("\nPlease enter path to catalog: ") endproc proc readCatalog(cp) return jsondecode(readfile(cp)) endproc proc selectPath(dirsonly) let current_path = getcurrentdir() loop csclear() csgoto(0, 0) csprintln("Select path to ", (if (dirsonly) then "directory" else "file"), " :") csprintln("===================") csprintln("Current selected: ", current_path) csprintln("") csprintln("Select action or path") csprintln("---------------------") let dh = opendir(current_path) let subdirs = [] foreach dh as ditem if dirsonly then if (ditem.type == "dir") then let subdirs = insertright(subdirs, ditem) endif else let subdirs = insertright(subdirs, ditem) endif endforeach csprintln(1, ". Proceed") csprintln(2, ". Go up") let offset = 2 let i = offset foreach subdirs as subdir let i = (i + 1) csprintln(i, ". ", subdir.path) endforeach csdraw() let selection = getNumberSelection() if (selection == 1) then return current_path elseif (selection == 2) then let current_path = takedirectory(current_path) else let realindex = (selection - offset) if ((realindex <= size(subdirs)) and (realindex > 0)) then let di = subdirs[realindex] if (di.type == "dir") then let current_path = di.path else return di.path endif endif endif csdraw() endloop endproc proc checkfile(filehash, path) let currentpos = csget() csgoto(0, currentpos.y) let fh = openfilehandle(path, "r") let filesize = gethandlesize(fh) csprintln("Checking file:", path) csprintln("Size:", filesize) csclearline() let hctx = hashinit("md5") let readbytes = 0 loop let chunk = readfilehandle(fh, 4096) let hctx = hashupdate(hctx, chunk) if (size(chunk) == 0) then let finalhash = hexencode(hashfinalize(hctx)) if (finalhash == filehash) then csprintln("OK") else csprintln("HASH MISMATCH!") csdraw() wait(1) endif break else let readbytes = readbytes + size(chunk) csgoto(0, currentpos.y + 2) csclearline() let p = round(readbytes/filesize * 100) csprintln("Hashing: ", take(round(p/10), "=========="), " ", p, "%") csclearline() csdraw() endif endloop csdraw() csgoto(currentpos.x, currentpos.y) endproc proc mainscreen(catalogref, mountedpathsref) let catalogpath = readref(catalogref) let mountedpaths = readref(mountedpathsref) csclear() csgoto(0, 0) csprintln("Catalog path = ", (if ((catalogpath == "")) then "(empty)" else catalogpath)) csprintln("Mounted paths:") csprintln("") let i = 0 foreach mountedpaths as mp let i = (i + 1) csprintln(i, ". ", mp.key, " -> ", mp.value) endforeach csprintln("-----------------") csprintln("Selection action") csprintln("-----------------") csprintln("1. Select catalog path") csprintln("2. Mount sources") csprintln("3. Run check") csprintln("4. Add files") csprintln("5. Exit") let selection = getNumberSelection() if (selection == 1) then let catalogPath = selectPath(false) writeref(catalogref, catalogPath) return 0 elseif (selection == 2) then let mountsource = selectPath(false) if (takebasename(mountsource) == "PMSRCID") then let pmsrcid = trim(readtextfile(mountsource)) let currentpaths = readref(mountedpathsref) writeref(mountedpathsref, addkey(currentpaths, pmsrcid, takedirectory(mountsource))) endif return 0 elseif (selection == 3) then let catalogPath = readref(catalogref) let mountedPaths = readref(mountedpathsref) if (catalogPath !== "") then let catalog = readCatalog(catalogPath) foreach catalog as v foreach v.value as s if haskey(mountedPaths, s.key) then foreach s.value as si checkfile(v.key, joinpaths(mountedPaths[s.key], si)) endforeach endif endforeach wait(0.001) endforeach endif return 0 elseif (selection == 4) then break else return -1 endif csdraw() endproc csinit() let catalogpathref = newref("") let mountedpathsref = newref({}) loop if (mainscreen(catalogpathref, mountedpathsref) == -1) then break endif endloop getkey() -- let catalogPath = getCatalogPath() -- let catalogPath = selectPath(false) -- csclear() -- csprintln("Catalog path = ", catalogPath) -- csdraw() -- getkey()