www.pudn.com > tvctrl.rar > import.c
/* * filename: import.c */ #include#include #include "atvdtv.h" #include "predefine.h" #include "import.h" #define DATA_FILES_NUM 6 #define DATA_ITEM_LEN 256 #define DF_PROGINDEX 0 #define DF_TUNETYPE 1 #define DF_TUNEINFO 2 #define DF_PROGDESCINFO 3 #define DF_PROGINFO 4 #define DF_PROGTYPE 5 /* 数据文件的头行保存一些提示信息,跳过 */ typedef struct tagDataImportCtrl { int current_data ;//当前打开的数据文件名标号 int total_items ;//总共的条目数,不包括第一行 int current_item ;//当前的条目号(行号) 0 -- 表示第一行,不是任何条目 FILE *dev ;//打开的设备 char *pchar_item ;//要返回的字符串 } DataImportCtrl_t; static char* DATA_FILE[] = { "TEST/test_data/ProgIndex.txt", "TEST/test_data/TuneType.txt", "TEST/test_data/TuneInfo.txt", "TEST/test_data/ProgDescInfo.txt", "TEST/test_data/ProgInfo.txt", "TEST/test_data/ProgType.txt" } ; static void * GetMemory(UINT32 size_t) { return malloc(size_t) ; } static void FreeMemory(void *ptr) { if(ptr != NULL) { free(ptr) ; } } /* --------------------内部使用的函数--------------------- */ /* 获得条目个数 */ static int get_items_num(HW_HANDLE handle) { int items_num = -1 ; FILE *file ; DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p) ; if(p->current_data < 0 || p->current_data >= DATA_FILES_NUM ) { p->total_items = 0 ; goto done ; } file = fopen(DATA_FILE[p->current_data],"r") ; assert(file) ; for(;fgets(p->pchar_item,DATA_ITEM_LEN,file);) { items_num ++ ; } // printf("\nitems_num=%d\n",items_num) ; p->total_items = items_num ; fclose(file) ; done: return items_num ; } /* *说明:以字符串形式取得句柄所指向的条目 * 首次调用该函数时打开文件,当current_item值大于total_items时,关闭所打开的文件 */ static char *get_item(HW_HANDLE handle) { DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p) ; assert(p->current_item>=0) ; if(p->current_data < 0 || p->current_data >= DATA_FILES_NUM || p->current_item > p->total_items ) { if(p->dev) { fclose(p->dev) ; p->dev = NULL ; } return NULL ; } if( !p->dev ) p->dev = fopen(DATA_FILE[p->current_data],"r") ; assert(p->dev) ; if( p->current_item == 0 ) { fgets(p->pchar_item,DATA_ITEM_LEN,p->dev) ; p->current_item ++ ; } fgets(p->pchar_item,DATA_ITEM_LEN,p->dev) ; return p->pchar_item ; } /* ==============================公开的接口=============================*/ HW_HANDLE InitDataImportModule(void) { DataImportCtrl_t *p = GetMemory(sizeof(DataImportCtrl_t)) ; if( !p ) NULL ; memset(p,0x0,sizeof(DataImportCtrl_t)) ; p->pchar_item = GetMemory(sizeof(char)*DATA_ITEM_LEN) ; return (HW_HANDLE)p ; } int CloseDataImportModule(HW_HANDLE handle) { DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p) ; if(p->dev) fclose(p->dev) ; if(p->pchar_item) FreeMemory(p->pchar_item) ; FreeMemory(p) ; return 0 ; } /* 返回-1表示失败,0为成功 */ int ImportTuneType(HW_HANDLE handle,PTUNETYPE *pp_tunetype,INT32 *p_tunetypenum) { int result = -1 ; int items_num ,index , char_num ; char *pchar = NULL ; DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p && pp_tunetype && *pp_tunetype==NULL && p_tunetypenum ) ; p->current_data = DF_TUNETYPE ; p->current_item = 0 ; items_num = get_items_num(handle) ; if(items_num < 0) goto done ; else if( items_num == 0 ) { *p_tunetypenum = 0 ; result = 0 ; goto done ; } *pp_tunetype = GetMemory(items_num * sizeof(TUNETYPE)) ; if(*pp_tunetype == NULL) { result = -1 ; goto done ; } memset(*pp_tunetype,0x0,items_num*sizeof(TUNETYPE)) ; for(index=0;;index++) { pchar = get_item(handle) ; if( !pchar ) break ; //printf("%s",pchar) ; (*pp_tunetype)[index].tunetypeid = atol(pchar) ; for(;*pchar!='"';pchar++) {} for(char_num=1;*(pchar+char_num)!='"';char_num++) {} (*pp_tunetype)[index].tunetypename = (char *) GetMemory( char_num*sizeof(char) ) ; memcpy((*pp_tunetype)[index].tunetypename,pchar+1,char_num-1 ) ; (*pp_tunetype)[index].tunetypename[char_num-1] = '\0' ; //printf("tunetypeid = %d\ttunetypename = %s\n",(*pp_tunetype)[index].tunetypeid,(*pp_tunetype)[index].tunetypename) ; p->current_item ++ ; } result = 0 ; *p_tunetypenum = items_num ; done: return result ; } /* 返回-1表示失败,0表示成功 */ int ImportTuneInfo(HW_HANDLE handle,PTUNEINFO *pp_tuneinfo,INT32 *p_tuneinfonum) { int result = -1 ; int items_num ,index ,char_num; char *pchar ; DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p && pp_tuneinfo && *pp_tuneinfo == NULL && p_tuneinfonum ) ; p->current_data = DF_TUNEINFO ; p->current_item = 0 ; items_num = get_items_num(handle) ; if( items_num < 0) //error goto done ; if( items_num == 0 ) { *p_tuneinfonum = 0 ; result = 0 ; goto done ; } *pp_tuneinfo = GetMemory(sizeof(TUNEINFO)*items_num) ; if( *pp_tuneinfo == NULL ) //error goto done ; memset(*pp_tuneinfo,0x0,sizeof(TUNEINFO)*items_num) ; for(index=0;;index++) { pchar = get_item(handle) ; if( !pchar ) break ; /* TuneID*/ (*pp_tuneinfo)[index].tuneid = atol(pchar) ; /* TuneName */ for(;*pchar!='"';pchar++) {} for(char_num=1;*(pchar+char_num)!='"';char_num++) {} (*pp_tuneinfo)[index].tunename = GetMemory(sizeof(char)*char_num) ; memcpy((*pp_tuneinfo)[index].tunename,pchar+1,char_num-1) ; (*pp_tuneinfo)[index].tunename[char_num-1] = '\0' ; /* PostID */ pchar += (char_num + 2) ; if( *(pchar+1) == '"' ) (*pp_tuneinfo)[index].postid = 0 ; (*pp_tuneinfo)[index].postid = atol(pchar+1) ; /* ContentType */ for(;*pchar!=',';pchar++) {} (*pp_tuneinfo)[index].contenttype = atol(pchar+1) ; /* ChannelType */ for(pchar++;*pchar!=',';pchar++) {} (*pp_tuneinfo)[index].channeltype = atol(pchar+1) ; p->current_item ++ ; } result = 0 ; *p_tuneinfonum = items_num ; done: return result ; } /* 返回-1表示失败,0表示成功 */ int ImportProgType(HW_HANDLE handle,PPROGTYPE *pp_progtype,INT32 *p_progtypenum) { int result = -1 ; int items_num ,index ,char_num; char *pchar ; DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p && pp_progtype && *pp_progtype == NULL && p_progtypenum ) ; p->current_data = DF_PROGTYPE ; p->current_item = 0 ; items_num = get_items_num(handle) ; if( items_num < 0) goto done ; if( items_num == 0 ) { *p_progtypenum = 0 ; result = 0 ; goto done ; } *pp_progtype = GetMemory(sizeof(TUNEINFO)*items_num) ; if( *pp_progtype == NULL ) goto done ; memset(*pp_progtype,0x0,sizeof(TUNEINFO)*items_num) ; for(index=0;;index++) { pchar = get_item(handle) ; if( !pchar ) break ; /* TypeID*/ (*pp_progtype)[index].type_id = atol(pchar) ; /* TypeName */ for(;*pchar!='"';pchar++) {} for(char_num=1;*(pchar+char_num)!='"';char_num++) {} (*pp_progtype)[index].type_name = GetMemory(sizeof(char)*char_num) ; memcpy((*pp_progtype)[index].type_name,pchar+1,char_num-1) ; (*pp_progtype)[index].type_name[char_num-1] = '\0' ; p->current_item ++ ; } result = 0 ; *p_progtypenum = items_num ; done: return result ; } /* 返回-1表示失败,0表示成功 */ int ImportProgInfo(HW_HANDLE handle,PPROGINFO *pp_proginfo,INT32 *p_proginfonum) { int result = -1 ; int items_num ,index ,char_num; char *pchar ; DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p && pp_proginfo && *pp_proginfo == NULL && p_proginfonum ) ; p->current_data = DF_PROGINFO ; p->current_item = 0 ; items_num = get_items_num(handle) ; if( items_num < 0) goto done ; if( items_num == 0 ) { *p_proginfonum = 0 ; result = 0 ; goto done ; } *pp_proginfo = GetMemory(sizeof(PROGINFO)*items_num) ; if( *pp_proginfo == NULL ) goto done ; memset(*pp_proginfo,0x0,sizeof(PROGINFO)*items_num) ; for(index=0;;index++) { pchar = get_item(handle) ; if( !pchar ) break ; /* ProgID*/ (*pp_proginfo)[index].progid = atol(pchar) ; /* MainType */ for(;*pchar!=',';pchar++) {} if( *(pchar+1) == ',' ) { (*pp_proginfo)[index].maintype = 0 ; } else { (*pp_proginfo)[index].maintype = (INT16)atol(pchar+1) ; } /* SubType */ for(pchar++;*pchar!=',';pchar++) {} if( *(pchar+1) == ',' ) { (*pp_proginfo)[index].subtype = 0 ; } else { (*pp_proginfo)[index].subtype = (INT16)atol(pchar+1) ; } /* ProgName */ for(pchar++;*pchar!='"';pchar++) {} for(char_num=1;*(pchar+char_num)!='"';char_num++) {} (*pp_proginfo)[index].progname = GetMemory(sizeof(char)*char_num) ; memcpy((*pp_proginfo)[index].progname,pchar+1,char_num-1) ; (*pp_proginfo)[index].progname[char_num-1] = '\0' ; p->current_item ++ ; } result = 0 ; *p_proginfonum = items_num ; done: return result ; } /* 返回-1表示失败,0表示成功 */ int ImportProgIndex(HW_HANDLE handle,PPROGINDEX *pp_progindex,INT32 *p_progindexnum) { int result = -1 ; int items_num ,index ,char_num ; char *pchar ; INT8 isDigit ; struct tm tm_time ; DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p && pp_progindex && *pp_progindex == NULL && p_progindexnum ) ; p->current_data = DF_PROGINDEX ; p->current_item = 0 ; items_num = get_items_num(handle) ; if( items_num < 0) goto done ; if( items_num == 0 ) { *p_progindexnum = 0 ; result = 0 ; goto done ; } *pp_progindex = GetMemory(sizeof(PROGINDEX)*items_num) ; if( *pp_progindex == NULL ) goto done ; memset(*pp_progindex,0x0,sizeof(PROGINDEX)*items_num) ; for(index=0;;index++) { pchar = get_item(handle) ; if( !pchar ) break ; /* RecID*/ (*pp_progindex)[index].recid = atol(pchar) ; /* TuneID */ for(;*pchar!=',';pchar++) {} if( *(pchar+1)==',' ) (*pp_progindex)[index].tuneid = 0 ; else (*pp_progindex)[index].tuneid = atol(++pchar) ; /* ProgID */ for(pchar++;*pchar!=',';pchar++) {} if( *(pchar+1) == ',' ) (*pp_progindex)[index].progid = 0 ; else (*pp_progindex)[index].progid = atol(++pchar) ; /* ChapterName */ for(pchar++;*pchar!='"';pchar++) {} for(isDigit=1,char_num=1;*(pchar+char_num)!='"';char_num++) { if( isDigit && ( *(pchar+char_num) > '9' || *(pchar+char_num) < '0' ) ) { isDigit = 0 ; } } if( char_num == 1 || isDigit == 0 ) (*pp_progindex)[index].chaptername = 0 ; else (*pp_progindex)[index].chaptername = atol(pchar+1) ; /* StartPlayTime */ pchar += (char_num+2) ; if( *pchar == ',' ) (*pp_progindex)[index].startplaytime = 0 ; else { tm_time.tm_year = atoi(pchar) - 1900 ; for(;*pchar!='-';pchar++) {} tm_time.tm_mon = atoi(++pchar) - 1 ; for(;*pchar!='-';pchar++) {} tm_time.tm_mday = atoi(++pchar) ; for(;*pchar!=' ';pchar++) {} tm_time.tm_hour = atoi(++pchar) ; for(;*pchar!=':';pchar++) {} tm_time.tm_min = atoi(++pchar) ; for(;*pchar!=':';pchar++) {} tm_time.tm_sec = atoi(++pchar) ; tm_time.tm_isdst = 0 ; (*pp_progindex)[index].startplaytime = mktime(&tm_time) ; } /* DurationTime */ for(pchar++;*pchar!=',';pchar++) {} if( *(pchar+1) == ',' ) (*pp_progindex)[index].durationtime = 0 ; else (*pp_progindex)[index].durationtime = atol(++pchar) ; /* DescID */ for(pchar++;*pchar!=',';pchar++) {} (*pp_progindex)[index].descid = atol(++pchar) ; p->current_item ++ ; } result = 0 ; *p_progindexnum = items_num ; done: return result ; } /* * 返回-1表示失败,0表示成功 * 由于没有数据,对DescDetail的表示不是很清楚,所以暂时只是把DescDetail设为空值 */ int ImportProgDescInfo(HW_HANDLE handle,PPROGDESCINFO *pp_progdescinfo,INT32 *p_progdescinfonum) { int result = -1 ; int items_num ,index ; char *pchar ; DataImportCtrl_t *p = (DataImportCtrl_t *)handle ; assert(p && pp_progdescinfo && *pp_progdescinfo == NULL && p_progdescinfonum ) ; p->current_data = DF_PROGDESCINFO ; p->current_item = 0 ; items_num = get_items_num(handle) ; if( items_num < 0) goto done ; if( items_num == 0 ) { *p_progdescinfonum = 0 ; result = 0 ; goto done ; } *pp_progdescinfo = GetMemory(sizeof(PROGDESCINFO)*items_num) ; if( *pp_progdescinfo == NULL ) goto done ; memset(*pp_progdescinfo,0x0,sizeof(PROGDESCINFO)*items_num) ; for(index=0;;index++) { pchar = get_item(handle) ; if( !pchar ) break ; /* DescID*/ (*pp_progdescinfo)[index].descid = atol(pchar) ; /* DescDetail */ (*pp_progdescinfo)[index].descdetail = NULL ; p->current_item ++ ; } result = 0 ; *p_progdescinfonum = items_num ; done: return result ; }