The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#############################################################################
## Name:        ext/socket/XS/SocketBase.xs
## Purpose:     XS for Wx::SocketBase
## Author:      Graciliano M. P.
## Created:     27/02/2003
## RCS-ID:      $Id: SocketBase.xs 2057 2007-06-18 23:03:00Z mbarbon $
## Copyright:   (c) 2003-2004, 2006-2007 Graciliano M. P.
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################


MODULE=Wx PACKAGE=Wx::SocketBase

#if 0

wxSocketBase*
wxSocketBase::new()
  CODE:
    RETVAL = new wxPlSocketBase( CLASS ) ;
  OUTPUT: RETVAL

#endif

void
wxSocketBase::Destroy()

bool
wxSocketBase::Ok()

bool
wxSocketBase::IsConnected()

bool
wxSocketBase::IsDisconnected()

bool
wxSocketBase::IsData()

long
wxSocketBase::LastCount()

void
wxSocketBase::Notify( notify )
    bool notify
    
void 
wxSocketBase::SetTimeout( seconds )
    int seconds
    
bool
wxSocketBase::Wait( seconds = -1 , millisecond = 0 )
    long seconds
    long millisecond

bool
wxSocketBase::WaitForRead( seconds = -1 , millisecond = 0 )
    long seconds
    long millisecond
    
bool
wxSocketBase::WaitForWrite( seconds = -1 , millisecond = 0 )
    long seconds
    long millisecond
    
long
wxSocketBase::Read( buf , size , leng = 0 )
    SV* buf
    size_t size
    size_t leng
  CODE:
    // Upgrade the SV to scalar if needed. If the scalar is undef
    // can't use SvGROW.
    SvUPGRADE(buf , SVt_PV) ;
    // Tell that the scalar is string only (not integer, double, utf8...):
    SvPOK_only(buf) ;
    
    // Grow the scalar to receive the data and return a char* point:
    char* buffer = SvGROW( buf , leng + size + 2 ) ;

    // To read at the offset the user specified (works even if offset = 0):
    if ( leng > 0 ) buffer += leng ;

    THIS->Read( buffer , size ) ;
    int nread = THIS->LastCount() ;

    // Null-terminate the buffer, not necessary, but does not hurt:
    buffer[nread] = 0 ;
    // Tell Perl how long the string is:
    SvCUR_set( buf , leng + nread ) ;
    // Undef on read error:
    if( THIS->Error() ) XSRETURN_UNDEF ;
    // Return the amount of data read, like Perl read().
    RETVAL = nread ;
  OUTPUT: RETVAL

void
wxSocketBase::Close()

void
wxSocketBase::Discard()

bool
wxSocketBase::Error()

long
wxSocketBase::GetFlags()


void
wxSocketBase::GetLocal()
  PPCODE:
    wxIPV4address addr ;
    THIS->GetLocal( addr ) ;
    XPUSHs( sv_2mortal( newSVpv( addr.Hostname().mb_str(), 0 ) ) );
    XPUSHs( sv_2mortal( newSViv( addr.Service() ) ) );


void
wxSocketBase::GetPeer()
  PPCODE:
    wxIPV4address addr ;
    THIS->GetPeer( addr ) ;
    XPUSHs( sv_2mortal( newSVpv( addr.Hostname().mb_str(), 0 ) ) );
    XPUSHs( sv_2mortal( newSViv( addr.Service() ) ) );


void
wxSocketBase::InterruptWait()

long
wxSocketBase::LastError()

long
wxSocketBase::Peek(buf , size , leng = 0 )
    SV* buf
    size_t size
    size_t leng
  CODE:
    SvUPGRADE(buf , SVt_PV) ;
    SvPOK_only(buf) ;
    char* buffer = SvGROW( buf , leng + size + 2 ) ;
    if ( leng > 0 ) { buffer += leng ;}

    THIS->Peek( buffer , size ) ;
    int nread = THIS->LastCount() ;

    buffer[nread] = 0 ;
    SvCUR_set( buf , leng + nread ) ;
    if( THIS->Error() ) XSRETURN_UNDEF ;
    RETVAL = nread ;
  OUTPUT: RETVAL


long
wxSocketBase::ReadMsg(buf , size , leng = 0 )
    SV* buf
    size_t size
    size_t leng
  CODE:
    SvUPGRADE(buf , SVt_PV) ;
    SvPOK_only(buf) ;
    char* buffer = SvGROW( buf , leng + size + 2 ) ;
    if ( leng > 0 ) { buffer += leng ;}

    THIS->ReadMsg( buffer , size ) ;
    int nread = THIS->LastCount() ;

    buffer[nread] = 0 ;
    SvCUR_set( buf , leng + nread ) ;
    if( THIS->Error() ) XSRETURN_UNDEF ;
    RETVAL = nread ;
  OUTPUT: RETVAL


void
wxSocketBase::RestoreState()

void
wxSocketBase::SaveState()

void
wxSocketBase::SetFlags(flags)
    long flags

void
wxSocketBase::SetNotify(flags)
    long flags


long
wxSocketBase::Unread(buf , size = 0)
    SV* buf
    long size
  CODE:
    // Upgrade the SV to scalar if needed. If the scalar is undef 
    // can't use SvGROW.
    SvUPGRADE(buf , SVt_PV) ;
    
    if ( size == 0 ) { size = SvCUR(buf) ;}
    THIS->Unread( SvPV_nolen(buf) , size ) ;
    RETVAL = THIS->LastCount() ;
  OUTPUT: RETVAL

bool
wxSocketBase::WaitForLost( seconds = -1 , millisecond = 0 )
    long seconds
    long millisecond

long
wxSocketBase::Write(buf , size = 0)
    SV* buf
    long size
  CODE:
    if ( size == 0 ) { size = SvCUR(buf) ;}
    THIS->Write( SvPV_nolen(buf) , size ) ;
    RETVAL = THIS->LastCount() ;
  OUTPUT: RETVAL

long
wxSocketBase::WriteMsg(buf , size = 0)
    SV* buf
    long size
  CODE:
    if ( size == 0 ) { size = SvCUR(buf) ;}
    THIS->WriteMsg( SvPV_nolen(buf) , size ) ;
    RETVAL = THIS->LastCount() ;
  OUTPUT: RETVAL


void
wxSocketBase::SetEventHandler( evthnd , id = wxID_ANY )
    wxEvtHandler* evthnd
    int id
  CODE:
    THIS->SetEventHandler( *evthnd , id );