--- a/fotaapplication/fotaserver/src/FotaServer.cpp Tue Aug 31 16:04:06 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2708 +0,0 @@
-/*
- * Copyright (c) 2005 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: Fota server update and download functionality
- *
- */
-// INCLUDE FILES
-#include <apgtask.h>
-#include <apgwgnam.h>
-#include <schtime.h>
-#include <csch_cli.h>
-#include <e32property.h>
-#include <cmmanager.h>
-#include <cmconnectionmethod.h>
-#include <DevManInternalCRKeys.h>
-#include <nsmlconstants.h>
-#include <centralrepository.h>
-#include <sysversioninfo.h>
-#include <hbstackedlayout.h>
-#include <hbmainwindow.h>
-#include <hbview.h>
-#include <featmgr.h>
-#include <DevEncProtectedPSKey.h>
-#include <hbapplication.h>
-#include <xqconversions.h>
-#include <hbtransparentwindow.h>
-#include <es_sock.h>
-#include <es_enum_internal.h>
-#include <es_sock_partner.h>
-#include <e32property.h>
-#include <xqserviceutil.h>
-
-#include "FotaServer.h"
-#include "FotaSrvDebug.h"
-#include "FotasrvSession.h"
-#include "fotaConst.h"
-#include "nsmldmtreedbclient.h"
-#include "fotaserverPrivatePSKeys.h"
-#include "FotaNetworkRegStatus.h"
-#include "FotaDlMgrClient.h"
-#include "fotadevicedialogobserver.h"
-#include "fotanotifiers.h"
-#include "fotaserverPrivatePSKeys.h"
-
-#define __LEAVE_IF_ERROR(x) if(KErrNone!=x) {FLOG(_L("LEAVE in %s: %d"), __FILE__, __LINE__); User::Leave(x); }
-
-TInt CFotaServer::iSessionCount = 0;
-
-
-// ============================= LOCAL FUNCTIONS =============================
-
-// ---------------------------------------------------------------------------
-// GetPredefinedNodeL
-// function to get preconfigured node for FUMO
-// ---------------------------------------------------------------------------
-void GetPredefinedNodeL(TDes8& aNode)
- {
- FLOG(_L("GetPredefinedNodeL() Begin"));
- CRepository* centrep(NULL);
- aNode.Zero();
- centrep = CRepository::NewLC(TUid::Uid(0x101F9A0A));
-
- if (centrep)
- {
- FLOG(_L("centralrepository found End"));
- TFullName temp;
-
- if (centrep->Get(KDevManFUMOPredefinedNodes, temp) == KErrNone
- && temp.Length())
- {
- temp.Trim();
- aNode.Copy(temp);
- }
- CleanupStack::PopAndDestroy(centrep);
- }
- FLOG(_L("GetPredefinedNodeL() End"));
- }
-// ---------------------------------------------------------------------------
-// DeleteFUMOTreeL
-// function to get preconfigured node for FUMO
-// ---------------------------------------------------------------------------
-void DeleteFUMOTreeL()
- {
- FLOG(_L("DeleteFUMOTreeL() Begin"));
- const TUint32 KNSmlFotaAdapterUid = 0x101F9A09;
- _LIT8( KNSmlFumoPath, "FUMO" );
- _LIT8( KNSmlFumoSeparator, "/" );
- const TInt KGranularity = 10;
- TBuf8<KMaxFullName> temp;
- GetPredefinedNodeL(temp);
- RNSmlDMCallbackSession session;
- __LEAVE_IF_ERROR(session.Connect());
- CleanupClosePushL(session);
-
- CBufBase *emptyList = CBufFlat::NewL(0);
- CleanupStack::PushL(emptyList);
- CArrayFixFlat<TSmlDmMappingInfo>* UriSegList;
- UriSegList = new (ELeave) CArrayFixFlat<TSmlDmMappingInfo> (KGranularity);
-
- CleanupStack::PushL(UriSegList);
-
- session.GetUriSegListL(KNSmlFotaAdapterUid, KNSmlFumoPath, *UriSegList);
-
- for (TUint16 i = 0; i < UriSegList->Count(); i++)
- {
- if (temp.Length() && UriSegList->At(i).iURISeg.Find(temp)
- != KErrNotFound)
- {
- FLOG(_L("DeleteFUMOTreeL predefined match =%S"), &temp);
- continue;
- }
-
- TBuf8<KMaxFullName> tempFumo;
- tempFumo.Append(KNSmlFumoPath);
- tempFumo.Append(KNSmlFumoSeparator);
- tempFumo.Append(UriSegList->At(i).iURISeg);
- FLOG(_L("DeleteFUMOTreeL() call update mapping info for node %S"), &tempFumo);
- session.UpdateMappingInfoL(KNSmlFotaAdapterUid, tempFumo, *emptyList);
-
- }
- // session.UpdateMappingInfoL(KNSmlFotaAdapterUid,KNSmlFumoPath,*emptyList);
- CleanupStack::PopAndDestroy(UriSegList);
- CleanupStack::PopAndDestroy(emptyList);
- CleanupStack::PopAndDestroy(&session); //session
- FLOG(_L("DeleteFUMOTreeL() End"));
- }
-
-// ----------------------------------------------------------------------------------------
-// CFotaServer::NewInstance
-// ----------------------------------------------------------------------------------------
-CFotaServer* CFotaServer::NewInstance(HbMainWindow& mainwindow)
- {
- FLOG(_L("CFotaServer::NewInstance >>"));
-
- CFotaServer* self = new CFotaServer(mainwindow);
-
- if (self)
- {
- TRAPD( err, self->ConstructL());
-
- if (err != KErrNone)
- {
- delete self; self = NULL;
- }
- }
- FLOG(_L("CFotaServer::NewInstance >>"));
- return self;
- }
-
-// ----------------------------------------------------------------------------------------
-// CFotaSrvSession::NewSessionL()
-// ----------------------------------------------------------------------------------------
-CSession2* CFotaServer::NewSessionL(const TVersion&, const RMessage2&) const
- {
- iSessionCount++;
- FLOG(_L("Number of active sessions = %d"), iSessionCount);
- return new (ELeave) CFotaSrvSession();
- }
-
-void CFotaServer::ReportFwUpdateStatusL(TPackageState& aState)
- {
- FLOG(_L("CFotaServer::ReportFwUpdateStatusL >>"));
-
- TFotaClient requester = GetUpdateRequester();
-
- if (requester == EDMHostServer)
- {
- FLOG(_L("Reporting status back to hostserver..."));
- ServerCanShut(EFalse);
- CreateDeviceManagementSessionL(aState);
- }
- else
- {
- //iServerCanShut = EFalse; Don't do here. Should be set in downloadmgrcli based on error type.
- //ResetFotaStateL(aState.iPkgId);
- SetStartupReason(EFotaDefault);
- StopServerWhenPossible();
- FLOG(_L("Not reporting status as requester is unknown!"));
- }
-
- FLOG(_L("CFotaServer::ReportFwUpdateStatusL >>"));
- }
-
-void CFotaServer::StartDownloadDialog(const QString &aName,
- const QString &aVersion, const TInt &aSize)
- {
- FLOG(_L("CFotaServer::StartDownloadDialog >>"));
- //The dialog should not timeout here.
- if (!iFullScreenDialog)
- {
- //ConstructApplicationUI(ETrue);
- iFullScreenDialog = new FotaFullscreenDialog(this);
- }
-
- iFullScreenDialog->SetSoftwareDetails(aSize, aVersion, aName);
-
- iFullScreenDialog->SetWarningDetails(EHbFotaDownload);
-
- TBool postpone = IsUserPostponeAllowed();
- if (!postpone)
- {
- FLOG(_L("Disabling option to resume later!"));
- iFullScreenDialog->DisableRSK(ETrue);
- }
-
- FLOG(_L("CFotaServer::StartDownloadDialog <<"));
- }
-
-void CFotaServer::UpdateDownloadDialog(TInt aProgress)
- {
- FLOG(_L("CFotaServer::UpdateDownloadDialog >>"));
- if (!iFullScreenDialog)
- {
- QString name = XQConversions::s60Desc8ToQString(
- iPackageState.iPkgName);
- QString version = XQConversions::s60Desc8ToQString(
- iPackageState.iPkgVersion);
- StartDownloadDialog(name, version, iPackageState.iPkgSize);
- ConstructApplicationUI(ETrue);
- }
-
- iFullScreenDialog->UpdateProgressBar(aProgress);
- FLOG(_L("CFotaServer::UpdateDownloadDialog <<"));
- }
-
-void CFotaServer::ShowDialogL(TFwUpdNoteTypes adialogid)
- {
- FLOG(_L("CFotaServer::ShowDialogL adialogid = %d<<"), adialogid);
-
- if (iNotifier)
- {
- FLOG(_L("Deleting the open device dialog!!"));
- iNotifier->Cancel();
- }
-
- ServerCanShut(EFalse);
- iDialogId = (TInt) adialogid;
-
- iNotifParams = CHbSymbianVariantMap::NewL();
-
- HBufC* keyDialog = HBufC::NewL(10);
- CleanupStack::PushL(keyDialog);
- *keyDialog = KKeyDialog;
-
- HBufC* keyParam1 = HBufC::NewL(10);
- CleanupStack::PushL(keyParam1);
- *keyParam1 = KKeyParam1;
-
- HBufC* keyParam2 = HBufC::NewL(10);
- CleanupStack::PushL(keyParam2);
- *keyParam2 = KKeyParam2;
-
- HBufC* keyParam3 = HBufC::NewL(10);
- CleanupStack::PushL(keyParam3);
- *keyParam3 = KKeyParam3;
-
- HBufC* keyParam4 = HBufC::NewL(10);
- CleanupStack::PushL(keyParam4);
- *keyParam4 = KKeyParam4;
-
- CHbSymbianVariant* dialogId = CHbSymbianVariant::NewL(&adialogid,
- CHbSymbianVariant::EInt);
- CleanupStack::PushL(dialogId);
- iNotifParams->Add(*keyDialog, dialogId);
-
- if (!iNotifier)
- iNotifier = CFotaDownloadNotifHandler::NewL(this);
-
- switch (adialogid)
- {
- case EFwUpdNotEnoughBattery:
- case EFwUpdDeviceBusy:
- {
- FLOG(_L("CFotaServer::EFwUpdNotEnoughBattery/EFwUpdDeviceBusy"));
- iNotifier->LaunchNotifierL(iNotifParams, adialogid);
- }
- break;
- case EFwUpdResumeUpdate:
- case EFwUpdResumeDownload:
- {
- FLOG(_L("CFotaServer::EFwUpdResumeUpdate / EFwUpdResumeDownload"));
- CHbSymbianVariant* param1Val = CHbSymbianVariant::NewL(
- &iPackageState.iPkgSize, CHbSymbianVariant::EInt);
- CleanupStack::PushL(param1Val);
- iNotifParams->Add(*keyParam1, param1Val);
- TBuf16<KFotaMaxPkgNameLength> temp1;
- temp1.Copy(iPackageState.iPkgVersion);
- CHbSymbianVariant* param2Val = CHbSymbianVariant::NewL(
- //&iPackageState.iPkgVersion, CHbSymbianVariant::EDes);
- &temp1, CHbSymbianVariant::EDes);
- CleanupStack::PushL(param2Val);
- iNotifParams->Add(*keyParam2, param2Val);
- TBuf16<KFotaMaxPkgNameLength> temp2;
- temp2.Copy(iPackageState.iPkgName);
- CHbSymbianVariant* param3Val = CHbSymbianVariant::NewL(
- &temp2, CHbSymbianVariant::EDes);
- CleanupStack::PushL(param3Val);
- iNotifParams->Add(*keyParam3, param3Val);
- TBool postpone = IsUserPostponeAllowed();
- CHbSymbianVariant* param4Val = CHbSymbianVariant::NewL(&postpone,
- CHbSymbianVariant::EInt);
- CleanupStack::PushL(param4Val);
- iNotifParams->Add(*keyParam4, param4Val);
- iNotifier->LaunchNotifierL(iNotifParams, adialogid);
- CleanupStack::PopAndDestroy(4);
-
- }
- break;
-
- default:
- {
- FLOG(_L("CFotaServer::default"));
- //Do nothing
- }
- break;
- }
- CleanupStack::PopAndDestroy(6);
- FLOG(_L("CFotaServer::ShowDialogL >>"));
-
- }
-
-void CFotaServer::HandleDialogResponse(int response, TInt aDialogId)
- {
- FLOG( _L("CFotaServer::HandleDialogResponse, response = %d dialog = %d >>"), response, aDialogId);
-
- switch (aDialogId)
- {
- case EFwUpdNotEnoughBattery:
- case EFwUpdDeviceBusy:
- {
- SetServerActive(EFalse);
-
- StopServerWhenPossible();
- }
- break;
- case EFwUpdResumeDownload:
- {
- if (response == EHbLSK) //Continue
- {
- FLOG(_L("User accepted to resume the download"));
-
- TRAP_IGNORE(CancelFmsL());
- TRAP_IGNORE(DownloaderL()->TryResumeDownloadL());
- }
- else //Resume Later
- {
- FLOG(_L("User denied resuming the download"));
- DecrementUserPostponeCount();
- SetServerActive(EFalse);
- SetStartupReason(EFotaDownloadInterrupted);
-
- TRAP_IGNORE(InvokeFmsL());
-
- StopServerWhenPossible();
- }
- }
- break;
- case EFwUpdResumeUpdate:
- {
- if (response == EHbLSK) //Continue
- {
- FLOG(_L("User accepted to resume the update"));
- iPackageState.iResult = KErrNotFound;
- TRAPD(err,
- iDatabase->OpenDBL();
- iDatabase->SetStateL( iPackageState ,KNullDesC8,EFDBResult );
- );
- FLOG(_L("Updating the fota database... err = %d"), err);
- iDatabase->CloseAndCommitDB();
-
- TRAP(err, iUpdater->StartUpdateL( iPackageState ));
- FLOG(_L("Starting update, err = %d"), err);
- }
- else //Update Later
- {
- FLOG(_L("User denied resuming the update"));
- iPackageState.iState = RFotaEngineSession::EStartingUpdate;
- iPackageState.iResult = RFotaEngineSession::EResUserCancelled;
- TRAPD(err,
- iDatabase->OpenDBL();
- iDatabase->SetStateL( iPackageState ,KNullDesC8,EFDBState|EFDBResult );
- iDatabase->CloseAndCommitDB();
- );
- FLOG(_L("Updating the fota database... err = %d"), err);
-
- DecrementUserPostponeCount();
- SetServerActive(EFalse);
- SetStartupReason(EFotaUpdateInterrupted);
-
- TRAP(err, InvokeFmsL());
- FLOG(_L("Invoking fms, err = %d"), err);
-
- StopServerWhenPossible();
- }
- }
- break;
- default:
- {
- //Do nothing
- }
- break;
- }
- /*
- if(iNotifParams)
- {
- delete iNotifParams; iNotifParams = NULL;
- }
-
- if(iNotifier)
- {
- delete iNotifier; iNotifier = NULL;
- }*/
- iDialogId = 0;
- FLOG(_L("CFotaServer::HandleDialogResponse<<"));
- }
-
-void CFotaServer::SetServerActive(TBool aValue)
- {
- FLOG(_L("CFotaServer::SetServerActive, aValue = %d"), aValue);
-
- TInt err = RProperty::Set(TUid::Uid(KOmaDMAppUid), KFotaServerActive,
- aValue);
- FLOG(_L("RProperty SetServerActive Set %d, err = %d"), aValue, err);
-
- if (err == KErrNotFound)
- {
- err = RProperty::Define(TUid::Uid(KOmaDMAppUid), KFotaServerActive,
- RProperty::EInt, KReadPolicy, KWritePolicy);
- err = RProperty::Set(TUid::Uid(KOmaDMAppUid), KFotaServerActive,
- aValue);
- FLOG(_L("RProperty SetServerActive Set %d, err = %d"), aValue,
- err);
- }
-
- FLOG(_L("CFotaServer::SetServerActive <<"));
- }
-
-void CFotaServer::ShowFullScreenDialog(TInt aType)
- {
- FLOG(_L("CFotaServer::ShowFullScreenDialog, type = %d >>"), aType);
-
- if (!iFullScreenDialog)
- {
- const QString ver = QString::fromUtf8( reinterpret_cast<const char*> (iPackageState.iPkgVersion.Ptr()), iPackageState.iPkgVersion.Length());
- const QString name = QString::fromUtf8( reinterpret_cast<const char*> (iPackageState.iPkgName.Ptr()), iPackageState.iPkgName.Length());
- iFullScreenDialog = new FotaFullscreenDialog(this);
-
- iFullScreenDialog->SetSoftwareDetails(iPackageState.iPkgSize, ver, name);
- iFullScreenDialog->SetWarningDetails(EHbFotaDownload);
- ConstructApplicationUI(ETrue);
- }
-
- if (aType == EHbFotaUpdate)
- {
- iFullScreenDialog->UpdateProgressBar(100);
- TBool postpone = IsUserPostponeAllowed();
- if (!postpone)
- {
- FLOG(_L("Disabling option to resume later!"));
- iFullScreenDialog->DisableRSK(ETrue);
- }
-
- iFullScreenDialog->ShowUpdateDialog();
- }
- else if (aType == EHbFotaLowBattery)
- {
- iFullScreenDialog->UpdateProgressBar(100);
- iFullScreenDialog->DisableRSK(EFalse);
- iFullScreenDialog->SetWarningDetails(EHbFotaLowBattery);
- }
-
- FLOG(_L("CFotaServer::ShowFullScreenDialog <<"));
- }
-
-// --------------------------------------------------------------------------
-// CreateDeviceManagementSessionL
-// Creates DM session
-// --------------------------------------------------------------------------
-void CFotaServer::CreateDeviceManagementSessionL(TPackageState& aState)
- {
- FLOG(
- _L("[cfotasever] CreateDeviceManagementSessionL dms >> profid %d\
- %d counts left ,sml handle %d, iNetworkAvailable=%d"),
- aState.iProfileId, aState.iSmlTryCount, iSyncMLSession.Handle(),
- iNetworkAvailable);
-
- SetStartupReason(EFotaPendingGenAlert);
-
- if (!iNetworkAvailable)
- {
- iRetryingGASend = ETrue;
- iPackageState = aState;
- StartNetworkMonitorL();
- }
- else
- {
-
- TBool dbAlreadyOpen = iDatabase->IsOpen();
- TBool triesLeft(EFalse);
-
- iNetworkAvailable = EFalse; // to check network again when GA is sent next time
-
- if (iSyncMLSession.Handle())
- {
- __LEAVE_IF_ERROR( KErrAlreadyExists );
- }
-
- if (!dbAlreadyOpen)
- iDatabase->OpenDBL();
- // There is still tries left
- if (aState.iSmlTryCount > 0)
- {
- triesLeft = ETrue;
- FLOG(_L(" decrementing the retry count"));
- aState.iSmlTryCount = aState.iSmlTryCount - 1;
- iDatabase->SetStateL(aState, KNullDesC8, EFDBSmlTryCount);
- }
- // out of tries, set state to idle
- else
- {
- triesLeft = EFalse;
- FLOG(_L(" out of tries, resetting pkg state"));
-
- SetStartupReason(EFotaDefault);
- aState.iState = RFotaEngineSession::EIdle;
- aState.iResult = KErrNotFound;
- iDatabase->SetStateL(aState, KNullDesC8, EFDBState | EFDBResult);
- }
- if (!dbAlreadyOpen)
- iDatabase->CloseAndCommitDB();
-
- if (triesLeft)
- {
-
- CRepository *cenrep = CRepository::NewL(
- KCRUidDeviceManagementInternalKeys);
- TInt x = cenrep->Set(KDevManClientInitiatedFwUpdateId,
- iPackageState.iProfileId);
- delete cenrep;
- FLOG(_L("Status writing the cenrep for GA: %d"), x);
-
- iSyncMLSession.OpenL();
-
- if (aState.iIapId <0)
- aState.iIapId = 0;
-
- FLOG(_L("IAP set in the Fota profile %d is :%d"),
- aState.iProfileId, aState.iIapId);
-
- FLOG(_L("From Db Using IAP: %d to send GA"), aState.iIapId);
-
- RSyncMLDevManJob dmJob;
- TBuf<10> genalertap, temp;
- genalertap.Zero();
- temp.Zero();
- genalertap.Append(KNSmlDMJobIapPrefix);
- temp.Num(aState.iIapId);//Decimal Iap
- if (temp.Length() <= KNSmlHalfTransportIdLength && aState.iIapId
- > KErrNotFound && CheckIapExistsL(aState.iIapId))
- {
- genalertap.AppendFill('0', KNSmlHalfTransportIdLength
- - temp.Length());
- genalertap.Append(temp);
- TLex gavalue(genalertap);
- TInt temp2(0);
- gavalue.Val(temp2);
- dmJob.CreateL(iSyncMLSession, aState.iProfileId, temp2);
- iSyncMLAttempts = KSyncmlAttemptCount;
- }
- else
- {
- iSyncMLAttempts = 0;
- dmJob.CreateL(iSyncMLSession, aState.iProfileId);
- }
-
- // If there's no iapid defined, sml will pop up connection dialog.
- // In that case, only one connection attempt is allowed.
- iSyncJobId = dmJob.Identifier();
- iSyncProfile = aState.iProfileId;
- dmJob.Close();
- iSyncMLSession.RequestEventL(*this);
- }
- }
-
- FLOG(_L("[cfotasever] CreateDeviceManagementSessionL dms << profid %d"), aState.iProfileId);
- }
-
-// ============================= MEMBER FUNCTIONS ============================
-
-// --------------------------------------------------------------------------
-// CFotaServer::CFotaServer()
-// --------------------------------------------------------------------------
-//
-CFotaServer::CFotaServer(HbMainWindow& mainwindow) :
- CServer2(EPriorityStandard, EUnsharableSessions) /*CServer2(0)*/,
- iDatabase(0), iInitialized(EFalse), iDownloader(0), iUpdater(0),
- iDownloadFinalizer(0), iUpdateFinalizer(0), iTimedExecuteResultFile(0), iTimedSMLSessionClose(0),
- iAppShutter(0), iMonitor(NULL), iSyncMLAttempts(0), iSyncJobId(-1),iRetryingGASend(EFalse),
- iNetworkAvailable(EFalse),iFullScreenDialog(NULL), iNotifParams(NULL), iNotifier(NULL),
- iServerCanShut(EFalse), iAsyncOperation(EFalse),iDialogId (0), iConstructed(EFalse), iMainwindow(mainwindow)
- {
- RProcess pr;
- TFullName fn = pr.FullName();
- TUint prid = pr.Id();
- FLOG(_L( "CFotaServer::CFotaServer process(id %d)%S. this 0x%x"), prid,
- &fn, this);
-
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::DoExecuteResultFileL
-// Interprets result of update (file update.resp)
-// --------------------------------------------------------------------------
-//
-void CFotaServer::DoExecuteResultFileL()
- {
- FLOG(_L("CFotaServer::DoExecuteResultFileL() >>"));
-
- if (iTimedExecuteResultFile)
- {
- iTimedExecuteResultFile->Cancel();
- delete iTimedExecuteResultFile;
- iTimedExecuteResultFile = NULL;
- }
- iUpdater = CFotaUpdate::NewL(this);
- iUpdater->ExecuteUpdateResultFileL();
- FLOG(_L("CFotaServer::DoExecuteResultFileL() <<"));
- }
-
-// --------------------------------------------------------------------------
-// StaticDoExecuteResultFile
-// --------------------------------------------------------------------------
-//
-static TInt StaticDoExecuteResultFile(TAny *aPtr)
- {
- FLOG(_L("[cfotaserver] StaticDoExecuteResultFile() >>"));
- __ASSERT_ALWAYS( aPtr, User::Panic(KFotaPanic, KErrBadHandle) );
- CFotaServer* srv = (CFotaServer*) aPtr;
- TRAPD( err, srv->DoExecuteResultFileL() );
- if (err)
- {
- FLOG(_L("[cfotaserver] StaticDoExecuteResultFile ERROR %d"), err);
- }
-
- FLOG(_L("[cfotaserver] StaticDoExecuteResultFile() <<"));
- return err;
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::CFotaServer()
-// Constructor. Can't do all constructing since fotaserver might call itself
-// recursively (via downloadmgr).
-// --------------------------------------------------------------------------
-//
-void CFotaServer::ConstructL()
- {
- FLOG(_L("CFotaServer::ConstructL() >>"));
- TBool updated(EFalse);
- TInt err;
- iLastFwUrl.Zero();
- StartL(KFotaServerName);
-
- __LEAVE_IF_ERROR(iFs.Connect());
-
- err = iFs.CreatePrivatePath(EDriveC);
- if (err != KErrNone && err != KErrAlreadyExists)
- {
- __LEAVE_IF_ERROR(err);
- }
- __LEAVE_IF_ERROR(iFs.SetSessionToPrivate(EDriveC));
-
- if (!iDatabase)
- {
- TRAPD( err,iDatabase = CFotaDB::NewL() );
- if (err)
- {
- FLOG(_L("CFotaServer:: DB creationg error %d"), err);
- __LEAVE_IF_ERROR(err);
- }
- }
-
- updated = CFotaUpdate::CheckUpdateResults(iFs);
-
- // Update has happened, and result file is in place
- if (updated)
- {
- FLOG(_L("scheduling update result file execution"));
- ServerCanShut(EFalse);
-
- if (iTimedExecuteResultFile)
- {
- iTimedExecuteResultFile->Cancel();
- delete iTimedExecuteResultFile;
- iTimedExecuteResultFile = NULL;
- }
- iTimedExecuteResultFile = CPeriodic::NewL(EPriorityNormal);
- iTimedExecuteResultFile->Start(TTimeIntervalMicroSeconds32(
- KDownloadFinalizerWaitTime), TTimeIntervalMicroSeconds32(
- KDownloadFinalizerWaitTime), TCallBack(
- StaticDoExecuteResultFile, this));
- }
-
- FLOG(_L("CFotaServer::ConstructL() <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::ClientAwareConstructL
-// Does rest of constructing, if not done. If parent of this fotaserver
-// instance is another fotaserver, skip maintenance operations (since parent
-// takes care of them). DmHOstserver triggers cleanup for states: 20,70,80
-// ,90,100 , must handle state 60 here
-// --------------------------------------------------------------------------
-void CFotaServer::ClientAwareConstructL(const RMessage2 &aMessage)
- {
- FLOG(_L("CFotaServer::ClientAwareConstructL >>"));
- if (iInitialized)
- return;
-
- ConstructApplicationUI(EFalse);
- CreateDiskReservation();
-
- TFotaClient client = CFotaSrvSession::CheckClientSecureIdL(aMessage);
-
- RArray<TInt> states;
- TPackageState state;
- CleanupClosePushL(states);
- iDatabase->OpenDBL();
- iDatabase->GetAllL(states);
- TBool dlactive(EFalse);
-
- dlactive = DownloaderL()->IsDownloadActive();
-
- FLOG(_L("Download active value is:%d "), (TInt) dlactive);
- // Loop states.
- for (TInt i = 0; i < states.Count(); ++i)
- {
- TPackageState tmp;
-
- tmp = iDatabase->GetStateL(states[i],iLastFwUrl);
- FLOG(_L(" 1 got state id:%d state:%d result:%d"), tmp.iPkgId,
- tmp.iState, tmp.iResult);
-
- //Download was started earlier and was interrupted.
- if (tmp.iState == RFotaEngineSession::EStartingUpdate || tmp.iState
- == RFotaEngineSession::EDownloadProgressing || tmp.iState
- == RFotaEngineSession::EDownloadProgressing)
-
- {
- TBool ispkgvalid = ETrue;
- //Software version check from the time download started.
- TRAPD(err1,ispkgvalid= CheckSWVersionL() )
- if (err1 == KErrNone && !ispkgvalid)
- {
- FLOG(_L("Mismatch in software version since the download started! Hence resetting!"));
-
- DownloaderL()->DeleteUpdatePackageL();
-
- tmp.iState = RFotaEngineSession::EUpdateFailed;
- tmp.iResult = RFotaEngineSession::EResPackageMismatch;
- iDatabase->SetStateL(tmp, KNullDesC8, EFDBState | EFDBResult);
-
- }
-
- }
- // Update has been started (60)
- // If there is no result file, means that update agent failed
- // to run. Must get back to 50 to allow user to try again.
- if (tmp.iState == RFotaEngineSession::EUpdateProgressing
- && iTimedExecuteResultFile == NULL)
- {
- FLOG(_L(" State EUpdateProgressing found, UA didnt run! id %d "), tmp.iPkgId);
-
- tmp.iState = RFotaEngineSession::EStartingUpdate;
- iDatabase->SetStateL(tmp, KNullDesC8, EFDBState);
- }
-
- // These states need must trigger generic alert! (70+ )
- if (tmp.iState >= RFotaEngineSession::EUpdateFailed && client != EDMHostServer)
- {
- if (iSyncMLSession.Handle() == NULL)
- {
- iDatabase->CloseAndCommitDB();
- ReportFwUpdateStatusL(tmp);
- iDatabase->OpenDBL();
- }
- }
-
- if (tmp.iState == RFotaEngineSession::EDownloadComplete
- && tmp.iResult == RFotaEngineSession::EResSuccessful && client != EDMHostServer)
- {
- ReportFwUpdateStatusL(tmp);
- }
-
- if (dlactive == EFalse) //if download is not active, EStartingDownload should be reset to EDownloadFailed
- {
- if (tmp.iState == RFotaEngineSession::EStartingDownload)
- {
- FLOG(_L("Resetting state %d to 20..."), tmp.iState);
- tmp.iState = RFotaEngineSession::EDownloadFailed;
- iDatabase->SetStateL(tmp, KNullDesC8, EFDBState);
- iDatabase->CloseAndCommitDB();
- iDatabase->OpenDBL();
- }
- else if (tmp.iState == RFotaEngineSession::EStartingDownload)
- {
- FLOG(_L("Resetting state %d to 30..."), tmp.iState);
- tmp.iState = RFotaEngineSession::EDownloadProgressing;
- iDatabase->SetStateL(tmp, KNullDesC8, EFDBState);
- iDatabase->CloseAndCommitDB();
- iDatabase->OpenDBL();
- }
- }
- if (tmp.iState == RFotaEngineSession::EDownloadProgressing)
- {
- FLOG(_L("Firmware update state is EDownloadProgressing"));
- //FMS will start fota server when it is appropriate to resume download.
- }
- else if (tmp.iState == RFotaEngineSession::EStartingUpdate)
- {
- FLOG(_L("Firmware update state is EStartingUpdate"));
- //FMS will start fota server when it is appropriate to start install.
- }
- if (tmp.iState == RFotaEngineSession::EDownloadFailed && client != EDMHostServer)
- {
- FLOG(_L("Resetting state %d to 20..."), tmp.iState);
- DownloaderL()->DeleteUpdatePackageL();
- tmp.iResult = RFotaEngineSession::EResDLFailDueToNWIssues;
- iDatabase->SetStateL(tmp, KNullDesC8, EFDBResult);
- iDatabase->CloseAndCommitDB();
- ReportFwUpdateStatusL(tmp);
- iDatabase->OpenDBL();
- }
-
- }
- iDatabase->CloseAndCommitDB();
- CleanupStack::PopAndDestroy(&states);
-
- iInitialized = ETrue;
- FLOG(_L("CFotaServer::ClientAwareConstructL <<"));
- }
-
-// --------------------------------------------------------------------------
-// StaticDoFinalizeDownload
-// Intermediate function
-// --------------------------------------------------------------------------
-static TInt StaticDoFinalizeDownload(TAny *aPtr)
- {
- FLOG(_L("[cfotaserver] StaticDoFinalizeDownload() >>"));
- CFotaServer* srv = (CFotaServer*) aPtr;
- TRAPD( err, srv->DoFinalizeDownloadL() );
- if (err)
- {
- FLOG(_L("[cfotaserver] StaticDoFinalizeDownload ERROR %d"), err);
- }
-
- FLOG(_L("[cfotaserver] StaticDoFinalizeDownload() <<"));
- return err;
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::FinalizeDownload
-// Initialize finalization of download
-// --------------------------------------------------------------------------
-//
-void CFotaServer::FinalizeDownloadL()
- {
- FLOG(_L("CFotaServer::FinalizeDownload() >> state:%d result:%d"),
- iPackageState.iState, iPackageState.iResult);
- __ASSERT_ALWAYS( iDownloader, User::Panic(KFotaPanic, KErrBadHandle ));
-
- if (iDownloadFinalizer)
- {
- iDownloadFinalizer->Cancel();
- delete iDownloadFinalizer;
- iDownloadFinalizer = NULL;
- }
- iDownloadFinalizer = CPeriodic::NewL(EPriorityMuchMore);
-
- // Not restarting,quick finalize
- iDownloadFinalizer->Start(TTimeIntervalMicroSeconds32(
- KDownloadFinalizerWaitTime), TTimeIntervalMicroSeconds32(
- KDownloadFinalizerWaitTime), TCallBack(StaticDoFinalizeDownload,
- this));
- FLOG(_L("CFotaServer::FinalizeDownload() <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::DoFinalizeDownloadL
-// Finalize download. Free resources
-// --------------------------------------------------------------------------
-//
-void CFotaServer::DoFinalizeDownloadL()
- {
-
- FLOG(_L("CFotaServer::DoFinalizeDownloadL() >> state:%d result:%d"),
- iPackageState.iState, iPackageState.iResult);
- __ASSERT_ALWAYS( iDownloader, User::Panic(KFotaPanic, KErrBadHandle ));
-
-
- if (iDownloadFinalizer)
- {
- iDownloadFinalizer->Cancel();
- delete iDownloadFinalizer;
- iDownloadFinalizer = NULL;
- }
-
- // Set downloader's ending state to DB
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, KNullDesC8, EFDBState | EFDBResult);
- iDatabase->CloseAndCommitDB();
-
- if (iPackageState.iResult != RFotaEngineSession::EResDLFailDueToDeviceOOM)
- {
- FLOG(_L("Adjusting the reserved memory..."));
- DownloaderL()->CreateDiskReservation();
- }
-
- // Initiate update
- if (iPackageState.iState == RFotaEngineSession::EDownloadComplete
- && iPackageState.iUpdateLtr)
- {
- TRAP_IGNORE(TryUpdateL(EOMADMAppUi));
-
- }
- else if (iPackageState.iState == RFotaEngineSession::EDownloadProgressing)
- {
- FLOG(_L("Download has paused due to an error. Invoking FMS..."));
- if (iFullScreenDialog)
- {
- iFullScreenDialog->Close();
- iFullScreenDialog->deleteLater();
- iFullScreenDialog = NULL;
- }
- SetStartupReason(EFotaDownloadInterrupted);
- InvokeFmsL();
- StopServerWhenPossible();
- SetServerActive(EFalse);
- iAsyncOperation = EFalse;
- }
- else
- {
- if (iFullScreenDialog)
- {
- iFullScreenDialog->Close();
- iFullScreenDialog->deleteLater();
- iFullScreenDialog = NULL;
- }
- ConstructApplicationUI(EFalse);
- ReportFwUpdateStatusL(iPackageState);
- SetServerActive(EFalse);
- iAsyncOperation = EFalse;
- }
-
- FLOG(_L("CFotaServer::DoFinalizeDownloadL() <<"));
- }
-
-// --------------------------------------------------------------------------
-// StaticDoCloseSMLSession
-// Intermediate function
-// --------------------------------------------------------------------------
-static TInt StaticDoCloseSMLSession(TAny *aPtr)
- {
- FLOG(_L("[cfotaserver] StaticDoCloseSMLSession() >>"));
- CFotaServer* srv = (CFotaServer*) aPtr;
- TRAPD( err, srv->DoCloseSMLSessionL() );
- if (err)
- {
- FLOG(_L("[cfotaserver] StaticDoCloseSMLSession ERROR %d"), err);
- }
-
- FLOG(_L("[cfotaserver] StaticDoCloseSMLSession() <<"));
- return err;
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::DoCloseSMLSessionL
-// Close syncml session, or resync
-// --------------------------------------------------------------------------
-//
-void CFotaServer::DoCloseSMLSessionL()
- {
- FLOG(_L("CFotaServer::DoCloseSMLSessionL() >>"));
-
- // Must still try to sync
- if (iSyncMLAttempts > 0)
- {
- FLOG(_L(" trycount %d => creating new job"), iSyncMLAttempts);
- RSyncMLDevManJob dmJob;
- if (iPackageState.iIapId > KErrNotFound)
- {
- FLOG(_L("DoCloseSMLSessionL new job uses iap from fotadb %d"),
- iPackageState.iIapId);
- dmJob.CreateL(iSyncMLSession, iSyncProfile, iPackageState.iIapId);
- }
- else
- {
- FLOG(_L("DoCloseSMLSessionL new job uses iap from profile"));
- dmJob.CreateL(iSyncMLSession, iSyncProfile);
- }
- iSyncMLAttempts--;
- iSyncJobId = dmJob.Identifier();
- dmJob.Close();
- }
- else
- // We ran out of attempts, close sml
- {
- if (iSyncMLSession.Handle())
- {
- FLOG(_L(" Closing syncml session"));
- iSyncMLSession.CancelEvent();
- iSyncMLSession.Close();
- }
- }
-
- if (iTimedSMLSessionClose)
- {
- FLOG(_L(" closing smlsession timer"));
- iTimedSMLSessionClose->Cancel();
- delete iTimedSMLSessionClose;
- iTimedSMLSessionClose = NULL;
- }
-
- FLOG(_L("CFotaServer::DoCloseSMLSessionL() <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::TryResumeDownloadL
-// Tries to resume the download operation
-// --------------------------------------------------------------------------
-//
-void CFotaServer::TryResumeDownloadL(TFotaClient aClient, TBool aSilentDl)
- {
- FLOG(_L("CFotaServer::TryResumeDownloadL, client = %d aSilent = %d >>"),
- (TInt) aClient, aSilentDl);
- //Check whether there is a paused resume actually.
- iAsyncOperation = ETrue;
- SetServerActive(ETrue);
- WakeupServer();
-
- if (DownloaderL()->IsDownloadActive())
- {
- FLOG(_L("Another download is already active, hence returning..."));
- __LEAVE_IF_ERROR (KErrAlreadyExists);
- }
-
- if (iPackageState.iPkgId == KErrNotFound)
- iPackageState = GetStateL(-1); //Gets the state of the current/last fota download
-
- FLOG(_L("Session type is =%d "), iPackageState.iSessionType);
-
- if (iPackageState.iState != RFotaEngineSession::EDownloadProgressing)
- {
- FLOG(_L("There are no paused downloads currently; hence leaving with KErrNotFound..."));
- SetServerActive(EFalse);
- __LEAVE_IF_ERROR (KErrNotFound);
- }
-
- //Resume download now
-
- iPackageState.iSessionType = aSilentDl;
-
- if (aSilentDl && iPackageState.iResult
- == RFotaEngineSession::EResUserCancelled)
- {
- //If user has paused download earlier, then resume should be non-silent.
- FLOG(_L("Converting to non-silent download as user had paused it earlier!"));
- iPackageState.iSessionType = EFalse;
- }
-
- TRAP_IGNORE(SetIapToUseL());
- FLOG(_L("Using IAP = %d for the download"), iPackageState.iIapId);
-
- FLOG(_L("Session type = %d"), iPackageState.iSessionType);
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, KNullDesC8, EFDBIapId||EFDBSessionType);
- iDatabase->CloseAndCommitDB();
-
- if (iPackageState.iSessionType || aClient == EOMADMAppUi)
- {
- ConstructApplicationUI(EFalse);
- DownloaderL()->TryResumeDownloadL();
- }
- else
- {
- ShowDialogL(EFwUpdResumeDownload);
- }
-
- FLOG(_L("CFotaServer::TryResumeDownloadL <<"));
- }
-
-void CFotaServer::PauseDownloadL()
- {
-
- if (DownloaderL()->IsDownloadActive())
- {
- DownloaderL()->PauseDownloadL();
- }
- else
- {
- FLOG(_L("No download is active. Hence leaving with KErrNotFound"));
- __LEAVE_IF_ERROR(KErrNotFound);
- }
- }
-// --------------------------------------------------------------------------
-// CFotaServer::InvokeFmsL
-// Starts Fota Monitory Service with relevant parameters for monitoring.
-// --------------------------------------------------------------------------
-//
-void CFotaServer::InvokeFmsL()
- {
- FLOG(_L("CFotaServer::InvokeFmsL >>"));
- //Collect all information needed to invoke FMS.
- CancelFmsL();
-
- FLOG(_L("State as recorded in fota db:"));
- FLOG(_L("iPkgId = %d"), iPackageState.iPkgId);
- FLOG(_L("iProfileId = %d"), iPackageState.iProfileId);
- FLOG(_L("iPkgName = %S"), &iPackageState.iPkgName);
- FLOG(_L("iPkgVersion = %S"), &iPackageState.iPkgVersion);
- FLOG(_L("iSendAlert = %d"), iPackageState.iSendAlert);
- FLOG(_L("iIapId = %d"), iPackageState.iIapId);
- FLOG(_L("iPkgSize = %d"), iPackageState.iPkgSize);
- FLOG(_L("iSessionType = %d"), iPackageState.iSessionType);
- FLOG(_L("iState = %d"), iPackageState.iState);
- FLOG(_L("iResult = %d"), iPackageState.iResult);
-
- if (iPackageState.iState == RFotaEngineSession::EDownloadProgressing)
- {
- //Finding the reason for download interrupt
- TFmsIpcCommands reason(EDLGeneralInterrupt); // 13
-
- switch (iPackageState.iResult)
- {
- case RFotaEngineSession::EResUserCancelled:
- {
- reason = EDLUserInterrupt; //10
- break;
- }
- case RFotaEngineSession::EResDLFailDueToNWIssues:
- {
- reason = EDLNetworkInterrupt; //11
- break;
- }
- case RFotaEngineSession::EResDLFailDueToDeviceOOM:
- {
- reason = EDLMemoryInterrupt; //12
- break;
- }
- default:
- {
- //reason is already EGeneralInterrupt
- break;
- }
- }
-
- //Finding the drive number
- TBuf<KMaxPath> path;
- path.Zero();
- DownloaderL()->GetUpdatePackageLocation(path);
-
- TInt drive(EDriveC); //Default drive is Phone Memory
- TParse p;
- if (path.Length() && !p.Set(path, NULL, NULL))
- {
- TDriveName drivename(p.Drive());
- TDriveUnit driveunit(drivename);
- if (iFs.IsValidDrive((TInt) driveunit)) //some crash here
- drive = driveunit;
- }
- else
- {
- FLOG(_L("Error while parsing for drive number! defaulting to Phone Memory (C)"));
- }
-
- TInt dlsize = DownloaderL()->GetDownloadPackageSize();
-
- TInt neededsize = iPackageState.iPkgSize - dlsize;
-
- if (neededsize < 0)
- neededsize = 0;
-
- FLOG(_L("Launching FMS with params... reason = %d, iapid = %d, drive = %d, neededsize = %d"),
- reason, iPackageState.iIapId, drive, neededsize);
- iFMSClient.OpenL();
- iFMSClient.NotifyForResumeL(reason, iPackageState.iIapId,
- (TDriveNumber) drive, neededsize);
- iFMSClient.Close();
- }
- else if (iPackageState.iState == RFotaEngineSession::EStartingUpdate)
- {
- //Finding the reason for update interrupt
- TFmsIpcCommands reason(ENoInterrupt);
-
- switch (iPackageState.iResult)
- {
- case RFotaEngineSession::EResUserCancelled:
- {
- reason = EDLUserInterrupt;
- }
- break;
- case RFotaEngineSession::EResLowBattery:
- {
- reason = EUpdMonitorbattery;
- }
- default:
- {
- break;
- }
- }
- FLOG(_L("Launching FMS with params... reason = %d, iapid = %d"), reason, iPackageState.iIapId);
- iFMSClient.OpenL();
- iFMSClient.NotifyForUpdateL(reason);
- iFMSClient.Close();
-
- }
- FLOG(_L("CFotaServer::InvokeFmsL <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::CancelFmsL
-// Cancels any outstanding monitoring requests in Fota Monitory Service
-// --------------------------------------------------------------------------
-//
-void CFotaServer::CancelFmsL()
- {
- FLOG(_L("CFotaServer::CancelFmsL >>"));
-
- iFMSClient.OpenL();
- iFMSClient.Cancel();
- iFMSClient.Close();
-
- FLOG(_L("CFotaServer::CancelFmsL <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::SetStartupReason
-// Sets the startup reason for Fota. This is used in Fota Startup pluggin.
-// --------------------------------------------------------------------------
-//
-void CFotaServer::SetStartupReason(TInt aReason)
- {
- FLOG(_L("CFotaServer::SetStartupReason, aReason = %d >>"), aReason);
-
- CRepository* centrep = NULL;
- TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) );
- if (err == KErrNone)
- {
- err = centrep->Set(KFotaUpdateState, aReason);
- }
- delete centrep;
- centrep = NULL;
-
- FLOG(_L("CFotaServer::SetStartupReason, err = %d <<"), err);
- }
-
-void CFotaServer::SetUpdateRequester(TFotaClient aRequester)
- {
- FLOG(_L("CFotaServer::SetUpdateRequester, requester = %d >>"),
- aRequester);
-
- CRepository* centrep = NULL;
- TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) )
- if (err == KErrNone)
- {
- err = centrep->Set(KUpdateRequesterUid, (TInt) aRequester);
- }
- delete centrep;
- centrep = NULL;
-
- FLOG(_L("CFotaServer::SetUpdateRequester, err = %d <<"), err);
- }
-
-TFotaClient CFotaServer::GetUpdateRequester()
- {
- FLOG(_L("CFotaServer::GetUpdateRequester >>"));
-
- TInt ret(EUnknown);
-
- CRepository* centrep = NULL;
- TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) );
- if (err == KErrNone)
- {
- err = centrep->Get(KUpdateRequesterUid, ret);
- }
- delete centrep;
- centrep = NULL;
-
- FLOG(_L("CFotaServer::GetUpdateRequester, requester = %d, err = %d <<"),
- ret, err);
-
- return (TFotaClient) ret;
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::~CFotaServer()
-// Frees database, download, chunk, filewriter, etc resources
-// --------------------------------------------------------------------------
-//
-CFotaServer::~CFotaServer()
- {
- FLOG(_L("CFotaServer::~CFotaServer >>"));
-
- if (iDatabase)
- {
- iDatabase->CloseAndCommitDB();
- delete iDatabase;
- iDatabase = NULL;
- }
-
- if (iUpdater)
- {
- delete iUpdater;
- iUpdater = NULL;
- }
-
- if (iDownloadFinalizer)
- {
- iDownloadFinalizer->Cancel();
- delete iDownloadFinalizer;
- iDownloadFinalizer = NULL;
- }
-
- if (iUpdateFinalizer)
- {
- iUpdateFinalizer->Cancel();
- delete iUpdateFinalizer;
- iUpdateFinalizer = NULL;
- }
-
- if (iTimedExecuteResultFile)
- {
- iTimedExecuteResultFile->Cancel();
- delete iTimedExecuteResultFile;
- iTimedExecuteResultFile = NULL;
- }
-
- if (iTimedSMLSessionClose)
- {
- iTimedSMLSessionClose->Cancel();
- delete iTimedSMLSessionClose;
- iTimedSMLSessionClose = NULL;
- }
-
- if (iFs.Handle())
- iFs.Close();
-
- if (iSyncMLSession.Handle())
- iSyncMLSession.Close();
-
- if (iMonitor)
- {
- delete iMonitor;
- iMonitor = NULL;
- }
-
- if (iFMSClient.Handle())
- iFMSClient.Close();
-
- if (iDownloader)
- {
- delete iDownloader;
- iDownloader = NULL;
- }
-
- if (iFullScreenDialog)
- {
- iFullScreenDialog->deleteLater();
- }
-
- /*
- if (iNotifParams)
- {
- delete iNotifParams;
- iNotifParams = NULL;
- }
-
- if (iNotifier)
- {
- delete iNotifier;
- iNotifier = NULL;
- }*/
-
- FLOG(_L("CFotaServer::~CFotaServer <<"));
- }
-
-// ---------------------------------------------------------------------------
-// CFotaServer::DeletePackageL
-// Deletes update package from db
-// ---------------------------------------------------------------------------
-void CFotaServer::DeletePackageL(const TInt aPkgId)
- {
- FLOG(_L("CFotaServer::DeletePackageL >> id %d"), aPkgId);
-
- DownloaderL()->DeleteUpdatePackageL();
-
- FLOG(_L("CFotaServer::DeletePackageL <<"));
- }
-
-// ---------------------------------------------------------------------------
-// CFotaServer::DownloadL
-// Create package downloader and download update package.
-// ---------------------------------------------------------------------------
-void CFotaServer::DownloadL(TDownloadIPCParams aParams,
- const TDesC8& aPkgURL, TFotaClient aRequester, TBool aSilent,
- TBool aUpdateLtr)
- {
- FLOG(_L("[FotaServer] Download >>"));
- iAsyncOperation = ETrue;
- SetServerActive(ETrue);
- WakeupServer();
-
-
- if (DownloaderL()->IsDownloadActive())
- {
- FLOG(_L("One download is already active, hence leaving!"));
- __LEAVE_IF_ERROR(KErrAlreadyExists);
- }
-
- TBuf<KSysVersionInfoTextLength> temp;
- if (GetSoftwareVersion(temp) == KErrNone)
- {
-
- RFileWriteStream wstr;
- CleanupClosePushL(wstr);
- TInt err1 = wstr.Replace(iFs, KSWversionFile, EFileWrite);
- if (err1 == KErrNone)
- {
- HBufC16* swv;
- swv = HBufC16::NewLC(temp.Length());
- swv->Des().Copy(temp);
- wstr.WriteInt16L(swv->Des().Length()); // length
- wstr.WriteL(swv->Des());
- wstr.WriteInt16L(0);
- CleanupStack::PopAndDestroy(swv);
-
- }
-
- CleanupStack::PopAndDestroy(&wstr); // wstr
- }
-
- iPackageState = aParams;
- iPackageState.iUpdateLtr = aUpdateLtr;
- iPackageState.iSessionType = aSilent;
- iPackageState.iIapId = -2; //Signifies default connection to use.
- TRAP_IGNORE(SetIapToUseL());
- FLOG(_L("Using IAP = %d for the download"), iPackageState.iIapId);
-
- //First entry to fota database
- FLOG(_L("DownloadManagerClient::DownloadL, State 1 - writing to database"));
-
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, aPkgURL, EFDBState | EFDBResult
- | EFDBProfileId | EFDBPkgUrl | EFDBPkgName | EFDBVersion
- | EFDBUpdateLtr | EFDBSessionType | EFDBIapId);
- iDatabase->CloseAndCommitDB();
-
- //Cancel any outstanding requests to monitor.
- CancelFmsL();
- SetUpdateRequester(aRequester);
- ResetCounters();
-
- DownloaderL()->DownloadL(aPkgURL);
-
-
- FLOG(_L("[FotaServer] Download <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::UpdateL
-// Start update
-// --------------------------------------------------------------------------
-//
-void CFotaServer::TryUpdateL(TFotaClient aClient)
- {
- FLOG(_L("CFotaServer::TryUpdateL, client = %d >>"), (TInt) aClient);
- iAsyncOperation = ETrue;
- SetServerActive(ETrue);
- WakeupServer();
-
- TBool isPkgvalid(ETrue);
- isPkgvalid = CheckSWVersionL();
-
- if (!isPkgvalid)
- {
- FLOG( _L("Fota Update:: Firmware version mismatch! Resetting fota state"));
-
- ResetFotaStateToFailL();
- SetServerActive(EFalse);
- __LEAVE_IF_ERROR(KErrNotFound);
- }
-
- if (iPackageState.iPkgId == KErrNotFound)
- iPackageState = GetStateL(-1);
-
- iPackageState.iState = RFotaEngineSession::EStartingUpdate;
- iPackageState.iResult = KErrNotFound;
- iPackageState.iSendAlert = EFalse;
-
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, KNullDesC8, EFDBState | EFDBResult);
- iDatabase->CloseAndCommitDB();
-
- SetStartupReason(EFotaUpdateInterrupted);
-
- if (IsDeviceDriveBusyL())
- {
- FLOG(
- _L("Fota Update:: Device encryption is onging, hence aborting update!"));
- ShowDialogL(EFwUpdDeviceBusy);
-
- __LEAVE_IF_ERROR(KErrNotReady);
- }
-
- FLOG(_L("Fota Update:: Firmware version check okie"));
-
- if (!iUpdater)
- {
- iUpdater = CFotaUpdate::NewL(this);
- }
-
- if (aClient != EFMSServer)
- {
- //Check any active phone call
- TInt callactive(EFalse);
- iFMSClient.OpenL();
- TInt err1 = iFMSClient.IsPhoneCallActive(callactive);
-
- if (callactive)
- {
- FLOG(_L("Fota Update:: Active call found; differing showing the install dialog!"));
-
- iPackageState.iResult = RFotaEngineSession::EResUpdateFailed;
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, KNullDesC8, EFDBResult);
- iDatabase->CloseAndCommitDB();
-
- iFMSClient.NotifyForUpdateL(EUpdMonitorPhoneCallEnd);
- iFMSClient.Close();
- SetServerActive(EFalse);
- __LEAVE_IF_ERROR(KErrNotReady);
- }
- iFMSClient.Close();
-
- FLOG(_L("Fota Update:: Active phone call check okie "));
-
- TBool batt = iUpdater->CheckBatteryL();
-
-#if defined (__WINS__)
- batt = ETrue;
-#endif
-
- if (aClient == EOMADMAppUi || aClient == EDMHostServer)
- {
- FLOG(_L("Device Updates/Adapter. Show Full screen dialog."));
- LoopBatteryCheckL(batt);
- }
- else
- {
- if (batt)
- {
- FLOG(_L("Not Device Updates. Show device dialog."));
-
- ShowDialogL(EFwUpdResumeUpdate);
- }
- else
- {
- FLOG(_L("Not Device Updates. Leave and monitor for battery."));
-
- iPackageState.iState = RFotaEngineSession::EStartingUpdate;
- iPackageState.iResult = RFotaEngineSession::EResLowBattery;
-
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, KNullDesC8, EFDBState
- | EFDBResult);
- iDatabase->CloseAndCommitDB();
-
- InvokeFmsL();
-
- __LEAVE_IF_ERROR(KErrBadPower);
- }
- }
- }
- else
- {
- ShowDialogL(EFwUpdResumeUpdate);
- }
- FLOG(_L("CFotaServer::TryUpdateL <<"));
- }
-
-void CFotaServer::LoopBatteryCheckL(TBool aBatteryLevel)
- {
- FLOG(_L("CFotaServer::LoopBatteryCheckL, level = %d"), aBatteryLevel);
- if (aBatteryLevel)
- {
- FLOG(_L("Fota Update:: Battery check success; monitoring battery until update"));
- ShowFullScreenDialog(EHbFotaUpdate);
- ConstructApplicationUI(ETrue);
- iUpdater->MonitorBatteryChargeLevel();
- }
- else
- {
- FLOG(_L("Fota Update:: Battery check failed; monitoring for charger connection"));
-
- iPackageState.iState = RFotaEngineSession::EStartingUpdate;
- iPackageState.iResult = RFotaEngineSession::EResLowBattery;
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, KNullDesC8, EFDBResult);
- iDatabase->CloseAndCommitDB();
-
- ShowFullScreenDialog(EHbFotaLowBattery);
- ConstructApplicationUI(ETrue);
- iUpdater->MonitorBatteryChargingStatus();
- }
- FLOG(_L("CFotaServer::LoopBatteryCheckL <<"));
- }
-
-
-void CFotaServer::FinalizeUpdate()
- {
- FLOG(_L("CFotaServer::FinalizeUpdate >>"));
-
- if (iPackageState.iResult == RFotaEngineSession::EResLowBattery)
- {
- TRAP_IGNORE(InvokeFmsL());
- }
- SetServerActive(EFalse);
- ServerCanShut(ETrue);
- StopServerWhenPossible();
- FLOG(_L("CFotaServer::FinalizeUpdate <<"));
- }
-
-
-FotaFullscreenDialog* CFotaServer::FullScreenDialog()
- {
- return iFullScreenDialog;
- }
-
-void CFotaServer::HandleFullScreenDialogResponse(TInt aResponse)
- {
- FLOG(_L("CFotaServer::HandleFullScreenDialogResponse, response = %d >>"),
- aResponse);
-
- TBool active (EFalse);
- TRAP_IGNORE(active = DownloaderL()->IsDownloadActive());
- CEikonEnv* env = CEikonEnv::Static();
-
- if (iPackageState.iState == RFotaEngineSession::EDownloadProgressing)
- {
-
- //swapProcess(EFalse);
- ConstructApplicationUI(EFalse);
- if (aResponse == EHbLSK)
- {
- //HIDE is pressed
- FLOG(_L("HIDE is pressed"));
- if (env)
- {
- CApaWindowGroupName* wgName (NULL);
- TRAP_IGNORE( wgName = CApaWindowGroupName::NewL(env->WsSession()));
- if (wgName)
- {
- wgName->SetHidden(EFalse); // hides us from FSW and protects us from OOM FW etc.
- delete wgName;
- }
- }
- }
- else
- {
- DecrementUserPostponeCount();
- if (active)
- {
- FLOG(_L("CONTINUE LATER is pressed on update dialog"));
- /*
- if (env)
- {
- CApaWindowGroupName* wgName;
- TRAP_IGNORE(wgName = CApaWindowGroupName::NewL(env->WsSession()));
- if (wgName)
- {
- wgName->SetHidden(ETrue); // hides us from FSW and protects us from OOM FW etc.
- delete wgName;
- }
- }*/
- TRAP_IGNORE(PauseDownloadL());
- }
- }
- }
- else if (iPackageState.iState == RFotaEngineSession::EDownloadComplete
- || iPackageState.iState == RFotaEngineSession::EStartingUpdate)
- {
- if (aResponse == EHbLSK)
- {
- FLOG(_L("CONTINUE is pressed/Timeout on update dialog"));
- iPackageState.iResult = KErrNotFound;
- TRAPD(err,
- iDatabase->OpenDBL();
- iDatabase->SetStateL( iPackageState ,KNullDesC8,EFDBResult );
- iDatabase->CloseAndCommitDB();
- );
- FLOG(_L("Updating the fota database... err = %d"), err);
-
- TInt callactive(EFalse);
-
- TRAP(err,
- iFMSClient.OpenL();
- TInt err1 = iFMSClient.IsPhoneCallActive(callactive);
- iFMSClient.Close();
- );
-
- if (callactive)
- {
- FLOG(_L("Fota Update:: Active call found; differing showing the install dialog!"));
-
- iPackageState.iResult = RFotaEngineSession::EResUpdateFailed;
- TRAP(err,
- iDatabase->OpenDBL();
- iDatabase->SetStateL(iPackageState, KNullDesC8, EFDBResult);
- iDatabase->CloseAndCommitDB();
- );
-
- TRAP(err,
- iFMSClient.OpenL();
- iFMSClient.NotifyForUpdateL(EUpdMonitorPhoneCallEnd);
- iFMSClient.Close();
- );
-
- FLOG(_L("Deleting the fullscreen dialog..."));
- iFullScreenDialog->deleteLater();
- iFullScreenDialog = NULL;
- SetServerActive(EFalse);
- return;
- }
-
- TRAP(err, iUpdater->StartUpdateL( iPackageState ));
- FLOG(_L("Starting update, err = %d"), err);
- }
- else
- {
- FLOG(_L("CONTINUE LATER is pressed on update dialog"));
- ConstructApplicationUI(EFalse);
-
- iUpdater->CancelMonitor();
-
- if (iFullScreenDialog->IsLSKEnabled())
- {
- DecrementUserPostponeCount();
- }
-
- iPackageState.iState = RFotaEngineSession::EStartingUpdate;
- iPackageState.iResult = RFotaEngineSession::EResUserCancelled;
- TRAPD(err,
- iDatabase->OpenDBL();
- iDatabase->SetStateL( iPackageState ,KNullDesC8,EFDBState|EFDBResult );
- iDatabase->CloseAndCommitDB();
- );
- FLOG(_L("Updating the fota database... err = %d"), err);
-
- SetStartupReason(EFotaUpdateInterrupted);
- SetServerActive(EFalse);
- TRAP(err, InvokeFmsL());
- StopServerWhenPossible();
-
- iAsyncOperation = EFalse;
- FLOG(_L("Invoking fms, err = %d"), err);
- }
- }
- FLOG(_L("CFotaServer::HandleFullScreenDialogResponse <<"));
- }
-
-void CFotaServer::UpdateBatteryLowInfo(TBool aValue)
- {
- FLOG(_L("CFotaServer::UpdateBatteryLowInfo >>"));
-
- if (aValue)
- {
- FLOG(
- _L("Fota Update:: Battery has become low; disabling installation"));
- iPackageState.iResult = RFotaEngineSession::EResUpdateFailed;
- TRAP_IGNORE(
- iDatabase->OpenDBL();
- iDatabase->SetStateL( iPackageState ,KNullDesC8,EFDBResult );
- iDatabase->CloseAndCommitDB();
- );
-
- ShowFullScreenDialog(EHbFotaLowBattery);
- }
- else
- {
- ShowFullScreenDialog(EHbFotaUpdate);
- FLOG(
- _L("Fota Update:: Battery is still sufficient; enabling installation"));
- }
- FLOG(_L("CFotaServer::UpdateBatteryLowInfo <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::CheckSWVersionL
-// Check the s/w version
-// --------------------------------------------------------------------------
-//
-
-TBool CFotaServer::CheckSWVersionL()
-
- {
- FLOG(_L("CFotaServer::CheckSWVersionL >>"));
- TBuf<KSysVersionInfoTextLength> temp;
- HBufC16* message16 = NULL;
- TBool isPkgvalid(ETrue);
- if (GetSoftwareVersion(temp) == KErrNone)
- {
-
- //TBuf<KSysVersionInfoTextLength>swvfromfile;
- //Fetch the software version ...
- RFileReadStream rstr;
- TInt err1 = rstr.Open(iFs, KSWversionFile, EFileRead);
- if (err1 == KErrNone)
- {
- CleanupClosePushL(rstr);
- TInt msglen = rstr.ReadInt16L();
- if (msglen > 0)
- {
- message16 = HBufC16::NewLC(msglen + 1);
- TPtr16 tempswv = message16->Des();
- TRAPD(err, rstr.ReadL(tempswv,msglen ));
-
- if (err != KErrNone && err != KErrEof)
- {
- FLOG(_L(" file read err %d"), err); //User::Leave( err );
- msglen = 0;
- }
- else
- {
- FLOG(_L(" msglen %d"), msglen);
- TPtr swvfromfile = message16->Des();
-
- FLOG(_L(" swvfromfile=%S"), message16);
-
- //Compare the software versions to decide whether the download is still valid or not.
- if (msglen != temp.Length() || temp.Compare(tempswv)
- != KErrNone)
- {
- isPkgvalid = EFalse;
- FLOG(_L("CFotaServer::software not matching >>"));
-
- }
- }
-
- CleanupStack::PopAndDestroy(message16);
- }
- CleanupStack::PopAndDestroy(&rstr);
-
- }
-
- }
-
- FLOG(_L("CFotaServer::CheckSWVersionL <<"));
- return isPkgvalid;
-
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::ScheduledUpdateL
-// Update, triggered by scheduler
-// --------------------------------------------------------------------------
-void CFotaServer::ScheduledUpdateL(TFotaScheduledUpdate aUpdate,
- TFotaClient aClient)
- {
- FLOG(_L("CFotaServer::ScheduledUpdateL >>"));
-
- iAsyncOperation = ETrue;
- WakeupServer();
-
- TPackageState s = GetStateL(aUpdate.iPkgId);
-
- if (s.iState == RFotaEngineSession::EDownloadProgressing)
- {
- FLOG(_L("Trying to resume the download in non-silent mode"));
- iPackageState = s;
- TryResumeDownloadL(aClient, EFalse);
- }
- else if (s.iState == RFotaEngineSession::EStartingUpdate)
- {
- // If update is in progress, do not start new one (multiple popups)
- if (iUpdater)
- {
- FLOG(_L("\t\tupdate in progress"));
- return;
- }
- else
- {
- FLOG(_L("Trying to resume the installation in non-silent mode"));
- iPackageState = s;
- TryUpdateL(aClient);
- }
- }
- FLOG(_L("CFotaServer::ScheduledUpdateL <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::DoConnect
-// From CServer2. Initializes class members.
-// --------------------------------------------------------------------------
-void CFotaServer::DoConnect(const RMessage2 &aMessage)
- {
- FLOG(_L("CFotaServer::DoConnect(const RMessage2 &aMessage) >>"));
-
- // In case shutdown is in progress, cancel it.
- if (iInitialized == EFalse)
- {
- TRAPD( err, ClientAwareConstructL( aMessage ) );
- if (err)
- FLOG(_L(" ClientAwareConstructL err %d"), err);
- }
- CServer2::DoConnect(aMessage);
- FLOG(_L("CFotaServer::DoConnect(const RMessage2 &aMessage) <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::GetStateL
-// Get state of a download package
-// --------------------------------------------------------------------------
-TPackageState CFotaServer::GetStateL(const TInt aPkgId)
- {
- FLOG(_L("CFotaServer::GetStateL >>"));
- TPackageState s = RFotaEngineSession::EIdle;
-
- if (aPkgId >= 0) // Used by all clients
- {
- iDatabase->OpenDBL();
- s = iDatabase->GetStateL(aPkgId,iLastFwUrl);
- iDatabase->CloseAndCommitDB();
- }
- else if (aPkgId == -1) //Used by DM UI to get the state of last fota operation
- {
- //Read status from fotastate last entry
-
- iDatabase->OpenDBL();
-
- RArray<TInt> states;
- CleanupClosePushL(states);
- iDatabase->GetAllL(states);
- // Loop states.
- for (TInt i = 0; i < states.Count(); ++i)
- {
- TPackageState tmp;
- TBuf8<KMaxFileName> tmpurl;
- tmp = iDatabase->GetStateL(states[i], tmpurl);
- FLOG(_L("***Package: %d, State = %d"), states[i],
- (TInt) tmp.iState);
- if (tmp.iState != RFotaEngineSession::EIdle)
- {
- s = tmp;
- iLastFwUrl.Copy(tmpurl);
- }
- }
- FLOG(_L("Status of current operation is %d"), (TInt) s.iState);
-
- CleanupStack::PopAndDestroy(&states);
- iDatabase->CloseAndCommitDB();
- }
- FLOG(_L("CFotaServer::GetStateL <<"));
- return s;
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::OnSyncMLSessionEvent
-// --------------------------------------------------------------------------
-//
-void CFotaServer::OnSyncMLSessionEvent(TEvent aEvent, TInt aIdentifier,
- TInt aError, TInt /*aAdditionalData*/)
- {
- FLOG(_L("CFotaServer::OnSyncMLSessionEvent >>"));
-
- if (iSyncJobId != aIdentifier)
- return;
- FLOG(_L("CFotaServer::OnSyncMLSessionEvent %d err:%d (id %d==%d?)"),
- aEvent, aError, aIdentifier, iSyncJobId);
- TBool end(EFalse);
-
- if (iSyncJobId == aIdentifier)
- {
-
- switch (aEvent)
- {
- //EJobStart = 0
- case EJobStartFailed: // 1 E
- {
- end = ETrue;
- }
- break;
- case EJobStop: // 2 E
- {
- end = ETrue;
- // Sync ok => do not try anymore
- if (aError == KErrNone)
- {
- iSyncMLAttempts = 0;
- }
- }
- break;
- case EJobRejected: // 3 E
- {
- end = ETrue;
- }
- break;
- // ETransportTimeout , // 7
- default:
- {
- }
- break;
- }
- }
-
- if (end && iSyncMLAttempts == 0)
- {
- if (iTimedSMLSessionClose)
- {
- FLOG(_L(" closing smlsession timer"));
- iTimedSMLSessionClose->Cancel();
- delete iTimedSMLSessionClose;
- iTimedSMLSessionClose = NULL;
- }
- StopServerWhenPossible();
-
- }
- else if (end)
- {
-
- if (iTimedSMLSessionClose)
- {
- FLOG(_L(" closing smlsession timer"));
- iTimedSMLSessionClose->Cancel();
- delete iTimedSMLSessionClose;
- iTimedSMLSessionClose = NULL;
- }
-
- FLOG(_L(" starting smlsession timer"));
- TRAPD( err2, iTimedSMLSessionClose = CPeriodic::NewL (EPriorityNormal) );
- if (!err2)
- {
- iTimedSMLSessionClose->Start(TTimeIntervalMicroSeconds32(
- KSyncmlSessionRetryInterval),
- TTimeIntervalMicroSeconds32(
- KSyncmlSessionRetryInterval), TCallBack(
- StaticDoCloseSMLSession, this));
- }
- else
- FLOG(_L(" iTimedSMLSessionClose err %d"), err2);
- }
- FLOG(_L("CFotaServer::OnSyncMLSessionEvent <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::GetUpdateTimeStampL
-// Gets time of last update. It is stored in a file.
-// --------------------------------------------------------------------------
-void CFotaServer::GetUpdateTimeStampL(TDes16& aTime)
- {
- FLOG(_L("CFotaServer::GetUpdateTimeStampL >>"));
- TInt err;
-
- RFileReadStream rstr;
- err = rstr.Open(iFs, _L("updatetimestamp"), EFileRead);
-
- if (err == KErrNone)
- {
- FLOG(_L(" update time stamp file found,reading"));
- CleanupClosePushL(rstr);
- TInt year = rstr.ReadInt32L();
- TInt month = rstr.ReadInt32L();
- TInt day = rstr.ReadInt32L();
- TInt hour = rstr.ReadInt32L();
- TInt minute = rstr.ReadInt32L();
- TInt year16 = year;
- TInt month16 = month;
- TInt day16 = day;
- TInt hour16 = hour;
- TInt minute16 = minute;
- CleanupStack::PopAndDestroy(&rstr);
- aTime.Append(year16);
- aTime.Append(month16);
- aTime.Append(day16);
- aTime.Append(hour16);
- aTime.Append(minute16);
- }
- else if (err != KErrNotFound)
- {
- __LEAVE_IF_ERROR ( err );
- }
-
- if (err == KErrNotFound)
- {
- FLOG(_L(" update time stamp not found "));
- }
-
- FLOG(_L("CFotaServer::GetUpdateTimeStampL <<"));
- }
-
-void CFotaServer::GetCurrentFwDetailsL(TDes8& aName, TDes8& aVersion,
- TInt& aSize)
- {
- FLOG(_L("CFotaServer::GetCurrentFwDetailsL >>"));
-
- TPackageState package = GetStateL(-1);
-
- aName.Copy(package.iPkgName);
- aVersion.Copy(package.iPkgVersion);
- aSize = package.iPkgSize;
-
- FLOG(_L("CFotaServer::GetCurrentFwDetailsL <<"));
- }
-// --------------------------------------------------------------------------
-// CFotaServer::GetUpdatePackageIdsL
-// --------------------------------------------------------------------------
-//
-void CFotaServer::GetUpdatePackageIdsL(TDes16& aPackageIdList)
- {
- FLOG(_L("CFotaServer::GetUpdatePackageIdsL()"));
- __LEAVE_IF_ERROR(KErrNotSupported);
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::GenericAlertSentL
-// Generic alert sent, do cleanup. FUMO spec specifies cleanup need to have
-// for states 20,70,80,90,100. Called by syncml framework when it has sent
-// generic alert
-// --------------------------------------------------------------------------
-//
-void CFotaServer::ResetFotaStateL(const TInt aPackageID)
- {
- FLOG(_L("CFotaServer::ResetFotaStateL %d"), aPackageID);
- TPackageState state;
- TBool toidle(EFalse);
- TBool deletepkg(EFalse);
-
- iDatabase->OpenDBL();
- state = iDatabase->GetStateL(aPackageID, iLastFwUrl);
-
- switch (state.iState)
- {
- case RFotaEngineSession::EDownloadFailed:
- {
- toidle = ETrue;
- deletepkg = ETrue;
- }
- break;
- case RFotaEngineSession::EUpdateFailed:
- {
- toidle = ETrue;
- deletepkg = ETrue;
- }
- break;
- case RFotaEngineSession::EUpdateFailedNoData:
- {
- toidle = ETrue;
- }
- break;
- case RFotaEngineSession::EUpdateSuccessful:
- {
- toidle = ETrue;
- }
- break;
- case RFotaEngineSession::EUpdateSuccessfulNoData:
- {
- toidle = ETrue;
- }
- break;
- case RFotaEngineSession::EDownloadComplete:
- {
- state.iState = RFotaEngineSession::EStartingUpdate;
- state.iResult = KErrNotFound;
- iDatabase->SetStateL(state, KNullDesC8, EFDBState);
- toidle = EFalse;
- }
- break;
- default:
- {
- FLOG(_L(" pkg %d (state:%d) doesnt need cleanup"), aPackageID,
- state.iState);
- }
- break;
-
- }
-
- if (toidle)
- {
- state.iState = RFotaEngineSession::EIdle;
- state.iResult = KErrNotFound;
- iDatabase->SetStateL(state, KNullDesC8, EFDBState | EFDBResult);
- DeleteFUMOTreeL();
- }
-
- iDatabase->CloseAndCommitDB();
-
- SetStartupReason(EFotaDefault);
-
- if (deletepkg)
- {
- DownloaderL()->DeleteUpdatePackageL();
- }
- }
-
-void CFotaServer::ResetCounters()
- {
- FLOG(_L("CFotaServer::ResetCounters >>"));
-
- CRepository* centrep = NULL;
- TInt maxcount(0);
- TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) );
- if (err == KErrNone)
- {
- err = centrep->Get(KFOTAMaxPostponeCount, maxcount);
- err = centrep->Set(KFOTAUserPostponeCount, maxcount);
- err = centrep->Set(KFOTADownloadRestartCount, KMaxDownloadRestartCount);
- }
- delete centrep;
- centrep = NULL;
-
- FLOG(_L("CFotaServer::ResetCounters, postpone count set to %d, err = %d <<"), maxcount, err);
- }
-
-TBool CFotaServer::IsUserPostponeAllowed()
- {
- FLOG(_L("CFotaServer::IsUserPostponeAllowed >>"));
-
- TBool ret(ETrue);
- CRepository* centrep = NULL;
- TInt count(1);
- TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) );
- if (err == KErrNone)
- {
- err = centrep->Get(KFOTAUserPostponeCount, count);
- }
- delete centrep;
- centrep = NULL;
-
- if (count == 0)
- ret = EFalse;
- else if (count == -1) //-1 signifies infinite postpone
- ret = ETrue;
-
- FLOG(_L("CFotaServer::IsUserPostponeAllowed, count = %d, ret = %d, err = %d >>"), count, ret, err);
-
- return ret;
- }
-
-void CFotaServer::DecrementUserPostponeCount()
- {
- FLOG(_L("CFotaServer::DecrementUserPostponeCount >>"));
-
- CRepository* centrep = NULL;
- TInt count;
- TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) );
- if (err == KErrNone)
- {
- err = centrep->Get(KFOTAUserPostponeCount, count);
- if (--count < 0)
- count = 0;
- err = centrep->Set(KFOTAUserPostponeCount, count);
- }
- delete centrep;
- centrep = NULL;
-
- FLOG(
- _L("CFotaServer::DecrementUserPostponeCount, tries left: %d, err = %d >>"),
- count, err);
- }
-
-TBool CFotaServer::DecrementDownloadRestartCount()
- {
- FLOG(_L("CFotaServer::DecrementDownloadRestartCount >>"));
-
- TBool ret (ETrue);
- CRepository* centrep = NULL;
- TInt count;
-
- TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) );
- if (err == KErrNone)
- {
- err = centrep->Get(KFOTADownloadRestartCount, count);
- if (--count < 0)
- count = 0;
- err = centrep->Set(KFOTADownloadRestartCount, count);
- }
- delete centrep;
- centrep = NULL;
-
- if (count == 0)
- ret = EFalse;
-
- FLOG(_L("CFotaServer::DecrementDownloadRestartCount, ret = %d, err = %d <<"), ret, err);
- return ret;
- }
-
-
-// --------------------------------------------------------------------------
-// CFotaServer::StartNetworkMonitorL
-// Starts Network Monitoring operation for defined interval and retries (FotaNetworkRegMonitor.h)
-// --------------------------------------------------------------------------
-void CFotaServer::StartNetworkMonitorL()
- {
- FLOG(_L("CFotaServer::StartNetworkMonitorL >>"));
- if (!iMonitor)
- iMonitor = CFotaNetworkRegStatus::NewL(this);
- iMonitor->StartMonitoringL();
-
- FLOG(_L("CFotaServer::StartNetworkMonitorL <<"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::ReportNetworkStatus
-// called by CFotaNetworkRegStatus for reporting status
-// --------------------------------------------------------------------------
-void CFotaServer::ReportNetworkStatus(TBool status)
- {
- FLOG(_L("CFotaServer::ReportNetworkStatus, status = %d >>"), status);
- iRetryingGASend = EFalse;
- iNetworkAvailable = status;
-
- if (iNetworkAvailable)
- {
- TRAPD (err, CreateDeviceManagementSessionL (iPackageState));
- if (err != KErrNone)
- {
- FLOG(_L("Error %d occured while sending GA after retries"), err);
- }
- }
- //No need of iMonitor anymore
- if (iMonitor)
- {
- delete iMonitor;
- iMonitor = NULL;
- }
-
- FLOG(_L("CFotaServer::ReportNetworkStatus >>"));
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::CheckIapExistsL
-// Checks for IAP Id exists or not in commsdb
-// IAP Id used for resuming the download or for sending Generic alert
-// --------------------------------------------------------------------------
-//
-TBool CFotaServer::CheckIapExistsL(TUint32 aIapId)
- {
- FLOG(_L("CFotaServer::CheckIapExistsL >>"));
- TBool exists = EFalse;
- RCmManager cmManager;
- cmManager.OpenLC();
- RCmConnectionMethod conn;
- TRAPD(err, conn = cmManager.ConnectionMethodL( aIapId ));
- if(err == KErrNone)//connection method exists
- exists = ETrue;
- conn.Close();
- CleanupStack::PopAndDestroy();//cmManager
- FLOG(_L("CFotaServer::CheckIapExistsL <<"));
- return exists;
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::IsDeviceDriveBusyL
-// Finds if device encryption or decryption is in progress.
-// It is harmful to restart device whilst encryption/decryption is in progress
-// --------------------------------------------------------------------------
-//
-TBool CFotaServer::IsDeviceDriveBusyL()
- {
- FLOG(_L("CFotaServer::IsDeviceDriveBusyL >>"));
-
- TBool ret(EFalse);
- FeatureManager::InitializeLibL();
- TBool defeature = FeatureManager::FeatureSupported(
- KFeatureIdFfDeviceEncryptionFeature);
- FeatureManager::UnInitializeLib();
-
- if (defeature)
- {
- TInt value(EOpIdle); // Encryption idle
- RProperty::Get(KDevEncProtectedUid, KDevEncOperationKey, value);
-
- if (value != EOpIdle)
- ret = ETrue;
- }
-
- FLOG(_L("CFotaServer::IsDeviceDriveBusyL, ret = %d <<"), ret);
- return ret;
- }
-// --------------------------------------------------------------------------
-// CFotaDownload::SetIapToUseL
-// Sets the IAP ID to use. This menthod is used in fresh and resume download.
-// --------------------------------------------------------------------------
-//
-void CFotaServer::SetIapToUseL()
- {
- FLOG(_L("CFotaServer::SetIapToUseL >>"));
-
- TInt aIapId(KErrNotFound);
-
- // GET IAP FROM PROFILE ----------------------------------------------
-
- FLOG(_L("[FotaServer] 1"));
- RSyncMLSession syncsession;
- syncsession.OpenL();
- FLOG(_L("[FotaServer] 2"));
- RSyncMLDevManProfile smlprof;
- RArray<TSmlTransportId> connections;
- TSmlTransportId transport;
- RSyncMLConnection connection;
-
- CleanupClosePushL(syncsession);
- CleanupClosePushL(smlprof);
- CleanupClosePushL(connections);
- CleanupClosePushL(connection);
-
- FLOG(_L("[FotaServer] 1.1 opening syncml profileid %d "),
- iPackageState.iProfileId);
- smlprof.OpenL(syncsession, iPackageState.iProfileId, ESmlOpenRead);
- FLOG(_L("[FotaServer] 1.1"));
- smlprof.ListConnectionsL(connections);
- FLOG(_L("[FotaServer] 1.3"));
- transport = connections[0];
- connection.OpenL(smlprof, transport);
- TBuf8<20> iapid2 = connection.GetPropertyL(KNSmlIAPId);
- TLex8 iapid3(iapid2);
- iapid3.Val(aIapId);
-
- CleanupStack::PopAndDestroy(&connection);
- CleanupStack::PopAndDestroy(&connections);
- CleanupStack::PopAndDestroy(&smlprof);
- CleanupStack::PopAndDestroy(&syncsession);
-
- if (aIapId > KErrNotFound)
- {
- iPackageState.iIapId = aIapId;
- }
- else if (iPackageState.iState != RFotaEngineSession::EDownloadProgressing)
- {
- // GET IAP FROM CURRENT CONNECTION ----------------------------------------------
-
- FLOG(_L("IAP in DM profile is default. Hence reading from the connection manager..."));
- TInt sockIapid(-1);
- RSocketServ serv;
- CleanupClosePushL(serv);
- User::LeaveIfError(serv.Connect());
-
- RConnection conn;
- CleanupClosePushL(conn);
- User::LeaveIfError(conn.Open(serv));
-
- TUint count(0);
- User::LeaveIfError(conn.EnumerateConnections(count));
- // enumerate connections
- for (TUint idx = 1; idx <= count; ++idx)
- {
- TConnectionInfo connectionInfo;
- TConnectionInfoBuf connInfo(connectionInfo);
-
- TInt err = conn.GetConnectionInfo(idx, connInfo); // iapid
- if (err != KErrNone)
- {
- CleanupStack::PopAndDestroy(2); // conn, serv
- User::Leave(err);
- }
- // enumerate connectionclients
- TConnectionEnumArg conArg;
- conArg.iIndex = idx;
- TConnEnumArgBuf conArgBuf(conArg);
- err = conn.Control(KCOLConnection, KCoEnumerateConnectionClients,
- conArgBuf);
- if (err != KErrNone)
- {
- CleanupStack::PopAndDestroy(2); // conn, serv
- User::Leave(err);
- }
- TInt cliCount = conArgBuf().iCount;
- for (TUint j = 1; j <= cliCount; ++j)
- {
- TConnectionGetClientInfoArg conCliInfo;
- conCliInfo.iIndex = j;
- TConnGetClientInfoArgBuf conCliInfoBuf(conCliInfo);
- err = conn.Control(KCOLConnection,
- KCoGetConnectionClientInfo, conCliInfoBuf);
-
- if (err != KErrNone)
- {
- CleanupStack::PopAndDestroy(2); // conn, serv
- User::Leave(err);
- }
- TConnectionClientInfo conCliInf = conCliInfoBuf().iClientInfo;
- TUid uid = conCliInf.iUid;
- if (uid == TUid::Uid(KSosServerUid))
- {
- sockIapid = connInfo().iIapId;
- FLOG(_L("[FotaServer] IAP found from ESOCK %d"), sockIapid);
- iPackageState.iIapId = sockIapid;
- }
-
- FLOG(_L("[FotaServer] CFotaDownload::DownloadL uid %x"),
- uid.iUid);
- }
- }
- CleanupStack::PopAndDestroy(2); // conn, serv
- }
-
- FLOG(_L("CFotaDownload::SetIapToUseL, iap = %d <<"), iPackageState.iIapId);
- }
-// --------------------------------------------------------------------------
-// CFotaServer::GetSoftwareVersion
-// Gets the software version
-//
-// --------------------------------------------------------------------------
-//
-TInt CFotaServer::GetSoftwareVersion(TDes& aVersion)
- {
- FLOG(_L("CFotaServer::GetSoftwareVersion >>"));
- aVersion.Zero();
-
- SysVersionInfo::TVersionInfoType what = SysVersionInfo::EFWVersion;
- TInt error(KErrNone);
- error = SysVersionInfo::GetVersionInfo(what, aVersion);
- FLOG(_L("CFotaServer::GetSoftwareVersion,SwV=%S <<"), &aVersion);
- return error;
- }
-
-// --------------------------------------------------------------------------
-// CFotaServer::ResetFotaStateL
-// Resets the Fotastate
-//
-// --------------------------------------------------------------------------
-//
-void CFotaServer::ResetFotaStateToFailL()
- {
- FLOG(_L("CFotaServer::ResetFotaStateToFailL >>"));
-
- TPackageState state;
- if (!iDatabase->IsOpen())
- iDatabase->OpenDBL();
- //Fetch the software version that was before download from db.
- state = iDatabase->GetStateL(iPackageState.iPkgId, iLastFwUrl);
- state.iState = RFotaEngineSession::EUpdateFailed;
- state.iResult = RFotaEngineSession::EResPackageMismatch;
- iDatabase->SetStateL(state, KNullDesC8, EFDBState | EFDBResult);
- iDatabase->CloseAndCommitDB();
-
- DownloaderL()->DeleteUpdatePackageL();
-
- ReportFwUpdateStatusL(state);
-
- FLOG(_L("CFotaServer::ResetFotaStateToFailL <<"));
- }
-
-void CFotaServer::CreateDiskReservation()
- {
- FLOG(_L("CFotaServer::CreateDiskReservation >>"));
-
- TRAP_IGNORE(DownloaderL()->CreateDiskReservation());
-
- FLOG(_L("CFotaServer::CreateDiskReservation <<"));
- }
-
-void CFotaServer::DeleteDiskReservation(TDesC& path)
- {
- FLOG(_L("CFotaServer::DeleteDiskReservation >>"));
-
- QString temp = QString::fromUtf8(reinterpret_cast<const char*> (path.Ptr()), path.Length());
-
- TRAP_IGNORE(DownloaderL()->DeleteDiskReservation(temp));
-
- FLOG(_L("CFotaServer::DeleteDiskReservation <<"));
- }
-
-inline DownloadManagerClient* CFotaServer::DownloaderL()
- {
- if (!iDownloader)
- {
- FLOG(_L("Creating new download client..."));
- iDownloader = DownloadManagerClient::NewL(this);
- }
-
- return iDownloader;
- }
-
-void CFotaServer::DropSession()
- {
- FLOG(_L("CFotaServer::DropSession >>"));
-
- iSessionCount--;
-
- FLOG(_L("Number of active sessions = %d"), iSessionCount);
-
- if (iSessionCount == 0 && !iAsyncOperation)
- {
- StopServerWhenPossible();
- ServerCanShut(ETrue);
- }
-
- FLOG(_L("CFotaServer::DropSession <<"));
- }
-
-static TInt StaticApplicationShutter(TAny *aPtr)
- {
- __ASSERT_ALWAYS( aPtr, User::Panic(KFotaPanic, KErrArgument) );
- CFotaServer* srv = (CFotaServer*) aPtr;
- srv->StopServerWhenPossible();
- return KErrNone;
- }
-
-void CFotaServer::WakeupServer()
- {
- FLOG(_L("CFotaServer::WakeupServer >>"));
- ServerCanShut(EFalse);
- if (iAppShutter)
- {
- iAppShutter->Cancel();
- delete iAppShutter;
- iAppShutter = NULL;
- }
-
- FLOG(_L("CFotaServer::WakeupServer >>"));
- }
-
-void CFotaServer::StopServerWhenPossible()
- {
- FLOG(_L("CFotaServer::StopServerWhenPossible, sessioncount = %d, servercanshut = %d >>"), iSessionCount, iServerCanShut);
- //Check if it's the right time to do so..
-
- if (iSessionCount == 0 && iServerCanShut)
- {
- FLOG(_L("Shutting down the Fota server..."));
- //Do some cleanup
-
- if (iAppShutter)
- {
- iAppShutter->Cancel();
- delete iAppShutter;
- iAppShutter = NULL;
- }
-
- //Exit. This will stop the active scheduler too.
- QApplication::exit();
- }
- else if (iSessionCount == 0)
- {
- FLOG(_L("Diferring shutdown now. Started shutdown timer..."));
-
- if (!iAppShutter)
- {
- TRAP_IGNORE(
- iAppShutter = CPeriodic::NewL (EPriorityNormal);
- iAppShutter->Start(KFotaTimeShutDown, KFotaTimeShutDown,
- TCallBack(StaticApplicationShutter, this));
- );
- }
-
- }
- else
- {
- //one or more client is still open
- FLOG(_L("Diferring shutdown now."));
- WakeupServer();
- }
- FLOG(_L("CFotaServer::StopServerWhenPossible <<"));
- }
-
-void CFotaServer::ServerCanShut(TBool aParam)
- {
- FLOG(_L("CFotaServer::ServerCanShut, param = %d >>"), aParam);
-
- iServerCanShut = aParam;
-
- FLOG(_L("CFotaServer::ServerCanShut <<"));
-
- }
-
-void CFotaServer::ConstructApplicationUI(TBool aVal)
- {
- FLOG(_L("CFotaServer::ConstructApplicationUI, value = %d >>"), aVal);
-
- if (!aVal)
- iMainwindow.lower();
- else
- iMainwindow.raise();
-
- FLOG(_L("CFotaServer::ConstructApplicationUI <<"));
- }
-
-
-void CFotaServer::SetVisible(TBool aVisible)
-{
- FLOG(_L("CFotaServer::SetVisible >>"));
-
- if(iFullScreenDialog)
- iFullScreenDialog->SetVisible(aVisible);
-
- FLOG(_L("CFotaServer::SetVisible <<"));
-}
-
-//End of file