Advertisement
Guest User

OpenComputer File Sharing Client

a guest
Jun 10th, 2014
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.26 KB | None | 0 0
  1. local component = require("component")
  2. local evt = require("event")
  3. local serialization = require("serialization")
  4. local modem = component.modem
  5.  
  6. modem.setStrength(128)
  7. modem.open(999)
  8.  
  9. local fileHost = nil
  10. while fileHost == nil do
  11.   local type, _, from, _, _, message = evt.pull("modem_message")
  12.   fileHost = message
  13. end
  14. modem.close(999)
  15.  
  16. print("Found a file host: ", fileHost)
  17.  
  18. function getResult(type, path)
  19.   modem.open(7766)
  20.   modem.send(fileHost, 7766, serialization.serialize({ type = type, path = path }))
  21.   local _, _, _, _, _, message = evt.pull("modem_message")
  22.   modem.close(7766)
  23.   return serialization.unserialize(message)
  24. end
  25.  
  26. local fs = require("filesystem")
  27. local networkMount = { _files = {} }
  28. function networkMount.getLabel()
  29.   return "NetworkFS"
  30. end
  31. function networkMount.setLabel(label)
  32.   return nil, "filesystem does not support labeling"
  33. end
  34. function networkMount.isReadOnly()
  35.   return true
  36. end
  37. function networkMount.spaceTotal()
  38.   return getResult("info", nil).spaceTotal
  39. end
  40. function networkMount.spaceUsed()
  41.   return getResult("info", nil).spaceUsed
  42. end
  43. function networkMount.exists(path)
  44.   local result = getResult("type", path)
  45.   return result.type ~= "error"
  46. end
  47. function networkMount.size(path)
  48.   local result = getResult("type", path)
  49.   if result.type == "error" then return nil, result.error end
  50.   return result.size
  51. end
  52. function networkMount.isDirectory(path)
  53.   local result = getResult("type", path)
  54.   if result.type == "error" then return false end
  55.   return result.isDirectory
  56. end
  57. function networkMount.lastModified(path)
  58.   local result = getResult("type", path)
  59.   if result.type == "error" then return nil, result.error end
  60.   return result.lastModified
  61. end
  62. function networkMount.list(path)
  63.   local result = getResult("list", path)
  64.   if result.type == "error" then return nil, result.error end
  65.   return result.list
  66. end
  67. function networkMount.makeDirectory(path) return false end
  68. function networkMount.remove(path) return false end
  69. function networkMount.rename(path) return false end
  70. function networkMount.close(handle)
  71.   networkMount._files[handle] = nil
  72. end
  73. function networkMount.open(path)
  74.   local result = getResult("get", path)
  75.   if result.type == "error" then return nil, result.error end
  76.   local handle = nil
  77.   while handle == nil do
  78.     handle = math.random()
  79.     if networkMount._files[handle] ~= nil then handle = nil end
  80.   end
  81.   networkMount._files[handle] = { ptr = 1, data = result.data, size = result.data:len() }
  82.   return handle
  83. end
  84. function networkMount.read(handle, n)
  85.   local data = networkMount._files[handle]
  86.   local toRead = math.min(data.size - data.ptr, math.max(0, n))
  87.   if toRead == 0 then return nil end
  88.   local ret = data.data:sub(data.ptr, data.ptr + toRead)
  89.   data.ptr = data.ptr + toRead
  90.   return ret
  91. end
  92. function networkMount.seek(handle, type, n)
  93.   local data = networkMount._files[handle]
  94.   if type == "cur" then
  95.     data.ptr = data.ptr + n
  96.   elseif type == "set" then
  97.     data.ptr = n
  98.   elseif type == "end" then
  99.     data.ptr = data.size - n
  100.   else
  101.     return nil, "invalid mode"
  102.   end
  103.   if data.ptr <= 0 then data.ptr = 1 end
  104.   if data.ptr > data.size then data.ptr = data.size end
  105. end
  106. function networkMount.write(handle)
  107.   return nil
  108. end
  109. fs.mount(networkMount, ...)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement