#include "perl_xmmsclient.h"
void
perl_xmmsclient_xmmsc_result_propdict_foreach_cb (const void *key,
xmmsc_result_value_type_t type,
const void *value,
const char *source,
void *user_data)
{
HV *hash = (HV *)user_data;
HV *subhash;
if (hv_exists (hash, source, strlen (source))) {
SV **sv = hv_fetch (hash, source, strlen (source), 0);
if (!*sv || !SvOK (*sv) || !SvROK (*sv) || !(SvTYPE (SvRV (*sv)) == SVt_PVHV)) {
croak ("Hash element is not an array reference");
}
subhash = (HV *)SvRV (*sv);
} else {
subhash = newHV ();
hv_store (hash, source, strlen (source), newRV_inc ((SV *)subhash), 0);
}
hv_store (subhash, (const char *)key, strlen ((const char *)key), perl_xmmsclient_xmms_result_cast_value (type, value), 0);
}
MODULE = Audio::XMMSClient::Result::PropDict PACKAGE = Audio::XMMSClient::Result::PropDict
void
set_source_preference (sv, ...)
SV *sv
PREINIT:
int i;
MAGIC *mg = NULL;
xmmsc_result_t *res;
char **prefs;
CODE:
if (!(mg = perl_xmmsclient_get_magic_from_sv (sv, "Audio::XMMSClient::Result::PropDict"))) {
croak ("bug");
}
res = (xmmsc_result_t *)mg->mg_ptr;
prefs = (char **)malloc (sizeof (char *) * items);
for (i = 1; i < items; i++) {
prefs[i] = SvPV_nolen (ST (i));
}
prefs[items] = NULL;
xmmsc_result_source_preference_set (res, (const char **)prefs);
free (prefs);
SV *
source_hash (sv)
SV *sv
PREINIT:
int ret;
HV *val;
MAGIC *mg = NULL;
xmmsc_result_t *res;
CODE:
if (!(mg = perl_xmmsclient_get_magic_from_sv (sv, "Audio::XMMSClient::Result::PropDict"))) {
croak ("bug");
}
res = (xmmsc_result_t *)mg->mg_ptr;
val = newHV ();
ret = xmmsc_result_propdict_foreach (res, perl_xmmsclient_xmmsc_result_propdict_foreach_cb, val);
if (ret == 0) {
croak("Could not fetch dict value");
}
RETVAL = newRV_noinc ((SV *)val);
OUTPUT:
RETVAL
BOOT:
PERL_UNUSED_VAR (items);