diff -r b183ec05bd8c -r 19bba8228ff0 fotaapplication/fotaserver/fmserver/src/fmsserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fotaapplication/fotaserver/fmserver/src/fmsserversession.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -0,0 +1,496 @@ +/* +* 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