The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#############################################################################
## Name:        XS/IPC.xsp
## Purpose:     XS for IPC
## Author:      Mark Dootson
## Modified by:
## Created:     11/04/2013
## RCS-ID:      $Id: FontEnumerator.xs 2274 2007-11-10 22:37:30Z mbarbon $
## Copyright:   (c)2013 Mattia Barbon
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

%module{Wx};

// The C++ part is written longhand in "cpp/ipc.h" because
// build::Wx::XSP::Virtual cannot currently auto create a
// Perlish wrapper for methods with *buffer, *buffsize
// type params.

#if wxUSE_IPC

#define wxUSE_DDE_FOR_IPC 1
#include <wx/ipc.h>
#include <cpp/ipc.h>

%typemap{wxIPCFormat}{simple};
%typemap{wxChar*}{simple};

%loadplugin{build::Wx::XSP::Enum};
%EnumExportTag{ipc};

// dummy defines for wxWidgets 2.8.x
#if WXPERL_W_VERSION_LT( 2, 9, 0 )
#define  wxIPC_UTF16TEXT 13
#define  wxIPC_UTF8TEXT  13
#define  wxIPC_UTF32TEXT 13
#endif

enum wxIPCFormat
{
  wxIPC_INVALID,
  wxIPC_TEXT,
  wxIPC_BITMAP,
  wxIPC_METAFILE,
  wxIPC_SYLK,
  wxIPC_DIF,
  wxIPC_TIFF,
  wxIPC_OEMTEXT,
  wxIPC_DIB,
  wxIPC_PALETTE,
  wxIPC_PENDATA,
  wxIPC_RIFF,
  wxIPC_WAVE,
  wxIPC_UNICODETEXT,
  wxIPC_ENHMETAFILE,
  wxIPC_FILENAME,
  wxIPC_LOCALE,
  wxIPC_PRIVATE,
  wxIPC_UTF16TEXT,
  wxIPC_UTF8TEXT,
  wxIPC_UTF32TEXT, 
};


%{

MODULE=Wx PACKAGE=Wx::Connection

void
new( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_VOIDM_REDISP( newDefault )
        MATCH_ANY_REDISP( newBuffer )
    END_OVERLOAD( "Wx::Connection::new" )


wxConnection*
newDefault( CLASS )
    char* CLASS
  CODE:
    RETVAL = new wxPlConnection( CLASS );
  OUTPUT: RETVAL
  CLEANUP:
    wxPli_object_set_deleteable( aTHX_ ST(0), true );

wxConnection*
newBuffer( CLASS, buffer )
    char* CLASS
    SV* buffer
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    RETVAL = new wxPlConnection( CLASS, (void*)SvPVX(buffer), (size_t)SvCUR(buffer));
#else
    RETVAL = new wxPlConnection( CLASS, (wxChar*)SvPVX(buffer), (int)SvCUR(buffer));
#endif
  OUTPUT: RETVAL
  CLEANUP:
    wxPli_object_set_deleteable( aTHX_ ST(0), true );
    

static void
wxConnection::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );



## // thread OK
void
wxConnection::DESTROY()
  CODE:
    wxPli_thread_sv_unregister( aTHX_ wxPli_get_class( aTHX_ ST(0) ), THIS, ST(0) );
    if( wxPli_object_is_deleteable( aTHX_ ST(0) ) )
        delete THIS;    

#if WXPERL_W_VERSION_GE( 2, 9, 0 )
bool
wxConnection::Execute( data )
    SV* data
  CODE:
    RETVAL = THIS->Execute((void*)SvPVX(data), (size_t)SvLEN(data), wxIPC_TEXT);
  OUTPUT: RETVAL

#else
bool
wxConnection::Execute( data )
    wxString data
  CODE:
    RETVAL = THIS->Execute( data );
  OUTPUT: RETVAL

#endif

void
wxConnection::Request( item, format = wxIPC_TEXT )
    wxString item
    wxIPCFormat format
  PREINIT:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    size_t size;
#else
    int size;
#endif
  PPCODE:
    void *buffer = (void*)THIS->Request(item, &size, format);
    EXTEND( SP, 1 );
    PUSHs( sv_2mortal( newSVpvn( (char*)buffer, size) ) );

bool
wxConnection::Poke( item, data, format = wxIPC_TEXT  )
    wxString item
    SV* data
    wxIPCFormat format
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    RETVAL = THIS->Poke(item, (void*)SvPVX(data), (size_t)SvCUR(data), format);
#else
    RETVAL = THIS->Poke(item, (wxChar*)SvPVX(data), (int)SvCUR(data), format);
#endif
  OUTPUT: RETVAL
    

bool
wxConnection::StartAdvise( item )
    wxString item

bool
wxConnection::StopAdvise( item )
    wxString item

bool
wxConnection::Advise( item, data, format = wxIPC_TEXT )
    wxString item
    SV* data
    wxIPCFormat format
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    RETVAL = THIS->Advise(item, (void*)SvPVX(data), (size_t)SvCUR(data), format);
#else
    RETVAL = THIS->Advise(item, (wxChar*)SvPVX(data), (int)SvCUR(data), format);
#endif
  OUTPUT: RETVAL


bool
wxConnection::Disconnect()
  CODE:
    wxPli_object_set_deleteable( aTHX_ ST(0), true );
    RETVAL = THIS->Disconnect();
  OUTPUT: RETVAL

bool
wxConnection::GetConnected()

void
wxConnection::SetConnected( connected )
    bool connected

bool
wxConnection::OnStartAdvise( topic, item )
    wxString topic
    wxString item
  CODE:
    RETVAL = ((wxPlConnection*)THIS)->base_OnStartAdvise(topic, item);
  OUTPUT: RETVAL

bool
wxConnection::OnStopAdvise( topic, item )
    wxString topic
    wxString item
  CODE:
    RETVAL = ((wxPlConnection*)THIS)->base_OnStopAdvise(topic, item);
  OUTPUT: RETVAL


bool
wxConnection::OnDisconnect()
  CODE:
    RETVAL = ((wxPlConnection*)THIS)->base_OnDisconnect();
  OUTPUT: RETVAL


bool
wxConnection::OnExecute(topic, data, format)
    wxString topic
    SV* data
    wxIPCFormat format
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    RETVAL = ((wxPlConnection*)THIS)->base_OnExecute(topic, (void*)SvPVX(data), (size_t)SvLEN(data), format);
#else
    RETVAL = ((wxPlConnection*)THIS)->base_OnExecute(topic, (wxChar*)SvPVX(data), (int)SvLEN(data), format);
#endif
  OUTPUT: RETVAL

#if WXPERL_W_VERSION_GE( 2, 9, 0 )

bool
wxConnection::OnExec(topic, data)
    wxString topic
    wxString data
  CODE:
    RETVAL = ((wxPlConnection*)THIS)->base_OnExec(topic, data);
  OUTPUT: RETVAL

#endif

void
wxConnection::OnRequest(topic, item, format)
    wxString topic
    wxString item
    wxIPCFormat format
  PREINIT:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    size_t size;
#else
    int size;
#endif
  PPCODE:
    void *buffer = (void*)((wxPlConnection*)THIS)->base_OnRequest(topic, item, &size, format);
    EXTEND( SP, 1 );
    PUSHs( sv_2mortal( newSVpvn( (char*)buffer, size ) ) );

bool
wxConnection::OnPoke(topic, item, data, format)
    wxString topic
    wxString item
    SV* data
    wxIPCFormat format
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    RETVAL = ((wxPlConnection*)THIS)->base_OnPoke(topic, item, (void*)SvPVX(data), (size_t)SvLEN(data), format);
#else
    RETVAL = ((wxPlConnection*)THIS)->base_OnPoke(topic, item, (wxChar*)SvPVX(data), (int)SvLEN(data), format);
#endif
  OUTPUT: RETVAL


bool
wxConnection::OnAdvise(topic, item, data, format)
    wxString topic
    wxString item
    SV* data
    wxIPCFormat format
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    RETVAL = ((wxPlConnection*)THIS)->base_OnAdvise(topic, item, (void*)SvPVX(data), (size_t)SvLEN(data), format);
#else
    RETVAL = ((wxPlConnection*)THIS)->base_OnAdvise(topic, item, (wxChar*)SvPVX(data), (int)SvLEN(data), format);
#endif
  OUTPUT: RETVAL


MODULE=Wx PACKAGE=Wx::Server

wxServer*
new( CLASS )
    char* CLASS
  CODE:
    RETVAL = new wxPlServer( CLASS );
  OUTPUT: RETVAL

void
wxServer::Destroy()
  CODE:
    delete THIS;

bool
wxServer::Create( servicename )
    wxString servicename


wxConnection*
wxServer::OnAcceptConnection( topic )
    wxString topic
  CODE:
    RETVAL = (wxConnection*)((wxPlServer*)THIS)->base_OnAcceptConnection(topic);
  OUTPUT: RETVAL


MODULE=Wx PACKAGE=Wx::Client

wxClient*
new( CLASS )
    char* CLASS
  CODE:
    RETVAL = new wxPlClient( CLASS );
  OUTPUT: RETVAL

void
wxClient::Destroy()
  CODE:
    delete THIS;

bool
wxClient::ValidHost( host )
    wxString host

wxConnection*
wxClient::MakeConnection(host, server, topic )
    wxString host
    wxString server
    wxString topic
  CODE:
    RETVAL = (wxConnection*)THIS->MakeConnection(host, server, topic );
  OUTPUT: RETVAL

wxConnection*
wxClient::OnMakeConnection( )
  CODE:
    RETVAL = (wxConnection*)((wxPlClient*)THIS)->base_OnMakeConnection();
  OUTPUT: RETVAL

%}


#endif