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:
rfm 2006-08-08 13:52:29 +00:00
parent 85ada8322a
commit 09394ba7d8
3 changed files with 27 additions and 9 deletions

View file

@ -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.

View file

@ -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];

View file

@ -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];
}
}
}
}