ipsservices/ipssosplugin/src/ipsplgdeleteremote.cpp
changeset 23 2dc6caa42ec3
parent 20 ecc8def7944a
child 25 61b206842ac4
child 27 9ba4404ef423
child 38 b4618f2cf6ac
equal deleted inserted replaced
20:ecc8def7944a 23:2dc6caa42ec3
     1 /*
       
     2 * Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: This file implements class CIpsPlgDeleteRemote.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 
       
    22 #include "emailtrace.h"
       
    23 #include "ipsplgheaders.h"
       
    24 
       
    25 // LOCAL CONSTANTS AND MACROS
       
    26 
       
    27 // ================= MEMBER FUNCTIONS =======================
       
    28 
       
    29 // ----------------------------------------------------------------------------
       
    30 // CIpsPlgDeleteRemote::CIpsPlgDeleteRemote
       
    31 // ----------------------------------------------------------------------------
       
    32 //
       
    33 CIpsPlgDeleteRemote::CIpsPlgDeleteRemote(
       
    34     CMsvSession& aMsvSession,
       
    35     TRequestStatus& aObserverRequestStatus )
       
    36     :
       
    37     CMsvOperation( 
       
    38         aMsvSession, 
       
    39         CActive::EPriorityStandard, 
       
    40         aObserverRequestStatus),
       
    41         iBlank( KNullDesC8 )
       
    42     {
       
    43     FUNC_LOG;
       
    44     CActiveScheduler::Add(this);
       
    45     }
       
    46 
       
    47 
       
    48 // ----------------------------------------------------------------------------
       
    49 // CIpsPlgDeleteRemote::ConstructL
       
    50 // ----------------------------------------------------------------------------
       
    51 //
       
    52 void CIpsPlgDeleteRemote::ConstructL(
       
    53     CMsvEntrySelection& aDeletedEntries )
       
    54     {
       
    55     FUNC_LOG;
       
    56     iEntrySelection = aDeletedEntries.CopyL();
       
    57     iEntryCount = iEntrySelection->Count();
       
    58     if ( iEntryCount == 0 )
       
    59         {
       
    60         User::Leave( KErrNotSupported );
       
    61         }
       
    62 
       
    63     TMsvId serviceId;
       
    64     TMsvEntry entry;
       
    65     User::LeaveIfError(
       
    66         iMsvSession.GetEntry(
       
    67             (*iEntrySelection)[0], serviceId, entry ) );
       
    68     iEntry = CMsvEntry::NewL(
       
    69         iMsvSession, entry.Parent(), TMsvSelectionOrdering() );
       
    70     iMtm = iEntry->Entry().iMtm;
       
    71 
       
    72     iStatus=KRequestPending;
       
    73 
       
    74 	// <qmail>    
       
    75     // It is known that there is at least one entry -> no return value check
       
    76     SetNextLocallyDeletedFlagL();
       
    77 
       
    78     SetActive();
       
    79 	// </qmail>    
       
    80     }
       
    81 
       
    82 // ----------------------------------------------------------------------------
       
    83 // CIpsPlgDeleteRemote::NewL
       
    84 // ----------------------------------------------------------------------------
       
    85 //
       
    86 CIpsPlgDeleteRemote* CIpsPlgDeleteRemote::NewL(
       
    87     CMsvSession& aMsvSession,
       
    88     TRequestStatus& aObserverRequestStatus,
       
    89     CMsvEntrySelection& aDeletedEntries )
       
    90     {
       
    91     FUNC_LOG;
       
    92     CIpsPlgDeleteRemote* self=new (ELeave) CIpsPlgDeleteRemote(
       
    93         aMsvSession, aObserverRequestStatus );
       
    94     CleanupStack::PushL(self);
       
    95     self->ConstructL( aDeletedEntries );
       
    96     CleanupStack::Pop( self ); 
       
    97     return self;
       
    98     }
       
    99 
       
   100 // ----------------------------------------------------------------------------
       
   101 // CIpsPlgDeleteRemote::~CIpsPlgDeleteRemote
       
   102 // ----------------------------------------------------------------------------
       
   103 //
       
   104 CIpsPlgDeleteRemote::~CIpsPlgDeleteRemote()
       
   105     {
       
   106     FUNC_LOG;
       
   107     Cancel();
       
   108 
       
   109     delete iOperation;
       
   110     delete iEntry;
       
   111     delete iEntrySelection;
       
   112 	// <qmail>    
       
   113     delete iSetFlagEntry;
       
   114 	// </qmail>    
       
   115     }
       
   116 
       
   117 // ----------------------------------------------------------------------------
       
   118 // CIpsPlgDeleteRemote::DoCancel
       
   119 // ----------------------------------------------------------------------------
       
   120 //
       
   121 void CIpsPlgDeleteRemote::DoCancel()
       
   122     {
       
   123     FUNC_LOG;
       
   124     if (iOperation)
       
   125         {
       
   126         iOperation->Cancel();
       
   127         }
       
   128     TRequestStatus* status = &iObserverRequestStatus;
       
   129     if ( status && status->Int() == KRequestPending )
       
   130         {
       
   131         User::RequestComplete(status, iStatus.Int());
       
   132         }
       
   133     }
       
   134 
       
   135 // ----------------------------------------------------------------------------
       
   136 // CIpsPlgDeleteRemote::RunL
       
   137 // ----------------------------------------------------------------------------
       
   138 //
       
   139 void CIpsPlgDeleteRemote::RunL()
       
   140     {
       
   141     FUNC_LOG;
       
   142     // Make first a check, that nothing has failed
       
   143     if ( iStatus.Int() != KErrNone )
       
   144         {
       
   145         // something failed, just complete
       
   146         TRequestStatus* status = &iObserverRequestStatus;
       
   147         User::RequestComplete(status, iStatus.Int());
       
   148         return;
       
   149         }
       
   150 
       
   151 	// <qmail>    
       
   152     if ( iState == EDeletingMessagesStateSetFlags )
       
   153         {
       
   154         // cleanup is handled by SetNextLocallyDeletedFlagL
       
   155         TBool ret = EFalse;
       
   156         
       
   157         TRAPD( err, ret = SetNextLocallyDeletedFlagL() );
       
   158         
       
   159         if ( err != KErrNone )
       
   160             {
       
   161             TRequestStatus* status = &iObserverRequestStatus;
       
   162             User::RequestComplete(status, iStatus.Int());
       
   163             }
       
   164         else if ( ret )
       
   165             {
       
   166             SetActive();
       
   167             }
       
   168         else
       
   169             { // setting the flags is ready, start local deletion
       
   170             StartNextDeleteLocally();
       
   171             }
       
   172         }
       
   173     else if ( iState == EDeletingMessagesStateLocally )
       
   174         {
       
   175         // local delete completed, start deleting from server
       
   176         StartDeleteFromServer();
       
   177         }
       
   178     else
       
   179         {
       
   180         // nothing left to process, so complete the observer
       
   181         TRequestStatus* status = &iObserverRequestStatus;
       
   182         User::RequestComplete(status, iStatus.Int());
       
   183         }
       
   184     // </qmail>    
       
   185 	}
       
   186 
       
   187 // ----------------------------------------------------------------------------
       
   188 // CIpsPlgDeleteRemote::ProgressL
       
   189 // ----------------------------------------------------------------------------
       
   190 //
       
   191 const TDesC8& CIpsPlgDeleteRemote::ProgressL()
       
   192     {
       
   193     FUNC_LOG;
       
   194     // Make sure that operation is active
       
   195     if ( IsActive() )
       
   196         {
       
   197         // Get progress
       
   198         if ( iOperation )
       
   199             {
       
   200             return iOperation->ProgressL();
       
   201             }
       
   202         }
       
   203 
       
   204     return iBlank;
       
   205     }
       
   206 
       
   207 // ----------------------------------------------------------------------------
       
   208 // CIpsPlgDeleteRemote::StartNextDeleteLocally
       
   209 // ----------------------------------------------------------------------------
       
   210 //
       
   211 void CIpsPlgDeleteRemote::StartNextDeleteLocally()
       
   212     {
       
   213     FUNC_LOG;
       
   214     iState = EDeletingMessagesStateLocally;
       
   215     iStatus = KRequestPending;
       
   216     
       
   217     TRAPD( err, MakeNextDeleteLocallyL() );
       
   218     SetActive();
       
   219     // if error then complete this pass with the error code
       
   220     if ( err )
       
   221         {
       
   222         TRequestStatus* status = &iStatus;
       
   223         User::RequestComplete(status, err);
       
   224         }
       
   225     }
       
   226 
       
   227 // ----------------------------------------------------------------------------
       
   228 // CIpsPlgDeleteRemote::MakeNextDeleteLocallyL
       
   229 // ----------------------------------------------------------------------------
       
   230 //
       
   231 void CIpsPlgDeleteRemote::MakeNextDeleteLocallyL()
       
   232     {
       
   233     FUNC_LOG;
       
   234     delete iOperation;
       
   235     iOperation = NULL;
       
   236     iOperation = CIpsPlgDeleteLocal::NewL(
       
   237         *iEntrySelection, iMsvSession, iStatus );
       
   238     }
       
   239 
       
   240 // ----------------------------------------------------------------------------
       
   241 // CIpsPlgDeleteRemote::StartDeleteFromServer
       
   242 // ----------------------------------------------------------------------------
       
   243 //
       
   244 void CIpsPlgDeleteRemote::StartDeleteFromServer()
       
   245     {
       
   246     FUNC_LOG;
       
   247     iState = EDeletingMessagesStateFromServer;
       
   248     iStatus = KRequestPending;
       
   249     TRAPD( err, MakeDeleteFromServerL() );
       
   250 
       
   251     SetActive();
       
   252     // if error then complete this pass with the error code
       
   253     if ( err )
       
   254         {
       
   255         TRequestStatus* status = &iStatus;
       
   256         User::RequestComplete( status, err );
       
   257         }
       
   258     }
       
   259 
       
   260 // ----------------------------------------------------------------------------
       
   261 // CIpsPlgDeleteRemote::MakeDeleteFromServerL
       
   262 // ----------------------------------------------------------------------------
       
   263 //
       
   264 void CIpsPlgDeleteRemote::MakeDeleteFromServerL()
       
   265     {
       
   266     FUNC_LOG;
       
   267     delete iOperation;
       
   268     iOperation = NULL;
       
   269     iOperation = iEntry->DeleteL( *iEntrySelection, iStatus );
       
   270     }
       
   271 
       
   272 
       
   273 // <qmail>    
       
   274 // ----------------------------------------------------------------------------
       
   275 // CIpsPlgDeleteRemote::SetNextLocallyDeletedFlagL
       
   276 // ----------------------------------------------------------------------------
       
   277 //
       
   278 TBool CIpsPlgDeleteRemote::SetNextLocallyDeletedFlagL()
       
   279     {
       
   280     FUNC_LOG;
       
   281     
       
   282     delete iOperation;
       
   283     iOperation = NULL;
       
   284     
       
   285     delete iSetFlagEntry;
       
   286     iSetFlagEntry = NULL;
       
   287 
       
   288     TBool ret = EFalse;
       
   289     
       
   290     if ( iSetFlagIndex < iEntryCount )
       
   291         {
       
   292         TMsvId entryId = ( *iEntrySelection )[ iSetFlagIndex++ ];
       
   293         
       
   294         iSetFlagEntry = CMsvEntry::NewL( 
       
   295             iMsvSession, entryId, TMsvSelectionOrdering() );
       
   296         
       
   297         TMsvEntry tEntry = iSetFlagEntry->Entry();
       
   298 
       
   299         // Sets bit 32 of iMtmData1, used when msg deleted in Offline
       
   300         // and status hasn't updated to server (client entry still exists)
       
   301         tEntry.SetLocallyDeleted( ETrue );
       
   302 
       
   303         iOperation = iSetFlagEntry->ChangeL( tEntry, iStatus );
       
   304         
       
   305         ret = ETrue;
       
   306         }
       
   307     
       
   308     return ret;
       
   309     }
       
   310 // </qmail>    
       
   311 
       
   312 //  End of File
       
   313 
       
   314