contentstorage/casrv/caprogresscanner/src/caprogresscanner.cpp
author hgs
Fri, 09 Jul 2010 14:19:08 +0300
changeset 102 8b8b34fa9751
permissions -rw-r--r--
201027
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
102
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
hgs
parents:
diff changeset
    18
#include <s32mem.h>
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 "caprogresscanner.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
#include "casrvplugin.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
using namespace Usif;
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
//
hgs
parents:
diff changeset
    36
EXPORT_C CCaProgresScanner* CCaProgresScanner::NewL(
hgs
parents:
diff changeset
    37
        TPluginParams* aPluginParam )
hgs
parents:
diff changeset
    38
    {
hgs
parents:
diff changeset
    39
    CCaProgresScanner* self = new ( ELeave ) CCaProgresScanner(
hgs
parents:
diff changeset
    40
            aPluginParam );
hgs
parents:
diff changeset
    41
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    42
    self->ConstructL();
hgs
parents:
diff changeset
    43
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    44
    return self;
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
//
hgs
parents:
diff changeset
    51
CCaProgresScanner::~CCaProgresScanner()
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    delete iNotifier;
hgs
parents:
diff changeset
    54
    iResultArrayItems.ResetAndDestroy();
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
CCaProgresScanner::CCaProgresScanner( TPluginParams* aPluginParam ) :
hgs
parents:
diff changeset
    62
        iStorageProxy( *aPluginParam->storageProxy ),
hgs
parents:
diff changeset
    63
        iSoftwareRegistry( *aPluginParam->softwareRegistry )
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
//
hgs
parents:
diff changeset
    69
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    70
//
hgs
parents:
diff changeset
    71
void CCaProgresScanner::ConstructL()
hgs
parents:
diff changeset
    72
    {
hgs
parents:
diff changeset
    73
    iNotifier = CSifOperationsNotifier::NewL( *this );
hgs
parents:
diff changeset
    74
    }
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    77
//
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
//
hgs
parents:
diff changeset
    80
void CCaProgresScanner::StartOperationHandler( TUint aKey,
hgs
parents:
diff changeset
    81
        const CSifOperationStartData& aStartData )
hgs
parents:
diff changeset
    82
    {
hgs
parents:
diff changeset
    83
    TInt err( KErrNone );
hgs
parents:
diff changeset
    84
    TComponentId componentId( 0 );
hgs
parents:
diff changeset
    85
    iResultArrayItems.ResetAndDestroy();
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
    TRAP(err, componentId = iSoftwareRegistry.GetComponentIdL(
hgs
parents:
diff changeset
    88
        aStartData.GlobalComponentId(), aStartData.SoftwareType() ));
hgs
parents:
diff changeset
    89
    if ( !err )
hgs
parents:
diff changeset
    90
        TRAP(err, MarkEntrysForUnistallL(aKey, componentId));
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
//
hgs
parents:
diff changeset
    96
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
void CCaProgresScanner::EndOperationHandler(
hgs
parents:
diff changeset
    99
        const CSifOperationEndData& aEndData )
hgs
parents:
diff changeset
   100
    {
hgs
parents:
diff changeset
   101
    TInt err = KErrNone;
hgs
parents:
diff changeset
   102
    TRAP( err, EndOperationL( aEndData.ErrorCode() ) );
hgs
parents:
diff changeset
   103
    iResultArrayItems.ResetAndDestroy();
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
//
hgs
parents:
diff changeset
   108
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
//
hgs
parents:
diff changeset
   110
void CCaProgresScanner::ProgressOperationHandler(
hgs
parents:
diff changeset
   111
        const CSifOperationProgressData& aProgressData )
hgs
parents:
diff changeset
   112
    {
hgs
parents:
diff changeset
   113
    TInt err = KErrNone;
hgs
parents:
diff changeset
   114
    TRAP( err, UpdateProgressL( aProgressData ) );
hgs
parents:
diff changeset
   115
    }
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   118
//
hgs
parents:
diff changeset
   119
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   120
//
hgs
parents:
diff changeset
   121
void CCaProgresScanner::UpdateProgressL(
hgs
parents:
diff changeset
   122
        const CSifOperationProgressData& aProgressData )
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
    RBuf totalProgressBuf;
hgs
parents:
diff changeset
   125
    totalProgressBuf.CleanupClosePushL();
hgs
parents:
diff changeset
   126
    totalProgressBuf.CreateL( sizeof(TComponentId) + 1 );
hgs
parents:
diff changeset
   127
    totalProgressBuf.AppendNum( aProgressData.CurrentProgess() );
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    if ( iResultArrayItems.Count() && aProgressData.Phase() == EUninstalling )
hgs
parents:
diff changeset
   130
        {
hgs
parents:
diff changeset
   131
        for ( int i = 0; i < iResultArrayItems.Count(); i++ )
hgs
parents:
diff changeset
   132
            {
hgs
parents:
diff changeset
   133
            iResultArrayItems[i]->AddAttributeL( KCaAppUninstallProgress,
hgs
parents:
diff changeset
   134
                    totalProgressBuf );
hgs
parents:
diff changeset
   135
            iStorageProxy.AddL( iResultArrayItems[i], ETrue,
hgs
parents:
diff changeset
   136
                    EItemUninstallProgressChanged );
hgs
parents:
diff changeset
   137
            }
hgs
parents:
diff changeset
   138
        }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    CleanupStack::PopAndDestroy( &totalProgressBuf );
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   144
//
hgs
parents:
diff changeset
   145
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
//
hgs
parents:
diff changeset
   147
void CCaProgresScanner::EndOperationL( TInt aError )
hgs
parents:
diff changeset
   148
    {
hgs
parents:
diff changeset
   149
    if ( aError )
hgs
parents:
diff changeset
   150
        {
hgs
parents:
diff changeset
   151
        for ( int i = 0; i < iResultArrayItems.Count(); i++ )
hgs
parents:
diff changeset
   152
            {
hgs
parents:
diff changeset
   153
            iResultArrayItems[i]->SetFlags( iResultArrayItems[i]->GetFlags()
hgs
parents:
diff changeset
   154
                    & ~EUninstall );
hgs
parents:
diff changeset
   155
            iStorageProxy.AddL( iResultArrayItems[i] );
hgs
parents:
diff changeset
   156
            }
hgs
parents:
diff changeset
   157
        }
hgs
parents:
diff changeset
   158
    iNotifier->CancelSubscribeL( iKey );
hgs
parents:
diff changeset
   159
    }
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   162
//
hgs
parents:
diff changeset
   163
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   164
//
hgs
parents:
diff changeset
   165
void CCaProgresScanner::MarkEntrysForUnistallL( TUint aKey,
hgs
parents:
diff changeset
   166
        TComponentId aComponentId )
hgs
parents:
diff changeset
   167
    {
hgs
parents:
diff changeset
   168
    RBuf componentIdBuf;
hgs
parents:
diff changeset
   169
    componentIdBuf.CleanupClosePushL();
hgs
parents:
diff changeset
   170
    componentIdBuf.CreateL( sizeof(TComponentId) + 1 );
hgs
parents:
diff changeset
   171
    componentIdBuf.AppendNum( aComponentId );
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
    // find entry by componentID
hgs
parents:
diff changeset
   174
    CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC();
hgs
parents:
diff changeset
   175
    innerQuery->SetRole( CCaInnerQuery::Item );
hgs
parents:
diff changeset
   176
    innerQuery->AddAttributeL( KCaAttrComponentId, componentIdBuf );
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    iStorageProxy.GetEntriesL( innerQuery, iResultArrayItems );
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
    if ( iResultArrayItems.Count() )
hgs
parents:
diff changeset
   181
        {
hgs
parents:
diff changeset
   182
        for ( int i = 0; i < iResultArrayItems.Count(); i++ )
hgs
parents:
diff changeset
   183
            {
hgs
parents:
diff changeset
   184
            iResultArrayItems[i]->SetFlags( iResultArrayItems[i]->GetFlags()
hgs
parents:
diff changeset
   185
                    | EUninstall );
hgs
parents:
diff changeset
   186
            iStorageProxy.AddL( iResultArrayItems[i] );
hgs
parents:
diff changeset
   187
            }
hgs
parents:
diff changeset
   188
        // subscribe for progress notifier
hgs
parents:
diff changeset
   189
        iKey = aKey;
hgs
parents:
diff changeset
   190
        iNotifier->SubscribeL( aKey, ETrue );
hgs
parents:
diff changeset
   191
        }
hgs
parents:
diff changeset
   192
    CleanupStack::PopAndDestroy( innerQuery );
hgs
parents:
diff changeset
   193
    CleanupStack::PopAndDestroy( &componentIdBuf );
hgs
parents:
diff changeset
   194
    }