📄 cfileloader.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 + -