⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emldb.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
#include "email.h"
#include "emlfunc.h"
#include "emldb.h"
#include "fstouser.h"			////gfd

/***********************************************************************************************/
STATUS TransCreateEmail(  EMAIL_STRU *email_stru, U8 reserved )
{
	U8			i;
	U8			*add_data, *data;
	FIELDLIST	fieldlist[EMAIL_FIELD_NUM];
	U16			datalen;
	U32			tmp_id;
	DBLACB		*emaillacb;
	emaillacb =  LinkDataBase( EMAIL_DATA_BASE );	//链接电子邮件数据库

	fieldlist[0].fieldvalue = email_stru->time;
	fieldlist[1].fieldvalue = email_stru->subject;
	fieldlist[2].fieldvalue = email_stru->addresser;
	fieldlist[3].fieldvalue = email_stru->type;
	fieldlist[4].fieldvalue = email_stru->box;
	fieldlist[5].fieldvalue = email_stru->addressee;
	fieldlist[6].fieldvalue = email_stru->content;
	datalen = (WORD)( EMAIL_FIELD_NUM * sizeof(WORD) );
	for( i = 0; i < EMAIL_FIELD_NUM; i++ )
	{
		if( fieldlist[i].fieldvalue == NULL )
		{
			fieldlist[i].headoffset = 0;
		}else{
			fieldlist[i].headoffset = datalen;
			datalen += (U16)( strlen( fieldlist[i].fieldvalue ) + 1 );
		}
	}
	
	add_data = (BYTE *)Lmalloc(datalen);
	if( add_data == NULL )
		return EMAIL_ERROR;
	data = add_data;

	for( i = 0; i < EMAIL_FIELD_NUM; i++ )	//填充偏移值
	{
		memcpy( data, &fieldlist[i].headoffset, sizeof(WORD) );
		data += sizeof(WORD);
	}

	for( i = 0; i < EMAIL_FIELD_NUM; i++ )	//填充字段值
	{
		if( fieldlist[i].headoffset != 0 )
		{
			memcpy( data, fieldlist[i].fieldvalue , ( strlen( fieldlist[i].fieldvalue ) + 1 ) );
			data += ( strlen( fieldlist[i].fieldvalue ) + 1 );
		}
	}

	tmp_id = LocalAddRecord( emaillacb, add_data, datalen );
	DetachDataBase( emaillacb );
	Lfree(add_data);
	if( tmp_id == DB_ERROR )
		return EMAIL_ERROR;

	return	EMAIL_OK;
}

/***********************************************************************************************/
STATUS TransModifyEmail( LOCALSEARCHLIST *global_email_list, U16 select_no, EMAIL_STRU *email_stru, U8 reserved )
{
	U8			i;
	U8			*modify_data, *data;
	FIELDLIST	fieldlist[EMAIL_FIELD_NUM];
	U16			datalen;
	DBLACB		*emaillacb;
	emaillacb =  LinkDataBase( EMAIL_DATA_BASE );	//链接电子邮件数据库

	fieldlist[0].fieldvalue = email_stru->time;
	fieldlist[1].fieldvalue = email_stru->subject;
	fieldlist[2].fieldvalue = email_stru->addresser;
	fieldlist[3].fieldvalue = email_stru->type;
	fieldlist[4].fieldvalue = email_stru->box;
	fieldlist[5].fieldvalue = email_stru->addressee;
	fieldlist[6].fieldvalue = email_stru->content;
	datalen = (WORD)( EMAIL_FIELD_NUM * sizeof(WORD) );
	for( i = 0; i < EMAIL_FIELD_NUM; i++ )
	{
		if( fieldlist[i].fieldvalue == NULL )
		{
			fieldlist[i].headoffset = 0;
		}else{
			fieldlist[i].headoffset = datalen;
			datalen += (U16)( strlen( fieldlist[i].fieldvalue ) + 1 );
		}
	}
	
	modify_data = (BYTE *)Lmalloc(datalen);
	if( modify_data == NULL )
		return EMAIL_ERROR;
	data = modify_data;

	for( i = 0; i < EMAIL_FIELD_NUM; i++ )	//填充偏移值
	{
		memcpy( data, &fieldlist[i].headoffset, sizeof(WORD) );
		data += sizeof(WORD);
	}

	for( i = 0; i < EMAIL_FIELD_NUM; i++ )	//填充字段值
	{
		if( fieldlist[i].headoffset != 0 )
		{
			memcpy( data, fieldlist[i].fieldvalue , ( strlen( fieldlist[i].fieldvalue ) + 1 ) );
			data += ( strlen( fieldlist[i].fieldvalue ) + 1 );
		}
	}
	
	if( LocalModifyRecord( emaillacb, global_email_list->head[select_no].index, modify_data, datalen ) == DB_ERROR )
	{
		Lfree(modify_data);
		DetachDataBase( emaillacb );
		return EMAIL_ERROR;
	}

	DetachDataBase( emaillacb );
	Lfree(modify_data);
	return	EMAIL_OK;
}

/***********************************************************************************************/
STATUS	TransDelEmail( LOCALSEARCHLIST *global_email_list, U16 select_no, U8 reserved )
{
//	U16		i;
	DBLACB		*emaillacb;
	emaillacb =  LinkDataBase( EMAIL_DATA_BASE );	//链接电子邮件数据库

	if( LocalDelRecord( emaillacb, global_email_list->head[select_no].index ) == DB_ERROR )
	{	
		DetachDataBase( emaillacb );
		return EMAIL_ERROR;
	}
/*	Lfree( global_email_list->head[select_no].data );

	for( i = select_no; i < (U16)( global_email_list->num - 1 ); i++ )
	{
		global_email_list->head[i].index = global_email_list->head[i+1].index; 
		global_email_list->head[i].data = global_email_list->head[i+1].data; 
		global_email_list->head[i].datalen = global_email_list->head[i+1].datalen; 
	}
	global_email_list->num--;
*/
	DetachDataBase( emaillacb );
	return	EMAIL_OK;
}

/***********************************************************************************************/
EMAIL_STRU* TransReadEmail( LOCALSEARCHLIST *global_email_list, U16 select_no, U8 reserved)
{
	EMAIL_STRU		*email_stru;
	DBRECORDHEAD	*head_info;
	U8				*data;
#ifdef SIM_ON_PC
	U16				*field_head;
#else
	U16				field_head;
#endif
	U8				i = 0;
	
	if( ( email_stru = (EMAIL_STRU *)Lmalloc(sizeof(EMAIL_STRU)) ) == NULL )
		return	NULL;

	head_info = (DBRECORDHEAD *)( global_email_list->head[select_no].data );
	data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
	field_head = (WORD *)data;
	email_stru->time =  data + field_head[EMAIL_TIME];
	email_stru->subject = data + field_head[EMAIL_SUBIECT];
	email_stru->addresser = data + field_head[EMAIL_ADDRESSER];
	email_stru->type = data + field_head[EMAIL_TYPE];
	email_stru->box = data + field_head[EMAIL_BOX];
	email_stru->addressee = data + field_head[EMAIL_ADDRESSEE];
	email_stru->content = data + field_head[EMAIL_CONTENT];
#else
	Bytes2Word( &field_head, data+(EMAIL_TIME)*sizeof(WORD) );
	email_stru->time = data + field_head;
	Bytes2Word( &field_head, data+(EMAIL_SUBIECT)*sizeof(WORD) );
	email_stru->subject = data + field_head;
	Bytes2Word( &field_head, data+(EMAIL_ADDRESSER)*sizeof(WORD) );
	email_stru->addresser = data + field_head;
	Bytes2Word( &field_head, data+(EMAIL_TYPE)*sizeof(WORD) );
	email_stru->type = data + field_head;
	Bytes2Word( &field_head, data+(EMAIL_BOX)*sizeof(WORD) );
	email_stru->box = data + field_head;
	Bytes2Word( &field_head, data+(EMAIL_ADDRESSEE)*sizeof(WORD) );
	email_stru->addressee = data + field_head;
	Bytes2Word( &field_head, data+(EMAIL_CONTENT)*sizeof(WORD) );
	email_stru->content = data + field_head;
#endif

	return	email_stru;
}

/***********************************************************************************************/
LOCALSEARCHLIST* TransSearchEmail( EMAIL_SEARCH_STRU *email_search_stru, U8 reserved )
{
	LOCALSEARCHLIST		*temp_searchlist, *searchlist;
	RECORDDATA			*next_record_data, *next_record_head, *temp_record_data;
	DBRECORDHEAD		*head_info;
	U8					*data, *field_value;
	U16					*field_head;
	U16					i, count;
	DBLACB				*emaillacb;

	emaillacb =  LinkDataBase( EMAIL_DATA_BASE );	//链接电子邮件数据库

//	temp_searchlist = LocalFindRecord( emaillacb, EMAIL_ADDRESSEE, cur_account, PRECISE_PART_MATCH );
	temp_searchlist = LocalFindRecord( emaillacb, email_search_stru->field, email_search_stru->keystring, email_search_stru->mode );

	temp_record_data = (RECORDDATA *)Lmalloc( sizeof(RECORDDATA) );	//暂存交换变量	
	if( temp_record_data == NULL )
	{
		DelOldSearchList( temp_searchlist );
		DetachDataBase( emaillacb );
		return	NULL;
	}

	next_record_head = next_record_data = temp_searchlist->head;
	for( count = 0, i = 0; i< temp_searchlist->num; i++ )	
	{
		head_info = (DBRECORDHEAD *)(next_record_data->data);
		data = (BYTE *)(&head_info->data);
		field_head = (WORD *)data;
		field_value =  data + field_head[EMAIL_ADDRESSEE];
		if( strcmp( field_value, cur_account ) == 0 )
		{
			temp_record_data->index = next_record_head->index; 
			temp_record_data->data = next_record_head->data;
			temp_record_data->datalen = next_record_head->datalen;

			next_record_head->index = next_record_data->index;
			next_record_head->data = next_record_data->data;
			next_record_head->datalen = next_record_data->datalen;

			next_record_data->index = temp_record_data->index;
			next_record_data->data = temp_record_data->data;
			next_record_data->datalen = temp_record_data->datalen;

			next_record_head++;
			count++;
		}
		next_record_data++;
	}
	Lfree( temp_record_data );
	searchlist = (LOCALSEARCHLIST *)Lmalloc( sizeof(LOCALSEARCHLIST) );
	if( searchlist == NULL )
	{
		DelOldSearchList( temp_searchlist );
		DetachDataBase( emaillacb );
		return	NULL;
	}
	if( count != 0 )
	{
		searchlist->head = (RECORDDATA *)Lmalloc( sizeof(RECORDDATA) * count );
		if( searchlist->head == NULL )
		{
			Lfree( searchlist );
			DelOldSearchList( temp_searchlist );
			DetachDataBase( emaillacb );
			return	NULL;
		}
		memcpy( searchlist->head, temp_searchlist->head, ( sizeof(RECORDDATA) * count ) );
		searchlist->num = count;
//		DelOldSearchList( temp_searchlist );
	}else{
		searchlist->head = NULL;
		searchlist->num = 0;
	}
	Lfree( temp_searchlist );
	
	DetachDataBase( emaillacb );
	return	searchlist;
//	return	temp_searchlist;
}

/***********************************************************************************************/
//把整型值的时间转换成字符串型的时间	
//void Time2Char( EMAIL_TIME_STRU *time, EMAIL_TIME_STRU *conversion_time )
//{
/*
	conversion_time->year = (U32)( time->year/1000 + 0x30 ) | ( ( ( time->year%1000 )/100 + 0x30 ) << 8 )
		                    | ( ( ( ( time->year%1000 )%100 )/10 + 0x30 ) << 16 )
		                    | ( ( ( ( time->year%1000 )%100 )%10 + 0x30 ) << 24 );
	conversion_time->month = (U16)( time->month/10 + 0x30 ) | ( ( time->month%10 + 0x30 ) << 8 );
	conversion_time->day = (U16)( time->day/10 + 0x30 ) | ( ( time->day%10 + 0x30 ) << 8 );
	conversion_time->hour = (U16)( time->hour /10 + 0x30 ) | ( ( time->hour%10 + 0x30 ) << 8 );
	conversion_time->minute = (U16)( time->minute/10 + 0x30 ) | ( ( time->minute%10 + 0x30 ) << 8 );
	conversion_time->second = (U16)( time->second/10 + 0x30 ) | ( ( time->second%10 + 0x30 ) << 8 );
*/
/*	sprintf( (void *)&conversion_time->year, "%04.4d", conversion_time->year );
	sprintf( (void *)&conversion_time->month, "%02.2d", conversion_time->month );
	sprintf( (void *)&conversion_time->day, "%02.2d", conversion_time->day );
	sprintf( (void *)&conversion_time->hour, "%02.2d", conversion_time->hour );
	sprintf( (void *)&conversion_time->minute, "%02.2d", conversion_time->minute );
	sprintf( (void *)&conversion_time->second, "%02.2d", conversion_time->second );
*/
//}

/***********************************************************************************************/
//把整型值的数目转换成5位的字符串	
char* NumtoChar( U16 number )
{
	char *temp_str;

	if( ( temp_str = (char *)Lmalloc(5) ) == NULL )	//可显示数字为5位
		return NULL;

	if( number/1000 == 0 )	//计算邮件数
	{
		if( number/100 == 0 )
		{
			if( number/10 == 0 )
			{
				if( number == 0 )
				{
					temp_str[0] = '0';
				}else{
					temp_str[0] = (U8)( number + 0x30 );
				}
				temp_str[1] = '\0';
			}else{
				temp_str[0] = (U8)( number/10 + 0x30 );
				temp_str[1] = (U8)( number%10 + 0x30 );
				temp_str[2] = '\0';
			}
		}else{
			temp_str[0] = (U8)( number/100 + 0x30 );
			temp_str[1] = (U8)( ( number%100 )/10 + 0x30 );
			temp_str[2] = (U8)( ( number%100 )%10 + 0x30 );
			temp_str[3] = '\0';
		}
	}else{
		temp_str[0] = (U8)( number/1000 + 0x30 );
		temp_str[1] = (U8)( ( number%1000 )/100 + 0x30 );
		temp_str[2] = (U8)( ( ( number%1000 )%100 )/10 + 0x30 );
		temp_str[3] = (U8)( ( ( number%1000 )%100 )%10 + 0x30 );
		temp_str[4] = '\0';
	}

	return temp_str;
}

/***********************************************************************************************/
//释放从数据库得到的列表	
void FreeDBList( LOCALSEARCHLIST **DB_list, U16 *num )
{
	if( *DB_list != NULL )
		DelOldSearchList( *DB_list );

	*DB_list = NULL;
	*num = 0;
}


/***********************************************************************************************/
STATUS	GetAccountList( U16 *num, char *account_list )
{
	U16					i = 0; 
	FILE				*fp; 
//	static char			account_list[ACCOUNT_MAX_NUM][ACCOUNT_LEN];
#ifdef SIM_ON_PC
	char				*file_path = "emlacnt.txt";
#else
	char				*file_path = "/db5/emlacnt.txt";
#endif

	// 程序开始
	fp = fopen( file_path, "rb+" );
	if( fp == NULL)		//判断打开文件是否成功
	{	//首次打开
		fp = fopen( file_path, "wb+" );
		if( fp != NULL )
		{
			memset( account_list, 0x00, ACCOUNT_LEN*ACCOUNT_MAX_NUM );
			fwrite( account_list, ACCOUNT_LEN, ACCOUNT_MAX_NUM, fp );
			num = 0; 	
			fclose( fp );
		}else{
			return	EMAIL_ERROR; 
		}
	}else{//打开成功开始读入
		fread( account_list, ACCOUNT_LEN, ACCOUNT_MAX_NUM, fp );
		for( i = 0; i < ACCOUNT_MAX_NUM; i++ )
		{
			if( *(account_list + ACCOUNT_LEN*i ) != 0 )
				(*num)++;
		}
		fclose(fp); 
	}

	return EMAIL_OK; 
}

/***********************************************************************************************/
//保存电子信箱
STATUS SaveEmailAccount( char *account_list, U8 reserved )
{
	FILE				*fp; 
#ifdef SIM_ON_PC
	char				*file_path = "emlacnt.txt";
#else
	char				*file_path = "/db5/emlacnt.txt";
#endif

	// 程序开始
	fp = fopen( file_path, "rb+" );
	if( fp == NULL)		//判断打开文件是否成功
	{	
		return	EMAIL_ERROR; 
	}else{//打开成功开始读入
		fwrite( account_list, ACCOUNT_LEN, ACCOUNT_MAX_NUM, fp );
		fclose(fp); 
		return EMAIL_OK; 
	}
}

/***********************************************************************************************/
STATUS ReadNetServer( void )
{
	U16					i = 0; 
	FILE				*fp; 
#ifdef SIM_ON_PC
	char				*file_path = "netsrv.txt";
#else
	char				*file_path = "/db5/netsrv.txt";
#endif
	// 程序开始
	fp = fopen( file_path, "rb+" );
	if( fp == NULL)		//判断打开文件是否成功
	{	//首次打开
		fp = fopen( file_path, "wb+" );
		if( fp != NULL )
		{
			memset( &net_server_stru, 0x00, sizeof( net_server_stru ) );
			fwrite( &net_server_stru, sizeof( net_server_stru ), 1, fp );
			fclose( fp );
		}else{
			return	EMAIL_ERROR; 
		}
	}else{//打开成功开始读入
		fread( &net_server_stru, sizeof( net_server_stru ), 1, fp );
		fclose(fp); 
	}

	return EMAIL_OK; 
}

/***********************************************************************************************/
//保存电子信箱
STATUS SaveNetServer( void )
{
	FILE				*fp; 
#ifdef SIM_ON_PC
	char				*file_path = "netsrv.txt";
#else
	char				*file_path = "/db5/netsrv.txt";
#endif

	// 程序开始
	fp = fopen( file_path, "rb+" );
	if( fp == NULL)		//判断打开文件是否成功
	{	
		return	EMAIL_ERROR; 
	}else{//打开成功开始读入
		fwrite( &net_server_stru, sizeof( net_server_stru ), 1, fp );
		fclose(fp); 
		return EMAIL_OK; 
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -