|
|
|
@ -44,75 +44,98 @@ static |
|
|
|
TR_EventDone |
|
|
|
ioHandlerRead(void * _this, TR_Event event) |
|
|
|
{ |
|
|
|
TR_Event revent; |
|
|
|
TR_EventDone done = TR_EVENT_DONE; |
|
|
|
|
|
|
|
switch (TR_cepBufferRead((TR_CommEndPoint)event->subject)) { |
|
|
|
default: |
|
|
|
case FALSE: |
|
|
|
case FALSE: // EAGAIN |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_READ_BLOCK, |
|
|
|
NULL); |
|
|
|
break; |
|
|
|
|
|
|
|
case -1: // error |
|
|
|
TR_eventHandlerIssueEvent( |
|
|
|
(TR_EventHandler)_this, |
|
|
|
TR_eventSubjectEmit( |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_CLOSE, |
|
|
|
NULL)); |
|
|
|
NULL); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
case -2: // remote close |
|
|
|
TR_eventHandlerIssueEvent( |
|
|
|
(TR_EventHandler)_this, |
|
|
|
TR_eventSubjectEmit( |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_SHUT_READ, |
|
|
|
NULL)); |
|
|
|
NULL); |
|
|
|
break; |
|
|
|
|
|
|
|
case TRUE: |
|
|
|
TR_eventHandlerIssueEvent( |
|
|
|
(TR_EventHandler)_this, |
|
|
|
TR_eventSubjectEmit( |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_NEW_DATA, |
|
|
|
NULL)); |
|
|
|
NULL); |
|
|
|
|
|
|
|
done = TR_EVENT_PENDING; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return TR_EVENT_DONE; |
|
|
|
TR_eventHandlerIssueEvent((TR_EventHandler)_this, revent); |
|
|
|
return done; |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
TR_EventDone |
|
|
|
ioHandlerWrite(void * _this, TR_Event event) |
|
|
|
{ |
|
|
|
TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
|
|
|
TR_Event revent, close_event = NULL; |
|
|
|
TR_EventDone done = TR_EVENT_DONE; |
|
|
|
|
|
|
|
if (TR_cepWriteBuffered(endpoint)) { |
|
|
|
if (TR_cepHasPendingData(endpoint)) { |
|
|
|
TR_eventHandlerIssueEvent( |
|
|
|
(TR_EventHandler)_this, |
|
|
|
TR_eventSubjectEmit( |
|
|
|
switch (TR_cepWriteBuffered((TR_CommEndPoint)event->subject)) { |
|
|
|
case FALSE: // EAGAIN |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_PENDING_DATA, |
|
|
|
NULL)); |
|
|
|
NULL); |
|
|
|
break; |
|
|
|
|
|
|
|
case -1: // FAILURE |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_CLOSE, |
|
|
|
NULL); |
|
|
|
break; |
|
|
|
|
|
|
|
case -2: // remote close |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_SHUT_WRITE, |
|
|
|
NULL); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
if (TR_cepHasPendingData((TR_CommEndPoint)event->subject)) { |
|
|
|
done = TR_EVENT_PENDING; |
|
|
|
} else { |
|
|
|
TR_eventHandlerIssueEvent( |
|
|
|
(TR_EventHandler)_this, |
|
|
|
TR_eventSubjectEmit( |
|
|
|
revent = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_END_DATA, |
|
|
|
NULL)); |
|
|
|
if (TRUE == endpoint->do_close) { |
|
|
|
TR_eventHandlerIssueEvent( |
|
|
|
(TR_EventHandler)_this, |
|
|
|
TR_eventSubjectEmit( |
|
|
|
NULL); |
|
|
|
|
|
|
|
if (TRUE == ((TR_CommEndPoint)event->subject)->do_close) { |
|
|
|
close_event = TR_eventSubjectEmit( |
|
|
|
event->subject, |
|
|
|
TR_CEP_EVENT_CLOSE, |
|
|
|
NULL)); |
|
|
|
NULL); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return TR_EVENT_DONE; |
|
|
|
TR_eventHandlerIssueEvent((TR_EventHandler)_this, revent); |
|
|
|
if (close_event) { |
|
|
|
TR_eventHandlerIssueEvent((TR_EventHandler)_this, close_event); |
|
|
|
} |
|
|
|
return done; |
|
|
|
} |
|
|
|
|
|
|
|
static |
|
|
|
|