/*
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
#include "creator_model.h"
#include "creator_traces.h"
#include "creator_factory.h"
#include <aknlists.h>
#include <AknsSkinInstance.h>
#include <data_caging_path_literals.hrh>
const TInt KReadBufSize = 8192;
// Creator random data file filter
_LIT(KRandomDataFileFilter, "*.creatordataxml");
// ---------------------------------------------------------------------------
CCommandParser* CCommandParser::NewL(CCreatorEngine* aEngine)
{
CCommandParser* self = CCommandParser::NewLC(aEngine);
CleanupStack::Pop(self);
return self;
}
CCommandParser* CCommandParser::NewLC(CCreatorEngine* aEngine)
{
CCommandParser* self = new (ELeave) CCommandParser;
CleanupStack::PushL(self);
self->ConstructL(aEngine);
return self;
}
CCommandParser::CCommandParser()
{
}
void CCommandParser::ConstructL(CCreatorEngine* aEngine)
{
LOGSTRING("Creator: CCommandParser::ConstructL");
iEngine = aEngine;
iReadBuf = HBufC8::NewL(KReadBufSize);
}
CCommandParser::~CCommandParser()
{
LOGSTRING("Creator: CCommandParser::~CCommandParser");
if (iSearchArray)
delete iSearchArray;
if (iReadBuf)
delete iReadBuf;
}
// ---------------------------------------------------------------------------
//#if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
void CCommandParser::OpenScriptL() {}
TBool CCommandParser::OpenScriptL(RFile& aScriptFile)
{
LOGSTRING("Creator: CCommandParser::OpenScriptL");
TBool ret = EFalse;
// init the search array
iSearchArray = new(ELeave) CDesCArrayFlat(500);
// wait dialog
CAknGlobalNote* waitDialog = CAknGlobalNote::NewLC();
waitDialog->SetSoftkeys(R_AVKON_SOFTKEYS_CANCEL);
TInt dialogId = waitDialog->ShowNoteL(EAknGlobalWaitNote, _L("Searching"));
// search all the .creator files from the phone
TInt err;
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\system\\apps\\Creator\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\data\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\data\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\documents\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\documents\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\creator\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\creator\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\scripts\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\scripts\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\temp\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\temp\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\system\\temp\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\system\\temp\\")));
TRAP(err, FindFiles(_L("*.creatorxml"), _L("\\private\\20011383\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\private\\20011383\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creatorxml"), _L("\\private\\1000484b\\")));
// remove the wait dialog
waitDialog->CancelNoteL(dialogId);
CleanupStack::PopAndDestroy(); //waitDialog;
if ( iSearchArray->MdcaCount() > 0)
{
// create a file name array based on the iSearchArray
CDesCArray* fileNameArray = new(ELeave) CDesCArrayFlat(iSearchArray->MdcaCount());
CleanupStack::PushL(fileNameArray);
for (TInt i=0; i<iSearchArray->MdcaCount(); i++)
{
TParse filename; // file name parser
filename.Set(iSearchArray->MdcaPoint(i), NULL, NULL);
if ( filename.Drive()[0] == 'e' || filename.Drive()[0] == 'E') // MMC
{
TFileName nameMMC;
nameMMC.Append(filename.Name());
nameMMC.Append(_L("\t0")); // MMC icon
fileNameArray->AppendL(nameMMC);
}
else
{
fileNameArray->AppendL(filename.Name());
}
}
CleanupStack::Pop(fileNameArray);
// create a popup list
CAknSinglePopupMenuStyleListBox* listBox = new(ELeave) CAknSinglePopupMenuStyleListBox;
CleanupStack::PushL(listBox);
CAknPopupList* popupList = CAknPopupList::NewL( listBox, R_AVKON_SOFTKEYS_SELECT_CANCEL, AknPopupLayouts::EMenuWindow );
CleanupStack::PushL(popupList);
popupList->SetTitleL(_L("Select script"));
listBox->ConstructL( popupList, EAknListBoxSelectionList|EAknListBoxLoopScrolling );
listBox->CreateScrollBarFrameL( ETrue );
listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
listBox->Model()->SetItemTextArray( fileNameArray );
listBox->Model()->SetOwnershipType( ELbmOwnsItemArray ); // !!!
listBox->HandleItemAdditionL();
// define MMC icon
MAknsSkinInstance* skin = AknsUtils::SkinInstance();
_LIT( KFLDMemoryCardUiBitmapFile, "z:aknmemorycardui.mbm" );
CAknIconArray* iconArray = new( ELeave ) CAknIconArray( 1 );
listBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
TParse* fp = new(ELeave) TParse();
fp->Set(KFLDMemoryCardUiBitmapFile, &KDC_APP_BITMAP_DIR, NULL);
TFileName resourceFileName( fp->FullName() );
delete fp;
CGulIcon* icon = AknsUtils::CreateGulIconL( skin, KAknsIIDQgnIndiMmcAdd,
resourceFileName,
EMbmAknmemorycarduiQgn_indi_mmc_add,
EMbmAknmemorycarduiQgn_indi_mmc_add_mask );
CleanupStack::PushL( icon );
iconArray->AppendL( icon );
CleanupStack::Pop( icon );
// execute dialog
TBool result = popupList->ExecuteLD();
CleanupStack::Pop(); // popupList
if ( result )
{
// open the file for reading
//RFile file;
TRAPD(err, aScriptFile.Open(CEikonEnv::Static()->FsSession(), iSearchArray->MdcaPoint(listBox->CurrentItemIndex()), EFileRead));
if( err != KErrNone)
{
aScriptFile.Close();
User::Leave(err);
}
ret = ETrue;
}
CleanupStack::PopAndDestroy(); //listBox
}
else // no scripts found from the search paths
{
CAknInformationNote* note = new (ELeave) CAknInformationNote;
note->ExecuteLD(_L("No scripts found"));
}
delete iSearchArray;
iSearchArray = NULL;
return ret;
}
/*
#else
// ---------------------------------------------------------------------------
void CCommandParser::OpenScriptL()
{
LOGSTRING("Creator: CCommandParser::OpenScriptL");
// init the search array
iSearchArray = new(ELeave) CDesCArrayFlat(500);
// wait dialog
CAknGlobalNote* waitDialog = CAknGlobalNote::NewLC();
waitDialog->SetSoftkeys(R_AVKON_SOFTKEYS_CANCEL);
TInt dialogId = waitDialog->ShowNoteL(EAknGlobalWaitNote, _L("Searching"));
// search all the .creator files from the phone
TInt err;
TRAP(err, FindFiles(_L("*.creator"), _L("\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\system\\apps\\Creator\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\data\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\data\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\documents\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\documents\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\creator\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\creator\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\scripts\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\scripts\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\temp\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\temp\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\system\\temp\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\system\\temp\\")));
TRAP(err, FindFiles(_L("*.creator"), _L("\\private\\101FA751\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\private\\101FA751\\")));
TRAP(err, FindFilesRecursiveL(_L("*.creator"), _L("\\private\\1000484b\\")));
// remove the wait dialog
waitDialog->CancelNoteL(dialogId);
CleanupStack::PopAndDestroy(); //waitDialog;
if ( iSearchArray->MdcaCount() > 0)
{
// create a file name array based on the iSearchArray
CDesCArray* fileNameArray = new(ELeave) CDesCArrayFlat(iSearchArray->MdcaCount());
CleanupStack::PushL(fileNameArray);
for (TInt i=0; i<iSearchArray->MdcaCount(); i++)
{
TParse filename; // file name parser
filename.Set(iSearchArray->MdcaPoint(i), NULL, NULL);
if ( filename.Drive()[0] == 'e' || filename.Drive()[0] == 'E') // MMC
{
TFileName nameMMC;
nameMMC.Append(filename.Name());
nameMMC.Append(_L("\t0")); // MMC icon
fileNameArray->AppendL(nameMMC);
}
else
{
fileNameArray->AppendL(filename.Name());
}
}
CleanupStack::Pop(fileNameArray);
// create a popup list
CAknSinglePopupMenuStyleListBox* listBox = new(ELeave) CAknSinglePopupMenuStyleListBox;
CleanupStack::PushL(listBox);
CAknPopupList* popupList = CAknPopupList::NewL( listBox, R_AVKON_SOFTKEYS_SELECT_CANCEL, AknPopupLayouts::EMenuWindow );
CleanupStack::PushL(popupList);
popupList->SetTitleL(_L("Select script"));
listBox->ConstructL( popupList, EAknListBoxSelectionList|EAknListBoxLoopScrolling );
listBox->CreateScrollBarFrameL( ETrue );
listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
listBox->Model()->SetItemTextArray( fileNameArray );
listBox->Model()->SetOwnershipType( ELbmOwnsItemArray ); // !!!
listBox->HandleItemAdditionL();
// define MMC icon
MAknsSkinInstance* skin = AknsUtils::SkinInstance();
_LIT( KFLDMemoryCardUiBitmapFile, "z:aknmemorycardui.mbm" );
CAknIconArray* iconArray = new( ELeave ) CAknIconArray( 1 );
listBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
TParse* fp = new(ELeave) TParse();
fp->Set(KFLDMemoryCardUiBitmapFile, &KDC_APP_BITMAP_DIR, NULL);
TFileName resourceFileName( fp->FullName() );
delete fp;
CGulIcon* icon = AknsUtils::CreateGulIconL( skin, KAknsIIDQgnIndiMmcAdd,
resourceFileName,
EMbmAknmemorycarduiQgn_indi_mmc_add,
EMbmAknmemorycarduiQgn_indi_mmc_add_mask );
CleanupStack::PushL( icon );
iconArray->AppendL( icon );
CleanupStack::Pop( icon );
// execute dialog
TBool result = popupList->ExecuteLD();
CleanupStack::Pop(); // popupList
if ( result )
{
// open the file for reading
RFile file;
User::LeaveIfError(file.Open(CEikonEnv::Static()->FsSession(), iSearchArray->MdcaPoint(listBox->CurrentItemIndex()), EFileRead));
while (ReadLineFromFileL(file) == KErrNone)
{
iReadBuf->Des().Trim(); // delete leading and trailing white space
if (iReadBuf->Length() < 5) // command too short, ignoring...
{
//CEikonEnv::Static()->InfoMsg(_L("Corrupted line"));
}
// check it's a valid line: first char is A-Z and the line ends to ';'
else if (iReadBuf->Des()[0] >= 'A' && iReadBuf->Des()[0] <= 'Z' && iReadBuf->Des()[iReadBuf->Length()-1] == ';')
{
// this line is valid -> parse the command
ParseCommandFromDescriptorL();
}
else
{
//CEikonEnv::Static()->InfoMsg(_L("Not a valid line"));
}
}
file.Close();
// show a note if there were no valid commands in the script
if (iEngine->CommandArrayCount() == 0)
{
CAknInformationNote* note = new(ELeave) CAknInformationNote;
note->ExecuteLD(_L("No valid commands in this script"));
}
}
CleanupStack::PopAndDestroy(); //listBox
}
else // no scripts found from the search paths
{
CAknInformationNote* note = new (ELeave) CAknInformationNote;
note->ExecuteLD(_L("No scripts found"));
}
delete iSearchArray;
iSearchArray = NULL;
}
#endif
*/
TBool CCommandParser::GetRandomDataFilenameL(TDes& aFilename)
{
LOGSTRING("Creator: CCommandParser::GetRandomDataFilenameL");
TBool ret = EFalse;
// init the search array
if (iSearchArray)
{
delete iSearchArray;
iSearchArray = NULL;
}
iSearchArray = new(ELeave) CDesCArrayFlat(500);
// wait dialog
CAknGlobalNote* waitDialog = CAknGlobalNote::NewLC();
waitDialog->SetSoftkeys(R_AVKON_SOFTKEYS_CANCEL);
TInt dialogId = waitDialog->ShowNoteL(EAknGlobalWaitNote, _L("Searching"));
// search all the creator random data files from the phone
TInt err;
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\system\\apps\\Creator\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\data\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\data\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\documents\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\documents\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\creator\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\creator\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\scripts\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\scripts\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\temp\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\temp\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\system\\temp\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\system\\temp\\")));
TRAP(err, FindFiles(KRandomDataFileFilter, _L("\\private\\20011383\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\private\\20011383\\")));
TRAP(err, FindFilesRecursiveL(KRandomDataFileFilter, _L("\\private\\1000484b\\")));
// remove the wait dialog
waitDialog->CancelNoteL(dialogId);
CleanupStack::PopAndDestroy(); //waitDialog;
if (iSearchArray->MdcaCount() > 0)
{
// create a file name array based on the iSearchArray
CDesCArray* fileNameArray = new(ELeave) CDesCArrayFlat(iSearchArray->MdcaCount() + 1);
CleanupStack::PushL(fileNameArray);
for (TInt i=0; i<iSearchArray->MdcaCount(); i++)
{
TParse filename; // file name parser
filename.Set(iSearchArray->MdcaPoint(i), NULL, NULL);
if ( filename.Drive()[0] == 'e' || filename.Drive()[0] == 'E') // MMC
{
TFileName nameMMC;
nameMMC.Append(filename.Name());
nameMMC.Append(_L("\t0")); // MMC icon
fileNameArray->AppendL(nameMMC);
}
else
{
fileNameArray->AppendL(filename.Name());
}
}
// add "default" (resource file) to list
fileNameArray->AppendL(_L("Default"));
CleanupStack::Pop(fileNameArray);
// create a popup list
CAknSinglePopupMenuStyleListBox* listBox = new(ELeave) CAknSinglePopupMenuStyleListBox;
CleanupStack::PushL(listBox);
CAknPopupList* popupList = CAknPopupList::NewL( listBox, R_AVKON_SOFTKEYS_SELECT_CANCEL, AknPopupLayouts::EMenuWindow );
CleanupStack::PushL(popupList);
popupList->SetTitleL(_L("Select random data file"));
listBox->ConstructL( popupList, EAknListBoxSelectionList|EAknListBoxLoopScrolling );
listBox->CreateScrollBarFrameL( ETrue );
listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
listBox->Model()->SetItemTextArray( fileNameArray );
listBox->Model()->SetOwnershipType( ELbmOwnsItemArray ); // !!!
listBox->HandleItemAdditionL();
// define MMC icon
MAknsSkinInstance* skin = AknsUtils::SkinInstance();
_LIT( KFLDMemoryCardUiBitmapFile, "z:aknmemorycardui.mbm" );
CAknIconArray* iconArray = new( ELeave ) CAknIconArray( 1 );
listBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
TParse* fp = new(ELeave) TParse();
fp->Set(KFLDMemoryCardUiBitmapFile, &KDC_APP_BITMAP_DIR, NULL);
TFileName resourceFileName( fp->FullName() );
delete fp;
CGulIcon* icon = AknsUtils::CreateGulIconL( skin, KAknsIIDQgnIndiMmcAdd,
resourceFileName,
EMbmAknmemorycarduiQgn_indi_mmc_add,
EMbmAknmemorycarduiQgn_indi_mmc_add_mask );
CleanupStack::PushL( icon );
iconArray->AppendL( icon );
CleanupStack::Pop( icon );
// execute dialog
TBool result = popupList->ExecuteLD();
CleanupStack::Pop(); // popupList
if ( result )
{
if (listBox->CurrentItemIndex() == (fileNameArray->Count() - 1))
{
// "default" (resource file) selected
aFilename.Copy(KNullDesC);
}
else
{
// xml file selected
aFilename.Copy(iSearchArray->MdcaPoint(listBox->CurrentItemIndex()));
}
ret = ETrue;
}
CleanupStack::PopAndDestroy(); //listBox
}
else // no random data files found from the search paths
{
CAknInformationNote* note = new (ELeave) CAknInformationNote;
note->ExecuteLD(_L("No random data files found"));
}
delete iSearchArray;
iSearchArray = NULL;
return ret;
}
TInt CCommandParser::FindFilesRecursiveL(const TDesC& aFileName, const TDesC& aPath)
{
return CreatorFileUtils::FindFilesRecursiveL(iSearchArray, aFileName, aPath);
}
TInt CreatorFileUtils::FindFilesRecursiveL(CDesCArrayFlat* aFileArray, const TDesC& aFileName, const TDesC& aPath)
{
TInt err = KErrNone;
CDirScan* scan = CDirScan::NewLC(CEikonEnv::Static()->FsSession());
scan->SetScanDataL(aPath, KEntryAttDir, ESortNone);
CDir* dirEntries = NULL;
for(;;)
{
TRAP(err, scan->NextL(dirEntries));
if (!dirEntries || (err!=KErrNone))
break;
for (TInt i=0; i<dirEntries->Count(); i++)
{
TFileName path(scan->FullPath());
path.Append((*dirEntries)[i].iName);
path.Append(_L("\\"));
FindFiles(aFileArray, aFileName, path);
}
delete(dirEntries);
}
CleanupStack::PopAndDestroy(scan);
return err;
}
TInt CreatorFileUtils::FindFiles(CDesCArrayFlat* aFileArray, const TDesC& aFileName, const TDesC& aPath)
{
TFindFile fileFinder(CEikonEnv::Static()->FsSession());
CDir* fileList;
TInt err = fileFinder.FindWildByDir(aFileName, aPath, fileList);
while (err == KErrNone)
{
for (TInt i=0; i<fileList->Count(); i++)
{
TParse fullentry;
fullentry.Set((*fileList)[i].iName, &fileFinder.File(), NULL);
TRAP(err, aFileArray->AppendL(fullentry.FullName()));
}
delete fileList;
err = fileFinder.FindWild(fileList);
}
return err;
}
// ---------------------------------------------------------------------------
TInt CCommandParser::FindFiles(const TDesC& aFileName, const TDesC& aPath)
{
return CreatorFileUtils::FindFiles(iSearchArray, aFileName, aPath);
}
// ---------------------------------------------------------------------------
TInt CCommandParser::ReadLineFromFileL(RFile& aInputFile)
{
LOGSTRING("Creator: CCommandParser::ReadLineFromFile");
_LIT8(KImcvCRLF, "\r\n");
TInt err = KErrNone;
// Read into the buffer
HBufC8* tempLine = HBufC8::NewLC(KReadBufSize);
TPtr8 buffer = tempLine->Des();
// clear the targer
iReadBuf->Des().Copy(_L(""));
// Get the current file position
TInt filePos = 0;
aInputFile.Seek(ESeekCurrent, filePos);
// Read the buffer
err = aInputFile.Read(buffer);
//end of file?
TInt s = buffer.Length();
if ( s == 0)
err = KErrEof;
if (err == KErrNone)
{
// Copy to the lfcr and then set the file pointer to the point after that
TInt pos = buffer.Find(KImcvCRLF);
if ( pos != -1)
{
iReadBuf->Des().Justify(buffer, pos, ELeft, ' ');
filePos += (pos+2);
// Set the file pointer back to after the lfcr
aInputFile.Seek(ESeekStart, filePos);
}
// Else fill the whole buffer
else
{
iReadBuf->Des().Copy(buffer);
}
}
CleanupStack::PopAndDestroy(); // tempLine
return err;
}
// ---------------------------------------------------------------------------
void CCommandParser::StrParserL(HBufC*& aDestinationBuf, TUint aToken)
{
// store old position
iParserOldPosition = iParserPosition;
// make sure we are not reading outside of buffer
if (iParserPosition >= iReadBuf->Length() - 1)
return;
// read until asked token
do
{
iParserPosition++;
}
while (iReadBuf->Des()[iParserPosition] != aToken && iParserPosition < iReadBuf->Des().Length()-1);
// calculate length of the destination buffer
TInt bufferLength = iParserPosition-iParserOldPosition-1;
// reset the destination buffer
if (aDestinationBuf)
{
delete aDestinationBuf;
aDestinationBuf = NULL;
}
// allocate memory for the destination buffer
aDestinationBuf = HBufC::NewL(bufferLength);
// copy data from the read buffer to the destination buffer
aDestinationBuf->Des().Copy(iReadBuf->Des().Mid(iParserOldPosition+1, bufferLength));
}
// ---------------------------------------------------------------------------
void CCommandParser::StrParserL(HBufC8*& aDestinationBuf, TUint aToken)
{
// store old position
iParserOldPosition = iParserPosition;
// make sure we are not reading outside of buffer
if (iParserPosition >= iReadBuf->Length() - 1)
return;
// read until asked token
do
{
iParserPosition++;
}
while (iReadBuf->Des()[iParserPosition] != aToken && iParserPosition < iReadBuf->Des().Length()-1);
// calculate length of the destination buffer
TInt bufferLength = iParserPosition-iParserOldPosition-1;
// reset the destination buffer
if (aDestinationBuf)
{
delete aDestinationBuf;
aDestinationBuf = NULL;
}
// allocate memory for the destination buffer
aDestinationBuf = HBufC8::NewL(bufferLength);
// copy data from the read buffer to the destination buffer
aDestinationBuf->Des().Copy(iReadBuf->Des().Mid(iParserOldPosition+1, bufferLength));
}
//----------------------------------------------------------------------------
void CCommandParser::HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) // from MMsvSessionObserver
{
}
//----------------------------------------------------------------------------