def _on_request_interest(self, name, skeleton, fd_list, fd_variant, first_segment):
self.emit('interest', Name(name), Interest(name), None, None, None)
fd = fd_list.get(fd_variant.get_handle())
logger.debug('RequestInterest Handler: name=%s, self.name=%s, fd=%d, first_segment=%d',
name, self.name, fd, first_segment)
# do we start on chunk 0 ? full file ? do we start on another chunk
# ? we need to seek the file, subsequent calls to get the same
# chunks have to be handled in the consumer part and folded into
# answering to only one dbus call
try:
final_segment = self._get_final_segment()
except NotImplementedError:
# we can't handle this, let another producer come in and do it.
self._dbus.return_error(name, 'TryAgain')
return False
key = name.toString()
try:
worker = self._workers[key]
logger.debug('already got a worker for name %s', name)
# self._dbus.return_error(name, 'ETOOMANY')
return
except KeyError:
pass
self._workers[key] = worker = ProducerWorker(fd, first_segment, final_segment,
self._send_chunk)
self._dbus.return_value(name, final_segment)
last_emited = first_segment - 1
# XXX: is this racy ?
GLib.timeout_add_seconds(5,
lambda: (worker.data.n > last_emited and
skeleton.emit_progress(key, worker.first_segment,
worker.data.n)) or worker.working)
return True
评论列表
文章目录