contentstorage/srvsrc/caprogressnotifier.cpp
author hgs
Thu, 24 Jun 2010 16:18:29 +0300
changeset 99 7aaf39b772ac
parent 98 d2f833ab7940
permissions -rw-r--r--
201025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
98
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  ?Description
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
99
hgs
parents: 98
diff changeset
    18
#include <s32mem.h>
98
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <usif/scr/scr.h>
hgs
parents:
diff changeset
    21
#include <usif/scr/screntries.h>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include "caprogressnotifier.h"
hgs
parents:
diff changeset
    24
#include "castorageproxy.h"
hgs
parents:
diff changeset
    25
#include "cainnerquery.h"
hgs
parents:
diff changeset
    26
#include "cainnerentry.h"
hgs
parents:
diff changeset
    27
#include "caarraycleanup.inl"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
using namespace Usif;
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    32
//
hgs
parents:
diff changeset
    33
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    34
//
hgs
parents:
diff changeset
    35
EXPORT_C CCaProgressNotifier* CCaProgressNotifier::NewL(
hgs
parents:
diff changeset
    36
        CCaStorageProxy& aCaStorageProxy )
hgs
parents:
diff changeset
    37
    {
99
hgs
parents: 98
diff changeset
    38
    CCaProgressNotifier* self = new ( ELeave ) CCaProgressNotifier(
hgs
parents: 98
diff changeset
    39
            aCaStorageProxy );
98
hgs
parents:
diff changeset
    40
    CleanupStack::PushL( self );
99
hgs
parents: 98
diff changeset
    41
    self->ConstructL();
98
hgs
parents:
diff changeset
    42
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    43
    return self;
hgs
parents:
diff changeset
    44
    }
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    47
//
hgs
parents:
diff changeset
    48
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    49
//
hgs
parents:
diff changeset
    50
CCaProgressNotifier::~CCaProgressNotifier()
hgs
parents:
diff changeset
    51
    {
hgs
parents:
diff changeset
    52
    delete iNotifier;
99
hgs
parents: 98
diff changeset
    53
    iResultArrayItems.ResetAndDestroy();
98
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    57
//
hgs
parents:
diff changeset
    58
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
//
99
hgs
parents: 98
diff changeset
    60
CCaProgressNotifier::CCaProgressNotifier( CCaStorageProxy& aCaStorageProxy ) :
hgs
parents: 98
diff changeset
    61
    iStorageProxy( aCaStorageProxy )
98
hgs
parents:
diff changeset
    62
    {
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
//
hgs
parents:
diff changeset
    67
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    68
//
99
hgs
parents: 98
diff changeset
    69
void CCaProgressNotifier::ConstructL()
hgs
parents: 98
diff changeset
    70
    {
hgs
parents: 98
diff changeset
    71
    iNotifier = CSifOperationsNotifier::NewL( *this );
hgs
parents: 98
diff changeset
    72
    }
hgs
parents: 98
diff changeset
    73
hgs
parents: 98
diff changeset
    74
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
    75
//
hgs
parents: 98
diff changeset
    76
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
    77
//
hgs
parents: 98
diff changeset
    78
void CCaProgressNotifier::StartOperationHandler( TUint aKey,
hgs
parents: 98
diff changeset
    79
        const CSifOperationStartData& aStartData )
98
hgs
parents:
diff changeset
    80
    {
99
hgs
parents: 98
diff changeset
    81
    TInt err( KErrNone );
hgs
parents: 98
diff changeset
    82
    TComponentId componentId;
hgs
parents: 98
diff changeset
    83
    iResultArrayItems.ResetAndDestroy();
hgs
parents: 98
diff changeset
    84
hgs
parents: 98
diff changeset
    85
    TRAP(err, componentId = ComponentIdL( aStartData.GlobalComponentId(),
hgs
parents: 98
diff changeset
    86
                    aStartData.SoftwareType() ));
hgs
parents: 98
diff changeset
    87
    if ( !err )
hgs
parents: 98
diff changeset
    88
        TRAP(err, MarkEntrysForUnistallL(aKey, componentId));
hgs
parents: 98
diff changeset
    89
hgs
parents: 98
diff changeset
    90
    }
98
hgs
parents:
diff changeset
    91
99
hgs
parents: 98
diff changeset
    92
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
    93
//
hgs
parents: 98
diff changeset
    94
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
    95
//
hgs
parents: 98
diff changeset
    96
void CCaProgressNotifier::EndOperationHandler(
hgs
parents: 98
diff changeset
    97
        const CSifOperationEndData& aEndData )
hgs
parents: 98
diff changeset
    98
    {
hgs
parents: 98
diff changeset
    99
    TInt err = KErrNone;
hgs
parents: 98
diff changeset
   100
    TRAP(err, EndOperationL(aEndData.ErrorCode()));
hgs
parents: 98
diff changeset
   101
    iResultArrayItems.ResetAndDestroy();
hgs
parents: 98
diff changeset
   102
    }
98
hgs
parents:
diff changeset
   103
99
hgs
parents: 98
diff changeset
   104
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   105
//
hgs
parents: 98
diff changeset
   106
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   107
//
hgs
parents: 98
diff changeset
   108
void CCaProgressNotifier::ProgressOperationHandler(
hgs
parents: 98
diff changeset
   109
        const CSifOperationProgressData& aProgressData )
hgs
parents: 98
diff changeset
   110
    {
hgs
parents: 98
diff changeset
   111
    TInt err = KErrNone;
hgs
parents: 98
diff changeset
   112
    TRAP(err, UpdateProgressL(aProgressData));
hgs
parents: 98
diff changeset
   113
    }
98
hgs
parents:
diff changeset
   114
99
hgs
parents: 98
diff changeset
   115
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   116
//
hgs
parents: 98
diff changeset
   117
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   118
//
hgs
parents: 98
diff changeset
   119
void CCaProgressNotifier::UpdateProgressL(
hgs
parents: 98
diff changeset
   120
        const CSifOperationProgressData& aProgressData )
hgs
parents: 98
diff changeset
   121
    {
98
hgs
parents:
diff changeset
   122
    RBuf totalProgressBuf;
hgs
parents:
diff changeset
   123
    totalProgressBuf.CleanupClosePushL();
hgs
parents:
diff changeset
   124
    totalProgressBuf.CreateL( sizeof(TComponentId) + 1 );
hgs
parents:
diff changeset
   125
    totalProgressBuf.AppendNum( aProgressData.CurrentProgess() );
hgs
parents:
diff changeset
   126
99
hgs
parents: 98
diff changeset
   127
    if ( iResultArrayItems.Count() && aProgressData.Phase() == EUninstalling )
98
hgs
parents:
diff changeset
   128
        {
99
hgs
parents: 98
diff changeset
   129
        for ( int i = 0; i < iResultArrayItems.Count(); i++ )
hgs
parents: 98
diff changeset
   130
            {
hgs
parents: 98
diff changeset
   131
            iResultArrayItems[i]->AddAttributeL( KCaAppUninstallProgress,
hgs
parents: 98
diff changeset
   132
                    totalProgressBuf );
hgs
parents: 98
diff changeset
   133
            iStorageProxy.AddL( iResultArrayItems[i], ETrue,
hgs
parents: 98
diff changeset
   134
                    EItemUninstallProgressChanged );
hgs
parents: 98
diff changeset
   135
            }
hgs
parents: 98
diff changeset
   136
        }
98
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
    CleanupStack::PopAndDestroy( &totalProgressBuf );
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
99
hgs
parents: 98
diff changeset
   141
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   142
//
hgs
parents: 98
diff changeset
   143
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   144
//
hgs
parents: 98
diff changeset
   145
void CCaProgressNotifier::EndOperationL( TInt aError )
98
hgs
parents:
diff changeset
   146
    {
99
hgs
parents: 98
diff changeset
   147
    if ( aError )
hgs
parents: 98
diff changeset
   148
        {
hgs
parents: 98
diff changeset
   149
        for ( int i = 0; i < iResultArrayItems.Count(); i++ )
hgs
parents: 98
diff changeset
   150
            {
hgs
parents: 98
diff changeset
   151
            iResultArrayItems[i]->SetFlags( iResultArrayItems[i]->GetFlags()
hgs
parents: 98
diff changeset
   152
                    & ~EUninstall );
hgs
parents: 98
diff changeset
   153
            iStorageProxy.AddL( iResultArrayItems[i] );
hgs
parents: 98
diff changeset
   154
            }
hgs
parents: 98
diff changeset
   155
        }
hgs
parents: 98
diff changeset
   156
    iNotifier->CancelSubscribeL( iKey );
98
hgs
parents:
diff changeset
   157
    }
hgs
parents:
diff changeset
   158
99
hgs
parents: 98
diff changeset
   159
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   160
//
hgs
parents: 98
diff changeset
   161
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   162
//
hgs
parents: 98
diff changeset
   163
TComponentId CCaProgressNotifier::ComponentIdL(
hgs
parents: 98
diff changeset
   164
        const TDesC& aGlobalComponentId, const TDesC& aSwType )
98
hgs
parents:
diff changeset
   165
    {
99
hgs
parents: 98
diff changeset
   166
    RSoftwareComponentRegistry registry;
hgs
parents: 98
diff changeset
   167
    User::LeaveIfError( registry.Connect() );
hgs
parents: 98
diff changeset
   168
    CleanupClosePushL( registry );
hgs
parents: 98
diff changeset
   169
    TComponentId componentId = registry.GetComponentIdL( aGlobalComponentId,
hgs
parents: 98
diff changeset
   170
            aSwType );
hgs
parents: 98
diff changeset
   171
    CleanupStack::PopAndDestroy( &registry ); // registry    
hgs
parents: 98
diff changeset
   172
    return componentId;
hgs
parents: 98
diff changeset
   173
    }
hgs
parents: 98
diff changeset
   174
hgs
parents: 98
diff changeset
   175
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   176
//
hgs
parents: 98
diff changeset
   177
// ---------------------------------------------------------------------------
hgs
parents: 98
diff changeset
   178
//
hgs
parents: 98
diff changeset
   179
void CCaProgressNotifier::MarkEntrysForUnistallL( TUint aKey,
hgs
parents: 98
diff changeset
   180
        TComponentId aComponentId )
hgs
parents: 98
diff changeset
   181
    {
hgs
parents: 98
diff changeset
   182
    RBuf componentIdBuf;
hgs
parents: 98
diff changeset
   183
    componentIdBuf.CleanupClosePushL();
hgs
parents: 98
diff changeset
   184
    componentIdBuf.CreateL( sizeof(TComponentId) + 1 );
hgs
parents: 98
diff changeset
   185
    componentIdBuf.AppendNum( aComponentId );
hgs
parents: 98
diff changeset
   186
98
hgs
parents:
diff changeset
   187
    // find entry by componentID
hgs
parents:
diff changeset
   188
    CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC();
hgs
parents:
diff changeset
   189
    innerQuery->SetRole( CCaInnerQuery::Item );
99
hgs
parents: 98
diff changeset
   190
    innerQuery->AddAttributeL( KCaAttrComponentId, componentIdBuf );
hgs
parents: 98
diff changeset
   191
hgs
parents: 98
diff changeset
   192
    iStorageProxy.GetEntriesL( innerQuery, iResultArrayItems );
hgs
parents: 98
diff changeset
   193
hgs
parents: 98
diff changeset
   194
    if ( iResultArrayItems.Count() )
hgs
parents: 98
diff changeset
   195
        {
hgs
parents: 98
diff changeset
   196
        for ( int i = 0; i < iResultArrayItems.Count(); i++ )
hgs
parents: 98
diff changeset
   197
            {
hgs
parents: 98
diff changeset
   198
            iResultArrayItems[i]->SetFlags( iResultArrayItems[i]->GetFlags()
hgs
parents: 98
diff changeset
   199
                    | EUninstall );
hgs
parents: 98
diff changeset
   200
            iStorageProxy.AddL( iResultArrayItems[i] );
hgs
parents: 98
diff changeset
   201
            }
hgs
parents: 98
diff changeset
   202
        // subscribe for progress notifier
hgs
parents: 98
diff changeset
   203
        iKey = aKey;
hgs
parents: 98
diff changeset
   204
        iNotifier->SubscribeL( aKey, ETrue );
hgs
parents: 98
diff changeset
   205
        }
98
hgs
parents:
diff changeset
   206
    CleanupStack::PopAndDestroy( innerQuery );
99
hgs
parents: 98
diff changeset
   207
    CleanupStack::PopAndDestroy( &componentIdBuf );
98
hgs
parents:
diff changeset
   208
    }