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

📄 phdatabs.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************
*
*Copyright ? 2001-2003 National ASIC Center,	All right Reserved
*
* FILE NAME:				Phdatabs.c
* PROGRAMMER:			Christian-ren
* Date of Creation:		2002/08/28
* 
* DESCRIPTION:		      PHONEBOOK module,focus on database module
*		
* NOTE:
*------------------------------------------------------------------
* FUNCTIONS LIST:
* -- PUBLIC FUNCTIONS --
*
*------------------------------------------------------------------
* -- LOCAL FUNCTIONS --
*	void  FreePhbookList(PHONEBOOK *head)
*	PHONEBOOK * TransDatabsFormat(P_U8 databsptr,U32 id)
*	PHONEBOOK * LoadRelationData(RELATIONSHIP relation,U16 *len)
*	PHONEBOOK * LoadSearchData(P_S8 string,U16 *len,U8 mode)
*	STATUS  DelRecord(PHONEBOOK *thisptr)  //定义变量,参数
*	void AddRecordToDB(PHONEBOOK *thisptr,SAVEMODE mode)
*	void GetRecordItemNum(PHONEBOOK *recordinf,P_U8 ctelptr,P_U8 cmobptr,P_U8 cbpptr)
*	void CompareModAndSrc(PHONEBOOK *thisptr,P_S8 *recordinf,U8 ctel,U8 cmob,U8 cbp,P_U8 ismodfptr)
*	STATUS SaveModfToSrc(PHONEBOOK *thisptr,P_S8 * recordinf,U8 ctel,U8 cmob,U8 cbp)
*
*------------------------------------------------------------------
*
* GLOBAL VARS LIST:
*    DBLACB	*phbooklacb;   //定义一个数据库控制块的变量
*-------------------------------------------------------------------
*
* MODIFICATION HISTORY
*
*
* 2002/08/28 	by Christian-ren		Create the file
*								
*************************************************************/



#include <string.h>
#include <asixwin.h>
#include <database\carddb.h>
#include  "phbook.h"
//主要工作是格式的转换,把电话本的存储格式
//转换成DATABASE的数据格式
//***数据库的使用建议在
//      打开任务务的时候连接初试化数据库,在关闭任务的时候关闭

//extern DBLACB	*phbooklacb;  

extern void ByteReversal( unsigned short *v, unsigned char *s );




void  FreePhbookList(PHONEBOOK *head)
{
	PHONEBOOK * pointer;
	while(head != NULL)
	{
		pointer =head;
		head = head->next;
		Lfree(pointer);
	}
	
}




PHONEBOOK * TransDatabsFormat(P_U8 databsptr,U32 id)
{
	PHONEBOOK *recordptr;
//	PHONEBOOK *tmpptr;
	P_U8  dataptr;
	P_U8  tmpdataptr;	
	U16  offset;
//	U8    pos;
	U8   count;


	dataptr = databsptr+12;//指向数据块,虑去头信息
	
	tmpdataptr = dataptr;
	
	//recordptr = (PHONEBOOK *)Lmalloc(len);
	recordptr = (PHONEBOOK *)Lmalloc(sizeof(PHONEBOOK));
	if(recordptr == NULL)
	{
		return NULL;//asix_error
	}
	memset(recordptr,0x0,sizeof(PHONEBOOK));
	recordptr->ID = id;//存入ID号
	//存放姓名
	//offset =*((U16*)dataptr);//计算姓名的偏移位置
	 ByteReversal( &offset, dataptr);
	tmpdataptr = dataptr + offset;
	strcpy(recordptr->namebuf,tmpdataptr);
	recordptr->name = recordptr->namebuf;

	//存放手机号码
	tmpdataptr = dataptr +sizeof(U16);
	for(count=0;count<MAXMOBNUM;count++)//先把指针指向缓冲区
	{
		recordptr->mobile[count] = recordptr->mobbuf[count];
	}
	for(count=0;count<MAXMOBNUM;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		 ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	      strcpy(recordptr->mobbuf[count],tmpdataptr);

	      tmpdataptr = dataptr + offset;
	}

	//存放电话号码
	tmpdataptr = dataptr +2*sizeof(U16);
	for(count=0;count<MAXTELNUM;count++)
	{
    	recordptr->tel[count] = recordptr->telbuf[count];//把指针指向缓冲区
	}
	for(count=0;count<MAXTELNUM;count++)
	{
	//	offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
        strcpy(recordptr->telbuf[count],tmpdataptr);

       tmpdataptr = dataptr + offset;
	}

       //存放关系
	tmpdataptr = dataptr +3*sizeof(U16);
	//   	offset =*((U16 *)tmpdataptr);
	ByteReversal( &offset, tmpdataptr);
   	tmpdataptr = dataptr + offset;
    switch(*tmpdataptr)
   	{
		case '0':
    		recordptr->relation = OTHERS;
    		break;
    	case '1':
      		recordptr->relation = FRIEND;
      		break;
      	case '2':
      		recordptr->relation = FAMILY;
      		break;
      	case '3':
      		recordptr->relation = SCHMATE;
      		break;
      	case '4':
      		recordptr->relation = COLLEAGUE;
      		break;
      	default: break;
     }


     //存放寻呼
	tmpdataptr = dataptr +4*sizeof(U16);
    for(count=0;count<MAXBPNUM;count++)//把指针指向缓冲区
    {
		recordptr->bp[count] = recordptr->bpbuf[count];
    }
	for(count=0;count<MAXBPNUM;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		 ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->bpbuf[count],tmpdataptr);
	    recordptr->bp[count] = recordptr->bpbuf[count];
	    tmpdataptr = dataptr + offset;
	}
	return  recordptr;
}


PHONEBOOK * LoadRelationData(RELATIONSHIP relation,U16 *len,	DBLACB	*phbooklacb)
{
//将需要查询的条件输入,得到ID的长度和ID数组的指针上
	LOCALSEARCHLIST  *findlist;
	U8 count;
	PHONEBOOK * newptr;
    PHONEBOOK * pointer;
    PHONEBOOK * head;
    P_S8		getdataptr;
    RECORDDATA *tmprecord;
    if(relation == AllRelation)
    {
		findlist = LocalFindRecord(phbooklacb, CARD_NAME_FIELD	, NULL, GLOBAL_SEARCH );
     	if(findlist->head == NULL)  //当获得的数据为空的时候,就返回NULL
		{
			*len = 0;     //如果搜寻为空,则返回NULL值
			return NULL;
			
		}
     		//全局查找只能获得ID号,而不能获得*data数据块
		tmprecord = findlist->head;
     	getdataptr = LocalReadRecord(phbooklacb, tmprecord->index);
     	*len =findlist->num;
		//head = TransDatabsFormat(getdataptr,tmprecord->index,tmprecord->datalen);
		head = TransDatabsFormat(getdataptr,tmprecord->index);
		head->prev =NULL;
	    head->next= NULL;
		pointer = head;
     		
     	for(count=1;count<(findlist->num);count++)
     	{
			tmprecord = findlist->head+count;
			getdataptr = LocalReadRecord(phbooklacb, tmprecord->index);
			newptr = TransDatabsFormat(getdataptr,tmprecord->index);
		    newptr->prev = pointer;
	        newptr->next = NULL;
	        pointer->next = newptr;
	        pointer = newptr;
     	}
     	DelOldSearchList(findlist);//释放获得的数据块
     	return head;
    }else{
     	switch(relation)
     	{
     		case OTHERS:
     			findlist = LocalFindRecord(phbooklacb, CARD_RELATION_FIELD	, "0", PRECISE_PART_MATCH );     		
     			break;
     		case FRIEND:
     			findlist = LocalFindRecord(phbooklacb, CARD_RELATION_FIELD	, "1", PRECISE_PART_MATCH );  
     			break;
     		case FAMILY:
     			findlist = LocalFindRecord(phbooklacb, CARD_RELATION_FIELD	, "2", PRECISE_PART_MATCH );  
     			break;
     		case SCHMATE:
     			findlist = LocalFindRecord(phbooklacb, CARD_RELATION_FIELD	, "3", PRECISE_PART_MATCH ); 
     		      break;
     		case COLLEAGUE://数据库需要调整,因为只有容纳四个
     			findlist = LocalFindRecord(phbooklacb, CARD_RELATION_FIELD	, "4", PRECISE_PART_MATCH ); 
     			break;
     		default:
     			break;
     	}
     	if(findlist->head == NULL)  //当获得的数据为空的时候,就返回NULL
		{
			*len = 0;     //如果搜寻为空,则返回NULL值
			DelOldSearchList(findlist);//释放获得的数据块
			return NULL;
			
		}
	     	*len = findlist->num;
	     	/* 转换数据块,生成数据链表*/
		head = TransDatabsFormat(findlist->head->data,findlist->head->index);
		head->prev =NULL;
	      head->next= NULL;

		pointer = head;

		for(count=1;count<(findlist->num);count++)
		{
			tmprecord = (findlist->head)+count;
			newptr = TransDatabsFormat(tmprecord->data,tmprecord->index);
		    newptr->prev = pointer;
	        newptr->next = NULL;
	        pointer->next = newptr;
	        pointer = newptr;
		}
		DelOldSearchList(findlist);//释放获得的数据块
		return head;	

     	}



}
	

PHONEBOOK * LoadSearchData(P_S8 string,U16 *len,U8 mode,DBLACB	*phbooklacb)
{
	LOCALSEARCHLIST  *findlist;
	U8 count;
	PHONEBOOK * newptr;
    PHONEBOOK * pointer;
    PHONEBOOK * head;
//      P_S8		getdataptr;
    RECORDDATA *tmprecord;


	findlist = LocalFindRecord(phbooklacb, CARD_NAME_FIELD, string, mode );
	if(findlist->head == NULL)  //当获得的数据为空的时候,就返回NULL
	{
		*len = 0;     //如果搜寻为空,则返回NULL值
    	DelOldSearchList(findlist);//释放获得的数据块
		return NULL;
		
	}
    *len = findlist->num;
     	/* 转换数据块,生成数据链表*/
	head = TransDatabsFormat(findlist->head->data,findlist->head->index);
	head->prev =NULL;
    head->next= NULL;

	pointer = head;

	for(count=1;count<(findlist->num);count++)
	{
		tmprecord = (findlist->head)+count;
		newptr = TransDatabsFormat(tmprecord->data,tmprecord->index);
	    newptr->prev = pointer;
        newptr->next = NULL;
        pointer->next = newptr;
        pointer = newptr;
	}
	DelOldSearchList(findlist);//释放获得的数据块
	return head;	

   
}








STATUS  DelRecord(PHONEBOOK *thisptr,DBLACB *phbooklacb)  //定义变量,参数
{
    //输入的是保存记录的ID号
    //根据ID号查询数据库
    //并且删除此记录
    //如果删除记录成功则返回ASIX_OK否则返回ASIX_ERROR
    U32 delst;
    delst = LocalDelRecord(phbooklacb, thisptr->ID);
    if(delst == DB_ERROR)
    	 return ASIX_ERROR;
    else 
    	 return ASIX_OK;
}

/*
STATUS SaveSourceToDB(PHONEBOOK *thisptr)
{
	

⌨️ 快捷键说明

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