diff -r 13d7c31c74e0 -r b183ec05bd8c fotaapplication/fotaserver/fmserver/src/fmsserversession.cpp --- a/fotaapplication/fotaserver/fmserver/src/fmsserversession.cpp Thu Aug 19 10:44:50 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,496 +0,0 @@ -/* -* Copyright (c) 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: Implementation of fotaserver component -* This is part of fotaapplication. -* -*/ - -#include -#include -#include -#include -#include -#include //for telephone mode -#include //for telephone mode -#include -#include "fmsserversession.h" -#include "fmsclientserver.h" - -// ---------------------------------------------------------------------------------------- -// CFMSSession::CFMSSession -// ---------------------------------------------------------------------------------------- -CFMSSession::CFMSSession() - { - iStopServer = EFalse; - iWlanbearer = EFalse; - iWcdmaBearer = EFalse; - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::~CFMSSession -// ---------------------------------------------------------------------------------------- -CFMSSession::~CFMSSession() - { - FLOG(_L("CFMSSession::~CFMSSession-- begin")); - if( iStopServer ) - { - FLOG(_L("Stop fmserver CFMSSession::~CFMSSession")); - Server().DropSession(); - } - FLOG(_L("CFMSSession::~CFMSSession-- end")); - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::Server -// ---------------------------------------------------------------------------------------- -CFMSServer& CFMSSession::Server() - { - return *static_cast(const_cast(CSession2::Server())); - } - - -// ---------------------------------------------------------------------------------------- -// CFMSSession::CheckClientSecureIdL -// ---------------------------------------------------------------------------------------- -TBool CFMSSession::CheckClientSecureIdL ( - const RMessage2& aMessage) - { - TUid fota = TUid::Uid( KFotaServerUid ); - TUid starter = TUid::Uid( KStarterUid ); - - // Fotaserver - if ( aMessage.SecureId() == fota.iUid ) - { - FLOG(_L("[CFMSSession] CheckClientSecureIdL client is \ - fotaserver!")); - return ETrue; - } - - // Starter - if ( aMessage.SecureId() == starter.iUid ) - { - return ETrue; - } - - // test app - if ( aMessage.SecureId() == 0x01D278B9 ) - { - return ETrue; - } - - FLOG(_L("[CFMSSession] CheckClientSecureIdL client 0x%X is unknown \ - (msg %d), bailing out"),aMessage.SecureId().iId, aMessage.Function()); - iStopServer = ETrue; - User::Leave( KErrAccessDenied ); - return EFalse; // compiler warning otherwise - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::ServiceL -// ---------------------------------------------------------------------------------------- -void CFMSSession::ServiceL(const RMessage2& aMessage) - { - RThread clt; aMessage.ClientL(clt); TFullName cltnm = clt.FullName(); - FLOG(_L( "CFMSSession::ServiceL %d serving for %S?" ) - ,aMessage.Function(), &cltnm ); - if( CheckClientSecureIdL( aMessage ) ) - { - //already one request pending - if( Server().RequestPending() && - aMessage.Function() != ECancelOutstandingRequest ) - { - aMessage.Complete(KErrCancel); - } - else //For no pending request case - { - TRAPD(err,DispatchMessageL(aMessage)); - if(err != KErrNone ) - { - iStopServer = ETrue; - } - aMessage.Complete(err); - } - } - else - { - aMessage.Complete(KErrAccessDenied); - } - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::ServiceError -// ---------------------------------------------------------------------------------------- -void CFMSSession::ServiceError(const RMessage2& aMessage,TInt aError) - { - CSession2::ServiceError(aMessage,aError); - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::DispatchMessageL -// ---------------------------------------------------------------------------------------- -void CFMSSession::DispatchMessageL(const RMessage2& aMessage) - { - FLOG(_L("CFMSSession::DispatchMessageL-begin")); - - if( aMessage.Function() != EFotaStartUpPlugin && - aMessage.Function() != ECancelOutstandingRequest && - aMessage.Function() != EMonitorbattery && - aMessage.Function() != EPhoneCallActive && - aMessage.Function() != EMonitorPhoneCallEnd ) - { - - HandleBasedOnBearertypeL(aMessage); - - - - } - switch(aMessage.Function()) - { - case EUserInterrupt: - { - if(Server().ChargerTobeMonitered()) - { - FLOG(_L("FMSSErver::EUserInterrupt")); - Server().WriteToFile(EUserInterrupt,aMessage.Int0(), - (TDriveNumber)aMessage.Int1(),aMessage.Int2(),iWcdmaBearer); - Server().StartMonitoringL(EUserInterrupt); - } - else - { - WriteDummyFile(); - iStopServer = ETrue; - } - } - break; - case ENetworkInterrupt: - { - if(Server().NetworkTobeMonitered()) - { - FLOG(_L("FMSSErver::ENetworkInterrupt")); - //If wlan = on & network interrupt, then stop the server and dont monitor - //mean other wlan n/w's present but this wlan gone off - if(iWlanbearer && Server().CheckWlanL()) - { - WriteDummyFile(); - Server().DeleteFile(EFalse); - iStopServer = ETrue; - break; - } - Server().WriteToFile(ENetworkInterrupt,aMessage.Int0(), - (TDriveNumber)aMessage.Int1(),aMessage.Int2(),iWcdmaBearer); - Server().AsyncSessionRequestL(); - } - else - { - WriteDummyFile(); - iStopServer = ETrue; - } - } - break; - case EMemoryInterrupt: - { - if(Server().MemoryTobeMonitered()) - { - FLOG(_L("FMSSErver::EMemoryInterrupt")); - Server().MemoryToMonitorL(aMessage.Int2(),(TDriveNumber)aMessage.Int1()); - Server().WriteToFile(EMemoryInterrupt,aMessage.Int0(), - (TDriveNumber)aMessage.Int1(),aMessage.Int2(),iWcdmaBearer); - Server().StartMonitoringL(EMemoryInterrupt); - } - else - { - WriteDummyFile(); - iStopServer = ETrue; - } - } - break; - case EGeneralInterrupt: - { - if(Server().ChargerTobeMonitered()) - { - FLOG(_L("FMSSErver::GeneralInterrupt")); - Server().WriteToFile(EUserInterrupt,aMessage.Int0(), - (TDriveNumber)aMessage.Int1(),aMessage.Int2(),iWcdmaBearer); - Server().StartMonitoringL(EUserInterrupt); - } - else - { - WriteDummyFile(); - iStopServer = ETrue; - } - } - break; - case EFotaStartUpPlugin: - { - if(Server().MoniterAfterPhoneRestart()) - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin")); - TInt intrreason(-1),bearer(-1),size(0); - TInt drive(-1), wcdmabearer(-1); - //if loop for Hard reboot--no file or size is empty - if(Server().ReadFromFile(intrreason,bearer,drive,size,wcdmabearer) == EFalse ) - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin no file or size is empty")); - if(!Server().RequestPending()) - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin-no request pending")); - TRAPD(err,PhoneModeL()); - if(err); // remove compiler warning - FLOG(_L("PhoneModeL() fotastartup returns err as %d"),err); - if(iWcdmaBearer) - Server().NetworkTypeL( (TInt)EBearerIdWCDMA ); - - else - Server().NetworkTypeL( (TInt)EBearerIdGPRS ); - Server().LockSession(); - Server().TriggerFotaL(); //checks n/w & trigger FOTA DL - } - break; - } - TUint32 BearerId = FindBearerIdL(bearer); - FLOG(_L("CFMSSession::EFotaStartUpPlugin wcdma bearer is %d"),wcdmabearer); - if( BearerId == KUidWlanBearerType ) - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin-wlan bearer")); - Server().NetworkTypeL(EBearerIdWLAN); - if(intrreason == ENetworkInterrupt) - { - //stop the server , but dont delete file to support in second reboot - FLOG(_L("wlan bearer & n/w interrupt--stopping the server")); - Server().DeleteFile(EFalse); - iStopServer = ETrue; - break; - } - } - else if( BearerId == KUidPacketDataBearerType ) - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin-bearer is packet data")); - if( wcdmabearer == 1 ) - { - Server().NetworkTypeL(EBearerIdWCDMA); - FLOG(_L("CFMSSession::EFotaStartUpPlugin-packet data and 3G")); - } - else - { - Server().NetworkTypeL(EBearerIdGPRS); - FLOG(_L("CFMSSession::EFotaStartUpPlugin-packet data and 2G")); - } - } - else - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin-unknown bearer")); - Server().DeleteFile(EFalse); - iStopServer = ETrue; - break; - } - //when there is dummy file in the store - if( intrreason < EUserInterrupt || intrreason > EGeneralInterrupt ) - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin-Interrupt unknown")); - Server().DeleteFile(EFalse); //used when variation support & reboot again - iStopServer = ETrue; - break; - } - if( intrreason == EUserInterrupt || intrreason == EGeneralInterrupt ) - { - FLOG(_L("CFMSSession::EFotaStartUpPlugin-Check n/w & trigger fotaengine")); - Server().CheckNetworkL(bearer,drive,size,wcdmabearer);//3 params used in monitoring if no n/w - break; - } - //for other interrupts it will monitor - Server().StartMonitoringL((TOmaDLInterruptReason)intrreason); - } - else - { - iStopServer = ETrue; - } - } - break; - case ECancelOutstandingRequest: - { - FLOG(_L("CFMSSession::DispatchMessageL ECancelOutstandingRequest case:")); - iStopServer = ETrue; - } - break; - - case EMonitorbattery: - { - FLOG(_L("CFMSSession::DispatchMessageL EMonitorbattery case:")); - Server().StartBatteryMonitoringL(EMonitorbattery, aMessage.Int0()); - } - break; - - case EPhoneCallActive: - { - FLOG(_L("CFMSSession::DispatchMessageL EPhoneCallActiveSync case:")); - Server().LockSession(); - TInt reason =EFalse; - Server().CheckPhoneCallActiveL(reason); - TPckgBuf callactive(reason); - aMessage.WriteL(0,callactive); - Server().iSessionCount = 0; - FLOG(_L("CFMSSession::DispatchMessageL EPhoneCallActiveSync case:%d"),reason); - iStopServer = ETrue; - } - break; - - case EMonitorPhoneCallEnd: - { - FLOG(_L("CFMSSession::DispatchMessageL EPhoneCallActiveAsync case:%d,%d"),aMessage.Int0(),aMessage.Int1()); - Server().LockSession(); - if(Server().MonitorPhoneCallEndL(aMessage.Int0(),aMessage.Int1())) - { - iStopServer = ETrue; - Server().iSessionCount = 0; - } - else //let server monitor for active call end - { - iStopServer = EFalse; - } - } - break; - default: - { - FLOG(_L("CFMSSession::DispatchMessageL default case:and a leave happened")); - iStopServer = ETrue; - User::Leave(KErrArgument); - } - } - FLOG(_L("CFMSSession::DispatchMessageL:end")); - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::FindBearerId -// ---------------------------------------------------------------------------------------- -TUint32 CFMSSession::FindBearerIdL(TInt aIapId) - { - FLOG(_L("CFMSSession::FindBearerId: % d"),aIapId); - TUint32 bearer = 0; - TInt err( KErrNone ); - // Query CM Id - TInt cmId ( aIapId ); - RCmManagerExt CmManagerExt; - TRAP( err, CmManagerExt.OpenL() ); - if( err == KErrNone ) - { - RCmConnectionMethodExt cm; - TRAP( err, cm = CmManagerExt.ConnectionMethodL( cmId ) ); - if ( err == KErrNone ) - { - CleanupClosePushL( cm ); - bearer = cm.GetIntAttributeL( CMManager::ECmBearerType ); - CleanupStack::PopAndDestroy(); // cm - } - CmManagerExt.Close(); - } - return bearer; - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::WriteDummyFile -// This method used when the variation wouldn't support and startup called -// and also differentiates hard reeboot(with empty or no file) -// ---------------------------------------------------------------------------------------- -void CFMSSession::WriteDummyFile() - { - FLOG(_L("CFMSSession::WriteDummyFile--begin")); - Server().WriteToFile(KErrNotFound,KErrNotFound, - (TDriveNumber)KErrNotFound,KErrNotFound,EFalse); - Server().DeleteFile(EFalse); - FLOG(_L("CFMSSession::WriteDummyFile--End")); - } - -// ---------------------------------------------------------------------------------------- -// CFMSSession::PhoneMode -// This method used to know the current phone mode -// If the phone is in dual mode it will check GPRS bearer only -// ---------------------------------------------------------------------------------------- -void CFMSSession::PhoneModeL() - { - FLOG(_L("CFMSSession::PhoneModeL--begin")); - // find out if we are in 2G or in 3G - it is needed for calculating bearer availability - __UHEAP_MARK; - RTelServer telServer; - User::LeaveIfError( telServer.Connect()); - FLOG(_L("CFMSSession::PhoneModeL--telServer Connected")); - RTelServer::TPhoneInfo teleinfo; - User::LeaveIfError( telServer.GetPhoneInfo( 0, teleinfo ) ); - FLOG(_L("CFMSSession::PhoneModeL--telServer getting tel info")); - RMobilePhone phone; - User::LeaveIfError( phone.Open( telServer, teleinfo.iName ) ); - FLOG(_L("CFMSSession::PhoneModeL--RMobilePhone opened")); - User::LeaveIfError(phone.Initialise()); - FLOG(_L("CFMSSession::PhoneModeL--phone.Initialise() success")); - RMobilePhone::TMobilePhoneNetworkMode mode; - TInt err = phone.GetCurrentMode( mode ); - phone.Close(); - telServer.Close(); - __UHEAP_MARKEND; - - if( KErrNone == err ) - { - switch(mode) - { - case RMobilePhone::ENetworkModeGsm: - //case RMobilePhone::ENetworkModeUnknown: // emulator default - { - FLOG(_L("CFMSSession::PhoneModeL-begin-GSM Mode")); - iWcdmaBearer = EFalse; - Server().NetworkTypeL(EBearerIdGPRS); - break; - } - case RMobilePhone::ENetworkModeWcdma: - { - FLOG(_L("CFMSSession::PhoneModeL-begin-3G Mode")); - iWcdmaBearer = ETrue; - Server().SetWcdma(); - Server().NetworkTypeL(EBearerIdWCDMA); - break; - } - default: - FLOG(_L("unknown")); - } - } - FLOG(_L("CFMSSession::PhoneModeL--end")); - } - -//---------------------------------------------------------------------------------------- -// CFMSSession::HandleBasedOnBearertypeL -// Handles based on bearer type -//---------------------------------------------------------------------------------------- - -void CFMSSession::HandleBasedOnBearertypeL(const RMessage2& aMessage) -{ - TUint32 bearer = FindBearerIdL(aMessage.Int0()); - if( bearer == KUidPacketDataBearerType ) - { - FLOG(_L("CFMSSession::DispatchMessageL bearer is packet data")); - TRAPD(err,PhoneModeL()); - if(err); // remove compiler warning - FLOG(_L("PhoneModeL() returns err as %d"),err); - } - else if ( bearer == KUidWlanBearerType ) - { - FLOG(_L("CFMSSession::DispatchMessageL bearer is WLAN")); - iWlanbearer = ETrue; - Server().NetworkTypeL(EBearerIdWLAN); - } - else - { - FLOG(_L("CFMSSession::DispatchMessageL bearer is not known and a leave happened ")); - iStopServer = ETrue; - User::Leave(KErrArgument); - } -} -//End of file