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

📄 pcsyn_application.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:

/*
+-------------------------------------------------------------------+
| PROJECT: PC Synchronization                    
| $Workfile: pcsyn_application.c
| $Author: Talcon Hu
| CREATED: 18.05.2004                 
+-------------------------------------------------------------------+
*/
#define ENTITY_PCSYN
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "stddefs.h"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif



#include "mfw_sys.h"
#include "p_sim.h"


#include "mfw_mfw.h"
#include "mfw_sms.h"


#include "mfw_ffs.h"
#include "mfw_smsi.h"

#include "mmiutilapi.h"
//#include "mmibookshared.h"

#include "pconst.cdg"

#define PCSYN_COMPILE_FORAPP
#include "pcsyn.h"

#include "pcsyn_protocol.h"
#include "pcsyn_application.h"


typedef struct
{
	UBYTE status;
	PC_Interface_Info *info;
}T_PC_WaitData;
static T_PC_WaitData pc_waitdata = 
	{
		0,0
	};

PC_App_Cmd appcmd;

extern UINT8 g_pcsyncstatus ;
/**********************file operate*****************/

unsigned int pc_interface_file(PC_Interface_Info * info, PC_App_Cmd_File *cmd)
{
	static T_FFS_DIR ffs_dir;
	static T_FFS_SIZE ffs_size;
	static T_FFS_STAT state;

	static PC_FILEHead_info_dl * headinfo;
	static char filename[32];
	static char pathname[50];
	static char fullname[128];
	char * p;
	static int dlbuffsize;
	static int namelenth;
	T_FFS_RET re;
	char * pdest;
	int posi=0;
	

	switch(cmd->cid2)
	{
		case PC_AppCID2_Read:
		{
			T_FFS_STAT stat;
			if(ffs_stat((char*)cmd->file, &stat) != EFFS_OK)
				return App_Error_InfoError;
			info->flag = PC_IF_FLAGS_DATADL;
			info->size_dlbuff = ffs_fread((char*)cmd->file,
				(void*)info->pdata_dlbuff,
				(int)stat.size);
		}
			break;
		case PC_AppCID2_Write:
			if(info->flag == PC_IF_FLAGS_CMD)
				info->flag = PC_IF_FLAGS_DATAUL;
			else
			{
				memset(filename, '\0', sizeof(filename) );
				memset(pathname, '\0', sizeof(pathname) );
				pdest=strchr((char *)cmd->file, '/');
				while (pdest != NULL)
				{
					posi=pdest-(char *)(cmd->file);//取出目录内容
					pdest++;
					pdest=strchr(pdest, '/');
				};
				memcpy(pathname,(char *)cmd->file,posi);
				if (pathname[0]=='\0') pathname[0]='/';//如果是根目录则应该为'/'
				pdest=(char *)cmd->file+posi+1;
				memcpy(filename,pdest,strlen((char *)cmd->file)-posi-1);

//				MI_dbgPrintf("<<<<pathname=%s,filename=%s,cmdfile=%s>>>>",pathname,filename,cmd->file);
				
				if (ffs_opendir ((char*)pathname,&ffs_dir)==EFFS_NOTFOUND)
					ffs_mkdir((char*)pathname);
				info->size_ulbuff = ffs_fwrite(
					(char *)cmd->file,
					(void *)info->pdata_ulbuff,
					(int)info->size_ulbuff);
			}
			
			break;
		case PC_AppCID2_Delete :
			info->flag = PC_IF_FLAGS_DATADL;
			info->size_dlbuff = 0;

			memset(filename, '\0', sizeof(filename) );
			memset(pathname, '\0', sizeof(pathname) );
//			MI_dbgPrintf("<<<1cmdfile=%s>>>>",cmd->file);
			pdest=strchr((char *)cmd->file, '/');
			while (pdest != NULL)
			{
				posi=pdest-(char *)(cmd->file);//取出目录内容
				pdest++;
				pdest=strchr(pdest, '/');
			};
			memcpy(pathname,(char *)cmd->file,posi);
			if (pathname[0]=='\0') pathname[0]='/';//如果是根目录则应该为'/'
			pdest=(char *)cmd->file+posi+1;
			memcpy(filename,pdest,strlen((char *)cmd->file)-posi-1);

//			MI_dbgPrintf("<<<<pathname=%s,filename=%s,cmdfile=%s>>>>",pathname,filename,cmd->file);

			if (filename[0]!='\0')//是文件类型
			{
				if (strcmp((char *)pathname,"/")!=0 ) strcat(pathname,"/");
				ffs_remove((char *)strcat(pathname,filename));
			}	
			else
			{//是目录类型
				ffs_size = ffs_opendir ((char*)pathname,&ffs_dir);
				if (ffs_size <0)//返回值=0表示空目录
					return App_Error_DeleteError;//目录打不开
				
				while(ffs_readdir(&ffs_dir , filename , sizeof(filename))>0)
				{
					strcat(fullname,pathname);
					if (strcmp((char *)pathname,"/")!=0 ) strcat(fullname,"/");
					strcat(fullname,filename);
					re=ffs_stat((char*)fullname, &state);
					if(re!=EFFS_OK) 	continue;
					if ((state.type=OT_FILE)&&(state.flags!=OF_READONLY))
					{
//						MI_dbgPrintf("<<<<delfilename=%s>>>>",fullname);
						ffs_remove((char*)fullname);
					}
					memset(fullname, '\0', sizeof(fullname) );
				}
//				PCSYN_TRACE_EVENT(("<<<<deldirname=%s>>>>",pathname));
				re=ffs_remove((char*)pathname);
				if (re !=EFFS_OK) return App_Error_DeleteError;
//					PCSYN_TRACE_EVENT(("<<<<deldir failed=%d>>>>",re));
			}
			break;
		case PC_AppCID2_Info:
			ffs_size = ffs_opendir ((char*)cmd->file,&ffs_dir);
			info->flag = PC_IF_FLAGS_DATADL;
			if (ffs_size <0)
			{
				info->size_dlbuff=0;
				return App_Error_InfoError;//目录打不开
			}			
			headinfo=(PC_FILEHead_info_dl *)info->pdata_dlbuff;
			p=(char *)headinfo+sizeof(PC_FILEHead_info_dl);
			memset(filename, '\0', sizeof(filename) );
			memset(pathname, '\0', sizeof(pathname) );
			dlbuffsize=0;
			namelenth=0;
			while(ffs_readdir(&ffs_dir , filename , sizeof(filename) ) >0)
			{
				strcpy((char*)pathname,(char*)cmd->file);
				if (strcmp((char *)cmd->file,"/")!=0 ) strcat(pathname,"/");
				re=ffs_stat(strcat(pathname,filename), &state);
				if(re!=EFFS_OK) 	continue;
				
				memcpy(&(headinfo->stat),&state,sizeof(T_FFS_STAT));
				namelenth=strlen(filename);
				namelenth=(namelenth+3)&(~3);//补齐四个字节
				headinfo->fnsize=namelenth;
				strcpy(p,filename);
				dlbuffsize=dlbuffsize+sizeof(PC_FILEHead_info_dl)+namelenth;
//				MI_dbgPrintf("<<<<2dlbuffsize=%d,fnsize=%d,filename=%s,namelenth=%d>>>>",dlbuffsize,strlen(filename),filename,namelenth);
				headinfo=(PC_FILEHead_info_dl *)(info->pdata_dlbuff+dlbuffsize);
				p=(char *)headinfo+sizeof(PC_FILEHead_info_dl);
				memset(filename, '\0', sizeof(filename) );
				memset(pathname, '\0', sizeof(pathname));
			}
			info->size_dlbuff = dlbuffsize;
			break;
		default:
			return App_Error_UnknownCID2;
	}
	return App_Error_NoError;
}

/******************************Phone Book********************************/

unsigned int delphonebook(DelRec *delphb_content,int count )
{
	int  i=0,k;
	static T_MFW_PHB_STATUS     status;
	T_MFW   ret;
	DelRec  *buffer = delphb_content;
	short  index;
	short  ctype;
	
	for(k=0;k<count;k++,buffer++)
	{
		ctype=buffer->ctype;
		switch(ctype)
		{
		case NVM_BOOK_SEL:
			index=buffer->index-1;//保证从记录0开始
			if (index>ALL_NVM_LIST) return App_Error_DeleteError;
			for( i=0;i<ALL_NVM_LIST;i++ )
			{
				if(CheckFlag(i))
				{
					if (l_phb_index[i].index==index)
					{
						l_phb_index[i].flag=SetDelFlag(i);
						if( (i/PHB_table_len)==CurrentTable)
						{
							T_EasyName smsdata;
							char smsnumber[22]="";
							memset(&smsdata,0,sizeof(T_EasyName));
							if( !l_phb_index[i].number[0] )
							{
								UnCompressNum((char *)FFS_PBData.NVMBook[i%PHB_table_len].number, (unsigned char *)smsnumber);
								memcpy(smsdata.number,smsnumber,PHB_number_len);
								ChangeSmsDataName(smsdata);
							}
							if( !l_phb_index[i].number[1] )
							{
								UnCompressNum((char *)FFS_PBData.NVMBook[i%PHB_table_len].office, (unsigned char *)smsnumber);
								memcpy(smsdata.number,smsnumber,PHB_number_len);
								ChangeSmsDataName(smsdata);
							}
							if( !l_phb_index[i].number[2] )
							{
								UnCompressNum((char *)FFS_PBData.NVMBook[i%PHB_table_len].home, (unsigned char *)smsnumber);
								memcpy(smsdata.number,smsnumber,PHB_number_len);
								ChangeSmsDataName(smsdata);
							}
						}
						else
						{
							T_EasyName smsdata;
							char smsnumber[22]="";
							memset(&smsdata,0,sizeof(T_EasyName));

							if( flash_PBread(PBTable[i/PHB_table_len])!=0 )
							    CurrentTable=i/PHB_table_len;
							if( !l_phb_index[i].number[0] )
							{
								UnCompressNum((char *)FFS_PBData.NVMBook[i%PHB_table_len].number, (unsigned char *)smsnumber);
								memcpy(smsdata.number,smsnumber,PHB_number_len);
								ChangeSmsDataName(smsdata);
							}
							if( !l_phb_index[i].number[1] )
							{
								UnCompressNum((char *)FFS_PBData.NVMBook[i%PHB_table_len].office, (unsigned char *)smsnumber);
								memcpy(smsdata.number,smsnumber,PHB_number_len);
								ChangeSmsDataName(smsdata);
							}
							if( !l_phb_index[i].number[2] )
							{
								UnCompressNum((char *)FFS_PBData.NVMBook[i%PHB_table_len].home, (unsigned char *)smsnumber);
								memcpy(smsdata.number,smsnumber,PHB_number_len);
								ChangeSmsDataName(smsdata);
							}
						}   
						FFS_PBData.NVMBook[i%PHB_table_len].info=l_phb_index[i].flag;
						flash_PBwrite(PBTable[CurrentTable]);  
						NVMTotal=NVMTotal-1;
						break;//跳出查找循环
					}
				}		
			}	
			break;
		case SIM_BOOK_SEL:
			index=buffer->index;
			if (index>ALL_SIM_LIST) return App_Error_DeleteError;

			for( i=ALL_NVM_LIST;i<ALL_NUMBER_LIST;i++ )
			{
				if(CheckFlag(i))
				{
					if (l_phb_index[i].index==index)
					{
						l_phb_index[i].flag=SetDelFlag(i);
					 	ret=phb_delete_entry(PHB_ADN,l_phb_index[i].index,&status);
						if( ret != MFW_PHB_OK )
						{
							return App_Error_DeleteError;
						}
						else
						{
							 //update the smsdata
							T_EasyName smsdata;
							T_MFW_PHB_ENTRY smsentry;

							memset(&smsdata,0,sizeof(T_EasyName));
							memset(&smsentry,0,sizeof(T_MFW_PHB_ENTRY));
							ReadSIMRecord(i,&smsentry);
							memcpy(smsdata.number,smsentry.number,PHB_number_len);
							ChangeSmsDataName(smsdata);
						}	
						break;//跳出查找循环
					}
				}	
			}
			break;
		default:
			return App_Error_IllegalCmdData;
		}
	}	
       GetSIMData();
	return App_Error_NoError;
}

	
unsigned int editPhonebook(PC_PHB_Content *PHB_content,BYTE type, BYTE index)
{
	PhbkDetailItem *buffer = &(PHB_content->phkitem);
	int  i;
	//PhbkDetailItem      l_phb_NVMentry;  
	static T_MFW_PHB_STATUS     status;
	T_MFW_PHB_ENTRY entry;
	short  cindex;
	short  ctype;

	
	//index=0, it means to insert a record into list,else to modify a record in list.     
	if(index==0) 
	{
		switch(type)
		{
		case NVM_BOOK_SEL:
			if (NVMTotal>=ALL_NVM_LIST) return App_Error_WriteError;
			for( i=0;i<ALL_NVM_LIST;i++ )
			{
				if(!CheckFlag(i))
				{
					l_phb_index[i].phonebook=NVM_BOOK_SEL;
					break;
				}		
			}	
			break;
		case SIM_BOOK_SEL:
			GetSIMData();
			status.book=PHB_ADN;
			if (phb_get_status(&status)!=MFW_PHB_OK) return App_Error_WriteError;
			if (SIMTotal>=status.max_entries) return App_Error_WriteError;
				
			for( i=ALL_NVM_LIST;i<ALL_NUMBER_LIST;i++ )
			{
				if(!CheckFlag(i))
				{
					l_phb_index[i].phonebook=SIM_BOOK_SEL;
					break;
				}		
			}	
 			break;
		default:
			return App_Error_IllegalCmdData;
		}
	}
	else
	{ 
		switch(type)
		{
		case NVM_BOOK_SEL:
//			index--;//因为index在l_phb_index中是从0开始的
			if (index>ALL_NVM_LIST) return App_Error_ModifyError;
			for( i=0;i<ALL_NVM_LIST;i++ )
			{
				if(CheckFlag(i))
				{
					if (l_phb_index[i].index==index-1) //手机的l_phb_index[i].index是从0开始的
					{
//						PCSYN_TRACE_EVENT(("<<<<write NVM=%d>>>>",index));
						break;
					}	
				}
			}
			if (i>=ALL_NVM_LIST) return App_Error_ModifyError;//没有找到要修改的记录
			break;
		case SIM_BOOK_SEL:
			GetSIMData();
			//防止超出sim卡电话簿范围
			status.book=PHB_ADN;
			if (phb_get_status(&status)!=MFW_PHB_OK) return App_Error_ModifyError;
			if (index>status.max_entries) return App_Error_ModifyError;

			for( i=ALL_NVM_LIST;i<ALL_NUMBER_LIST;i++ )
			{
				if(CheckFlag(i))
				{
					if (l_phb_index[i].index==index) //sim卡的l_phb_index[i].index是从1开始的
					{
						break;
					}	
				}
			}
			if (i>=ALL_NUMBER_LIST) return App_Error_ModifyError;//没有找到要修改的记录
			break;
		}	
	}   
        
 //以上返回的i,就是l_phb_index中的索引       
	switch(l_phb_index[i].phonebook)
	{
	case NVM_BOOK_SEL:
		memcpy(l_phb_index[i].name,buffer->name,PHB_name_len+3);  //名字一定要按全长度覆盖  
		l_phb_index[i].number[0]=GetShortNumber((char *)buffer->number);
		l_phb_index[i].number[1]=GetShortNumber((char *)buffer->home);

⌨️ 快捷键说明

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