#include"sf_create.h"
/**
* @brief 读取当前文件的类型
* @param mf_n MF编号
* @param p_FileInfo 文件信息首地址
* @param p_FileType 存储文件属性
* @return uint32 指令读取状态
*
*/
static inline int32 SF_GetFileType(uint32 mf_n,FILE_INFO *p_FileInfo,uint8 *p_FileType)
{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_head.type,
sizeof(p_FileInfo->file_head.type),
p_FileType);
}
/**
* @brief 获取当前文件的DF节点信息,
* @param mf MF编号
* @param p_FileInfo 当前文件节点地址,如果p_FileInfo是DF/MF/ADF则返回p_FileInfo
* @param p_F_FILEINFO 当前文件父节点地址
* @return uint32 读取状态
*
*/
static inline int32 SF_GetFNode(uint32 mf_n,FILE_INFO *p_FileInfo,FILE_INFO **p_F_FILEINFO)
{
uint8 f_type;
int32 ret;
ret = SF_GetFileType(mf_n,p_FileInfo,&f_type);
if(SUCCESS_OK != ret){
return ret;
}
if(IS_DF_3(f_type)){
*p_F_FILEINFO = p_FileInfo;
return SUCCESS_OK;
}else{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_node.f_node,
sizeof(p_FileInfo->file_node.f_node),
*p_F_FILEINFO);
}
}
/**
* @brief 获取当前文件的DF节点信息
* @param mf MF编号
* @param p_FileInfo 当前文件节点地址
* @param p_B_FILEINFO 当前文件兄弟节点地址
* @return uint32 读取状态
*
*/
static inline int32 SF_GetBNode(uint32 mf_n,FILE_INFO *p_FileInfo,FILE_INFO **p_B_FILEINFO)
{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_node.b_node,
sizeof(p_FileInfo->file_node.b_node),
*p_B_FILEINFO);
}
/**
* @brief 获取当前文件的DF节点信息
* @param mf MF编号
* @param p_FileInfo 当前文件节点地址
* @param p_C_FileInfo 当前文件子节点地址
* @return uint32 读取状态
*
*/
static inline int32 SF_GetCNode(uint32 mf_n,FILE_INFO *p_FileInfo,FILE_INFO **p_C_FileInfo)
{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_node.c_node,
sizeof(p_FileInfo->file_node.c_node),
*p_C_FileInfo);
}
/**
* @brief 获取当前文件的DF节点信息
* @param mf MF编号
* @param p_FileInfo 当前文件节点地址
* @param p_D_FileInfo 当前文件数据节点地址
* @return uint32 读取状态
*
*/
int32 inline SF_GetDNode(uint32 mf_n,FILE_INFO *p_FileInfo,FILE_INFO **p_D_FileInfo)
{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_node.d_node,
sizeof(p_FileInfo->file_node.d_node),
*p_D_FileInfo);
}
/**
* @brief 获取文件ID
* @param mf_n MF编号
* @param f_addr 文件地址
* @param p_f_id 存储文件ID的指针
* @return uint32 FLASH的读取状态
*
*/
int32 inline SF_GetFileID(uint32 mf_n,FILE_INFO *p_FileInfo,uint16 *p_FileID)
{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_head.file_id,
sizeof(p_FileInfo->file_head.file_id),
(uint8*)p_FileID);
}
/**
* @brief 读取文件的名称有效长度
* @param mf_n MF编号
* @param f_addr 文件地址
* @param p_name_len 存储文件名长度的指针
* @return int32 FLASH读取状态
*
*/
int32 inline SF_GetFileNameLen(uint32 mf_n,FILE_INFO *p_FileInfo,uint8 *p_NameLen)
{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_head.name_len,
sizeof(p_FileInfo->file_head.name_len),
p_NameLen);
}
/**
* @brief 读取文件的名称
* @param mf_n MF编号
* @param f_addr 文件地址
* @param name_len 读取长度
* @param p_name 保存文件名称
* @return int32 读取状态
*
*/
int32 inline SF_GetFileName(uint32 mf_n,FILE_INFO *p_FileInfo,uint8 name_len,uint8*p_Name)
{
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_head.name_buf,
name_len,
&p_Name);
}
/**
* @brief 读取文件大小<包含文件头>
* @param mf_n
* @param p_FileInfo
* @param p_size
* @return int32
*
*/
int32 inline SF_GetFileSize(uint32 mf_n,FILE_INFO *p_FileInfo,uint32 *p_size)
{
uint32 size;
int32 ret;
return SF_ReadLogicFlashBytes(mf_n,
&p_FileInfo->file_head.size,
sizeof(p_FileInfo->file_head.size),
p_size);
}
/**
* @brief 根据权限类型,判断权限状态
* @param mf_n MF编号
* @param ac_type 权限类型判断权限;MF/DF/ADF创建/删除权限;EF:读取/写入/使用权限
* @param p_FileInfo 当前文件地址
* @param cur_ac 输入权限
* @return int32 判断状态
*
*/
int32 SF_CheckFileAC(uint32 mf_n,FILE_INFO *p_FileInfo,E_AC_TYPE ac_type,uint8 cur_ac)
{
uint8 ac;
uint8 f_type;
int32 ret;
///*****判断当前MF/DF/ADF状态*****
///<读取传入的文件类型
ret = SF_GetFileType(mf_n,p_FileInfo,&f_type);
if(SUCCESS_OK != ret){
return ret;
}
///<根据类型读取权限值
switch (ac_type)
{
case E_AC_DF_CREATE:
if(!IS_DF_3(f_type)){
return ERR_FILE_TYPE;
}
ret = SF_GetFileAC(mf_n,p_FileInfo,DF_AC_C_OFFSET,&ac);
if(SUCCESS_OK != ret){
return ret;
}
break;
case E_AC_DF_DELETE:
if(!IS_DF_3(f_type)){
return ERR_FILE_TYPE;
}
ret = SF_GetFileAC(mf_n,p_FileInfo,DF_AC_D_OFFSET,&ac);
if(SUCCESS_OK != ret){
return ret;
}
break;
case E_AC_EF_READ:
if(IS_DF_3(f_type)){
return ERR_FILE_TYPE;
}
ret = SF_GetFileAC(mf_n,p_FileInfo,EF_AC_READ_OFFSET,&ac);
if(SUCCESS_OK != ret){
return ret;
}
case E_AC_EF_WRITE:
if(IS_DF_3(f_type)){
return ERR_FILE_TYPE;
}
ret = SF_GetFileAC(mf_n,p_FileInfo,EF_AC_WRITE_OFFSET,&ac);
if(SUCCESS_OK != ret){
return ret;
}
default:
return ERR_PARA;
}
///<判断权限是否满足
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。