mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-24 01:11:01 +00:00
Try to handle end of stream more consistently.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@23216 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
85ada8322a
commit
09394ba7d8
3 changed files with 27 additions and 9 deletions
|
@ -355,6 +355,8 @@ static RunLoopEventType typeForStream(NSStream *aStream)
|
|||
|
||||
- (void) _sendEvent: (NSStreamEvent)event
|
||||
{
|
||||
BOOL mayReachEnd = NO;
|
||||
|
||||
if (event == NSStreamEventHasSpaceAvailable
|
||||
|| event == NSStreamEventHasBytesAvailable)
|
||||
{
|
||||
|
@ -364,10 +366,25 @@ static RunLoopEventType typeForStream(NSStream *aStream)
|
|||
*/
|
||||
_unhandledData = YES;
|
||||
_unhandledData = YES;
|
||||
mayReachEnd = YES;
|
||||
}
|
||||
if (_delegateValid == YES)
|
||||
{
|
||||
[(id <GSStreamListener>)_delegate stream: self handleEvent: event];
|
||||
|
||||
/* If we were not at the end, but a read or write within the
|
||||
* delegate's handler method caused us to reach the end, we must
|
||||
* send an event to say so.
|
||||
*/
|
||||
if (mayReachEnd == YES && [self streamStatus] == NSStreamStatusAtEnd)
|
||||
{
|
||||
if (_delegateValid == YES)
|
||||
{
|
||||
event = NSStreamEventEndEncountered;
|
||||
[(id <GSStreamListener>)_delegate stream: self
|
||||
handleEvent: event];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -394,7 +411,8 @@ static RunLoopEventType typeForStream(NSStream *aStream)
|
|||
- (BOOL) runLoopShouldBlock: (BOOL*)trigger
|
||||
{
|
||||
if (_unhandledData == YES
|
||||
|| _currentStatus == NSStreamStatusError)
|
||||
|| _currentStatus == NSStreamStatusError
|
||||
|| _currentStatus == NSStreamStatusAtEnd)
|
||||
{
|
||||
/* If we have an unhandled data event, we should not watch for more
|
||||
* or trigger until the appropriate rad or write has been done.
|
||||
|
|
|
@ -522,6 +522,10 @@ static void setNonblocking(int fd)
|
|||
[_sibling _sendEvent: myEvent];
|
||||
}
|
||||
}
|
||||
else if ([self streamStatus] == NSStreamStatusAtEnd)
|
||||
{
|
||||
myEvent = NSStreamEventEndEncountered;
|
||||
}
|
||||
else
|
||||
{
|
||||
[self _setStatus: NSStreamStatusOpen];
|
||||
|
@ -878,6 +882,10 @@ static void setNonblocking(int fd)
|
|||
[_sibling _sendEvent: myEvent];
|
||||
}
|
||||
}
|
||||
else if ([self streamStatus] == NSStreamStatusAtEnd)
|
||||
{
|
||||
myEvent = NSStreamEventEndEncountered;
|
||||
}
|
||||
else
|
||||
{
|
||||
[self _setStatus: NSStreamStatusOpen];
|
||||
|
|
|
@ -840,10 +840,6 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
|
|||
{
|
||||
[self _sendEvent: NSStreamEventHasBytesAvailable];
|
||||
}
|
||||
if ([self streamStatus] == NSStreamStatusAtEnd)
|
||||
{
|
||||
[self _sendEvent: NSStreamEventEndEncountered];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1403,10 +1399,6 @@ else NSLog(@"EVENTS:%x", events.lNetworkEvents);
|
|||
{
|
||||
[_sibling _sendEvent: NSStreamEventHasBytesAvailable];
|
||||
}
|
||||
if ([_sibling streamStatus] == NSStreamStatusAtEnd)
|
||||
{
|
||||
[_sibling _sendEvent: NSStreamEventEndEncountered];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue