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

📄 mfm80mngtdirfile.c

📁 我今天开始上传5份TI、NXP、MTK的手机开发全套资料。希望对大家有很大的帮助
💻 C
📖 第 1 页 / 共 3 页
字号:
	    /* If type of object is to place in destination buffer made it */	    if ( ( ( vl_TypeOfObj == FS_OBJECT_DIR ) && ( vp_Which.v_TypeOfObj & FM_OBJ_DIR ))						    ||		 (  ( vl_TypeOfObj == FS_OBJECT_FILE ) && ( vp_Which.v_TypeOfObj & FM_OBJ_FILE ))	       )	    {	    	if ( vp_Which.v_InfoType == FM_NAME ) 	    	{ 		    /* If enough place in destination buffer copy name in it */		    if ( vp_SizeOfDestBuff >= vl_NameLength+1 )		    {		    	/* Copy name in destination buffer */    	    	    	strncpy( pl_DestBuffPtr, &pl_ReadBuffPtr[FM_SIZE_OF_OBJ_ID], vp_SizeOfDestBuff ); 		    	/* Point in rest of destination buffer and update remaining buffer size */		    	pl_DestBuffPtr += vl_NameLength + 1;		    	vp_SizeOfDestBuff -= vl_NameLength + 1;			/* Increment number of elements read */			vl_NbrElemRead++;		    	/* Request to point on next element in directory file */		    	vl_PointNextReq = TRUE;		    }		         /* Buffer full exit */		    else vl_ExitReq = TRUE;	    	}	    	else	    	{		    /* if enough place copy file ID in destination buffer */		    if ( vp_SizeOfDestBuff >= sizeof(s32) )		    {			register u16 * pl_U16 = (u16*) pl_DestBuffPtr;		    	/* Copy ID in destination buffer */		    	*pl_U16 = vl_IDType;			/*	printf ( "\n ID is : %d" , vl_IDType);*/		    	/* Point in rest of destination buffer and update remaining buffer size */			pl_U16++;		    	pl_DestBuffPtr =  (ascii*) pl_U16;		    	vp_SizeOfDestBuff -= sizeof(u16);			/* Increment number of elements read */			vl_NbrElemRead++;		    	/* Request to point on next element in directory file */		    	vl_PointNextReq = TRUE;		    }		         /* Buffer full exit */		    else vl_ExitReq = TRUE;	    	}	    }	    else /* Request to point on next element in directory file */		vl_PointNextReq = TRUE;	    if ( vl_PointNextReq )	    {    	    	/* Update position in directory context */    	    	pp_DirCtx->v_Position += vl_NameLength + FM_SIZE_OF_OBJ_ID + 1;		pl_ReadBuffPtr += vl_NameLength + FM_SIZE_OF_OBJ_ID + 1;    	    	/* If position point at end of file set end of file flag else update index */    	    	if ( pp_DirCtx->v_Position >= pp_DirCtx->v_FileSize )		{		    pp_DirCtx->v_EndOfFile = TRUE;		    /* End of file reached -> exit */		    vl_ExitReq = TRUE;		}		/* Clear request flag */		vl_PointNextReq = FALSE;	    }	    /* If enough elements read exit */	    if ( vl_NbrElemRead >= vp_NbrElemToRead ) vl_ExitReq = TRUE;	} while ( !vl_ExitReq );    } while ( !vl_ExitReq );    /* Return number of elements read */    return ( vl_NbrElemRead );}#undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 5void mFm80_05InsertObjInDir( u16 vp_DirId, u16 vp_ObjId,  ascii * pp_ObjName, u8 vp_NameLenght,				 u8 vp_TypeOfObj, t_DirFileInfo * sp_DirFileInfo, 				t_mFmLayerContext * pp_LayerCtx, s32 * pp_Status){  /* Final file size is: Size of header + size of name + size of '\0' */  u32 vl_EntryLenght = FM_SIZE_OF_OBJ_HEADER + vp_NameLenght + 1;  u16 vl_IDType;  ascii al_StrIDType[2];  /* Update Id type */  if ( vp_TypeOfObj == FS_OBJECT_DIR ) vl_IDType = vp_ObjId  | FM_MASK_OBJ_TYPE_DIR;  else vl_IDType = vp_ObjId;  /* Encode Type ID ( to avoid mismatch with '\0' character from end of string */  vl_IDType = mFm80_01Encode(vl_IDType);  /* Place ID type of obj on buffer to write */  al_StrIDType[0] = vl_IDType>>8;  al_StrIDType[1] = vl_IDType & 0xff;  /* Insert new object in dir file for this:		- Write in same place beginning of file until insert index		- write type of object and object ID 		- write name of object 		- write rest of file   */    {      t_WriteHeader	sl_WriteHeader;      t_WriteCmdStruct3 sl_CmdSet;	/* Initialize write header */    	sl_WriteHeader.v_FinalFileSize = sp_DirFileInfo->v_FileSize + vl_EntryLenght;    	sl_WriteHeader.v_DestFileId = vp_DirId;	sl_WriteHeader.p_NextWriteCmdHeader = (t_WriteCmdHeader*)&sl_CmdSet;			    	/* Begin initialization of write command header */	sl_CmdSet.s_WriteCmdHeader.p_NextWriteCmdHeader = NIL;	sl_CmdSet.s_WriteCmdHeader.v_OffsetInFile = 0;				/* Write header ( obj ID + ....) */    	sl_CmdSet.s_WriteCmd[0].v_TypeOfCmd = FS_SRC_ADR_DST_INDEX;    	sl_CmdSet.s_WriteCmd[0].v_SizeCopied = 0;    	sl_CmdSet.s_WriteCmd[0].v_Size = FM_SIZE_OF_OBJ_HEADER;    	sl_CmdSet.s_WriteCmd[0].u_Srce.p_Srce = &al_StrIDType[0];    	sl_CmdSet.s_WriteCmd[0].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile;     	sl_CmdSet.s_WriteCmd[0].v_SrceFileId = vp_DirId;	/* Write name of object */    	sl_CmdSet.s_WriteCmd[1].v_TypeOfCmd = FS_SRC_ADR_DST_INDEX;    	sl_CmdSet.s_WriteCmd[1].v_SizeCopied = 0;    	sl_CmdSet.s_WriteCmd[1].v_Size = vp_NameLenght+1;    	sl_CmdSet.s_WriteCmd[1].u_Srce.p_Srce = pp_ObjName;    	sl_CmdSet.s_WriteCmd[1].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile 								+ FM_SIZE_OF_OBJ_HEADER;     	sl_CmdSet.s_WriteCmd[1].v_SrceFileId = vp_DirId;	/* If insertion not at end of file write rest of file */	if ( sp_DirFileInfo->v_FileSize - sp_DirFileInfo->v_PositionInFile != 0 )	{    	    sl_CmdSet.s_WriteCmd[2].v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX;    	    sl_CmdSet.s_WriteCmd[2].v_SizeCopied = 0;    	    sl_CmdSet.s_WriteCmd[2].v_Size = sp_DirFileInfo->v_FileSize - 								sp_DirFileInfo->v_PositionInFile;    	    sl_CmdSet.s_WriteCmd[2].u_Srce.v_SrceIndex = sp_DirFileInfo->v_PositionInFile;    	    sl_CmdSet.s_WriteCmd[2].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile						 			+ vl_EntryLenght;    	    sl_CmdSet.s_WriteCmd[2].v_SrceFileId = vp_DirId;	    sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 3;	}	else  sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 2;    	/* Makes write in device */	MC_MFM_LL_WRITE_COMPLEX( &sl_WriteHeader, pp_Status );    	/* If status not OK return */    	if ( *pp_Status != FS_OK) return;    }   /* Directory content have change update all contextes opened for the same directory */   mFm80_08CorrectDirCtx( FM_INSERT, vp_DirId, pp_LayerCtx, 0, 0,				sp_DirFileInfo->v_PositionInFile, vl_EntryLenght);}#undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 6void mFm80_06RemoveObjFromDir( u16 vp_DirId, t_DirFileInfo * sp_DirFileInfo, 					t_mFmLayerContext * pp_LayerCtx, s32 * pp_Status ){   t_WriteHeader	sl_WriteHeader;   t_WriteCmdStruct1 	sl_CmdSet;    /* Initialize write header */    sl_WriteHeader.v_FinalFileSize = sp_DirFileInfo->v_FileSize 							-					 sp_DirFileInfo->v_EntryLenght;    sl_WriteHeader.v_DestFileId = vp_DirId;    sl_WriteHeader.p_NextWriteCmdHeader = (t_WriteCmdHeader*)&sl_CmdSet;    /* Is this entry the last of the file ? */    if ( sp_DirFileInfo->v_PositionInFile != sl_WriteHeader.v_FinalFileSize  )    {	/* Update write command header */    	sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 1;	sl_CmdSet.s_WriteCmdHeader.p_NextWriteCmdHeader = NIL;	sl_CmdSet.s_WriteCmdHeader.v_OffsetInFile = 0;	/* Update command */    	sl_CmdSet.s_WriteCmd[0].v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX;    	sl_CmdSet.s_WriteCmd[0].v_SizeCopied = 0;    	sl_CmdSet.s_WriteCmd[0].v_Size = sp_DirFileInfo->v_FileSize				 		- sp_DirFileInfo->v_EntryLenght 						- sp_DirFileInfo->v_PositionInFile;    	sl_CmdSet.s_WriteCmd[0].u_Srce.v_SrceIndex = sp_DirFileInfo->v_PositionInFile						 + sp_DirFileInfo->v_EntryLenght;    	sl_CmdSet.s_WriteCmd[0].u_Dest.v_DestIndex = sp_DirFileInfo->v_PositionInFile;     	sl_CmdSet.s_WriteCmd[0].v_SrceFileId = vp_DirId;   }   else	/* Number of commands is nul but size of file change */    	sl_WriteHeader.p_NextWriteCmdHeader = NIL;   /* Write it via lower layers */    MC_MFM_LL_WRITE_COMPLEX( &sl_WriteHeader, pp_Status );   /* If status not OK return */   if ( *pp_Status != FS_OK) return;   /* Directory content have change update all contextes opened for the same directory */   mFm80_08CorrectDirCtx( FM_DELETE, vp_DirId, pp_LayerCtx, sp_DirFileInfo->v_PositionInFile, 						sp_DirFileInfo->v_EntryLenght, 0, 0 );}/* In a single command erase old entry and insert the new */#undef PROCEDURE_NUMBER #define PROCEDURE_NUMBER 7void mFm80_07RenameObjFromDir( u16 vp_DirId, t_DirFileInfo * pp_DelDirFileInfo, 				t_DirFileInfo * pp_InsDirFileInfo, ascii * pp_ObjName, 				u8 vp_NameLenght, t_mFmLayerContext * pp_LayerCtx, s32 * pp_Status ){   s32 vl_InsEntryLenght = vp_NameLenght + FM_SIZE_OF_OBJ_HEADER + 1;   t_WriteHeader	sl_WriteHeader;   t_WriteCmdStruct4 	sl_CmdSet;    /* Initialize write header */    sl_WriteHeader.v_FinalFileSize = pp_DelDirFileInfo->v_FileSize 							-				 pp_DelDirFileInfo->v_EntryLenght + vl_InsEntryLenght;    sl_WriteHeader.v_DestFileId = vp_DirId;    sl_WriteHeader.p_NextWriteCmdHeader = (t_WriteCmdHeader*)&sl_CmdSet;    /* Update write command header */    sl_CmdSet.s_WriteCmdHeader.v_NbrCmds = 2;  /* Write of inserted entry is always made */    sl_CmdSet.s_WriteCmdHeader.p_NextWriteCmdHeader = NIL;    sl_CmdSet.s_WriteCmdHeader.v_OffsetInFile = 0;    {      s32 vl_DestPos;      s32 vl_Distance;      t_WriteCmd * pl_WriteCmd1;      t_WriteCmd * pl_WriteCmd2;      u8 vl_CmdNo;    	/* Generates insertion of new entry in file */    	/*------------------------------------------*/    	/* Determine position of command ( if deleted entry is before and not adjacent then 					it is the second command ) */	vl_Distance = pp_InsDirFileInfo->v_PositionInFile - pp_DelDirFileInfo->v_PositionInFile;	/* Calculate destination position of entry */	vl_DestPos = pp_InsDirFileInfo->v_PositionInFile;    	if (vl_Distance > 0 ) vl_DestPos = vl_DestPos - pp_DelDirFileInfo->v_EntryLenght;		/* Determine position of command in command set */    	if (vl_Distance > pp_DelDirFileInfo->v_EntryLenght ) pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[1];	else pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[0];	/* Write header ( It is the same that the deleted object ) */    	pl_WriteCmd1->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX;    	pl_WriteCmd1->v_Size = FM_SIZE_OF_OBJ_HEADER;    	pl_WriteCmd1->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_PositionInFile;    	pl_WriteCmd1->u_Dest.v_DestIndex = vl_DestPos; 	/* Write name of object */	pl_WriteCmd1++;    	pl_WriteCmd1->v_TypeOfCmd = FS_SRC_ADR_DST_INDEX;    	pl_WriteCmd1->v_Size = vp_NameLenght+1;    	pl_WriteCmd1->u_Srce.p_Srce = pp_ObjName;    	pl_WriteCmd1->u_Dest.v_DestIndex = vl_DestPos+ FM_SIZE_OF_OBJ_HEADER; 	    	/* Generates write command of old data beetween deleted and inserted entry and of data	     */	/*				after last entry					     */    	/*-------------------------------------------------------------------------------------------*/    	if ( vl_Distance > pp_DelDirFileInfo->v_EntryLenght )    	{    	    /* The deleted entry is before the inserted entry */    	    /* Generates the first write command of data between deleted and inserted entry */	    pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[0];    	    pl_WriteCmd1->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX;   	    pl_WriteCmd1->u_Dest.v_DestIndex  = pp_DelDirFileInfo->v_PositionInFile;   	    pl_WriteCmd1->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_PositionInFile 							+ pp_DelDirFileInfo->v_EntryLenght;	    pl_WriteCmd1->v_Size = pp_InsDirFileInfo->v_PositionInFile 					- pp_DelDirFileInfo->v_PositionInFile					- pp_DelDirFileInfo->v_EntryLenght;	    sl_CmdSet.s_WriteCmdHeader.v_NbrCmds ++;    	    /* Generates the second write command of data after inserted entity ( if exist ) */	    pl_WriteCmd2 = &sl_CmdSet.s_WriteCmd[3];	    pl_WriteCmd2->v_Size = pp_InsDirFileInfo->v_FileSize - pp_InsDirFileInfo->v_PositionInFile;	    if ( pl_WriteCmd2->v_Size != 0 )	    {		sl_CmdSet.s_WriteCmdHeader.v_NbrCmds++;    		pl_WriteCmd2->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX;   	    	pl_WriteCmd2->u_Srce.v_SrceIndex = pp_InsDirFileInfo->v_PositionInFile;   	    	pl_WriteCmd2->u_Dest.v_DestIndex = pl_WriteCmd1->u_Dest.v_DestIndex + 					pl_WriteCmd1->v_Size + vl_InsEntryLenght;	    }    	}    	else    	{	    /* The deleted entry is after or at same position that the inserted entity */	    /* Are insert and delete entries not at same position ? */ 	    if ( vl_Distance < 0 )	    {	    	/* The deleted entry is after the inserted entry */    	      	/* Generates the first write command of data between deleted and inserted entry */		pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[2];		sl_CmdSet.s_WriteCmdHeader.v_NbrCmds++;    		pl_WriteCmd1->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX;   	    	pl_WriteCmd1->u_Srce.v_SrceIndex = pp_InsDirFileInfo->v_PositionInFile;   	    	pl_WriteCmd1->u_Dest.v_DestIndex = pp_InsDirFileInfo->v_PositionInFile 								+ vl_InsEntryLenght;	    	pl_WriteCmd1->v_Size = pp_DelDirFileInfo->v_PositionInFile 					- pp_InsDirFileInfo->v_PositionInFile;    	    	/* Generates the second write command of data after inserted entity ( if exist ) */		pl_WriteCmd2 = &sl_CmdSet.s_WriteCmd[3];   	    	pl_WriteCmd2->u_Dest.v_DestIndex = pl_WriteCmd1->u_Dest.v_DestIndex 							+ pl_WriteCmd1->v_Size;	    	pl_WriteCmd2->v_Size = sl_WriteHeader.v_FinalFileSize 						- pl_WriteCmd2->u_Dest.v_DestIndex;		if ( pl_WriteCmd2->v_Size != 0 )		{		    sl_CmdSet.s_WriteCmdHeader.v_NbrCmds++;    		    pl_WriteCmd2->v_TypeOfCmd = FS_SRC_INDEX_DST_INDEX;   	    	    pl_WriteCmd2->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_FileSize 								- pl_WriteCmd2->v_Size;		}	    }	    else	    {	    	/* The deleted entry is at same position that the inserted entity */    	    	/* Generates a single write command of data after inserted entity ( if exist ) */		pl_WriteCmd1 = &sl_CmdSet.s_WriteCmd[2];		   	    	pl_WriteCmd1->u_Srce.v_SrceIndex = pp_DelDirFileInfo->v_PositionInFile 					+ pp_DelDirFileInfo->v_EntryLenght;   	    	pl_WriteCmd1->u_Dest.v_DestIndex = pp_DelDirFileInfo->v_PositionInFile 							+ vl_InsEntryLenght;	    	pl_WriteCmd1->v_Size = sl_WriteHeader.v_FinalFileSize 						- pl_WriteCmd1->u_Dest.v_DestIndex;

⌨️ 快捷键说明

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