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

📄 carddbi.c

📁 国家ASIC工程中心使用的嵌入式操作系统
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************************************************
*
*Copyright ? 2001-2003 National ASIC Center,	All right Reserved
*
* FILE NAME:				Carddb.c
* PROGRAMMER:			Christian-ren
* Date of Creation:		2002/08/28
* 
* DESCRIPTION:		      Card module,focus on database
*		
* NOTE:
*------------------------------------------------------------------
* FUNCTIONS LIST:
* -- PUBLIC FUNCTIONS --
*     
*------------------------------------------------------------------
* -- LOCAL FUNCTIONS --
*	CALLCARD * CardTransDatabsFormat(P_U8 databsptr,U32 id)
*	CALLCARD * CardLoadRelationData(RELATIONSHIP relation,U16 *len)
*	CALLCARD * CardLoadSearchData(P_S8 string,U16 *len,U8 mode)
*	STATUS  CardDelRecord(CALLCARD*thisptr) 
*	void GetCardRecordItemNum(CALLCARD*recordinf,CARDBUFRECORDINF * sourceinf)
*	void CardCompareModSrc(CALLCARD *thisptr,CARDBUFRECORDINF * inf,U8 * ismodfptr)
*	STATUS CardSaveModfToSrc(CALLCARD*thisptr,CARDBUFRECORDINF * inf)
*	void  CardAddRecordToDB(CALLCARD*thisptr,SAVEMODE mode)
*------------------------------------------------------------------
*
* GLOBAL VARS LIST:
*    DBLACB	*cardlacb;  
*-------------------------------------------------------------------
*
* MODIFICATION HISTORY
*
*
* 2002/08/28 	by Christian-ren		Create the file
*								
*************************************************************/

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

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


CALLCARD * CardTransDatabsFormat(P_U8 databsptr,U32 id)
{
	CALLCARD *recordptr;
	P_U8  dataptr;
	P_U8  tmpdataptr;	
	U16  offset;
	U8   count;


	dataptr = databsptr+12;//指向数据块,虑去头信息
	
	tmpdataptr = dataptr;
	
	recordptr = (CALLCARD *)Lmalloc(sizeof(CALLCARD));
	if(recordptr == NULL)
	{
		return NULL;//asix_error
	}
	memset(recordptr,0x0,sizeof(CALLCARD));
	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;
	}

	//存放传真
	tmpdataptr = dataptr +5*sizeof(U16);
    for(count=0;count<MAXFAX;count++)//把指针指向缓冲区
    {
     	recordptr->fax[count] = recordptr->faxbuf[count];
    }
	for(count=0;count<MAXFAX;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->faxbuf[count],tmpdataptr);
	    recordptr->fax[count] = recordptr->faxbuf[count];
	    tmpdataptr = dataptr + offset;
	}


	//存放单位
	tmpdataptr = dataptr +6*sizeof(U16);
    for(count=0;count<MAXUNIT;count++)//把指针指向缓冲区
    {
     	recordptr->unit[count] = recordptr->unitbuf[count];
    }
	for(count=0;count<MAXUNIT;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->unitbuf[count],tmpdataptr);
	    recordptr->unit[count] = recordptr->unitbuf[count];
	    tmpdataptr = dataptr + offset;
	}


	//存放email
	tmpdataptr = dataptr +7*sizeof(U16);
    for(count=0;count<MAXEMAIL;count++)//把指针指向缓冲区
    {
     	recordptr->email[count] = recordptr->emailbuf[count];
    }
	for(count=0;count<MAXEMAIL;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->emailbuf[count],tmpdataptr);
	    recordptr->email[count] = recordptr->emailbuf[count];
	    tmpdataptr = dataptr + offset;
	}


	//存放地址
	tmpdataptr = dataptr +8*sizeof(U16);
    for(count=0;count<MAXADDRESS;count++)//把指针指向缓冲区
    {
     	recordptr->address[count] = recordptr->addressbuf[count];
    }
	for(count=0;count<MAXADDRESS;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->addressbuf[count],tmpdataptr);
	    recordptr->address[count] = recordptr->addressbuf[count];
	    tmpdataptr = dataptr + offset;
	}

	//存放QQ
	tmpdataptr = dataptr +9*sizeof(U16);
    for(count=0;count<MAXQQ;count++)//把指针指向缓冲区
    {
     	recordptr->QQ[count] = recordptr->QQbuf[count];
    }
	for(count=0;count<MAXQQ;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->QQbuf[count],tmpdataptr);
	    recordptr->QQ[count] = recordptr->QQbuf[count];
	    tmpdataptr = dataptr + offset;
	}


	//存放爱好
	tmpdataptr = dataptr +10*sizeof(U16);
    for(count=0;count<MAXHABIT;count++)//把指针指向缓冲区
    {
     	recordptr->habbit[count] = recordptr->habbitbuf[count];
    }
	for(count=0;count<MAXHABIT;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->habbitbuf[count],tmpdataptr);
	    recordptr->habbit[count] = recordptr->habbitbuf[count];
	    tmpdataptr = dataptr + offset;
	}


	//存放邮编
	tmpdataptr = dataptr +11*sizeof(U16);
    for(count=0;count<MAXPOSTALCODE;count++)//把指针指向缓冲区
    {
     	recordptr->postalcode[count] = recordptr->postalcodebuf[count];
    }
	for(count=0;count<MAXPOSTALCODE;count++)
	{
		//offset =*((U16 *)tmpdataptr);
		ByteReversal( &offset, tmpdataptr);
		if(offset == 0)
		{
			break;
		}
		tmpdataptr = dataptr + offset + sizeof(U16);
	    strcpy(recordptr->postalcodebuf[count],tmpdataptr);
	    recordptr->postalcode[count] = recordptr->postalcodebuf[count];
	    tmpdataptr = dataptr + offset;
	}

	return  recordptr;
}
/***********************************************/






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

     }

}
/***********************************************/




/**********************************************/	

CALLCARD * CardLoadSearchData(P_S8 string,U16 *len,U8 mode)
{
	LOCALSEARCHLIST  *findlist;
	U8 count;
	CALLCARD * newptr;
	CALLCARD * pointer;
	CALLCARD * head;
	//      P_S8		getdataptr;
	RECORDDATA *tmprecord;


	findlist = LocalFindRecord(cardlacb, CARD_NAME_FIELD, string, mode );
	if(findlist->head == NULL)  //当获得的数据为空的时候,就返回NULL
	{
		*len = 0;     //如果搜寻为空,则返回NULL值
		DelOldSearchList(findlist);//释放获得的数据块
		return NULL;

	}
	*len = findlist->num;
	/* 转换数据块,生成数据链表*/

⌨️ 快捷键说明

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