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