亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? flashfile.cpp

?? 基于Nuleus操作系統(tǒng)和s3c4510的編寫的EFC。已經(jīng)包含了該EFC的設(shè)計說明。這是個實際產(chǎn)品的代碼
?? CPP
字號:
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2003, Ulink Telecom Equipment Co., Ltd. All rights reserved.
//
// File:
//
//    FlashFile.cpp
//
// Abstract:
//
//    implementation of the CFlashFile class.
//
// History:
//
//    V1.0	2003-02-27	Alex Duan	Original version. (NOTE: file size <= 64k)
//    V1.1	2003-07-04	Alex Duan	Store the file in the continuous address.
//									And all headers are stored in one sector 
//									together. The only restriction of the file 
//									size is the free space of the data area.
//
///////////////////////////////////////////////////////////////////////////////

#include "FlashFile.h"
#include "sfr_4510.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFlashFile::CFlashFile(EFlashType eType)
{
	ROMCON rcRom;
	rcRom.dwReg	 = ROMCON0;
	DWORD dwAddr = rcRom.bits.base;
	dwAddr <<= 16;
	m_cFlash.SetType(eType, dwAddr);
	memset(&m_fhHeader, 0xFF, sizeof(m_fhHeader));
}

CFlashFile::~CFlashFile()
{
	Close(); // Call CFlashFile::Close()
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		lpszFileName	A string that is the name(8.3) of the desired file.
//		nOpenFlags		An UINT that defines the file's access mode.
// Return Value:
//		TRUE if the open was successful; otherwise FALSE. 
// Remarks:
//		Open a flash file for reading/writing/creating.
BOOL CFlashFile::Open(LPCSTR lpszFileName, UINT nOpenFlags)
{	
	ASSERT(lpszFileName);
	
	if (m_nOpenFlags) // file was opened before
		return FALSE;

	BOOL bRetVal = TRUE;
	DWORD dwHeaderAddr;

	m_strFileName = lpszFileName;
	m_nOpenFlags  = nOpenFlags;

	if (nOpenFlags & modeCreate)
	{// required to create a new file
		GetSystemTime(&m_fhHeader.stCreationTime);
		UINT nLen = m_strFileName.GetLength();
		if (nLen > sizeof(m_fhHeader.szFileName) - 1)
			nLen = sizeof(m_fhHeader.szFileName) - 1;
		memcpy(m_fhHeader.szFileName, (LPCSTR)m_strFileName, nLen);
		m_fhHeader.szFileName[nLen] = '\0';
	}
	else if (FindFile(lpszFileName, dwHeaderAddr))
	{// file found
		// copy file header
		m_cFlash.Read(&m_fhHeader, dwHeaderAddr, sizeof(FILE_HEADER));
		if (m_nOpenFlags & modeRead) 
		{// read data from flash to memory file
			BYTE arruBuff[1024];
			DWORD dwAddr = m_fhHeader.dwStartAddr;
			DWORD dwSize = m_fhHeader.dwFileSize;
			UINT nCount = sizeof(arruBuff);
			do 
			{
				if (dwSize < nCount) 
				{
					nCount = dwSize;
				}
				m_cFlash.Read(arruBuff, dwAddr, nCount);
				Write(arruBuff, nCount);

				dwAddr += nCount;
				dwSize -= nCount;
			} while (dwSize);
			SeekToBegin();
		}
	}
	else
	{
		bRetVal = FALSE;
		m_strFileName.Empty();
		m_nOpenFlags = 0;
	}

	return bRetVal;
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		lpszFileName	A string that is the name of the file.
//		dwHeaderAddr	[out] Start Address of the FILE_HEADER structure
// Return Value:
//		TRUE if successful, else FALSE.
// Remarks:
//		Find one file in the flash
BOOL CFlashFile::FindFile(LPCSTR lpszFileName, DWORD &dwHeaderAddr) const
{
	ASSERT(lpszFileName);

	BOOL bRetVal = FALSE;
	FILE_HEADER fhHeader;
	CString strFileName = lpszFileName;
	DWORD dwAddr;

	for (dwAddr = m_cFlash.GetSectorAddr(SECTOR_FHEADER_MIN); 
	dwAddr < m_cFlash.GetSectorNext(SECTOR_FHEADER_MAX);)
	{
		// Here I do not use the code like the following:
		//   FILE_HEADER *pfhHeader = (FILE_HEADER*)dwAddr;
		//	   because I do not know whether dwAddr is even or not and
		//		 whether it is writing/erasing now.
		m_cFlash.Read(&fhHeader, dwAddr, sizeof(FILE_HEADER));
		if (fhHeader.cbSize == (WORD)-1)
		{
			break;
		}
		else if (strFileName == (LPCSTR)(fhHeader.szFileName) && 
			fhHeader.uFileFlag != FILE_FLAG_DELETED)
		{// File name same and no deleted flag
			dwHeaderAddr = dwAddr;
			bRetVal = TRUE;
			break;
		}
		else if (fhHeader.cbSize == 0) 
		{// get rid of dead loop
			ASSERT(FALSE);
			break;
		}
		else
		{
			dwAddr += fhHeader.cbSize;
		}
	}
	return bRetVal;
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		dwHeaderAddr	[out]FILE_HEADER position of the last file
// Return Value:
//		TRUE if file exists, otherwise FALSE
// Remarks:
//		Find the file in the last position
BOOL CFlashFile::FindLastFile(DWORD &dwHeaderAddr) const
{
	FILE_HEADER fhHeader, fhNext;
	DWORD dwAddr; // current record address
	
	for (dwAddr = m_cFlash.GetSectorAddr(SECTOR_FHEADER_MIN); 
	dwAddr < m_cFlash.GetSectorNext(SECTOR_FHEADER_MAX);)
	{
		// Here I do not use the code like the following:
		//   FILE_HEADER *pfhHeader = (FILE_HEADER*)dwAddr;
		//	   because I do not know whether dwAddr is even or not and
		//		 whether it is writing/erasing now.
		m_cFlash.Read(&fhHeader, dwAddr, sizeof(FILE_HEADER));
		m_cFlash.Read(&fhNext, dwAddr + fhHeader.cbSize, sizeof(FILE_HEADER));
		
		if (fhHeader.cbSize == (WORD)-1)
		{// The last file isn't found
			return FALSE;
		}
		else if (fhNext.cbSize == (WORD)-1)
		{// area in the next record address is blank
			dwHeaderAddr = dwAddr;
			return TRUE;
		}
		else if (fhHeader.cbSize == 0) 
		{
			ASSERT(FALSE);
			dwAddr += sizeof(FILE_HEADER);
		}
		else
		{
			dwAddr += fhHeader.cbSize;
		}
	}
	return FALSE;
}

// Close the file and save the file if necessary.
void CFlashFile::Close()
{
	if (m_nOpenFlags & modeWrite)
	{
		if (GetFreeSpace() < m_nFileSize)
		{// file defragment
			Defrag();
		}
		if (GetFreeSpace() >= m_nFileSize)
		{
			VERIFY(SaveFile());
		}
		else
		{
			ASSERT(FALSE);
		}
	}
	m_nPosition  = 0;
	m_nFileSize  = 0;
	m_nOpenFlags = 0;
	memset(&m_fhHeader, 0xFF, sizeof(m_fhHeader));
}

///////////////////////////////////////////////////////////////////////////////
// Return Value:
//		return TRUE if successful, else FALSE.
// Remarks:
//		Remove the file (Set deleted flag). 
BOOL CFlashFile::Remove()
{
	BOOL bRetVal = FALSE;
	DWORD dwHeaderAddr;
	FILE_HEADER fhHeader;

	if (m_nOpenFlags & modeWrite)
	{
		if (FindFile(m_strFileName, dwHeaderAddr))
		{
			m_cFlash.Read(&fhHeader, dwHeaderAddr, sizeof(FILE_HEADER));
			if (fhHeader.uFileFlag != FILE_FLAG_DELETED)
			{
				fhHeader.uFileFlag = FILE_FLAG_DELETED;
				bRetVal = m_cFlash.Write(dwHeaderAddr, &fhHeader, fhHeader.cbSize);
			}
		}
	}
	return bRetVal;
}

///////////////////////////////////////////////////////////////////////////////
// Return Value:
//		TRUE if saved successful, otherwise FALSE.
// Remarks:
//		SaveFile file from memory to the flash
BOOL CFlashFile::SaveFile()
{
	BOOL bRetVal = FALSE; // operation result
	FILE_HEADER fhHeader;
	DWORD dwNewAddr;
	DWORD dwOldAddr;
	BOOL  bOldFound = FALSE; // found old file with the same name

	// set start address of the new file
	if (FindLastFile(dwNewAddr))
	{
		m_cFlash.Read(&fhHeader, dwNewAddr, sizeof(FILE_HEADER));
		m_fhHeader.dwStartAddr = fhHeader.dwStartAddr + fhHeader.dwFileSize;
		dwNewAddr += fhHeader.cbSize; // new record address
		bOldFound = FindFile(m_strFileName, dwOldAddr);
	}
	else
	{
		m_fhHeader.dwStartAddr = m_cFlash.GetSectorAddr(SECTOR_FDATA_MIN);
		ASSERT(m_fhHeader.dwStartAddr != -1);
		dwNewAddr = m_cFlash.GetSectorAddr(SECTOR_FHEADER_MIN);
		ASSERT(dwNewAddr != -1);
	}

	// set other file parameters
	m_fhHeader.cbSize = sizeof(FILE_HEADER);
	m_fhHeader.dwFileSize = m_nFileSize;
	GetSystemTime(&m_fhHeader.stLastWriteTime);
	
	// save new record of the FILE_HEADER
	bRetVal = m_cFlash.Write(dwNewAddr, &m_fhHeader, m_fhHeader.cbSize);

	BYTE arruBuff[1024];
	UINT nCount;
	SeekToBegin();
	DWORD dwAddr = m_fhHeader.dwStartAddr;
	do
	{
		nCount = Read(arruBuff, sizeof(arruBuff));
		bRetVal = m_cFlash.Write(dwAddr, arruBuff, nCount);
		dwAddr += nCount;
	} while (bRetVal && nCount != 0);
	if (bRetVal && bOldFound)
	{// delet old file
		FILE_HEADER fhHeader;
		m_cFlash.Read(&fhHeader, dwOldAddr, sizeof(FILE_HEADER));
		fhHeader.uFileFlag = FILE_FLAG_DELETED;
		bRetVal = m_cFlash.Write(dwOldAddr, &fhHeader, fhHeader.cbSize);
	}
	return bRetVal;
}

// file sectors defragment
void CFlashFile::Defrag()
{
	CString strFileName;
	FILE_HEADER fhHeader;
	CFlashFile *pFile = NULL;
	CMap<CString, LPCSTR, CFlashFile*, CFlashFile*&> mapFiles;
	DWORD dwAddr;
	
	// Open all files to memory
	for (dwAddr = m_cFlash.GetSectorAddr(SECTOR_FHEADER_MIN); 
	dwAddr < m_cFlash.GetSectorNext(SECTOR_FHEADER_MAX);)
	{
		m_cFlash.Read(&fhHeader, dwAddr, sizeof(FILE_HEADER));
		if (fhHeader.cbSize == (WORD)-1)
		{
			break;
		}
		else if (fhHeader.uFileFlag != FILE_FLAG_DELETED)
		{
			strFileName = (LPCSTR)fhHeader.szFileName;
			pFile = new CFlashFile;
			ASSERT(pFile);
			pFile->Open(strFileName, CFile::modeReadWrite);
			mapFiles.SetAt(strFileName, pFile);
		}
		dwAddr += fhHeader.cbSize ? fhHeader.cbSize : sizeof(FILE_HEADER);
	}

	// Erase all sectors used by file system
	UINT i;
	for (i = SECTOR_FHEADER_MIN; i <= SECTOR_FHEADER_MAX; i++)
	{
		VERIFY(m_cFlash.EraseSector(i));
	}
	for (i = SECTOR_FDATA_MIN; i <= SECTOR_FDATA_MAX; i++)
	{
		VERIFY(m_cFlash.EraseSector(i));
	}
	
	// Close the opened files (will save to flash) & free memory
	POSITION pos = mapFiles.GetStartPosition();
	while (pos != NULL) 
	{
		mapFiles.GetNextAssoc(pos, strFileName, pFile);
		ASSERT(pFile);
		delete pFile;
	}
	mapFiles.RemoveAll();
}

// get free space of the file area.
DWORD CFlashFile::GetFreeSpace() const
{
	DWORD dwSpace;

	FLASH_SECTOR fsMin, fsMax;
	VERIFY(m_cFlash.Lookup(SECTOR_FDATA_MIN, fsMin));
	VERIFY(m_cFlash.Lookup(SECTOR_FDATA_MAX, fsMax));

	DWORD dwAddr;
	if (FindLastFile(dwAddr))
	{
		if (dwAddr + sizeof(FILE_HEADER) >
			m_cFlash.GetSectorNext(SECTOR_FHEADER_MAX))
		{//no space to store FILE_HEADER
			dwSpace = 0;
		}
		else
		{
			FILE_HEADER fhHeader;
			m_cFlash.Read(&fhHeader, dwAddr, sizeof(FILE_HEADER));
			dwSpace = (fsMax.dwAddr + fsMax.dwSize) - 
				(fhHeader.dwStartAddr + fhHeader.dwFileSize);
		}
	}
	else
	{
		dwSpace = fsMax.dwAddr - fsMin.dwAddr + fsMax.dwSize;
	}
	return dwSpace;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美极品aⅴ影院| 久久久久久久免费视频了| 夜夜精品视频一区二区| 在线观看亚洲a| 亚洲高清免费视频| 欧美精品一级二级| 黑人巨大精品欧美黑白配亚洲| 26uuu精品一区二区| 成人免费看的视频| 亚洲午夜在线观看视频在线| 欧美一级一区二区| 国产乱码精品一品二品| 亚洲天堂精品视频| 宅男噜噜噜66一区二区66| 韩国理伦片一区二区三区在线播放| 国产网站一区二区三区| 色综合天天综合网天天狠天天| 亚洲成人7777| 久久久久久久久一| 一本久道久久综合中文字幕| 日精品一区二区| 国产亚洲成年网址在线观看| 欧美午夜一区二区| 国产精品中文欧美| 亚洲曰韩产成在线| 久久精品一区二区三区不卡| 91在线国产福利| 麻豆精品国产91久久久久久| 国产精品久久毛片a| 欧美男生操女生| av午夜一区麻豆| 老司机一区二区| 一区二区三区中文字幕| 久久久美女艺术照精彩视频福利播放| 91丨porny丨在线| 国产原创一区二区| 亚洲成人福利片| 中文幕一区二区三区久久蜜桃| 精品视频123区在线观看| 成人一区在线观看| 麻豆精品蜜桃视频网站| 亚洲夂夂婷婷色拍ww47| 国产精品乱码人人做人人爱 | 日本中文字幕一区| 国产精品久久久久影院老司| 精品少妇一区二区| 欧美日韩国产免费一区二区| 91色视频在线| 国产a久久麻豆| 狂野欧美性猛交blacked| 亚洲一区二区三区在线| 日韩一区中文字幕| 日本一区二区免费在线观看视频| 5858s免费视频成人| 欧美性生交片4| 色综合色综合色综合色综合色综合| 国产一区二区三区av电影| 日韩中文字幕91| 亚洲成人高清在线| 亚洲第一主播视频| 亚洲在线成人精品| 亚洲综合成人在线视频| 亚洲欧美日韩国产手机在线 | 久久精品水蜜桃av综合天堂| 91麻豆精品国产91久久久资源速度| 99精品久久只有精品| 成人av手机在线观看| 国产99久久久精品| 成人永久免费视频| 成人黄动漫网站免费app| 丁香六月综合激情| 丁香五精品蜜臀久久久久99网站| 国产久卡久卡久卡久卡视频精品| 激情综合色丁香一区二区| 另类小说一区二区三区| 极品少妇xxxx偷拍精品少妇| 精品一区二区三区日韩| 国产一区二区三区观看| 国产成人aaa| 成人app软件下载大全免费| 不卡的av网站| 在线视频你懂得一区| 欧美亚洲动漫另类| 欧美丰满少妇xxxbbb| 欧美一区二区三区喷汁尤物| 精品理论电影在线| 久久久久国产成人精品亚洲午夜| 欧美激情资源网| 日韩美女视频19| 亚洲电影第三页| 精品夜夜嗨av一区二区三区| 国产乱人伦精品一区二区在线观看 | 欧美日韩精品一区二区三区| 制服丝袜亚洲播放| 久久综合色之久久综合| 国产精品入口麻豆九色| 亚洲乱码中文字幕| 天天操天天色综合| 精品夜夜嗨av一区二区三区| 成人va在线观看| 精品视频色一区| 亚洲精品在线三区| 中文字幕一区二区三区蜜月| 一区二区三区在线视频观看| 日本中文一区二区三区| 国产成人午夜高潮毛片| 91丨porny丨蝌蚪视频| 欧美一区二区视频在线观看2022 | 在线视频国内自拍亚洲视频| 4438亚洲最大| 久久综合九色综合97婷婷女人| 国产精品国产自产拍高清av | 日韩电影在线免费看| 国产大陆亚洲精品国产| 欧美性猛交xxxx乱大交退制版 | 青青草97国产精品免费观看无弹窗版| 黄页网站大全一区二区| 一本久道中文字幕精品亚洲嫩| 在线综合亚洲欧美在线视频| 国产精品毛片无遮挡高清| 亚欧色一区w666天堂| 成人网在线免费视频| 欧美乱熟臀69xxxxxx| 亚洲国产成人一区二区三区| 首页综合国产亚洲丝袜| www.成人网.com| 精品国产乱码91久久久久久网站| 日韩美女啊v在线免费观看| 美女精品一区二区| 欧美优质美女网站| 中文字幕在线一区| 国产精品一区二区三区四区| 欧美日韩国产片| 亚洲激情自拍视频| 国产91色综合久久免费分享| 91精品国产91热久久久做人人 | 99re这里只有精品首页| 精品久久五月天| 天天色图综合网| 91视频在线观看| 欧美韩国一区二区| 玖玖九九国产精品| 欧美美女bb生活片| 亚洲综合色噜噜狠狠| heyzo一本久久综合| 久久久精品国产免大香伊| 日本不卡视频一二三区| 欧美色中文字幕| 一级精品视频在线观看宜春院| 成人高清av在线| 欧美高清在线一区| 国产黄色精品视频| 久久综合五月天婷婷伊人| 日本不卡视频在线| 91精品国产91综合久久蜜臀| 亚洲成人av一区二区| 欧美色视频一区| 午夜日韩在线观看| 7777精品伊人久久久大香线蕉最新版| 亚洲女同ⅹxx女同tv| 91网页版在线| 亚洲精品国久久99热| 99免费精品在线观看| 亚洲视频综合在线| 91亚洲资源网| 亚洲精品国产品国语在线app| 91在线播放网址| 伊人性伊人情综合网| 欧美中文字幕久久| 亚洲成人午夜电影| 91精品国产福利| 激情综合亚洲精品| 久久精品一区二区三区四区| 国产夫妻精品视频| 最新国产精品久久精品| 色狠狠综合天天综合综合| 一区二区三区精品在线| 欧美日本韩国一区二区三区视频| 日韩成人免费电影| 欧美电影免费观看高清完整版在线观看| 奇米影视7777精品一区二区| 欧美www视频| 成人app网站| 亚洲成人激情社区| 精品久久人人做人人爰| 成人免费视频视频| 亚洲人成小说网站色在线 | 国产一区二区0| 国产精品久久毛片av大全日韩| 色综合久久久久久久| 五月激情综合色| 精品国内二区三区| 91网站最新地址| 日韩精品一区第一页| 久久亚洲二区三区| 色综合色综合色综合 | 国产在线一区观看| 中文字幕日韩欧美一区二区三区| 欧洲生活片亚洲生活在线观看| 日本欧美一区二区三区|