10 from __future__
import division, absolute_import, print_function, unicode_literals
12 from collections
import defaultdict
13 from logging
import getLogger
18 logger = getLogger(__name__)
22 rel_path = os.path.normcase(os.path.normpath(rel_path))
24 p = os.path.normcase(os.path.abspath(p))
25 if p.endswith(rel_path)
and os.path.isfile(p):
27 joined = os.path.join(p, rel_path)
28 if os.path.isfile(joined):
43 def add_handler(datatype, callback):
44 self.
_handles.append(node.add_handler(datatype, callback))
46 add_handler(pyuavcan_v0.protocol.file.GetInfo, self.
_get_info)
47 add_handler(pyuavcan_v0.protocol.file.Read, self.
_read)
59 rel = relative.path.decode().replace(chr(relative.SEPARATOR), os.path.sep)
62 raise OSError(errno.ENOENT)
68 logger.debug(
"[#{0:03d}:pyuavcan_v0.protocol.file.GetInfo] {1!r}"
69 .
format(e.transfer.source_node_id, e.request.path.path.decode()))
73 resp = pyuavcan_v0.protocol.file.GetInfo.Response()
74 resp.error.value = resp.error.OK
76 resp.entry_type.flags = resp.entry_type.FLAG_FILE | resp.entry_type.FLAG_READABLE
79 logger.exception(
"[#{0:03d}:pyuavcan_v0.protocol.file.GetInfo] error", exc_info=
True)
80 resp = pyuavcan_v0.protocol.file.GetInfo.Response()
81 resp.error.value = resp.error.UNKNOWN_ERROR
86 logger.debug(
"[#{0:03d}:pyuavcan_v0.protocol.file.Read] {1!r} @ offset {2:d}"
87 .
format(e.transfer.source_node_id, e.request.path.path.decode(), e.request.offset))
90 f.seek(e.request.offset)
91 resp = pyuavcan_v0.protocol.file.Read.Response()
92 read_size = pyuavcan_v0.get_uavcan_data_type(pyuavcan_v0.get_fields(resp)[
'data']).max_size
93 resp.data = bytearray(f.read(read_size))
94 resp.error.value = resp.error.OK
96 logger.exception(
"[#{0:03d}:pyuavcan_v0.protocol.file.Read] error")
97 resp = pyuavcan_v0.protocol.file.Read.Response()
98 resp.error.value = resp.error.UNKNOWN_ERROR