📄 phdatabs.c
字号:
/**********************************************************
*
*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 + -