www.pudn.com > tvctrl.rar > httpreq.c


  
#include "httpreq.h"  
#include "tvmisc.h"  
  
#define HTTP_DOWNLOAD_MAX_RETRY 3  
#define HTTP_URLSET_FILE "/etc/update.conf"  
#define HTTP_URLSET_SECTION "SETTING"  
#define HTTP_URLSET_KEY "serverurl"  
  
#define GLH_DEBUG(x...) fprintf(stderr,x)  
  
/*  
static char *host_url = "http://www.5tcl.com/" ;  
*/  
static char *default_host_url = "http://192.168.1.21:80/" ;  
static char host_url[128] = {0} ;  
				 	  
static int url_request(unsigned char *url, int method, char **pdata, int *pdatalen, LPHTTPSINK sink) ;  
  
static int GetFieldStrValue(char **pstr, char *FieldName, char *FieldValue, int FieldValueBufLen) ;  
static int GetFieldFromString(char *str, char *TableName, int TableNameBufLen,   
								int *pDataOff, int *pDataLen, int *pZipLen) ;  
static int GetFieldFromStringEx(char *str, char *TableName, int TableNameBufLen,   
								int **ppDataOff, int *pDataSegNums, int *pDataLen, int *pZipLen) ;  
					  
static int DumpRecvTitle(char *str) ;  
  
static int DumpTvTypeTbl(FILE *out, TVTYPE *tbl, int nums) ;  
static int DumpTvNameTbl(FILE *out, TVINFO *tbl, int nums) ;  
static int DumpPlayTbl(FILE *out, EPGRECORD *tbl, int nums) ;  
static int DumpProgTbl(FILE *out, PROGRAMRECORD *tbl, int nums, char *name, int len) ;  
static int DumpProgDescTbl(FILE *out, char *desc, int len) ;  
static int DumpProgTypeTbl(FILE *out, TYPERECORD *tbl, int nums) ;  
static int DownloadHttpFileRequest(unsigned char *url,int method,char **data,int *len,LPHTTPSINK sink) ;  
static int UploadHttpFileRequest(unsigned char *url,int method,char *data,int len,LPHTTPSINK sink) ;  
  
  
/*  
	url:		请求的url  
	pdata:		指向返回的数据区  
	pdatalen: 	数据长度  
	sink:		回调函数  
*/  
static int url_request(unsigned char *url, int method, char **data, int *len, LPHTTPSINK sink)  
{  
	ghttp_request * req;  
	char * buff;  
	int    bodylen;  
	ghttp_status status;  
	unsigned char *parameter ;  
	unsigned char *uri ;  
	unsigned char *mix_url ;  
	  
	if (url == NULL  
		|| data == NULL  
		|| len == NULL  
		)  
		return (HTTP_GENERAL_ERROR) ;  
			  
	uri = (unsigned char *)malloc(1024);  
	mix_url = (unsigned char *)malloc(2048);  
	  
	if (host_url[0])  
	{  
		sprintf(mix_url, "%s%s", host_url, url) ;  
	}  
	else  
	if (GetValueFromIniFile(HTTP_URLSET_FILE, HTTP_URLSET_SECTION,  
							HTTP_URLSET_KEY, mix_url, 2048) == ETC_OK  
		)  
	{  
		strcat(mix_url, url) ;  
	}  
	else  
	if (default_host_url  
		&& default_host_url[0]  
		)  
	{  
		sprintf(mix_url, "%s%s", default_host_url, url) ;  
	}  
	else  
	{  
		free ((unsigned char *)uri);  
		free ((unsigned char *)mix_url);  
		return HTTP_URL_ERROR;  
	}  
	  
	url = mix_url ;  
	parameter = (unsigned char *)strstr((const char *)url,"?");  
#ifdef __DEBUG__  
	printf("url:%s\n", url) ;  
	printf("uri:%s\n", uri) ;  
#endif  
  
	bzero(uri,1024);  
	req = ghttp_request_new();  
	ghttp_set_chunksize(req,4096);	  
	if(parameter)  
	{  
		parameter++;  
		strncpy((char *)uri, (char *)url, parameter-url-1);  
		if(method & HTTP_METHOD_GET)  
		{  
			if(ghttp_set_uri(req, (char *)url)==-1)  
			{  
				ghttp_request_destroy(req);  
				free ((unsigned char *)uri);  
				free ((unsigned char *)mix_url);  
				return HTTP_URL_ERROR;  
			}  
		}  
		else  
		{  
			if(ghttp_set_uri(req, (char *)uri)==-1)  
			{  
				ghttp_request_destroy(req);  
				free ((unsigned char *)uri);  
				free ((unsigned char *)mix_url);  
				return HTTP_URL_ERROR;  
			}  
			ghttp_set_type(req, ghttp_type_post);  
			ghttp_set_body(req, (char *)parameter, strlen((char *)parameter));  
		 }  
	}  
	else  
	{  
		if(ghttp_set_uri(req,(char *)url)==-1)  
		{  
		    ghttp_request_destroy(req);  
		    free ((unsigned char *)uri);  
		    free ((unsigned char *)mix_url);  
		    return HTTP_URL_ERROR;  
		}  
    	}  
  
    	ghttp_set_sync(req, ghttp_async);  
		ghttp_prepare(req);  
	          
	do  
	{  
	 	status = ghttp_process(req);    
	    			  
		if (status ==  ghttp_error)  
		{  
			ghttp_request_destroy(req);  
			free ((unsigned char *)uri);  
			free ((unsigned char *)mix_url);  
         	      	 return HTTP_PROCESS_ERROR;  
         	}  
         	  
		if(!(method & HTTP_METHOD_WHOLE))  
		{     
			int procLen = ghttp_get_body_len(req);  
            if(procLen  > 0)  
            {  
               	if(status != ghttp_done)  
				{  
					ghttp_flush_response_buffer(req);  
				}  
			}  
		}  
            	  
		buff = ghttp_get_body(req);  
		bodylen = ghttp_get_body_len(req);  
		if(sink && sink(buff,bodylen) == 0)  
		{  
			if(status == ghttp_not_done)  
			{  
				status = ghttp_error;  
				ghttp_request_destroy(req);  
			}  
			  
			ghttp_request_destroy(req);  
			free ((unsigned char *)uri);  
			free ((unsigned char *)mix_url);  
         	      	return HTTP_SINK_CANCEL;  
		}	  
	    	  
	}while (status == ghttp_not_done);  
          
        if(ghttp_status_code(req) == 302)  
        {  
        	ghttp_request_destroy(req);	  
		free ((unsigned char *)uri);  
		free ((unsigned char *)mix_url);  
        	return HTTP_URL_REMOVE ;    
        }    
                	  
	if(data)  
	{  
		buff = ghttp_get_body(req);  
        	bodylen = ghttp_get_body_len(req);  
		*data = NULL;  
		*len = bodylen;  
		if(bodylen > 0 &&   
			(method & HTTP_METHOD_WHOLE))  
		{  
			*data = (char *)malloc(bodylen);  
			memcpy(*data,buff,bodylen);  
		}  
	}  
	  
	ghttp_request_destroy(req);	  
	free ((unsigned char *)uri);  
	free ((unsigned char *)mix_url);  
	return HTTP_NO_ERROR;  
}  
  
  
static int DownloadHttpFileRequest(unsigned char *url,int method,char **data,int *len,LPHTTPSINK sink)  
{  
	int result = -1 ;  
	  
	result = url_request(url, method, data, len, sink) ;  
	  
	return (result) ;	  
}  
  
static int UploadHttpFileRequest(unsigned char *url,int method,char *data,int len,LPHTTPSINK sink)  
{  
	int result = -1 ;  
	  
	return (result) ;	  
}  
  
// 台名类型表  
int GetTvTypeTbl(char *HostType, char *UserId, char *UserPwd, char *PostId,  
				 	int method, char **pdata, int *pdatalen, LPHTTPSINK sink)  
{  
	int result = -1 ;  
	int r ;  
	char tmpstr[128] ;  
	char *nullstr = "" ;  
	char *host_type ;  
	char *user_id ;  
	char *user_pwd ;  
	char *post_id ;  
	  
	host_type 		= (HostType?HostType:nullstr) ;  
	user_id 		= (UserId?UserId:nullstr) ;  
	user_pwd 		= (UserPwd?UserPwd:nullstr) ;  
	post_id 		= (PostId?PostId:nullstr) ;  
	  
	sprintf(tmpstr, "EpgSvr/EpgSvr.dll?GetTvTypeTbl?HostType=%s&UserId=%s&UserPwd=%s&PostId=%s",  
					host_type, user_id, user_pwd, post_id  
					) ;  
					  
	r = DownloadHttpFileRequest(tmpstr, method, pdata, pdatalen, sink) ;  
	result = r ;  
	  
	return (result) ;  
}  
  
// 台名表  
int GetTvNameTbl(char *HostType, char *UserId, char *UserPwd, char *PostId,  
					int method, char **pdata, int *pdatalen, LPHTTPSINK sink)  
{  
	int result = -1 ;  
	int r ;  
	char tmpstr[128] ;  
	char *nullstr = "" ;  
	char *host_type ;  
	char *user_id ;  
	char *user_pwd ;  
	char *post_id ;  
	  
	host_type 		= (HostType?HostType:nullstr) ;  
	user_id 		= (UserId?UserId:nullstr) ;  
	user_pwd 		= (UserPwd?UserPwd:nullstr) ;  
	post_id 		= (PostId?PostId:nullstr) ;  
	  
	sprintf(tmpstr, "EpgSvr/EpgSvr.dll?GetTvNameTbl?HostType=%s&UserId=%s&UserPwd=%s&PostId=%s",  
					host_type, user_id, user_pwd, post_id  
					) ;  
					  
	r = DownloadHttpFileRequest(tmpstr, method, pdata, pdatalen, sink) ;  
	result = r ;  
	  
	return (result) ;  
}  
  
// 播放表  
int GetPlayTbl(char *HostType, char *UserId, char *UserPwd, char *PostId,   
					time_t StartDateTime, time_t EndDateTime, int TvId,  
					int method, char **pdata, int *pdatalen, LPHTTPSINK sink)  
{  
	int result = -1 ;  
	int r ;  
	char tmpstr[128] ;  
	char tvidstr[16] ;  
	char *nullstr = "" ;  
	char *host_type ;  
	char *user_id ;  
	char *user_pwd ;  
	char *post_id ;  
	  
	host_type 		= (HostType?HostType:nullstr) ;  
	user_id 		= (UserId?UserId:nullstr) ;  
	user_pwd 		= (UserPwd?UserPwd:nullstr) ;  
	post_id 		= (PostId?PostId:nullstr) ;  
	  
	if (TvId > 0)  
		sprintf(tvidstr, "%d", TvId) ;  
	else  
		tvidstr[0] = 0x00 ;  
  
	sprintf(tmpstr, "EpgSvr/EpgSvr.dll?GetPlayTbl?HostType=%s&UserId=%s&UserPwd=%s&PostId=%s&StartDateTime=%ld&EndDateTime=%ld&TvId=%s",  
					host_type, user_id, user_pwd, post_id,  
					StartDateTime, EndDateTime, tvidstr  
					) ;  
  
	r = DownloadHttpFileRequest(tmpstr, method, pdata, pdatalen, sink) ;  
	result = r ;  
  
	return (result) ;  
}  
  
// 节目表  
int GetProgTbl(char *HostType, char *UserId, char *UserPwd, char *PostId,  
					int method, char **pdata, int *pdatalen, LPHTTPSINK sink)  
{  
	int result = -1 ;  
	int r ;  
	char tmpstr[128] ;  
	char *nullstr = "" ;  
	char *host_type ;  
	char *user_id ;  
	char *user_pwd ;  
	char *post_id ;  
	  
	host_type 		= (HostType?HostType:nullstr) ;  
	user_id 		= (UserId?UserId:nullstr) ;  
	user_pwd 		= (UserPwd?UserPwd:nullstr) ;  
	post_id 		= (PostId?PostId:nullstr) ;  
	  
	sprintf(tmpstr, "EpgSvr/EpgSvr.dll?GetProgTbl?HostType=%s&UserId=%s&UserPwd=%s&PostId=%s",  
					host_type, user_id, user_pwd, post_id  
					) ;  
					  
	r = DownloadHttpFileRequest(tmpstr, method, pdata, pdatalen, sink) ;  
	result = r ;  
	  
	return (result) ;  
}  
  
// 节目描述表  
int GetProgDescTbl(char *HostType, char *UserId, char *UserPwd, char *PostId,  
					int ProgId,  
					int method, char **pdata, int *pdatalen, LPHTTPSINK sink)  
{  
	int result = -1 ;  
	int r ;  
	char tmpstr[128] ;  
	char progidstr[16] ;  
	char *nullstr = "" ;  
	char *host_type ;  
	char *user_id ;  
	char *user_pwd ;  
	char *post_id ;  
	  
	host_type 		= (HostType?HostType:nullstr) ;  
	user_id 		= (UserId?UserId:nullstr) ;  
	user_pwd 		= (UserPwd?UserPwd:nullstr) ;  
	post_id 		= (PostId?PostId:nullstr) ;  
  
	if (ProgId > 0)  
		sprintf(progidstr, "%d", ProgId) ;  
	else  
		progidstr[0] = 0x00 ;  
		  
	sprintf(tmpstr, "EpgSvr/EpgSvr.dll?GetProgDescTbl?HostType=%s&UserId=%s&UserPwd=%s&PostId=%s&ProgId=%s",  
					host_type, user_id, user_pwd, post_id,  
					progidstr  
					) ;  
					  
	r = DownloadHttpFileRequest(tmpstr, method, pdata, pdatalen, sink) ;  
	result = r ;  
	  
	return (result) ;  
}  
  
// 节目类型表  
int GetProgTypeTbl(char *HostType, char *UserId, char *UserPwd, char *PostId,  
					int method, char **pdata, int *pdatalen, LPHTTPSINK sink)  
{  
	int result = -1 ;  
	int r ;  
	char tmpstr[128] ;  
	char *nullstr = "" ;  
	char *host_type ;  
	char *user_id ;  
	char *user_pwd ;  
	char *post_id ;  
	  
	host_type 		= (HostType?HostType:nullstr) ;  
	user_id 		= (UserId?UserId:nullstr) ;  
	user_pwd 		= (UserPwd?UserPwd:nullstr) ;  
	post_id 		= (PostId?PostId:nullstr) ;  
	  
	sprintf(tmpstr, "EpgSvr/EpgSvr.dll?GetProgTypeTbl?HostType=%s&UserId=%s&UserPwd=%s&PostId=%s",  
					host_type, user_id, user_pwd, post_id  
					) ;  
					  
	r = DownloadHttpFileRequest(tmpstr, method, pdata, pdatalen, sink) ;  
	result = r ;  
	  
	return (result) ;  
}  
  
static char *HttpHeadTitle[] =  
{  
	"Table=",  
	"DataOff=",  
	"DataLen=",  
	"ZipLen="  
} ;  
  
static int GetFieldStrValue(char **pstr, char *FieldName, char *FieldValue, int FieldValueBufLen)  
{  
	int result = -1 ;  
	int i, j ;  
	  
	if (pstr  
		&& *pstr  
		&& FieldName  
		&& FieldValue  
		&& FieldValueBufLen > 0  
		)  
	{  
		int len = strlen(FieldName) ;  
		char *p = *pstr ;  
		char **pp = pstr ;  
		  
		if (strncmp(p, FieldName, len) == 0)  
		{  
			i = len ;  
			for (j=i; ; j++)  
			{  
				if (p[j] == 0x00  
					|| p[j] == '&'  
					)  
				{  
					if ((j-i) < FieldValueBufLen  
						&& (j-i) > 0  
						)  
					{  
						memcpy(FieldValue, p+i, (j-i)) ;  
						FieldValue[j-i] = 0x00 ;  
						if (p[j] == 0x00)  
							*pp = *pp + j ;  
						else  
							*pp = *pp + j + 1 ;  
						result = 0 ;  
					}  
					else  
					if ((j-i) > 0)  
					{  
						memcpy(FieldValue, p+i, FieldValueBufLen-1) ;  
						FieldValue[FieldValueBufLen-1] = 0x00 ;  
						if (p[j] == 0x00)  
							*pp = *pp + j ;  
						else  
							*pp = *pp + j + 1 ;  
						result = 1 ;  
					}  
					else  
					{  
						  
					}  
					break ;  
				}  
			}  
		}  
	}  
		  
	return (result) ;	  
}  
  
static int GetFieldFromString(char *str, char *TableName, int TableNameBufLen,   
								int *pDataOff, int *pDataLen, int *pZipLen)  
{  
	int result = -1 ;  
	int r ;  
	char tmpstr[128] ;  
	  
	if (str  
		&& TableNameBufLen > 0  
		&& TableName  
		&& pDataOff  
		&& pDataLen  
		&& pZipLen  
		)  
	{  
		char *p = str ;  
		  
		r = GetFieldStrValue(&p, HttpHeadTitle[0], TableName, TableNameBufLen) ;  
		if (r != 0)  
			goto done ;  
			  
		if (!(p  
			&& p[0]  
			&& ((r = GetFieldStrValue(&p, HttpHeadTitle[1], tmpstr, (int)sizeof(tmpstr))) == 0)  
				)  
			)  
			goto done ;  
			  
		*pDataOff = atoi(tmpstr) ;  
		  
		if (!(p  
			&& p[0]  
			&& ((r = GetFieldStrValue(&p, HttpHeadTitle[2], tmpstr, (int)sizeof(tmpstr))) == 0)  
				)  
			)  
			goto done ;  
			  
		*pDataLen = atoi(tmpstr) ;  
		  
		if (!(p  
			&& p[0]  
			&& ((r = GetFieldStrValue(&p, HttpHeadTitle[3], tmpstr, (int)sizeof(tmpstr))) == 0)  
				)  
			)  
			goto done ;  
			  
		*pZipLen = atoi(tmpstr) ;  
  
		result = 0 ;  
	}  
	  
done:  
	return (result) ;	  
}  
  
  
static int GetFieldFromStringEx(char *str, char *TableName, int TableNameBufLen,   
								int **ppDataOff, int *pDataSegNums, int *pDataLen, int *pZipLen)  
{  
	int result = -1 ;  
	int i, segs ;  
	int r ;  
	char tmpstr[128] ;  
	  
	if (str  
		&& TableNameBufLen > 0  
		&& TableName  
		&& ppDataOff  
		&& pDataSegNums  
		&& pDataLen  
		&& pZipLen  
		)  
	{  
		char *p = str ;  
		char *pp ;  
		  
		r = GetFieldStrValue(&p, HttpHeadTitle[0], TableName, TableNameBufLen) ;  
		if (r != 0)  
			goto done ;  
		  
		pp = p ;  
		for (i=0,segs=0; ; i++)  
		{  
			if (p  
				&& p[0]  
				)  
			{  
				r = GetFieldStrValue(&p, HttpHeadTitle[1], tmpstr, (int)sizeof(tmpstr)) ;  
				if (r >= 0)  
					segs++ ;  
				else  
					break ;  
			}  
		}  
		  
		if (segs > 0  
			&& (*ppDataOff = (int *)malloc(sizeof(int)*segs))  
			)  
		{  
			/* 还原 */  
			p = pp ;  
			for (i=0; i 0  
		)  
	{  
		char TableName[32] = {0} ;  
		int DataOff = 0 ;  
		int DataLen = 0 ;  
		int ZipLen = 0 ;  
		  
		r = GetFieldFromString(p, TableName, (int)sizeof(TableName), &DataOff, &DataLen, &ZipLen) ;  
		if (DataOff > 0  
			&& DataLen > 0  
			&& DataLen > DataOff  
			)  
		{  
			int itemNums = (DataLen-DataOff)/sizeof(TVTYPE)	;  
			  
			if (itemNums > 0)  
			{  
				if (tvtype)  
					*tvtype = (TVTYPE *)(p+DataOff) ;  
				if (nums)  
					*nums = itemNums ;  
				result = 0 ;  
			}  
		}  
	}  
	pTvTypeTblData = p ;  
	  
	return (result) ;  
}  
  
int FreeTvTypeTblData()  
{  
	int result = 0 ;  
	  
	if (pTvTypeTblData) {free(pTvTypeTblData) ; pTvTypeTblData = NULL ;}  
	  
	return (result) ;  
}  
  
/*======================================================*/  
int GetTvNameTblData(TVINFO **tvinfo, int *nums)  
{  
	int result = -1 ;  
	int r ;  
	char *p = NULL ;  
	int len = 0 ;  
	  
	r = GetTvNameTbl(NULL, NULL, NULL, NULL, HTTP_METHOD_GET|HTTP_METHOD_WHOLE, &p, &len, 0) ;  
	  
	if (r == 0  
		&& p  
		&& len > 0  
		)  
	{  
		char TableName[32] = {0} ;  
		int DataOff = 0 ;  
		int DataLen = 0 ;  
		int ZipLen = 0 ;  
		  
		GLH_DEBUG("\nGetTvNameTblData>>>p=%08x,len=%d",p,len);  
		r = GetFieldFromString(p, TableName, (int)sizeof(TableName), &DataOff, &DataLen, &ZipLen) ;  
		if (DataOff > 0  
			&& DataLen > 0  
			&& DataLen > DataOff  
			)  
		{  
			int itemNums = (DataLen-DataOff)/sizeof(TVINFO)	;  
			GLH_DEBUG("\nGetTvNameTblData>>>itmeNums=%d",itemNums);  
			if (itemNums > 0)  
			{  
				if (tvinfo)  
					*tvinfo = (TVINFO *)(p+DataOff) ;  
				if (nums)  
					*nums = itemNums ;  
				result = 0 ;  
			}  
		}  
	}  
	pTvNameTblData = p ;  
	  
	return (result) ;  
}  
  
int FreeTvNameTblData()  
{  
	int result = 0 ;  
	  
	if (pTvNameTblData) {free(pTvNameTblData) ; pTvNameTblData = NULL ;}  
	  
	return (result) ;  
}  
  
  
/*======================================================*/  
int GetPlayTblData(EPGRECORD **epgrecord, int *nums, char **progdesc, int *progdesclen, time_t starttime, time_t endtime, int tvid)  
{  
	int result = -1 ;  
	int r ;  
	char *p = NULL ;  
	int len = 0 ;  
	  
	r = GetPlayTbl(NULL, NULL, NULL, NULL,  
					starttime, endtime, tvid,  
					HTTP_METHOD_GET|HTTP_METHOD_WHOLE, &p, &len, 0) ;  
	  
	if (r == 0  
		&& p  
		&& len > 0  
		)  
	{  
		char TableName[32] = {0} ;  
		int *pDataOff = NULL ;  
		int DataSegNums = 0 ;  
		int DataLen = 0 ;  
		int ZipLen = 0 ;  
		  
		r = GetFieldFromStringEx(p, TableName, (int)sizeof(TableName), &pDataOff, &DataSegNums, &DataLen, &ZipLen) ;  
#ifdef __DEBUG__  
		printf("GetFieldFromStringEx(), DataSegNums=%d \n", DataSegNums) ;  
#endif  
		if (DataSegNums > 0  
			&& pDataOff  
			&& pDataOff[0] > 0  
			&& DataLen > 0  
			&& DataLen > pDataOff[0]  
			)  
		{  
			int itemNums ;  
			int textLen ;  
  
			if (DataSegNums > 1  
				&& pDataOff[1] > 0  
				&& pDataOff[1] >= pDataOff[0]  
				&& DataLen >= pDataOff[1]  
				)  
			{  
				itemNums = (pDataOff[1]-pDataOff[0])/sizeof(EPGRECORD) ;  
				textLen = DataLen-pDataOff[1] ;  
				if (itemNums > 0)  
				{  
					if (epgrecord)  
						*epgrecord = (EPGRECORD *)(p+pDataOff[0]) ;  
					if (nums)  
						*nums = itemNums ;  
					if (progdesc)  
						*progdesc = (char *)(p+pDataOff[1]) ;  
					if (progdesclen)  
						*progdesclen = textLen ;  
					result = 0 ;  
				}  
			}  
			else  
			if (DataSegNums == 1)  
			{  
				itemNums = (DataLen-pDataOff[0])/sizeof(EPGRECORD) ;  
				if (itemNums > 0)  
				{  
					if (epgrecord)  
						*epgrecord = (EPGRECORD *)(p+pDataOff[0]) ;  
					if (nums)  
						*nums = itemNums ;  
					if (progdesc)  
						*progdesc = (char *)NULL ;  
					if (progdesclen)  
						*progdesclen = 0 ;  
					result = 0 ;  
				}  
			}  
		}  
		/* 释放GetFieldFromStringEx()中分配的内存 */  
		if (pDataOff) free(pDataOff) ;  
	}  
	pPlayTblData = p ;  
  
	return (result) ;  
}  
  
int FreePlayTblData()  
{  
	int result = 0 ;  
	  
	if (pPlayTblData) {free(pPlayTblData) ; pPlayTblData = NULL ;}  
	  
	return (result) ;  
}  
  
/*======================================================*/  
int GetProgTblData(PROGRAMRECORD **programrecord, int *nums, char **programname, int *programnamelen)  
{  
	int result = -1 ;  
	int r ;  
	char *p = NULL ;  
	int len = 0 ;  
	  
	r = GetProgTbl(NULL, NULL, NULL, NULL,  
					HTTP_METHOD_GET|HTTP_METHOD_WHOLE, &p, &len, 0) ;  
	  
	if (r == 0  
		&& p  
		&& len > 0  
		)  
	{  
		char TableName[32] = {0} ;  
		int *pDataOff = NULL ;  
		int DataSegNums = 0 ;  
		int DataLen = 0 ;  
		int ZipLen = 0 ;  
		  
		r = GetFieldFromStringEx(p, TableName, (int)sizeof(TableName), &pDataOff, &DataSegNums, &DataLen, &ZipLen) ;  
#ifdef __DEBUG__  
		printf("GetFieldFromStringEx(), DataSegNums=%d \n", DataSegNums) ;  
#endif  
		if (pDataOff  
			&& DataSegNums == 2  
			&& pDataOff[0] > 0  
			&& pDataOff[1] > pDataOff[0]  
			&& DataLen > 0  
			&& DataLen > pDataOff[1]  
			)  
		{  
			int itemNums = (pDataOff[1]-pDataOff[0])/sizeof(PROGRAMRECORD)	;  
			  
			if (itemNums > 0)  
			{  
				if (programrecord)  
					*programrecord = (PROGRAMRECORD *)(p+pDataOff[0]) ;  
				if (nums)  
					*nums = itemNums ;  
					  
				if (programname)  
					*programname = (char *)(p+pDataOff[1]) ;  
				if (programnamelen)  
					*programnamelen = DataLen-pDataOff[1] ;  
				  
				result = 0 ;  
			}  
#ifdef __DEBUG__  
			printf("GetProgTblData(), DataLen=%d itemNums=%d pDataOff[0]=%d pDataOff[1]=%d \n",  
							DataLen, itemNums, pDataOff[0], pDataOff[1]) ;  
#endif  
		}  
		/* 释放GetFieldFromStringEx()中分配的内存 */  
		if (pDataOff) free(pDataOff) ;  
	}  
	pProgTblData = p ;  
		  
	return (result) ;  
}  
  
int FreeProgTblData()  
{  
	int result = 0 ;  
	  
	if (pProgTblData) {free(pProgTblData) ; pProgTblData = NULL ;}  
	  
	return (result) ;  
}  
  
/*======================================================*/  
int GetProgDescTblData(char **progdesc, int *nums, int progid)  
{  
	int result = -1 ;  
	int r ;  
	char *p = NULL ;  
	int len = 0 ;  
	  
	r = GetProgDescTbl(NULL, NULL, NULL, NULL,  
					progid,  
					HTTP_METHOD_GET|HTTP_METHOD_WHOLE, &p, &len, 0) ;  
	  
	if (r == 0  
		&& p  
		&& len > 0  
		)  
	{  
		char TableName[32] = {0} ;  
		int DataOff = 0 ;  
		int DataLen = 0 ;  
		int ZipLen = 0 ;  
		  
		r = GetFieldFromString(p, TableName, (int)sizeof(TableName), &DataOff, &DataLen, &ZipLen) ;  
		if (DataOff > 0  
			&& DataLen > 0  
			&& DataLen > DataOff  
			)  
		{  
			if (progdesc)  
				*progdesc = (char *)(p+DataOff) ;  
			if (nums)  
				*nums = 1 ;  
			result = 0 ;  
		}  
	}  
	pProgDescTblData = p ;  
		  
	return (result) ;  
}  
  
int FreeProgDescTblData()  
{  
	int result = 0 ;  
	  
	if (pProgDescTblData) {free(pProgDescTblData) ; pProgDescTblData = NULL ;}  
	  
	return (result) ;  
}  
  
/*======================================================*/  
int GetProgTypeTblData(TYPERECORD **typerecord, int *nums)  
{  
	int result = -1 ;  
	int r ;  
	char *p = NULL ;  
	int len = 0 ;  
	  
	r = GetProgTypeTbl(NULL, NULL, NULL, NULL, HTTP_METHOD_GET|HTTP_METHOD_WHOLE, &p, &len, 0) ;  
	  
	if (r == 0  
		&& p  
		&& len > 0  
		)  
	{  
		char TableName[32] = {0} ;  
		int DataOff = 0 ;  
		int DataLen = 0 ;  
		int ZipLen = 0 ;  
		  
		r = GetFieldFromString(p, TableName, (int)sizeof(TableName), &DataOff, &DataLen, &ZipLen) ;  
		if (DataOff > 0  
			&& DataLen > 0  
			&& DataLen > DataOff  
			)  
		{  
			int itemNums = (DataLen-DataOff)/sizeof(TYPERECORD)	;  
			  
			if (itemNums > 0)  
			{  
				if (typerecord)  
					*typerecord = (TYPERECORD *)(p+DataOff) ;  
				if (nums)  
					*nums = itemNums ;  
				result = 0 ;  
			}  
		}  
	}  
	pProgTypeTblData = p ;  
	  
	return (result) ;  
}  
  
int FreeProgTypeTblData()  
{  
	int result = 0 ;  
	  
	if (pProgTypeTblData) {free(pProgTypeTblData) ; pProgTypeTblData = NULL ;}  
	  
	return (result) ;  
}  
  
/*======================================================*/  
int HttpSetHostUrl(char *url)  
{  
	int result = -1 ;  
	  
	if (url  
		&& url[0]  
		&& strlen(url) < sizeof(host_url)  
		)  
	{  
		strcpy(host_url, url) ;	  
		result = 0 ;  
	}  
	  
	return (result) ;  
}  
  
int HttpGetHostUrl(char *urlbuf, int buflen)  
{  
	int result = -1 ;  
	  
	if (urlbuf  
		&& host_url[0]  
		&& buflen > strlen(host_url)  
		)  
	{  
		strcpy(urlbuf, host_url) ;  
		result = 0 ;	  
	}  
	else  
	if (urlbuf  
		&& buflen > 0  
		&& GetValueFromIniFile(HTTP_URLSET_FILE, HTTP_URLSET_SECTION,  
							HTTP_URLSET_KEY, urlbuf, buflen) == ETC_OK  
		)  
	{  
		result = 0 ;  
	}  
	else  
	if (urlbuf  
		&& default_host_url  
		&& default_host_url[0]  
		&& buflen > strlen(default_host_url)  
		)  
	{  
		strcpy(urlbuf, default_host_url) ;  
		result = 0 ;  
	}  
	  
	return (result) ;  
}  
  
int HttpEmptyHostUrl()  
{  
	int result = 0 ;  
	  
	bzero(host_url,sizeof(host_url)) ;  
	  
	return (result) ;  
}  
  
/*======================================================*/  
static int DumpRecvTitle(char *str)  
{  
	int result = 0 ;  
	int r ;  
	int i ;  
	  
	if (str  
		&& str[0]  
		)  
	{  
		char TableName[32] = {0} ;  
		int *pDataOff = NULL ;  
		int DataSegNums = 0 ;  
		int DataLen = 0 ;  
		int ZipLen = 0 ;  
		char *p = str ;  
		  
		r = GetFieldFromStringEx(p, TableName, (int)sizeof(TableName), &pDataOff, &DataSegNums, &DataLen, &ZipLen) ;  
		printf("GetFieldFromString()=%d \n", r) ;  
		  
		if (r == 0  
			&& pDataOff  
			&& DataSegNums > 0  
			)  
		{  
			printf("\n result: TableName=\"%s\" DataSegNums=%d DataLen=%d ZipLen=%d \n\n", TableName, DataSegNums, DataLen, ZipLen) ;  
			for (i=0; i 0  
		)  
	{  
		for (i=0; itype_id, (tbl+i)->sortindex, (tbl+i)->flags, (tbl+i)->type_name) ;  
		}  
		result = 0 ;  
	}  
	  
	return (result) ;  
}  
  
static int DumpTvNameTbl(FILE *out, TVINFO *tbl, int nums)  
{  
	int result = -1 ;  
	int r ;  
	int i ;  
	  
	fprintf(out, "\n\n *****OUTPUT \"TvNameTbl\"***** \n") ;  
	fprintf(out, "tvid\t type_id\t name \n") ;  
	  
	if (out  
		&& tbl  
		&& nums > 0  
		)  
	{  
		for (i=0; itvid, (tbl+i)->type_id, (tbl+i)->name) ;  
		}  
		result = 0 ;  
	}  
	  
	return (result) ;  
}  
  
static int DumpPlayTbl(FILE *out, EPGRECORD *tbl, int nums)  
{  
	int result = -1 ;  
	int r ;  
	int i ;  
	  
	fprintf(out, "\n\n *****OUTPUT \"TvTypeTbl\"***** \n") ;  
	fprintf(out, "programid\t con_time\t tvid\t chapter\t playtime\n") ;  
	  
	if (out  
		&& tbl  
		&& nums > 0  
		)  
	{  
		for (i=0; iplaytime)) ;  
			  
			fprintf(out, "%10d\t %10d\t %10d\t %10d\t ", (tbl+i)->programid, (tbl+i)->con_time, (tbl+i)->tvid, (tbl+i)->chapter) ;  
			if (t)  
			{  
				fprintf(out, "%04d-%02d-%02d %02d:%02d:%02d\n", (int)(t->tm_year+1900), (int)t->tm_mon, (int)t->tm_mday,  
								(int)t->tm_hour, (int)t->tm_min, (int)t->tm_sec) ;  
			}  
			else  
			{  
				fprintf(out, " *?*?*?*?*?\n") ;  
			}  
		}  
		result = 0 ;  
	}  
	  
	return (result) ;  
}  
  
static int DumpProgTbl(FILE *out, PROGRAMRECORD *tbl, int nums, char *name, int len)  
{  
	int result = -1 ;  
	int r ;  
	int i ;  
	  
	fprintf(out, "\n\n *****OUTPUT \"ProgTbl\"***** \n") ;  
	fprintf(out, "\n programid\t maintype\t subtype\t infoindex\t name \n") ;  
	  
	if (out  
		&& tbl  
		&& nums > 0  
		)  
	{  
		for (i=0; iprogramid, (int)(tbl+i)->maintype, (int)(tbl+i)->subtype) ;  
			if ((tbl+i)->name  
				&& ((int)((tbl+i)->name)) > 0  
				&& ((int)((tbl+i)->name)) < len  
			)  
			{  
				fprintf(out, " %s\n", (name+(int)((tbl+i)->name))) ;  
			}  
			else  
			if ((tbl+i)->name)  
			{  
				fprintf(out, " XXXXX\n") ;  
			}  
			else  
			{  
				fprintf(out, " ????? \n") ;  
			}  
		}  
		result = 0 ;  
	}  
	  
	return (result) ;  
}  
  
static int DumpProgDescTbl(FILE *out, char *desc, int len)  
{  
	int result = -1 ;  
	int r ;  
	int i ;  
	  
	fprintf(out, "\n\n *****OUTPUT \"ProgDescTbl\"***** \n") ;  
	  
	if (out  
		&& desc  
		&& len > 0  
		)  
	{  
		result = 0 ;  
	}  
	  
	return (result) ;  
}  
  
static int DumpProgTypeTbl(FILE *out, TYPERECORD *tbl, int nums)  
{  
	int result = -1 ;  
	int r ;  
	int i ;  
	  
	fprintf(out, "\n\n *****OUTPUT \"ProgTypeTbl\"***** \n") ;  
	fprintf(out, "type_id\t type_name \n") ;  
	  
	if (out  
		&& tbl  
		&& nums > 0  
		)  
	{  
		for (i=0; itype_id, (tbl+i)->type_name) ;  
		}  
		result = 0 ;  
	}  
	  
	return (result) ;  
}