view src/ui3/mfw/mfw_fm.c @ 516:1ed9de6c90bd

src/g23m-gsm/sms/sms_for.c: bogus malloc removed The new error handling code that was not present in TCS211 blob version contains a malloc call that is bogus for 3 reasons: 1) The memory allocation in question is not needed in the first place; 2) libc malloc is used instead of one of the firmware's proper ways; 3) The memory allocation is made inside a function and then never freed, i.e., a memory leak. This bug was caught in gcc-built FreeCalypso fw projects (Citrine and Selenite) because our gcc environment does not allow any use of libc malloc (any reference to malloc produces a link failure), but this code from TCS3.2 is wrong even for Magnetite: if this code path is executed repeatedly over a long time, the many small allocations made by this malloc call without a subsequent free will eventually exhaust the malloc heap provided by the TMS470 environment, malloc will start returning NULL, and the bogus code will treat it as an error. Because the memory allocation in question is not needed at all, the fix entails simply removing it.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 22 Jul 2018 06:04:49 +0000
parents e8ddbb0837ed
children
line wrap: on
line source

#ifdef FF_MMI_FILEMANAGER
/* =========================================================
*             Texas Instruments OMAP(TM) Platform Software
*  (c) Copyright Texas Instruments, Incorporated.  All Rights Reserved.
*
*  Use of this software is controlled by the terms and conditions found
*  in the license agreement under which this software has been supplied.
* ========================================================== */

/*==========================================================
* @file mfw_fmc     
*
* This provides the functionality of File Manager Applications.
* It supports file/Directory related operations on NOR, NAND and MMC
*
* @path  \bmi\condat\ms\src\mfw
*
* @rev  00.01
*/
/* ========================================================== */
/*===========================================================
*!
*! Revision History
*! ===================================
	
	Nov 12 2007 DRT :OMAPS00144861 x0056422
	Description: MM: There are some issues with resume and stop 
	callback in BT MMI code. 
	

	Aug 27, 2007 REF:DRT OMAPS00137370 x0045876
   	Description: MM: MIDI/IMY file is not played correctly after listening a 
   				 MP3 in the Browse Midi list.
   	Solution: Param Voice_Limit is changed when MP3 or AAC file is played. So before 
   			  playing MP3 or AAC file, Voice_Limit should be saved.
   			  
	 Jul 04, 2007 DRT:OMAPS00135749  x0062174(Nimitha)
	 Description: Once the audio file has finished automatically play button has to be pressed twice,
    	 in order to be played again.
    	Solution : The global variable aud_state_status is set to AUD_FM_NONE once the file playing stopped.
    	
	April 27, 2007 DRT:OMAPS00128836 x0073106
	Description: Unexpected behavior when copying images with the same names  from a memory to another.
	Solution:In  mfw_fm_copy_start () added a if condition if(rfs_stat() && image file). 

    Apr 10, 2007    DRT: OMAPS00125309  x0039928
    Description: MM - Mono option does not work => MMI changes required
    Solution: Selected Output channel from the settings menu is set for all the players.
    
    Apr 06, 2007    DRT: OMAPS00124877  x0039928
    Description: MM: Voice limit Options doesn't work
    Solution: voice limit value is taken from the global variable set by menu options.
    
	Mar 28, 2007   ER: OMAPS00106188  x0039928
	Description: Align Midi application menu choices and audio Player menu choices 
	
    Mar 15, 2007    DRT: OMAPS00120201  x0039928
    Description: JPEG dir not created in FFS in N5.23 pre release
    Solution: The directories are created after format for NOR-MS, NAND and T-FLASH
   	
*! 10-Apr-2006 mf:  Modified x0020906.  Change required per SRxxxx
*! to provide File Manager Functionality.
*!
*!
*! 17-Jan-2006 mf: Revisions appear in reverse chronological order;
*! that is, newest first.  The date format is dd-Mon-yyyy.
* =========================================================== */

/******************************************************************************
                                Include Files
*******************************************************************************/
#define ENTITY_MFW

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define FF_MMI_RFS_ENABLED

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif 


#include "mfw_mfw.h"
#include "mfw_phb.h"
#include "mfw_phbi.h"
#include "mfw_cm.h"
#include "mfw_cmi.h"

#include "mfw_nm.h"
#include "mfw_sim.h"
#include "mfw_sima.h"
#include "mfw_nmi.h"
#include "mfw_simi.h"
#include "mfw_sms.h"
#include "mfw_smsi.h"
#include "mfw_win.h"

#include "ksd.h"
#include "psa.h"

#if defined (FAX_AND_DATA)
#include "aci_fd.h"
#endif

//#ifdef FF_MMI_RFS_ENABLED
#include "rfs/rfs_api.h"
//#else
#include "ffs/ffs_api.h"
//#endif

#include "message.h"
#include "prim.h"
#include "aci_cmh.h"

#include "cmh.h"
#include "phb.h"
#include "cmh_phb.h"

#include "mfw_ss.h"
#include "mfw_ssi.h"
#include "mfw_win.h"

#include "gdi.h"
#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif

#ifdef FF_MMI_MIDI_FORMAT
#include "bae/bae_options.h"
#endif

#include "mfw_fm.h"
/**********************NOTE***************************
FFS header To be replaced with FS Abstraction Header 
******************************************************/

#ifdef FF_MMI_A2DP_AVRCP
#include "mfw_bt_api.h"
#include "mfw_bt_private.h"
#endif


#ifdef INT_PHONEBOOK
#include "ATBPbGI.h"
#endif
/*******************************************************************************

                               Defines

*******************************************************************************/
EXTERN MfwHdr * current_mfw_elem;
static MSL_HANDLE msl_handle;
static T_RV_RETURN_PATH fm_aud_return_path;
T_MFW_AUD_PARA para_aud;
extern UBYTE mfw_player_playback_loop_flag;
extern T_AS_PLAYER_PARAMS player_para;
extern INT16 player_channel;
extern int aud_state_status;


/* OMAPS00151698, x0056422 */
#ifdef FF_MMI_A2DP_AVRCP
extern BMI_BT_STRUCTTYPE tGlobalBmiBtStruct;
#endif
//Daisy tang added for Real Resume feature 20071107
//start
BOOL isPlayer_Real_Pause = FALSE;
UINT32   last_file_size_played = 0; 
char last_inputFileName[FM_MAX_DIR_PATH_LENGTH];
T_WCHAR last_inputFileName_uc[FM_MAX_DIR_PATH_LENGTH];
T_AS_PLAYER_TYPE last_file_type;
BOOL last_play_bar;	
UINT32 last_para_aud_pt;
//end


/*******************************************************************************

                                Local prototypes

*******************************************************************************/

void Msl_mslil_Callback(void* handle, U32 ucp_type, U32 tCMd, U32 tStatus);
void mfw_fm_audPlay_cb(void *parameter);
void mfw_fm_signal(T_MFW_EVENT event, void *para);
BOOL mfw_fm_sign_exec (T_MFW_HDR * cur_elem, T_MFW_EVENT event, T_MFW_FM_PARA * para);
/* June 28, 2007 DRT: OMAPS00135749 x0062174 */
EXTERN void mmi_set_aud_state_status( T_FM_AUD_STATE status);


/*******************************************************************************
 $Function:		mfw_fm_create

 $Description:		This function  initialises an Mfw fm entity and adds it to the Window Stack

 $Returns:		T_MFW_HND	: A handle for the entity

 $Arguments:		hWin	: Parent Window Handle
 				event	: Event Mask of the events to be handled
 				cbfunc	: Callback function to handle the events
*******************************************************************************/
T_MFW_HND mfw_fm_create(T_MFW_HND hWin, T_MFW_EVENT event, T_MFW_CB cbfunc)
{
	T_MFW_HDR *hdr;
	T_MFW_FM  *fm_para;

	TRACE_FUNCTION("mfw_FM_create()");

	hdr = (T_MFW_HDR *) mfwAlloc(sizeof (T_MFW_HDR));
	fm_para = (T_MFW_FM *) mfwAlloc(sizeof (T_MFW_FM));

	if (!hdr OR !fm_para)
		return FALSE;

	/*
	* initialisation of the handler
	*/
	fm_para->emask   = event;
	fm_para->handler = cbfunc;

	hdr->data = fm_para;		
	hdr->type = MfwTypfm;

	/*
	* installation of the handler
	*/
	return mfwInsert((T_MFW_HDR *)hWin, hdr);
}

/*******************************************************************************

 $Function:		mfw_fm_delete

 $Description:		This function clears down an Mfw entity and removes it from the
 				Window Stack

 $Returns:		T_MFW_RES	: The result of the function

 $Arguments:		T_MFW_HND	: The Handle of the entity to be removed

*******************************************************************************/
T_MFW_RES mfw_fm_delete(T_MFW_HND hnd)
{
	TRACE_FUNCTION("mfw_FM_delete()");

	if (!hnd OR !((T_MFW_HDR *)hnd)->data)
		return MFW_RES_ILL_HND;

	if (!mfwRemove((T_MFW_HDR *)hnd))
		return MFW_RES_ILL_HND;

	mfwFree((U8 *)(((T_MFW_HDR *) hnd)->data),sizeof(T_MFW_FM));
	mfwFree((U8 *)hnd,sizeof(T_MFW_HDR));

	return MFW_RES_OK;
}

/*******************************************************************************

 $Function:		mfw_fm_sign_exec

 $Description:		This function sends the Mfw FM  events from the Mfw to the BMI.

 $Returns:		None

 $Arguments:		None

*******************************************************************************/
BOOL mfw_fm_sign_exec (T_MFW_HDR * cur_elem, T_MFW_EVENT event, T_MFW_FM_PARA * para)
{
	TRACE_FUNCTION("mfw_fm_sign_exec()");


	while (cur_elem)
	{
		/*
		* event handler is available
		*/
		if (cur_elem->type EQ MfwTypfm)
		{
			T_MFW_FM * fm_data;
			TRACE_EVENT("MfwTyFm");
			/*
			* handler is FM management handler
			*/
			fm_data = (T_MFW_FM *)cur_elem->data;
			if (fm_data->emask & event)
			{
				/*
				* event is expected by the call back function
				*/
				fm_data->event = event;
				switch (event)
				{
					/*
					** Generic Events
					*/
					case E_FM_THMB_INIT:
					case E_FM_THMB_DEINIT:
					case E_FM_THMB_GEN:
					case E_FM_IMG_INIT:
					case E_FM_IMG_DRAW:
					case E_FM_IMG_DEINIT:
					case E_FM_AUDIO_STOP:
						if(para!=NULL)
							memcpy (&fm_data->para, para, sizeof (T_MFW_FM_PARA));
						break;
				}
				/*
				* if call back defined, call it
				*/
				if (fm_data->handler)
				{
					// store current mfw elem
					current_mfw_elem = cur_elem;
					if ((*(fm_data->handler)) (fm_data->event, (void *)&fm_data->para))
						return TRUE;
				}
			}
		}
		cur_elem = cur_elem->next;
	}
	return FALSE;
}

/*******************************************************************************

 $Function:		mfw_FM_signal

 $Description:		This function sends the Mfw events from the Mfw to the BMI.

 $Returns:		None

 $Arguments:		T_MFW_EVENT	: The event to be sent to the BMI
 				void *			: Pointer to the Event data

*******************************************************************************/
void mfw_fm_signal(T_MFW_EVENT event, void *para)
{
	UBYTE temp;
	temp = dspl_Enable(0);

	TRACE_FUNCTION("mfw_FM_signal()");

	if (mfwSignallingMethod EQ 0)
	{
		/*
		* focus is on a window
		*/
		if (mfwFocus)
		{
			/*
			* send event to sim management
			* handler if available
			*/
			if (mfw_fm_sign_exec (mfwFocus, event, para))
			{
				dspl_Enable(temp);
				return;
			}
		}
		/*
		* actual focussed window is not available
		* or has no network management registration
		* handler, then search all nodes from the root.
		*/
		if (mfwRoot)
			mfw_fm_sign_exec (mfwRoot, event, para);
	}
	else
	{
		MfwHdr * h = 0;
		/*
		* Focus set, then start here
		*/
		if (mfwFocus)
			h = mfwFocus;
		/*
		* Focus not set, then start root
		*/
		if (!h)
			h = mfwRoot;
		/*
		* No elements available, return
		*/
		while (h)
		{
			/*
			* Signal consumed, then return
			*/
			if (mfw_fm_sign_exec (h, event, para))
			{
				dspl_Enable(temp);
				return;
			}
			/*
			* All windows tried inclusive root
			*/
			if (h == mfwRoot)
			{
				dspl_Enable(temp);
				return;
			}
			/*
			* get parent window
			*/
			h = mfwParent(mfwParent(h));

			if (h)
				h = ((MfwWin * )(h->data))->elems;
		}
		
		mfw_fm_sign_exec (mfwRoot, event, para);
		
	}	
	dspl_Enable(temp);
	return;
}

/*******************************************************************************
 $Function:		mfw_fm_readDir

 $Description:		Reads the objects from the given directory

 $Returns:		FM_DIR_DOESNOTEXISTS/FM_READDIR_ERROR/FM_NO_ERROR

 $Arguments:		dir_path		: Current Directory Path
 				dir_name		: Current Directory Name
 				num_objs	: num of obejcts
 				obj_list		: object list
 				source		: Current Drive 
*******************************************************************************/
T_MFW_FM_STATUS mfw_fm_readDir(char *dir_path, char *dir_name, UBYTE *num_objs, T_FM_OBJ **obj_list, T_FM_DEVICE_TYPE  source, T_FM_APP_TYPE  app)
{
	char curDir[FM_MAX_DIR_PATH_LENGTH];
	/* x0083025 - OMAPS00156759 - Jan 29, 2008 */
#if defined(FF_MMI_UNICODE_SUPPORT)||defined (FF_MMI_RFS_ENABLED)
		T_WCHAR objName_uc[FM_MAX_OBJ_NAME_LENGTH];
		T_WCHAR curObj_uc[FM_MAX_DIR_PATH_LENGTH];
#else
		char objName_u8[FM_MAX_OBJ_NAME_LENGTH];
#endif
		
#ifdef FF_MMI_RFS_ENABLED
		char ext1[FM_MAX_EXT_LENGTH];
		T_RFS_DIR f_dir;
		UINT16 curDir_uc[FM_MAX_DIR_PATH_LENGTH];
		T_RFS_RET result;
		T_RFS_STAT f_stat;
#else
	T_FFS_DIR f_dir;
#endif
	int iCount=0;
	
	TRACE_FUNCTION("mfw_fm_readDir");

	*num_objs = 0;
	memset(curDir, 0, FM_MAX_DIR_PATH_LENGTH);
#ifdef FF_MMI_RFS_ENABLED
	switch (source)
	{
		case FM_NOR_FLASH:
			sprintf(curDir,"%s%s%s","/FFS",dir_path,dir_name);
			TRACE_EVENT_P1("Current Dir  %s",curDir);
			break;    
		case FM_NORMS_FLASH:
			sprintf(curDir,"%s%s%s","/NOR",dir_path,dir_name);
			TRACE_EVENT_P1("Current Dir  %s",curDir);
			break;    
		case FM_NAND_FLASH:
			sprintf(curDir,"%s%s%s","/NAND",dir_path,dir_name);
			TRACE_EVENT_P1("Current Dir  %s",curDir);
			break;
		case FM_T_FLASH:
			sprintf(curDir,"%s%s%s","/MMC",dir_path,dir_name);
			TRACE_EVENT_P1("Current Dir  %s",curDir);
			break;
		default:  
			TRACE_EVENT("Default:  Invalid value");  
			break;
	}
	
			convert_u8_to_unicode((const char *)curDir, curDir_uc);
			if (rfs_opendir (curDir_uc, &f_dir) < 0)
			{
				TRACE_EVENT_P1("Opening dir %s Failed",curDir);
				return FM_DIR_DOESNOTEXISTS; 
			}

			for (iCount = 0; rfs_readdir (&f_dir, objName_uc, FM_MAX_OBJ_NAME_LENGTH) > 0x0; )
			{
				if (objName_uc[0]  == '\0')
				{
					return FM_READDIR_ERROR;
				}
					if( objName_uc[0] != '.' )
					{
						/* x0083025 - OMAPS00156759 - Jan 29, 2008 */
						wstrcpy(curObj_uc, curDir_uc);
						{ // append '/' char to the end of string
							T_WCHAR *tmp = curObj_uc;
							while (*tmp) ++tmp;
							*tmp++ = '/';
							*tmp = 0;
						}
						wstrcat(curObj_uc, objName_uc);						

					result= rfs_stat(curObj_uc, &f_stat);

					if(result == RFS_EOK)
					{
						if(f_stat.file_dir.mode & RFS_IXUSR)
						{	
							obj_list[iCount] = (T_FM_OBJ*)mfwAlloc(sizeof(T_FM_OBJ));
							
							/* x0083025 - OMAPS00156759 - Jan 29, 2008 */
							#ifdef FF_MMI_UNICODE_SUPPORT
								wstrcpy(obj_list[iCount]->name_uc, objName_uc);
								TRACE_EVENT_P1("%s", obj_list[iCount]->name_uc);
							#endif
								convert_unicode_to_u8(objName_uc, obj_list[iCount]->name);
								TRACE_EVENT_P1("%s", obj_list[iCount]->name);
							(*num_objs)++;
							iCount++;
							if((*num_objs) >= FM_MAX_OBJ )
							{
								TRACE_EVENT("MAX COUNT Reached");
								if(source == FM_NOR_FLASH)			
									rfs_closedir(&f_dir);
								return FM_NO_ERROR;
							}
						}
						else
						{
								/* x0083025 - OMAPS00156759 - Jan 29, 2008 */
								convert_unicode_to_u8(wstrchr(objName_uc,'.')+1, ext1);		
								
								if(ext1)
								{
								switch(app)
								{
								case FM_IMAGE:
									if(strcmp(ext1, "jpg") == 0) 
									{	
										obj_list[iCount] = (T_FM_OBJ*)mfwAlloc(sizeof(T_FM_OBJ));
										
										/* x0083025 - OMAPS00156759 - Jan 29, 2008 */
										convert_unicode_to_u8(objName_uc, obj_list[iCount]->name);
										
									TRACE_EVENT_P1("%s", obj_list[iCount]->name);
									(*num_objs)++;
									iCount++;
									if((*num_objs) >= FM_MAX_OBJ )
									{
										TRACE_EVENT("MAX COUNT Reached");
										if(source == FM_NOR_FLASH)			
											rfs_closedir(&f_dir);
										return FM_NO_ERROR;
									}
								}
								break;
							case FM_AUDIO:
								if(
				
#ifdef FF_MP3_RINGER
									(strcmp(ext1, "mp3") == 0)
#else
									(0)
#endif								
#ifdef FF_AAC_RINGER
							 	 || (strcmp(ext1, "aac") == 0) 							 	 
#else
								 ||	(0)
#endif				

#ifdef FF_MMI_MIDI_FORMAT

#ifdef  PAL_ENABLE_XMF 
								 || (strcmp(ext1, "xmf") == 0)
#else
								 ||	(0)
#endif
#ifdef PAL_ENABLE_IMELODY 
							     || (strcmp(ext1, "imy") == 0)							     
#else
								 ||	(0)
#endif
#ifdef PAL_ENABLE_SMAF_MA3 
								 || (strcmp(ext1, "mmf") == 0)
#else
								 ||	(0)								 
#endif				
#ifdef PAL_ENABLE_XMF 
								 || (strcmp(ext1, "mxmf") == 0)
#else
								 ||	(0)								 
#endif			
#ifdef PAL_ENABLE_SMS
								 || (strcmp(ext1, "sms") == 0)
#else
								 ||	(0)								 
#endif									
#ifdef PAL_ENABLE_DIGITAL_AUDIO
								 || (strcmp(ext1, "wav") == 0) 
#else
								 ||	(0)
#endif			
#ifdef PAL_ENABLE_MIDI_NORMALIZER 
								 || (strcmp(ext1, "mid") == 0) 
#else
								 ||	(0)
#endif				

#endif
								  )
									
								{
									obj_list[iCount] = (T_FM_OBJ*)mfwAlloc(sizeof(T_FM_OBJ));
									/* x0083025 - OMAPS00156759 - Jan 29, 2008 */									
									#ifdef FF_MMI_UNICODE_SUPPORT
										wstrcpy(obj_list[iCount]->name_uc, objName_uc);
										TRACE_EVENT_P1("%s", obj_list[iCount]->name_uc);
									#else
										convert_unicode_to_u8(objName_uc, obj_list[iCount]->name);
										TRACE_EVENT_P1("%s", obj_list[iCount]->name);
									#endif
									(*num_objs)++;
									iCount++;
									if((*num_objs) >= FM_MAX_OBJ )
									{
										TRACE_EVENT("MAX COUNT Reached");
      										if(source == FM_NOR_FLASH)			
											rfs_closedir(&f_dir);
										 return FM_NO_ERROR;
									}				
								}
								break;
							}
							}
					}
				}
			}    
			}    
			TRACE_EVENT_P2("Dir %s contains %d Objects",curDir,iCount);
         if(source == FM_NOR_FLASH)			
			rfs_closedir(&f_dir);
#else
			sprintf(curDir,"%s%s",dir_path,dir_name);
			TRACE_EVENT_P1("Current Dir  %s",curDir);

			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			if (ffs_opendir (curDir, &f_dir) < 0)
			{
				TRACE_EVENT_P1("Opening dir %s Failed",curDir);
				return FM_DIR_DOESNOTEXISTS; 
			}
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
				for (iCount = 0; ffs_readdir (&f_dir, objName_u8, FM_MAX_OBJ_NAME_LENGTH) > 0x0; iCount++)
				{
					if (objName_u8[0]	== '\0')
					{
						return FM_READDIR_ERROR;
					}
					if( objName_u8[0] != '.' )
					{
						obj_list[iCount] = (T_FM_OBJ*)mfwAlloc(sizeof(T_FM_OBJ));
						strcpy(obj_list[iCount]->name, objName_u8);
						TRACE_EVENT_P1("%s", obj_list[iCount]->name);
						(*num_objs)++;
						if((*num_objs) >= FM_MAX_OBJ )
						{
							TRACE_EVENT("MAX COUNT Reached");
							 break;
						}
					}
				}	 
				TRACE_EVENT_P2("Dir %s contains %d Objects",curDir,iCount);
#endif			
				
	
	return FM_NO_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_rename

 $Description:		Renames the selcted object with the new name

 $Returns:		FM_RENAME_ERROR/FM_NO_ERROR

 $Arguments:		old_filename		: Old filename
 				new_filename		: New filename
 				source			: Current Drive
*******************************************************************************/
#ifdef FF_MMI_UNICODE_SUPPORT
T_MFW_FM_STATUS mfw_fm_rename(T_WCHAR* old_filename, T_WCHAR* new_filename, T_FM_DEVICE_TYPE  source)
#else
T_MFW_FM_STATUS mfw_fm_rename(char* old_filename, char * new_filename, T_FM_DEVICE_TYPE  source)
#endif
{

#ifdef FF_MMI_RFS_ENABLED 
	T_RFS_RET rfsResult;
	char old_filename_mt[FM_MAX_DIR_PATH_LENGTH];
	char new_filename_mt[FM_MAX_DIR_PATH_LENGTH];
	UINT16 new_filename_uc[FM_MAX_DIR_PATH_LENGTH];
	UINT16 old_filename_uc[FM_MAX_DIR_PATH_LENGTH];
#else

#if defined(FF_MMI_UNICODE_SUPPORT) && !defined(FF_MMI_RFS_ENABLED)
	char old_filename_u8[FM_MAX_DIR_PATH_LENGTH];
	char new_filename_u8[FM_MAX_DIR_PATH_LENGTH];
#endif

	T_FFS_RET ffsResult;
#endif

	TRACE_FUNCTION("mfw_fm_rename");

#ifdef FF_MMI_RFS_ENABLED 		
	switch (source)
	{
		case FM_NOR_FLASH:
			strcpy(old_filename_mt, "/FFS");
			strcpy(new_filename_mt, "/FFS");
			break;
		case FM_NORMS_FLASH:
			strcpy(old_filename_mt, "/NOR");
			strcpy(new_filename_mt, "/NOR");
			break;
		case FM_NAND_FLASH:
			strcpy(old_filename_mt, "/NAND");
			strcpy(new_filename_mt, "/NAND");
			break;
		case FM_T_FLASH:
			strcpy(old_filename_mt, "/MMC");
			strcpy(new_filename_mt, "/MMC");
			break;
	}

#ifdef FF_MMI_UNICODE_SUPPORT
	convert_u8_to_unicode(old_filename_mt,old_filename_uc);
	convert_u8_to_unicode(new_filename_mt, new_filename_uc);
	wstrcat(old_filename_uc, old_filename);
	wstrcat(new_filename_uc, new_filename);
#else
	strcat(old_filename_mt, old_filename);
	strcat(new_filename_mt, new_filename);
	convert_u8_to_unicode(old_filename_mt,old_filename_uc);
	convert_u8_to_unicode(new_filename_mt, new_filename_uc);
#endif
 			
	rfsResult = rfs_rename(old_filename_uc, new_filename_uc);
	if(rfsResult != RFS_EOK)
	{
		return FM_RENAME_ERROR;
	}
#else

#ifdef FF_MMI_UNICODE_SUPPORT
	convert_unicode_to_u8(old_filename, old_filename_u8);
	convert_unicode_to_u8(new_filename, new_filename_u8;

	ffsResult = ffs_rename(old_filename_u8,new_filename_u8);
#else
	ffsResult = ffs_rename(old_filename,new_filename);
#endif
	if(ffsResult != EFFS_OK)
			{
				return FM_RENAME_ERROR;
			}
#endif			
	return FM_NO_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_rename_image

 $Description:		Renames the selected image and its thumbnail with the new name

 $Returns:		FM_RENAME_ERROR/FM_NO_ERROR

 $Arguments:		path				: Current directory path
 				dirname			: Current Directory name
 				old_filename		: Old filename
 				new_filename		: New filename
 				source			: Current Drive
*******************************************************************************/
T_MFW_FM_STATUS mfw_fm_rename_image(char * path, char * dirname, char* old_filename, char * new_filename, T_FM_DEVICE_TYPE  source)
{
	T_MFW_FM_STATUS ffsResult;
	char t_oldfilename[FM_MAX_DIR_PATH_LENGTH];
	char t_newfilename[FM_MAX_DIR_PATH_LENGTH];

#ifdef FF_MMI_UNICODE_SUPPORT
	T_WCHAR oldfilename_uc[FM_MAX_DIR_PATH_LENGTH];
	T_WCHAR newfilename_uc[FM_MAX_DIR_PATH_LENGTH]; 
#endif

	TRACE_FUNCTION("mfw_fm_rename_image");

#ifdef FF_MMI_RFS_ENABLED 			

	sprintf(t_oldfilename,"%s%s/%s.jpg",path,dirname,old_filename);
	sprintf(t_newfilename,"%s%s/%s.jpg",path,dirname,new_filename);
/* February 8, 2008 DRT:OMAPS00156759 (x0083025) For Unicode Support--> Start*/	

#ifdef FF_MMI_UNICODE_SUPPORT		
	convert_u8_to_unicode(t_oldfilename, oldfilename_uc); 
	convert_u8_to_unicode(t_newfilename, newfilename_uc);	
	ffsResult = mfw_fm_rename(oldfilename_uc,newfilename_uc,source); 
#else
	ffsResult = mfw_fm_rename(t_oldfilename,t_newfilename,source);
#endif
			if(ffsResult != FM_NO_ERROR)
			{
				return FM_RENAME_ERROR;
			}
	switch(source)
	{
		case FM_NOR_FLASH:
			sprintf(t_oldfilename,"%s%s/%s.tmb",NORDIR,THUMB,old_filename);
			sprintf(t_newfilename,"%s%s/%s.tmb",NORDIR,THUMB,new_filename);
			break;
		case FM_NORMS_FLASH:
			sprintf(t_oldfilename,"%s%s/%s.tmb",NORMSDIR,THUMB,old_filename);
			sprintf(t_newfilename,"%s%s/%s.tmb",NORMSDIR,THUMB,new_filename);
			break;			
		case FM_NAND_FLASH:
			sprintf(t_oldfilename,"%s%s/%s.tmb",NANDDIR,THUMB,old_filename);
			sprintf(t_newfilename,"%s%s/%s.tmb",NANDDIR,THUMB,new_filename);
			break;
		case FM_T_FLASH:
			sprintf(t_oldfilename,"%s%s/%s.tmb",TFLASHDIR,THUMB,old_filename);
			sprintf(t_newfilename,"%s%s/%s.tmb",TFLASHDIR,THUMB,new_filename);
			break;
	}
	
#ifdef FF_MMI_UNICODE_SUPPORT		
	convert_u8_to_unicode(t_oldfilename, oldfilename_uc); 
	convert_u8_to_unicode(t_newfilename, newfilename_uc);	
	ffsResult = mfw_fm_rename(oldfilename_uc,newfilename_uc,source); 
#else
	ffsResult = mfw_fm_rename(t_oldfilename,t_newfilename,source);
#endif
	if(ffsResult != FM_NO_ERROR)
	{
		return FM_RENAME_ERROR;
	}
#else
			sprintf(t_oldfilename,"%s%s/%s.jpg",path,dirname,old_filename);
			sprintf(t_newfilename,"%s%s/%s.jpg",path,dirname,new_filename);

			ffsResult = mfw_fm_rename(t_oldfilename,t_newfilename,source);
			if(ffsResult != FM_NO_ERROR)
			{
				return FM_RENAME_ERROR;
			}
			sprintf(t_oldfilename,"%s%s/%s.tmb",NORDIR,THUMB,old_filename);
			sprintf(t_newfilename,"%s%s/%s.tmb",NORDIR,THUMB,new_filename);

			ffsResult = mfw_fm_rename(t_oldfilename,t_newfilename,source);

			if(ffsResult != FM_NO_ERROR)
			{
				return FM_RENAME_ERROR;
			}
#endif
	return FM_NO_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_createRootDir

 $Description:		Creates the root jpeg, tones directory

 $Returns:		FM_NO_ERROR

 $Arguments:		source	: Current Drive
*******************************************************************************/
T_MFW_FM_STATUS mfw_fm_createRootDir(T_FM_DEVICE_TYPE  source)
{
#ifdef FF_MMI_RFS_ENABLED
	T_RFS_RET ffsResult;
	T_RFS_DIR f_dir;
	UINT16 dir_path_uc[FM_MAX_DIR_PATH_LENGTH];
#else
	T_FFS_RET ffsResult;
	T_FFS_DIR f_dir;
#endif
	char dir_path[FM_MAX_DIR_PATH_LENGTH];

	TRACE_FUNCTION("mfw_fm_createRootDir");

#ifdef FF_MMI_RFS_ENABLED	
	TRACE_EVENT_P1("Source %d",source);
	switch (source)
	{
		case FM_NOR_FLASH:
			sprintf(dir_path,"%s%s%s","/FFS",NORDIR,NORDIR_IMG);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir); 
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			if(ffsResult > 0)
				rfs_closedir(&f_dir);
			else if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/FFS",NORDIR,THUMB);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			if(ffsResult > 0)
				rfs_closedir(&f_dir);
			else if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/FFS",NORDIR,NORDIR_AUD);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			if(ffsResult > 0)
				rfs_closedir(&f_dir);
			else if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			break;
		case FM_NORMS_FLASH:
			sprintf(dir_path,"%s%s%s","/NOR",NORMSDIR,NORMSDIR_IMG);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir); 
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
	//		if(ffsResult > 0)
	//			rfs_closedir(&f_dir);
	//		else 
			if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/NOR",NORMSDIR,THUMB);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
		//	if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
		//	else 
			if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/NOR",NORMSDIR,NORMSDIR_AUD);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
		//	if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
		//	else 
			if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			break;			
		case FM_NAND_FLASH:
			/**********************NOTE***************************
			FS Abstraction API to be added
			******************************************************/
			sprintf(dir_path,"%s%s%s","/NAND",NANDDIR,NANDDIR_IMG);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
		//	if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
//			else
				if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/NAND",NANDDIR,THUMB);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
		//	if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
		//	else
		if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/NAND",NANDDIR,NANDDIR_AUD);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
		//	if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
		//	else 
		if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			break;
		case FM_T_FLASH:
			/**********************NOTE***************************
			FS Abstraction API to be added
			******************************************************/
			sprintf(dir_path,"%s%s%s","/MMC",TFLASHDIR,TFLASHDIR_IMG);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);      
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
		//	if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
		//	else
		if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/MMC",TFLASHDIR,THUMB);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);       
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
	//		if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
		//	else
		if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			sprintf(dir_path,"%s%s%s","/MMC",TFLASHDIR,TFLASHDIR_AUD);
			convert_u8_to_unicode(dir_path, dir_path_uc);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = rfs_opendir(dir_path_uc,&f_dir);     
			TRACE_EVENT_P2("Opendir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
	//		if(ffsResult > 0)
		//		rfs_closedir(&f_dir);
		//	else
		if(RFS_ENOENT == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = rfs_mkdir(dir_path_uc, RFS_IRWXU);
				TRACE_EVENT_P2("Makedir - ffsResult   %d  Dir path %s", ffsResult,dir_path);
			}
			break;
	}
#else
			sprintf(dir_path,"%s%s",NORDIR,NORDIR_IMG);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = ffs_opendir(dir_path,&f_dir);       
			if(EFFS_NOTFOUND == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = ffs_mkdir(dir_path);
			}
			sprintf(dir_path,"%s%s",NORDIR,THUMB);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = ffs_opendir(dir_path,&f_dir);       
			if(EFFS_NOTFOUND == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = ffs_mkdir(dir_path);
			}
			sprintf(dir_path,"%s%s",NORDIR,NORDIR_AUD);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			ffsResult = ffs_opendir(dir_path,&f_dir);       
			if(EFFS_NOTFOUND == ffsResult)
			{
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffsResult = ffs_mkdir(dir_path);
			}
#endif
	return FM_NO_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_newdir

 $Description:		creates a new direcotry with the given name

 $Returns:		FM_DIR_EXISTS/FM_NO_ERROR

 $Arguments:		dirname		: new directory name
 				source		: Current Drive
*******************************************************************************/
T_MFW_FM_STATUS mfw_fm_newdir(char *dirname, T_FM_DEVICE_TYPE  source)
{
#ifdef FF_MMI_RFS_ENABLED
	T_RFS_RET ffsResult;
	T_RFS_DIR f_dir;
	char pathname[FM_MAX_DIR_PATH_LENGTH];
	UINT16 pathname_uc[FM_MAX_DIR_PATH_LENGTH];
#else
	T_FFS_RET ffsResult;
	T_FFS_DIR f_dir;
#endif	

	TRACE_FUNCTION("mfw_fm_newdir");

#ifdef FF_MMI_RFS_ENABLED	
	switch (source)
	{
		case FM_NOR_FLASH:
			strcpy(pathname,"/FFS");
			break;
		case FM_NORMS_FLASH:
			strcpy(pathname,"/NOR");
			break;			
		case FM_NAND_FLASH:
			strcpy(pathname,"/NAND");
			break;
		case FM_T_FLASH:
			strcpy(pathname,"/MMC");
			break;
	}
			strcat(pathname,dirname);
			convert_u8_to_unicode(pathname,pathname_uc);

			ffsResult = rfs_opendir(pathname_uc,&f_dir);       
			if(RFS_ENOENT == ffsResult)
			{
				ffsResult = rfs_mkdir(pathname_uc,RFS_IRWXU);
			}
			else
			{
				return FM_DIR_EXISTS;
			}
#else

			ffsResult = ffs_opendir(dirname,&f_dir);       
			if(EFFS_NOTFOUND == ffsResult)
			{
				ffsResult = ffs_mkdir(dirname);
			}
			else
			{
				return FM_DIR_EXISTS;
			}
#endif
	return FM_NO_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_readProperties

 $Description:		Reads the properties of all the objects in the given directory

 $Returns:		None

 $Arguments:		dir_path		: Current Directory Path
 				dir_name		: Current Directory Name
 				num_objs	: num of obejcts
 				obj_list		: object list
 				obj_properties: Object properties
 				source		: Current Drive 
*******************************************************************************/
void mfw_fm_readProperties(char *dir_path, char *dir_name, UBYTE num_objs, T_FM_OBJ **obj_list, T_FM_OBJ_PROPERTIES **obj_properties,T_FM_DEVICE_TYPE  source, T_FM_APP_TYPE app)
{
	/* January 16, 2008 DRT:OMAPS00156759 (x0082844) Shubhro -> For Unicode Support--> Start*/
	#if defined(FF_MMI_UNICODE_SUPPORT)||defined (FF_MMI_RFS_ENABLED)
		T_WCHAR curObj_uc[FM_MAX_DIR_PATH_LENGTH];
	#else
		char curObj_u8[FM_MAX_DIR_PATH_LENGTH];
	#endif
	/* January 16, 2008 DRT:OMAPS00156759 (x0082844) Shubhro --> End*/
	
	char curPath[FM_MAX_DIR_PATH_LENGTH];
	int iCount=0;

#ifdef FF_MMI_RFS_ENABLED
	T_RFS_RET result;
	T_RFS_STAT f_stat;	
	T_RTC_DATE_TIME  time_and_date;
#else
	T_FFS_RET result;
	T_FFS_STAT f_stat;
#endif	
	
	TRACE_FUNCTION("mfw_fm_readProperties");

#ifdef FF_MMI_RFS_ENABLED
	switch (source)
	{
		case FM_NOR_FLASH:
			sprintf(curPath,"%s%s%s/","/FFS",dir_path,dir_name);
			break;
		case FM_NORMS_FLASH:
			sprintf(curPath,"%s%s%s/","/NOR",dir_path,dir_name);
			break;			
		case FM_NAND_FLASH:
			sprintf(curPath,"%s%s%s/","/NAND",dir_path,dir_name);
			break;
		case FM_T_FLASH:
			sprintf(curPath,"%s%s%s/","/MMC",dir_path,dir_name);
			break;
	}    


		for (iCount = 0;iCount<num_objs; iCount++)
			{
			
		/* February 8, 2008 DRT:OMAPS00156759 (x0083025) For Unicode Support--> Start*/	
				convert_u8_to_unicode(curPath, curObj_uc);
		
			#ifdef FF_MMI_UNICODE_SUPPORT
				// If it's an image it's stored as char
				if (app == FM_AUDIO)
				{
					wstrcat(curObj_uc, obj_list[iCount]->name_uc);
				}
				else
			#endif
				{ 
					T_WCHAR filename_uc[FM_MAX_OBJ_NAME_LENGTH];
					convert_u8_to_unicode(obj_list[iCount]->name, filename_uc);
					wstrcat(curObj_uc, filename_uc);
				}
				result= rfs_stat(curObj_uc, &f_stat);
				if(result == RFS_EOK)
				{
					if(f_stat.file_dir.mode & RFS_IXUSR)
						obj_list[iCount]->type=OBJECT_TYPE_FOLDER;
					else
						obj_list[iCount]->type=OBJECT_TYPE_FILE;
				}
				TRACE_EVENT_P2("Object %s type %d",curObj_uc, obj_list[iCount]->type);

				obj_properties[iCount] = (T_FM_OBJ_PROPERTIES *)mfwAlloc(sizeof(T_FM_OBJ_PROPERTIES));
				obj_properties[iCount]->size = f_stat.file_dir.size;
				result = rfs_getdatetime(curObj_uc,NULL  /* creation date and time */,&time_and_date  /* last modified date and time */);
				sprintf(obj_properties[iCount]->date,"%d-%d-%d", time_and_date.day, time_and_date.month, 2000 + time_and_date.year);
				sprintf(obj_properties[iCount]->time,"%d.%d.%d", time_and_date.hour, time_and_date.minute, time_and_date.second);
			}

#else
		sprintf(curPath,"%s%s/",dir_path,dir_name);
		for (iCount = 0;iCount<num_objs; iCount++)
		{
			sprintf(curObj_u8,"%s%s",curPath,obj_list[iCount]->name);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			result= ffs_stat( curObj_u8, (void *)&f_stat );
			if(result == EFFS_OK)
			{
				switch(f_stat.type)
				{
					case 	OT_FILE:
						obj_list[iCount]->type=OBJECT_TYPE_FILE;
						break;
					case 	OT_DIR:
						obj_list[iCount]->type=OBJECT_TYPE_FOLDER;
						break;
					default:
						obj_list[iCount]->type=OBJECT_TYPE_NONE;
						break;
				}
			}
			TRACE_EVENT_P2("name %s, Object type %d", obj_list[iCount]->name,obj_list[iCount]->type);
			obj_properties[iCount] = (T_FM_OBJ_PROPERTIES*)mfwAlloc(sizeof(T_FM_OBJ_PROPERTIES));
			obj_properties[iCount]->size=f_stat.size;
		}
#endif
}

/*******************************************************************************
 $Function:		mfw_fm_readFIleFolders

 $Description:		Classifies all the objects as either File or Directory

 $Returns:		None

 $Arguments:		fm_curr_dir	: Current directory
 				source		: Current Drive
*******************************************************************************/
void mfw_fm_readFileFolders(char *dir_path, char *dir_name, UBYTE num_objs, T_FM_OBJ **obj_list, T_FM_DEVICE_TYPE  source)
{
	char curObj[FM_MAX_DIR_PATH_LENGTH];
	char curPath[FM_MAX_DIR_PATH_LENGTH];
	int iCount=0;
#ifdef FF_MMI_RFS_ENABLED
	T_RFS_RET result;
	T_RFS_STAT f_stat;
	UINT16 curObj_uc[FM_MAX_DIR_PATH_LENGTH];
#else
	T_FFS_RET result;
	T_FFS_STAT f_stat;
#endif

TRACE_FUNCTION("mfw_fm_readFileFolders");

#ifdef FF_MMI_RFS_ENABLED
	switch (source)
	{
		case FM_NOR_FLASH:
			sprintf(curPath,"%s%s%s/","/FFS",dir_path,dir_name);
			break;
		case FM_NORMS_FLASH:
			sprintf(curPath,"%s%s%s/","/NOR",dir_path,dir_name);
			break;			
		case FM_NAND_FLASH:
			sprintf(curPath,"%s%s%s/","/NAND",dir_path,dir_name);
			break;
		case FM_T_FLASH:
			sprintf(curPath,"%s%s%s/","/MMC",dir_path,dir_name);
			break;
	}    
			for (iCount = 0;iCount<num_objs; iCount++)
			{
				sprintf(curObj,"%s%s",curPath,obj_list[iCount]->name);
				convert_u8_to_unicode(curObj, curObj_uc);
				result= rfs_stat(curObj_uc, &f_stat);
				if(result == RFS_EOK)
				{
					if(f_stat.file_dir.mode & RFS_IXUSR)
						obj_list[iCount]->type=OBJECT_TYPE_FOLDER;
					else
						obj_list[iCount]->type=OBJECT_TYPE_FILE;
				}
				TRACE_EVENT_P2("Object %s type %d",curObj, obj_list[iCount]->type);
			}
#else
		sprintf(curPath,"%s%s/",dir_path,dir_name);

		for (iCount = 0;iCount<num_objs; iCount++)
			{
				sprintf(curObj,"%s%s",curPath,obj_list[iCount]->name);

				result= ffs_stat( curObj, (void *)&f_stat );
				if(result == EFFS_OK)
				{
					switch(f_stat.type)
					{
						case 	OT_FILE:
							obj_list[iCount]->type=OBJECT_TYPE_FILE;
							break;
						case 	OT_DIR:
							obj_list[iCount]->type=OBJECT_TYPE_FOLDER;
							break;
						default:
							obj_list[iCount]->type=OBJECT_TYPE_NONE;
							break;
					}
				}
				TRACE_EVENT_P2("Object %s type %d",curObj, obj_list[iCount]->type);
			}
#endif
}
/*******************************************************************************
 $Function:		mfw_fm_getMemStat

 $Description:		Extracts the memory usage details of a given drive

 $Returns:		None

 $Arguments:		nfree		: free bytes
 				nused		: used bytes
 				source		: Current Drive
*******************************************************************************/
void mfw_fm_getMemStat(int *nfree, int *nused,T_FM_DEVICE_TYPE  source)	
{

	T_RFS_STAT f_stat;
	char curObj[FM_MAX_DIR_PATH_LENGTH];
	UINT16 curObj_uc[FM_MAX_DIR_PATH_LENGTH];
	TRACE_FUNCTION("mfw_fm_getMemStat");

	memset(curObj, 0, FM_MAX_DIR_PATH_LENGTH);
	switch (source)
	{
		case FM_NOR_FLASH:
			strcpy(curObj,"/FFS");
			break;
		case FM_NORMS_FLASH:
			strcpy(curObj,"/NOR");
			break;			
		case FM_NAND_FLASH:
			strcpy(curObj,"/NAND");
			break;
		case FM_T_FLASH:
			strcpy(curObj,"/MMC");
			break;
	}
		convert_u8_to_unicode(curObj, curObj_uc);
		rfs_stat(curObj_uc, &f_stat);    /* warning fix */
		*nfree = f_stat.mount_point.free_space;
		*nused = f_stat.mount_point.used_size;
		
}

/*******************************************************************************
 $Function:		mfw_fm_format

 $Description:		Formats the given drive

 $Returns:		FM_NO_ERROR/FM_FORMAT_ERROR

 $Arguments:		source		: Current Drive
*******************************************************************************/
T_MFW_FM_STATUS mfw_fm_format(T_FM_DEVICE_TYPE  source)	
{
	T_RFS_RET result;
	UINT16 mount_point_uc[6];
	TRACE_FUNCTION("mfw_fm_format");
	memset(mount_point_uc, 0x00,6);
	switch (source)
	{
		case FM_NORMS_FLASH:
			convert_u8_to_unicode("/NOR", mount_point_uc);
			break;
		case FM_NAND_FLASH:
			convert_u8_to_unicode("/NAND", mount_point_uc);
			break;
		case FM_T_FLASH:
			convert_u8_to_unicode("/MMC", mount_point_uc);
			break;
	}

	result = rfs_preformat(mount_point_uc, 0xDEAD);
	if(result < RFS_EOK)
		return FM_FORMAT_ERROR;
	else
	{
		result = rfs_format(mount_point_uc, NULL, 0x2BAD);
		if (result < RFS_EOK)
			return FM_FORMAT_ERROR;
		else
		{
		/*  Mar 15, 2007    DRT: OMAPS00120201  x0039928 */
		/* Fix: Creating the default directories for the selected device after format */
			mfw_fm_createRootDir(source);
			return FM_NO_ERROR;
		}
	}
}

/*******************************************************************************
 $Function:		mfw_fm_remove

 $Description:		Deletes the selected object

 $Returns:		FM_DELETE_DIRNOTEMPTY/FM_DELETE_ERROR/FM_NO_ERROR

 $Arguments:		source		: Current Drive
*******************************************************************************/
#ifdef FF_MMI_UNICODE_SUPPORT
T_MFW_FM_STATUS mfw_fm_remove(T_WCHAR* objname_u16,T_FM_DEVICE_TYPE  source)	
#else
T_MFW_FM_STATUS mfw_fm_remove(char* objname,T_FM_DEVICE_TYPE  source)	
#endif
{
#ifdef FF_MMI_RFS_ENABLED
	T_RFS_RET rfsResult;
	char objname_mt[FM_MAX_DIR_PATH_LENGTH];
	T_WCHAR objname_uc[FM_MAX_DIR_PATH_LENGTH];
#else
	T_FFS_RET ffsResult;
#endif
	

	TRACE_FUNCTION("mfw_fm_remove");

#ifdef FF_MMI_RFS_ENABLED
	switch (source)
	{
		case FM_NOR_FLASH:
			strcpy(objname_mt,"/FFS");
			break;
		case FM_NORMS_FLASH:
			strcpy(objname_mt,"/NOR");
			break;			
		case FM_NAND_FLASH:
			strcpy(objname_mt,"/NAND");
			break;
		case FM_T_FLASH:
			strcpy(objname_mt,"/MMC");
			break;
	}
  #ifdef FF_MMI_UNICODE_SUPPORT
	convert_u8_to_unicode(objname_mt, objname_uc);
	wstrcat(objname_uc, objname_u16);
  #else
			strcat(objname_mt,objname);
			convert_u8_to_unicode(objname_mt, objname_uc);
  #endif
	TRACE_EVENT_P1("objname  %s",objname_uc);
			rfsResult = rfs_remove(objname_uc);
			if(rfsResult != RFS_EOK)
			{
				return FM_DELETE_ERROR;
			}
#else
	{
	#ifdef FF_MMI_UNICODE_SUPPORT
		char objname[FM_MAX_DIR_PATH_LENGTH];
		convert_unicode_to_u8(objname_u16, objname);
	#endif
	TRACE_EVENT_P1("objname  %s",objname);
			ffsResult = ffs_remove(objname);
	}
			if(ffsResult != EFFS_OK)
			{
				if(ffsResult == EFFS_DIRNOTEMPTY)
					return FM_DELETE_DIRNOTEMPTY;
				else
					return FM_DELETE_ERROR;
			}

#endif
	return FM_NO_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_remove_image

 $Description:		Deletes the selcted image and its thumbnail

 $Returns:		FM_DELETE_ERROR/FM_NO_ERROR

 $Arguments:		path				: Current directory path
 				dirname			: Current Directory name
 				old_filename		: Old filename
 				new_filename		: New filename
 				source			: Current Drive
*******************************************************************************/
T_MFW_FM_STATUS mfw_fm_remove_image(char * path, char * dirname, char* objname,T_FM_DEVICE_TYPE  source)	
{
	char obj[FM_MAX_DIR_PATH_LENGTH];
	T_MFW_FM_STATUS ffsResult;

	TRACE_FUNCTION("mfw_fm_delete_image");

	sprintf(obj,"%s%s/%s.jpg",path,dirname,objname);
	TRACE_EVENT_P1("obj %s",obj);
#ifdef FF_MMI_UNICODE_SUPPORT
	{
		T_WCHAR obj_uc[FM_MAX_DIR_PATH_LENGTH];
		convert_u8_to_unicode(obj, obj_uc);
		ffsResult = mfw_fm_remove(obj_uc,source);
	}
#else
	ffsResult = mfw_fm_remove(obj,source);
#endif
	if(ffsResult != FM_NO_ERROR)
	{
		return FM_DELETE_ERROR;
	}
	switch(source)
	{
		case FM_NOR_FLASH:
			sprintf(obj,"%s%s/%s.tmb",NORDIR,THUMB,objname);
			break;
		case FM_NORMS_FLASH:
			sprintf(obj,"%s%s/%s.tmb",NORMSDIR,THUMB,objname);
			break;			
		case FM_NAND_FLASH:
			sprintf(obj,"%s%s/%s.tmb",NANDDIR,THUMB,objname);
			break;
		case FM_T_FLASH:
			sprintf(obj,"%s%s/%s.tmb",TFLASHDIR,THUMB,objname);
			break;
	}
#ifdef FF_MMI_UNICODE_SUPPORT
	{
		T_WCHAR obj_uc[FM_MAX_DIR_PATH_LENGTH];
		convert_u8_to_unicode(obj, obj_uc);
		ffsResult = mfw_fm_remove(obj_uc,source);
	}
#else
	ffsResult = mfw_fm_remove(obj,source);
#endif
	if(ffsResult != FM_NO_ERROR)
	{
		return FM_DELETE_ERROR;
	}
	return FM_NO_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_copy_start

 $Description:		starts copying the give file

 $Returns:		FM_COPY_ERROR/FM_COPY_DONE/FM_COPY_PROGRESS

 $Arguments:		data		: Copy/Move operation related structure
*******************************************************************************/
T_FM_COPY_STATE mfw_fm_copy_start(T_MFW_FM_COPYMOVE_STRUCT *data)	
{
	char  *ext2;
	T_RFS_STAT f_stat;
	T_RFS_SIZE iResult = 0;
	UINT16 source_file_uc[FM_MAX_DIR_PATH_LENGTH];
	UINT16 destination_file_uc[FM_MAX_DIR_PATH_LENGTH];
	char source_file[FM_MAX_DIR_PATH_LENGTH];
	char destination_file[FM_MAX_DIR_PATH_LENGTH];
	
	TRACE_FUNCTION("mfw_fm_copy_start");

	switch (data->source_type)
	{
		case FM_NOR_FLASH:
			strcpy(source_file,"/FFS");
			break;
		case FM_NORMS_FLASH:
			strcpy(source_file,"/NOR");
			break;			
		case FM_NAND_FLASH:
			strcpy(source_file,"/NAND");
			break;
		case FM_T_FLASH:
			strcpy(source_file,"/MMC");
			break;
	}

	switch (data->destination_type)
	{
		case FM_NOR_FLASH:
			strcpy(destination_file,"/FFS");
			break;		
		case FM_NORMS_FLASH:
			strcpy(destination_file,"/NOR");
			break;				
		case FM_NAND_FLASH:
			strcpy(destination_file,"/NAND");
			break;
		case FM_T_FLASH:
			strcpy(destination_file,"/MMC");
			break;
	}
#ifdef FF_MMI_UNICODE_SUPPORT
	convert_u8_to_unicode(source_file, source_file_uc);
	convert_u8_to_unicode(destination_file, destination_file_uc);
	wstrcat(source_file_uc, data->sourceFile);
	wstrcat(destination_file_uc, data->destinationFile);
#else
	strcat(source_file, data->sourceFile);
	strcat(destination_file, data->destinationFile);

	convert_u8_to_unicode(source_file, source_file_uc);
	convert_u8_to_unicode(destination_file, destination_file_uc);
#endif

	ext2=(char *)mmi_fm_get_ext(source_file);//April 27, 2007 DRT:OMAPS00128836 x0073106
	
	if( ( (rfs_stat(destination_file_uc, &f_stat)) != RFS_ENOENT)//April 27, 2007 DRT:OMAPS00128836 x0073106
		&& (strcmp((const char*)ext2, "jpg") ==0 ))
	{
				return FM_COPY_NONE;
	}

	data->sourceFileID = (T_RFS_FD)rfs_open( source_file_uc, RFS_O_RDONLY, NULL);
	data->destFileID= (T_RFS_FD)rfs_open( destination_file_uc, RFS_O_WRONLY|RFS_O_CREAT, RFS_IRUSR|RFS_IWUSR);
	data->bytesRead = 0;

	if(data->sourceFileSize > FM_COPY_BUFFER_SIZE )
	{
		data->buf_size = FM_COPY_BUFFER_SIZE;
		data->bytesRead = data->buf_size;
	}
	else 
	{
		data->buf_size = data->sourceFileSize;
		data->bytesRead = data->buf_size;
	}

	iResult = (T_RFS_SIZE)rfs_read(data->sourceFileID, data->buf,  data->buf_size );
	TRACE_EVENT_P1("iResult %d",iResult);
	if(iResult < 0)
	{
		//Error Reading
		rfs_close( data->sourceFileID);
		rfs_close(data->destFileID );
		return FM_COPY_ERROR;
	}
	iResult = (T_RFS_SIZE)rfs_write( data->destFileID, data->buf,  data->buf_size);
	TRACE_EVENT_P1("iResult %d",iResult);
	if(iResult < 0)
	{
		//Error writing
		rfs_close( data->sourceFileID);
		rfs_close(data->destFileID );
		return FM_COPY_ERROR;
	}
	if(data->bytesRead < data->sourceFileSize)
	{							
		return FM_COPY_PROGRESS;
	}
	else
	{
		rfs_close( data->sourceFileID);
		rfs_close(data->destFileID );
		return FM_COPY_DONE;
	}

//	return FM_COPY_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_copy_continue

 $Description:		resumes copying the give file

 $Returns:		FM_COPY_ERROR/FM_COPY_DONE/FM_COPY_PROGRESS

 $Arguments:		data		: Copy/Move operation related structure
*******************************************************************************/
T_FM_COPY_STATE mfw_fm_copy_continue(T_MFW_FM_COPYMOVE_STRUCT *data)	
{
	T_RFS_SIZE iResult = 0;

/*	
	UINT16 source_file_uc[FM_MAX_DIR_PATH_LENGTH];
	UINT16 destination_file_uc[FM_MAX_DIR_PATH_LENGTH];
	char source_file[FM_MAX_DIR_PATH_LENGTH];
	char destination_file[FM_MAX_DIR_PATH_LENGTH];
	
	TRACE_FUNCTION("mfw_fm_copy_continue");


	switch (data->source_type)
	{
		case FM_NOR_FLASH:
			strcpy(source_file,"/FFS");
			break;
		case FM_NORMS_FLASH:
			strcpy(source_file,"/NOR");
			break;			
		case FM_NAND_FLASH:
			strcpy(source_file,"/NAND");
			break;
		case FM_T_FLASH:
			strcpy(source_file,"/MMC");
			break;
	}

	switch (data->destination_type)
	{
		case FM_NOR_FLASH:
			strcpy(destination_file,"/FFS");
			break;
		case FM_NORMS_FLASH:
			strcpy(destination_file,"/NOR");
			break;			
		case FM_NAND_FLASH:
			strcpy(destination_file,"/NAND");
			break;
		case FM_T_FLASH:
			strcpy(destination_file,"/MMC");
			break;
	}

	strcat(source_file, data->sourceFile);
	strcat(destination_file, data->destinationFile);

	convert_u8_to_unicode(source_file, source_file_uc);
	convert_u8_to_unicode(destination_file, destination_file_uc);

*/
	if( (data->bytesRead+ FM_COPY_BUFFER_SIZE) < data->sourceFileSize)
	{
		//More blocks to be read
		data->buf_size = FM_COPY_BUFFER_SIZE;
		data->bytesRead = data->bytesRead + data->buf_size;
	}
	else 
	{
		//Last chunk to be read
		data->buf_size = data->sourceFileSize -  data->bytesRead;
		data->bytesRead = data->bytesRead + FM_COPY_BUFFER_SIZE;
	}

	iResult = (T_RFS_SIZE)rfs_read(data->sourceFileID, data->buf,  data->buf_size );
	TRACE_EVENT_P1("iResult %d",iResult);
	if(iResult < 0)
	{
		//Error Reading
		rfs_close( data->sourceFileID);
		rfs_close(data->destFileID );
		return FM_COPY_ERROR;
	}
	iResult = (T_RFS_SIZE)rfs_write( data->destFileID, data->buf,  data->buf_size);
	TRACE_EVENT_P1("iResult %d",iResult);
	if(iResult < 0)
	{
		//Error Writing
		rfs_close( data->sourceFileID);
		rfs_close(data->destFileID );
		return FM_COPY_ERROR;
	}
						
	if(data->bytesRead < data->sourceFileSize)
	{							
		return FM_COPY_PROGRESS;
	}
	else
	{
		rfs_close(data->sourceFileID);
		rfs_close(data->destFileID );
		return FM_COPY_DONE;
	}
//	return FM_COPY_ERROR;
}

//Image List
/*******************************************************************************
 $Function:		mfw_fm_checkThumbnail

 $Description:		Checks for thumbnail

 $Returns:		FM_FILE_DOESNOTEXISTS/FM_NO_ERROR

 $Arguments:		obj				: Current image
 				source			: Current Drive
*******************************************************************************/
T_MFW_FM_STATUS mfw_fm_checkThumbnail( char * obj,T_FM_DEVICE_TYPE  source)
{

	char filename[FM_MAX_DIR_PATH_LENGTH];
#ifdef FF_MMI_RFS_ENABLED
	T_RFS_FD	fd                   = 0;
	UINT16 filename_uc[FM_MAX_DIR_PATH_LENGTH];
#else
	T_FFS_FD  	fd                   = 0;
#endif	
	TRACE_FUNCTION("mfw_fm_check_thumbnail");
	
	TRACE_EVENT_P1("File %s",obj);

#ifdef FF_MMI_RFS_ENABLED	
	memset(filename, 0, FM_MAX_DIR_PATH_LENGTH);
	switch(source)
	{
		case FM_NOR_FLASH:
			sprintf(filename,"%s%s%s/%s.tmb","/FFS",NORDIR,THUMB,obj);
			break;
		case FM_NORMS_FLASH:
			sprintf(filename,"%s%s%s/%s.tmb","/NOR",NORMSDIR,THUMB,obj);
			break;			
		case FM_NAND_FLASH:
			sprintf(filename,"%s%s%s/%s.tmb","/NAND",NANDDIR,THUMB,obj);
			break;
		case FM_T_FLASH:
			sprintf(filename,"%s%s%s/%s.tmb","/MMC",TFLASHDIR,THUMB,obj);
			break;
	}
	convert_u8_to_unicode(filename, filename_uc);
	if ((fd = rfs_open (filename_uc, RFS_O_RDONLY, NULL)) == RFS_ENOENT)
	{
		TRACE_EVENT("Create the thmbnail.");
		return FM_FILE_DOESNOTEXISTS;
	}
	else 
	{
		TRACE_EVENT_P1("Error %d",fd);
		rfs_close(fd);
		return FM_FILE_EXISTS;
	}
#else
			sprintf(filename,"%s%s/%s.tmb",NORDIR,THUMB,obj);
			/**********************NOTE***************************
			FFS API To be replaced with FS Abstraction API 
			******************************************************/
			if ((fd = ffs_open (filename, FFS_O_RDONLY)) <= EFFS_NOTFOUND)
			{
				TRACE_EVENT("Create the thmbnail.");
				return FM_FILE_DOESNOTEXISTS;
			}
			else 
			{
				TRACE_EVENT_P1("Error %d",fd);
				/**********************NOTE***************************
				FFS API To be replaced with FS Abstraction API 
				******************************************************/
				ffs_close(fd);
				return FM_FILE_EXISTS;
			}
#endif
//	return FM_FILE_DOESNOTEXISTS;
}
/*******************************************************************************
 $Function:		mfw_fm_imgViewer_create

 $Description:		This function will create the handle of imageviewer UCP

 $Returns:		Result of the UCP creation

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_create(void)
{
	MSL_IMGVIEW_STATUS mslResult       =  MSL_IMGVIEW_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgViewer_create()");

	mslResult =     MSL_ImgView_Create(&msl_handle);
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgViewer_init

 $Description:		This function will initialise the imageviewer UCP

 $Returns:		Result of the UCP initialization

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_init(void)
{
	MSL_IMGVIEW_STATUS mslResult       =  MSL_IMGVIEW_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgViewer_init()");

	mslResult =     MSL_ImgView_Init(msl_handle);

	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgViewer_destroy

 $Description:		This function destroy the imageviewer UCP

 $Returns:		Result of the UCP destroy

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_destroy(void)
{
	MSL_IMGVIEW_STATUS mslResult       =  MSL_IMGVIEW_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgViewer_destroy()");
	mslResult =     MSL_ImgView_Destroy(msl_handle);
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgViewer_deinit

 $Description:		This function will deinit the imageviewer UCP

 $Returns:		Result of the UCP de-initialization

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_deinit(void)
{
	MSL_IMGVIEW_STATUS mslResult       =  MSL_IMGVIEW_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgViewer_deinit()");

	mslResult =     MSL_ImgView_Deinit(msl_handle);
	
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}


/*******************************************************************************
 $Function:		mfw_fm_imgViewer_pause

 $Description:		This function will pause the imageviewer UCP. 

 $Returns:		Result of the UCP pause

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_pause(void)
{
	MSL_IMGVIEW_STATUS mslResult       =  MSL_IMGVIEW_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgViewer_pause()");
	 mslResult = MSL_ImgView_Pause((MSL_HANDLE)msl_handle);

	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}


/*******************************************************************************
 $Function:		mfw_fm_imgViewer_view

 $Description:		This function will start the rendering of the image on LCD.

 $Returns:		Result of the drawing the image

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_view(void)
{
	MSL_IMGVIEW_STATUS mslResult       =  MSL_IMGVIEW_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgViewer_view()");
	mslResult = MSL_ImgView_View((MSL_HANDLE)msl_handle);

	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;}
/*******************************************************************************
 $Function:		mfw_fm_imgViewer_setImageProperty

 $Description:		This function will set the parameters for the imageviewer UCP

 $Returns:		Result of the UCP updation of configurations

 $Arguments:		filepath	: Image path
 				filename	: Image name
 				width	: Image width
 				height	: Image height
 				xoffset	: Image x offset
 				yoffset	: Image y offset
 				source	: Current drive
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_setImageProperty( char * filepath, char *filename, int width, int height,int xoffset, int yoffset, T_FM_DEVICE_TYPE  source)
{

	MSL_IMGVIEW_STATUS  mslResult;
	//The fullpath will be included.
	char tmb_name_p[FM_MAX_OBJ_NAME_LENGTH];
	MSL_DISPLAY_CONFIGTYPE mfw_fm_dspl_config;
	MSL_FILE_CONFIGTYPE mfw_fm_file_config ;
	int rotation_degree = 0;
	int zoom_factor = 0;

	TRACE_FUNCTION ("mfw_fm_imgViewer_setImageProperty()");
    
	mfw_fm_dspl_config.tImgFormat = MSL_COLOR_RGB565;
	mfw_fm_dspl_config.unDisplayImgHeight = height;
	mfw_fm_dspl_config.unDisplayImgWidth = width;
	mfw_fm_dspl_config.unDisplayXOffset = xoffset;
	mfw_fm_dspl_config.unDisplayYOffset = yoffset;
	mslResult = MSL_ImgView_SetConfig(msl_handle,MSL_DISPLAY_CONFIGINDEX,&mfw_fm_dspl_config);
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		mslResult = MSL_ImgView_SetConfig (msl_handle,MSL_ROTATE_CONFIGINDEX,&rotation_degree);
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		mslResult = MSL_ImgView_SetConfig(msl_handle,MSL_ZOOM_CONFIGINDEX,&zoom_factor);
       mfw_fm_file_config.sFileName = (char *) mfwAlloc(FM_MAX_OBJ_NAME_LENGTH);

#ifdef FF_MMI_RFS_ENABLED	   
	switch (source)
	{
		case FM_NOR_FLASH:
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/FFS",NORDIR,THUMB, filename);
	//		mfw_fm_file_config.tFileType = MSL_FILETYPE_FFS;
			break;
		case FM_NORMS_FLASH:
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/NOR",NORMSDIR,THUMB, filename);
	//		mfw_fm_file_config.tFileType = MSL_FILETYPE_FFS;
			break;
		case FM_NAND_FLASH:
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/NAND",NANDDIR,THUMB, filename);
			/**********************NOTE***************************
			Drive type to be updated 
			******************************************************/
	//		mfw_fm_file_config.tFileType = MSL_FILETYPE_RFS;
			break;
		case FM_T_FLASH:
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/MMC",TFLASHDIR,THUMB, filename);
			/**********************NOTE***************************
			Drive type to be updated 
			******************************************************/
			//mfw_fm_file_config.tFileType = MSL_FILETYPE_TFLASH;
			break;
		default:
			sprintf(tmb_name_p,"/%s/%s.tmb",THUMB, filename);
	}
	strcat(mfw_fm_file_config.sFileName,tmb_name_p);
#else	
	strcpy(mfw_fm_file_config.sFileName,tmb_name_p);
#endif
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		mslResult =  MSL_ImgView_SetConfig(msl_handle,MSL_DECFILE_CONFIGINDEX,&mfw_fm_file_config);
	 mfwFree((U8 *)mfw_fm_file_config.sFileName,FM_MAX_OBJ_NAME_LENGTH);
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;

}

/*******************************************************************************
 $Function:		mfw_fm_imgViewer_setConfigs

 $Description:		This function will set the parameters for the imageviewer UCP

 $Returns:		Result of the UCP updation of configurations

 $Arguments:		filepath			: Image path
 				filename			: Image name
 				width			: Image width
 				height			: Image height
 				xoffset			: Image x offset
 				yoffset			: Image y offset
 				zFactor			: Zoom factor
 				rotation_degree	: Rotate factor
 				source			: Current drive
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_setConfigs(char *filename,int width, int height,int xoffset, int yoffset,U32 zFactor,int rotation_degree,T_FM_DEVICE_TYPE  source)
{
	MSL_IMGVIEW_STATUS  mslResult;
	MSL_DISPLAY_CONFIGTYPE mfw_fm_dspl_config;
	MSL_FILE_CONFIGTYPE mfw_fm_file_config ;
	int zoom_factor = zFactor;
	int rAngle = rotation_degree;

	TRACE_FUNCTION ("mfw_fm_imgViewer_setRotationConfigs()");

	mfw_fm_dspl_config.unDisplayImgHeight = height;
	mfw_fm_dspl_config.unDisplayImgWidth = width;
	mfw_fm_dspl_config.unDisplayXOffset = xoffset;
	mfw_fm_dspl_config.unDisplayYOffset = yoffset;
	mslResult = MSL_ImgView_SetConfig(msl_handle,MSL_DISPLAY_CONFIGINDEX,&mfw_fm_dspl_config);

	mfw_fm_file_config.sFileName = (char *) mfwAlloc(FM_MAX_OBJ_NAME_LENGTH);

#ifdef FF_MMI_RFS_ENABLED	
	switch (source)
	{
		case FM_NOR_FLASH:
			strcpy(mfw_fm_file_config.sFileName,"/FFS");
		//	mfw_fm_file_config.tFileType = MSL_FILETYPE_FFS;
			break;
		case FM_NORMS_FLASH:
			strcpy(mfw_fm_file_config.sFileName,"/NOR");
		//	mfw_fm_file_config.tFileType = MSL_FILETYPE_FFS;
			break;		
		case FM_NAND_FLASH:
			strcpy(mfw_fm_file_config.sFileName,"/NAND");
			/**********************NOTE***************************
			Drive type to be updated 
			******************************************************/
		//	mfw_fm_file_config.tFileType = MSL_FILETYPE_RFS;
			break;
		case FM_T_FLASH:
			strcpy(mfw_fm_file_config.sFileName,"/MMC");
			/**********************NOTE***************************
			Drive type to be updated 
			******************************************************/
			//mfw_fm_file_config.tFileType = MSL_FILETYPE_TFLASH;
			break;
	}
	strcat(mfw_fm_file_config.sFileName,filename);
#else
	strcpy(mfw_fm_file_config.sFileName,filename);
#endif
	
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		 mslResult =  MSL_ImgView_SetConfig(msl_handle,MSL_DECFILE_CONFIGINDEX,&mfw_fm_file_config);

	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		mslResult = MSL_ImgView_SetConfig(msl_handle,MSL_ZOOM_CONFIGINDEX,&zoom_factor);

	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		mslResult = MSL_ImgView_SetConfig (msl_handle,MSL_ROTATE_CONFIGINDEX,&rAngle);

	 mfwFree((U8 *)mfw_fm_file_config.sFileName,FM_MAX_OBJ_NAME_LENGTH);

	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_imgView_setcallback

 $Description:		This function will set the callback for viewer UCP

 $Returns:		Result of the updating the callback function

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgViewer_setcallback(void)
{
	MSL_IMGVIEW_STATUS  mslResult;

	TRACE_FUNCTION("mfw_fm_imgViewer_setcallback");
	
	mslResult = MSL_ImgView_SetConfig(msl_handle,MSL_CALLBACKSET_CONFIGINDEX,(MSL_CALLBACK)Msl_mslil_Callback);
	if(mslResult == MSL_IMGVIEW_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgThmb_create

 $Description:		This function will create the handle of thumbnail UCP

 $Returns:		Result of the UCP create

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_create(void)
{
	MSL_IMGTHMB_STATUS mslResult       =  MSL_IMGTHMB_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgThmb_create()");

	mslResult =  MSL_ImgThmb_Create(&msl_handle);

	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgThmb_init

 $Description:		This function will initialise of thumbnail UCP

 $Returns:		Result of the UCP initialization

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_init(void)
{
	MSL_IMGTHMB_STATUS mslResult       =  MSL_IMGTHMB_STATUS_OK;

	TRACE_FUNCTION ("mfw_fm_imgThmb_init()");

	mslResult =  MSL_ImgThmb_Init(msl_handle);
	
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgThmb_destroy

 $Description:		This function will destroy the thumbnail UCP.

 $Returns:		Result of the UCP destroy

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_destroy(void)
{
	MSL_IMGTHMB_STATUS  mslResult;
	
	TRACE_FUNCTION ("mfw_fm_imgThmb_destroy()");
	
	mslResult =   MSL_ImgThmb_Destroy(msl_handle);
	if (mslResult != MSL_IMGTHMB_STATUS_OK)
	{
		MSL_ImgThmb_Destroy(msl_handle);
		msl_handle=0;
		return FM_UCP_ERROR;
	}
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgThmb_deinit

 $Description:		This function will deinit the thumbnail UCP.

 $Returns:		Result of the UCP de-initialization

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_deinit(void)
{
	MSL_IMGTHMB_STATUS  mslResult;
	
	TRACE_FUNCTION ("mfw_fm_imgThmb_deinit()");
	
	mslResult =   MSL_ImgThmb_Deinit(msl_handle);
	
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************

 $Function:		mfw_fm_imgThmb_pause

 $Description:		This function will pasue the thumbnail UCP.

 $Returns:		Result of the UCP pause

 $Arguments:		None

*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_pause(void)
{
	MSL_IMGTHMB_STATUS  mslResult;
	
	TRACE_FUNCTION ("mfw_fm_imgThmb_pause()");
	mslResult = MSL_ImgThmb_Pause((MSL_HANDLE)msl_handle);
	
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_imgThmb_generate

 $Description:		This function will generate the thumbnail file in filesystem.

 $Returns:		Result of the thumbanil generation

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_generate(void)
{
	MSL_IMGTHMB_STATUS  mslResult;
	
	TRACE_FUNCTION ("mfw_fm_imgThmb_generate()");

	mslResult = MSL_ImgThmb_Generate((MSL_HANDLE)msl_handle);
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}


/*******************************************************************************
 $Function:		mfw_fm_imgThmb_setparams

 $Description:		This function will set the parameters for thumbnail UCP

 $Returns:		Result of the UCP updation of configurations

 $Arguments:		inFilepath			: Image path
 				inFilename			: Image name
 				width			: Image width
 				height			: Image height
 				source			: Current drive
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_setparams(char * inFilepath, char* inFilename, int width,int height, T_FM_DEVICE_TYPE  source)
{
	MSL_IMGTHMB_STATUS mslResult       =  MSL_IMGTHMB_STATUS_OK;
	char tmb_name_p[FM_MAX_DIR_PATH_LENGTH];

	MSL_RESCALE_CONFIGTYPE mfw_fm_rescaleconfig ;
	MSL_FILE_CONFIGTYPE mfw_fm_file_config ;

	TRACE_FUNCTION ("mfw_fm_imgThmb_setparams()");

	mfw_fm_rescaleconfig.unRescaledImgHeight = height;
	mfw_fm_rescaleconfig.unRescaledImgWidth =width ;
	mslResult =  MSL_ImgThmb_SetConfigs(msl_handle,MSL_RESCALE_CONFIGINDEX,&mfw_fm_rescaleconfig);
	mfw_fm_file_config.sFileName = (char *) mfwAlloc(FM_MAX_DIR_PATH_LENGTH);
	switch (source)
	{
		case FM_NOR_FLASH:
			sprintf(mfw_fm_file_config.sFileName,"%s%s%s.jpg","/FFS",inFilepath,inFilename);
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/FFS",NORDIR,THUMB, inFilename);
		//	mfw_fm_file_config.tFileType = MSL_FILETYPE_FFS;
			break;
		case FM_NORMS_FLASH:
			sprintf(mfw_fm_file_config.sFileName,"%s%s%s.jpg","/NOR",inFilepath,inFilename);
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/NOR",NORMSDIR,THUMB, inFilename);
		//	mfw_fm_file_config.tFileType = MSL_FILETYPE_FFS;
			break;		
		case FM_NAND_FLASH:
			/**********************NOTE***************************
			Drive type to be updated 
			******************************************************/
			sprintf(mfw_fm_file_config.sFileName,"%s%s%s.jpg","/NAND",inFilepath,inFilename);
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/NAND",NANDDIR,THUMB, inFilename);
			mfw_fm_file_config.tFileType = MSL_FILETYPE_RFS;
			break;
		case FM_T_FLASH:
			/**********************NOTE***************************
			Drive type to be updated 
			******************************************************/
			sprintf(mfw_fm_file_config.sFileName,"%s%s%s.jpg","/MMC",inFilepath,inFilename);
			sprintf(tmb_name_p,"%s%s%s/%s.tmb","/MMC",TFLASHDIR,THUMB, inFilename);
			//mfw_fm_file_config.tFileType = MSL_FILETYPE_TFLASH;
			break;
	}
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
	{
		mslResult =  MSL_ImgThmb_SetConfigs(msl_handle,MSL_DECFILE_CONFIGINDEX,&mfw_fm_file_config);
	}
	sprintf(mfw_fm_file_config.sFileName,"%s",tmb_name_p);
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
	{
		mslResult =  MSL_ImgThmb_SetConfigs(msl_handle,MSL_ENCFILE_CONFIGINDEX,&mfw_fm_file_config);
	}
	 mfwFree((U8 *)mfw_fm_file_config.sFileName,FM_MAX_DIR_PATH_LENGTH);
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR; 
}

/*******************************************************************************
 $Function:		mfw_fm_imgThmb_setcallback

 $Description:		This function will set the callback for thumbnail UCP

 $Returns:		Result of the UCP updation of configurations

 $Arguments:		None
*******************************************************************************/
T_FM_IMG_STATE  mfw_fm_imgThmb_setcallback()
{
	MSL_IMGTHMB_STATUS mslResult       =  MSL_IMGTHMB_STATUS_OK;

	TRACE_FUNCTION("mfw_fm_imgThmb_setcallback");

	mslResult = MSL_ImgThmb_SetConfigs(msl_handle,MSL_CALLBACKSET_CONFIGINDEX,(MSL_CALLBACK)Msl_mslil_Callback);
	if(mslResult == MSL_IMGTHMB_STATUS_OK)
		return FM_UCP_NO_ERROR;
	else
		return FM_UCP_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_thmb_mslcb

 $Description:		This function is the callback for the thumbnail UCP

 $Returns:		None

 $Arguments:		tCMd	: Current command being executed by the MSL
 				tStatus	: Status of the current command
*******************************************************************************/
void mfw_fm_thmb_mslcb( U32 tCMd,U32 tStatus)
{
	T_MFW_FM_PARA para;

	TRACE_FUNCTION("mfw_fm_thmb_mslcb()");
	switch(tCMd)
	{
		case MSL_CMD_INIT:
			TRACE_EVENT_P1("MSL_CMD_INIT %d",tStatus);
			if(tStatus ==MSL_IMGTHMB_STATUS_OK)
			{
				para.img_state=FM_UCP_NO_ERROR;
			}
			else
			{
				para.img_state=FM_UCP_ERROR;
			}
			mfw_fm_signal(E_FM_THMB_INIT, &para);
			break;
		case MSL_CMD_GENERATE:
			TRACE_EVENT_P1("MSL_CMD_GENERATE %d",tStatus);
			switch(tStatus)
			{
				case MSL_IMGTHMB_STATUS_OK:
					para.img_state =   FM_UCP_NO_ERROR;
					break;
				case MSL_IMGTHMB_ERROR_BAD_STREAM:
					para.img_state =   FM_UCP_ERROR_BAD_STREAM;
					break;
				case MSL_IMGTHMB_ERROR_UNKNOWN:
					para.img_state =   FM_UCP_ERROR_UNKNOWN;
					break;
				case MSL_IMGTHMB_ERROR_IOWRITE:
					para.img_state =   FM_UCP_ERROR_NO_MEM;
					break;
				case MSL_IMGTHMB_ERROR_INVALID_ARGUMENT:
					para.img_state =   FM_UCP_ERROR_INVALID_ARGUMENT;
					break;
				default :
					para.img_state =   FM_UCP_ERROR;
			}
			mfw_fm_signal(E_FM_THMB_GEN, &para);
			break;
		case MSL_CMD_DEINIT:
			TRACE_EVENT_P1("MSL_CMD_DEINIT %d",tStatus);
			if(tStatus ==MSL_IMGTHMB_STATUS_OK)
			{
				para.img_state=FM_UCP_NO_ERROR;
			}
			else
			{
				para.img_state=FM_UCP_ERROR;
			}
			mfw_fm_signal(E_FM_THMB_DEINIT, &para);
			break;
	}
}

/*******************************************************************************
 $Function:		mfw_fm_view_mslcb

 $Description:		This function is the callback for the Viewer UCP

 $Returns:		None

 $Arguments:		tCMd	: Current command being executed by the MSL
 				tStatus	: Status of the current command
*******************************************************************************/
void mfw_fm_view_mslcb( U32 tCMd,U32 tStatus)
{
	T_MFW_FM_PARA para;

	TRACE_FUNCTION("mfw_fm_view_mslcb()");

	switch(tCMd)
	{
		case MSL_CMD_INIT:
			TRACE_EVENT_P1("MSL_CMD_INIT %d",tStatus);
			if(tStatus ==MSL_IMGVIEW_STATUS_OK)
			{
				para.img_state=FM_UCP_NO_ERROR;
			}
			else
			{
				para.img_state=FM_UCP_ERROR;
			}
			mfw_fm_signal(E_FM_IMG_INIT, &para);
			break;
		case MSL_CMD_VIEW:
			TRACE_EVENT_P1("MSL_CMD_VIEW %d",tStatus);
			switch(tStatus )
			{
				case MSL_IMGVIEW_STATUS_OK:
					para.img_state = FM_UCP_NO_ERROR;
					break;
				case MSL_IMGVIEW_ERROR_BAD_STREAM:
					para.img_state =  FM_UCP_ERROR_BAD_STREAM;
					break;
				case MSL_IMGVIEW_ERROR_UNKNOWN:
					para.img_state =  FM_UCP_ERROR_UNKNOWN;
					break;
				case MSL_IMGVIEW_ERROR_IOREAD:
					para.img_state =  FM_UCP_ERROR_READ_FAILED;
					break;
				case MSL_IMGVIEW_ERROR_INVALID_ARGUMENT:
					para.img_state =  FM_UCP_ERROR_INVALID_ARGUMENT;
					break;
				default :
					para.img_state =  FM_UCP_ERROR;
			}
			mfw_fm_signal(E_FM_IMG_DRAW,&para);
			break;
		case MSL_CMD_DEINIT:
			TRACE_EVENT_P1("MSL_CMD_DEINIT %d",tStatus);
			if(tStatus ==MSL_IMGVIEW_STATUS_OK)
			{
				para.img_state=FM_UCP_NO_ERROR;
			}
			else
			{
				para.img_state=FM_UCP_ERROR;
			}
			mfw_fm_signal(E_FM_IMG_DEINIT, &para);
			break;
			
	}
}


//Audio List 

/*******************************************************************************
 $Function:		mfw_fm_audPlay_cb

 $Description:		Callback fundtion for auio play/stop

 $Returns:		None

 $Arguments:		parameter	: The structure conveying the stop indication data
*******************************************************************************/
void mfw_fm_audPlay_cb(void *parameter)
{
	T_MFW_FM_PARA para;
	T_AS_STOP_IND *stop_ind = (T_AS_STOP_IND *)parameter;
	
	/* OMAPS00151698, x0056422 */
	T_AS_START_IND *start_ind = ( T_AS_START_IND *)parameter;

	/* OMAPS00151698, x0056422 */

	T_AS_PROBAR_IND_MP3 *mp3_pb = (T_AS_PROBAR_IND_MP3 *)parameter;

	TRACE_FUNCTION("mfw_fm_audPlay_cb");

	
	
	if(mmi_get_aud_state_status() == FM_AUD_NONE)
	{

       TRACE_EVENT_P1("AS_START_IND status %d ",start_ind->status);
      mmi_set_aud_state_status(FM_AUD_PLAY);

				/* OMAPS00151698, x0056422 */
				#ifdef FF_MMI_A2DP_AVRCP

					//if BT connected and aud is initialized, and the command wasnt from BT, then send callback
					tGlobalBmiBtStruct.tAudioState = FM_AUD_PLAY;
					if((tGlobalBmiBtStruct.bConnected != BMI_BT_NOTCONNECTED) 
						&& (start_ind->status == AS_OK))           
					{  


						 if( NULL != tGlobalBmiBtStruct.BmiEventCallback)
						tGlobalBmiBtStruct.BmiEventCallback(BMI_EVENT_USER_PLAY);
						tGlobalBmiBtStruct.tCmdSrc == BMI_BT_COMMAND_NONE;
					}
				#endif // FF_MMI_A2DP_AVRCP
	}

	switch(stop_ind->header.msg_id )
	{
		/* OMAPS00151698, x0056422 */
		 case AS_PAUSE_IND:
                     TRACE_EVENT_P1("AS_PAUSE_IND status %d",stop_ind->status);
                      mmi_set_aud_state_status( FM_AUD_PAUSE);
                      /* OMAPS00151698, x0056422 */
                     #ifdef FF_MMI_A2DP_AVRCP
                     tGlobalBmiBtStruct.tAudioState = FM_AUD_PAUSE;
                    if(tGlobalBmiBtStruct.bConnected != BMI_BT_NOTCONNECTED)
                   {
                             if(NULL != tGlobalBmiBtStruct.BmiEventCallback)
                             tGlobalBmiBtStruct.BmiEventCallback(BMI_EVENT_USER_PAUSE);           
                        tGlobalBmiBtStruct.tCmdSrc = BMI_BT_COMMAND_NONE;
                  }  
                 #endif//FF_MMI_A2DP_AVRCP
                  break;
		/* OMAPS00151698, x0056422 */

		case AS_STOP_IND:
			TRACE_EVENT_P2("AS_STOP_IND status %d end %d",stop_ind->status, stop_ind->end_of_media);
			mfw_unset_stereo_path(mfw_get_current_audioDevice());
			//Daisy tang added for Real Resume feature 20071107
			if(isPlayer_Real_Pause)
			{
				last_file_size_played = stop_ind->file_size;
				last_para_aud_pt = para_aud.aud_pt;
			}
			
			switch((int)(stop_ind->status))
			{
				case AS_NOT_SUPPORTED:
					para.aud_state = FM_AUD_ERROR_NOTSUPPORTED;
					break;
				case AS_MEMORY_ERR:
					para.aud_state = FM_AUD_ERROR_MEM;
					break;
				case AS_INTERNAL_ERR:
					para.aud_state = FM_AUD_ERROR_INTERNAL;
					break;
				case AS_INVALID_PARAM:
					para.aud_state = FM_AUD_ERROR_INVALIDPARAM;
					break;
				case AS_NOT_READY: 
					para.aud_state = FM_AUD_ERROR_NOTREADY;
					break;
				case AS_MESSAGING_ERR:
					para.aud_state = FM_AUD_ERROR_MSGING;
					break;
				case AS_FFS_ERR:
					para.aud_state = FM_AUD_ERROR_FFS;
					break;
				case AS_PLAYER_ERR:  
					para.aud_state = FM_AUD_ERROR_PLAYER;
					break;
				case AS_DENIED:
					para.aud_state = FM_AUD_ERROR_DENIED;
					break;
				case AS_AUDIO_ERR:
					para.aud_state = FM_AUD_ERROR_AUDIO;
					break;
				case AS_NOT_ALLOWED:
					para.aud_state = FM_AUD_ERROR_NOTALLOWED;
					break;
				default:
					para.aud_state = FM_AUD_NONE;
			}
			/* June 28, 2007 DRT: OMAPS00135749 x0062174 */
			mmi_set_aud_state_status( FM_AUD_NONE);

			 /* OMAPS00151698, x0056422 */
                  #ifdef FF_MMI_A2DP_AVRCP
                  tGlobalBmiBtStruct.tAudioState = FM_AUD_NONE;
                  /* x0056422, updated changes from this ID  */ 
				  /*OMAPS001448610 : This callback code is removed since L1 sends the callback to BT for
                                                  stop playback irrespective of whether the stop is due to end of media or is user prompted. */
                    tGlobalBmiBtStruct.tCmdSrc = BMI_BT_COMMAND_NONE;

                  #endif//FF_MMI_A2DP_AVRCP
				  /* OMAPS00151698, x0056422 */
			mfw_fm_signal(E_FM_AUDIO_STOP, &para);
			break;

	case AS_PROBAR_IND:
			TRACE_EVENT_P2("pt %d  tt %d",mp3_pb->u32TotalTimePlayed, mp3_pb->u32totalTimeEst);
			para_aud.aud_pt = mp3_pb->u32TotalTimePlayed + last_para_aud_pt;			//Daisy tang added for Real Resume feature 20071107
			para_aud.aud_tt = mp3_pb->u32totalTimeEst;
			mfw_fm_signal(E_FM_AUDIO_PROG, NULL);
			break;
	}	
	return;

}

/*******************************************************************************
 $Function:		mfw_fm_aud_get_type

 $Description:		Deduces the type of audio file

 $Returns:		audio file type

 $Arguments:		file_name	: audio file 
*******************************************************************************/
T_FM_OBJ_TYPE mfw_fm_aud_get_type(char * file_name)
{
	T_AS_PLAYER_TYPE player_type;
	UINT16 filename_uc[47];
	TRACE_FUNCTION("mfw_fm_aud_get_type");

	convert_u8_to_unicode(file_name, filename_uc);
	as_deduce_player_type(filename_uc,&player_type);
	switch(player_type)
	{
		case AS_PLAYER_TYPE_MIDI:
			TRACE_EVENT("AS_PLAYER_TYPE_MIDI");
			return OBJECT_TYPE_AUDIO_MIDI;
		case AS_PLAYER_TYPE_MP3:
			TRACE_EVENT("AS_PLAYER_TYPE_MP3");
			return OBJECT_TYPE_AUDIO_MP3;
		case AS_PLAYER_TYPE_AAC:
			TRACE_EVENT("AS_PLAYER_TYPE_AAC");
			return OBJECT_TYPE_AUDIO_AAC;
		default:
			TRACE_EVENT("Default");
			return OBJECT_TYPE_FILE;
	}
}
 
/*******************************************************************************
 $Function:		mfw_fm_audPlay

 $Description:		Plays the selected audio file

 $Returns:		None
  
 $Arguments:		file_name	: audio file 
 				file_type		: audio file type
*******************************************************************************/
#ifdef FF_MMI_UNICODE_SUPPORT
T_FM_AUD_STATE mfw_fm_audPlay(T_WCHAR * filename_uc, T_FM_OBJ_TYPE file_type, BOOL play_bar)
{

#else 
T_FM_AUD_STATE mfw_fm_audPlay(char * file_name, T_FM_OBJ_TYPE file_type, BOOL play_bar)
{
	UINT16 filename_uc[FM_MAX_DIR_PATH_LENGTH];
	
	convert_u8_to_unicode(file_name, filename_uc);
#endif
	T_AS_RET status;
	T_AS_PLAYER_TYPE player_type;
    int i=0;

	TRACE_FUNCTION("mfw_fm_audPlay");

	//Daisy tang added for Real Resume feature 20071107
	//start
	#ifdef FF_MMI_UNICODE_SUPPORT
	   for(i==0;i<FM_MAX_DIR_PATH_LENGTH;i++)
	   	{
	   	last_inputFileName_uc[i]=filename_uc[i];
	   	}
	
	#else
	strcpy(last_inputFileName, file_name); 
	#endif
	last_file_type = file_type;
	last_play_bar = play_bar;
	last_file_size_played = 0;
	last_para_aud_pt = 0;
	//end
	switch(file_type)
	{
		case OBJECT_TYPE_AUDIO_MIDI:
			TRACE_EVENT("AS_PLAYER_TYPE_MIDI");
			
			/* Aug 27, 2007    DRT: OMAPS00137370  x0045876 */
			/* Voice Limit parameter should be saved to a temp var before playing 
			   MP3 or AAC file */
			player_para.midi.voice_limit = mfw_player_midi_get_voice_limit();
			/* Apr 10, 2007    DRT: OMAPS00125309  x0039928 */
			/* MONO is 1 and STEREO is 2 for midi player*/
		 	player_para.midi.output_channels = player_channel;	 
			player_type = AS_PLAYER_TYPE_MIDI;
			break;
		case OBJECT_TYPE_AUDIO_MP3:
			TRACE_EVENT("AS_PLAYER_TYPE_MP3");

			/* Aug 27, 2007    DRT: OMAPS00137370  x0045876 */
			/* Voice Limit parameter should be saved to a temp var before playing 
			   MP3 or AAC file */
			mfw_player_set_voice_limit (player_para.midi.voice_limit);
			/* Apr 10, 2007    DRT: OMAPS00125309  x0039928 */
			/* MONO is 0 and STEREO is 1 for mp3 player*/
			player_para.mp3.mono_stereo = player_channel - 1;
			player_para.mp3.size_file_start = 0;
			player_type = AS_PLAYER_TYPE_MP3;
			break;
		case OBJECT_TYPE_AUDIO_AAC:
			TRACE_EVENT("AS_PLAYER_TYPE_AAC");

			/* Aug 27, 2007    DRT: OMAPS00137370  x0045876 */
			/* Voice Limit parameter should be saved to a temp var before playing 
			   MP3 or AAC file */
			mfw_player_set_voice_limit (player_para.midi.voice_limit);
			/* Apr 10, 2007    DRT: OMAPS00125309  x0039928 */
			/* MONO is 0 and STEREO is 1 for aac player*/
			player_para.aac.mono_stereo = player_channel - 1 ;
			player_para.aac.size_file_start= 0;
			player_type = AS_PLAYER_TYPE_AAC;
			break;
		default:
			/* Aug 27, 2007    DRT: OMAPS00137370  x0045876 */
			/* Voice Limit parameter should be saved to a temp var before playing 
			   MP3 or AAC file */
			player_para.midi.voice_limit = mfw_player_midi_get_voice_limit();
			/* Apr 10, 2007    DRT: OMAPS00125309  x0039928 */
			/* MONO is 1 and STEREO is 2 for midi player*/
			player_para.midi.output_channels = player_channel;	
			player_type = AS_PLAYER_TYPE_MIDI;
			break;
	}
	as_player_set_params(player_type,&player_para);

	mfw_set_stereo_path(mfw_get_current_audioDevice());
	fm_aud_return_path.addr_id = 0;
	fm_aud_return_path.callback_func = mfw_fm_audPlay_cb;

	status=as_play_file(player_type,filename_uc,AS_VOLUME_HIGH,mfw_player_playback_loop_flag,play_bar,&fm_aud_return_path);
	if(status == AS_OK)
		return FM_AUD_NO_ERROR;
	else
		return FM_AUD_ERROR;
}

/*******************************************************************************
 $Function:		mfw_fm_audStop

 $Description:		Stops playing the selected audio file

 $Returns:		None

 $Arguments:		file_name	: audio file 
 				file_type		: audio file type
*******************************************************************************/
T_FM_AUD_STATE mfw_fm_audStop(void)
{
	T_AS_RET status;
	TRACE_EVENT("mfw_fm_audStop");
	fm_aud_return_path.addr_id = 0;
	fm_aud_return_path.callback_func = mfw_fm_audPlay_cb;
	status=as_stop(&fm_aud_return_path);
	if(status == AS_OK)
		return FM_AUD_NO_ERROR;
	else
		return FM_AUD_ERROR;
}  

T_FM_AUD_STATE mfw_fm_audPause(void)
{
	T_AS_RET status;
	TRACE_EVENT("mfw_fm_audPause");
	fm_aud_return_path.addr_id = 0;
	fm_aud_return_path.callback_func = mfw_fm_audPlay_cb;
	status=as_pause(&fm_aud_return_path);
	if(status == AS_OK)
		return FM_AUD_NO_ERROR;
	else
		return FM_AUD_ERROR;
}  

T_FM_AUD_STATE mfw_fm_audResume(void)
{
	T_AS_RET status;
	TRACE_EVENT("mfw_fm_audResume");
	fm_aud_return_path.addr_id = 0;
	fm_aud_return_path.callback_func = mfw_fm_audPlay_cb;
	 mmi_set_aud_state_status( FM_AUD_PLAY);


	/* OMAPS00151698, x0056422 */
    #ifdef FF_MMI_A2DP_AVRCP
    tGlobalBmiBtStruct.tAudioState = FM_AUD_PLAY;
    if(tGlobalBmiBtStruct.bConnected != BMI_BT_NOTCONNECTED)
    {
            /*OMAPS001448610 : This check for Headset/handset command is to be removed since the handling is now exactly the same. */
            if(NULL != tGlobalBmiBtStruct.BmiEventCallback)
                tGlobalBmiBtStruct.BmiEventCallback(BMI_EVENT_USER_RESUME);           
            tGlobalBmiBtStruct.tCmdSrc = BMI_BT_COMMAND_NONE;

	 }  
	#endif//FF_MMI_A2DP_AVRCP

	/* OMAPS00151698, x0056422 */
	status=as_resume(&fm_aud_return_path);
	if(status == AS_OK)
		return FM_AUD_NO_ERROR;
	else
		return FM_AUD_ERROR;
}  
//Daisy tang added for Real Resume feature 20071107
//start
T_FM_AUD_STATE mfw_fm_audRealPause(void)
{
	T_AS_RET status;
	TRACE_EVENT("mfw_fm_audRealPause");
	isPlayer_Real_Pause = TRUE;

	fm_aud_return_path.addr_id = 0;
	fm_aud_return_path.callback_func = mfw_fm_audPlay_cb;
	status=as_stop(&fm_aud_return_path);
	if(status == AS_OK)
		return FM_AUD_NO_ERROR;
	else
		return FM_AUD_ERROR;
}  

T_FM_AUD_STATE mfw_fm_audRealResume(void)
{	
	T_AS_RET status;
	T_AS_PLAYER_TYPE player_type;
	UINT16 filename_uc[FM_MAX_DIR_PATH_LENGTH];
	int i=0;

   
	TRACE_FUNCTION("mfw_fm_audRealResume");
	
	if(!isPlayer_Real_Pause)
		return FM_AUD_ERROR; 
	if((last_file_type NEQ OBJECT_TYPE_AUDIO_MP3) AND (last_file_type NEQ OBJECT_TYPE_AUDIO_AAC))
		return FM_AUD_ERROR; 
	
	isPlayer_Real_Pause = FALSE;

	switch(last_file_type)
	{
		case OBJECT_TYPE_AUDIO_MP3:
			TRACE_EVENT("AS_PLAYER_TYPE_MP3");

				/* Aug 27, 2007    DRT: OMAPS00137370  x0045876 */
				/* Voice Limit parameter should be saved to a temp var before playing 
				   MP3 or AAC file */
				mfw_player_set_voice_limit (player_para.midi.voice_limit);
				/* Apr 10, 2007    DRT: OMAPS00125309  x0039928 */
				/* MONO is 0 and STEREO is 1 for mp3 player*/
				player_para.mp3.mono_stereo = player_channel - 1;
				player_para.mp3.size_file_start = last_file_size_played;//Daisy tang added for MP3 feature 20071107
				player_type = AS_PLAYER_TYPE_MP3;
				break;
			case OBJECT_TYPE_AUDIO_AAC:
				TRACE_EVENT("AS_PLAYER_TYPE_AAC");

				/* Aug 27, 2007    DRT: OMAPS00137370  x0045876 */
				/* Voice Limit parameter should be saved to a temp var before playing 
				   MP3 or AAC file */
				mfw_player_set_voice_limit (player_para.midi.voice_limit);
				/* Apr 10, 2007    DRT: OMAPS00125309  x0039928 */
				/* MONO is 0 and STEREO is 1 for aac player*/
				player_para.aac.mono_stereo = player_channel - 1 ;
				player_para.aac.size_file_start= last_file_size_played;//Daisy tang added for MP3 feature 20071107

				player_type = AS_PLAYER_TYPE_AAC;
				break;
		}
		as_player_set_params(player_type,&player_para);

		mfw_set_stereo_path(mfw_get_current_audioDevice());
		fm_aud_return_path.addr_id = 0;
		fm_aud_return_path.callback_func = mfw_fm_audPlay_cb;
#ifdef FF_MMI_UNICODE_SUPPORT	
           for(i==0;i<FM_MAX_DIR_PATH_LENGTH;i++)
		   	{
                      filename_uc[i]=last_inputFileName_uc[i];
		   }
#else
		convert_u8_to_unicode(last_inputFileName, filename_uc);
#endif
		status=as_play_file(player_type,filename_uc,AS_VOLUME_HIGH,mfw_player_playback_loop_flag,last_play_bar,&fm_aud_return_path);
		if(status == AS_OK)
			return FM_AUD_NO_ERROR;
		else
			return FM_AUD_ERROR;	
}  
//end


#endif