--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fotaapplication/fotaserver/FotaServer/src/fotaSrvSession.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,458 @@
+/*
+* 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: fotaengines server side session
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "FotasrvSession.h"
+#include "FotaSrvDebug.h"
+#include <eikenv.h>
+#include <eikappui.h>
+#include <s32mem.h>
+#include <e32base.h>
+#include <centralrepository.h>
+#include "FotaServer.h"
+#include "FotaSrvApp.h"
+// ============================= MEMBER FUNCTIONS ============================
+
+class CFotaServer;
+
+// ---------------------------------------------------------------------------
+// CFotaSrvSession::CheckClientSecureIdL
+// Returns True if caller is syncml framework. False for fotasrv.
+// Leaves if client is unknown
+// ---------------------------------------------------------------------------
+//
+CFotaSrvSession::TClient CFotaSrvSession::CheckClientSecureIdL (
+ const RMessage2& aMessage)
+ {
+ //TClient client(EUnknown);
+ TUid dmhostserver1 = TUid::Uid( KDMHostServer1Uid );
+ TUid fota = TUid::Uid( KFotaServerUid );
+ TUid omadmappui = TUid::Uid( KOmaDMAppUid );
+ TUid starter = TUid::Uid( KStarterUid );
+ TUid fscheduler = TUid::Uid( KFotaScheduler );
+ TUid fms = TUid::Uid( KFMSServerUid );
+ TUid softwarechecker = TUid::Uid( 0x2000BB96 );
+ TUid softwarecheckerbackground = TUid::Uid( 0x2000BB97 );
+ TUid testapp = TUid::Uid( 0x102073E4);
+
+ TUid iadclient = TUid::Uid( 0x2000F85A );
+
+ // Syncml
+ if ( aMessage.SecureId() == dmhostserver1.iUid )
+ {
+ FLOG(_L("[CFotaSrvSession] CheckClientSecureIdL client is \
+ DmHostserver!"));
+ return EDMHostServer;
+ }
+
+ // OmaDMAPpui
+ if ( aMessage.SecureId() == omadmappui.iUid )
+ {
+ FLOG(_L("[CFotaSrvSession] CheckClientSecureIdL client is \
+ omadmappui!"));
+ return EOMADMAppUi;
+ }
+
+ // Fotaserver
+ if ( aMessage.SecureId() == fota.iUid )
+ {
+ FLOG(_L("[CFotaSrvSession] CheckClientSecureIdL client is \
+ fotaserver!"));
+ return EFotaServer;
+ }
+
+ // Starter
+ if ( aMessage.SecureId() == starter.iUid )
+ {
+ return EStarter;
+ }
+
+
+
+ // Software Checker app
+ if ( aMessage.SecureId() == softwarechecker.iUid || aMessage.SecureId() == iadclient.iUid)
+ {
+ return ESoftwareChecker;
+ }
+
+ // Software Checker Background app
+ if ( aMessage.SecureId() == softwarecheckerbackground.iUid )
+ {
+ return ESoftwareCheckerBackground;
+ }
+
+
+// *3* <-
+
+
+ // Tester app for testing purp.
+ if ( aMessage.SecureId() == 0x0323231 || aMessage.SecureId() == testapp.iUid)
+ {
+ return EFotaTestApp;
+ }
+ if ( aMessage.SecureId() == fms.iUid )
+ {
+ return EFMSServer;
+ }
+ // schedulehandler
+ if ( aMessage.SecureId() == fscheduler.iUid)
+ {
+ return EFotaTestApp;
+ }
+
+ FLOG(_L("[CFotaSrvSession] CheckClientSecureIdL client 0x%X is unknown \
+ (msg %d), bailing out"),aMessage.SecureId().iId, aMessage.Function());
+ User::Leave( KErrAccessDenied );
+ return EFotaTestApp; // compiler warning otherwise
+ }
+
+
+// ---------------------------------------------------------------------------
+// CFotaSrvSession::CFotaSrvSession
+// ---------------------------------------------------------------------------
+//
+CFotaSrvSession::CFotaSrvSession( )
+ {
+ FLOG( _L( "CFotaSrvSession::CFotaSrvSession( )" ) );
+ iError = KErrNone;
+ //iDoc = CEikonEnv::Static()->EikAppUi()->Document();
+ }
+
+// ---------------------------------------------------------------------------
+// CFotaSrvSession::~CFotaSrvSession
+// ---------------------------------------------------------------------------
+//
+CFotaSrvSession::~CFotaSrvSession()
+{
+}
+
+// ---------------------------------------------------------------------------
+// CFotaSrvSession::CreateL
+// ---------------------------------------------------------------------------
+//
+void CFotaSrvSession::CreateL()
+ {
+ FLOG( _L( "CFotaSrvSession::CreateL() >>" ) );
+ CAknAppServiceBase::CreateL();
+ FLOG( _L( "CFotaSrvSession::CreateL() <<" ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CFotaSrvSession::ServiceL
+// Handle client request
+// ---------------------------------------------------------------------------
+//
+void CFotaSrvSession::ServiceL(const RMessage2& aMessage)
+ {
+ TInt err(KErrNone);
+ TInt pkgid = 0;
+ TPackageState state;
+ RThread clt; aMessage.ClientL(clt);
+ TFullName cltnm = clt.FullName();
+ FLOG(_L( "CFotaSrvSession::ServiceL %d serving for %S?" )
+ ,aMessage.Function(), &cltnm );
+
+ TInt cmd = aMessage.Function();
+ if(( cmd!= EGetState ) && (cmd!= EGetResult ))
+ {
+ TInt fotaValue(1);
+ CRepository* centrep( NULL);
+ TUid uidValue = {0x101F9A08}; // KCRFotaAdapterEnabled
+ centrep = CRepository::NewL( uidValue);
+ if(centrep )
+ {
+ FLOG(_L("centralrepository found "));
+ centrep->Get( 1 , fotaValue ); // KCRFotaAdapterEnabled
+ delete centrep;
+ }
+ if ( ! fotaValue )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ }
+
+ TClient client = CheckClientSecureIdL ( aMessage );
+
+ switch( aMessage.Function() )
+ {
+ case EFotaFirstCommand:
+ {
+ }
+ aMessage.Complete(KErrNone);
+ break;
+ case EFotaDownload:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL DOWNLOAD") );
+ TDownloadIPCParams ipc;
+ TPckg<TDownloadIPCParams> pkg(ipc);
+ aMessage.Read (0, pkg);
+ TInt deslen = aMessage.GetDesLengthL (1);
+ HBufC8* urlbuf = HBufC8::NewLC(deslen);
+ TPtr8 urlptr = urlbuf->Des();
+ aMessage.Read (1,urlptr);
+ FotaServer()->DownloadL(ipc,urlptr);
+ CleanupStack::PopAndDestroy(); // urlbuf
+ aMessage.Complete( KErrNone );
+ break;
+ }
+ case EFotaUpdate:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL UPDATE" ));
+ TDownloadIPCParams ipc;
+ TPckg<TDownloadIPCParams> pkg(ipc);
+ aMessage.Read( 0 ,pkg );
+ FotaServer()->SetInstallUpdateClientL(client);
+ // If update started from omadmappui, no alert should be sent if
+ // update is cancelled
+ if ( client == EOMADMAppUi )
+ {
+ ipc.iSendAlert = EFalse;
+ }
+ FotaServer()->UpdateL(ipc);
+ aMessage.Complete( KErrNone );
+ break;
+ }
+ case EFotaDownloadAndUpdate:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL DOWNLOADANDUPDATE" ));
+ TDownloadIPCParams ipc;
+ TPckg<TDownloadIPCParams> pkg(ipc);
+ aMessage.Read (0, pkg);
+ TInt deslen = aMessage.GetDesLengthL (1);
+ HBufC8* urlbuf = HBufC8::NewLC(deslen);
+ TPtr8 urlptr = urlbuf->Des();
+ aMessage.Read (1,urlptr);
+ FotaServer()->DownloadAndUpdateL(ipc,urlptr);
+ CleanupStack::PopAndDestroy( urlbuf );
+ aMessage.Complete( KErrNone );
+ }
+ break;
+ case EFotaOpenUpdatePackageStore:
+ {
+ FLOG(_L("CFotaSrvSession::ServiceL OPENUPDATEPACKAGESTORE"));
+ FotaServer()->OpenUpdatePackageStoreL( aMessage );
+ aMessage.Complete( KErrNone );
+ }
+ break;
+
+ case EFotaGetDownloadUpdatePackageSize:
+ {
+ TInt dlsize = 0;
+ TInt totalsize = 0;
+ pkgid = aMessage.Int0();
+ //err is already KErrNone.
+ FotaServer()->GetDownloadUpdatePackageSizeL( pkgid, dlsize, totalsize );
+ TPckg<TInt> pkg2(dlsize);
+ TPckg<TInt> pkg3 (totalsize);
+ aMessage.Write (1,pkg2);
+ aMessage.Write (2,pkg3);
+ aMessage.Complete( KErrNone );
+ }
+ break;
+
+ case EFotaSendChunk:
+ {
+ FotaServer()->ReadChunkL( aMessage.Int0(),iError );
+ iError = KErrNone;
+ aMessage.Complete( KErrNone );
+ }
+ break;
+ case EFotaReleaseChunkHandle:
+ {
+ FLOG(_L("CFotaSrvSession::ServiceL EFotaReleaseChunkHandle"));
+ FotaServer()->UpdateDBdataL();
+ aMessage.Complete( KErrNone );
+ }
+ break;
+
+ case EFotaTryResumeDownload:
+ {
+ if (client == EOMADMAppUi )
+ {
+ FotaServer()->TryResumeDownloadL(ETrue); // user initiated
+ aMessage.Complete( KErrNone );
+ }
+ else if (client == EFMSServer)
+ {
+ FotaServer()->TryResumeDownloadL(EFalse); // fms initiated
+ aMessage.Complete( KErrNone );
+ }
+ else if(client == EFotaTestApp)
+ {
+ FotaServer()->TryResumeDownloadL(EFalse); // fms initiated
+ aMessage.Complete( KErrNone );
+ }
+ else
+ {
+ aMessage.Complete ( KErrAccessDenied );
+ }
+ }
+ break;
+
+ case EUpdatePackageDownloadComplete:
+ {
+ FLOG(_L("CFotaSrvSession::ServiceL \
+ UPDATEPACKAGEDOWNLOADCOMPLETE"));
+ // If caller is syncmlDM framework, download is largeobject
+ // download. If caller is other, download is Oma DL/http
+
+ TBool largeobj = (client == EDMHostServer)? ETrue : EFalse;
+ pkgid = aMessage.Int0();
+ FotaServer()->UpdatePackageDownloadCompleteL(largeobj
+ , pkgid);
+ aMessage.Complete( KErrNone );
+ }
+ break;
+ case EDeletePackage:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL DELETEPACKAGE") );
+ pkgid = aMessage.Int0();
+ FotaServer()->DeletePackageL(pkgid);
+ aMessage.Complete( KErrNone );
+ }
+ break;
+ case EGetState:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL GETSTATE >>" ));
+ pkgid = aMessage.Int0();
+
+ // NSC_DM: commented out 2 strings below, otherwise it crashes from NSC with Kern-Exec 44 ->
+ if (client != EOMADMAppUi && client != ESoftwareChecker && client != ESoftwareCheckerBackground && client != EFotaTestApp && pkgid < 0)
+ aMessage.Complete (KErrArgument);
+ // <-
+ state = FotaServer()->GetStateL(pkgid);
+ //Protecting state 25. If any client other than DM UI queries for state, 25 should not be sent and
+ //20 will be sent instead.
+ if (client != EOMADMAppUi && state.iState == RFotaEngineSession::EDownloadProgressingWithResume)
+ state.iState = RFotaEngineSession::EDownloadProgressing;
+ FLOG(_L( "CFotaSrvSession::ServiceL GETSTATE << %d" )
+ ,state.iState);
+ TPckg<RFotaEngineSession::TState> pkg2(state.iState);
+ aMessage.Write (1, pkg2);
+ aMessage.Complete (KErrNone);
+ }
+ break;
+ case EGetResult:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL GETRESULT >>" ));
+ pkgid = aMessage.Int0();
+ state = FotaServer()->GetStateL(pkgid);
+ TPckg<TInt> pkg2(state.iResult);
+ FLOG(_L( "CFotaSrvSession::ServiceL GETRESULT << %d" )
+ ,state.iResult);
+ aMessage.Write (1, pkg2);
+ aMessage.Complete (err);
+ break;
+ }
+ case EIsPackageStoreSizeAvailable:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL \
+ ISPACKAGESTORESIZEAVAILABLE" ));
+
+ TInt size = aMessage.Int0();
+ TBool avail;
+ // In UI evolution, size of file will be checked by fotaserver itself. Keep following
+ // until codhandler skips size check itself
+ //#ifdef RD_OMADMAPPUI_UI_EVOLUTION
+ if ( client == EFotaServer ) avail = ETrue;
+ else avail = FotaServer()->IsPackageStoreSizeAvailableL( size );
+ /*#else
+ avail = FotaServer()->IsPackageStoreSizeAvailableL( size );
+ #endif*/
+ TPckg<TBool> pavail(avail);
+ aMessage.Write (1, pavail);
+ aMessage.Complete (KErrNone);
+ break;
+ }
+
+ case EGetUpdatePackageIds:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL EGETUPDATEPACKAGEIDS" ));
+ TPkgIdList pkgids;
+ FotaServer()->GetUpdatePackageIdsL(pkgids);
+ TPckg<TPkgIdList> pkgids_pkg(pkgids);
+ aMessage.Write(0, pkgids_pkg);
+ aMessage.Complete(KErrNone);
+ }
+ break;
+
+ case EGetUpdateTimestamp:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL EGETUPDATETIMESTAMP" ));
+ TBuf16<15> timestamp;
+ FotaServer()->GetUpdateTimeStampL(timestamp);
+ aMessage.Write(0, timestamp );
+ aMessage.Complete(KErrNone);
+ }
+ break;
+
+ case EGenericAlertSentForPackage:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL EGENERICALERTSENT FOR PKGID" ));
+ TInt pkgid = aMessage.Int0();
+ FotaServer()->GenericAlertSentL( pkgid );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case EScheduledUpdate:
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceL ESCHEDULEDUPDATE" ));
+ TFotaScheduledUpdate sched(-1,-1);
+ TPckg<TFotaScheduledUpdate> p(sched);
+ aMessage.Read (0, p);
+ FotaServer()->SetInstallUpdateClientL(client);
+ FLOG(_L(" pkgid: %d scheduleid:%d"), sched.iPkgId,sched.iScheduleId);
+ FotaServer()->ScheduledUpdateL( sched );
+ aMessage.Complete( KErrNone );
+ }
+ break;
+
+ default:
+ {
+ CAknAppServiceBase::ServiceL( aMessage );
+ }
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFotaSrvSession::ServiceError
+// ---------------------------------------------------------------------------
+//
+void CFotaSrvSession::ServiceError( const RMessage2& aMessage,TInt aError )
+ {
+ FLOG(_L( "CFotaSrvSession::ServiceError %d" ),aError );
+ iError = aError;
+ CFotaServer* f = FotaServer();
+ TRAPD(err2, f->iParentApp->SetUIVisibleL ( EFalse,ETrue ) );
+ if(err2); // remove compiler warning
+ CAknAppServiceBase::ServiceError( aMessage, aError );
+ }
+
+// ---------------------------------------------------------------------------
+// CFotaSrvSession::FotaServer
+// Helper function
+// ---------------------------------------------------------------------------
+//
+
+CFotaServer* CFotaSrvSession::FotaServer() const
+{
+return (CFotaServer* ) Server();
+}