MultiBulkReply class
This class differs a bit from the oder RedisReplies in that it actually holds a list of mulitple RedisReplys.
class MultiBulkReply extends RedisReply {
final _OneLineDataConsumer _initialLineDataConsumer = new _OneLineDataConsumer();
/// The number of replies this multi bulk reply returns.
int _numberOfReplies;
/// Returns true if all replies have successfully been returned.
bool get done {
// Not even the inital first line has been received.
if (_numberOfReplies == null) return false;
if (_numberOfReplies == 0) return true;
// Not all replies have been received.
if (_replies.length != _numberOfReplies) return false;
// If the last reply is done, the [MultiBulkReply] is done.
return _replies.last.done;
}
/// Holds the list of [RedisReply]s.
List<RedisReply> _replies = <RedisReply>[ ];
List<RedisReply> get replies {
return _replies;
}
RedisReply get _lastReply => _replies.length > 0 ? _replies.last : null;
/**
* Consumes the first line with an [_OneLineDataConsumer], retrieves the
* number of replies from it.
*/
@override
List<int> _consumeData(List<int> data) {
if (!_initialLineDataConsumer.done) {
_initialLineDataConsumer.consumeData(data);
// Can be null
data = _initialLineDataConsumer.unconsumedData;
if (_initialLineDataConsumer.done) {
_numberOfReplies = int.parse(new String.fromCharCodes(_initialLineDataConsumer.data));
}
if (data == null || done) {
// Stop here.
return data;
}
}
// The initialLineConsumer has done it's job the last time or this time.
// Now all replies have to be received.
var lastReply = _lastReply;
if (lastReply == null || lastReply.done) {
// Need to create a new reply
lastReply = new RedisReply.fromType(data.first);
_replies.add(lastReply);
}
var unconsumedData = lastReply._consumeData(data);
if (lastReply.done) {
if (_replies.length == _numberOfReplies) {
// All replies have been received.
return unconsumedData;
}
else {
_consumeData(unconsumedData);
}
}
// Since the last reply is not done, there can't be any unconsumed data.
return null;
}
}
Extends
RedisReply > MultiBulkReply
Properties
final bool done #
Returns true if all replies have successfully been returned.
bool get done {
// Not even the inital first line has been received.
if (_numberOfReplies == null) return false;
if (_numberOfReplies == 0) return true;
// Not all replies have been received.
if (_replies.length != _numberOfReplies) return false;
// If the last reply is done, the [MultiBulkReply] is done.
return _replies.last.done;
}
final List<RedisReply> replies #
List<RedisReply> get replies {
return _replies;
}