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

📄 mmsagent.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		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), &parameter);
			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(  &parameter);
#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 + -