Esempio n. 1
0
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 );
}
Esempio n. 2
0
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 );
}
Esempio n. 3
0
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 );
    }
}
Esempio n. 4
0
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 );
}
Esempio n. 5
0
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 );
}
Esempio n. 6
0
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 );
}
Esempio n. 7
0
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 );
}