static void imagetexture_destroy(GF_Node *node, void *rs, Bool is_destroy) { if (is_destroy) { GF_TextureHandler *txh = (GF_TextureHandler *) gf_node_get_private(node); /*cleanup cache if needed*/ if (gf_node_get_tag(node)==TAG_MPEG4_CacheTexture) { char section[64]; const char *opt, *file; Bool delete_file = 1; M_CacheTexture *ct = (M_CacheTexture*)node; sprintf(section, "@cache=%p", ct); file = gf_cfg_get_key(txh->compositor->user->config, section, "cacheFile"); opt = gf_cfg_get_key(txh->compositor->user->config, section, "expireAfterNTP"); if (opt) { u32 sec, frac, exp; sscanf(opt, "%u", &exp); gf_net_get_ntp(&sec, &frac); if (!exp || (exp>sec)) delete_file=0; } if (delete_file) { gf_delete_file((char*)file); gf_cfg_del_section(txh->compositor->user->config, section); } if (txh->data) gf_free(txh->data); txh->data = NULL; } gf_sc_texture_destroy(txh); gf_free(txh); } }
void gf_storage_save(M_Storage *storage) { char szID[20]; u32 i; GF_Config *cfg = storage_get_cfg(storage); char *section = storage_get_section(storage); if (!cfg || !section) return; gf_cfg_del_section(cfg, section); if (storage->expireAfter) { u32 sec, frac; char szNTP[100]; gf_net_get_ntp(&sec, &frac); sec += storage->expireAfter; sprintf(szNTP, "%u", sec); gf_cfg_set_key(cfg, section, "expireAfterNTP", szNTP); } else { gf_cfg_set_key(cfg, section, "expireAfterNTP", "0"); } for (i=0; i<storage->storageList.count; i++) { char *val; GF_FieldInfo info; sprintf(szID, "%d", i); if (!storage->storageList.vals[i].node) break; if (gf_node_get_field(storage->storageList.vals[i].node, storage->storageList.vals[i].fieldIndex, &info) != GF_OK) break; if (gf_sg_vrml_is_sf_field(info.fieldType)) { val = storage_serialize_sf(info.far_ptr, info.fieldType); } else { //u32 sftype = gf_sg_vrml_get_sf_type(info.fieldType); char *slotval; void *slot; val = NULL; for (i=0; i<((GenMFField *)info.far_ptr)->count; i++) { if (gf_sg_vrml_mf_get_item(info.far_ptr, info.fieldType, &slot, i) != GF_OK) break; slotval = storage_serialize_sf(info.far_ptr, info.fieldType); if (!slotval) break; if (val) { val = gf_realloc(val, strlen(val) + 3 + strlen(slot)); } else { val = gf_malloc(3 + strlen(slot)); val[0] = 0; } strcat(val, "'"); strcat(val, slotval); strcat(val, "'"); gf_free(slot); } } if (val) { gf_cfg_set_key(cfg, section, szID, val); gf_free(val); } } gf_free(section); }
void compositor_init_imagetexture(GF_Compositor *compositor, GF_Node *node) { GF_TextureHandler *txh; GF_SAFEALLOC(txh, GF_TextureHandler); gf_sc_texture_setup(txh, compositor, node); txh->update_texture_fcnt = imagetexture_update; gf_node_set_private(node, txh); gf_node_set_callback_function(node, imagetexture_destroy); txh->flags = 0; if (gf_node_get_tag(txh->owner)!=TAG_MPEG4_CacheTexture) { if (((M_ImageTexture*)node)->repeatS) txh->flags |= GF_SR_TEXTURE_REPEAT_S; if (((M_ImageTexture*)node)->repeatT) txh->flags |= GF_SR_TEXTURE_REPEAT_T; } else { const char *url; u32 i, count; M_CacheTexture*ct = (M_CacheTexture*)node; if (!ct->image.buffer) return; if (ct->repeatS) txh->flags |= GF_SR_TEXTURE_REPEAT_S; if (ct->repeatT) txh->flags |= GF_SR_TEXTURE_REPEAT_T; /*locate existing cache*/ url = gf_scene_get_service_url( gf_node_get_graph(node) ); count = gf_cfg_get_section_count(compositor->user->config); for (i=0; i<count; i++) { const char *opt; const char *name = gf_cfg_get_section_name(compositor->user->config, i); if (strncmp(name, "@cache=", 7)) continue; opt = gf_cfg_get_key(compositor->user->config, name, "serviceURL"); if (!opt || stricmp(opt, url)) continue; opt = gf_cfg_get_key(compositor->user->config, name, "cacheName"); if (opt && ct->cacheURL.buffer && !stricmp(opt, ct->cacheURL.buffer)) { opt = gf_cfg_get_key(compositor->user->config, name, "cacheFile"); if (opt) gf_delete_file((char*)opt); gf_cfg_del_section(compositor->user->config, name); break; } } } }
static void gf_storage_load(M_Storage *storage) { const char *opt; char szID[20]; u32 i, count; u32 sec, exp, frac; GF_Config *cfg = storage_get_cfg(storage); char *section = storage_get_section(storage); if (!cfg || !section) return; if (!gf_cfg_get_key_count(cfg, section)) { gf_free(section); return; } opt = gf_cfg_get_key(cfg, section, "expireAfterNTP"); gf_net_get_ntp(&sec, &frac); sscanf(opt, "%u", &exp); if (exp && (exp<=sec)) { gf_cfg_del_section(cfg, section); gf_free(section); return; } count = gf_cfg_get_key_count(cfg, section)-1; if (!count || (count!=storage->storageList.count)) { gf_cfg_del_section(cfg, section); gf_free(section); return; } for (i=0; i<count; i++) { GF_FieldInfo info; sprintf(szID, "%d", i); opt = gf_cfg_get_key(cfg, section, szID); if (!opt) break; if (!storage->storageList.vals[i].node) break; if (gf_node_get_field(storage->storageList.vals[i].node, storage->storageList.vals[i].fieldIndex, &info) != GF_OK) break; if (gf_sg_vrml_is_sf_field(info.fieldType)) { storage_parse_sf(info.far_ptr, info.fieldType, (char *) opt); } else { u32 sftype = gf_sg_vrml_get_sf_type(info.fieldType); char *sep, *val; void *slot; gf_sg_vrml_mf_reset(info.far_ptr, info.fieldType); while (1) { val = strchr(opt, '\''); sep = val ? strchr(val+1, '\'') : NULL; if (!val || !sep) break; sep[0] = 0; gf_sg_vrml_mf_append(info.far_ptr, info.fieldType, &slot); storage_parse_sf(slot, sftype, val+1); sep[0] = '\''; opt = sep+1; } } gf_node_changed(storage->storageList.vals[i].node, &info); } gf_free(section); }