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 ;  
}