streamCallWithBuffer function
StreamBufferFetchResult?
streamCallWithBuffer(
- StreamBufferCallback fn, {
- int? maxSize,
- int? initialSize,
Like callWithBuffer for stream fetch callbacks that also return hasMore.
Implementation
StreamBufferFetchResult? streamCallWithBuffer(
StreamBufferCallback fn, {
int? maxSize,
int? initialSize,
}) {
final limit = maxSize ?? maxBufferSize;
var size = initialSize ?? initialBufferSize;
while (size <= limit) {
final buf = malloc<ffi.Uint8>(size);
final outWritten = malloc<ffi.Uint32>()..value = 0;
final hasMore = malloc<ffi.Uint8>()..value = 0;
try {
final code = fn(buf, size, outWritten, hasMore);
if (code == 0) {
final n = outWritten.value;
final more = hasMore.value != 0;
malloc
..free(outWritten)
..free(hasMore);
final data = n > 0
? materializeFfiBytes(
buf,
n,
transferOwnership: true,
allowZeroCopy: isZeroCopyResultBufferAvailable,
)
: null;
return StreamBufferFetchResult(data: data, hasMore: more);
}
if (code == -2) {
final requested = outWritten.value;
malloc
..free(buf)
..free(outWritten)
..free(hasMore);
size = requested > size ? requested : size * 2;
continue;
}
malloc
..free(buf)
..free(outWritten)
..free(hasMore);
return null;
} on Object {
malloc
..free(buf)
..free(outWritten)
..free(hasMore);
rethrow;
}
}
return null;
}