📄 engine.cpp
字号:
#include <stringloader.h>
#include <Train.rsg>
#include <eikenv.h>
#include <charconv.h>
#include <pathinfo.h>
#include <aknnotedialog.h> // CAknWaitNoteWrapper
#include <eikprogi.h> // CEikProgressInfo
#include "Engine.h"
#include "TSSResult.h"
#include "OTResult.h"
#include "MagicTrain.pan"
#include "MagicTrainAppUi.h"
_LIT(KStationFilePath,"Nokia\\Installs\\DDTrain\\station.dll");
_LIT(KTrainFilePath,"Nokia\\Installs\\DDTrain\\train.dll");
_LIT(KTrainLineFilePath,"Nokia\\Installs\\DDTrain\\trainline.dll");
Engine* Engine::NewL(CMagicTrainAppUi* aAppUi)
{
Engine* self = NewLC(aAppUi);
CleanupStack::Pop(self);
return self;
}
Engine* Engine::NewLC(CMagicTrainAppUi* aAppUi)
{
Engine* self = new (ELeave) Engine(aAppUi);
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
Engine::Engine(CMagicTrainAppUi* aAppUi)
{
iAppUi = aAppUi;
}
Engine::~Engine()
{
if (iProvinceArray) {
iProvinceArray->Reset();
delete iProvinceArray;
}
if (iStationArray) {
iStationArray->ResetAndDestroy();
delete iStationArray;
}
if (iTrainArray) {
iTrainArray->ResetAndDestroy();
delete iTrainArray;
}
if (iTrainDetailArray) {
iTrainDetailArray->ResetAndDestroy();
delete iTrainDetailArray;
}
}
void Engine::ConstructL()
{
iProvinceArray = new (ELeave) RPointerArray<Province>(10);
//ConstructPosL();
ConstructFilePathL();
ConstructStationL();
ConstructTrainL();
ConstructTrainDetailL();
}
void Engine::ConstructPosL()
{
/*
_LIT(KSubPath,"data\\installs\\DoDoTrain\\DoDoTrain.dll");
iPath.Append(_L("Z:\\"));
iPath.Append(KSubPath);
RFs fs;
RFileReadStream rs;
CleanupClosePushL(fs);
CleanupClosePushL(rs);
User::LeaveIfError(fs.Connect());
if ( rs.Open(fs,iPath,EFileRead) != KErrNone) {
iPath.SetLength(0);
iPath.Append(PathInfo::MemoryCardRootPath());
iPath.Append(KSubPath);
rs.Close();
if ( rs.Open(fs,iPath,EFileRead) != KErrNone) {
CleanupStack::PopAndDestroy(2);
Panic(ELoadTrainDLL);
}
}
iCTrainIndexPos = 20;
iStationTrainIndexPos = rs.ReadInt32L();
iStationPos = rs.ReadInt32L();
iStationTrainPos = rs.ReadInt32L();
iTrainPos = rs.ReadInt32L();
iCTrainPos = rs.ReadInt32L();
CleanupStack::PopAndDestroy(2);
*/
}
void Engine::ConstructFilePathSubL(RFs& fs,RFileReadStream& rs,TFileName& aFilePath,TFileName& aSubFilePath)
{
#ifdef _DEBUG
aFilePath.Append(_L("C:\\"));
#else
aFilePath.Append(_L("C:\\"));
#endif
aFilePath.Append(aSubFilePath);
TInt err;
err = rs.Open(fs,aFilePath,EFileRead);
if (err != KErrNone) {
aFilePath.SetLength(0);
aFilePath.Append(PathInfo::MemoryCardRootPath());
aFilePath.Append(aSubFilePath);
rs.Close();
if ( rs.Open(fs,aFilePath,EFileRead) != KErrNone) {
CleanupStack::PopAndDestroy(2);
Panic(ELoadTrainDLL);
}
}
rs.Close();
}
void Engine::ConstructFilePathL()
{
RFs fs;
RFileReadStream rs;
CleanupClosePushL(fs);
CleanupClosePushL(rs);
User::LeaveIfError(fs.Connect());
TFileName SubStationFilePath(KStationFilePath);
TFileName SubTrainFilePath(KTrainFilePath);
TFileName SubTrainLineFilePath(KTrainLineFilePath);
ConstructFilePathSubL(fs,rs,iStationFilePath,SubStationFilePath);
ConstructFilePathSubL(fs,rs,iTrainFilePath,SubTrainFilePath);
ConstructFilePathSubL(fs,rs,iTrainLineFilePath,SubTrainLineFilePath);
CleanupStack::Pop();
CleanupStack::PopAndDestroy();
}
void Engine::ConstructStationL()
{
RFs fs;
RFileReadStream rs;
User::LeaveIfError(fs.Connect());
TInt err = rs.Open(fs,iStationFilePath,EFileRead|EFileStream);
if (err == KErrNotFound) {
Panic(EDataFileNotFound);
}
TInt inputchar;
TInt inputcharnum;
TBuf8<10> inputstr;
TBuf16<5> inputstrutf;
iStationCount = rs.ReadInt16L();
iStationArray = new (ELeave) RPointerArray<Station>(iStationCount);
for (TInt i=0;i<iStationCount;i++) { //3992
Station* station = new (ELeave) Station;
(*station).iID = rs.ReadInt16L();
inputcharnum = 0;
inputstrutf.SetLength(0);
inputchar = rs.ReadInt16L();
while (inputchar != 0) {
inputstrutf.Append(inputchar);
inputcharnum++;
if (inputcharnum == 5) break;
inputchar = rs.ReadInt16L();
}
inputcharnum = 4-inputcharnum;
while ( inputcharnum > 0 ){
rs.ReadInt16L();
inputcharnum = inputcharnum -1;
}
// HBufC* stationname;
// stationname = inputstrutf.Alloc();
(*station).iName = inputstrutf.Alloc();
// station.iName = HBufC::NewL(inputstrutf.Length());
// *(station.iName) = inputstrutf;
iStationArray->Append(station);
}
rs.Close();
fs.Close();
}
void Engine::ConstructTrainL()
{
RFs fs;
RFileReadStream rs;
User::LeaveIfError(fs.Connect());
TInt err = rs.Open(fs,iTrainFilePath,EFileRead|EFileStream);
if (err == KErrNotFound) {
Panic(EDataFileNotFound);
}
// rs.ReadL(iTrainPos);
TInt inputchar;
TInt inputcharnum;
TBuf<20> inputstr;
iTrainCount = rs.ReadInt16L();
iTrainArray = new (ELeave) RPointerArray<CTrain>(iTrainCount);
for (TInt i=0;i<iTrainCount;i++) { //3802
CTrain* train = new (ELeave) CTrain;
//rs.ReadL(2);
train->iID = rs.ReadInt16L();
inputcharnum = 0;
inputstr.SetLength(0);
inputchar = rs.ReadInt8L();
while (inputchar != 0) {
inputstr.Append(inputchar);
inputcharnum++;
if (inputcharnum == 20) break;
inputchar = rs.ReadInt8L();
}
inputcharnum = 19-inputcharnum;
while ( inputcharnum > 0 ){
rs.ReadInt8L();
inputcharnum = inputcharnum -1;
}
train->iType = rs.ReadInt8L();
train->iStartStationID = rs.ReadInt16L();
train->iArriveStationID = rs.ReadInt16L();
rs.ReadL(14);
// CTrain.iName = HBufC::NewL(inputstr.Length());
train->iName = inputstr.Alloc();
iTrainArray->Append(train);
}
rs.Close();
fs.Close();
}
void Engine::ConstructTrainDetailL()
{
RFs fs;
RFileReadStream rs;
User::LeaveIfError(fs.Connect());
TInt err = rs.Open(fs,iTrainLineFilePath,EFileRead|EFileStream);
if (err == KErrNotFound) {
Panic(EDataFileNotFound);
}
iTrainLineCount = rs.ReadUint16L();
iTrainLineCount = iTrainLineCount + rs.ReadUint8L() * 65535;
iTrainDetailArray = new (ELeave) RPointerArray<COTResult>(iTrainLineCount);
for (TInt i=0;i<iTrainLineCount;i++) { //3802
COTResult* traindetail = new (ELeave) COTResult;
rs.ReadInt8L();
rs.ReadInt16L(); //skip 3 bytes.
traindetail->iTrainID = rs.ReadInt16L();
traindetail->iStationID = rs.ReadInt16L();
traindetail->iSort = rs.ReadInt8L();
traindetail->iDate = rs.ReadInt8L();
traindetail->iArriveTime = rs.ReadInt8L();
traindetail->iArriveTime = traindetail->iArriveTime * 100 + rs.ReadInt8L();
traindetail->iStartTime = rs.ReadInt8L();
traindetail->iStartTime = traindetail->iStartTime * 100 + rs.ReadInt8L();
traindetail->iMileAge = rs.ReadInt16L();
traindetail->iHardSeat = rs.ReadInt16L();
traindetail->iSoftSeat = rs.ReadInt16L();
traindetail->iHardBerth = rs.ReadInt16L();
traindetail->iSoftBerth = rs.ReadInt16L();
iTrainDetailArray->Append(traindetail);
}
rs.Close();
fs.Close();
}
TBool Engine::GetTrainByStation(const TDesC& aStation,RPointerArray<COSResult>* aOSResult)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -