diff -r 13d7c31c74e0 -r b183ec05bd8c fotaapplication/fmserver/src/fmsserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fotaapplication/fmserver/src/fmsserver.cpp Tue Aug 31 16:04:06 2010 +0300 @@ -0,0 +1,839 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation of fotaserver component +* This is part of fotaapplication. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fotaserverPrivateCRKeys.h" +#include "fmsserver.h" +#include "fmsinterruptaob.h" +#include "fmsclientserver.h" +#include "fmsserversession.h" +#include +#include +#include "FotaIPCTypes.h" +// ---------------------------------------------------------------------------------------- +// Server startup code +// ---------------------------------------------------------------------------------------- +static void RunServerL() + { + // naming the server thread after the server helps to debug panics + User::LeaveIfError(User::RenameThread(KFMSServerName)); + + // create and install the active scheduler + CActiveScheduler* s=new(ELeave) CActiveScheduler; + CleanupStack::PushL(s); + CActiveScheduler::Install(s); + + // create the server (leave it on the cleanup stack) + CFMSServer::NewLC(); + + // Initialisation complete, now signal the client + RProcess::Rendezvous(KErrNone); + + // Ready to run + CActiveScheduler::Start(); + + // Cleanup the server and scheduler + CleanupStack::PopAndDestroy(2); + } + + +// ---------------------------------------------------------------------------------------- +// static method LogNwRequestL() called to submit async n/w request +// ---------------------------------------------------------------------------------------- +static TInt LogNwRequestL(TAny* aPtr) + { + CFMSServer* ptr = (CFMSServer*) aPtr; + FLOG(_L("static LogNwRequestL:-Begin")); + TRAPD(err, ptr->StartMonitoringL(EDLNetworkInterrupt)); + FLOG(_L("LogNwRequestL started monitoring")); + ptr->StopAsyncRequest(); + FLOG(_L("static LogNwRequestL:-end")); + return err; + } + + +// ---------------------------------------------------------------------------------------- +// static method LogCallEndMonitorRequestL() called to submit async call end monitor request +// ---------------------------------------------------------------------------------------- +static TInt LogCallEndMonitorRequestL(TAny* aPtr) + { + CFMSServer* ptr = (CFMSServer*) aPtr; + FLOG(_L("static LogCallEndMonitorRequestL:-Begin")); + TRAPD(err, ptr->StartUpdateInterruptMonitoringL(EUpdMonitorPhoneCallEnd)); + FLOG(_L("LogCallEndMonitorRequestL started monitoring")); + ptr->StopAsyncRequest(); + FLOG(_L("static LogCallEndMonitorRequestL:-end")); + return err; + } + +// ---------------------------------------------------------------------------------------- +// Server process entry-point +// ---------------------------------------------------------------------------------------- +TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanup=CTrapCleanup::New(); + TInt r=KErrNoMemory; + if (cleanup) + { + TRAP(r,RunServerL()); + delete cleanup; + } + __UHEAP_MARKEND; + return r; + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::NewLC +// ---------------------------------------------------------------------------------------- +CServer2* CFMSServer::NewLC() +{ +CFMSServer* self=new(ELeave) CFMSServer; +CleanupStack::PushL(self); +self->ConstructL(); +return self; +} + +// ---------------------------------------------------------------------------------------- +// CFMSServer::ConstructL +// ---------------------------------------------------------------------------------------- +void CFMSServer::ConstructL() + { + FLOG(_L("CFMSServer::ConstructL- begin")); + StartL(KFMSServerName); + User::LeaveIfError( iFs.Connect() ); + TInt err; + err = iFs.CreatePrivatePath(EDriveC); + if ( err != KErrNone && err != KErrAlreadyExists ) + { User::Leave (err); } + User::LeaveIfError( iFs.SetSessionToPrivate( EDriveC ) ); + err = iFile.Create(iFs,KFotaInterruptFileName,EFileWrite); + if(err == KErrNone)//means file created now and opened + { + FLOG(_L("CFMSServer::ConstructL- file closed")); + iFile.Close(); + } + else if( err != KErrAlreadyExists ) + { + FLOG(_L("CFMSServer::ConstructL- leaving with err as %d"),err); + User::Leave(err); + } + FindVariation(); + iFMSInterruptAob.ConstructL(); + iFMSInterruptAob.iServer = this; + FLOG(_L("CFMSServer::ConstructL- end")); + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::CFMSServer() +// ---------------------------------------------------------------------------------------- +CFMSServer::CFMSServer() :CServer2(EPriorityStandard, EUnsharableSessions) /*CServer2(0)*/ + { + iSessionCount = 0; + //iNetworkMon = ETrue; //Incase of cenrep key has problem + iNetworkMon = EFalse; + iChargerMon = EFalse; + iPhoneRestartMon = EFalse; + iMemoryMon = EFalse; + iDeleteFile = ETrue; + iLogAsyncRequest = NULL; + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::MemoryToMonitorL() +// ---------------------------------------------------------------------------------------- +void CFMSServer::MemoryToMonitorL(TInt aSize, TDriveNumber aDrive) + { + if( iSessionCount == 0 )// no pending request + { + iFMSInterruptAob.MemoryToMonitorL(aSize,aDrive); + } + } +// ---------------------------------------------------------------------------------------- +// CFMSServer::NetworkTypeL() +// ---------------------------------------------------------------------------------------- +void CFMSServer::NetworkTypeL(TInt aBearer) + { + if( iSessionCount == 0 )// no pending request + { + iFMSInterruptAob.NetworkTypeL(aBearer); + } + } + +//------------------------------------------------------------ +// Call from session class in fotastartup case +// CFMSServer::CheckNetworkL +//------------------------------------------------------------ +void CFMSServer::CheckNetworkL(TInt& aBearerId, TInt& aDrive, TInt& aSize, + TBool& aWcdma) + { + if(iNetworkMon)//n/w monitoring supports + { + FLOG(_L("CFMSServer::CheckNetworkL- n/w monitor supported")); + if(iFMSInterruptAob.CheckNetworkL()) //not n/w interrupt + WLAN or GPRS + { + FLOG(_L("CFMSServer::CheckNetworkL- n/w mon supported & launch fota")); + iFMSInterruptAob.LaunchFotaEngineL(); + DropSession(); // to close the session & server + return; + } + else //if network not up, monitor for that + { + //from session itself we set the bearer type + FLOG(_L("CFMSServer::CheckNetworkL- n/w not up beaerer 3G %d"),aWcdma); + WriteToFile(EDLNetworkInterrupt,aBearerId, + (TDriveNumber)aDrive, aSize, aWcdma ); + StartMonitoringL(EDLNetworkInterrupt); + } + } + else //user interrupt or general interrupt dont check n/w call fota + { + FLOG(_L("CFMSServer::CheckNetworkL- n/w monitor not supported & launch fota")); + iFMSInterruptAob.LaunchFotaEngineL(); + FLOG(_L("CFMSServer::CheckNetworkL- stop server")); + DropSession(); + } + } + +//------------------------------------------------------------ +// Call from session class in hard reboot only +// CFMSServer::TriggerFotaL +//------------------------------------------------------------ +void CFMSServer::TriggerFotaL() + { + FLOG(_L("CFMSServer::TriggerFotaL- begin")); + if(iNetworkMon)//n/w monitoring supports + { + FLOG(_L("CFMSServer::TriggerFotaL- n/w monitor supported")); +#if defined (__WINS__) + if(ETrue) +#else + if(iFMSInterruptAob.CheckNetworkL()) +#endif + { + FLOG(_L("CFMSServer::TriggerFotaL- n/w mon supported & launch fota")); + iFMSInterruptAob.LaunchFotaEngineL(); + } + else if(iFMSInterruptAob.CheckGlobalRFStateL()) + { + FLOG(_L("CFMSServer::TriggerFotaL- n/w check started")); + iFMSInterruptAob.StartNetworkRegistryCheckL(); + return; //dont call drop session as it closes server + } + else + { + FLOG(_L("CFMSServer::TriggerFotaL- phone is offline")); + } + } + else //user interrupt or general interrupt dont check n/w call fota + { + FLOG(_L("CFMSServer::TriggerFotaL- n/w monitor not supported & launch fota")); + iFMSInterruptAob.LaunchFotaEngineL(); + FLOG(_L("CFMSServer::TriggerFotaL- stop server")); + } + DropSession(); // to close the session & server in any case + FLOG(_L("CFMSServer::TriggerFotaL- End")); + } + +//------------------------------------------------------------ +// Called only in n/w interrupt+ WLAN case from session class +// CFMSServer::CheckWlanL +//------------------------------------------------------------ +TBool CFMSServer::CheckWlanL() + { + return iFMSInterruptAob.CheckNetworkL(); + } + +//------------------------------------------------------------ +// CFMSServer::SetWcdma +//------------------------------------------------------------ +void CFMSServer::SetWcdma() + { + iFMSInterruptAob.SetWcdma(); + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::LockSession() +// ---------------------------------------------------------------------------------------- +void CFMSServer::LockSession() + { + iSessionCount++; + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::WriteToFile() +// ---------------------------------------------------------------------------------------- +void CFMSServer::WriteToFile(TInt aReason, TInt aBearer,TDriveNumber aDrive, + TInt aSize, TBool aWcdmaBearer ) + { + if(iSessionCount == 0) + { + FLOG(_L("CFMSServer::WriteToFile- begin")); + TInt err=iFile.Open(iFs,KFotaInterruptFileName,EFileWrite); + if(err == KErrNone) + { + FLOG(_L("CFMSServer::WriteToFile--passed")); + TBuf8<30> data;//size 30 or 32--as args is 16 bytes + TBuf8<30> temp; + temp.Num(aReason); + data.Append(temp); + data.Append(','); + temp.Num(aBearer);// or use iFMSinterruptAob's iBearer + data.Append(temp); + data.Append(','); + temp.Num((TInt)aDrive); + data.Append(temp); + data.Append(','); + temp.Num(aSize); + data.Append(temp); + data.Append(','); + temp.Num(aWcdmaBearer); + data.Append(temp); + iFile.Write(data); + iFile.Close(); + } + else + FLOG(_L("CFMSServer::WriteToFile- Failed")); + } + else + FLOG(_L("CFMSServer::WriteToFile- not done as another request is there")); + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::ReadFromFile() +// ---------------------------------------------------------------------------------------- +TBool CFMSServer::ReadFromFile(TInt& aReason, TInt& aBearer, TInt& aDrive, TInt& aSize + , TInt& aWcdmaBearer ) + { + TInt err = iFile.Open(iFs,KFotaInterruptFileName,EFileRead); + FLOG(_L("CFMSServer::ReadFromFile() error as %d"),err); + if(err == KErrNone) + { + TInt size = KErrNone; + err = iFile.Size(size); + if(size == 0) //file empty + { + FLOG(_L("CFMSServer::ReadFromFile() file size is empty")); + iFile.Close(); + return EFalse; + } + TBuf8<30> data; + iFile.Read(data); + iFile.Close(); + TBuf8<30> data1; + if(data.Length()>0) + { + TInt len =0 ; + if((len=data.LocateF(',')) > 0) + { + TLex8 value( data.Left(len)); + value.Val(aReason); + FLOG(_L("CFMSServer::ReadFromFile() retrieving reason as %d"),aReason); + data1.Insert(0,data.Right(data.Length()-(len+1))); + data.Zero(); + // len=data1.LocateF(','); + if( data1.Length() > 0 && (len=data1.LocateF(',')) > 0) + { + value=data1.Left(len); + value.Val(aBearer); + FLOG(_L("CFMSServer::ReadFromFile() retrieving aBearer as %d"),aBearer); + data.Insert(0,data1.Right(data1.Length()-(len+1))); + data1.Zero(); + // len=data.LocateF(','); + if(data.Length() > 0 && ( len=data.LocateF(','))> 0) + { + value=data.Left(len); + value.Val(aDrive); + FLOG(_L("CFMSServer::ReadFromFile() retrieving aDrive as %d"),aDrive); + data1.Insert(0,data.Right(data.Length()-(len+1))); + data.Zero(); + if(data1.Length() > 0 && ( len=data1.LocateF(','))> 0 ) + { + value=data1.Left(len); + value.Val(aSize); + FLOG(_L("CFMSServer::ReadFromFile() retrieving aSize as %d"),aSize); + data.Insert(0,data1.Right(data1.Length()-len-1)); + data1.Zero(); + if(data.Length() > 0 ) + { + value=data; + value.Val(aWcdmaBearer); + FLOG(_L("CFMSServer::ReadFromFile() retrieving aWcdmaBearer as %d"),aWcdmaBearer); + } + } + } + } + } + } + } + else + { + return EFalse; + } + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CFMSServer::DropSession() +// ----------------------------------------------------------------------------- + +void CFMSServer::DropSession() + { + // A session is being destroyed + iSessionCount = 0; + //Kill the server + CActiveScheduler::Stop(); + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::FindVariation() +// ---------------------------------------------------------------------------------------- +void CFMSServer::FindVariation() + { + FLOG(_L("CFMSServer::FindVariation()")); + CRepository* centrep = NULL; + TInt variation = 1; + TRAPD( err, centrep = CRepository::NewL( KCRUidFotaServer ) ); + if ( centrep ) + { + FLOG(_L("CFMSServer::FindVariation()::Inside cenrep if")); + TInt err = centrep->Get( KFotaMonitoryServiceEnabled, variation ); + if( err == KErrNone) + { + FLOG(_L("CFMSServer::FindVariation()::cenrep key found with %d"),variation); + } + delete centrep; + } + if ( err == KErrNone ) + { + TBuf<10> var; //32-bit has max of 10 chars in Decimal + var.Num(variation,EBinary); + TInt size = var.Length(), maxlen = 4; + if( size < maxlen) + { + TBuf<4> temp; + temp.AppendFill('0',maxlen-size); + temp.Append(var); + var.Zero(); + var.Append(temp); + } + var.AppendFill('0',6); + if( var[0] == '1' )//memory + { + FLOG(_L("CFMSServer::FindVariation():: memory monitor supported")); + iMemoryMon = ETrue; + } + if( var[1] == '1' ) //startup + { + FLOG(_L("CFMSServer::FindVariation()::Phone restart monitor supported")); + iPhoneRestartMon = ETrue; + } + if( var[2] == '1' )//user or charger + { + FLOG(_L("CFMSServer::FindVariation()::charger monitor supported")); + iChargerMon = ETrue; + } + if( var[3] == '1' )//newtwork + { + FLOG(_L("CFMSServer::FindVariation()::network monitor supported")); + iNetworkMon = ETrue; + } + } + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::ChargerTobeMonitered() +// ---------------------------------------------------------------------------------------- +TBool CFMSServer::ChargerTobeMonitered() + { + FLOG(_L("CFMSServer::ChargerTobeMonitered()::charger monitor check")); + return iChargerMon; + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::NetworkTobeMonitered() +// ---------------------------------------------------------------------------------------- +TBool CFMSServer::NetworkTobeMonitered() + { + FLOG(_L("CFMSServer::NetworkTobeMonitered()::network monitor check")); + return iNetworkMon; + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::MoniterAfterPhoneRestart() +// ---------------------------------------------------------------------------------------- +TBool CFMSServer::MoniterAfterPhoneRestart() + { + FLOG(_L("CFMSServer::MoniterAfterPhoneRestart()::phonerestart monitor check")); + return iPhoneRestartMon; + } + +// ---------------------------------------------------------------------------------------- +// CFMSServer::MemoryTobeMonitered() +// ---------------------------------------------------------------------------------------- +TBool CFMSServer::MemoryTobeMonitered() + { + FLOG(_L("CFMSServer::MemoryTobeMonitered()::memory monitor check")); + return iMemoryMon; + } + +// ----------------------------------------------------------------------------- +// CFMSServer::StartMonitoring() +// ----------------------------------------------------------------------------- +void CFMSServer::StartMonitoringL(TFmsIpcCommands aType) + { + // A new session is being created + FLOG(_L("CFMSServer::StartMonitoringL>>")); + if( iSessionCount == 0 ) + { + ++iSessionCount; + iFMSInterruptAob.StartL(aType); + } + FLOG(_L("CFMSServer::StartMonitoringL<<")); + } + +// ----------------------------------------------------------------------------- +// CFMSServer::DeleteFile() +// ----------------------------------------------------------------------------- +void CFMSServer::DeleteFile(TBool aValue) + { + iDeleteFile = aValue; + } +// ---------------------------------------------------------------------------------------- +// CFMSServer::~CFMSServer() +// ---------------------------------------------------------------------------------------- +CFMSServer::~CFMSServer() +{ +FLOG(_L("CFMSServer::~CFMSServer())")); +//iFMSInterruptAob.Cancel(); +if(iDeleteFile) + { + TInt err = iFs.Delete(KFotaInterruptFileName); + FLOG(_L("CFMSServer::~CFMSServer() File Deleted with error as %d"),err); + } +if(iLogAsyncRequest) + { + FLOG(_L("CFMSServer::~CFMSServer():-iLogAsyncRequest cancel)")); + iLogAsyncRequest->Cancel(); + delete iLogAsyncRequest; + iLogAsyncRequest = NULL; + } +iFs.Close(); +} + +// ---------------------------------------------------------------------------------------- +// CFMSServer::NewSessionL() +// ---------------------------------------------------------------------------------------- +CSession2* CFMSServer::NewSessionL(const TVersion&,const RMessage2&) const +{ +return new (ELeave) CFMSSession(); +} + +// ---------------------------------------------------------------------------------------- +// CFMSServer::RequestPending() +// Any request pending +// ---------------------------------------------------------------------------------------- +TBool CFMSServer::RequestPending() + { + if( iSessionCount > 0 ) + { + return ETrue; + } + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CFMSServer::AsyncSessionRequestL() +// Asynchronous request logging +// ---------------------------------------------------------------------------- +void CFMSServer::AsyncSessionRequestL() + { + if(iLogAsyncRequest) + { + FLOG(_L("CFMSServer::AsyncSessionRequestL():-iLogAsyncRequest cancel)")); + iLogAsyncRequest->Cancel(); + delete iLogAsyncRequest; + iLogAsyncRequest = NULL; + } + iLogAsyncRequest = CPeriodic::NewL (EPriorityNormal) ; + FLOG(_L("CFMSServer::AsyncSessionRequestL():-iLogAsyncRequest created)")); + iLogAsyncRequest->Start( + TTimeIntervalMicroSeconds32(KRequestTriggerWaitTime*4) + , TTimeIntervalMicroSeconds32(KRequestTriggerWaitTime*4) + , TCallBack(LogNwRequestL,this) ) ; + FLOG(_L("CFMSServer::AsyncSessionRequestL():-Request logged)")); + } + +// ----------------------------------------------------------------------------- +// CFMSServer::AsyncSessionRequestL() +// Asynchronous request logging +// ----------------------------------------------------------------------------- +void CFMSServer::StopAsyncRequest() + { + FLOG(_L("CFMSServer::StopAsyncRequest():-Begin)")); + if(iLogAsyncRequest) + { + FLOG(_L("CFMSServer::StopAsyncRequest():-cancelling the request)")); + iLogAsyncRequest->Cancel(); + delete iLogAsyncRequest; + iLogAsyncRequest = NULL; + } + FLOG(_L("CFMSServer::StopAsyncRequest():-End)")); + } + +// ----------------------------------------------------------------------------- +// CFMSServer::StartBatteryMonitoringL() +// Monitors for the battery +// ----------------------------------------------------------------------------- +void CFMSServer::StartBatteryMonitoringL(TFmsIpcCommands aType, TUint aLevel) + { + // A new session is being created + FLOG(_L("CFMSServer::StartMonitoringL, level = %d>>"), aLevel); + if( iSessionCount == 0 ) + { + ++iSessionCount; + iFMSInterruptAob.StartBatteryMonitoringL(aType, aLevel); + } + FLOG(_L("CFMSServer::StartMonitoringL<<")); + } +// ----------------------------------------------------------------------------- +// CFMSServer::StartUpdateInterruptMonitoringL() +// Monitors for the update interrupt type +// ----------------------------------------------------------------------------- +void CFMSServer::StartUpdateInterruptMonitoringL(TFmsIpcCommands aType) + { + // A new session is being created + FLOG(_L("CFMSServer::StartUpdateInterruptMonitoringL>>")); + if(EUpdMonitorPhoneCallEnd == aType) + { + iFMSInterruptAob.StartCallEndMonitoringL(aType); + } + else + { + FLOG(_L("reason unknown")); + } + FLOG(_L("CFMSServer::StartUpdateInterruptMonitoringL<<")); + } + +// ----------------------------------------------------------------------------- +// CFMSServer::CheckPhoneCallActiveL() +// checks any phone call is there or not at this moment +// ----------------------------------------------------------------------------- +void CFMSServer::CheckPhoneCallActiveL(TInt& aStatus) + { + FLOG(_L("CFMSServer::CheckPhoneCallActiveL>>")); + TInt callstatus(KErrNotFound); + RProperty::Get(KPSUidCtsyCallInformation, KCTsyCallState, callstatus); + //check ctsydomainpskeys.h for different combinations, below OR condition holds good + if(EPSCTsyCallStateUninitialized == callstatus || + EPSCTsyCallStateNone == callstatus ) // call not active + { + aStatus = EFalse; + } + else // call active + { + aStatus = ETrue; + } + FLOG(_L("CFMSServer::CheckPhoneCallActiveL status is %d<<"),aStatus); + } + +// ----------------------------------------------------------------------------- +// CFMSServer::MonitorPhoneCallEndL() +// Monitors for active phone call end +// ----------------------------------------------------------------------------- +TBool CFMSServer::MonitorPhoneCallEndL() + { + TInt CallState = KErrNotFound; + + CheckPhoneCallActiveL(CallState); + if(CallState) + { + //go for call end montioring + LogAsyncCallMonitorL(); + return EFalse; + } + else //trigger fota to show install query + { + return ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CFMSServer::LogAsyncCallMonitorL() +// Async request to monitor active phone call end +// ----------------------------------------------------------------------------- +void CFMSServer::LogAsyncCallMonitorL() + { + if(iLogAsyncRequest) + { + FLOG(_L("CFMSServer::LogAsyncCallMonitorL():- cancel)")); + iLogAsyncRequest->Cancel(); + delete iLogAsyncRequest; + iLogAsyncRequest = NULL; + } + iLogAsyncRequest = CPeriodic::NewL (EPriorityNormal) ; + FLOG(_L("CFMSServer::LogAsyncCallMonitorL(): created)")); + iLogAsyncRequest->Start( + TTimeIntervalMicroSeconds32(KRequestTriggerWaitTime*1) + , TTimeIntervalMicroSeconds32(KRequestTriggerWaitTime*4) + , TCallBack(LogCallEndMonitorRequestL,this) ) ; + FLOG(_L("CFMSServer::LogAsyncCallMonitorL():-Request logged)")); + } + + +void CFMSServer::CreateScheduledReminderL() + { + FLOG(_L("CFMSServer::CreateScheduledReminderL ()")); + _LIT(KFotaScheduleExe, "Z:\\sys\\bin\\fotaschedulehandler.exe"); + + RScheduler scheduler; + TTsTime startTime; + TTime time; + time.HomeTime(); + time = time + (TTimeIntervalHours(1)); + startTime.SetLocalTime(time); + + User::LeaveIfError(scheduler.Connect()); + CleanupClosePushL(scheduler); + //Creating a persistent daily schedule + + TSchedulerItemRef persistentScheduleItem; + CArrayFixFlat* entries = new CArrayFixFlat (1); + CleanupStack::PushL(entries); + persistentScheduleItem.iName = TUid::Uid(KFMSServerUid).Name(); + + //TScheduleEntryInfo2 scentry1(startTime, EDaily, 1, 1); + TScheduleEntryInfo2 scentry1; + scentry1.SetStartTime(startTime); + scentry1.SetInterval(1); + scentry1.SetIntervalType(TIntervalType(EHourly)); + scentry1.SetValidityPeriod((TTimeIntervalMinutes) 1440); //1440 min = 24 hrs or 1 day + + entries->AppendL(scentry1); + + scheduler.Register(TFileName( KFotaScheduleExe ), 0 ); + TInt ret = scheduler.CreatePersistentSchedule(persistentScheduleItem, *entries); + + FLOG(_L("created schedule %d %d:%d"), persistentScheduleItem.iHandle, + time.DateTime().Hour(), time.DateTime().Minute()); + + if (ret == KErrNone) + { + TTaskInfo taskInfo; + taskInfo.iName = TUid::Uid(KFMSServerUid).Name(); + taskInfo.iRepeat = 1; //Repeat once + taskInfo.iPriority = 1; + + TFotaScheduledUpdate fotareminder(-1, -1); + TPckg fotareminderpkg(fotareminder); + + HBufC* data = HBufC::NewLC(fotareminderpkg.Length()); + data->Des().Copy(fotareminderpkg); + + TInt err = scheduler.ScheduleTask(taskInfo, *data, persistentScheduleItem.iHandle); + + FLOG(_L("Schedule creation error %d"), err); + + CleanupStack::PopAndDestroy(data); + } + CleanupStack::PopAndDestroy(entries); + CleanupStack::PopAndDestroy(&scheduler); // xx + } + + +void CFMSServer::DeleteScheduledRemindersL() + { + FLOG(_L("CFMSServer::DeleteScheduledRemindersL >>")); + + TScheduleEntryInfo2 ret; + TInt err; + RScheduler sc; + TTime t; + TTsTime time; + TSchedulerItemRef scitem; + CArrayFixFlat* aSchRefArray = new CArrayFixFlat (5); + TScheduleFilter aFilter(EAllSchedules); + User::LeaveIfError( sc.Connect() ); + CleanupClosePushL( sc ); + CleanupStack::PushL(aSchRefArray); + + User::LeaveIfError( sc.GetScheduleRefsL( *aSchRefArray,aFilter) ); + FLOG(_L("Schedule items: ")); + for ( TInt i=0; iCount(); ++i ) + { + TSchedulerItemRef it = (*aSchRefArray)[i]; + if ( it.iName == TUid::Uid(KFMSServerUid).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 ( sc_task.iName==TUid::Uid(KFMSServerUid).Name() ) + { + FLOG(_L(" schedule DeleteTask %d"),sc_task.iTaskId); + User::LeaveIfError( sc.DeleteTask(sc_task.iTaskId) ); + } + } + } + + FLOG(_L(" DeleteSchedule %d"),it.iHandle); + err = sc.DeleteSchedule(it.iHandle ); + FLOG(_L("Delete status of tasks = %d"), err); + + CleanupStack::PopAndDestroy( sc_tasks ); + CleanupStack::PopAndDestroy( sc_entries ); + } + } + CleanupStack::PopAndDestroy( aSchRefArray ); + CleanupStack::PopAndDestroy(&sc); + + FLOG(_L("CFMSServer::DeleteScheduledRemindersL <<")); + } +//End of file