diff -r c8e5c3d81b42 -r 39aa16f3fdc2 fotaapplication/fotaserver/FotaServer/src/fotaupdate.cpp --- a/fotaapplication/fotaserver/FotaServer/src/fotaupdate.cpp Wed Jun 23 19:10:17 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1815 +0,0 @@ -/* - * Copyright (c) 2005-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: starts update sequence - * - */ - - - -// INCLUDE FILES -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "fotaupdate.h" -#include "fmsclient.h" -#include "FotaReminderDlg.h" -#include "FotasrvSession.h" -#include "fotaserverPrivateCRKeys.h" -#include "fotaserverPrivatePSKeys.h" - - - - - -// ============== LOCAL FUNCTIONS ============================================ - - - -TInt WriteUpdateBitmapL( const TDesC& aText, const TDesC& aFile) - { - FLOG(_L("WriteUpdateBitmapL writing %S to %S w/ txtdir"),&aText,&aFile); - - TSize screensize = CCoeEnv::Static()->ScreenDevice()->SizeInPixels(); - TInt width = screensize.iWidth - KBmpMargin*2; - TInt height = screensize.iHeight; - - CArrayFixSeg* lines = new CArrayFixSeg(5); - CleanupStack::PushL(lines); - CFbsBitmap* bitmap = new ( ELeave ) CFbsBitmap; - CleanupStack::PushL( bitmap ); - bitmap->Create( TSize(width,height), EColor64K ); - CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( bitmap ); - CleanupStack::PushL( device ); - const CFont* font = AknLayoutUtils::FontFromId(EAknLogicalFontPrimaryFont); - CFbsBitGc* context; - User::LeaveIfError( device->CreateContext( context ) ); - CleanupStack::PushL( context ); - TInt ascent = font->AscentInPixels(); - TInt descent = font->DescentInPixels(); - context->UseFont ( font ); - context->Clear(); // bg color - - // Visually ordered text - HBufC* wrappedstring = AknBidiTextUtils::ConvertToVisualAndWrapToArrayL( - aText, width,*font, *lines); - CleanupStack::PushL ( wrappedstring ); - TBool dirfound (ETrue); - // direction of text, affects alignemnt - TBidiText::TDirectionality direction = TBidiText::TextDirectionality( - *wrappedstring, &dirfound ); - - // Print visual text to bitmap - for ( TInt i=0; iCount(); ++i ) - { - TPtrC l = (*lines)[i]; - TInt top = (ascent+descent)*(i); - TInt bot = (ascent+descent)*(i+1); - TRect rect (0, top ,width, bot ); - CGraphicsContext::TTextAlign alignment = - direction==TBidiText::ELeftToRight ? CGraphicsContext::ELeft - : CGraphicsContext::ERight; - context->DrawText(l, rect, ascent, alignment); - } - height = (ascent+descent)*lines->Count() + descent; - bitmap->Resize( TSize(width,height)); - bitmap->Save( aFile ); - context->DiscardFont(); - CleanupStack::PopAndDestroy( wrappedstring ); - CleanupStack::PopAndDestroy( context ); - CleanupStack::PopAndDestroy( device ); - CleanupStack::PopAndDestroy( bitmap ); - CleanupStack::PopAndDestroy( lines ); - return 1; - } - - -// --------------------------------------------------------------------------- -// PackageFileName Creates pgk filename ,like 5.swupd -// --------------------------------------------------------------------------- -void PackageFileName( TInt aPkgid, TDes8& aFileName ) - { - aFileName.AppendNum(aPkgid); - aFileName.Append( KSwupdFileExt8 ); - } - - -// --------------------------------------------------------------------------- -// PackageFilePath Creates pk file path, like c:\\private\\102072C4\\5.swupd -// --------------------------------------------------------------------------- -void PackageFilePath( TInt aPkgid, TDes8& aPath ) - { - TBuf8<20> fn; - PackageFileName ( aPkgid,fn); - aPath.Append(KSwupdPath8); - aPath.Append(fn); - } - -// ============================= MEMBER FUNCTIONS ============================ - - -// --------------------------------------------------------------------------- -// CFotaUpdate::CFotaUpdate() -// --------------------------------------------------------------------------- -// -CFotaUpdate::CFotaUpdate() : CActive(EPriorityNormal) -,iScheduledUpdate(NULL),iHandleUpdateAcceptLater(EFalse) - { - CActiveScheduler::Add( this ); - iNotifParams.iNoteType = ESyncMLFwUpdUnknown; - iNotifParams.iIntParam = 0; - iChargeToMonitor = 0; - iFinalizeLater = EFalse; - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::~CFotaUpdate() -// --------------------------------------------------------------------------- -// -CFotaUpdate::~CFotaUpdate() - { - if(iScheduledUpdate) - { - delete iScheduledUpdate; - iScheduledUpdate = NULL; - } - iIntervalType.Close(); - iInterval.Close(); - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::NewL -// --------------------------------------------------------------------------- -// -CFotaUpdate* CFotaUpdate::NewL (CFotaServer* aServer) - { - CFotaUpdate* ao = new (ELeave) CFotaUpdate(); - ao->iFotaServer = aServer; - return ao; - } - -// --------------------------------------------------------------------------- -// CFotaUpdate::CheckUpdateResults -// Checks if there is update result file available (meaning that update just -// took place) -// --------------------------------------------------------------------------- -// -TBool CFotaUpdate::CheckUpdateResults( RFs& aRfs ) - { - RFile f; - TInt err; - err = f.Open ( aRfs, KUpdateResultFile, EFileShareAny ); - f.Close(); - if ( err!=KErrNone ) - { - return EFalse; - } - FLOG(_L(" CFotaUpdate::CheckUpdateResults update result file Found! ")); - return ETrue; - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::ExecuteUpdateResultFileL -// Read result code from update result file and update state accordingly. -// Show notifier "Update succesful". Do some cleanup. -// --------------------------------------------------------------------------- -// -void CFotaUpdate::ExecuteUpdateResultFileL( RFs& aRfs ) - { - FLOG(_L("CFotaUpdate::ExecuteUpdateResultFileL >>")); - iFs = &aRfs; - TInt err; - RFileReadStream rstr; - TInt result; - TInt msglen; - HBufC8* message=NULL; - HBufC16* message16=NULL; - TBool deleteData ( EFalse ); - - // Open update result file - FLOG(_L("opening rstr 1/2 ")); - err = rstr.Open(*iFs,KUpdateResultFile ,EFileRead|EFileStream); - FLOG(_L("opened rstr 2/2 ")); - if(err) FLOG(_L(" update result file open err %d"), err); - User::LeaveIfError (err ); - FLOG(_L(" 0.1")); - CleanupClosePushL( rstr ); - FLOG(_L(" 0.2")); - - // Read resultcode - result = rstr.ReadUint32L(); FLOG(_L(" 0.3")); - msglen = rstr.ReadUint32L(); FLOG(_L(" 0.4 result: %d \ - msglen:%d "), result, msglen); - if(msglen != 0) - { - FLOG(_L(" 0.5 reading msg")); - message = HBufC8::NewLC(msglen+1); - TPtr8 ptrdesc = message->Des(); - TRAPD ( err2, rstr.ReadL(ptrdesc) ); - if ( err2 != KErrNone && err2 != KErrEof) - { - FLOG(_L(" file read err %d"),err2); User::Leave( err2 ); - } - - message16 = HBufC16::NewLC (message->Des().Length()); - message16->Des().Copy( *message ); - FLOG(_L(" 1 update result: %d"), result) ; - FLOG(_L(" 2 dbg msg: %S"),message16); - CleanupStack::PopAndDestroy( message16 ); - CleanupStack::PopAndDestroy( message ); - } - - FLOG(_L(" 0.6 ")); - CleanupStack::PopAndDestroy( &rstr ); - - // Map resultcode to FUMO result code - RFotaEngineSession::TState fstate - = RFotaEngineSession::EUpdateFailed; - RFotaEngineSession::TResult fresult - = RFotaEngineSession::EResUpdateFailed; - - TDriveNumber drive; - TBool toencrypt = iFotaServer->NeedToEncryptL(drive); - - FLOG(_L(" 3")); - switch ( result ) - { - case UPD_OK: - { - fstate = RFotaEngineSession::EUpdateSuccessfulNoData; - fresult = RFotaEngineSession::EResSuccessful; - deleteData = ETrue; - LaunchNotifierL ( ESyncMLFwUpdResultNote, KErrNone, toencrypt ); - } - break; - case UPD_INSTALL_REQUEST_IS_INVALID: - { - fstate = RFotaEngineSession::EUpdateFailedNoData; - fresult = RFotaEngineSession::EResUpdateFailed; - deleteData = ETrue; - LaunchNotifierL ( ESyncMLFwUpdResultNote, KErrNotFound, toencrypt ); - } - break; - case UPD_UPDATE_PACKAGE_IS_ABSENT: - { - fstate = RFotaEngineSession::EUpdateFailedNoData; - fresult = RFotaEngineSession::EResUpdateFailed; - } - break; - case UPD_UPDATE_PACKAGE_IS_CORRUPTED: - { - fstate = RFotaEngineSession::EUpdateFailedNoData; - fresult = RFotaEngineSession::EResCorruptedFWUPD; - deleteData = ETrue; - LaunchNotifierL ( ESyncMLFwUpdResultNote, KErrNotSupported, toencrypt ); - } - break; - case UPD_UPDATE_PACKAGE_CONTENTS_IS_INVALID: - { - fstate = RFotaEngineSession::EUpdateFailedNoData; - fresult = RFotaEngineSession::EResCorruptedFWUPD; - deleteData = ETrue; - LaunchNotifierL ( ESyncMLFwUpdResultNote, KErrNotSupported, toencrypt ); - } - break; - case UPD_UPDATE_PACKAGE_IS_NOT_COMPATIBLE_WITH_CURRENT_MOBILE_DEVICE: - { - fstate = RFotaEngineSession::EUpdateFailedNoData; - fresult = RFotaEngineSession::EResPackageMismatch; - deleteData = ETrue; - LaunchNotifierL ( ESyncMLFwUpdResultNote, KErrNotSupported, toencrypt ); - } - break; - case UPD_FATAL_ERROR: - { - fstate = RFotaEngineSession::EUpdateFailedNoData; - fresult = RFotaEngineSession::EResUpdateFailed; - deleteData = ETrue; - LaunchNotifierL ( ESyncMLFwUpdResultNote, KErrNotFound, toencrypt ); - } - break; - - default: - { - FLOG(_L(" 3.1 invalid result: %d"), result); - LaunchNotifierL ( ESyncMLFwUpdResultNote, KErrNotFound, toencrypt ); - } - break; - } - - // Find the state 60 (update progressing) -> 100 (etc) - RArray states; - TPackageState state; - CleanupClosePushL (states); - iFotaServer->iDatabase->OpenDBL(); - iFotaServer->iDatabase->GetAllL(states); - - FLOG(_L(" 4.1 found %d states "),states.Count() ); - for(TInt i=0;iiDatabase->GetStateL( states[i] ); - FLOG(_L(" 5 got state ")); - if ( tmp.iState == RFotaEngineSession::EUpdateProgressing ) - { - state = tmp; - state.iState = fstate; - state.iResult = fresult; - FLOG(_L(" 6 Updating state id %d to %d ,result %d ") - ,state.iPkgId, state.iState,state.iResult ); - iFotaServer->iDatabase->SetStateL(state,KNullDesC8 - ,EFDBState|EFDBResult ) ; - } - } - iFotaServer->iDatabase->CloseAndCommitDB(); - CleanupStack::PopAndDestroy(&states); - - - // Delete request file - err = BaflUtils::DeleteFile ( *iFs, KUpdateRequestFile ); - if ( err != KErrNone && err != KErrNotFound ) - { - FLOG(_L(" 6.1 req file deleted, err %d"), err); - User::Leave(err); - } - - // Write timestamp (shown to user in device management ui) - if( fresult == RFotaEngineSession::EResSuccessful ) - { - RFileWriteStream wstr; - TTime time; - User::LeaveIfError( wstr.Replace( *iFs, KUpdateTimeStampFileName - ,EFileWrite ) ); - CleanupClosePushL ( wstr ); - time.HomeTime(); - TInt year = time.DateTime().Year(); - TInt month = time.DateTime().Month(); - TInt day = time.DateTime().Day(); - TInt hour = time.DateTime().Hour(); - TInt minute = time.DateTime().Minute(); - wstr.WriteInt32L(year) ; - wstr.WriteInt32L(month) ; - wstr.WriteInt32L(day) ; - wstr.WriteInt32L(hour) ; - wstr.WriteInt32L(minute) ; - CleanupStack::PopAndDestroy (1); // wstr - } - // Delete package content - if ( deleteData && state.iPkgId > KErrNotFound ) - { - iFotaServer->StoragePluginL()->DeleteUpdatePackageL( state.iPkgId ) ; - } - - - // Report state back to syncml server - if ( state.iPkgId >= 0 ) - { - FLOG(_L(" 6.1 creating device mgmt session for profile %d") - ,state.iProfileId); - iFotaServer->CreateDeviceManagementSessionL( state ); - } - else - { - FLOG(_L(" No state found in 'update progress' mode! cannot report\ - status to DM server ")); - } - - FLOG(_L("CFotaUpdate::ExecuteUpdateResultFileL <<")); - } - -// --------------------------------------------------------------------------- -// CFotaUpdate::DeleteUpdateResultsL -// --------------------------------------------------------------------------- -// -void CFotaUpdate::DeleteUpdateResultFileL( RFs& aRfs ) - { - FLOG(_L("CFotaUpdate::DeleteUpdateResultsL ")); - // Delete result file - BaflUtils::DeleteFile( aRfs, KUpdateResultFile ); - BaflUtils::DeleteFile( aRfs, KUpdateRequestFile ); - BaflUtils::DeleteFile( aRfs, KUpdateBitmap ); - BaflUtils::DeleteFile( aRfs, KRestartingBitmap ); - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::RunL -// Handles user selection (button press: accept/ cancel update) -// --------------------------------------------------------------------------- -// -void CFotaUpdate::RunL() - { - FLOG(_L( "[FotaServer] CFotaUpdate::RunL() >> %d" ),iStatus.Int() ); - TBool handled( EFalse ); - User::LeaveIfError(iNotifier.CancelNotifier(KSyncMLFwUpdNotifierUid)); - iNotifier.Close(); - - if (iStatus.Int() == KErrNotFound ) - { - FLOG(_L("Exiting....")); - TApaTaskList taskList(iFotaServer->GetEikEnv()->WsSession()); - TApaTask task=taskList.FindApp(TUid::Uid(KOmaDMAppUid)); - if(task.Exists()) - { - task.EndTask(); - } - return; - - } - // Handle update start query - if ( iNotifParams.iNoteType == ESyncMLFwUpdStartQuery ) - { - FLOG(_L(" update start query")); - // User pressed accept - if ( iStatus.Int() == KErrNone ) - { - handled = ETrue; - HandleUpdateAcceptStartL(); - } - // User pressed later - else if ( iStatus.Int() == KErrCancel ) - { - - FLOG(_L("USER PRESSED LATER")); - handled = ETrue; - HandleUpdateAcceptLaterL(); - } - } - if ( iNotifParams.iNoteType == ESyncMLFwUpdStartQueryEnc ) - { - FLOG(_L(" update start query")); - - if ( iStatus.Int() == KErrNone ) - { - FLOG(_L(" user accepted query to decrypt memory")); - handled = ETrue; - TRAPD(err, iFotaServer->DoStartDecryptionL()); - - if (err == KErrNotReady) - { - HandleUpdateErrorL(err); - } - } - else if (iStatus.Int() == KErrCancel ) - { - FLOG(_L("User pressed cancel. Don't decrypt. Stop.")); - handled = ETrue; - LaunchNotifierL( ESyncMLFwUpdNoReminder , KErrNone ); - } - - } - // Handle battery error - if ( iNotifParams.iNoteType == ESyncMLFwUpdErrorNote ) - { - - if (iNotifParams.iIntParam == KErrBadPower || iNotifParams.iIntParam == KErrBadUsbPower) - { - FLOG(_L(" battery note")); - if ( iStatus.Int() == KErrNone ) - { - handled = ETrue; - - // Still check batt. (user might have connected charger) - - HandleErrorBasedonChargingTypeL(); - - } - else if (iNotifParams.iIntParam == KErrDeviceMemoryBusy) - { - FLOG(_L("Do nothing. Stop the update.")); - iFotaServer->FinalizeUpdateL(); - } - else if (iNotifParams.iIntParam == KErrBadPowerForEnc) - { - if (iFinalizeLater) - { - FLOG(_L("Finalizing update now...")); - iFinalizeLater = EFalse; - iFotaServer->FinalizeUpdateL(); - } - } - } - } - - // Handle update complete notification - if ( iNotifParams.iNoteType == ESyncMLFwUpdResultNote ) - { - handled = ETrue; - DeleteUpdateResultFileL( iFotaServer->iFs ); - if (!iNotifParams.iEncryptReq) - { - FLOG(_L("Going to finalize update...")); - iFotaServer->FinalizeUpdateL(); - } - - } - if ( iNotifParams.iNoteType == ESyncMLFwUpdNoReminder ) - { - FLOG(_L(" No Reminder selected")); - if ( iStatus.Int() == KErrNone ) - { - handled = ETrue; - - FindScheduleL( ETrue ); - iUpdateState.iState = RFotaEngineSession::EStartingUpdate; - iFotaServer->iDatabase->OpenDBL(); - iFotaServer->iDatabase->SetStateL(iUpdateState ,KNullDesC8,EFDBState); - iFotaServer->iDatabase->CloseAndCommitDB(); - - // Report state back to syncml server - if ( iUpdateState.iPkgId >= 0 && iUpdateState.iSendAlert ) - { - FLOG(_L(" creating device mgmt session for profile %d") - ,iUpdateState.iProfileId); - iFotaServer->CreateDeviceManagementSessionL( iUpdateState ); - } - iFotaServer->FinalizeUpdateL(); - } - } - if ( iNotifParams.iNoteType == ESyncMLFwUpdResultNote && iNotifParams.iEncryptReq) - { - if (iStatus.Int() == KErrNone) - { - FLOG(_L("User wanted to start encryption...")); - iFotaServer->DoStartEncryptionL(); - } - else - { - FLOG(_L("User do not want to start encryption.")); - } - if (!iFinalizeLater) - iFotaServer->FinalizeUpdateL(); - } - if ( !handled ) - { - FLOG(_L("CANNOT INTERPRET NOTIFIER RESULT CODE: %d"), iStatus.Int() ); - } - - FLOG(_L( "[FotaServer] CFotaUpdate::RunL() <<" ) ); - } - - - - - -// --------------------------------------------------------------------------- -// CFotaUpdate::HandleUpdateAcceptStartL() -// Handles user selection of NOW -// --------------------------------------------------------------------------- -// -void CFotaUpdate::HandleUpdateAcceptStartL(TBool aSkipBatteryChk) - { - FLOG(_L("USER PRESSED ACCEPT")); - - TBool enoughPower (EFalse); - TInt usbchargingsupport =0; - if (aSkipBatteryChk) - { - enoughPower = ETrue; - } - else - { - CRepository* centrep = NULL; - //centrep = CRepository::NewLC( TUid::Uid(KFotaServerUid)); - TRAPD(err, centrep = CRepository::NewL( TUid::Uid(KFotaServerUid))); - if(err) - { - FLOG(_L("reading from cenrep failed")); - } - - if(centrep) - {centrep->Get( KFotaUSBChargerEnabled , usbchargingsupport ); - if(usbchargingsupport != 0 && usbchargingsupport != 1) - usbchargingsupport =0; - delete centrep; - } - centrep = NULL; - enoughPower = CheckBatteryL(usbchargingsupport); -#if defined(__WINS__) - enoughPower = ETrue; -#endif - } - // Failure due to low battery - if ( !enoughPower ) - { - FLOG(_L("Launching low battery notifier")); - if(!usbchargingsupport) - LaunchNotifierL( ESyncMLFwUpdErrorNote, KErrBadPower ); - else - LaunchNotifierL( ESyncMLFwUpdErrorNote , KErrBadUsbPower ); - } - else - { - UpdateL(); - } - } - - -void CFotaUpdate::HandleUpdateErrorL(TInt aError, TInt aValue) - { - FLOG(_L("CFotaUpdate::HandleUpdateErrorL, error = %d, value = %d >>"), aError, aValue); - - switch (aError) - { - case KErrNotReady: //Called from within StartUpdate - { - LaunchNotifierL(ESyncMLFwUpdErrorNote,KErrDeviceMemoryBusy); - } - break; - case KErrBadPower: //Called from fotaserver when battery power is not enough - { - iChargeToMonitor = aValue; - CRepository* centrep = NULL; - TRAPD(err, centrep = CRepository::NewL( TUid::Uid(KFotaServerUid))); - if(err) - { - FLOG(_L("reading from cenrep failed")); - } - TInt usbchargingsupport =0; - if(centrep) - {centrep->Get( KFotaUSBChargerEnabled , usbchargingsupport ); - if(usbchargingsupport != 0 && usbchargingsupport != 1) - usbchargingsupport =0; - delete centrep; - } - centrep = NULL; - FLOG(_L("Launching low battery notifier, usbsupport = %d, state = %d"), usbchargingsupport, iUpdateState.iState); - if(!usbchargingsupport ) - { - FLOG(_L("Here 1")); - if (iUpdateState.iState == RFotaEngineSession::EStartingUpdate) - { - FLOG(_L("Here 2")); - LaunchNotifierL( ESyncMLFwUpdErrorNote, KErrBadPower ); - } - } - else - { - LaunchNotifierL( ESyncMLFwUpdErrorNote , KErrBadUsbPower ); - } - - } - break; - default: - { - //Do nothing - } - } - - - FLOG(_L("CFotaUpdate::HandleUpdateErrorL <<")); - } - -void CFotaUpdate::HandleEncryptionErrorL(TInt aError) - { - FLOG(_L("CFotaUpdate::HandleEncryptionErrorL, error = %d >>"), aError); - - if (aError == KErrBadPower) - { - iFinalizeLater = ETrue; - LaunchNotifierL(ESyncMLFwUpdErrorNote, KErrBadPowerForEnc); - } - else - { - FLOG(_L("Unknown error. Ignored")); - } - - FLOG(_L("CFotaUpdate::HandleEncryptionErrorL <<")); - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::HandleUpdateAcceptLaterL -// Handles user selection of Later -// --------------------------------------------------------------------------- -void CFotaUpdate::HandleUpdateAcceptLaterL() - { - TInt fotaUpdateAppName (EFotaUpdateDM); - TInt err = RProperty::Get( KPSUidNSmlDMSyncApp, KNSmlCurrentFotaUpdateAppName, fotaUpdateAppName ); - FLOG(_L("Setting iHandleUpdateAcceptLater to True")); - - if (!err && ((fotaUpdateAppName == EFotaUpdateNSC) || (fotaUpdateAppName == EFotaUpdateNSCBg ))) - { - iFotaServer->FinalizeUpdateL(); //make sure it is not called 2 times - } - else - { - iHandleUpdateAcceptLater = ETrue; - ShowReminderDialogL(); - } - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::HandleErrorBasedonChargingTypeL -// Handles the error based on charger type supported by the device -// --------------------------------------------------------------------------- - -void CFotaUpdate::HandleErrorBasedonChargingTypeL() - { - FLOG(_L("CFotaUpdate::HandleErrorBasedonChargingTypeL >>")); - - if (iUpdateState.iState == RFotaEngineSession::EStartingUpdate) - { - if (iNotifParams.iIntParam == KErrBadUsbPower) - { - FLOG(_L("handling usb charger error ")); - SetUpdateFailedStatesL(); - FLOG(_L("calling for monitoring the battery")); - iFotaServer->MonitorBattery(iChargeToMonitor); - iFotaServer->FinalizeUpdateL(); - } - else - { - TInt usbcharger = KErrNone; - TBool enoughPower = CheckBatteryL(usbcharger); - -#if defined(__WINS__) - //It will not come here, just used for testing. - enoughPower = ETrue; -#endif - - if (enoughPower) - { - //User has connected the charger - FLOG(_L("User has connected the charger")); - UpdateL(); - } - else - { - FLOG(_L("User hasn't connected the charger")); - //User hasn't connected the charger, hence notify user to update later. - SetUpdateFailedStatesL(); - //Call reminder here - if(!iHandleUpdateAcceptLater) - { - FLOG(_L("calling HandleUpdateAcceptLaterL")); - HandleUpdateAcceptLaterL(); - } - iHandleUpdateAcceptLater = EFalse; - } - } - } - else //must be during encryption after update - { - if (iNotifParams.iIntParam == KErrBadUsbPower) - { - iFotaServer->MonitorBattery(iChargeToMonitor); - } - else - { - //nothing to do for dynamo charging - } - iFotaServer->FinalizeUpdateL(); - } - FLOG(_L("CFotaUpdate::HandleErrorBasedonChargingTypeL <<")); - } - -// --------------------------------------------------------------------------- -// CFotaUpdate::SetUpdateFailedStatesL -// Set the state to update failed -// --------------------------------------------------------------------------- - -void CFotaUpdate::SetUpdateFailedStatesL() - { - FLOG(_L("CFotaUpdate::SetUpdateFailedStatesL >>")); - - iUpdateState.iState = RFotaEngineSession::EStartingUpdate; - iUpdateState.iResult= RFotaEngineSession::EResUpdateFailed; - iFotaServer->iDatabase->OpenDBL(); - iFotaServer->iDatabase->SetStateL( iUpdateState ,KNullDesC8 - ,EFDBState|EFDBResult ); - iFotaServer->iDatabase->CloseAndCommitDB(); - - FLOG(_L("CFotaUpdate::SetUpdateFailedStatesL <<")); - - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::DoCancel() -// --------------------------------------------------------------------------- -// -void CFotaUpdate::DoCancel() - { - FLOG(_L("CFotaUpdate::DoCancel() >>")); - iNotifier.CancelNotifier(KSyncMLFwUpdNotifierUid); - iNotifier.Close(); - FLOG(_L("CFotaUpdate::DoCancel() <<")); - } - -// --------------------------------------------------------------------------- -// CFotaUpdate::RunError(TInt aError) -// --------------------------------------------------------------------------- -// -TInt CFotaUpdate::RunError(TInt aError) - { - FLOG(_L("CFotaUpdate::RunError >> err %d"),aError); - FLOG(_L("CFotaUpdate::RunError << err %d"),aError); - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CSyncMLNTestAppAO::LaunchNotifierL -// Shows one of the following queries: "update now?", "update success", -// "update fail", "too low battery" -// --------------------------------------------------------------------------- -void CFotaUpdate::LaunchNotifierL( const TSyncMLFwUpdNoteTypes aNotetype - ,const TInt aIntParam, const TBool aEnc ) - { - FLOG(_L("CFotaUpdate::LaunchNotifierL() >> prof.Id: %d") - ,iUpdateState.iProfileId); - if (!IsActive()) - { - TSyncMLFwUpdNotifParams params; - params.iNoteType = aNotetype; - params.iIntParam = aIntParam; - params.iEncryptReq = aEnc; - TSyncMLFwUpdNotifParamsPckg pckg(params); - iNotifParams.iNoteType = params.iNoteType; - iNotifParams.iIntParam = params.iIntParam; - iNotifParams.iEncryptReq = params.iEncryptReq; - iDummyResponsePckg = TSyncMLFwUpdNotifRetValPckg(); - User::LeaveIfError( iNotifier.Connect() ); - iNotifier.StartNotifierAndGetResponse( iStatus,KSyncMLFwUpdNotifierUid - , pckg, iDummyResponsePckg ); - SetActive(); - } - FLOG(_L("CFotaUpdate::LaunchNotifierL() <<")); - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::UpdateL -// Updates the fw: Creates input files for update agent and boots device to -// update mode. -// --------------------------------------------------------------------------- -void CFotaUpdate::UpdateL() - { - FLOG(_L("CFotaUpdate::UpdateL() >>")); - // Set state ........................................ - iUpdateState.iState = RFotaEngineSession::EUpdateProgressing; - iFotaServer->iDatabase->OpenDBL(); - iFotaServer->iDatabase->SetStateL( iUpdateState ,KNullDesC8, EFDBState ); - iFotaServer->iDatabase->CloseAndCommitDB(); - - // Write update request for update agent.............. - FLOG(_L("CFotaUpdate::UpdateL 1 writing update.req ")); - TBuf8<150> dp2filepath; - HBufC16* dp2; - RFileWriteStream wstr; - CleanupClosePushL ( wstr ); - FLOG(_L("CFotaUpdate::UpdateL 2 getting pkg location")); - iFotaServer->StoragePluginL()->GetUpdatePackageLocationL( - iUpdateState.iPkgId, dp2filepath ); - FLOG(_L("CFotaUpdate::UpdateL 3 craeting update.req") ); - User::LeaveIfError( wstr.Replace( iFotaServer->iFs - ,KUpdateRequestFile, EFileWrite ) ); - wstr.WriteInt16L( 1 ); // version number is 1 - wstr.WriteInt32L( 1 ); // count of cmds is 1 - wstr.WriteInt16L( 0 ); // requestid is 0 - - dp2 = HBufC16::NewLC ( dp2filepath.Length( ) ); - dp2->Des().Copy( dp2filepath ); - wstr.WriteInt32L( dp2->Des().Length() + 1 ); // length of filename + null - wstr.WriteL( dp2->Des() ); - wstr.WriteInt16L( 0 ); // null character - CleanupStack::PopAndDestroy( dp2 ); - CleanupStack::PopAndDestroy( &wstr ); // wstr - - FLOG(_L("CFotaUpdate::UpdateL 4 craeting update.bmp") ); - - // Write update graphic for update agent ............... - HBufC* updatetxt; - HBufC* restarttxt; - updatetxt = StringLoader::LoadLC( R_APPS_FOTA_UPDATING ); - restarttxt = StringLoader::LoadLC( R_APPS_FOTA_RESTARTING ); - WriteUpdateBitmapL( updatetxt->Des(), KUpdateBitmap ); - WriteUpdateBitmapL( restarttxt->Des(), KRestartingBitmap ); - CleanupStack::PopAndDestroy( restarttxt ); - CleanupStack::PopAndDestroy( updatetxt ); - TRAPD(error,FindScheduleL( ETrue)); //deleting the schedule (fix for failed update) - if(error) - { - FLOG(_L("CFotaUpdate::UpdateL error in deleting previous schedule") ); - - } - // Simulate update agent by writing result file. - CRepository* centrep( NULL); - TInt err = KErrNone; - TRAP(err, centrep = CRepository::NewL( KCRUidFotaServer ) ); - TInt simulate(KErrNotFound); - if ( centrep ) - { - err = centrep->Get( KSimulateUpdateAgent, simulate ); - } - delete centrep; - if ( simulate>0 ) - { - FLOG(_L("CFotaUpdate::UpdateL 5 - writing update.resp")); - RFileWriteStream respstr; - CleanupClosePushL ( respstr ); - User::LeaveIfError( respstr.Replace( iFotaServer->iFs, KUpdateResultFile - , EFileWrite ) ); - - respstr.WriteUint32L(UPD_OK); - respstr.WriteUint32L(15); - respstr.WriteL(_L("UPDATE DONE!")); - CleanupStack::PopAndDestroy( &respstr ); - } - - CRepository* centrep2 = NULL; - TRAP( err, centrep2 = CRepository::NewL( KCRUidFotaServer ) ) - if (err==KErrNone ) - { - centrep2->Set( KFotaUpdateState, EFotaPendingGenAlert ); - } - delete centrep2; - - // Boot to update mode - LaunchNotifierL( ESyncMLFwUpdRebootNote, KErrNone); - - FLOG(_L(" waiting 2 sec to keep 'restarting' visible")); - User::After(TTimeIntervalMicroSeconds32(2000000)); - - RStarterSession starter; - FLOG(_L(" starter->Connect")); - User::LeaveIfError(starter.Connect()); - starter.Reset(RStarterSession::EFirmwareUpdate); - starter.Close(); - FLOG(_L("CFotaUpdate::UpdateL() <<")); - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::CheckBatteryL() -// Cheks if there's enough battery power to update -// --------------------------------------------------------------------------- -// -TBool CFotaUpdate::CheckBatteryL(TBool aUSBChargingsupported) - { - TInt chargingstatus( EChargingStatusError ); - TInt batterylevel( 1 ); - TBool enoughPower( EFalse ); - // Read battery - FLOG(_L(" 0.9 checking batt level")); - RProperty pw; - User::LeaveIfError(pw.Attach(KPSUidHWRMPowerState,KHWRMBatteryLevel)); - User::LeaveIfError(pw.Get( batterylevel )); - pw.Close(); - if(aUSBChargingsupported) - { - if ( batterylevel >= EBatteryLevelLevel2 ) - enoughPower = ETrue; - - //return enoughPower; - } - else - { - User::LeaveIfError(pw.Attach(KPSUidHWRMPowerState,KHWRMChargingStatus)); - User::LeaveIfError(pw.Get( chargingstatus )); - pw.Close(); - - // Too low battery, power insufficient - if ( batterylevel >= EBatteryLevelLevel2 ) - { - enoughPower = ETrue; - } - // But charger is connected, power sufficient - if ( chargingstatus != EChargingStatusError - && chargingstatus != EChargingStatusNotConnected ) - { - enoughPower = ETrue; - } - } - - if (!enoughPower) - iChargeToMonitor = EBatteryLevelLevel2; - FLOG(_L(" 1.0 batt level: %d (0..7), chargingstatus %d") - ,batterylevel,chargingstatus); - FLOG(_L("CFotaUpdate::checkBattery %d"), enoughPower?1:0 ); - return enoughPower; - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::StartUpdateL -// Starts fw updating (shows a notifier to user). -// --------------------------------------------------------------------------- -// -void CFotaUpdate::StartUpdateL( const TDownloadIPCParams &aParams ) - { - FLOG(_L("CFotaUpdate::StartUpdateL(TDownloadIPCParams aParams) >> \ - pkig:%d"), aParams.iPkgId ); - TSmlProfileId profile(KErrNotFound); - - // Get update state from db - iFotaServer->iDatabase->OpenDBL( ); - iUpdateState = iFotaServer->iDatabase->GetStateL( aParams.iPkgId ); - iFotaServer->iDatabase->CloseAndCommitDB( ); - - FLOG(_L(" 0 ")); - if ( iUpdateState.iPkgId == KErrNotFound ) - { - FLOG(_L(" STATE NOT FOUND pkgid %d"), aParams.iPkgId); - User::Leave(KErrNotFound); - } - - // Resolve profile id - RSyncMLSession sml; - TInt tmp1; - TSmlServerAlertedAction tmp2; - TBool tmp3; - TInt tmp4; - CleanupClosePushL( sml ); - sml.OpenL(); - // Use stored profile - if ( aParams.iProfileId == KErrNotFound ) - { - iFotaServer->GetProfileDataL( &sml,iUpdateState.iProfileId - ,tmp1,tmp2,tmp3,tmp4); - profile = iUpdateState.iProfileId; - } - // Use passed profile. If error, then try to use stored profile - else - { - TRAPD(err, iFotaServer->GetProfileDataL( &sml,aParams.iProfileId - ,tmp1,tmp2, tmp3, tmp4 ) ); - if ( err != KErrNone ) - { - iFotaServer->GetProfileDataL( &sml,iUpdateState.iProfileId - ,tmp1,tmp2,tmp3,tmp4); - profile = iUpdateState.iProfileId; - } - else - { - profile = aParams.iProfileId; - } - } - CleanupStack::PopAndDestroy( &sml ); - - // Must update package state with fresh params (it could be empty) - TUint fields = EFDBState | EFDBPkgName|EFDBVersion; - if ( profile != iUpdateState.iProfileId ) - { - fields |= EFDBProfileId; - } - - iUpdateState.iProfileId = profile; - iUpdateState.iPkgName = aParams.iPkgName; - iUpdateState.iPkgVersion = aParams.iPkgVersion; - iUpdateState.iState = RFotaEngineSession::EStartingUpdate; - iUpdateState.iResult = KErrNotFound; - iUpdateState.iSendAlert = EFalse; // HJHA-6MJCFE . This operation will - // not reach any final state. - iFotaServer->iDatabase->OpenDBL( ); - iFotaServer->iDatabase->SetStateL( iUpdateState, KNullDesC8, fields ); - iFotaServer->iDatabase->CloseAndCommitDB( ); - - CRepository* centrep2 = NULL; - TRAPD( err, centrep2 = CRepository::NewL( KCRUidFotaServer ) ) - if (err==KErrNone ) - { TInt val; - // - centrep2->Get( KFotaUpdateState, val ); - - if(val == EFotaUpdateInterrupted) - centrep2->Set( KFotaUpdateState, EFotaDefault ); - } - delete centrep2; - - FLOG(_L("CFotaUpdate::StartUpdateL 2")); - //new code - TInt client = iFotaServer->GetInstallUpdateClientL(); - if( CheckUpdateVariations() && - client!= CFotaSrvSession::EOMADMAppUi && - client != CFotaSrvSession::EFMSServer ) - { - TInt callactive(EFalse); - RFMSClient fmsclient; - TRAPD(err,fmsclient.OpenL()); - if(err == KErrNone) - { - CleanupClosePushL(fmsclient); - FLOG(_L("CFotaUpdate::startupdate FMS for active call >>")); - TInt err1 = fmsclient.IsPhoneCallActive(callactive); - FLOG(_L("IsPhoneCallActive returns %d >>"),err1); - } - if(callactive) - { - FLOG(_L(" active phone call found")); - - FLOG(_L("putting call end Ao start pkgid=%d, profileid=%d"),iUpdateState.iPkgId,iUpdateState.iProfileId); - TInt err1 = fmsclient.MonitorActivePhoneCallEnd(iUpdateState.iPkgId,iUpdateState.iProfileId); - FLOG(_L("MonitorActivePhoneCallEnd returns %d >>"),err1); - } - else - { - FLOG(_L("CFotaUpdate::StartUpdateL 2")); - - TDriveNumber drive; - - TBool ret (EFalse); - TRAPD(err2, ret = iFotaServer->NeedToDecryptL(iUpdateState.iPkgId, drive)); - if ( err2 == KErrNone ) - { - if (!ret) - { - //Drive is not encrypted - LaunchNotifierL( ESyncMLFwUpdStartQuery, iUpdateState.iProfileId ); - } - else - { - //Drive is encrypted. - LaunchNotifierL( ESyncMLFwUpdStartQueryEnc, iUpdateState.iProfileId ); - } - } - else - { - HandleUpdateErrorL(err2); - } - - } - if(err == KErrNone) //fms opening error - { - CleanupStack::PopAndDestroy(&fmsclient); - } - } - else - { - FLOG(_L("CFotaUpdate::StartUpdateL 2 DM UI Install update")); - //LaunchNotifierL( ESyncMLFwUpdStartQuery, iUpdateState.iProfileId ); - - TDriveNumber drive; - - TBool ret (EFalse); - TRAP(err, ret = iFotaServer->NeedToDecryptL(iUpdateState.iPkgId, drive)); - if ( err == KErrNone ) - { - if (!ret) - { - //Drive is not encrypted - LaunchNotifierL( ESyncMLFwUpdStartQuery, iUpdateState.iProfileId ); - } - else - { - //Drive is encrypted. - LaunchNotifierL( ESyncMLFwUpdStartQueryEnc, iUpdateState.iProfileId ); - } - } - else - { - HandleUpdateErrorL(err); - } - - } - - //new code - - - FLOG(_L("CFotaUpdate::StartUpdateL(TDownloadIPCParams aParams) << \ - pkig:%d"),aParams.iPkgId); - } - - - -// --------------------------------------------------------------------------- -// CFotaUpdate::CreateRadionButtonArrayLC -// Creates the array of radio buttons to display -// on radio button setting page -// --------------------------------------------------------------------------- -// - -CDesCArray* CFotaUpdate::CreateRadionButtonArrayLC( const TScheduleEntryInfo2 aScEntry, - TInt& aSelectionIndex) - { - // selection defaults to 0 - FLOG(_L("CFotaUpdate::CreateRadionButtonArrayLC >>")); - aSelectionIndex = 0; - CDesCArray* array = new (ELeave) CDesC16ArrayFlat(4); - CleanupStack::PushL(array); - for (TInt i=0;iAppendL( string1->Des() ); - CleanupStack::PopAndDestroy( string1 ); - if(aScEntry.Interval() == iInterval[i] && aScEntry.IntervalType()== EHourly ) - aSelectionIndex = i; - } - break; - - case EDaily: - { - - HBufC* string1; //= StringLoader::LoadLC(R_QTN_FOTA_REMINDER_DAYS , iInterval[i] ); - if(iInterval[i] == 1) - string1 = StringLoader::LoadLC(R_FOTA_RADIO_DIALOG_1DAY_REMAINDER); - else - string1 = StringLoader::LoadLC(R_QTN_FOTA_REMINDER_DAYS , iInterval[i] ); - - array->AppendL( string1->Des() ); - CleanupStack::PopAndDestroy( string1 ); - if(aScEntry.Interval() == iInterval[i] && aScEntry.IntervalType()== EDaily ) - aSelectionIndex = i; - } - break; - case EMonthly: - { - - HBufC* string1 ;//== StringLoader::LoadLC(R_QTN_FOTA_REMINDER_MINUTES , iInterval[i] ); - if(iInterval[i] == 1) - string1 = StringLoader::LoadLC(R_QTN_FOTA_REMINDER_1_MINUTE); - else - string1 = StringLoader::LoadLC(R_QTN_FOTA_REMINDER_MINUTES , iInterval[i] ); - - array->AppendL( string1->Des() ); - CleanupStack::PopAndDestroy( string1 ); - if(aScEntry.Interval() == iInterval[i] && aScEntry.IntervalType()== EMonthly) - aSelectionIndex = i; - } - break; - - /*case EYearly: - { - tempChar.Num(iInterval[i]); - HBufC* string1 = StringLoader::LoadLC(R_FOTA_RADIO_DIALOG_YEAR_REMAINDER , iInterval[i] ); - array->AppendL( string1->Des() ); - CleanupStack::PopAndDestroy( string1 ); - if(aScEntry.Interval() == iInterval[i] ) - aSelectionIndex = i; - } - break;*/ - } - } - - if(iIntervalType[iIntervalType.Count()-1] == ENoReminderOn ) - { - HBufC* string1 = StringLoader::LoadLC( R_FOTA_RADIO_DIALOG_NO_REMAINDER); - array->AppendL( string1->Des() ); - CleanupStack::PopAndDestroy( string1 ); - } - FLOG(_L("CFotaUpdate::CreateRadionButtonArrayLC <<")); - return array; - } -// --------------------------------------------------------------------------- -// CFotaUpdate::ParseScheduleString() -// Parse the schedule string from cenrep -// --------------------------------------------------------------------------- -// -// -void CFotaUpdate::ParseScheduleStringL() - { - FLOG(_L("CFotaUpdate::ParseScheduleString() >>")); - - GetSchedulesInfoL(); - - - - iInterval.Reset(); - iIntervalType.Reset(); - TBuf<5> aTime; - TBuf<9> aSched,tempChar; - aTime.Zero(); - aSched.Zero(); - - - //TText*sep = (TText *)ksep.Ptr(); - TBufC<1>ksep(Ksep); - TText *t = (TText *)ksep.Ptr(); //just for Initialization - for(TInt i = 0; i 3 ) - { - iInterval.Reset(); iIntervalType.Reset(); - iInterval.Append(1); iIntervalType.Append(EHourly); - iInterval.Append(4); iIntervalType.Append(EHourly); - iInterval.Append(1); iIntervalType.Append(EDaily); - iInterval.Append(3); iIntervalType.Append(EDaily); - checkSchInfo =ETrue; - break; - } - } - } - else - { - iInterval.Reset(); iIntervalType.Reset(); - iInterval.Append(1); iIntervalType.Append(EHourly); - iInterval.Append(4); iIntervalType.Append(EHourly); //setting to default 1h:4h:1d:3d - iInterval.Append(1); iIntervalType.Append(EDaily); - iInterval.Append(3); iIntervalType.Append(EDaily); - checkSchInfo =ETrue; - } - - TPtrC16 lastFive = iscInfo.Right(5); - _LIT( KNoRem , "NROFF"); - TPtrC noRem( KNoRem ); //check for No Remainder - if (lastFive != noRem || checkSchInfo) - { - iIntervalType.Append(ENoReminderOn); - } - else - { - iIntervalType.Append(ENoReminderOff); - - } - FLOG(_L("CFotaUpdate::ParseScheduleString() <<")); - - } - - -// --------------------------------------------------------------------------- -// CFotaUpdate::GetSchedulesInfoL -// Get the schedule info from the cenrep -// --------------------------------------------------------------------------- -// -// -void CFotaUpdate::GetSchedulesInfoL() - { - - CRepository* centrep = NULL; - //TBuf<255> scInfo; - centrep = CRepository::NewLC( TUid::Uid(KFotaServerUid)); - if ( centrep ) - {TBuf<255> temp; - if (centrep->Get( KFotaOptionsForReminderDuration , temp )==KErrNone && temp.Length() ) - { FLOG(_L("CFotaUpdate::ParseScheduleString taking from cenrep <<")); - temp.Trim(); //read from cenrep - iscInfo.Copy(temp); - } - else - { //else set to default - iscInfo.Copy(KDefaultSched); - - } - CleanupStack::PopAndDestroy(centrep); - } - else - { - iscInfo.Copy(KDefaultSched); //else set to default - } - - } - -// --------------------------------------------------------------------------- -// CFotaUpdate::ShowReminderDialogL -// Prepare and display Reminder Dialog using RFotaReminderDlg -// on radio button setting page -// --------------------------------------------------------------------------- -// -void CFotaUpdate::ShowReminderDialogL() - { - // Push default content to navigation pane and change title - CEikStatusPane* statusPane = iAvkonAppUi->StatusPane(); - CAknNavigationControlContainer* naviPane = NULL; - HBufC* originalTitle; - CAknTitlePane* titlePane = NULL; - originalTitle = HBufC::NewLC( 50 ); //KNsmlMaxTitleSize - - if ( statusPane && statusPane->PaneCapabilities( - TUid::Uid(EEikStatusPaneUidTitle) ).IsPresent() ) - { - naviPane = ( CAknNavigationControlContainer* ) - statusPane->ControlL( TUid::Uid(EEikStatusPaneUidNavi) ); - naviPane->PushDefaultL(); - titlePane = static_cast - ( statusPane->ControlL( TUid::Uid( - EEikStatusPaneUidTitle) ) ); - if ( titlePane->Text() ) - { - originalTitle->Des().Copy( *titlePane->Text() ); - HBufC* titleText = StringLoader::LoadLC( - R_QTN_DM_TITLE_SETTINGS_DIALOG ); - titlePane->SetTextL( *titleText ); - CleanupStack::PopAndDestroy( titleText ); - titleText = NULL; - } - } - - TApaTaskList taskList(iFotaServer->GetEikEnv()->WsSession()); - TApaTask task=taskList.FindApp(TUid::Uid(KFotaServerUid)); - - if(task.Exists()) - task.BringToForeground(); - - // Construct radio btn list and launch radio button dlg - TScheduleEntryInfo2 en=FindScheduleL( EFalse ); - TInt radioSelectionIndex( KErrNotFound ); - TRAPD(error,ParseScheduleStringL()); - if (error) - { - iInterval.Reset(); iIntervalType.Reset(); - iInterval.Append(1); iIntervalType.Append(EHourly); - iInterval.Append(4); iIntervalType.Append(EHourly); - iInterval.Append(1); iIntervalType.Append(EDaily); - iInterval.Append(3); iIntervalType.Append(EDaily); - iIntervalType.Append(ENoReminderOn); - } - if(iInterval.Count() > 4) - { - for(TInt i= 4;i RootWin().OrdinalPriority(); - TInt presentPosition = CEikonEnv::Static()->RootWin().OrdinalPosition(); - CEikonEnv::Static()->RootWin().SetOrdinalPosition(presentPosition, ECoeWinPriorityMedium); //setting the priority to medium for activation on top of global notes - - TInt ret = aFotaReminderDlg->ExecuteLD(CAknSettingPage::EUpdateWhenChanged); - CleanupStack::Pop(aFotaReminderDlg); - CleanupStack::PopAndDestroy( itemArray ); - - CEikonEnv::Static()->RootWin().SetOrdinalPosition(presentPosition, presentPriotiry); //resetting to previous priority - FLOG(_L("****Event key = %d"),aEvent); - - if (aEvent == EEventKey) - { - FLOG(_L("Exiting....")); - TApaTaskList taskList(iFotaServer->GetEikEnv()->WsSession()); - TApaTask task=taskList.FindApp(TUid::Uid(KOmaDMAppUid)); - if(task.Exists()) - { - task.EndTask(); - task.KillTask(); - } - - return; - } - if(naviPane) - naviPane->Pop(); - if( titlePane ) - { - if ( titlePane->Text() && originalTitle ) - { - TRAP_IGNORE( titlePane->SetTextL( *originalTitle ) ); - } - } - CleanupStack::PopAndDestroy( originalTitle ); - task.SendToBackground(); - - CreateNewScheduleL(ret,radioSelectionIndex); - - - } - -// --------------------------------------------------------------------------- -// CFotaUpdate::CreateNewScheduleL -// Creates the new schedule -// --------------------------------------------------------------------------- -// -void CFotaUpdate::CreateNewScheduleL(TInt aRet, TInt aRadioSelectionIndex) - { - - TScheduleEntryInfo2 en=FindScheduleL( EFalse ); - TIntervalType tIntervalType; - TInt tInterval; - if ( aRet && aRadioSelectionIndex== 0 ) - { - FLOG(_L("Creating reminder: for 1st option")); - tIntervalType = (TIntervalType)iIntervalType[aRadioSelectionIndex]; - tInterval = iInterval[aRadioSelectionIndex]; - en=FindScheduleL( ETrue ); - CreateScheduleL ( iUpdateState.iPkgId, tIntervalType ,tInterval ); - iFotaServer->FinalizeUpdateL(); - } - else if(aRet && aRadioSelectionIndex == 1 ) - { - FLOG(_L("Creating reminder: 4 hours")); - tIntervalType = (TIntervalType)iIntervalType[aRadioSelectionIndex]; - tInterval = iInterval[aRadioSelectionIndex]; - en=FindScheduleL( ETrue ); - CreateScheduleL ( iUpdateState.iPkgId, tIntervalType ,tInterval ); - iFotaServer->FinalizeUpdateL(); - } - else if(aRet && aRadioSelectionIndex == 2 ) - { - FLOG(_L("Creating reminder: for 2nd option")); - tIntervalType = (TIntervalType)iIntervalType[aRadioSelectionIndex]; - tInterval = iInterval[aRadioSelectionIndex]; - en=FindScheduleL( ETrue ); - CreateScheduleL ( iUpdateState.iPkgId, tIntervalType ,tInterval ); - iFotaServer->FinalizeUpdateL(); - } - else if(aRet && aRadioSelectionIndex == 3 ) - { - FLOG(_L("Creating reminder: for 3rd option")); - tIntervalType = (TIntervalType)iIntervalType[aRadioSelectionIndex]; - tInterval = iInterval[aRadioSelectionIndex]; - en=FindScheduleL( ETrue ); - CreateScheduleL ( iUpdateState.iPkgId, tIntervalType ,tInterval ); - iFotaServer->FinalizeUpdateL(); - } - else if (!aRet || aRadioSelectionIndex == 4) - { - FLOG(_L("Deleting reminder, btn press %d"),aRet); - TScheduleEntryInfo2 en=FindScheduleL( ETrue ); - - if ( !aRet ) // cancel pressed - { - LaunchNotifierL( ESyncMLFwUpdStartQuery, iUpdateState.iProfileId ); - } - else // ok pressed - { - LaunchNotifierL( ESyncMLFwUpdNoReminder , KErrNone ); - //iFotaServer->FinalizeUpdateL(); - } - } - - } - -// --------------------------------------------------------------------------- -// CFotaUpdate::FindScheduleL -// Finds fotaupdate schedule (named [102072c4]) -// --------------------------------------------------------------------------- -// -TScheduleEntryInfo2 CFotaUpdate::FindScheduleL( const TBool aDelete ) - { - TScheduleEntryInfo2 ret; - TInt err; - RScheduler sc; - - TTsTime time; - TSchedulerItemRef scitem; - CArrayFixFlat* aSchRefArray = new CArrayFixFlat (5); - TScheduleFilter aFilter(EAllSchedules); - User::LeaveIfError( sc.Connect() ); // xx - CleanupClosePushL( sc ); - CleanupStack::PushL(aSchRefArray); - - User::LeaveIfError( sc.GetScheduleRefsL( *aSchRefArray,aFilter) ); // xx - FLOG(_L("Schedule items: ")); - for ( TInt i=0; iCount(); ++i ) - { - TSchedulerItemRef it = (*aSchRefArray)[i]; - if ( it.iName == TUid::Uid(KFotaServerUid).Name() ) - { - TScheduleState2 sc_state; - CArrayFixFlat* sc_entries = new CArrayFixFlat (5); - CArrayFixFlat* sc_tasks = new CArrayFixFlat (5); - TTsTime sc_duetime; - CleanupStack::PushL( sc_entries ); - CleanupStack::PushL( sc_tasks ); - FLOG (_L("%d. schedule handle: %d name:'%S'"),i,it.iHandle, &(it.iName) ); - - err = sc.GetScheduleL ( it.iHandle , sc_state, *sc_entries,*sc_tasks,sc_duetime ); // xx - - TDateTime dtm = sc_duetime.GetLocalTime().DateTime(); - FLOG(_L(" schedule duetime:%d:%d"), dtm.Hour(), dtm.Minute()); - - if ( err ) FLOG(_L(" schedule sc get err %d"),err); - else - { - for ( TInt k=0; kCount();++k) - { - TScheduleEntryInfo2 sc_entry = (*sc_entries)[k]; - ret = sc_entry; - TTime sctime = sc_entry.StartTime().GetLocalTime(); - FLOG(_L(" schedule entry %d int-type:%d int:%d start: %d:%d"),k,sc_entry.IntervalType(),sc_entry.Interval(),sctime.DateTime().Hour(),sctime.DateTime().Minute()); - } - - for ( TInt j=0; jCount();++j) - { - TTaskInfo sc_task = (*sc_tasks)[j]; - FLOG(_L(" schedule task %d '%S'"),sc_task.iTaskId,&(sc_task.iName) ); - if ( aDelete && sc_task.iName==TUid::Uid(KFotaServerUid).Name() ) - { - FLOG(_L(" schedule DeleteTask %d"),sc_task.iTaskId); - User::LeaveIfError( sc.DeleteTask(sc_task.iTaskId) ); // xx - } - } - } - if ( aDelete ) - { - FLOG(_L(" DeleteSchedule %d"),it.iHandle); - User::LeaveIfError(sc.DeleteSchedule(it.iHandle )); // xx - } - CleanupStack::PopAndDestroy( sc_tasks ); - CleanupStack::PopAndDestroy( sc_entries ); - } - } - CleanupStack::PopAndDestroy( aSchRefArray ); - CleanupStack::PopAndDestroy(&sc); - return ret; - } - - - -// --------------------------------------------------------------------------- -// CFotaUpdate::CreateScheduleL -// Creates fotaupdate schedule (named [102072c4]) -// --------------------------------------------------------------------------- -// -TInt CFotaUpdate::CreateScheduleL ( const TInt aPackageId - ,const TIntervalType aIntervalType - ,const TInt aInterval) - { - FLOG(_L("CFotaUpdate::CreateScheduleL ()") ); - const TInt KRepeatForever = 0; - const TInt KTaskPriority = 1; - _LIT(KFotaScheduleExe, "Z:\\sys\\bin\\fotaschedulehandler.exe"); - RScheduler sc; - TTime t; - TTsTime time; - TSchedulerItemRef scitem; - CArrayFixFlat* scentries = new CArrayFixFlat (5); - User::LeaveIfError( sc.Connect() ); // xx - CleanupClosePushL( sc ); - CleanupStack::PushL(scentries ); - t.HomeTime(); - switch (aIntervalType) //create schedule based on the interval type - { - case EHourly : - t = t + ((TTimeIntervalHours)aInterval); - break; - case EDaily : - t = t + ((TTimeIntervalDays) aInterval); - break; - case EMonthly : - t = t + ((TTimeIntervalMinutes ) aInterval); - break; - case EYearly : - t = t + ((TTimeIntervalYears ) aInterval); - break; - default : - User::Panic(KFotaPanic, KErrArgument); - - } - - time.SetLocalTime( t ); - TScheduleEntryInfo2 scentry1(time, aIntervalType, aInterval, (TTimeIntervalMinutes)1440 ) ; // xx - scentries->AppendL( scentry1 ); - - scitem.iName = TUid::Uid(KFotaServerUid).Name(); - User::LeaveIfError( sc.Register(TFileName( KFotaScheduleExe ), 0 ) ); // xxx - User::LeaveIfError( sc.CreatePersistentSchedule(scitem, *scentries) ); // xxx - FLOG(_L("created schedule %d %d:%d"),scitem.iHandle, t.DateTime().Hour(),t.DateTime().Minute() ); - TTaskInfo taskInfo; - taskInfo.iName = TUid::Uid(KFotaServerUid).Name(); - taskInfo.iRepeat = KRepeatForever; - taskInfo.iPriority = KTaskPriority; - - TFotaScheduledUpdate fotareminder( aPackageId, scitem.iHandle ); - TPckg fotareminderpkg(fotareminder); - - HBufC* data = HBufC::NewLC(fotareminderpkg.Length()); - data->Des().Copy(fotareminderpkg); - - User::LeaveIfError( sc.ScheduleTask(taskInfo, *data, scitem.iHandle) ); // xxx - - CleanupStack::PopAndDestroy( data ); - CleanupStack::PopAndDestroy( scentries ); - CleanupStack::PopAndDestroy(&sc); // xx - return scitem.iHandle; - } -// -------------------------------------------------------------------------- -// CFotaUpdate::CheckUpdateVariations -// Checks the Install update note display,when a phone call is active -// -------------------------------------------------------------------------- -// -TBool CFotaUpdate::CheckUpdateVariations() - { - FLOG(_L("CFotaUpdate::CheckUpdateVariations >>")); - CRepository* centrep( NULL); - TRAPD(err, centrep = CRepository::NewL( KCRUidFotaServer ) ); - if (err) FLOG(_L("Error reading FotaServer cenrep... %d"),err); - TInt supported(KErrNone); - if (centrep ) - { - err = centrep->Get( KFotaUpdateNoteDisplayAlways, supported ); - if (err) FLOG(_L("Error reading cenrep key... %d"),err); - delete centrep; - centrep = NULL; - } - if(supported) //means note to be displayed when a call is active - { - return EFalse; - } - FLOG(_L("CFotaUpdate::CheckUpdateVariations <<")); - return ETrue; //means note should not be displayed when a call is there - } -