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

📄 mmidc_storage.c

📁 手机Camera部分上层软件代码
💻 C
📖 第 1 页 / 共 5 页
字号:
				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 + -