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

📄 phbookex.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
/**********************************************************
*
*Copyright ? 2001-2003 National ASIC Center,	All right Reserved
*
* FILE NAME:				Phbookex.c
* PROGRAMMER:			Christian-ren
* Date of Creation:		2002/08/28
* 
* DESCRIPTION:		      
*		
* NOTE:
*------------------------------------------------------------------
* FUNCTIONS LIST:
* -- PUBLIC FUNCTIONS --
*     P_S8  GetCallFromPhbook()   
*	SAVESTS  SaveCallIntoPhbook(P_S8	callstr,U32 hGC)
*	STATUS FindNameFromPhbook(P_S8	callstr,P_S8 outname,P_S8  isfind);
*
*------------------------------------------------------------------
* -- LOCAL FUNCTIONS --
*	void	SelectSavePerson(SAVEPERSONSTY *personsel)
*	void  SelectSaveType(PHONESTYLE * select)

*------------------------------------------------------------------
*
* GLOBAL VARS LIST:
*    DBLACB	*phbooklacb;  
*-------------------------------------------------------------------
*
* MODIFICATION HISTORY
*
*
* 2002/08/28 	by Christian-ren		Create the file
*								
*************************************************************/


#include <string.h>

#include <asixwin.h>
#include <asixapp.h>

#include <asixwin\asix_lb.h>
#include <asixwin\asix_ed.h>

#include <resource\bitmap.h>

#include <database\carddb.h>

#include "phbook.h"



extern  PHONEBOOK * LoadRelationData(RELATIONSHIP relation,U16 *len,DBLACB	*phbooklacb);
extern void AddRecordToDB(PHONEBOOK *thisptr,SAVEMODE mode,DBLACB *phbooklacb);
extern  U8  EditDetailNote(PHONEBOOK * thisptr, ACCESSSTYLE  mode ,U8 PhStyle,U8 *outputname,SAVEMODE savemode,DBLACB *phbooklacb); 
extern P_S8 PhoneBookProcess(ACCESSSTYLE accesstyle,PHONEBOOK *getitem);
extern STATUS  NewRecordInf(PHONEBOOK * newptr);


//extern DBLACB	*phbooklacb;   //定义一个数据库控制块的变量



//如果返回的是NULL,表示没有数据输入,即没有选择电话
P_S8  GetCallFromPhbook()//返回的电话号码复制到外部缓存区
{
	P_S8	findcall = NULL;
	findcall = PhoneBookProcess(EXTER_ACCESS,NULL);
	return findcall;
}




void	SelectSavePerson(SAVEPERSONSTY *personsel)
{
	SAVEPERSONSTY selectp=SEL_NEW;
	U32 hGC;
	MSG 	msg;
    U32        seltypewin,lbox,bt1,bt2,st;
    U8          quit = 0;
	P_S8	inform1 = "请选择是新建联系人或者添加号码到已有联系人:";
	struct LBOX_ITEM	lboxitem[] =
	{
       	ICON_ENABLE,	UNDERLINE,	"新建联系人",
		ICON_ENABLE,	UNDERLINE,	"保存至已有联系人",
		ICON_END,	UNDERLINE,	NULL
	};

      

 	seltypewin = CreateWindow(WNDCLASS_WIN,			
							"提示信息",			
							WS_OVERLAPPEDWINDOW,	
							0,0,					
							PHY_LCD_W,PHY_LCD_H,	
							0,						
							0,						
							NULL);					
      
	bt1 = CreateWindow( WNDCLASS_BUTTON,
						"确定",
						WS_CHILD|BS_REGULAR,
						(LCD_WIDTH - 75)/2, 130,
						30,
						20,
						seltypewin,
						0,
						NULL);
	bt2 = CreateWindow( WNDCLASS_BUTTON,
						"取消",
						WS_CHILD|BS_REGULAR,
						(LCD_WIDTH - 75)/2 + 45,130,
						30,
						20,
						seltypewin,
						0,
						NULL);
	st = CreateWindow(WNDCLASS_STATIC,   //提示信息
		                        inform1, 
		                        WS_CHILD|SS_TEXT|SS_MULTILINE,
		                        (LCD_WIDTH - 100)/2,36,
		                        100,
		                        62,
		                        seltypewin,
		                        0,
		                        NULL);
	 lbox = CreateWindow( WNDCLASS_LIST,
                          "ListBox",
                          WS_CHILD|LBS_POPUP,
                          (LCD_WIDTH - 110)/2,86,
                          110,
                          16,
                          seltypewin,
                          0,
                         lboxitem);
     hGC = GetGC();
     //  EnableWindow(bt1, FALSE);

	while(!quit)
	{
		ASIXGetMessage(&msg, NULL, 0, 0);
		switch(msg.message)
		{
			case WM_COMMAND:
				if ( msg.lparam == bt1 )
				{
					*personsel = selectp;
                    quit = 1;
				} else
				if( msg.lparam == bt2 )
				{
				   *personsel = SEL_EXITCHOOSE;
				   quit = 1;
				}
                break;
            case WM_LISTBOX:
				switch(msg.wparam)
                {
					case 0:selectp = SEL_NEW;
                  			break;
                  	case 1:selectp = SEL_SAVEDPERSON;
                  		    break;
                  	default:break;
                }
                 	      //  EnableWindow(bt1, TRUE);
                break;

			case WM_QUIT:
				*personsel = SEL_EXITCHOOSE;
				quit = 1;
				break;
		}
		DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam); 
	}

	DestroyWindow( seltypewin );


 }





void  SelectSaveType(PHONESTYLE * select)
{
	MSG 	msg;
    U32        seltypewin,lbox,bt1,bt2,st;
    U8          quit = 0;
    PHONESTYLE   tmpselect;
	P_S8	inform1 = "请选择需要保存号码的类型:";
	U32 hGC;

	
	struct LBOX_ITEM	lboxitem[] =
	{
       	ICON_ENABLE,	UNDERLINE,	"固话",
		ICON_ENABLE,	UNDERLINE,	"手机",
		ICON_ENABLE,	UNDERLINE,	"寻呼",
		ICON_END,	UNDERLINE,	NULL
	};

      

 	seltypewin = CreateWindow(WNDCLASS_WIN,			
							"提示信息",			
							WS_OVERLAPPEDWINDOW,	
							0,0,					
							PHY_LCD_W,PHY_LCD_H,	
							0,						
							0,						
							NULL);					
      
	bt1 = CreateWindow( WNDCLASS_BUTTON,
						"确定",
						WS_CHILD|BS_REGULAR,
						(LCD_WIDTH - 75)/2,100,
						30,
						20,
						seltypewin,
						0,
						NULL);
	bt2 = CreateWindow( WNDCLASS_BUTTON,
						"取消",
						WS_CHILD|BS_REGULAR,
						(LCD_WIDTH - 75)/2 + 45,100,
						30,
						20,
						seltypewin,
						0,
						NULL);
	st = CreateWindow(WNDCLASS_STATIC,   //提示信息
	                  inform1, 
		              WS_CHILD|SS_TEXT|SS_MULTILINE,
		              (LCD_WIDTH - 100)/2,36,
		              100,
		              22,
		              seltypewin,
		              0,
		              NULL);
	 lbox = CreateWindow( WNDCLASS_LIST,
     	                  "ListBox",
     	                  WS_CHILD|LBS_POPUP,
     	                  (LCD_WIDTH - 100)/2,66,
     	                  100,
     	                  16,
     	                  seltypewin,
     	                  0,
     	                  lboxitem);
       hGC = GetGC();
  //     EnableWindow(bt1, FALSE);
       tmpselect = TELEPHONE;
	while(!quit)
	{
		ASIXGetMessage(&msg, NULL, 0, 0);
		switch(msg.message)
		{
			case WM_COMMAND:
				if ( msg.lparam == bt1 )
				{
					*select = tmpselect;
					quit = 1;
				} else
				if( msg.lparam == bt2 )
				{
					*select = NOSTY;
					quit = 1;
				}
				break;
            case WM_LISTBOX:
				switch(msg.wparam)
                {
					case 0:tmpselect = TELEPHONE;
                  			break;
                  	case 1:tmpselect = MOBILE;
                  		    break;
                  	case 2:tmpselect = BP;
                  	        break;
                  	default:break;
                }
                 	      //  EnableWindow(bt1, TRUE);
                break;

			case WM_QUIT:
				*select = NOSTY;
				quit = 1;
				break;
		}
		DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam); 
	}

	DestroyWindow( seltypewin );


 }



       
      


//要求输入的数据不为空
//如果返回的是NULL,表示保存失败
//考虑,选择保存可以有新建,和保存到已经有的人名中
//issaveok 表示保存的状态,有可能在保存过程中用户会退出保存
//issaveok = saveok表示保存成功,否则,表示保存失败
SAVESTS  SaveCallIntoPhbook(P_S8	callstr,P_S8 nameout)
{
	SAVESTS issaveok = SAVE_CANCEL;
	PHONEBOOK  newrecord;
	PHONEBOOK *newptr;
	U8 len;
	U32  databst;
	PHONESTYLE  select = TELEPHONE;
	SAVEPERSONSTY personsel = SEL_NEW;
	//U8  namebuf[100];
	RELATIONSHIP  rela = OTHERS;
	U8  savetodbst = 0;
	P_S8  str1 = "输入项目已满,请重新选择!";  
	P_S8  str2 = "电话号码本已满,请重新选择!";
	U16	msgflag;
	U32 hGC;
	LOCALSEARCHLIST  *findlist;
	U16  databstlen=0;
	DBLACB	*phbooklacb;
	hGC = GetGC();
	if(callstr == NULL)//先判断输入的数据的正确与否
	{
		issaveok = SAVE_CANCEL;
		return ASIX_ERROR;
	}
	//选择保存是新建还是添加到已经有的联系人
	

//	CreateDataBase();		//创建数据库
  	phbooklacb = LinkDataBase(CARD_DATA_BASE);//连接数据库
	//需要知道是否已经电话本满了
	findlist = LocalFindRecord(phbooklacb, CARD_NAME_FIELD	, NULL, GLOBAL_SEARCH );
	databstlen = findlist->num; //表示电话本记录的长度
	newptr = &newrecord;   //新建一个记录
	
  	memset(newptr,0x0,sizeof(PHONEBOOK));
  	NewRecordInf(newptr);//指针赋值到缓冲区
  	 
  	 len = (U8)strlen(callstr)+1;
	//选择添加入新的联系人OR新建联系人
	SelectSavePerson(&personsel);
	
	switch(personsel)
	{
		case SEL_NEW:
			if(databstlen >=PHBOOK_MAXNUM)
			{
				msgflag = MessageBox(0, str2,"提醒", MB_OK);
				goto goout;
			}

			break;
		case SEL_SAVEDPERSON:
			PhoneBookProcess(SEARCH_ACCESS,newptr);//需要考虑如果没有选择XXXXX
			if((P_S8)(*(newptr->name)) == NULL)
				goto goout;
	//		else strcpy(nameout,newptr->name);
			break;
		case SEL_EXITCHOOSE:   //用户在选择过程中不需要保存信息
			issaveok = SAVE_CANCEL;
  	 		goto   goout;
			break;
		default:break;
	}
	//在上面PhoneBookProcess是建立了数据库

  	 //选择保存的数据类型
  	 reselect:
	 SelectSaveType(&select);
  	 
  	 if(personsel ==SEL_NEW)
  	 {
		 
	  	 switch(select)
	  	 {
	  	 	case NOSTY://在选择框中,用户点击了退出,则表示不保存了
	  	 		issaveok = SAVE_CANCEL;
	  	 		goto   goout;
	  	 		break;
	  	 	case TELEPHONE:
	  	 		memcpy(newptr->telbuf[0],callstr,len);  //复制电话到缓冲区
	  	 		break;
	  	 	case MOBILE:
	  	 		memcpy(newptr->mobbuf[0],callstr,len);  //复制电话到缓冲区
	  	 		break;
	  	 	case BP:
	  	 		memcpy(newptr->bpbuf[0],callstr,len);  //复制电话到缓冲区
	  	 		break;
	  	 	default:
	  	 		break;
	  	 }
	  	 
//	 	CreateDataBase();		//创建数据库
  		phbooklacb = LinkDataBase(CARD_DATA_BASE);//连接数据库
	  	savetodbst = EditDetailNote(newptr, SEARCH_ACCESS,NOSTY,nameout,SAVE_INNEW,phbooklacb);
	  

		databst = DetachDataBase(phbooklacb);//断开数据库
	   	
  	 }

  	 if(personsel ==SEL_SAVEDPERSON)
  	 {
	  	 switch(select)
	  	 {
	  	 	case NOSTY://在选择框中,用户点击了退出,则表示不保存了
	  	 		issaveok = SAVE_CANCEL;
	  	 		goto   goout;
	  	 		break;
	  	 	case TELEPHONE:
	  	 		if((P_S8)(*(newptr->tel[MAXTELNUM-1]))!=NULL)  //如果是选择的类型已经满了
	  	 		{
	  	 			msgflag = MessageBox(0, str1,"提醒", MB_OK);
	  	 			goto  reselect;
	  	 		}
	  	 		//memcpy(newptr->telbuf[0],callstr,len);  //复制电话到缓冲区
	  	 		if((P_S8)(*(newptr->tel[0])) == NULL)
	  	 		{
	  	 			memcpy(newptr->tel[0],callstr,len);
	  	 		}else
	  	 		if((P_S8)(*(newptr->tel[1])) == NULL)
	  	 		{
	  	 			memcpy(newptr->tel[1],callstr,len);
	  	 		}else
	  	 		if((P_S8)(*(newptr->tel[2])) == NULL)
	  	 		{
	  	 			memcpy(newptr->tel[2],callstr,len);
	  	 		}else
	  	 		if((P_S8)(*(newptr->tel[3])) == NULL)
	  	 		{
	  	 			memcpy(newptr->tel[3],callstr,len);
	  	 		}
	  	 		break;
	  	 	case MOBILE:
	  	 		if((P_S8)(*(newptr->mobile[MAXMOBNUM-1]))!=NULL)  //如果是选择的类型已经满了
	  	 		{
	  	 			msgflag = MessageBox(0, str1,"提醒", MB_OK);
	  	 			goto  reselect;
	  	 		}
	  	 		if((P_S8)(*(newptr->mobile[0])) == NULL)
	  	 		{
	  	 			memcpy(newptr->mobile[0],callstr,len);
	  	 		}else
	  	 		if((P_S8)(*(newptr->mobile[1])) == NULL)
	  	 		{
	  	 			memcpy(newptr->mobile[1],callstr,len);
	  	 		}else
	  	 		if((P_S8)(*(newptr->mobile[2])) == NULL)
	  	 		{
	  	 			memcpy(newptr->mobile[2],callstr,len);
	  	 		}else
	  	 		if((P_S8)(*(newptr->mobile[3])) == NULL)
	  	 		{
	  	 			memcpy(newptr->mobile[3],callstr,len);
	  	 		}
	  	 		break;
	  	 	case BP:
	  	 		if((P_S8)(*(newptr->bp[MAXBPNUM-1])!=0))  //如果是选择的类型已经满了
	  	 		{
	  	 			msgflag = MessageBox(0, str1,"提醒", MB_OK);
	  	 			goto  reselect;
	  	 		}
	  	 		if((P_S8)(*(newptr->bp[0])) == NULL)
	  	 		{
	  	 			memcpy(newptr->bp[0],callstr,len);
	  	 		}else
	  	 		if((P_S8)(*(newptr->bp[1])) == NULL)
	  	 		{
	  	 			memcpy(newptr->bp[1],callstr,len);
	  	 		}
	  	 		break;
	  	 	default:
	  	 		break;
	  	 }
	 	 
	   	//savetodbst = EditDetailNote(newptr, INTER_ACCESS,NOSTY, NULL,"新建电话本记录",SaveInNew,hGC);
  		AddRecordToDB(newptr,SAVE_INEDIT,phbooklacb);
  		//连接数据库//是编辑
  		savetodbst = 1;
		databst = DetachDataBase(phbooklacb);//断开数据库
	   	
  	 }
  	 

  	 
   	 //如果没有存入数据库,则告诉上层
   	 if(savetodbst  == 1)
   	 {
   	 	issaveok = SAVE_OK;
   	 }else{
   	 	issaveok = SAVE_CANCEL;
   	 }
   	 

   	 goout:
	//databst = DetachDataBase(cardlacb);//断开数据库
	return issaveok;


}











//返回值如果是null,表示没有找到需要的姓名
//字符串比较,可以考虑字符串的过滤
STATUS FindNameFromPhbook(P_S8	callstr,P_S8 outname,P_S8  isfind)
{
	PHONEBOOK * loadlist;
	PHONEBOOK *pointer;
	U16  len;
//	U16  count;
	U8    i;
	U8    findcall = 0;
	P_S8	getname = NULL;
	U8 	compare = 1;
	U32	databst;
	U8 slen=0;
	DBLACB	*phbooklacb;
	if(callstr == NULL)//判断输入的数据
	{
		return ASIX_ERROR;
	}
  //	CreateDataBase(CARD_DATA_BASE);		//创建数据库
//	CreateDataBase();	
  	phbooklacb = LinkDataBase(CARD_DATA_BASE);//连接数据库
   	loadlist =  LoadRelationData(AllRelation,&len,phbooklacb);//生成链表
   	databst = DetachDataBase(phbooklacb);//断开数据库,只要获得数据链表,就可以断开数据库

   	if(len == 0)//判断是否导入的链表为空
   	{
   	//	return NULL;
	//	(*outname) = NULL;
		return ASIX_OK;
   	}
   	pointer = loadlist;
	while(pointer !=NULL)//遍历数据链表
	{
		for(i = 0;i<MAXTELNUM;i++)
		{
			compare = strcmp(callstr,pointer->tel[i]);
			if(compare == 0)
			{
				findcall = 1;
			}
		}
		for(i=0;i<MAXMOBNUM;i++)
		{
			compare = strcmp(callstr,pointer->mobile[i]);
			if(compare == 0)
			{
				findcall = 1;
			}
		}
		for(i=0;i<MAXBPNUM;i++)
		{
			compare = strcmp(callstr,pointer->bp[i]);
			if(compare == 0)
			{
				findcall = 1;
			}
		}
		if(findcall == 1)
		{
			getname = pointer->name;
			if(getname == NULL)
			{
				return ASIX_ERROR;
			}
			slen = (U8)strlen(getname)+1;
			memcpy(outname,getname,slen);
			*isfind = 1;
			return ASIX_OK;
		}
		pointer = pointer->next;
	}
//	(*outname) = NULL;
      *isfind =0;
	return ASIX_OK;  //表示没有查询到数据
}


⌨️ 快捷键说明

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