📄 mmsagent.c
字号:
switch(urlID)
{
case URLID_MMS_RECV:
//here reprot a error to mmi
switch(errorNo)
{
case 0x09:/*ERR_WTP_MESSAGETOOLARGE
Due to a message size bigger than the capabilities of the receiver the transaction cannot be completed.*/
WAP_TRACE_EVENT(("recv error,message too large!"));
break;
case 0x44:/*HTTPFileNotFound*/
break;
case 0x48:
break;/*HTTPRequestTimeout*/
default:
break;
}
strcpy(g_filename,get_mmslist_head(MMS_TYPE_RECV)->filename);
handle_mms_queue_end();
wap_mms_evt_cb(
NET_GET_CONTENT_IND,
MMI_MMS_FAILED,
g_filename
);
//WAP_TRACE_EVENT(("mms recv error ,remove %s",g_filename ));
//ffs_remove(g_filename);
break;
case URLID_MMS_SEND:
handle_mms_queue_end();
//here reprot a error to mms
wap_mms_evt_cb(
NET_POST_CNF,
MMI_MMS_FAILED,
NULL
);
break;
}
return;
}
if(data_length == 0)
{/*notifi.res*/
if(urlID == URLID_MMS_SEND)
{
TRACE_FUNCTION("Rcv Packet: send success, data=Null");
handle_mms_queue_end();
// set_mmslist_process(NULL);
wap_mms_evt_cb(
NET_POST_CNF,
MMI_MMS_SUCCESS,
NULL
);
}
}
else/*push,delivery ind,receive acknownledge*/
{
//if(total_size == 0)
if(urlID != wait_urlID || totalsize == 0) //避免数据互相干扰
{
MessageType = MMS_Get_MessageType((char*)data);
}
WAP_TRACE_EVENT(("MessageType:%d",MessageType));
switch(MessageType)
{
case MMS_MESSAGE_TYPE_SEND_CONF://send finished,call by M_WAP_MMI_CONTENT_REQ
{
TRACE_EVENT("MMS_MESSAGE_TYPE_SEND_CONF");
handle_mms_queue_end();
sprintf(g_fullname, "%s%s", MMS_DIR, MMS_SENDCONF);
ffs_remove(g_fullname);
ffs_file_write((const char *)g_fullname, data, data_length, FFS_O_TRUNC|FFS_O_CREATE);
wap_mms_evt_cb(
NET_POST_CNF,
MMI_MMS_SUCCESS,
(char *)MMS_SENDCONF
);
break;
}
case MMS_MESSAGE_TYPE_DELIVERY_IND://push message
{
char filename[15];
TRACE_EVENT("MMS_MESSAGE_TYPE_DELIVERY_IND");
MMS_CreatePushfilename(filename, g_fullname,TRUE);
TRACE_EVENT(filename);
ffs_file_write((const char *)g_fullname, data, data_length, FFS_O_TRUNC|FFS_O_CREATE);
// 当网络忙时,放入队列等待处理
//if(AUI_check_mms_status())
if(get_mmslist_head(0))
{
T_MMS_PUSH_QUEUE * NewPush = NULL;
MMS_new(NewPush , sizeof(T_MMS_PUSH_QUEUE));
strcpy(NewPush->filename, filename);
NewPush->type = MMS_PQ_TYPE_DLVRYIND;//is a delivery.ind
NewPush->next = NULL;
append_pushlist(NewPush);
return;
}
#if 0
AutoRcv_status = TRUE; // 2004/3/9
#endif
//mmspushlist_wait = 0;
wap_mms_evt_cb(
NET_PUSH_IND,
MMI_MMS_SUCCESS,
filename
);
break;
}
case MMS_MESSAGE_TYPE_NOTIFICATION_IND://MMS_MESSAGE_TYPE_NOTIFICATION_IND
{
char filename[15];
//char g_fullname[30];
int temp;
TRACE_EVENT("MMS_MESSAGE_TYPE_NOTIFICATION_IND");
MMS_CreatePushfilename(filename, g_fullname,FALSE);
TRACE_EVENT(g_fullname);
ffs_file_write((const char *)g_fullname, data, data_length, FFS_O_TRUNC|FFS_O_CREATE);
// 当网络忙时,放入队列等待处理
if(get_mmslist_head(0))
{
T_MMS_PUSH_QUEUE * NewPush = NULL;
MMS_new(NewPush , sizeof(T_MMS_PUSH_QUEUE));
strcpy(NewPush->filename, filename);
NewPush->type = MMS_PQ_TYPE_NOTI;//is a notification.ind
NewPush->next = NULL;
append_pushlist(NewPush);
return;
}
#if 0
AutoRcv_status = TRUE; //2004/3/9
#endif
//mmspushlist_wait = 0;
wap_mms_evt_cb(
NET_PUSH_IND,
MMI_MMS_SUCCESS,
filename //只传文件名,不带路径
);
break;
}
case MMS_MESSAGE_TYPE_RETRIVE_CONF://receive,call by M_WAP_MMI_CONTENT_REQ
{
T_WAP_MMI_CONTENT_REQ parameter;
parameter.urlID = urlID;
parameter.data = data;
parameter.data_length = data_length;
parameter.moreData = moreData;
parameter.totalSize = totalSize;
parameter. errorNo= errorNo;
TRACE_EVENT("MMS_MESSAGE_TYPE_RETRIVE_CONF");
handle_mmsrecv(get_mmslist_head(MMS_TYPE_RECV), ¶meter);
if(!moreData)
{
strcpy(g_filename,&get_mmslist_head(MMS_TYPE_RECV)->filename[13]);
WAP_TRACE_EVENT(("recv file:%s", g_filename));
handle_mms_queue_end();
wap_mms_evt_cb(
NET_GET_CONTENT_IND,
MMI_MMS_SUCCESS,
g_filename/* 只传文件名,不带路径*/
);
}
break;
}
default:
break;
}
}
if(urlID == wait_urlID || wait_urlID == 0)
{
if(moreData)
{
totalsize += data_length;
wait_urlID = urlID;
}
else
{
wait_urlID = 0;
totalsize = 0;
}
}
return;
}
/***************push file manage*********/
/**************************************
$Descritpion:
程序初始化时读取目录/mmi/mms下的所有文件%06u.mms
*****************************************/
const char mmspushfile[] = "/mms/push.txt";
#define MMS_PUSHFILE_LEN sizeof(T_MMS_PUSH_QUEUE)
#define MMS_FUSHFILE_TEST
BOOL isPushInRecvFolder(char *filename)
{
P_MMS mms = getMMS();
pMessage message;
TRACE_FUNCTION("isInRecvFolder");
message = mms->manager->receivefolder->root;
while(message)
{
if(strcmp(filename,message->filename) ==0)
return TRUE;
message = message->next;
}
return FALSE;
}
void mms_pushfile_init()
{
T_FFS_DIR ffs_dir;
T_FFS_SIZE ffs_size;
T_FFS_STAT stat;
char filename[15];
T_MMS_PUSH_QUEUE * p ;
TRACE_FUNCTION("mms_pushfile_init");
//mmspushlist_head = 0;
//return;
#ifdef MMS_FUSHFILE_TEST
if(ffs_stat(mmspushfile, &stat) <0)/*非正常关机*/
{
#endif
ffs_size = ffs_opendir ("/mms/message",&ffs_dir);
if(ffs_size <=0)return;
p = mmspushlist_head;
while(ffs_readdir(&ffs_dir , filename , sizeof(filename) ) >0)
{
WAP_TRACE_EVENT(("filename:%s",filename));
if( ( filename[0]!= 'd' && filename[0]!= 'p') || strcmp(&filename[6],".mms") !=0)
continue;
WAP_TRACE_EVENT(("%s", filename));
if( filename[0] == 'd')
{
char fullname[30];
sprintf(fullname,"/mms/message/%s",filename);
WAP_TRACE_EVENT(("remove filename:%s",filename));
ffs_remove(fullname);
}
else
{
append_pushlist_byfile(filename, MMS_PQ_TYPE_FILE );
WAP_TRACE_EVENT(("add filename:%s",filename));
}
}
#ifdef MMS_FUSHFILE_TEST
}
else
{
T_MMS_PUSH_QUEUE push ;
int fp = ffs_open(mmspushfile, FFS_O_RDONLY);
if(fp <=0 )
{
TRACE_EVENT("open file error--/mms/push.txt");
return;
}
while(MMS_PUSHFILE_LEN ==ffs_read(fp, &push, MMS_PUSHFILE_LEN ))
{
WAP_TRACE_EVENT((push.filename));
append_pushlist_byfile(push.filename,push.type);
WAP_TRACE_EVENT((push.filename));
}
ffs_close(fp);
ffs_remove(mmspushfile);
}
#endif
//handle_push_queue();
if(mmspushlist_head)
{
#ifdef MMI_MMSTASK_ENABLED
T_MMI_MMS_MIMNGRINIT_IND parameter;
parameter.mask = MANAGER_MASK_MMSAGT;
M_MMI_MMS_MIMNGRINIT_IND( ¶meter);
#else
MI_manager_on_initialize(MANAGER_MASK_MMSAGT);
#endif
}
}
void mms_pushfile_exit()
{
T_MMS_PUSH_QUEUE * p ;
#ifdef MMS_FUSHFILE_TEST
int fp = ffs_open(mmspushfile, FFS_O_CREATE |FFS_O_WRONLY);;
#endif
TRACE_FUNCTION("mms_pushfile_exit");
p = mmspushlist_head;
while(p)
{
if(p->type == MMS_PQ_TYPE_DLVRYIND)
{
sprintf(g_fullname, "%s%s", MMS_DIR, p->filename);
ffs_remove(g_fullname);
WAP_TRACE_EVENT(("MMS_PQ_TYPE_DLVRYIND: %s", p->filename));
continue;
}
#ifdef MMS_FUSHFILE_TEST
if(fp > 0)
{
WAP_TRACE_EVENT(("save push: %s", p->filename));
ffs_write(fp, p, MMS_PUSHFILE_LEN );
}
#endif
p = p->next;
}
#ifdef MMS_FUSHFILE_TEST
if(fp>0)
ffs_close(fp);
#endif
}
/***********end push file manage*********/
/**************************************
MMS_Random
********************************************/
int MMS_Random(int min,int max)
{
return rand()%(max-min) + min;
}
/*******************************************
$Descrition:
vreate a new push file name
***********************************************/
void MMS_CreatePushfilename(char * filename, char* fullname,BOOL isDelivery)
{
T_FFS_RET result;
T_FFS_STAT stat;
TRACE_EVENT("MMS_CreatePushfilename");
do
{
if(isDelivery)
sprintf(filename, "d%05u.mms", MMS_Random(MMS_RANDOM_MIN, MMS_RANDOM_MAX));
else
sprintf(filename, "p%05u.mms", MMS_Random(MMS_RANDOM_MIN, MMS_RANDOM_MAX));
sprintf(fullname, "%s%s", MMS_DIR, filename);
}while(ffs_stat((const char *)fullname, &stat) == EFFS_OK);
WAP_TRACE_EVENT((fullname));
}
#if 0
void DumpCurrentStack()
{
extern LONG os_TaskInformation ( USHORT Index, char *Buffer);
extern int os_MyHandle ( void );
static char buffer[124];
os_TaskInformation(os_MyHandle(),buffer);
WAP_TRACE_EVENT(("***hyl,%s",buffer));
}
void MI_dump_partitioninfo()
{
#include "glob_defs.h"
#define NU_PARTITION_POOL_SIZE 15
#define NU_TASK_SIZE 42
typedef unsigned long UNSIGNED;
typedef unsigned short USHORT;
typedef struct NU_PARTITION_POOL_STRUCT
{
UNSIGNED words[NU_PARTITION_POOL_SIZE];
} NU_PARTITION_POOL;
typedef struct NU_TASK_STRUCT
{
UNSIGNED words[NU_TASK_SIZE];
} NU_TASK;
typedef struct
{
ULONG Size; /* partition size */
NU_PARTITION_POOL *PoolCB; /* pointer to control block of the pool */
} T_PARTITION_POOL_TABLE;
typedef struct
{
char Name [ RESOURCE_NAMELEN ]; /* name of the partition pool group */
T_PARTITION_POOL_TABLE Pools [ MAX_POOLS_PER_GROUP ]; /* table of pools in this group */
} T_PARTITION_GROUP_TABLE;
extern T_PARTITION_GROUP_TABLE PartitionGroupTable [ MAX_POOL_GROUPS+1 ];
static char buffer[80];
char Name[ RESOURCE_NAMELEN ];
ULONG PoolSize,PartitionSize,Available,Waiting, Allocated;
void *pStartAddress;
NU_TASK *First;
USHORT Group, Pool;
unsigned char SuspendType;
for(Group= 0; Group<= MAX_POOL_GROUPS; Group++)
{
for(Pool = 0; Pool < MAX_POOLS_PER_GROUP; Pool++)
{
if ( PMF_Partition_Pool_Information ( PartitionGroupTable[Group].Pools[Pool].PoolCB, Name,
&pStartAddress, &PoolSize, &PartitionSize, &Available,
&Allocated, &SuspendType, &Waiting, &First ) == 0 )
{
sprintf (buffer, "Name:%s Addr:%lx PoolSize:%ld PartSize:%ld Free:%ld Used:%ld",
Name, (ULONG)pStartAddress, PoolSize, PartitionSize, Available, Allocated );
WAP_TRACE_EVENT((buffer));
}
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -