diff -r 000000000000 -r 164170e6151a gba/gbaserver/src/GbaServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gba/gbaserver/src/GbaServer.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,377 @@ +/* +* Copyright (c) 2007 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: Implementation of CGbaServer +* +*/ + + +#include +#include +#include +#include "GbaServer.h" +#include "GbaSession.h" +#include "GBALogger.h" + +_LIT(KGBAStoreStandardDrive, "C:"); +_LIT(KGbaIniFileName, "GbaConf.ini"); + +const TInt KPrivateFilepathLength = 20; + +// ----------------------------------------------------------------------------- +// CGbaServer::CGbaServer() +// ----------------------------------------------------------------------------- +// +CGbaServer::CGbaServer():CPolicyServer( EPriorityStandard, GBAPolicy, ESharableSessions ) + { + // Implementation not required + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::~CGbaServer() +// ----------------------------------------------------------------------------- +// +CGbaServer::~CGbaServer() + { + GBA_TRACE_DEBUG(("CGbaServer::~CGbaServer")); + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::NewL() +// ----------------------------------------------------------------------------- +// +CGbaServer* CGbaServer::NewL() + { + CGbaServer* self = CGbaServer::NewLC(); + CleanupStack::Pop( self ) ; + return self; + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::NewLC() +// ----------------------------------------------------------------------------- +// +CGbaServer* CGbaServer::NewLC() + { + CGbaServer* self = new (ELeave) CGbaServer(); + CleanupStack::PushL( self ) ; + self->ConstructL() ; + return self; + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::ConstructL() +// ----------------------------------------------------------------------------- +// +void CGbaServer::ConstructL() + { + StartL( KGbaServerName ) ; + iShutdown.ConstructL(); + if(!iShutdown.IsActive()) + { + iShutdown.Start(); + } + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::ConstructL() +// ----------------------------------------------------------------------------- +// +CSession2* CGbaServer::NewSessionL(const TVersion& aVersion, const RMessage2& /*aMessage*/) const + { + GBA_TRACE_DEBUG(("Creating NewSessionL")); + // check we're the right version + if (!User::QueryVersionSupported(TVersion(KGbaServMajorVersionNumber, + KGbaServMinorVersionNumber, + KGbaServBuildVersionNumber), + aVersion)) + { + GBA_TRACE_DEBUG(("Version isn't supported")); + User::Leave(KErrNotSupported); + } + CGbaServerSession* session = CGbaServerSession::NewL(); + return session; + + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::IncrementSessions() +// ----------------------------------------------------------------------------- +// +void CGbaServer::IncrementSessions() + { + GBA_TRACE_DEBUG(("CGbaServer::IncrementSessions")); + iSessionCount++; + iShutdown.Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::DecrementSessions() +// ----------------------------------------------------------------------------- +// +void CGbaServer::DecrementSessions() + { + GBA_TRACE_DEBUG(("CGbaServer::DecrementSessions")); + if ( --iSessionCount == 0 ) + { + if(!iShutdown.IsActive()) + { + iShutdown.Start(); + } + } + GBA_TRACE_DEBUG(("CGbaServer::DecrementSessions END")); + } + + +// ----------------------------------------------------------------------------- +// CGbaServer::ReadOptionL() +// ----------------------------------------------------------------------------- +// +TBool CGbaServer::ReadOptionL(const TUid& aOptionID, TDes8& aValue) const + { + GBA_TRACE_DEBUG(("ReadOptionL")); + TInt pushCount = 0; + TInt result = EFalse; + RFs fs; + + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + pushCount++; + TFindFile folder( fs ); + + TFileName fullPath; + MakePrivateFilenameL(fs, KGbaIniFileName, fullPath); + + TInt err = folder.FindByDir( fullPath, KNullDesC); + + if ( err != KErrNone ) + { + CleanupStack::PopAndDestroy( pushCount ); + return result; + } + else + { + CDictionaryFileStore* pStore = CDictionaryFileStore::OpenLC( fs, fullPath , KGbaIniUid ); + pushCount++; + + if ( pStore->IsPresentL( aOptionID ) ) + { + RDictionaryReadStream drs; + CleanupClosePushL( drs ); + drs.OpenL(*pStore,aOptionID); + + TInt length = drs.ReadInt32L(); + drs.ReadL(aValue,length); + CleanupStack::PopAndDestroy( &drs ); + result = ETrue; + } + } + + CleanupStack::PopAndDestroy( pushCount ); + return result; + } + + + +// ----------------------------------------------------------------------------- +// CGbaServer::WriteOptionL() +// ----------------------------------------------------------------------------- +// +void CGbaServer::WriteOptionL(const TUid& aOptionID, const TDesC8& aValue) const + { + GBA_TRACE_DEBUG(("WriteOptionL")); + TInt pushCount = 0; + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL( fs ); + pushCount++; + TFindFile folder( fs ); + + TFileName fullPath; + MakePrivateFilenameL(fs, KGbaIniFileName, fullPath); + EnsurePathL(fs, fullPath ); + + GBA_TRACE_DEBUG(fullPath); + + TInt err = folder.FindByDir( fullPath, KNullDesC); + + if ( err == KErrNotFound || err == KErrNone ) + { + CDictionaryFileStore* pStore = CDictionaryFileStore::OpenLC( fs, fullPath, KGbaIniUid ); + pushCount++; + + RDictionaryWriteStream wrs; + CleanupClosePushL( wrs ); + wrs.AssignL(*pStore,aOptionID); + + wrs.WriteInt32L(aValue.Length()); + wrs.WriteL(aValue); + wrs.CommitL(); + + pStore->CommitL(); + CleanupStack::PopAndDestroy( &wrs ); + CleanupStack::PopAndDestroy( pushCount ); + GBA_TRACE_DEBUG(aValue); + } + else + { + CleanupStack::PopAndDestroy( pushCount ); + User::LeaveIfError( err ); + } + } + + + +// --------------------------------------------------------------------------- +// CGbaServer::MakePrivateFilenameL() +// --------------------------------------------------------------------------- +// +void CGbaServer::MakePrivateFilenameL(RFs& aFs, const TDesC& aLeafName, + TDes& aNameOut) const + { + aNameOut.Copy(KGBAStoreStandardDrive); + // Get private path + TBuf privatePath; + aFs.PrivatePath(privatePath); + aNameOut.Append(privatePath); + aNameOut.Append(aLeafName); + } + + +// --------------------------------------------------------------------------- +// CGbaServer::EnsurePathL() +// --------------------------------------------------------------------------- +// +void CGbaServer::EnsurePathL( RFs& aFs, const TDesC& aFile ) const + { + TInt err = aFs.MkDirAll(aFile); + if (err != KErrNone && err != KErrAlreadyExists) + { + User::Leave(err); + } + } + + +// ----------------------------------------------------------------------------- +// CShutdown::CShutdown +// ----------------------------------------------------------------------------- +// +inline CShutdown::CShutdown() + :CTimer(-1) + { + CActiveScheduler::Add(this); + } + + +// ----------------------------------------------------------------------------- +// CShutdown::ConstructL +// ----------------------------------------------------------------------------- +// +inline void CShutdown::ConstructL() + { + CTimer::ConstructL(); + } + + +// ----------------------------------------------------------------------------- +// CShutdown::Start +// ----------------------------------------------------------------------------- +// +inline void CShutdown::Start() + { + GBA_TRACE_DEBUG(("GbaServer: starting shutdown timeout")); + After( EGbaServerShutdownDelay ); + } + + +// ----------------------------------------------------------------------------- +// CShutdown::RunL +// ----------------------------------------------------------------------------- +// +void CShutdown::RunL() + { + GBA_TRACE_DEBUG(("GbaServer: server timeout ... closing")); + CActiveScheduler::Stop(); + } + +// ======== LOCAL FUNCTIONS ======== + +// -------------------------------------------- +// PanicClient() +// -------------------------------------------- +// +void PanicClient( const RMessage2& aMessage, TInt aPanic ) + { + aMessage.Panic( KGbaServer, aPanic ); + } + + +// -------------------------------------------- +// PanicServer() +// -------------------------------------------- +// +void PanicServer( TInt aPanic ) + { + User::Panic( KGbaServer, aPanic ); + } + + +// -------------------------------------------- +// RunServerL() +// -------------------------------------------- +// +static void RunServerL() + { + // Construct active scheduler + CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler; + CleanupStack::PushL(activeScheduler) ; + CActiveScheduler::Install(activeScheduler); + // Construct our server + CGbaServer* server = CGbaServer::NewLC(); + RProcess::Rendezvous(KErrNone); + // Start handling requests + CActiveScheduler::Start(); + CleanupStack::PopAndDestroy( server ); + CleanupStack::PopAndDestroy( activeScheduler ); + } + + +// -------------------------------------------- +// E32Main:() +// -------------------------------------------- +// +TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + + TInt err = KErrNoMemory; + + if ( cleanup ) + { + TRAP(err, RunServerL()); + delete cleanup; + } +__UHEAP_MARKEND; + return err; + } + +//EOF +