📄 mmidc_storage.c
字号:
s_mmidc_photo_info.photo_detail[index].name_len
);
name_len = MMISTR_AddSubfix(
(uint8 *)file_name,
s_mmidc_photo_info.photo_detail[index].name_len,
TRUE,
(uint8 *)MMIDC_DEFAULT_SUBFIX,
MMIDC_DEFAULT_SUBFIX_LEN
);
DC_ASSERT_LOW(name_len <= MMIDC_MAX_PHOTO_NAME_LEN + MMIDC_DEFAULT_SUBFIX_LEN * 2);
if (MMIMULTIM_CheckDCName(file_name, name_len, s_mmidc_photo_info.photo_detail[index].location))
{
// 设置默认墙纸
SCI_TRACE_LOW("mmidc_storage.c:DCSaveInfo_AsyDeleteStep2: delete current wallpaper");
MMIMULTIM_SetDefaultWallpaper();
}
//free the buffer that saved the name
SCI_FREE(s_mmidc_photo_info.photo_detail[index].name_ptr);
// move the items
SCI_MEMCPY(
&s_mmidc_photo_info.photo_detail[index],
&s_mmidc_photo_info.photo_detail[index + 1],
(s_mmidc_photo_info.total_num - index - 1) * sizeof(MMIDC_PHOTO_DETAIL_T)
);
//decrease total info
s_mmidc_photo_info.total_num--;
s_mmidc_photo_info.total_memory -= CHUNK(memory);
}
else
{
}
return del_result_ptr->e_del_result;
}
/*****************************************************************************/
// Description : asynchronise add
// Global resource dependence :
// Author: bruce.chi
// Note: every input pointer are arranged outer of this function
/*****************************************************************************/
LOCAL MMIDC_FFS_WRITE_RESULT_E DCSaveFS_AsyAdd(
MMI_WIN_ID_T win_id,
FILE_DEV_E_T e_file_dev,
uint8 *buf_ptr,
MMIDC_PHOTO_DETAIL_T *photo_detail_ptr
)
{
HFS cur_hfs = 0;
MMIDC_FFS_SAVE_PARAM_T *param_save_ptr = PNULL;
FFS_OVERLAPPED_T overlapped = {0};
uint32 transmit = 0;
FFS_ERROR_E ffs_err = 0;
uint8 name_arr[MMIDC_MAX_PHOTO_NAME_LEN + MMIDC_DEFAULT_SUBFIX_LEN * 2 + 2] = {0};
uint16 name_len = 0;
DC_ASSERT_LOW(photo_detail_ptr->name_ptr != PNULL && buf_ptr != PNULL);
DC_ASSERT_LOW(photo_detail_ptr->name_len <= MMIDC_MAX_PHOTO_NAME_LEN);
if (photo_detail_ptr->name_len ==0 || photo_detail_ptr->memory_size == 0)
{
return DCFFS_WRITE_FAIL;
}
//cd dc path
if (FFS_NO_ERROR != FILE_CdDCPath(e_file_dev))
{
return DCFFS_WRITE_FAIL;
}
//add file subfix
SCI_MEMSET(name_arr, 0x00, sizeof(name_arr));
SCI_MEMCPY(name_arr, photo_detail_ptr->name_ptr, photo_detail_ptr->name_len);
name_len = MMISTR_AddSubfix((uint8 *)name_arr, photo_detail_ptr->name_len, TRUE, (uint8 *)MMIDC_DEFAULT_SUBFIX, MMIDC_DEFAULT_SUBFIX_LEN);
cur_hfs = FFS_Create(e_file_dev, (wchar*)name_arr, FFS_MODE_OPEN_ALWAYS | FFS_MODE_WRITE);
if (cur_hfs == FFS_INVALID_HANDLE)
{
return DCFFS_WRITE_FAIL;
}
//write file
param_save_ptr = SCI_ALLOC(sizeof(MMIDC_FFS_SAVE_PARAM_T));
param_save_ptr->e_file_dev = e_file_dev;
param_save_ptr->hfs = cur_hfs;
param_save_ptr->win_id = win_id;
param_save_ptr->buf_ptr = buf_ptr;
param_save_ptr->photo_detail = *photo_detail_ptr;
param_save_ptr->photo_index = MMIDC_INVALID_PHOTO_INDEX;
param_save_ptr->buf_size = photo_detail_ptr->memory_size;
overlapped.offset = 0;
overlapped.param = (FFS_PARAM)param_save_ptr; //free it in call back function
overlapped.complete_route = DCSaveFS_AsyAddCallBack;
ffs_err = FFS_Write(
e_file_dev,
cur_hfs,
buf_ptr,
photo_detail_ptr->memory_size,
&transmit,
&overlapped
);
if(FFS_ERROR_IO_PENDING == ffs_err)
{
SCI_TRACE_LOW("mmdc_storage.c: DCSaveFS_AsyAdd() FILE_Write pending, transmit is %d", transmit);
return DCFFS_WRITE_PANDING;
}
else if(FFS_NO_ERROR == ffs_err)
{
SCI_TRACE_LOW("mmdc_storage.c: DCSaveFS_AsyAdd() FILE_Write success, transmit is %d", transmit);
//close file
FFS_Close(e_file_dev, ffs_err);
//free
SCI_FREE(param_save_ptr);
if (transmit == photo_detail_ptr->memory_size)
{
//success
return DCFFS_WRITE_SUCCEED;
}
else
{
//fail
return DCFFS_WRITE_FAIL;
}
}
else
{
SCI_TRACE_LOW("mmdc_storage.c: DCSaveFS_AsyAdd() FILE_Write failed");
//close file
FFS_Close(e_file_dev, cur_hfs);
//free
SCI_FREE(param_save_ptr);
return DCFFS_WRITE_FAIL;
}
}
/*****************************************************************************/
// Description : call back of DCSaveFS_AsyAdd
// Global resource dependence :
// Author: bruce.chi
// Note: standard interface
/*****************************************************************************/
LOCAL void DCSaveFS_AsyAddCallBack(
FFS_ERROR_E ffs_error,
FFS_RESULT result,
FFS_PARAM param
)
{
MMIDC_FFS_SAVE_PARAM_T *ffs_param_in_ptr = PNULL;
MMIDC_FFS_ASY_WRITE_RESULT_T ffs_result;
SCI_TRACE_LOW("mmidc_storage:DCSaveFS_AsyAddCallBack, efs_error=%d, result=%d, param=%d", ffs_error, result, param);
//init
SCI_MEMSET(&ffs_result, 0, sizeof(ffs_result));
//get in param
SCI_ASSERT(param != 0);
ffs_param_in_ptr = (MMIDC_FFS_SAVE_PARAM_T *)param;
//judge write status
if(FFS_ERROR_NONE == ffs_error && result == ffs_param_in_ptr->photo_detail.memory_size)
{
ffs_result.write_result = DCFFS_WRITE_SUCCEED;
}
else
{
ffs_result.write_result = DCFFS_WRITE_FAIL;
}
//post message
ffs_result.e_file_dev = ffs_param_in_ptr->e_file_dev;
ffs_result.hfs = ffs_param_in_ptr->hfs;
ffs_result.photo_detail = ffs_param_in_ptr->photo_detail;
ffs_result.buf_ptr = ffs_param_in_ptr->buf_ptr;
MMK_PostMsg(
VIRTUAL_WIN_ID,
MSG_DC_FILE_WRITE_DONE,
&ffs_result,
sizeof(ffs_result)
); //note: MMK_PostMsg will save one copy of this message, and it will free it
//free in param
SCI_FREE(ffs_param_in_ptr);
}
/*****************************************************************************/
// Description : add a new photo
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
MMIDC_FFS_WRITE_RESULT_E DCSaveInfo_AsyAdd(
MMI_WIN_ID_T win_id, //the window that will receive the ffs callback message
FILE_DEV_E_T e_file_dev,
uint8 *buf_ptr,
uint32 memory_size,
uint16 width,
uint16 height,
uint8 *name_ptr,
uint16 name_len,
BOOLEAN is_ucs2
)
{
MMIDC_PHOTO_DETAIL_T photo_detail = {0};
uint32 i_free_space = 0;
if (s_mmidc_photo_info.total_num >= MMIDC_MAX_PHOTO_NUM)
{
return DCFFS_LIST_FULL;
}
//if can add
//i_free_space = FFS_GetFreeSpace(e_file_dev);
if (!MMIMULTIM_CheckFreeSpace(memory_size,e_file_dev))
{
SCI_TRACE_LOW("mmidc_storage.c:DCSaveInfo_AsyAdd memory_size=%d, i_free_space=%d", memory_size, i_free_space);
return DCFFS_NOT_ENOUGH_SPACE;
}
e_file_dev = MMI_GetCurrentSavePath();
/*if (memory_size >= i_free_space)
{
SCI_TRACE_LOW("mmidc_storage.c:DCSaveInfo_AsyAdd memory_size=%d, i_free_space=%d", memory_size, i_free_space);
return DCFFS_NOT_ENOUGH_SPACE;
}*/
photo_detail.width = width;
photo_detail.height = height;
photo_detail.memory_size = memory_size;
photo_detail.time = 0;
//alloc memory for name
photo_detail.name_ptr = SCI_ALLOC(MMIDC_MAX_PHOTO_NAME_LEN + 2);
SCI_MEMSET(photo_detail.name_ptr, 0, MMIDC_MAX_PHOTO_NAME_LEN + 2);
if (is_ucs2)
{
photo_detail.name_len = name_len;
SCI_MEMCPY(photo_detail.name_ptr, name_ptr, name_len);
}
else
{
photo_detail.name_len = GUI_GB2UCS(photo_detail.name_ptr, (uint8 *)name_ptr, name_len);
SCI_ASSERT(photo_detail.name_len <= MMIDC_MAX_PHOTO_NAME_LEN);
}
//call ffs interface
return DCSaveFS_AsyAdd(win_id, e_file_dev, buf_ptr, &photo_detail);
}
/*****************************************************************************/
// Description : asynchronize save photo step 2
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
uint32 DCSaveInfo_AsyAddStep2(MMIDC_FFS_ASY_WRITE_RESULT_T *save_result_ptr)
{
uint32 index = 0;
DC_ASSERT_LOW(save_result_ptr != PNULL);
DC_ASSERT_LOW(save_result_ptr->photo_detail.name_ptr != PNULL);
//close file
FFS_Close(save_result_ptr->e_file_dev, save_result_ptr->hfs);
//if write succeed
if (save_result_ptr->write_result == DCFFS_WRITE_SUCCEED)
{
//add to save info globle
index = s_mmidc_photo_info.total_num;
SCI_ASSERT(index < MMIDC_MAX_PHOTO_NUM);
s_mmidc_photo_info.photo_detail[index] = save_result_ptr->photo_detail;
//time
s_mmidc_photo_info.photo_detail[index].time = MMI_GetFfsTime();
//storage device
s_mmidc_photo_info.photo_detail[index].location = save_result_ptr->e_file_dev;
//total number++
s_mmidc_photo_info.total_memory += save_result_ptr->photo_detail.memory_size;
s_mmidc_photo_info.total_num ++;
}
else
{
//delete the file that I have opened but write failed
FFS_Delete(save_result_ptr->e_file_dev,(const wchar *)save_result_ptr->photo_detail.name_ptr);
//free former name_ptr memory allocated by SaveInfo_AsyAdd
SCI_FREE(save_result_ptr->photo_detail.name_ptr);
}
SCI_ASSERT(save_result_ptr->buf_ptr != PNULL);
// SCI_FREE(save_result_ptr->buf_ptr); //NOTE:do not free this, it will be used outer
if (save_result_ptr->write_result == DCFFS_WRITE_SUCCEED)
{
return s_mmidc_photo_info.total_num - 1;
}
else
{
return MMIDC_INVALID_PHOTO_INDEX;
}
}
/*****************************************************************************/
// Description : asynchronise Read
// Global resource dependence :
// Author: bruce.chi
// Note: every input pointer are arranged outer of this function
/*****************************************************************************/
LOCAL MMIDC_FFS_READ_RESULT_E DCSaveFS_AsyRead(
MMI_WIN_ID_T win_id,
FILE_DEV_E_T e_file_dev,
uint16 read_times,
uint8 *buf_ptr,
MMIDC_PHOTO_DETAIL_T *photo_detail_ptr,
uint32 photo_index
)
{
uint16 file_name[(MMIDC_MAX_PHOTO_NAME_LEN + MMIDC_DEFAULT_SUBFIX_LEN * 2 + 4) / 2] = {0};
uint16 name_len;
HFS cur_hfs = 0;
uint32 read_size = 0;
MMIDC_FFS_SAVE_PARAM_T *param_save_ptr = PNULL;
FFS_OVERLAPPED_T overlapped = {0};
uint32 transmit = 0;
MMIDC_FFS_READ_RESULT_E read_result = 0;
FFS_ERROR_E ffs_error = 0;
DC_ASSERT_LOW(PNULL != photo_detail_ptr && buf_ptr != PNULL);
// enter dc path
if (FFS_NO_ERROR == FILE_CdDCPath(e_file_dev))
{
// add subfix
SCI_MEMSET(file_name, 0x00, sizeof(file_name));
SCI_MEMCPY(file_name, photo_detail_ptr->name_ptr, photo_detail_ptr->name_len);
name_len = MMISTR_AddSubfix((uint8 *)file_name, photo_detail_ptr->name_len, TRUE, (uint8 *)MMIDC_DEFAULT_SUBFIX, MMIDC_DEFAULT_SUBFIX_LEN);
DC_ASSERT_LOW(name_len <= MMIDC_MAX_PHOTO_NAME_LEN + MMIDC_DEFAULT_SUBFIX_LEN * 2);
// check
if (FFS_CheckExist(e_file_dev, (wchar *)file_name))
{
// open file
cur_hfs = FFS_Create(
e_file_dev,
(wchar *)file_name,
FFS_MODE_READ | FFS_MODE_OPEN_EXISTING
);
if (FFS_INVALID_HANDLE != cur_hfs)
{
read_size = MIN(photo_detail_ptr->memory_size, MMIDC_MAX_PHOTO_SIZE);
param_save_ptr = SCI_ALLOC(sizeof(MMIDC_FFS_SAVE_PARAM_T));
param_save_ptr->e_file_dev = e_file_dev;
param_save_ptr->hfs = cur_hfs;
param_save_ptr->win_id = win_id;
param_save_ptr->buf_ptr = buf_ptr;
param_save_ptr->buf_size = read_size;
param_save_ptr->photo_detail = *photo_detail_ptr;
param_save_ptr->photo_index = photo_index;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -