diff -r 000000000000 -r 2e3d3ce01487 tzservices/tzserver/Server/Source/timezoneserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tzservices/tzserver/Server/Source/timezoneserver.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,159 @@ +// Copyright (c) 1997-2009 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: +// +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include "timezoneserver.h" +#include "timezonesession.h" + +// Set server priority +const TInt KServerPriority = 0; // EStandard Priority + +// indexes into TPolicyElement::KPolicyElements +#define KPolicyElementWriteDeviceData 0 +#define KPolicyElementReadUserData 1 +#define KPolicyElementWriteUserData 2 + +// opcodes ranges with different security policies +const TUint KRangeCount = 5; + +const TInt KOpCodeRanges[KRangeCount] = + { + KCapabilityNone, + KCapabilityWriteDeviceData, + KCapabilityReadUserData, + KCapabilityWriteUserData, + CTzServer::ENotSupported + }; + +const TUint8 KElementsIndex[KRangeCount] = + { + CPolicyServer::EAlwaysPass, + KPolicyElementWriteDeviceData, + KPolicyElementReadUserData, + KPolicyElementWriteUserData, + CPolicyServer::ENotSupported + }; + +const CPolicyServer::TPolicyElement KPolicyElements[] = + { + {_INIT_SECURITY_POLICY_C1(ECapabilityWriteDeviceData), CPolicyServer::EFailClient}, // KPolicyElementWriteDeviceData + {_INIT_SECURITY_POLICY_C1(ECapabilityReadUserData), CPolicyServer::EFailClient}, // KPolicyElementReadUserData + {_INIT_SECURITY_POLICY_C1(ECapabilityWriteUserData), CPolicyServer::EFailClient}, // KPolicyElementWriteUserData + }; + +const CPolicyServer::TPolicy KTzSrvrPolicy = + { + CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass + KRangeCount, + KOpCodeRanges, + KElementsIndex, // what each range is compared to + KPolicyElements // what policies range is compared to + }; + +// Create Tz Server +CTzServer* CTzServer::NewL() + { + CTzServer* self = new (ELeave) CTzServer(KServerPriority); + CleanupStack::PushL(self); + + self->ConstructL(); + + CleanupStack::Pop(self); + return self; + } + +CTzServer::~CTzServer() + { + delete iTzLocalizationDb; + delete iTimeZoneMgr; + delete iTzUserDataDb; + delete iTzSwiObserver; + } + +CTzServer::CTzServer(TInt aPriority) +:CPolicyServer(aPriority, KTzSrvrPolicy, ESharableSessions) + { + } + +// Create and connect to the file server +// Rename the server process to "TZServer" +// Start the server +// +void CTzServer::ConstructL() + { + iTzUserDataDb = CTzUserDataDb::NewL(); + iTzSwiObserver = CTzSwiObserver::NewL(); + iTimeZoneMgr = CTzConfigAgent::NewL(*this, *iTzUserDataDb, *iTzSwiObserver); + iTzLocalizationDb = CTzLocalizationDb::NewL(*this); + iTimeZoneMgr->SetLocalizationDb(iTzLocalizationDb); + iTzUserDataDb->AddObserverL(iTimeZoneMgr); + iTimeZoneMgr->AddObserverL(iTzLocalizationDb); + StartL(KTimeZoneServerName); + } + +// Create a new server session +CSession2* CTzServer::NewSessionL(const TVersion& aVersion,const RMessage2& /*aMessage*/) const + { + TVersion ver(KTimeZoneServerMajorVersion, KTimeZoneServerMinorVersion, KTimeZoneServerBuildVersion); + if (!User::QueryVersionSupported(ver,aVersion)) + { + User::Leave(KErrNotSupported); + } + + CTzServerSession* session = CTzServerSession::NewL(); + + SessionAdded(); + return session; + } + +void CTzServer::SessionClosed() const + { + // Called when a session exits + // If this is the last session for the server, then stop the scheduler so server can be destroyed + // outside the context of this call + --iSessionCount; + if (iSessionCount == 0) + { + CActiveScheduler::Stop(); + } + } + +void CTzServer::SessionAdded() const + { + iSessionCount++; + } + +// Notifies Change to all client sessions +// each client is responsible for rejecting the call +// if there is no pending request +void CTzServer::NotifyTZStatusChange(RTz::TTzChanges aChange, const TAny* aRequester) + { + iSessionIter.SetToFirst(); + CSession2* pS; + while ((pS = iSessionIter++)!=NULL) + { + (static_cast(pS))->NotifyTZStatusChange(aChange, aRequester); + } + } + +// +// Message servicing failed. Complete message with error code and restart +// +void CTzServer::Error(TInt aError) + { + Message().Complete(aError); + ReStart(); + }