EVENT UIAPI uieventsource( bool update ) { EVENT ev; static int ReturnIdle = 1; unsigned long start; EVENT ( *proc )(); start = uiclock(); for( ; ; ) { ev = forcedevent(); if( ev > EV_NO_EVENT ) break; if( Callback && TimerPeriodMs ) { proc = RdosWaitTimeout( WaitHandle, TimerPeriodMs ); if( proc == 0) { (*Callback)(); } else { ev = (*proc)(); if( ev > EV_NO_EVENT ) { break; } } } else { proc = RdosWaitTimeout( WaitHandle, 25 ); if( proc != 0) { ev = (*proc)(); if( ev > EV_NO_EVENT ) { break; } } if( ReturnIdle ) { ReturnIdle--; return( EV_IDLE ); } else { if( update ) uirefresh(); if( uiclock() - start >= UIData->tick_delay ) { return( EV_CLOCK_TICK ); } else if( UIData->busy_wait ) { return( EV_SINK ); } } proc = RdosWaitTimeout( WaitHandle, 250 ); if( proc != 0) { ev = (*proc)(); if( ev > EV_NO_EVENT ) { break; } } } } ReturnIdle = 1; return( ev ); }
bool RemoteConnect( void ) { #ifdef SERVER #ifdef __RDOS__ void *obj; obj = (void *)RdosWaitTimeout( wait_handle, 250 ); if( obj != NULL ) { data_socket = RdosGetTcpListen( listen_handle ); if( IS_VALID_SOCKET( data_socket ) ) { _DBG_NET(("Found a connection\r\n")); return( true ); } } #else struct timeval timeout; fd_set ready; struct sockaddr dummy; trp_socklen dummy_len = sizeof( dummy ); int rc; FD_ZERO( &ready ); FD_SET( control_socket, &ready ); timeout.tv_sec = 0; timeout.tv_usec = 10000; rc = select( control_socket + 1, &ready, 0, 0, &timeout ); if( IS_RET_OK( rc ) && rc > 0 ) { data_socket = accept( control_socket, &dummy, &dummy_len ); if( IS_VALID_SOCKET( data_socket ) ) { nodelay(); _DBG_NET(("Found a connection\r\n")); return( true ); } } #endif #else #ifdef __RDOS__ // todo: Add code for connect! #else int rc; data_socket = socket( AF_INET, SOCK_STREAM, 0 ); if( IS_VALID_SOCKET( data_socket ) ) { rc = connect( data_socket, (LPSOCKADDR)&socket_address, sizeof( socket_address ) ); if( IS_RET_OK( rc ) ) { nodelay(); return( true ); } } #endif #endif return( false ); }
int AsyncPoll( struct TDebug *obj, int ms ) { void *wait; wait = RdosWaitTimeout( obj->UserWait, ms ); if (wait) { if( HasBreak ) { ClearBreak( obj, BreakSel, BreakOffset ); HasBreak = FALSE; } return( TRUE ); } else { return( FALSE ); } }
int AsyncGo( struct TDebug *obj, int ms ) { void *wait; if( obj->CurrentThread ) { RdosResetSignal( obj->UserSignal ); DoGo( obj ); wait = RdosWaitTimeout( obj->UserWait, ms ); if ( wait ) { return( TRUE ); } else return( FALSE ); } return( TRUE ); }
int AsyncTrace( struct TDebug *obj, int ms ) { char Instr[2] = {0, 0}; int ok = TRUE; void *wait; if( obj->CurrentThread ) { BreakSel = obj->CurrentThread->Cs; BreakOffset = obj->CurrentThread->Eip; ReadMem( obj->CurrentThread, BreakSel, BreakOffset, Instr, 2 ); if ( Instr[0] == 0xF && Instr[1] == 0xB ) { BreakOffset += 7; AddBreak( obj, BreakSel, BreakOffset, TRUE ); ok = AsyncGo( obj, ms ); if( ok ) { ClearBreak( obj, BreakSel, BreakOffset ); } else { HasBreak = TRUE; } return( ok ); } else { RdosResetSignal( obj->UserSignal ); DoTrace( obj ); wait = RdosWaitTimeout( obj->UserWait, ms ); if( wait ) { return( TRUE ); } else return( FALSE ); } } return( TRUE ); }
ui_event UIAPI uieventsource( bool update ) { static int ReturnIdle = 1; ui_event ui_ev; MOUSETIME start; event_proc proc; start = uiclock(); for( ;; ) { if( HasEscape ) { HasEscape = false; ui_ev = EV_ESCAPE; break; } ui_ev = forcedevent(); if( ui_ev > EV_NO_EVENT ) break; if( Callback != NULL && TimerPeriodMs ) { proc = (event_proc)RdosWaitTimeout( WaitHandle, TimerPeriodMs ); if( proc == NULL ) { (*Callback)(); } else { ui_ev = (*proc)(); if( ui_ev > EV_NO_EVENT ) { break; } } } else { proc = (event_proc)RdosWaitTimeout( WaitHandle, 25 ); if( proc != NULL ) { ui_ev = (*proc)(); if( ui_ev > EV_NO_EVENT ) { break; } } if( ReturnIdle ) { ReturnIdle--; return( EV_IDLE ); } else { if( update ) uirefresh(); if( uiclock() - start >= UIData->tick_delay ) { return( EV_CLOCK_TICK ); } else if( UIData->busy_wait ) { return( EV_SINK ); } } proc = (event_proc)RdosWaitTimeout( WaitHandle, 250 ); if( proc != NULL ) { ui_ev = (*proc)(); if( ui_ev > EV_NO_EVENT ) { break; } } } } ReturnIdle = 1; return( ui_ev ); }
trap_retval RemoteGet( byte *rec, trap_elen len ) { unsigned_16 rec_len; len = len; _DBG_NET(("RemoteGet\r\n")); #ifdef __RDOS__ if( !IS_INVALID_SOCKET( data_socket ) && !RdosIsTcpConnectionClosed( data_socket ) ) { #else if( !IS_INVALID_SOCKET( data_socket ) ) { #endif if( FullGet( &rec_len, sizeof( rec_len ) ) == sizeof( rec_len ) ) { CONV_LE_16( rec_len ); if( rec_len == 0 || FullGet( rec, rec_len ) == rec_len ) { _DBG_NET(("Got a packet - size=%d\r\n", rec_len)); return( rec_len ); } } } return( REQUEST_FAILED ); } trap_retval RemotePut( byte *rec, trap_elen len ) { unsigned_16 send_len; _DBG_NET(("RemotePut\r\n")); #ifdef __RDOS__ if( !IS_INVALID_SOCKET( data_socket ) && !RdosIsTcpConnectionClosed( data_socket ) ) { #else if( !IS_INVALID_SOCKET( data_socket ) ) { #endif send_len = len; CONV_LE_16( send_len ); if( !IS_SOCK_ERROR( send( data_socket, (void *)&send_len, sizeof( send_len ), 0 ) ) ) { if( len == 0 || !IS_SOCK_ERROR( send( data_socket, (void *)rec, len, 0 ) ) ) { #ifdef __RDOS__ RdosPushTcpConnection( data_socket ); #endif _DBG_NET(("RemotePut...OK\r\n")); return( len ); } } } return( REQUEST_FAILED ); } #ifndef __RDOS__ static void nodelay( void ) { struct protoent *proto; int delayoff; int p; delayoff = 1; proto = getprotobyname( "tcp" ); p = proto ? proto->p_proto : IPPROTO_TCP; setsockopt( data_socket, p, TCP_NODELAY, (void *)&delayoff, sizeof( delayoff ) ); } #endif bool RemoteConnect( void ) { #ifdef SERVER #ifdef __RDOS__ void *obj; obj = RdosWaitTimeout( wait_handle, 250 ); if( obj != NULL ) { data_socket = RdosGetTcpListen( listen_handle ); if( !IS_INVALID_SOCKET( data_socket ) ) { _DBG_NET(("Found a connection\r\n")); return( TRUE ); } } #else struct timeval timeout; fd_set ready; struct sockaddr dummy; trp_socklen dummy_len = sizeof( dummy ); FD_ZERO( &ready ); FD_SET( control_socket, &ready ); timeout.tv_sec = 0; timeout.tv_usec = 10000; if( select( control_socket + 1, &ready, 0, 0, &timeout ) > 0 ) { data_socket = accept( control_socket, &dummy, &dummy_len ); if( !IS_INVALID_SOCKET( data_socket ) ) { nodelay(); _DBG_NET(("Found a connection\r\n")); return( TRUE ); } } #endif #else #ifdef __RDOS__ // todo: Add code for connect! #else data_socket = socket( AF_INET, SOCK_STREAM, 0 ); if( !IS_INVALID_SOCKET( data_socket ) ) { if( connect( data_socket, (struct sockaddr TRAPFAR *)&socket_address, sizeof( socket_address ) ) >= 0 ) { nodelay(); return( TRUE ); } } #endif #endif return( FALSE ); }