#include #include #include #include #define NEED_sv_2pvbyte #define NEED_sv_2pv_nolen_GLOBAL #define NEED_newRV_noinc_GLOBAL #include "ppport.h" #include #define PERL_XMMSCLIENT_CALL_BOOT(name) \ { \ EXTERN_C XS(name); \ _perl_xmmsclient_call_xs (aTHX_ name, cv, mark); \ } #ifdef PERL_IMPLICIT_CONTEXT #define dPERL_XMMS_CLIENT_CALLBACK_MARSHAL_SP \ SV **sp; #define PERL_XMMS_CLIENT_MARSHAL_INIT(cb) \ PERL_SET_CONTEXT (cb->priv); \ SPAGAIN; #else #define dPERL_XMMS_CLIENT_CALLBACK_MARSHAL_SP \ dSP; #define PERL_XMMS_CLIENT_MARSHAL_INIT(cb) \ /* nothing to do */ #endif typedef struct perl_xmmsclient_playlist_St { xmmsc_connection_t *conn; char *name; } perl_xmmsclient_playlist_t; typedef enum { PERL_XMMSCLIENT_CALLBACK_PARAM_TYPE_UNKNOWN, PERL_XMMSCLIENT_CALLBACK_PARAM_TYPE_CONNECTION, PERL_XMMSCLIENT_CALLBACK_PARAM_TYPE_RESULT, PERL_XMMSCLIENT_CALLBACK_PARAM_TYPE_FLAG } PerlXMMSClientCallbackParamType; typedef struct _PerlXMMSClientCallback PerlXMMSClientCallback; struct _PerlXMMSClientCallback { SV *func; SV *data; SV *wrapper; int n_params; PerlXMMSClientCallbackParamType *param_types; #ifdef PERL_IMPLICIT_CONTEXT void *priv; #endif }; void _perl_xmmsclient_call_xs (pTHX_ void (*subaddr) (pTHX_ CV *cv), CV *cv, SV **mark); SV *perl_xmmsclient_new_sv_from_ptr (void *con, const char *class); MAGIC *perl_xmmsclient_get_magic_from_sv (SV *sv, const char *class); void *perl_xmmsclient_get_ptr_from_sv (SV *sv, const char *class); PerlXMMSClientCallback *perl_xmmsclient_callback_new (SV *func, SV *data, SV *wrapper, int n_params, PerlXMMSClientCallbackParamType param_types[]); void perl_xmmsclient_callback_destroy (PerlXMMSClientCallback *cb); void perl_xmmsclient_callback_invoke (PerlXMMSClientCallback *cb, ...); SV *perl_xmmsclient_xmms_result_cast_value (xmmsc_result_value_type_t type, const void *value); char **perl_xmmsclient_unpack_char_ptr_ptr (SV *sv); SV *perl_xmmsclient_hv_fetch (HV *hv, const char *key, I32 klen); perl_xmmsclient_playlist_t *perl_xmmsclient_playlist_new (xmmsc_connection_t *c, const char *playlist); void perl_xmmsclient_playlist_destroy (perl_xmmsclient_playlist_t *p);