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

📄 cfileloader.cpp

📁 在SB手机上实现了HVO软件的功能
💻 CPP
字号:
/*
 * HView [c]2004 Marcin Skoczylas, All rights reserved
 *
 * This file is under GPL license, see gpl.txt file
 *
 */

#include "CFileLoader.h"
#include "CHVContainer.h"


CFileLoader::CFileLoader()
{
	User::LeaveIfError(fs.Connect());
	iniFileName.Copy(_L("C:\\SYSTEM\\APPS\\HView\\HView.ini"));
}

CFileLoader::~CFileLoader()
{
	if (fileOpened)
	{
		Close();
	}
	fs.Close();
}

TInt CFileLoader::Open(TFileName openFileName)
{
	LOGF("open:\n");
	LOGD(&openFileName);
	LOGF_noTimeStamp("\n");

	if (fileOpened)
	{
		Close();
	}
	if (rfile.Open(fs, openFileName, EFileRead|EFileShareAny) == KErrNone)
	{
		LOGF("new file opened\n");
		fileOpened = ETrue;

		if (rfile.Size(fileSize) == KErrNone)
		{
			LOGF("file size = %d\n", fileSize);
			nameOpened = openFileName;
			return KErrNone;
		}

		//}
	}
	else
	{
		// yeyeuyeu
		// shut da ehh ;) speedup workz idea: hold two rfiles in memory and switch between them
		if (rfile.Open(fs, nameOpened, EFileRead|EFileShareAny) == KErrNone)
		{
			return KErrNotFound;
		}
		// aaaaa we're dead:(

	}
	fileOpened = false;
	return KErrGeneral;
}

bool CFileLoader::Seek(TInt where)
{
	if ((rfile.Seek(TSeek(ESeekStart), where)) != KErrNone)
	{

		LOGF("seek failed\n");
		return false;
	}
	return true;
	
}


bool CFileLoader::Read(void *buf, TInt size)
{
	/*
	if (!fileOpened || fileLength == 0)
	{
		SYS_Errorf("XFiles: Read: file not opened\n");
	}

	if ((filePos + size) > fileLength)
	{
		SYS_Errorf("XFiles: Read: read size too big\n");
	}

	*/

	TPtr8 bufPtr((unsigned char *)buf, size);

	if ((rfile.Read(bufPtr, size) != KErrNone))
	{
		SYS_Errorf("XFiles: read from file failed\n");
	}

	return true;
}

TInt CFileLoader::ReadOneLineBefore(char *buf, TInt &filePos, TInt maxChars)
{
	bool newLineFound = false;
	char *walkBuf;
	char *reverseBuffer;
	int i, j, x;

	buf[0] = '\n';
	for (i = 1; i < maxChars; i++)
	{
		buf[i] = 0x00;
	}

	if (filePos == 1)
	{
		filePos=0;
		return ERetOllayWneek;
		//return 0;
	}

	reverseBuffer = new char[maxChars];
	walkBuf = reverseBuffer;

	filePos--;

	LOGF("readOneLineBefore: fpos: %d\n", filePos);
	if ((rfile.Seek(TSeek(ESeekStart), filePos)) != KErrNone)
	{
		LOGF("seek failed\n");
		delete [] reverseBuffer;
		return filePos;
	}

	TPtr8 bufPtr((unsigned char *)walkBuf, 1);
	if ((rfile.Read(bufPtr, 1)) != KErrNone)
	{
		LOGF("read failed - eof?\n");
		delete [] reverseBuffer;
		return filePos;
	}

	if (*walkBuf == '\n')
	{
		//LOGF("this line ends with \\n\n");
		newLineFound = true;
		filePos--;
	}

	for (i = 0; i < maxChars; )
	{
		if (filePos < 0)
		{
			LOGF("beginning of file!\n");
			reverseBuffer[i] = '\n';
			reverseBuffer[i+1] = 0x00;			// REMOVE THIS IT'S ONLY FOR DEBUG!
			filePos = 0;
			if (!newLineFound)
			{
				delete [] reverseBuffer;
				return -1;
			}
			break;
		}

		if ((rfile.Seek(TSeek(ESeekStart), filePos)) != KErrNone)
		{
			LOGF("seek failed\n");
			delete [] reverseBuffer;
			return filePos;
		}

		TPtr8 bufPtr((unsigned char *)walkBuf, 1);
		if ((rfile.Read(bufPtr, 1)) != KErrNone)
		{
			LOGF("read failed - eof?\n");
			delete [] reverseBuffer;
			return filePos;
		}
		//LOGF("readed: i=%d fpos: %d %c\n", i, filePos, reverseBuffer[i]);
		if (reverseBuffer[i] == '\n')
		{
			if (!newLineFound)
			{
				delete [] reverseBuffer;
				filePos++;
				return ERetMyk;
			}
			break;
		}
		if (reverseBuffer[i] == '\r')
		{
			filePos--;
			continue;
		}
		i++;
		walkBuf++;
		filePos--;
	}
	// last char
	filePos++;

	x = i-1;
	for (j = 0; j < i; j++)
	{
		buf[j] = reverseBuffer[x--];
	}
	if (j < maxChars)
	{
		buf[j++] = '\n';
	}

	delete [] reverseBuffer;
	return filePos;


}

TInt CFileLoader::ReadOneLine(char *buf, TInt &filePos, TInt maxChars)
{
	char *walkBuf;
	int i;

	buf[0] = '\n';
	for (i = 1; i < maxChars; i++)
	{
		buf[i] = 0x00;
	}

	walkBuf = buf;

	LOGF("readOneLine: fpos: %d\n", filePos);
	if ((rfile.Seek(TSeek(ESeekStart), filePos)) != KErrNone)
	{
		LOGF("seek failed\n");
		return filePos;
	}

	for (i = 0; i < maxChars; )
	{
		if (filePos >= fileSize)
		{
			LOGF("eof!\n");
			buf[i] = '\n';
			buf[i+1] = 0x00;			// REMOVE THIS IT'S ONLY FOR DEBUG!
			break;
		}

		TPtr8 bufPtr((unsigned char *)walkBuf, 1);
		if ((rfile.Read(bufPtr, 1)) != KErrNone)
		{
			LOGF("read failed - eof?\n");
			return filePos;
		}
		if (buf[i] == '\n')
		{
			filePos++;
			break;
		}
		if (buf[i] == '\r')
		{
			filePos++;
			continue;
		}
		i++;
		walkBuf++;
		filePos++;
	}

	return filePos;


}
							   

//TInt CFileLoader::Seek(

TInt CFileLoader::Close()
{
	if (fileOpened)
	{
		LOGF("closing file\n");
		rfile.Close();
	}
	LOGF("Close(): file not opened\n");
	return KErrNone;
}


void CFileLoader::ReadIniFile(TInt &viewMode, TFileName &lastFileName)
{
	/*
	TFileName fName;

	fName.Copy(_L(""));
	
	viewMode = EViewPlain;
	lastFileName = fName;
	return;
	*/

	
	RFile rftemp;

	LOGF("ReadIniFile: how'dyado?\n");


	if (rftemp.Open(fs, iniFileName, EFileRead|EFileShareAny) == KErrNone)
	{
		LOGF("ReadIniFile: i'm in\n");

		unsigned char buffer[162] = {0x00};
		unsigned char *walkBuf;

		TPtr8 bufPtr(buffer, 162);
		
		if (rftemp.Read(bufPtr, 162) == KErrNone)
		{

			LOGF("ReadIniFile: got the buffer");
			walkBuf = buffer;

			walkBuf++;	// H
			walkBuf++;	// V	-- hvini
			walkBuf++;	//		-- version
			walkBuf++;	//		-- version2

			switch (*walkBuf++)
			{
			default:
			case 0x00:
				viewMode = EViewPlain;
				break;

			case 0x01:
				viewMode = EViewBinary;
				break;

			}

			// size
			unsigned char fnameSize = *walkBuf++;

			TPtr8 bufPtr2((unsigned char *)walkBuf, fnameSize, 128);
			
			TFileName fName;
			fName.Copy(bufPtr2);
			
			LOGF("ReadIniFile: got the file name:\n");
			LOGD(&fName);
			LOGF_noTimeStamp("\nShiie!\n");
			
			// the    
			lastFileName = fName;
			//         would      ---?

			LOGF("ReadIniFile: goin' wendy\n");
			rftemp.Close();
			return;
		}
	}

	LOGF("ReadIniFile: not happened, setting delta 0\n");
	TFileName emptyFileName;
	_LIT(empty, "");

	emptyFileName.Copy(empty);

	// the 
	lastFileName = emptyFileName;
	//       will not           ;-)

	viewMode  = EViewPlain;

	LOGF("ReadIniFile: goin' wendy yo?\n");
	rftemp.Close();
	LOGF("ReadIniFile: how about rewrite?\n");
	WriteIniFile(EViewPlain, emptyFileName);
	return;	
}

void CFileLoader::WriteIniFile(TInt viewMode, TFileName lastFileName)
{
	int i;
	RFile fp;
	TInt length;


	LOGF("WriteIniFile: eh eh!\n");

	//_LIT(constIniFileName, "C:\\SYSTEM\\APPS\\HView\\HView.ini");	//SYSTEM\\APPS\\HVIEW

	if (fp.Replace(fs, iniFileName, EFileShareAny|EFileWrite) != KErrNone)
	{	
		LOGF("ini not opened for write :(\n");
		LOGF("try to make new directory\n");
		fs.MkDirAll(iniFileName);
		if (fp.Replace(fs, iniFileName, EFileShareAny|EFileWrite) != KErrNone)
		{	
			LOGF("this didn't help, no ini file at all, see ya\n");
			return;
		}
	}

	LOGF("ini file opened for write;\n");

	unsigned char *buffer;
	unsigned char *walkBuf;

	buffer = new unsigned char[256];

	for (i = 0; i < 256; i++)
		buffer[i] = 0x00;

	walkBuf = buffer;

	*walkBuf++ = (unsigned char)'H';	//marker
	*walkBuf++ = (unsigned char)'V';
	*walkBuf++ = 0x04;	//version
	*walkBuf++ = 0x01;	//

	*walkBuf++ = ((viewMode == EViewPlain)
		? 
		(unsigned char)0x00 : (unsigned char)0x01);

	
	*walkBuf++ = (unsigned char)(lastFileName.Size()/2);

	TBuf8<128> buf8;
	buf8.Copy(lastFileName);
	
	unsigned char *fnameBuf;
	fnameBuf = (unsigned char *)buf8.Ptr();


	for (i = 0; i < 128; i++)
	{
		*walkBuf++ = fnameBuf[i];
	}

	TPtr8 bufPtr((unsigned char *)buffer, 162, 162);
	
	length = 128;

	if (fp.Write(bufPtr) == KErrNone)
	{
		LOGF("WriteIniFile: fly just have sat on the disk\n");
	}
	else
	{
		LOGF("WriteIniFile: unable to catch the fly!\n");
	}
	fp.Close();
	delete buffer;
	return;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -