mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-25 17:51:01 +00:00
attempt to fix event generation/handing logic for data streams
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34903 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
bcfeafc9ae
commit
85fc07ec45
2 changed files with 37 additions and 32 deletions
|
@ -1,3 +1,8 @@
|
|||
2012-03-07 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* Source/GSStream.m: Attempt to fix logic for event handling of data
|
||||
streams.
|
||||
|
||||
2012-03-01 Jens Alfke <jens@mooseyard.com>
|
||||
|
||||
* Headers/GNUstepBase/NSURL+GNUstepBase.h:
|
||||
|
|
|
@ -716,8 +716,7 @@ static RunLoopEventType typeForStream(NSStream *aStream)
|
|||
|
||||
- (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len
|
||||
{
|
||||
unsigned long dataSize;
|
||||
unsigned long copySize;
|
||||
NSUInteger dataSize;
|
||||
|
||||
if (buffer == 0)
|
||||
{
|
||||
|
@ -730,33 +729,29 @@ static RunLoopEventType typeForStream(NSStream *aStream)
|
|||
format: @"zero byte read write requested"];
|
||||
}
|
||||
|
||||
_events &= ~NSStreamEventHasSpaceAvailable;
|
||||
|
||||
if ([self streamStatus] == NSStreamStatusClosed)
|
||||
if ([self streamStatus] == NSStreamStatusClosed
|
||||
|| [self streamStatus] == NSStreamStatusAtEnd)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Mark the data availability event as handled, so we can generate more.
|
||||
*/
|
||||
_events &= ~NSStreamEventHasBytesAvailable;
|
||||
|
||||
dataSize = [_data length];
|
||||
NSAssert(dataSize >= _pointer, @"Buffer overflow!");
|
||||
if (len + _pointer > dataSize)
|
||||
{
|
||||
copySize = dataSize - _pointer;
|
||||
}
|
||||
else
|
||||
{
|
||||
copySize = len;
|
||||
}
|
||||
if (copySize)
|
||||
{
|
||||
memcpy(buffer, [_data bytes] + _pointer, copySize);
|
||||
_pointer = _pointer + copySize;
|
||||
}
|
||||
else
|
||||
if (len + _pointer >= dataSize)
|
||||
{
|
||||
len = dataSize - _pointer;
|
||||
[self _setStatus: NSStreamStatusAtEnd];
|
||||
}
|
||||
return copySize;
|
||||
if (len > 0)
|
||||
{
|
||||
memcpy(buffer, [_data bytes] + _pointer, len);
|
||||
_pointer = _pointer + len;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
- (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len
|
||||
|
@ -823,24 +818,27 @@ static RunLoopEventType typeForStream(NSStream *aStream)
|
|||
format: @"zero byte length write requested"];
|
||||
}
|
||||
|
||||
_events &= ~NSStreamEventHasBytesAvailable;
|
||||
|
||||
if ([self streamStatus] == NSStreamStatusClosed)
|
||||
if ([self streamStatus] == NSStreamStatusClosed
|
||||
|| [self streamStatus] == NSStreamStatusAtEnd)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We have consumed the 'writable' event ... mark that so another can
|
||||
* be generated.
|
||||
*/
|
||||
_events &= ~NSStreamEventHasSpaceAvailable;
|
||||
if ((_pointer + len) > _capacity)
|
||||
{
|
||||
len = _capacity - _pointer;
|
||||
if (len == 0)
|
||||
{
|
||||
[self _setStatus: NSStreamStatusAtEnd];
|
||||
return 0;
|
||||
}
|
||||
[self _setStatus: NSStreamStatusAtEnd];
|
||||
}
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
memcpy((_buffer + _pointer), buffer, len);
|
||||
_pointer += len;
|
||||
}
|
||||
memcpy((_buffer + _pointer), buffer, len);
|
||||
_pointer += len;
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -895,13 +893,15 @@ static RunLoopEventType typeForStream(NSStream *aStream)
|
|||
format: @"zero byte length write requested"];
|
||||
}
|
||||
|
||||
_events &= ~NSStreamEventHasBytesAvailable;
|
||||
|
||||
if ([self streamStatus] == NSStreamStatusClosed)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We have consumed the 'writable' event ... mark that so another can
|
||||
* be generated.
|
||||
*/
|
||||
_events &= ~NSStreamEventHasSpaceAvailable;
|
||||
[_data appendBytes: buffer length: len];
|
||||
_pointer += len;
|
||||
return len;
|
||||
|
|
Loading…
Reference in a new issue