GF_EXPORT GF_Err gf_term_get_mfurl_from_xlink(GF_Node *node, MFURL *mfurl) { u32 stream_id = 0; GF_Err e = GF_OK; SFURL *sfurl = NULL; GF_FieldInfo info; XMLRI *iri; GF_Scene *scene = gf_sg_get_private(gf_node_get_graph(node)); if (!scene) return GF_BAD_PARAM; gf_sg_vrml_mf_reset(mfurl, GF_SG_VRML_MFURL); e = gf_node_get_attribute_by_tag(node, TAG_XLINK_ATT_href, 0, 0, &info); if (e) return e; iri = (XMLRI*)info.far_ptr; if (iri->type==XMLRI_STREAMID) { stream_id = iri->lsr_stream_id; } else if (!iri->string) return GF_OK; mfurl->count = 1; GF_SAFEALLOC(mfurl->vals, SFURL) sfurl = mfurl->vals; sfurl->OD_ID = stream_id; if (stream_id) return GF_OK; if (!strncmp(iri->string, "data:", 5)) { const char *cache_dir = gf_cfg_get_key(scene->root_od->term->user->config, "General", "CacheDirectory"); e = gf_node_store_embedded_data(iri, cache_dir, "embedded_"); if (e) return e; sfurl->url = gf_strdup(iri->string); return GF_OK; } sfurl->url = gf_term_resolve_xlink(node, iri->string); return e; }
static void svg_a_handle_event(GF_Node *handler, GF_DOM_Event *event, GF_Node *observer) { GF_Compositor *compositor; GF_Event evt; SVG_Element *a; SVGAllAttributes all_atts; if (event->event_phase & GF_DOM_EVENT_PHASE_PREVENT) return; assert(gf_node_get_tag((GF_Node*)event->currentTarget->ptr)==TAG_SVG_a); a = (SVG_Element *) event->currentTarget->ptr; gf_svg_flatten_attributes(a, &all_atts); compositor = (GF_Compositor *)gf_node_get_private((GF_Node *)handler); if (!compositor->user->EventProc) return; if (!all_atts.xlink_href) return; if (event->type==GF_EVENT_MOUSEOVER) { evt.type = GF_EVENT_NAVIGATE_INFO; if (all_atts.xlink_title) evt.navigate.to_url = *all_atts.xlink_title; else if (all_atts.xlink_href->string) evt.navigate.to_url = all_atts.xlink_href->string; else { evt.navigate.to_url = gf_node_get_name(all_atts.xlink_href->target); if (!evt.navigate.to_url) evt.navigate.to_url = "document internal link"; } gf_term_send_event(compositor->term, &evt); return; } evt.type = GF_EVENT_NAVIGATE; if (all_atts.xlink_href->type == XMLRI_STRING) { evt.navigate.to_url = gf_term_resolve_xlink(handler, all_atts.xlink_href->string); if (evt.navigate.to_url) { if (all_atts.target) { evt.navigate.parameters = (const char **) &all_atts.target; evt.navigate.param_count = 1; } else { evt.navigate.parameters = NULL; evt.navigate.param_count = 0; } if (evt.navigate.to_url[0] != '#') { if (compositor->term) { gf_scene_process_anchor(handler, &evt); } else { gf_term_send_event(compositor->term, &evt); } gf_free((char *)evt.navigate.to_url); return; } all_atts.xlink_href->target = gf_sg_find_node_by_name(gf_node_get_graph(handler), (char *) evt.navigate.to_url+1); if (all_atts.xlink_href->target) { all_atts.xlink_href->type = XMLRI_ELEMENTID; gf_free((char *)evt.navigate.to_url); } else { svg_a_set_view(handler, compositor, evt.navigate.to_url + 1); gf_free((char *)evt.navigate.to_url); return; } } } if (!all_atts.xlink_href->target) { return; } /*this is a time event*/ if (is_timing_target(all_atts.xlink_href->target)) { gf_smil_timing_insert_clock(all_atts.xlink_href->target, 0, gf_node_get_scene_time((GF_Node *)handler) ); } /*this is an implicit SVGView event*/ else { svg_a_set_view(handler, compositor, gf_node_get_name(all_atts.xlink_href->target)); } }