installationservices/swinstallationfw/source/sifnotification.cpp
branchRCL_3
changeset 26 8b7f4e561641
parent 25 7333d7932ef7
child 27 e8965914fac7
--- a/installationservices/swinstallationfw/source/sifnotification.cpp	Tue Aug 31 15:21:33 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,826 +0,0 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "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: 
-* This file implements the SifNotifier library
-*
-*/
-
-#include <usif/sif/sifnotification.h>
-#include <s32mem.h> 
-#include <scs/cleanuputils.h>
-#include <scs/streamingarray.h>
-#include "sifnotification_internal.h"
-#include <usif/sif/sif.h>
-#include "e32property.h" 
-#include "scrclient.inl"
-#include "usiflog.h"
-
-
-using namespace Usif;
-
-/**
- * A global method which is used by both the publisher and subscriber code to retrieve data.
- * 
- */
-void GetDataL(TUint aKey, TInt& aBufferSize, RBuf8& aData)
-    {
-    aData.CreateL(aBufferSize);
-    aData.CleanupClosePushL();
-    TInt err = RProperty::Get(KUidSystemCategory, aKey, aData);
-    
-    // If the buffer size is too small.
-    while (err == KErrOverflow)
-        {
-        aBufferSize*=2;
-        aData.ReAllocL(aBufferSize);
-        err = RProperty::Get(KUidSystemCategory, aKey, aData);
-        }
-        
-    User::LeaveIfError(err);
-    CleanupStack::Pop();
-    }
-
-////////////////////////////
-// CPublishSifOperationInfo
-////////////////////////////
-
-CPublishSifOperationInfo::CPublishSifOperationInfo():
-    iBufferSize(KBufferSize)
-    {
-    // empty
-    }
-
-CPublishSifOperationInfo::~CPublishSifOperationInfo()
-    {
-    delete iDeleteTimer;
-    if (iStartEndKey != 0)
-        {
-        RProperty::Delete(KUidSystemCategory, iStartEndKey);
-        RProperty::Delete(KUidSystemCategory, (iStartEndKey+1));
-        }
-    }
-
-EXPORT_C CPublishSifOperationInfo* CPublishSifOperationInfo::NewL()
-    {
-    CPublishSifOperationInfo *self = CPublishSifOperationInfo::NewLC();
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-EXPORT_C CPublishSifOperationInfo* CPublishSifOperationInfo::NewLC()
-    {
-    CPublishSifOperationInfo *self = new(ELeave) CPublishSifOperationInfo();
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    return self;
-    }
-
-void CPublishSifOperationInfo::ConstructL()
-    {
-    
-    }
-
-TUint CPublishSifOperationInfo::AvailableKeyL()
-    {
-    TBuf8<KMaxNumberOfOperations*sizeof(TInt)> buf;
-    for(TInt i=0; i< KMaxNumberOfOperations-1; ++i)
-        {
-        if(KErrNotFound == RProperty::Get(KUidSystemCategory, KSifPropertyTable[i], buf))
-            {
-            return KSifPropertyTable[i];
-            }
-        }
-
-	User::Leave(KErrInUse);
-    return KErrNone; // Keep compiler happy.
-    }
-
-TUint CPublishSifOperationInfo::KeyForGlobalComponentIdL(const TDesC& aGlobalComponentId)
-    {
-    TBuf8<KMaxNumberOfOperations*sizeof(TInt)> buf;
-    //Get all ongoing operations
-    User::LeaveIfError(RProperty::Get(KUidSystemCategory, KSifOperationKey, buf));
-   
-    RDesReadStream readStream(buf);
-    CleanupClosePushL(readStream);
-    CSifOperationKey* opKey = CSifOperationKey::NewL(readStream);
-    CleanupStack::PopAndDestroy(&readStream);
-    CleanupStack::PushL(opKey);
-    
-    RArray<TUint> startEndKeyArr = opKey->StartEndKeys();
-	// Get the data for all the ongoing operations and check for global component id
-    for (TInt i=0; i<startEndKeyArr.Count(); ++i)
-        {
-        RBuf8 startDatabuf;
-        startDatabuf.CleanupClosePushL();
-
-		GetDataL(startEndKeyArr[i], iBufferSize, startDatabuf);
-        RDesReadStream readStream(startDatabuf);
-        CleanupClosePushL(readStream);
-        
-        // Read the first 4 bytes
-        TSifOperation opType = static_cast<TSifOperation>(readStream.ReadInt32L());         
-        if(opType != ESifOperationStart)
-            {
-            CleanupStack::PopAndDestroy(2, &startDatabuf);
-            continue;
-            }
-                    
-        // Release the stream and reopen it.
-        readStream.Release();
-        readStream.Open(startDatabuf);
-                    
-        CSifOperationStartData* startObj = CSifOperationStartData::NewL(readStream);
-        CleanupStack::PushL(startObj);
-		// Check if the global component id is the same as what we are looking for
-        if( KErrNone == aGlobalComponentId.Compare(startObj->GlobalComponentId()))
-            {
-            TInt key = startEndKeyArr[i];
-            CleanupStack::PopAndDestroy(4, opKey);
-            return key;
-            }
-        CleanupStack::PopAndDestroy(3, &startDatabuf);
-        }
-    CleanupStack::PopAndDestroy(opKey);
-    
-    // Could not find corresponding key
-    User::Leave(KErrNotFound);
-    return KErrNone; // Keep compiler happy.
-    }
-    
-void CPublishSifOperationInfo::SetKeyToDelete(TUint aStartEndKey)
-    {
-    iStartEndKey = aStartEndKey;
-    }
-
-EXPORT_C void CPublishSifOperationInfo::PublishStartL(CSifOperationStartData& aSifOperationStartData)
-    {
-    // Get Property key from free pool which could be used for this operation.
-    TUint key = AvailableKeyL();    
-    
-    // Define key from free pool. Start data could be bigger than 512 bytes, hence using ELargeByteArray.
-    User::LeaveIfError(RProperty::Define(KUidSystemCategory, key, RProperty::ELargeByteArray,KSecurityPolicyWDD,KSecurityPolicyNone,KStartBufLength));
-        
-    // Store this key and delete it in case of any leaves
-    SetKeyToDelete(key);
-    
-    // Publish start info of operation in defined key.
-    RBuf8 bufStartData;
-    bufStartData.CleanupClosePushL();
-    ExternalizeRefObjectL(aSifOperationStartData, bufStartData);
-
-    User::LeaveIfError(RProperty::Set(KUidSystemCategory, key, bufStartData));
-    
-    CleanupStack::PopAndDestroy(&bufStartData);
-    
-    // Define key for progress data for this operation.
-    User::LeaveIfError(RProperty::Define(KUidSystemCategory, (key+1), RProperty::EByteArray,KSecurityPolicyWDD,KSecurityPolicyNone, KProgressBufLength));
-    
-    // Publish(append this key to existing info) the newly defined key in the global SIF key.
-    TBuf8<KMaxNumberOfOperations*sizeof(TUint)> buf;
-
-    User::LeaveIfError(RProperty::Get(KUidSystemCategory, KSifOperationKey, buf));
-
-    RDesReadStream stream(buf);
-    CleanupClosePushL(stream);      
-    
-    // Retrieve current keys.
-    CSifOperationKey* currentKeys = CSifOperationKey::NewL(stream);
-    CleanupStack::PopAndDestroy(&stream);
-    
-    CleanupStack::PushL(currentKeys);
-    
-    // Append the new key.
-    currentKeys->AddKeyL(key);
-    
-    RBuf8 bufOperationKeys;
-    bufOperationKeys.CleanupClosePushL();
-    ExternalizeRefObjectL(*currentKeys, bufOperationKeys);
-    
-    // Publish the new set of keys.
-    User::LeaveIfError(RProperty::Set(KUidSystemCategory, KSifOperationKey, bufOperationKeys));
-    
-    // Everything finished fine, we need not delete the keys defined above.
-    SetKeyToDelete(0);
-    
-    CleanupStack::PopAndDestroy(2, currentKeys);
-    }
-
-EXPORT_C void CPublishSifOperationInfo::PublishProgressL(CSifOperationProgressData& aSifOperationProgressData)
-    {
-    TUint startEndKey = 0;
-    
-    HBufC16 *compGlobalId = aSifOperationProgressData.GlobalComponentId().AllocLC();
-	//Get the key defined for this operation
-    startEndKey = KeyForGlobalComponentIdL(compGlobalId->Des());
-    CleanupStack::PopAndDestroy(compGlobalId);
-
-    //Publish progress info of operation in defined key
-    RBuf8 bufProgressData;
-    bufProgressData.CleanupClosePushL();
-    ExternalizeRefObjectL(aSifOperationProgressData, bufProgressData);
-    User::LeaveIfError(RProperty::Set(KUidSystemCategory, (startEndKey+1), bufProgressData));
-    CleanupStack::PopAndDestroy(&bufProgressData);
-    }
-
-EXPORT_C void CPublishSifOperationInfo::PublishCompletionL(CSifOperationEndData& aSifOperationEndData)
-    {
-    TUint endKey = 0;
-    HBufC *compGlobalId = aSifOperationEndData.GlobalComponentId().AllocLC();
-	//Get the key defined for this operation
-    endKey = KeyForGlobalComponentIdL(compGlobalId->Des());
-    CleanupStack::PopAndDestroy(compGlobalId);
-    
-    // Store this key and delete it in case of any leaves
-    SetKeyToDelete(endKey);
-    
-    //Publish end info of operation in defined key
-    RBuf8 bufEndData;
-    bufEndData.CleanupClosePushL();
-    ExternalizeRefObjectL(aSifOperationEndData, bufEndData);
-
-    User::LeaveIfError(RProperty::Set(KUidSystemCategory, endKey, bufEndData));
-    CleanupStack::PopAndDestroy(&bufEndData);
-    
-    // Wait for KDeleteKeyDelay seconds before deleting this key.
-    if(iDeleteTimer)
-        iDeleteTimer->Cancel();
-    delete iDeleteTimer;
-    iDeleteTimer = CDeleteKeyTimer::NewL(endKey);
-    
-    // Everything finished fine, we need not delete the keys defined for this operation
-    SetKeyToDelete(0);
-    
-    iDeleteTimer->Start();
-
-    }
-
-
-
-//////////////////////////
-// CSifOperationsNotifier
-//////////////////////////
-
-
-EXPORT_C CSifOperationsNotifier* CSifOperationsNotifier::NewL(MSifOperationsHandler& aHandler)
-    {
-    CSifOperationsNotifier* self = CSifOperationsNotifier::NewLC(aHandler);
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-
-EXPORT_C CSifOperationsNotifier* CSifOperationsNotifier::NewLC(MSifOperationsHandler& aHandler)
-    {
-    CSifOperationsNotifier* self = new (ELeave) CSifOperationsNotifier(aHandler);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    return self;
-    }
-
-CSifOperationsNotifier::CSifOperationsNotifier(MSifOperationsHandler& aHandler):
-    CActive(EPriorityNormal),
-    iHandler(aHandler),
-    iBufferSize(KBufferSize) 
-    {
-    //Empty
-    }
-
-
-void CSifOperationsNotifier::ConstructL()
-    {
-    CActiveScheduler::Add(this);
-    iProperty.Attach(KUidSystemCategory,KSifOperationKey,EOwnerThread);
-    
-    // On first start, the notifier looks for any active operations and 
-    // notifies the client.
-    iNotifierState = EFirstStart;
-    
-    TRequestStatus* status = &iStatus;
-    User::RequestComplete(status, KErrNone);
-    SetActive();
-    }
-
-
-void CSifOperationsNotifier::RunL()
-    {  
-    User::LeaveIfError(iStatus.Int());
-    
-    // Resubscribe for any changes to the global key.
-    WaitForChangeL();
-    
-    if( iNotifierState == EFirstStart)
-        {
-        // Notify the client of any active operation.
-        ActiveOperationsNotificationL();
-        iNotifierState = EWaitForChange;    
-        return;
-        }
- 
-   // Global key change notification received.      
-    RArray<TUint> newKeyArray;
-    GetKeysL(newKeyArray);
-    CleanupClosePushL(newKeyArray);
-    
-    if(iKeyArray.Count() < newKeyArray.Count())
-        {
-        // New Keys added.
-        RBuf8 externalizedBuffer;
-        externalizedBuffer.CleanupClosePushL();
-        
-        // Retrieve the new keys and send the start operation notification to each.
-        for(TInt i = iKeyArray.Count(); i< newKeyArray.Count(); ++i)
-            {
-            externalizedBuffer.Close();
-            GetDataL(newKeyArray[i], iBufferSize, externalizedBuffer);
-            
-            RDesReadStream stream(externalizedBuffer);
-            CleanupClosePushL(stream);
-            // Read the first 4 bytes
-            TSifOperation opType = static_cast<TSifOperation>(stream.ReadInt32L());         
-            if(opType != ESifOperationStart)
-                {
-                CleanupStack::PopAndDestroy(&stream);
-                continue;
-                }
-            
-            // Release the stream and reopen it.
-            stream.Release();
-            stream.Open(externalizedBuffer);
-           
-            CSifOperationStartData* startData = CSifOperationStartData::NewL(stream);
-            CleanupStack::PushL(startData);
-            
-            //Update iKeyArray with the new key.
-            iKeyArray.AppendL(newKeyArray[i]);
-            
-            iHandler.StartOperationHandler(newKeyArray[i], *startData);
-            CleanupStack::PopAndDestroy(2, &stream);            
-            
-            }
-        CleanupStack::PopAndDestroy(&externalizedBuffer);
-        }
-    else if (iKeyArray.Count() > newKeyArray.Count())
-        {
-        // Keys removed.
-        for(TInt i = 0; i<iKeyArray.Count(); ++i)
-            {
-            // Key present in iKeyArray (the previous array of keys) is no longer
-            // present in the newKeyArray.
-            if(newKeyArray.Find(iKeyArray[i]) == KErrNotFound)
-                {
-                CancelSubscribeL(iKeyArray[i]);
-                iKeyArray.Remove(i);
-                }
-            }
-        }   
-    CleanupStack::PopAndDestroy(&newKeyArray);
-    }
-
-void CSifOperationsNotifier::ActiveOperationsNotificationL()
-    {
-    // Notify the caller of any operation currently in progress.
-    GetKeysL(iKeyArray);
-    
-    RBuf8 externalizedBuffer;
-    
-    for(TInt i=0; i<iKeyArray.Count(); ++i)
-        {
-        externalizedBuffer.Close();
-        GetDataL(iKeyArray[i], iBufferSize, externalizedBuffer);
-        CleanupClosePushL(externalizedBuffer);
-        
-        RDesReadStream stream(externalizedBuffer);
-        CleanupClosePushL(stream);
-        
-        //Read the first 4 bytes
-        TSifOperation opType = static_cast<TSifOperation>(stream.ReadUint32L());
-        if(opType != ESifOperationStart)
-            {
-            // Ignore this key and continue.
-            CleanupStack::PopAndDestroy(2, &externalizedBuffer);
-            continue;
-            }
-        // Release the stream and reopen it.
-        stream.Release();
-        stream.Open(externalizedBuffer);
-        
-        CSifOperationStartData* startData = CSifOperationStartData::NewL(stream);
-        CleanupStack::PushL(startData);
-        iHandler.StartOperationHandler(iKeyArray[i], *startData); 
-        CleanupStack::PopAndDestroy(startData);  
-           
-        CleanupStack::PopAndDestroy(2, &externalizedBuffer);  
-        }
-    
-    }
-void CSifOperationsNotifier::WaitForChangeL()
-    {   
-    iProperty.Subscribe(iStatus);
-    SetActive();
-    }
-
-
-void CSifOperationsNotifier::GetKeysL(RArray<TUint>& aKeys)
-    {
-    TBuf8<KMaxNumberOfOperations * sizeof(TInt)> keysBuffer;
-    User::LeaveIfError(iProperty.Get(keysBuffer));
-    
-    RDesReadStream stream(keysBuffer);
-    CleanupClosePushL(stream);
-    
-    // Construct the CSifOperationKey object from the buffer.
-    CSifOperationKey* opKey = CSifOperationKey::NewL(stream);
-    CleanupStack::PushL(opKey);
-    
-    for(TInt i=0; i<opKey->StartEndKeys().Count(); ++i)
-        {
-        aKeys.AppendL(opKey->StartEndKeys()[i]);
-        }
-    
-    CleanupStack::PopAndDestroy(2, &stream);
-    }
-
-
-EXPORT_C void CSifOperationsNotifier::SubscribeL(TUint aKey, TBool aSubscribeForProgressNotifications)
-    {
-    User::LeaveIfError(iKeyArray.Find(aKey));
-    
-    // Start End notifier.
-    CSifNotifierBase* startEndNotifier = CSifNotifierBase::NewLC(iHandler, aKey, CSifNotifierBase::EStartEndNotifier);
-    iNotifierArray.AppendL(startEndNotifier);
-    CleanupStack::Pop(startEndNotifier);
-    
-    if(aSubscribeForProgressNotifications)
-        {
-        // Progress Notifier.
-        CSifNotifierBase* progressNotifier = CSifNotifierBase::NewLC(iHandler, aKey+1, CSifNotifierBase::EProgressNotifier);
-        iNotifierArray.AppendL(progressNotifier);
-        CleanupStack::Pop(progressNotifier);
-        }
-    }
-
-
-EXPORT_C void CSifOperationsNotifier::CancelSubscribeL(TUint aKey)
-    {
-    TInt index = iKeyArray.Find(aKey);
-    
-    if(index == KErrNotFound)
-        {
-        // No need to leave.
-        return;
-        }
-    
-    for(TInt i=0; i< iNotifierArray.Count(); ++i)
-        {
-
-        if(iNotifierArray[i]->Key() == aKey)
-            {
-            delete iNotifierArray[i];
-            iNotifierArray.Remove(i);
-            
-            // Delete progress notification object also, if present.
-            // i now points to the next element
-            if( i <= iNotifierArray.Count()-1 && iNotifierArray[i]->Key() == aKey+1)
-                {
-                delete iNotifierArray[i];
-                iNotifierArray.Remove(i);
-                }
-            }
-        
-        }
-
-    }
-
-
-EXPORT_C void CSifOperationsNotifier::CancelSubscribeL()
-    {
-    //Destroy all the notifiers.
-    Cancel();
-    }
-
-
-void CSifOperationsNotifier::DoCancel()
-    {
-    iProperty.Cancel();
-    iNotifierArray.ResetAndDestroy();
-    }
-
-TInt CSifOperationsNotifier::RunError(TInt aError)
-    {
-    DEBUG_PRINTF2(_L8("CSifOperationsNotifier::RunError : Error code %d"), aError);
-    // If RunL() leaves due to ActiveOperationsNotificationL(), change the state.
-    if(iNotifierState == EFirstStart)
-        {
-        iNotifierState = EWaitForChange;
-        }
-    (void)aError;
-    return KErrNone;
-    }
-
-
-CSifOperationsNotifier::~CSifOperationsNotifier()
-    {
-    Cancel();
-    iProperty.Close();
-    iKeyArray.Close();
-    }
-
-
-
-//////////////////////////
-// CSifNotifierBase
-//////////////////////////
-
-
-EXPORT_C CSifNotifierBase* CSifNotifierBase::NewL(MSifOperationsHandler& aHandler, TUint aKey, TNotifierType aType)
-    {
-    CSifNotifierBase* self = CSifNotifierBase::NewLC(aHandler, aKey, aType);
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-
-EXPORT_C CSifNotifierBase* CSifNotifierBase::NewLC(MSifOperationsHandler& aHandler, TUint aKey, TNotifierType aType)
-    {
-    CSifNotifierBase* self = new (ELeave) CSifNotifierBase(aHandler, aKey, aType);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    return self;
-    }
-
-CSifNotifierBase::CSifNotifierBase(MSifOperationsHandler& aHandler, TUint aKey, TNotifierType aType):
-    CActive(EPriorityNormal),
-    iHandler(aHandler),
-    iKey(aKey),
-    iBufferSize(KBufferSize),
-    iType(aType)
-    {
-    //Empty
-    }
-
-
-void CSifNotifierBase::ConstructL()
-    {
-    CActiveScheduler::Add(this);
-    iProperty.Attach(KUidSystemCategory,iKey,EOwnerThread);
-    // Subscribe to the key and wait for a notification.
-    WaitForChangeL();
-    }
-
-
-void CSifNotifierBase::RunL()
-    {
-    User::LeaveIfError(iStatus.Int());
-    
-    //Resubscribe for any changes.
-    WaitForChangeL();
-    
-    RBuf8 externalizedBuffer;
-    GetDataL(iKey, iBufferSize, externalizedBuffer);  
-    externalizedBuffer.CleanupClosePushL();
-    
-    RDesReadStream stream(externalizedBuffer);
-    CleanupClosePushL(stream);
-    
-    switch (iType)
-        {
-        case EStartEndNotifier:
-            {
-            //Read the first 4 bytes
-            TSifOperation opType = static_cast<TSifOperation>(stream.ReadInt32L());
-            stream.Release();
-            stream.Open(externalizedBuffer);
-            switch(opType)
-                {
-                case ESifOperationEnd:
-                    {
-                    CSifOperationEndData* endData = CSifOperationEndData::NewL(stream);
-                    CleanupStack::PushL(endData);
-                    iHandler.EndOperationHandler(*endData);
-                    CleanupStack::PopAndDestroy(endData);
-                    break;
-                    }
-                    
-                default:
-                    // Cannot receive a start notification here !
-                    User::Leave(KErrNotSupported);
-                    break; 
-                }            
-            }
-            
-         break;
-            
-        case EProgressNotifier:
-            {
-            CSifOperationProgressData* progressData = CSifOperationProgressData::NewL(stream);
-            CleanupStack::PushL(progressData);
-            iHandler.ProgressOperationHandler(*progressData);
-            CleanupStack::PopAndDestroy(progressData);
-            }
-        }
-
-    
-    CleanupStack::PopAndDestroy(2, &externalizedBuffer);
-    }
-
-
-
-void CSifNotifierBase::WaitForChangeL()
-    {
-    iProperty.Subscribe(iStatus);
-    SetActive();
-    }
-
-
-TInt CSifNotifierBase::RunError(TInt aError)
-    {
-    DEBUG_PRINTF2(_L8("CSifNotifierBase::RunError : Error code %d"), aError);
-    (void)aError;
-    return KErrNone;
-    }
-
-TUint CSifNotifierBase::Key()
-    {
-    return iKey;
-    }
-
-void CSifNotifierBase::DoCancel()
-    {
-    iProperty.Cancel();
-    }
-
-
-CSifNotifierBase::~CSifNotifierBase()
-    {
-    Cancel();
-    }
-
-
-
-/////////////////////
-// CSifOperationKey
-/////////////////////
-
-CSifOperationKey::CSifOperationKey()
-    {
-    // empty
-    }
-
-CSifOperationKey::~CSifOperationKey()
-    {
-    iStartEndKeyArray.Close();
-    }
-
-EXPORT_C CSifOperationKey* CSifOperationKey::NewL()
-    {
-    CSifOperationKey *self = CSifOperationKey::NewLC();
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-CSifOperationKey* CSifOperationKey::NewLC()
-    {
-    CSifOperationKey *self = new(ELeave) CSifOperationKey();
-    CleanupStack::PushL(self);
-    return self;
-    }
-
-CSifOperationKey* CSifOperationKey::NewL(RReadStream& aStream)
-    {
-    CSifOperationKey *self = new(ELeave) CSifOperationKey();
-    CleanupStack::PushL(self);
-    self->InternalizeL(aStream);
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-EXPORT_C void CSifOperationKey::ExternalizeL(RWriteStream& aStream) const
-    {
-    TInt count = iStartEndKeyArray.Count();
-    aStream.WriteUint32L(count);
-    for(TInt i=0 ; i< count; ++i)
-        {
-        aStream.WriteUint32L(iStartEndKeyArray[i]);
-        }
-    }
-    
-void CSifOperationKey::InternalizeL(RReadStream& aStream)
-    {
-    TInt count = aStream.ReadUint32L();
-    for(TInt i=0 ; i< count; ++i)
-        {
-        iStartEndKeyArray.AppendL(aStream.ReadUint32L());
-        }
-    }
-
-const RArray<TUint>& CSifOperationKey::StartEndKeys() const
-    {
-    return iStartEndKeyArray;
-    }
-
-void CSifOperationKey::AddKeyL(TUint aKey)
-    {
-    iStartEndKeyArray.AppendL(aKey);
-    }
-
-void CSifOperationKey::DeleteKey(TUint aPos)
-    {
-    iStartEndKeyArray.Remove(aPos);
-    }
-
-
-/////////////////////
-// CDeleteKeyTimer
-/////////////////////
-
-
-CDeleteKeyTimer::CDeleteKeyTimer() : CTimer(EPriorityLow)
-    {
-    CActiveScheduler::Add(this);
-    }
-
-CDeleteKeyTimer::~CDeleteKeyTimer()
-    {
-    Cancel();
-    }
-
-CDeleteKeyTimer* CDeleteKeyTimer::NewL(const TUint aKey)
-    {
-    CDeleteKeyTimer* self = new(ELeave) CDeleteKeyTimer();
-    CleanupStack::PushL(self);
-    self->ConstructL(aKey);
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-void CDeleteKeyTimer::ConstructL(const TUint aKey)
-    {
-    CTimer::ConstructL();
-    iKey = aKey;
-    }
-
-void CDeleteKeyTimer::Start()
-    {
-    After(KDeleteKeyDelay);
-    }
-
-void CDeleteKeyTimer::RunL()
-    {
-    // Publish(remove this key from existing info) the remaining keys in the global SIF key.
-    TBuf8<KMaxNumberOfOperations * sizeof(TInt)> buf;
-	RProperty oprnProperty;
-	CleanupClosePushL(oprnProperty);
-	
-	oprnProperty.Attach(KUidSystemCategory, KSifOperationKey);
-    TInt err = oprnProperty.Get(buf);
-    User::LeaveIfError(err);
-    
-    RDesReadStream readStream(buf);
-    CleanupClosePushL(readStream);
-    CSifOperationKey* opKey = CSifOperationKey::NewL(readStream);
-    CleanupStack::PushL(opKey);
-
-    //Find the position of the key 
-    TInt pos = opKey->StartEndKeys().Find(iKey);
-    
-    // Delete key, externalize the updated CSifOperationKey object and publish it.
-    opKey->DeleteKey(pos);
-    
-    RBuf8 operationKeyData;
-    operationKeyData.CleanupClosePushL();
-    ExternalizeRefObjectL(*opKey, operationKeyData);
-    
-    User::LeaveIfError(oprnProperty.Set(operationKeyData));
-    
-    // StartEnd Key.
-    RProperty::Delete(KUidSystemCategory, iKey);
-    // Progress Key.
-    RProperty::Delete(KUidSystemCategory, (iKey+1));
-    
-    CleanupStack::PopAndDestroy(4, &oprnProperty);
-    }
-
-
-TInt CDeleteKeyTimer::RunError(TInt aError)
-    {
-    DEBUG_PRINTF2(_L8("CDeleteKeyTimer::RunError : Error code %d"), aError);
-    (void)aError;
-    
-    // StartEnd Key.
-    RProperty::Delete(KUidSystemCategory, iKey);
-    // Progress Key.
-    RProperty::Delete(KUidSystemCategory, (iKey+1));
-    return KErrNone;
-    }