Contents |
Most applications need some way to store persistent data. In most cases, the use of ini files is the easiest way to achieve this. Here's a simple setting class providing both loading and storing methods.
#ifndef SETTINGS_H
#define SETTINGS_H
#include <e32base.h> // CBase
#include <e32def.h> // TBool
class CApaApplication;
class CSettings : public CBase
{
public:
CSettings(CApaApplication& aApp);
void ConstructL();
void LoadL();
void StoreL();
public:
TBool iStartOnBackground;
// Other settings...
private:
CApaApplication& iApp;
};
#endif
And the class implementation could be something like this:
#include "Settings.h"
#include "YourApp.h"
#include <coemain.h> // CCoeEnv
#include <s32stor.h> // CDictionaryStore
CSettings::CSettings(CApaApplication& aApp) : iApp(aApp)
{}
void CSettings::ConstructL()
{
LoadL();
}
void CSettings::LoadL()
{
CDictionaryStore* iniFile = iApp.OpenIniFileLC(CCoeEnv::Static()->FsSession());
if (iniFile->IsPresentL(KYourAppUid))
{
RDictionaryReadStream readStream;
readStream.OpenLC(*iniFile, KYourAppUid);
TUint16 version = static_cast<TUint16> (readStream.ReadUint16L());
iStartOnBackground = static_cast<TBool> (readStream.ReadInt8L());
// Initialize other settings
CleanupStack::PopAndDestroy(&readStream);
}
else
{
// ini doesn't exist, so use default values
iStartOnBackground = EFalse;
}
CleanupStack::PopAndDestroy(iniFile);
}
void CSettings::StoreL()
{
CDictionaryStore* iniFile = iApp.OpenIniFileLC(CCoeEnv::Static()->FsSession());
RDictionaryWriteStream writeStream;
writeStream.AssignLC(*iniFile, KYourAppUid);
// You may support some simple versioning if you wish
writeStream.WriteInt16L(KYourAppVersion);
writeStream.WriteInt8L(iStartOnBackground);
writeStream.CommitL();
iniFile->CommitL();
CleanupStack::PopAndDestroy(2, iniFile);
}
You should keep in mind to override your Application's OpenIniFileLC(), as some frameworks (Avkon for instance) disable ini file creation by default.
CDictionaryStore* CYourApp::OpenIniFileLC(RFs& aFs) const
{
return CEikApplication::OpenIniFileLC(aFs);
}
A good place to instantiate your setting class could be in your Document or AppUi classes:
void CYourAppDocument::ConstructL()
{
// Load settings from ini file
iSettings = new(ELeave) CSettings(*Application());
iSettings->ConstructL();
}
CYourAppDocument::~CYourAppDocument()
{
delete iSettings;
}