in idb_companion/Server/FBIDBServiceHandler.mm [96:126]
static Status drain_writer(FBFuture<FBProcess<NSNull *, NSInputStream *, id> *> *taskFuture, grpc::internal::WriterInterface<T> *stream)
{
NSError *error = nil;
FBProcess<NSNull *, NSInputStream *, id> *task = [taskFuture block:&error];
if (!task) {
return Status(grpc::StatusCode::INTERNAL, error.localizedDescription.UTF8String);
}
NSInputStream *inputStream = task.stdOut;
[inputStream open];
while (true) {
uintptr_t buffer[BufferOutputSize];
NSInteger size = [inputStream read:(uint8_t *)buffer maxLength:BufferOutputSize];
if (size == 0) {
break;
}
if (size < 0) {
return Status::OK;
}
T response;
idb::Payload *payload = response.mutable_payload();
payload->set_data(reinterpret_cast<void *>(buffer), size);
stream->Write(response);
}
[inputStream close];
NSNumber *exitCode = [task.exitCode block:&error];
if (exitCode.integerValue != 0) {
NSString *errorString = [NSString stringWithFormat:@"Draining operation failed with exit code %ld", (long)exitCode.integerValue];
return Status(grpc::StatusCode::INTERNAL, errorString.UTF8String);
}
return Status::OK;
}