static Bool delete_dir(void *cbck, char *item_name, char *item_path, GF_FileEnumInfo *file_info) { Bool directory_clean_mode = *(Bool*)cbck; if(directory_clean_mode) { gf_cleanup_dir(item_path); gf_rmdir(item_path); } else { gf_delete_file(item_path); } return 0; }
static void gf_m2ts_process_ait(GF_M2TS_Demuxer *ts, GF_M2TS_AIT* ait){ u32 nb_app_desc, k, desc_id, nb_of_app, j; GF_M2TS_CHANNEL_APPLICATION_INFO* ChanAppInfo; char *url_base, *url_appli_path; nb_of_app = gf_list_count(ait->application_decoded); url_base = NULL; url_appli_path = NULL; j=0; /* Link the AIT and the channel */ ChanAppInfo = gf_m2ts_get_channel_application_info(ts->ChannelAppList,ait->service_id); if(!ChanAppInfo){ GF_SAFEALLOC(ChanAppInfo,GF_M2TS_CHANNEL_APPLICATION_INFO); ChanAppInfo->service_id = ait->service_id; ChanAppInfo->Application = gf_list_new(); ChanAppInfo->ait_pid = ait->pid; gf_list_add(ts->ChannelAppList,ChanAppInfo); } ChanAppInfo->nb_application = nb_of_app; GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[DSMCC] ChanAppInfo->nb_application %d \n",ChanAppInfo->nb_application)); for(j=0 ; j<nb_of_app ; j++){ GF_M2TS_AIT_APPLICATION* Application; GF_M2TS_AIT_APPLICATION_DECODE* application_decoded; GF_SAFEALLOC(Application,GF_M2TS_AIT_APPLICATION); gf_list_add(ChanAppInfo->Application,Application); Application->http_url = NULL; Application->carousel_url = NULL; application_decoded = (GF_M2TS_AIT_APPLICATION_DECODE*)gf_list_get(ait->application_decoded,j); nb_app_desc = gf_list_count(application_decoded->application_descriptors); Application->application_control_code = application_decoded->application_control_code; Application->application_id = application_decoded->application_id; Application->broadband = 0; Application->broadcast = 0; ChanAppInfo->version_number = ait->version_number; k=0; for(k=0 ; k<nb_app_desc ; k++){ desc_id = application_decoded->application_descriptors_id[k]; switch(desc_id){ case APPLICATION_DESCRIPTOR: { GF_M2TS_APPLICATION_DESCRIPTOR* application_descriptor = (GF_M2TS_APPLICATION_DESCRIPTOR*)gf_list_get(application_decoded->application_descriptors,k); Application->priority = application_descriptor->application_priority; Application->application_profile = application_descriptor->application_profile; break; } case APPLICATION_NAME_DESCRIPTOR: { GF_M2TS_APPLICATION_NAME_DESCRIPTOR* name_descriptor = (GF_M2TS_APPLICATION_NAME_DESCRIPTOR*)gf_list_get(application_decoded->application_descriptors,k); Application->appli_name = gf_strdup(name_descriptor->application_name_char); break; } case TRANSPORT_PROTOCOL_DESCRIPTOR: { GF_M2TS_TRANSPORT_PROTOCOL_DESCRIPTOR* protocol_descriptor = (GF_M2TS_TRANSPORT_PROTOCOL_DESCRIPTOR*)gf_list_get(application_decoded->application_descriptors,k); switch(protocol_descriptor->protocol_id){ case CAROUSEL: { GF_Err e; GF_M2TS_OBJECT_CAROUSEL_SELECTOR_BYTE* Carousel_selector_byte = (GF_M2TS_OBJECT_CAROUSEL_SELECTOR_BYTE*)protocol_descriptor->selector_byte; if(ts->process_dmscc){ GF_M2TS_DSMCC_OVERLORD* dsmcc_overlord = gf_m2ts_get_dmscc_overlord(ts->dsmcc_controler,ait->service_id); Application->broadcast = 1; if(!dsmcc_overlord){ char app_url[1024], char_service_id[128]; memset(&app_url,0,1024*sizeof(char)); memset(&char_service_id,0,128*sizeof(char)); dsmcc_overlord = gf_m2ts_init_dsmcc_overlord(ait->service_id); dsmcc_overlord->application_id = Application->application_id; sprintf(char_service_id,"%d",dsmcc_overlord->service_id); dsmcc_overlord->root_dir = (char*)gf_calloc(strlen(ts->dsmcc_root_dir)+2+strlen(char_service_id),sizeof(char)); sprintf(dsmcc_overlord->root_dir,"%s%c%s",ts->dsmcc_root_dir,GF_PATH_SEPARATOR,char_service_id); e = gf_mkdir(dsmcc_overlord->root_dir); if(e){ GF_LOG(GF_LOG_INFO, GF_LOG_CONTAINER, ("[Process DSMCC] Error during the creation of the directory %s \n",dsmcc_overlord->root_dir)); if(e == GF_BAD_PARAM){ gf_cleanup_dir(dsmcc_overlord->root_dir); } } sprintf(app_url,"%s%cindex.html",dsmcc_overlord->root_dir,GF_PATH_SEPARATOR); Application->carousel_url = gf_strdup(app_url); gf_list_add(ts->dsmcc_controler,dsmcc_overlord); } } if(Carousel_selector_byte->remote_connection){ Application->carousel_pid = Carousel_selector_byte->service_id; } Application->component_tag = Carousel_selector_byte->component_tag; break; } case TRANSPORT_HTTP: { GF_M2TS_TRANSPORT_HTTP_SELECTOR_BYTE* Transport_http_selector_byte = (GF_M2TS_TRANSPORT_HTTP_SELECTOR_BYTE*)protocol_descriptor->selector_byte; url_base = Transport_http_selector_byte->URL_base_byte; Application->broadband = 1; } default: { } } break; } case SIMPLE_APPLICATION_LOCATION_DESCRIPTOR: { GF_M2TS_SIMPLE_APPLICATION_LOCATION* Simple_application_location = (GF_M2TS_SIMPLE_APPLICATION_LOCATION*)gf_list_get(application_decoded->application_descriptors,k); url_appli_path = Simple_application_location->initial_path_bytes; break; } case APPLICATION_USAGE_DESCRIPTOR: { break; } default: { GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("[Process AIT] Descriptor tag %d unknown, ignoring the descriptor \n",desc_id)); } } if((url_base != NULL) && ( url_appli_path != NULL)){ u32 url_length = (strlen(url_base)+strlen(url_appli_path)); Application->http_url = (char*)gf_calloc(url_length + 1,sizeof(char)); sprintf(Application->http_url,"%s%s",url_base,url_appli_path); Application->http_url[url_length]=0; Application->url_received = 1; url_base = NULL; url_appli_path = NULL; GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[Process AIT] SERVICE ID %d URL %s \n",ChanAppInfo->service_id,Application->http_url)); } } } if(ts->process_dmscc){ GF_M2TS_DSMCC_OVERLORD* dsmcc_overlord = gf_m2ts_get_dmscc_overlord(ts->dsmcc_controler,ait->service_id); if(dsmcc_overlord && !gf_m2ts_is_dmscc_app(ChanAppInfo)){ gf_cleanup_dir(dsmcc_overlord->root_dir); gf_rmdir(dsmcc_overlord->root_dir); gf_m2ts_delete_dsmcc_overlord(dsmcc_overlord); } } }