messagingappbase/msgerrorwatcher/src/MsgSentItemsObserver.cpp
author hgs
Thu, 04 Nov 2010 02:02:03 +0530
changeset 81 2043ea884c04
parent 79 2981cb3aa489
permissions -rw-r--r--
201044_03
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002 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:  
hgs
parents:
diff changeset
    15
*       CMsgSentItemsObserver implementation file
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
// INCLUDE FILES
hgs
parents:
diff changeset
    22
#include <watcher.h>
hgs
parents:
diff changeset
    23
#include <msvids.h>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include <centralrepository.h>    // link against centralrepository.lib
hgs
parents:
diff changeset
    26
#include <cenrepnotifyhandler.h>  // link against CenRepNotifHandler.lib
hgs
parents:
diff changeset
    27
#include <messaginginternalcrkeys.h> // for Central Repository keys
hgs
parents:
diff changeset
    28
#include <msvipc.h>
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
#include "MsgSentItemsObserver.h"
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#ifdef USE_LOGGER
hgs
parents:
diff changeset
    33
#include "MsgErrorWatcherLogging.h"
hgs
parents:
diff changeset
    34
#endif
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
// CONSTANTS
hgs
parents:
diff changeset
    37
//const TUid KUidMceApp = { 0x100058C5 }; //needed to request shared data notifications
hgs
parents:
diff changeset
    38
const TMsvId KWatcherSentFolderId = KMsvSentEntryIdValue;
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
// Entry deletion could fail with KErrInUse if it is being operated by MW while deleting
hgs
parents:
diff changeset
    41
const TUint KMaxRetries = 3;
hgs
parents:
diff changeset
    42
const TInt KMaxNumOfItems = 20; //Deafult value in case of error reading CommsDb
hgs
parents:
diff changeset
    43
//const TInt KMsgErrorDiskSpaceForDelete = ( 5 * 1024 ); // minimum disk space needed when deleting messages
hgs
parents:
diff changeset
    44
//_LIT( KSentItemsInUseOff, "0" );
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// ---------------------------------------------------------
hgs
parents:
diff changeset
    50
// CMsgSentItemsObserver::NewL
hgs
parents:
diff changeset
    51
//
hgs
parents:
diff changeset
    52
// Two-phased constructor.
hgs
parents:
diff changeset
    53
// ---------------------------------------------------------
hgs
parents:
diff changeset
    54
//
hgs
parents:
diff changeset
    55
CMsgSentItemsObserver* CMsgSentItemsObserver::NewL( 
hgs
parents:
diff changeset
    56
        CMsgErrorWatcher* aWatcher, 
hgs
parents:
diff changeset
    57
        CMsvSession* aSession )
hgs
parents:
diff changeset
    58
    {
hgs
parents:
diff changeset
    59
    CMsgSentItemsObserver* self = new ( ELeave )
hgs
parents:
diff changeset
    60
        CMsgSentItemsObserver( aWatcher, aSession );
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    63
    self->ConstructL();
hgs
parents:
diff changeset
    64
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    65
    return self;
hgs
parents:
diff changeset
    66
    }
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
// ---------------------------------------------------------
hgs
parents:
diff changeset
    69
// CMsgSentItemsObserver::CMsgSentItemsObserver
hgs
parents:
diff changeset
    70
//
hgs
parents:
diff changeset
    71
// C++ default constructor can NOT contain any code, that
hgs
parents:
diff changeset
    72
// might leave.
hgs
parents:
diff changeset
    73
// ---------------------------------------------------------
hgs
parents:
diff changeset
    74
//
hgs
parents:
diff changeset
    75
CMsgSentItemsObserver::CMsgSentItemsObserver( CMsgErrorWatcher* aWatcher, CMsvSession* aSession )
hgs
parents:
diff changeset
    76
    : CActive( EPriorityStandard ),
hgs
parents:
diff changeset
    77
    iWatcher( aWatcher ),
hgs
parents:
diff changeset
    78
    iSession( aSession )
hgs
parents:
diff changeset
    79
    {
hgs
parents:
diff changeset
    80
    CActiveScheduler::Add( this );
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
// ---------------------------------------------------------
hgs
parents:
diff changeset
    84
// CMsgSentItemsObserver::~CMsgSentItemsObserver
hgs
parents:
diff changeset
    85
//
hgs
parents:
diff changeset
    86
// Destructor
hgs
parents:
diff changeset
    87
// ---------------------------------------------------------
hgs
parents:
diff changeset
    88
//
hgs
parents:
diff changeset
    89
CMsgSentItemsObserver::~CMsgSentItemsObserver()
hgs
parents:
diff changeset
    90
    {
hgs
parents:
diff changeset
    91
    Cancel();
hgs
parents:
diff changeset
    92
    if ( iNotifyHandler )
hgs
parents:
diff changeset
    93
        {        
hgs
parents:
diff changeset
    94
        iNotifyHandler->StopListening();
hgs
parents:
diff changeset
    95
        }
hgs
parents:
diff changeset
    96
    delete iNotifyHandler;
hgs
parents:
diff changeset
    97
    delete iRepository;
hgs
parents:
diff changeset
    98
    if( iCleanupFlags & ESentItemsFolderObserverAdded )
hgs
parents:
diff changeset
    99
        {
hgs
parents:
diff changeset
   100
        iSentItemsFolder->RemoveObserver( *this );
hgs
parents:
diff changeset
   101
        }
hgs
parents:
diff changeset
   102
    delete iSentItemsFolder;
hgs
parents:
diff changeset
   103
    delete iEntry;
hgs
parents:
diff changeset
   104
    delete iOp;
hgs
parents:
diff changeset
   105
    
hgs
parents:
diff changeset
   106
    delete iQudUPEntryBeingDeleted;
hgs
parents:
diff changeset
   107
    delete iQueuedUPEntriesToBeDeleted;
hgs
parents:
diff changeset
   108
    
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
// ---------------------------------------------------------
hgs
parents:
diff changeset
   112
// CMsgSentItemsObserver::ConstructL
hgs
parents:
diff changeset
   113
//
hgs
parents:
diff changeset
   114
// Symbian OS default constructor can leave.
hgs
parents:
diff changeset
   115
// ---------------------------------------------------------
hgs
parents:
diff changeset
   116
//
hgs
parents:
diff changeset
   117
void CMsgSentItemsObserver::ConstructL()
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
#ifdef USE_LOGGER
hgs
parents:
diff changeset
   120
    MEWLOGGER_ENTERFN( "SentItems: ConstructL" );
hgs
parents:
diff changeset
   121
#endif
hgs
parents:
diff changeset
   122
    //iMsgStoreDrive = MessageServer::CurrentDriveL( iSession->FileSession() );
hgs
parents:
diff changeset
   123
    //register as observer of sent items folder
hgs
parents:
diff changeset
   124
    TMsvSelectionOrdering sort( KMsvNoGrouping, EMsvSortByDateReverse );
hgs
parents:
diff changeset
   125
    iSentItemsFolder = CMsvEntry::NewL( *iSession, KWatcherSentFolderId, sort );
hgs
parents:
diff changeset
   126
    iSentItemsFolder->AddObserverL( *this );
hgs
parents:
diff changeset
   127
    iCleanupFlags |= ESentItemsFolderObserverAdded;
hgs
parents:
diff changeset
   128
    
hgs
parents:
diff changeset
   129
    //register as observer of user settings for sent folder
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    // Central Repository
hgs
parents:
diff changeset
   132
    iRepository = CRepository::NewL( KCRUidMuiuSettings );
hgs
parents:
diff changeset
   133
    iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iRepository );
hgs
parents:
diff changeset
   134
    iNotifyHandler->StartListeningL();
hgs
parents:
diff changeset
   135
    
hgs
parents:
diff changeset
   136
    iQudUPEntryBeingDeleted = new(ELeave) CMsvEntrySelection;
hgs
parents:
diff changeset
   137
    iQueuedUPEntriesToBeDeleted= new(ELeave) CMsvEntrySelection;
hgs
parents:
diff changeset
   138
    
hgs
parents:
diff changeset
   139
#ifdef USE_LOGGER
hgs
parents:
diff changeset
   140
    MEWLOGGER_LEAVEFN( "SentItems: ConstructL" );
hgs
parents:
diff changeset
   141
#endif
hgs
parents:
diff changeset
   142
    }
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
// ---------------------------------------------------------
hgs
parents:
diff changeset
   145
// CMsgSentItemsObserver::RunL
hgs
parents:
diff changeset
   146
//
hgs
parents:
diff changeset
   147
// Will only run when messages have been deleted
hgs
parents:
diff changeset
   148
// ---------------------------------------------------------
hgs
parents:
diff changeset
   149
//
hgs
parents:
diff changeset
   150
void CMsgSentItemsObserver::RunL()
hgs
parents:
diff changeset
   151
    {
hgs
parents:
diff changeset
   152
    //iSession->FileSession().ReleaseReserveAccess( iMsgStoreDrive );
hgs
parents:
diff changeset
   153
    //Check if new messages have appeared into Sent Items while deleting
hgs
parents:
diff changeset
   154
    //the previous one(s).
hgs
parents:
diff changeset
   155
#ifdef USE_LOGGER
hgs
parents:
diff changeset
   156
    MEWLOGGER_WRITEF( _L("SentItems: Retries: %d"), iRetryCounter );
hgs
parents:
diff changeset
   157
#endif
hgs
parents:
diff changeset
   158
    if ( iRetryCounter < KMaxRetries )
hgs
parents:
diff changeset
   159
        {
hgs
parents:
diff changeset
   160
        iRetryCounter++;
hgs
parents:
diff changeset
   161
        TRAP_IGNORE( DeleteOldMessagesFromSentFolderL() );
hgs
parents:
diff changeset
   162
        }
hgs
parents:
diff changeset
   163
    
hgs
parents:
diff changeset
   164
    
hgs
parents:
diff changeset
   165
    const TDesC8& temp = iOp->ProgressL();
hgs
parents:
diff changeset
   166
    TMsvLocalOperationProgress* prog = ( (TMsvLocalOperationProgress*) temp.Ptr());
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
#ifdef USE_LOGGER
hgs
parents:
diff changeset
   169
    MEWLOGGER_WRITEF( _L("SentItems: deletion iStatus %d"), iStatus.Int() );
hgs
parents:
diff changeset
   170
	// prog->iNumberFailed should be either 0(if successful) or 1(if failed) as we are deletingone entry at a time
hgs
parents:
diff changeset
   171
    MEWLOGGER_WRITEF( _L("Failed Deletions: %d"), prog->iNumberFailed );
hgs
parents:
diff changeset
   172
    MEWLOGGER_WRITEF( _L("Delete Error Code: %d"), prog->iError );
hgs
parents:
diff changeset
   173
#endif
hgs
parents:
diff changeset
   174
    
hgs
parents:
diff changeset
   175
    if(iStatus.Int() == KErrNone && prog->iNumberFailed && prog->iError == KErrInUse && iRetryCounterIfEntryDelFailed < KMaxRetries)
hgs
parents:
diff changeset
   176
        {
hgs
parents:
diff changeset
   177
        DeleteSingleEntryL(iQudUPEntryBeingDeleted);
hgs
parents:
diff changeset
   178
        iRetryCounterIfEntryDelFailed ++;
hgs
parents:
diff changeset
   179
#ifdef USE_LOGGER
hgs
parents:
diff changeset
   180
        MEWLOGGER_WRITEF( _L("iRetryCounterIfEntryDelFailed : %d"), iRetryCounterIfEntryDelFailed );
hgs
parents:
diff changeset
   181
#endif
hgs
parents:
diff changeset
   182
        return;
hgs
parents:
diff changeset
   183
        }
hgs
parents:
diff changeset
   184
    iRetryCounterIfEntryDelFailed = 0;
hgs
parents:
diff changeset
   185
    
hgs
parents:
diff changeset
   186
    if( iQueuedUPEntriesToBeDeleted->Count() )
hgs
parents:
diff changeset
   187
        {
hgs
parents:
diff changeset
   188
        iQudUPEntryBeingDeleted->Reset();
hgs
parents:
diff changeset
   189
        iQudUPEntryBeingDeleted->AppendL(iQueuedUPEntriesToBeDeleted->At(0));
hgs
parents:
diff changeset
   190
        iQueuedUPEntriesToBeDeleted->Delete(0);
hgs
parents:
diff changeset
   191
        
hgs
parents:
diff changeset
   192
        DeleteSingleEntryL(iQudUPEntryBeingDeleted);
hgs
parents:
diff changeset
   193
        }
hgs
parents:
diff changeset
   194
    
hgs
parents:
diff changeset
   195
    }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
// ---------------------------------------------------------
hgs
parents:
diff changeset
   198
// CMsgSentItemsObserver::DoCancel
hgs
parents:
diff changeset
   199
//
hgs
parents:
diff changeset
   200
// From active object framework
hgs
parents:
diff changeset
   201
// ---------------------------------------------------------
hgs
parents:
diff changeset
   202
//
hgs
parents:
diff changeset
   203
void CMsgSentItemsObserver::DoCancel()
hgs
parents:
diff changeset
   204
    {
hgs
parents:
diff changeset
   205
    //iSession->FileSession().ReleaseReserveAccess( iMsgStoreDrive );
hgs
parents:
diff changeset
   206
    if ( iOp )
hgs
parents:
diff changeset
   207
        {
hgs
parents:
diff changeset
   208
        iOp->Cancel();
hgs
parents:
diff changeset
   209
        }
hgs
parents:
diff changeset
   210
    }
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
// ---------------------------------------------------------
hgs
parents:
diff changeset
   213
// CMsgSentItemsObserver::HandleNotifyInt
hgs
parents:
diff changeset
   214
//
hgs
parents:
diff changeset
   215
// Notification from central repository
hgs
parents:
diff changeset
   216
// ---------------------------------------------------------
hgs
parents:
diff changeset
   217
//
hgs
parents:
diff changeset
   218
void CMsgSentItemsObserver::HandleNotifyInt( TUint32 aId, TInt aNewValue )
hgs
parents:
diff changeset
   219
    {    
hgs
parents:
diff changeset
   220
    if ( ( aId == KMuiuSentItemsInUse && aNewValue != 0 ) ||
hgs
parents:
diff changeset
   221
         ( aId == KMuiuSentItemsCount && SentFolderIsBeingUsed() ) )
hgs
parents:
diff changeset
   222
        {
hgs
parents:
diff changeset
   223
        iRetryCounter = 0;
hgs
parents:
diff changeset
   224
        //This is non-leaving function...
hgs
parents:
diff changeset
   225
        TRAPD( dummy, DeleteOldMessagesFromSentFolderL() );
hgs
parents:
diff changeset
   226
        dummy=dummy; //Prevent arm5 build warning
hgs
parents:
diff changeset
   227
        }
hgs
parents:
diff changeset
   228
    }
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
// ---------------------------------------------------------
hgs
parents:
diff changeset
   231
// CMsgSentItemsObserver::HandleNotifyGeneric
hgs
parents:
diff changeset
   232
// ---------------------------------------------------------
hgs
parents:
diff changeset
   233
//
hgs
parents:
diff changeset
   234
void CMsgSentItemsObserver::HandleNotifyGeneric( TUint32 /*aId*/ )
hgs
parents:
diff changeset
   235
    {
hgs
parents:
diff changeset
   236
    //Nothing.
hgs
parents:
diff changeset
   237
    }
hgs
parents:
diff changeset
   238
    
hgs
parents:
diff changeset
   239
// ---------------------------------------------------------
hgs
parents:
diff changeset
   240
// CMsgSentItemsObserver::HandleNotifyError
hgs
parents:
diff changeset
   241
// ---------------------------------------------------------
hgs
parents:
diff changeset
   242
//
hgs
parents:
diff changeset
   243
void CMsgSentItemsObserver::HandleNotifyError( TUint32 /*aId*/, TInt /*error*/, CCenRepNotifyHandler* /*aHandler*/ )
hgs
parents:
diff changeset
   244
    {
hgs
parents:
diff changeset
   245
    //Nothing.
hgs
parents:
diff changeset
   246
    }
hgs
parents:
diff changeset
   247
  
hgs
parents:
diff changeset
   248
// ---------------------------------------------------------
hgs
parents:
diff changeset
   249
// CMsgSentItemsObserver::HandleEntryEventL
hgs
parents:
diff changeset
   250
//
hgs
parents:
diff changeset
   251
// Call back from msg that the sent items folder has changed
hgs
parents:
diff changeset
   252
// so check if messages need to be deleted.
hgs
parents:
diff changeset
   253
// ---------------------------------------------------------
hgs
parents:
diff changeset
   254
//
hgs
parents:
diff changeset
   255
void CMsgSentItemsObserver::HandleEntryEventL( TMsvEntryEvent aEvent, TAny* aArg1, TAny* /*aArg2*/, TAny* /*aArg3*/ )
hgs
parents:
diff changeset
   256
    {   
hgs
parents:
diff changeset
   257
    switch( aEvent )
hgs
parents:
diff changeset
   258
        {
hgs
parents:
diff changeset
   259
        case EMsvNewChildren:
hgs
parents:
diff changeset
   260
            {
hgs
parents:
diff changeset
   261
            if( !SentFolderIsBeingUsed() )
hgs
parents:
diff changeset
   262
                {
hgs
parents:
diff changeset
   263
                //not taking ownership
hgs
parents:
diff changeset
   264
                CMsvEntrySelection* selection =
hgs
parents:
diff changeset
   265
                    static_cast<CMsvEntrySelection*>( aArg1 );
hgs
parents:
diff changeset
   266
                iRetryCounter = 0;
hgs
parents:
diff changeset
   267
                DeleteMessagesFromSentFolderL( selection );
hgs
parents:
diff changeset
   268
                return;
hgs
parents:
diff changeset
   269
                }
hgs
parents:
diff changeset
   270
            if( iSentItemsFolder->Count() > SentFolderUpperLimit() )
hgs
parents:
diff changeset
   271
                {
hgs
parents:
diff changeset
   272
                iRetryCounter = 0;
hgs
parents:
diff changeset
   273
                DeleteOldMessagesFromSentFolderL();
hgs
parents:
diff changeset
   274
                return;
hgs
parents:
diff changeset
   275
                }
hgs
parents:
diff changeset
   276
            }
hgs
parents:
diff changeset
   277
            break;
hgs
parents:
diff changeset
   278
        case EMsvEntryChanged:
hgs
parents:
diff changeset
   279
        case EMsvDeletedChildren:
hgs
parents:
diff changeset
   280
        case EMsvChildrenChanged:
hgs
parents:
diff changeset
   281
        case EMsvEntryDeleted:
hgs
parents:
diff changeset
   282
        case EMsvContextInvalid:
hgs
parents:
diff changeset
   283
        case EMsvChildrenMissing:
hgs
parents:
diff changeset
   284
        case EMsvChildrenInvalid:
hgs
parents:
diff changeset
   285
        case EMsvEntryMoved:
hgs
parents:
diff changeset
   286
        default:
hgs
parents:
diff changeset
   287
            break;
hgs
parents:
diff changeset
   288
        }
hgs
parents:
diff changeset
   289
    }
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
// ---------------------------------------------------------
hgs
parents:
diff changeset
   292
// CMsgSentItemsObserver::SentFolderIsBeingUsed
hgs
parents:
diff changeset
   293
//
hgs
parents:
diff changeset
   294
// Returns the user setting for use of the sent folder. If there
hgs
parents:
diff changeset
   295
// is an error then the default value of ON (i.e ETrue) will
hgs
parents:
diff changeset
   296
// be returned.
hgs
parents:
diff changeset
   297
// ---------------------------------------------------------
hgs
parents:
diff changeset
   298
//
hgs
parents:
diff changeset
   299
TBool CMsgSentItemsObserver::SentFolderIsBeingUsed()
hgs
parents:
diff changeset
   300
    {
hgs
parents:
diff changeset
   301
    TInt isUsed = 1;
hgs
parents:
diff changeset
   302
   	iRepository->Get( KMuiuSentItemsInUse, isUsed );
hgs
parents:
diff changeset
   303
    return isUsed;
hgs
parents:
diff changeset
   304
    }
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
// ---------------------------------------------------------
hgs
parents:
diff changeset
   307
// CMsgSentItemsObserver::SentFolderUpperLimit
hgs
parents:
diff changeset
   308
//
hgs
parents:
diff changeset
   309
// Returns the user setting for max limit to the number of messages
hgs
parents:
diff changeset
   310
// in the sent folder. If there is an error then the default value of
hgs
parents:
diff changeset
   311
// KMaxNumOfItems will be returned
hgs
parents:
diff changeset
   312
// ---------------------------------------------------------
hgs
parents:
diff changeset
   313
//
hgs
parents:
diff changeset
   314
TInt CMsgSentItemsObserver::SentFolderUpperLimit()
hgs
parents:
diff changeset
   315
    {
hgs
parents:
diff changeset
   316
    TInt numItems = KMaxNumOfItems;
hgs
parents:
diff changeset
   317
   	iRepository->Get( KMuiuSentItemsCount, numItems );
hgs
parents:
diff changeset
   318
    return numItems;
hgs
parents:
diff changeset
   319
    }
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
// ---------------------------------------------------------
hgs
parents:
diff changeset
   322
// CMsgSentItemsObserver::DeleteOldMessagesFromSentFolderL
hgs
parents:
diff changeset
   323
//
hgs
parents:
diff changeset
   324
// If there are more messages in the sent folder than the upper
hgs
parents:
diff changeset
   325
// limit set by the user then delete the oldest messages.
hgs
parents:
diff changeset
   326
// ---------------------------------------------------------
hgs
parents:
diff changeset
   327
//
hgs
parents:
diff changeset
   328
void CMsgSentItemsObserver::DeleteOldMessagesFromSentFolderL()
hgs
parents:
diff changeset
   329
    {
hgs
parents:
diff changeset
   330
    CMsvEntrySelection* children = iSentItemsFolder->ChildrenL();
hgs
parents:
diff changeset
   331
    CleanupStack::PushL( children );
hgs
parents:
diff changeset
   332
    TInt limit = SentFolderUpperLimit();
hgs
parents:
diff changeset
   333
    TInt sentMessageCount = children->Count();
hgs
parents:
diff changeset
   334
    if( sentMessageCount <= limit )
hgs
parents:
diff changeset
   335
        {
hgs
parents:
diff changeset
   336
        CleanupStack::PopAndDestroy( children );
hgs
parents:
diff changeset
   337
        return;
hgs
parents:
diff changeset
   338
        }
hgs
parents:
diff changeset
   339
    CMsvEntrySelection* messagesToBeDeleted = new ( ELeave ) CMsvEntrySelection;
hgs
parents:
diff changeset
   340
    CleanupStack::PushL( messagesToBeDeleted );
hgs
parents:
diff changeset
   341
    //oldest messages are at the end of the array
hgs
parents:
diff changeset
   342
    for( TInt index = sentMessageCount - 1; index >= limit; index-- )
hgs
parents:
diff changeset
   343
        {
hgs
parents:
diff changeset
   344
        messagesToBeDeleted->AppendL( children->At( index ) );
hgs
parents:
diff changeset
   345
        }
hgs
parents:
diff changeset
   346
    DeleteMessagesFromSentFolderL( messagesToBeDeleted );
hgs
parents:
diff changeset
   347
    CleanupStack::PopAndDestroy( messagesToBeDeleted  ); 
hgs
parents:
diff changeset
   348
    CleanupStack::PopAndDestroy( children );
hgs
parents:
diff changeset
   349
    }
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
// ---------------------------------------------------------
hgs
parents:
diff changeset
   352
// CMsgSentItemsObserver::DeleteMessagesFromSentFolderL
hgs
parents:
diff changeset
   353
//
hgs
parents:
diff changeset
   354
// Delete the messages specified by aSelection
hgs
parents:
diff changeset
   355
// ---------------------------------------------------------
hgs
parents:
diff changeset
   356
//
hgs
parents:
diff changeset
   357
void CMsgSentItemsObserver::DeleteMessagesFromSentFolderL( CMsvEntrySelection* aSelection )
hgs
parents:
diff changeset
   358
    {
hgs
parents:
diff changeset
   359
    iQueuedUPEntriesToBeDeleted->AppendL(aSelection->Back(0), aSelection->Count());
hgs
parents:
diff changeset
   360
    if ( !IsActive() )
hgs
parents:
diff changeset
   361
        {
hgs
parents:
diff changeset
   362
        iQudUPEntryBeingDeleted->Reset();
hgs
parents:
diff changeset
   363
        iQudUPEntryBeingDeleted->AppendL(iQueuedUPEntriesToBeDeleted->At(0));
hgs
parents:
diff changeset
   364
        iQueuedUPEntriesToBeDeleted->Delete(0);
hgs
parents:
diff changeset
   365
        
hgs
parents:
diff changeset
   366
		// If multiple entries are sent for deletion, then it won't be possible to track
hgs
parents:
diff changeset
   367
		// the entries that failed to delete
hgs
parents:
diff changeset
   368
        DeleteSingleEntryL(iQudUPEntryBeingDeleted);
hgs
parents:
diff changeset
   369
        }
hgs
parents:
diff changeset
   370
    
hgs
parents:
diff changeset
   371
    }
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
hgs
parents:
diff changeset
   374
void CMsgSentItemsObserver::DeleteSingleEntryL(CMsvEntrySelection* aSelection)
hgs
parents:
diff changeset
   375
    {
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
#ifdef USE_LOGGER
hgs
parents:
diff changeset
   378
        MEWLOGGER_WRITEF( _L("SentItems: deleting %d messages from sent folder"), aSelection->Count() );
hgs
parents:
diff changeset
   379
#endif
hgs
parents:
diff changeset
   380
        
hgs
parents:
diff changeset
   381
        const TMsvId id = aSelection->At( 0 );
hgs
parents:
diff changeset
   382
        delete iEntry;
hgs
parents:
diff changeset
   383
        iEntry = 0;
hgs
parents:
diff changeset
   384
        iEntry = iSession->GetEntryL( id );
hgs
parents:
diff changeset
   385
        iEntry->SetEntryL( iEntry->Entry().Parent() );
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
        //if ( iSession->FileSession().ReserveDriveSpace( iMsgStoreDrive, KMsgErrorDiskSpaceForDelete ) == KErrNone )
hgs
parents:
diff changeset
   388
        //    {
hgs
parents:
diff changeset
   389
        //    iSession->FileSession().GetReserveAccess( iMsgStoreDrive );
hgs
parents:
diff changeset
   390
        //    }
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
        delete iOp;
hgs
parents:
diff changeset
   393
        iOp = 0;
hgs
parents:
diff changeset
   394
        //TRAPD( err,
hgs
parents:
diff changeset
   395
        //    {
hgs
parents:
diff changeset
   396
            iOp = iEntry->DeleteL( *aSelection, iStatus ); //delete acts on returned CMsvOperation*
hgs
parents:
diff changeset
   397
        //    } );
hgs
parents:
diff changeset
   398
        //if ( err )
hgs
parents:
diff changeset
   399
        //    {
hgs
parents:
diff changeset
   400
        //    iSession->FileSession().ReleaseReserveAccess( iMsgStoreDrive );
hgs
parents:
diff changeset
   401
        //    User::Leave( err );
hgs
parents:
diff changeset
   402
        //    }
hgs
parents:
diff changeset
   403
        //else
hgs
parents:
diff changeset
   404
        //    {
hgs
parents:
diff changeset
   405
            SetActive();
hgs
parents:
diff changeset
   406
        //    }
hgs
parents:
diff changeset
   407
            
hgs
parents:
diff changeset
   408
        }
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
hgs
parents:
diff changeset
   411
//  End of File  
hgs
parents:
diff changeset
   412