--- a/brandingserver/bsserver/cbsserver.cpp Fri May 28 18:27:27 2010 +0530
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,664 +0,0 @@
-/*
-* Copyright (c) 2006 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: cbsserver.cpp
-*
-*/
-
-
-// INCLUDE FILES
-
-#define __INCLUDE_CAPABILITY_NAMES__
-#define __INCLUDE_ALL_SUPPORTED_CAPABILITIES__
-
-#include "cbsserver.h"
-#include "cbssession.h"
-#include "bsserverdefs.h"
-#include "debugtrace.h"
-#include "cbsstoragemanager.h"
-#include "cbsinstallhandler.h"
-#include "cbsbackupobserver.h"
-
-// CBSFileMapping
-
-CBSServer::CBSFileMapping* CBSServer::CBSFileMapping::NewL( CBSSession* aSession,
- const TDesC& aFile,
- TBool aVersioned )
- {
- CBSFileMapping* self = new( ELeave ) CBSFileMapping( aVersioned );
- CleanupStack::PushL( self );
- self->ConstructL( aSession, aFile );
- CleanupStack::Pop( self );
- return self;
- }
-void CBSServer::CBSFileMapping::ConstructL( CBSSession* aSession,
- const TDesC& aFile )
- {
- iSession = aSession;
- iFile = aFile.AllocL();
- }
-CBSServer::CBSFileMapping::CBSFileMapping( TBool aVersioned )
-: iVersioned( aVersioned )
- {
- }
-CBSServer::CBSFileMapping::~CBSFileMapping()
- {
- delete iFile;
- }
-
-CBSSession* CBSServer::CBSFileMapping::Session()
- {
- return iSession;
- }
-const TDesC& CBSServer::CBSFileMapping::File()
- {
- return *iFile;
- }
-TBool CBSServer::CBSFileMapping::Versioned()
- {
- return iVersioned;
- }
-
-
-// ==============================================================
-// =============== PLATSEC POLICY CONFIGURATION =================
-// ==============================================================
-
-static const TInt KBSPlatSecRangeCount = 2;
-
-//Ranges for the Request values
-static const TInt KBSPlatSecRanges[ KBSPlatSecRangeCount ] =
- {
- 0,
- EBSOperationLast
- };
-
-
-// Element indexes for the defined ranges
-static const TUint8 KBSPlatSecElementsIndex[ KBSPlatSecRangeCount ] =
- {
- 0,
- CPolicyServer::ENotSupported
- };
-
-
-// Policy elements
-static const CPolicyServer::TPolicyElement KBSPlatSecElements[] =
- {
- {
- _INIT_SECURITY_POLICY_C2( ECapabilityReadUserData,
- ECapabilityWriteUserData ),
- -5 //CPolicyServer::EFailClient
- }
- };
-
-
-// The platsec policy
-static const CPolicyServer::TPolicy KBSPlatSecPolicy =
- {
- // Shortcut to the index into Elements,that is used to check a connection attempt
- 0,
-
- // Number of ranges in the iRanges array
- KBSPlatSecRangeCount,
-
- // A pointer to an array of ordered ranges of request numbers
- KBSPlatSecRanges,
-
- // A pointer to an array of TUint8 values specifying
- // the appropriate action to take for each range in iRanges
- KBSPlatSecElementsIndex,
-
- // A pointer to an array of distinct policy elements
- KBSPlatSecElements
- };
-
-
-
-// ==============================================================
-// ======================= SERVER ==============================
-// ==============================================================
-void CBSServer::ExecuteL()
- {
- TRACE( T_LIT( "CBrandingServer::ExecuteL() begin") );
- // start scheduler
- CActiveScheduler* pA = new( ELeave )CActiveScheduler;
- CleanupStack::PushL( pA );
- CActiveScheduler::Install( pA );
-
-
- // create server
- CBSServer* server = new( ELeave ) CBSServer();
- CleanupStack::PushL( server );
- server->InitializeL();
- server->StartL( KBSServerName );
-
-
- //Signal client that we are started
- RProcess().Rendezvous( KErrNone );
-
- //Execute the server
- // Codescanner warning: using CActiveScheduler::Start (id:3)
- // this has to be called for server starting.
- CActiveScheduler::Start(); // CSI: 3 # See above
-
-
- //Cleanup
- CleanupStack::PopAndDestroy( server );//server
- CleanupStack::PopAndDestroy( pA );
- CActiveScheduler::Install( NULL );
- TRACE( T_LIT( "CBrandingServer::ExecuteL() end") );
- }
-
-
-
-CBSServer::~CBSServer()
- {
- TRACE( T_LIT( "CBrandingServer::~CBSServer() begin") );
- delete iBackupObserver;
- delete iInstallHandler;
- iSessions.Close();
- iFileMapping.Close();
- delete iStorageManager;
-
-#if _BullseyeCoverage
- cov_write();
-#endif
- TRACE( T_LIT( "CBrandingServer::~CBSServer() end") );
- }
-
-
-
-CBSServer::CBSServer()
- : CPolicyServer( CActive::EPriorityStandard,
- KBSPlatSecPolicy )
- {
- }
-
-
-
-CSession2* CBSServer::NewSessionL( const TVersion &aVersion,
- const RMessage2& /*aMessage*/ ) const
- {
- TRACE( T_LIT( "CBrandingServer::NewSessionL() begin") );
- TVersion srvVersion( KBSVersionMajor,
- KBSVersionMinor,
- KBSVersionBuild );
-
-
- if( !User::QueryVersionSupported( aVersion, srvVersion ) )
- {
- User::Leave( KErrNotSupported );
- }
-
- CBSSession* session = CBSSession::NewL();
- //enable backup observer
- iBackupObserver->RegisterObserver( session );
-
- TRACE( T_LIT( "CBrandingServer::NewSessionL() end session[%d] created"), session );
- return session;
- }
-
-
-CPolicyServer::TCustomResult
- CBSServer::CustomFailureActionL( const RMessage2& aMsg,
- TInt /*aAction*/,
- const TSecurityInfo& aMissing )
- {
- TRACE( T_LIT( "CBrandingServer::CustomFailureActionL() Request %d to session [%d] failed."),
- aMsg.Function(), aMsg.Session() );
-
- TBuf<512> diagnosticMsg;
- _LIT( KDetails, "Failure details: ");
- diagnosticMsg.Append( KDetails );
- _LIT( KFormat, "SecureId[%d] VendorId[%d] Missing caps[" );
- diagnosticMsg.AppendFormat( KFormat,
- aMissing.iSecureId.iId, aMissing.iVendorId.iId );
-
- const SCapabilitySet& missingCaps = (const SCapabilitySet&) aMissing.iCaps;
- TBuf<1> separator;
- _LIT( KSeparator, "]" );
- for( TInt ix = 0; ix < ECapability_Limit; ix++ )
- {
- if( missingCaps[ix>>5] &(1<<(ix&31)))
- {
- diagnosticMsg.Append( separator );
-
- const char* capName = CapabilityNames[ ix ];
- while( *capName )
- {
- TUint16 c = *capName;
- diagnosticMsg.Append( &c, 1 );
- ++capName;
- }
-
- separator = KSeparator;
- }
- }
-
- diagnosticMsg.Append( KSeparator );
- TRACE( T_LIT( "%S"), &diagnosticMsg );
-
- return CPolicyServer::EFail;
- }
-
-void CBSServer::HandleBackupStateL( TBackupState aState )
- {
- switch( aState )
- {
- case EBackupNotActive: // backup has completed
- {
- // restart install handler and check for brand changes
- iInstallHandler->InstallNewFilesL();
- iInstallHandler->StartObservingL();
-
- //notify clients that we're back in business
- break;
- }
- case EBackupActive: // backup activated
- {
- // stop install handler
- iInstallHandler->StopObserving();
-
- // Notify clients that branding data is not currently
- // available
- break;
- }
- default:
- {
- // unknown state
- }
- }
- }
-
-void CBSServer::SessionCreatedL( CBSSession* aSession )
- {
- TRACE( T_LIT( "CBSServer::SessionCreatedL begin aSession[%d]"),aSession );
- iSessionCount++;
- iSessions.AppendL( aSession );
- }
-
-
-void CBSServer::SessionDied( CBSSession* aSession )
- {
- TInt count = iSessions.Count();
- for( TInt i = 0; i < count; i++ )
- {
- if( iSessions[i] == aSession )
- {
- iSessions.Remove( i );
- break;
- }
- }
- TInt ignore = 0;
- TRAP( ignore, UnRegisterSessionL( aSession ) );
-
- //enable backup observer
- iBackupObserver->UnregisterObserver( aSession );
-
- iSessionCount--;
- if( iSessionCount == 0 )
- {
- // Codescanner warning: using CActiveScheduler::Stop ( Id: 4)
- // it is required to stop the server
- CActiveScheduler::Stop(); // CSI: 4 # See above
- }
- }
-
-
-
-TBool CBSServer::MatchSessionL( const TDesC& aApplicationId,
- const TDesC& aBrandId,
- TLanguage aLanguageId,
- CBSSession* aSession,
- TInt aReserved )
- {
- TInt sessionCount = iSessions.Count();
- TBool returnValue = EFalse;
- for( TInt i = 0; i < sessionCount; i++ )
- {
- if( iSessions[i] == aSession )
- {
- // we don't want to report the querying session itself
- continue;
- }
- if( iSessions[i]->MatchSessionL( aApplicationId,
- aBrandId,
- aLanguageId,
- aReserved ) )
- {
- // even one match is enough for us
- returnValue = ETrue;
- break;
- }
- }
- return returnValue;
- }
-
-TBool CBSServer::MatchSessionUninstallL( const TDesC& aApplicationId,
- const TDesC& aBrandId, CBSSession* aSession)
-{
- TInt sessionCount = iSessions.Count();
- TBool returnValue = EFalse;
- for( TInt i = 0; i < sessionCount; i++ )
- {
- if( iSessions[i] == aSession )
- {
- // we don't want to report the querying session itself
- continue;
- }
- if( iSessions[i]->MatchSessionUninstallL( aApplicationId,
- aBrandId ))
- {
- // even one match is enough for us
- returnValue = ETrue;
- break;
- }
- }
- return returnValue;
-
-}
-
-void CBSServer::RegisterFileForSessionL( CBSSession* aSession,
- const TDesC& aFile,
- TBool aVersioned )
- {
- TRACE( T_LIT( "CBSServer::RegisterFileForSessionL begin aSession[%d],aFile[%S]"),aSession,&aFile );
- TBool found = EFalse;
- TInt count = iFileMapping.Count();
- for( TInt i = 0; i < count; i ++ )
- {
- if( iFileMapping[i]->Session() == aSession && iFileMapping[i]->File() == aFile &&
- iFileMapping[i]->Versioned() == aVersioned)
- {
- found = ETrue;
- }
- }
-
- if(!found)
- {
-
- CBSFileMapping* fileMapping = CBSFileMapping::NewL( aSession, aFile, aVersioned );
- CleanupStack::PushL( fileMapping );
- iFileMapping.AppendL( fileMapping );
- CleanupStack::Pop( fileMapping );
- }
- TRACE( T_LIT( "CBSServer::RegisterFileForSessionL end") );
- }
-
-void CBSServer::UnRegisterSessionL( CBSSession* aSession )
- {
- TRACE( T_LIT( "CBSServer::RegisterFileForSessionL begin aSession[%d]"),aSession );
- TInt count = iFileMapping.Count();
- for( TInt i = 0; i < count; i ++ )
- {
- if( iFileMapping[i]->Session() == aSession )
- {
-
- if( !iStorageManager )
- {
- iStorageManager = CBSStorageManager::NewL( aSession, KNullDesC );
- }
- if( !FileStillInUse( aSession, iFileMapping[i]->File() ) )
- {
- TPtrC baseFile = KNullDesC();
- if( iFileMapping[i]->Versioned() )
- {
- baseFile.Set( iStorageManager->FilenameWithoutVersion( iFileMapping[i]->File() ) );
- }
- else
- {
- baseFile.Set( iFileMapping[i]->File() );
- }
- // we found the session, now check if any other
- // session is using the same file
- if( !FileStillInUse( aSession, baseFile ) )
- {
- // no other sessions using the file
- // cleanup versioned file
- CleanupFileL( iFileMapping[i]->File() );
- }
-
- }
- CBSFileMapping* fileMapping = iFileMapping[i];
- iFileMapping.Remove( i );
- delete fileMapping;
- break;
- }
- }
- TRACE( T_LIT( "CBSServer::RegisterFileForSessionL end") );
- }
-
-TBool CBSServer::FileStillInUse( CBSSession* aSession,
- const TDesC& aFile )
- {
- TBool returnValue = EFalse;
- TInt count = iFileMapping.Count();
- for( TInt i = 0; i < count; i ++ )
- {
- if( 0 == iFileMapping[i]->File().Compare( aFile ) )
- {
- // file found, check that it's not the same sesion
- if( iFileMapping[i]->Session() != aSession )
- {
-
- // it's not the same session
- // so the file is still in use, we can
- // return ETrue
- returnValue = ETrue;
- break;
- }
- }
- }
- return returnValue;
- }
-
-void CBSServer::CleanupFileL( const TDesC& aFile )
- {
- if( !iStorageManager )
- {
- iStorageManager = CBSStorageManager::NewL( NULL, KNullDesC);
- }
- iStorageManager->CleanupFileL( aFile );
- }
-
-TArray<CBSServer::CBSFileMapping*> CBSServer::RegisteredFiles()
- {
- return iFileMapping.Array();
- }
-
-void CBSServer::InitializeL()
- {
- TRACE( T_LIT( "CBSServer::InitializeL begin") );
- // Initialize brand install handler
- iInstallHandler = CBSInstallHandler::NewL();
- iInstallHandler->InstallNewFilesL();
- iInstallHandler->StartObservingL();
-
- //to enable backup observer
- // Initialize backup and restore observer
- CBSBackupObserver* tmp = CBSBackupObserver::NewL();
- delete iBackupObserver;
- iBackupObserver = tmp;
- User::LeaveIfError( iBackupObserver->RegisterObserver( this ) );
- TRACE( T_LIT( "CBSServer::InitializeL end") );
- }
-
-void CBSServer::BrandUpdatedL( const TDesC& aApplicationId,
- const TDesC& aBrandId,
- TLanguage aLanguageId,
- CBSSession* aSession,
- TInt aReserved )
- {
- TRACE( T_LIT( "CBSServer::BrandUpdatedL begin aAppid[%S],aBrandId[%S]"),&aApplicationId, &aBrandId );
- TInt sessionCount = iSessions.Count();
- for( TInt i = 0; i < sessionCount; i++ )
- {
- if( iSessions[i] == aSession )
- {
- // we don't want to report the querying session itself
- continue;
- }
- iSessions[i]->BrandUpdatedL( aApplicationId,
- aBrandId,
- aLanguageId,
- aReserved );
- }
- TRACE( T_LIT( "CBSServer::BrandUpdatedL end") );
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CBSServer::DisplaySessionInfoL display the info for each open session,
-// except for the one that called this method
-// ---------------------------------------------------------------------------
-//
-void CBSServer::DisplaySessionInfoL( CBSSession* aSession, TInt aErrorCode )
- {
- TRACE( T_LIT( "CBSServer::DisplaySessionInfoL() begin aSession[%d], aErrorCode[%d]"),aSession,aErrorCode );
-
- User::LeaveIfNull( aSession );
- // some constants
- const TInt KStringLength = 512;
- const TInt KNumberLength = 16;
- _LIT( KMessage0,"Operation failed.Errorcode:");
- _LIT( KMessage1," Info on open sessions [ProcessFileName|ThreadId|ProcessId|Caption]:");
- _LIT( KBracketOpen, " [");
- _LIT( KBracketClose, "]");
- _LIT( KSeparator, "|");
-
-
- HBufC* outputString = HBufC::NewLC( KStringLength );
- TPtr outputStringPtr( outputString->Des() );
-
- TBuf<KNumberLength> number;
- number.Num( aErrorCode );
-
- //make sure the string is long enough
- TInt newLength = outputString->Length() +
- KMessage0().Length() +
- number.Length() +
- KMessage1().Length();
-
- //reallocate if necessary
- if ( outputStringPtr.MaxLength() < newLength )
- {
- CleanupStack::Pop( outputString );
- outputString = outputString->ReAllocL( newLength );
- outputStringPtr.Set( outputString->Des() );
- CleanupStack::PushL( outputString );
- }
-
- outputStringPtr.Append( KMessage0 );
- outputStringPtr.Append( number );
- outputStringPtr.Append( KMessage1 );
-
-
- TInt count = iSessions.Count();
- TRACE( T_LIT( "CBSServer::DisplaySessionInfoL() numberSessions=%d"),count );
- CBSSession* currentSession;
- for( TInt i = 0; i < count; i++ )
- {
- currentSession = iSessions[i];
- TRACE( T_LIT( "CBSServer::DisplaySessionInfoL() iteration=%d session=%d"),i,currentSession );
- if ( currentSession
- && currentSession->InfoAvailable()
- && currentSession != aSession )
- {
- TBuf<KNumberLength> threadIdStr;
- TThreadId threadId;
- if ( KErrNone == currentSession->ThreadId( threadId ) )
- {
- threadIdStr.NumUC( threadId.Id(), EDecimal );
- }
- TBuf<KNumberLength> processIdStr;
- TProcessId processId;
- if ( KErrNone == currentSession->ProcessId( processId ) )
- {
- processIdStr.NumUC( processId.Id(), EDecimal );
- }
-
- //make sure the string is long enough
- newLength = outputString->Length() +
- KBracketOpen().Length() +
- currentSession->FileName().Length() +
- threadIdStr.Length() +
- processIdStr.Length() +
- currentSession->Caption().Length() +
- ( 3 * KSeparator().Length() ) +
- KBracketClose().Length();
-
- //reallocate if necessary
- if ( outputStringPtr.MaxLength() < newLength )
- {
- CleanupStack::Pop( outputString );
- outputString = outputString->ReAllocL( newLength );
- outputStringPtr.Set( outputString->Des() );
- CleanupStack::PushL( outputString );
- }
-
- outputStringPtr.Append( KBracketOpen );
-
- //processfilename
- outputStringPtr.Append( currentSession->FileName() );
- outputStringPtr.Append( KSeparator );
-
- //threadid
- outputStringPtr.Append( threadIdStr );
- outputStringPtr.Append( KSeparator );
-
- //processid
- outputStringPtr.Append( processIdStr );
- outputStringPtr.Append( KSeparator );
-
- //caption
- outputStringPtr.Append( currentSession->Caption() );
-
- outputStringPtr.Append( KBracketClose );
- }
- }
-
- TRACE( T_LIT( "CBSServer::DisplaySessionInfoL() string creation OK") );
- TRACE( T_LIT( "%S"), outputString );
- CleanupStack::PopAndDestroy( outputString );
- TRACE( T_LIT( "CBSServer::DisplaySessionInfoL() end") );
- }
-
-// ==============================================================
-// ====================== ENTRY POINT ===========================
-// ==============================================================
-GLDEF_C TInt E32Main()
- {
- TRACE( T_LIT("E32Main - enter") );
-
- User::RenameThread( KBSServerName );
-
- CTrapCleanup* tc = CTrapCleanup::New();
- if( !tc )
- {
- return KErrNoMemory;
- }
-
- TRAPD( err, CBSServer::ExecuteL() );
- delete tc;
-
- TRACE( T_LIT("E32Main - exit: %d"), err );
- return err;
- }
-
-
-
-// END OF FILE
-
-