1
#include "champlain-perl.h"
4
champlainperl_constructor_create (SV *func, SV *data) {
5
GType param_types [] = {
6
CHAMPLAIN_TYPE_MAP_SOURCE_DESC,
8
return gperl_callback_new(
10
G_N_ELEMENTS(param_types), param_types,
11
CHAMPLAIN_TYPE_MAP_SOURCE
16
static ChamplainMapSource*
17
champlainperl_constructor (ChamplainMapSourceDesc *desc, gpointer data) {
18
GPerlCallback *callback = (GPerlCallback *) data;
19
GValue return_value = { 0, };
20
ChamplainMapSource *retval;
22
if (callback == NULL) {
23
croak("Chammplain::MapSourceFactory constructor callback is missing the data parameter");
26
g_value_init(&return_value, callback->return_type);
27
/* FIXME desc is not passed as a Champlain::MapSourceDesc to the perl callback */
28
gperl_callback_invoke(callback, &return_value, desc, callback->data);
30
retval = g_value_get_object(&return_value);
31
g_value_unset(&return_value);
38
* Returns the value of the given key or croaks if there's no such key.
41
champlainperl_fetch_or_croak (HV* hash , const char* key , I32 klen) {
43
SV **s = hv_fetch(hash, key, klen, 0);
44
if (s != NULL && SvOK(*s)) {
48
croak("Hashref requires the key: '%s'", key);
52
static ChamplainMapSourceDesc*
53
champlainperl_SvChamplainMapSourceDesc (SV *data) {
56
ChamplainMapSourceDesc desc = {0,};
58
if ((!data) || (!SvOK(data)) || (!SvRV(data)) || (SvTYPE(SvRV(data)) != SVt_PVHV)) {
59
croak("SvChamplainMapSourceDesc: value must be an hashref");
62
hash = (HV *) SvRV(data);
64
/* All keys are mandatory */
65
if (value = champlainperl_fetch_or_croak(hash, "id", 2)) {
66
desc.id = g_strdup(SvGChar(value));
69
if (value = champlainperl_fetch_or_croak(hash, "name", 4)) {
70
desc.name = g_strdup(SvGChar(value));
73
if (value = champlainperl_fetch_or_croak(hash, "license", 7)) {
74
desc.license = g_strdup(SvGChar(value));
77
if (value = champlainperl_fetch_or_croak(hash, "license_uri", 11)) {
78
desc.license_uri = g_strdup(SvGChar(value));
81
if (value = champlainperl_fetch_or_croak(hash, "min_zoom_level", 14)) {
82
desc.min_zoom_level = (gint) SvIV(value);
85
if (value = champlainperl_fetch_or_croak(hash, "max_zoom_level", 14)) {
86
desc.max_zoom_level = (gint) SvIV(value);
89
if (value = champlainperl_fetch_or_croak(hash, "projection", 10)) {
90
desc.projection = SvChamplainMapProjection(value);
93
if (value = champlainperl_fetch_or_croak(hash, "uri_format", 10)) {
94
desc.uri_format = g_strdup(SvGChar(value));
97
return g_memdup(&desc, sizeof(desc));
101
MODULE = Champlain::MapSourceFactory PACKAGE = Champlain::MapSourceFactory PREFIX = champlain_map_source_factory_
104
ChamplainMapSourceFactory*
105
champlain_map_source_factory_dup_default (class)
106
C_ARGS: /* No args */
110
champlain_map_source_factory_dup_list (ChamplainMapSourceFactory *factory)
116
list = champlain_map_source_factory_dup_list(factory);
118
for (item = list; item != NULL; item = item->next) {
119
ChamplainMapSourceDesc *desc = CHAMPLAIN_MAP_SOURCE_DESC(item->data);
120
XPUSHs(sv_2mortal(newSVChamplainMapSourceDesc(desc)));
127
champlain_map_source_factory_create (ChamplainMapSourceFactory *factory, const gchar *id)
131
champlain_map_source_factory_register (ChamplainMapSourceFactory *factory, SV *sv_desc, SV* sv_constructor, SV *sv_data=NULL)
133
ChamplainMapSourceDesc *desc = NULL;
135
GPerlCallback *callback = NULL;
138
desc = champlainperl_SvChamplainMapSourceDesc(sv_desc);
139
callback = champlainperl_constructor_create(sv_constructor, sv_data);
140
RETVAL = champlain_map_source_factory_register(factory, desc, champlainperl_constructor, callback);
149
RETVAL = CHAMPLAIN_MAP_SOURCE_OSM_MAPNIK;
156
OSM_OSMARENDER (class)
158
RETVAL = CHAMPLAIN_MAP_SOURCE_OSM_OSMARENDER;
165
OSM_CYCLE_MAP (class)
167
RETVAL = CHAMPLAIN_MAP_SOURCE_OSM_CYCLE_MAP;
176
RETVAL = CHAMPLAIN_MAP_SOURCE_OAM;
185
RETVAL = CHAMPLAIN_MAP_SOURCE_MFF_RELIEF;