PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransSync.cpp
branchRCL_3
changeset 17 a941bc465d9f
parent 0 094583676ce7
equal deleted inserted replaced
16:6ca72c0fe49a 17:a941bc465d9f
       
     1 /*
       
     2 * Copyright (c) 2005 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:  Handler to synchronize contact list
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDE FILES
       
    19 #include "CPEngContactListTransSync.h"
       
    20 
       
    21 #include "CPEngContactListModItemContainer.h"
       
    22 #include "CPEngContactListSettings.h"
       
    23 #include "CPEngContactListModBase.h"
       
    24 
       
    25 #include "PEngListLibTools.h"
       
    26 #include "MPEngXMLSerializer.h"
       
    27 #include "MPEngXMLParser.h"
       
    28 
       
    29 #include "CPEngTransactionStatus.h"
       
    30 #include "PEngWVPresenceErrors2.h"
       
    31 
       
    32 #include "CPEngContactListMngTransProperties.h"
       
    33 #include "CPEngContactListMngTransAddId.h"
       
    34 #include "CPEngContactListMngTransRemoveId.h"
       
    35 
       
    36 #include "PresenceDebugPrint.h"
       
    37 
       
    38 
       
    39 //Default granurality for list of additional handlers
       
    40 const TInt KHandlerListGranurality = 3;
       
    41 
       
    42 
       
    43 // ============================ MEMBER FUNCTIONS ===============================
       
    44 
       
    45 // -----------------------------------------------------------------------------
       
    46 // CPEngContactListTransSync::CPEngContactListTransSync()
       
    47 // -----------------------------------------------------------------------------
       
    48 //
       
    49 CPEngContactListTransSync::CPEngContactListTransSync(
       
    50     CPEngContactListModBase& aContactList,
       
    51     CPEngSessionSlotId& aSessionSlotId,
       
    52     MPEngContactListTransactionManager& aManager,
       
    53     TPEngWVCspVersion& aCSPVersion,
       
    54     TInt aOperationId )
       
    55         : CPEngContactListTransBase( aContactList,
       
    56                                      aSessionSlotId,
       
    57                                      aManager,
       
    58                                      aCSPVersion,
       
    59                                      aOperationId ),
       
    60         iAdditionalHandlers( KHandlerListGranurality )
       
    61     {
       
    62     PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::CPEngContactListTransSync() [%S]" ),
       
    63              &( iContactList.ListProperties().Name() ) );
       
    64     }
       
    65 
       
    66 // -----------------------------------------------------------------------------
       
    67 // CPEngContactListTransSync::ConstructL()
       
    68 // -----------------------------------------------------------------------------
       
    69 //
       
    70 void CPEngContactListTransSync::ConstructL( )
       
    71     {
       
    72     CPEngContactListTransBase::ConstructL();
       
    73     iContactListSyncState = EPEngCntListFetch;
       
    74     }
       
    75 
       
    76 
       
    77 // -----------------------------------------------------------------------------
       
    78 // CPEngContactListTransSync::NewLC()
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 CPEngContactListTransSync* CPEngContactListTransSync::NewLC(
       
    82     CPEngContactListModBase& aContactList,
       
    83     CPEngSessionSlotId& aSessionSlotId,
       
    84     MPEngContactListTransactionManager& aManager,
       
    85     TPEngWVCspVersion& aCSPVersion,
       
    86     TInt aOperationId )
       
    87     {
       
    88     CPEngContactListTransSync* self = new ( ELeave ) CPEngContactListTransSync(
       
    89         aContactList,
       
    90         aSessionSlotId,
       
    91         aManager,
       
    92         aCSPVersion,
       
    93         aOperationId );
       
    94 
       
    95     CleanupStack::PushL( self );
       
    96     self->ConstructL();
       
    97     return self;
       
    98     }
       
    99 
       
   100 
       
   101 // Destructor
       
   102 CPEngContactListTransSync::~CPEngContactListTransSync()
       
   103     {
       
   104     iAdditionalHandlers.ResetAndDestroy();
       
   105     }
       
   106 
       
   107 
       
   108 // =============================================================================
       
   109 // =============== From MPEngOutgoingTransactionHandler ========================
       
   110 // =============================================================================
       
   111 
       
   112 
       
   113 // -----------------------------------------------------------------------------
       
   114 // CPEngContactListTransSync::NewTransactionHandlersL()
       
   115 // -----------------------------------------------------------------------------
       
   116 //
       
   117 void CPEngContactListTransSync::NewTransactionHandlersL(
       
   118     RPointerArray<MPEngOutgoingTransactionHandler>& aTransactionsArray )
       
   119     {
       
   120     for ( TInt x( iAdditionalHandlers.Count() - 1 ) ; x >= 0 ; --x )
       
   121         {
       
   122         aTransactionsArray.AppendL( iAdditionalHandlers[ x ] );
       
   123         iAdditionalHandlers.Remove( x );
       
   124         }
       
   125     }
       
   126 
       
   127 
       
   128 
       
   129 // =============================================================================
       
   130 // =============== From CPEngSyncContactList ===================================
       
   131 // =============================================================================
       
   132 
       
   133 
       
   134 // -----------------------------------------------------------------------------
       
   135 // CPEngContactListTransSync::DoGetXMLCreateCntListL()
       
   136 // -----------------------------------------------------------------------------
       
   137 //
       
   138 void CPEngContactListTransSync::DoGetXMLCreateCntListL(
       
   139     MPEngXMLSerializer& /*aXmlSerializer*/ )
       
   140     {
       
   141     }
       
   142 
       
   143 
       
   144 // -----------------------------------------------------------------------------
       
   145 // CPEngContactListTransSync::DoParseCreateCntListResponseL()
       
   146 // -----------------------------------------------------------------------------
       
   147 //
       
   148 void CPEngContactListTransSync::DoParseCreateCntListResponseL(
       
   149     const TDesC8& /*aResponse*/,
       
   150     MPEngXMLParser& /*aXMLparser*/ )
       
   151     {
       
   152     }
       
   153 
       
   154 
       
   155 // -----------------------------------------------------------------------------
       
   156 // CPEngContactListTransSync::DoGetXMLFetchCntListL()
       
   157 // -----------------------------------------------------------------------------
       
   158 //
       
   159 void CPEngContactListTransSync::DoGetXMLFetchCntListL(
       
   160     MPEngXMLSerializer& aXmlSerializer )
       
   161     {
       
   162     // <ListManage-Request>
       
   163     aXmlSerializer.StartTagL( KListMnageRequest );
       
   164 
       
   165     NListLibTools::AppendContactListNameXmlL( aXmlSerializer, iContactList.Settings() );
       
   166 
       
   167     // <ReceiveList>T</ReceiveList>
       
   168     NListLibTools::ApppendReceiveListTagL( aXmlSerializer, iCSPVersion, ETrue );
       
   169 
       
   170     // </ListManage-Request>
       
   171     aXmlSerializer.EndTagL( KListMnageRequest );
       
   172     }
       
   173 
       
   174 
       
   175 // -----------------------------------------------------------------------------
       
   176 // CPEngContactListTransSync::DoParseFetchCntListResponseL()
       
   177 // -----------------------------------------------------------------------------
       
   178 //
       
   179 void CPEngContactListTransSync::DoParseFetchCntListResponseL(
       
   180     const TDesC8& aResponse,
       
   181     MPEngXMLParser& aXMLparser )
       
   182     {
       
   183     PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() [%S]" ),
       
   184              &( iContactList.ListProperties().Name() ) );
       
   185 
       
   186 
       
   187     RReffArray<CPEngContactListModItemContainer> newContacts;
       
   188     CleanupClosePushL( newContacts );
       
   189 
       
   190     if ( aXMLparser.DecodeL( aResponse, KCodeXMLTag, EFalse ) )
       
   191         {
       
   192         if ( 0 == aXMLparser.ResultL().CompareF( K200Code ) )
       
   193             {
       
   194             MPEngXMLParser* secondXMLparser = CreateXMLParserLC();
       
   195 
       
   196             // Nick name update flag
       
   197             TBool updateNickNames( !( iContactList.Settings().Property( KPEngCntLstSyncMaster,
       
   198                                                                         KPEngCntLstPropertyNativePermanent ) ) );
       
   199 
       
   200             // parse nick list of the contact list
       
   201             NListLibTools::ParseContactListNickListL( aResponse,
       
   202                                                       newContacts,
       
   203                                                       iContactList,
       
   204                                                       aXMLparser,
       
   205                                                       *secondXMLparser,
       
   206                                                       updateNickNames );
       
   207 
       
   208             ParsePropertiesL( aResponse,
       
   209                               aXMLparser,
       
   210                               *secondXMLparser );
       
   211 
       
   212             CleanupStack::PopAndDestroy( ); // secondXMLparser
       
   213             }
       
   214         else
       
   215             {
       
   216             iTransactionStatus->AddDetailedResultL( iOperationId,
       
   217                                                     KPEngNwErrContactListDoesNotExist,
       
   218                                                     NULL,
       
   219                                                     NULL,
       
   220                                                     &( iContactList.StorageId() ),
       
   221                                                     NULL );
       
   222 
       
   223             iTransactionStatus->SetStatus( KPEngNwErrContactListDoesNotExist );
       
   224 
       
   225             iContactList.Settings().DeletePropertyL( KPEngListExistsOnServer,
       
   226                                                      KPEngCntLstPropertyNativeCached );
       
   227             iContactListSyncState = EPEngTransactionCompleted;
       
   228 
       
   229             CleanupStack::PopAndDestroy(); // newContacts
       
   230 
       
   231             PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() [%S] done with error" ),
       
   232                      &( iContactList.ListProperties().Name() ) );
       
   233             return;
       
   234             }
       
   235         }
       
   236     else
       
   237         {
       
   238         // No code
       
   239         iTransactionStatus->AddDetailedResultL( iOperationId,
       
   240                                                 KPEngNwErrContactListDoesNotExist,
       
   241                                                 NULL,
       
   242                                                 NULL,
       
   243                                                 &( iContactList.StorageId() ),
       
   244                                                 NULL );
       
   245 
       
   246         iTransactionStatus->SetStatus( KPEngNwErrContactListDoesNotExist );
       
   247         iContactListSyncState = EPEngTransactionCompleted;
       
   248         CleanupStack::PopAndDestroy(); // newContacts
       
   249         PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() [%S] no response" ),
       
   250                  &( iContactList.ListProperties().Name() ) );
       
   251         return;
       
   252         }
       
   253 
       
   254 
       
   255     // Figure what is new and what has happened
       
   256     if ( iContactList.Settings().Property( KPEngCntLstSyncMaster,
       
   257                                            KPEngCntLstPropertyNativePermanent ) )
       
   258         {
       
   259         iContactList.AdoptNetworkViewL( newContacts );
       
   260         CreateMasterCntListUpdateHandlersL();
       
   261         }
       
   262     else
       
   263         {
       
   264         iContactList.AdoptNewContactsL( newContacts );
       
   265         }
       
   266     CleanupStack::PopAndDestroy(); //  newContacts
       
   267 
       
   268 
       
   269     // resolve new step for the handler
       
   270     if ( iContactList.Settings().Property( KPEngCntLstSubscribe,
       
   271                                            KPEngCntLstPropertyNativePermanent ) )
       
   272         {
       
   273         iContactListSyncState = EPEngSubscribeCntList;
       
   274         }
       
   275     else
       
   276         {
       
   277         CompleteCntListTransactionL();
       
   278         }
       
   279 
       
   280     PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() done [%S]" ),
       
   281              &( iContactList.ListProperties().Name() ) );
       
   282     }
       
   283 
       
   284 
       
   285 // -----------------------------------------------------------------------------
       
   286 // CPEngContactListTransSync::ParsePropertiesL()
       
   287 // -----------------------------------------------------------------------------
       
   288 //
       
   289 void CPEngContactListTransSync::ParsePropertiesL( const TDesC8& aResponse,
       
   290                                                   MPEngXMLParser& aXMLparser1,
       
   291                                                   MPEngXMLParser& aXMLparser2 )
       
   292     {
       
   293     if ( NListLibTools::ParseContactListPropertiesL( aResponse,
       
   294                                                      iContactList.Settings(),
       
   295                                                      aXMLparser1,
       
   296                                                      aXMLparser2 ) )
       
   297         {
       
   298         MPEngOutgoingTransactionHandler* newHandler =
       
   299             CPEngContactListMngTransProperties::NewLC( iContactList,
       
   300                                                        iManager,
       
   301                                                        iCSPVersion,
       
   302                                                        iOperationId );
       
   303 
       
   304         iAdditionalHandlers.AppendL( newHandler );
       
   305         CleanupStack::Pop(); // newHandler
       
   306         }
       
   307     }
       
   308 
       
   309 
       
   310 // -----------------------------------------------------------------------------
       
   311 // CPEngContactListTransSync::CreateMasterCntListUpdateHandlersL()
       
   312 // -----------------------------------------------------------------------------
       
   313 //
       
   314 void CPEngContactListTransSync::CreateMasterCntListUpdateHandlersL()
       
   315     {
       
   316     RPointerArray<CPEngContactListModItemContainer> nickList;
       
   317     CleanupClosePushL( nickList );
       
   318 
       
   319     iContactList.FillAddNickListL( nickList );
       
   320     if ( 0 != nickList.Count() )
       
   321         {
       
   322         MPEngOutgoingTransactionHandler* newHandler =
       
   323             CPEngContactListMngTransAddId::NewLC( iContactList,
       
   324                                                   iSessionSlotId,
       
   325                                                   iCSPVersion,
       
   326                                                   iOperationId );
       
   327         iAdditionalHandlers.AppendL( newHandler );
       
   328         CleanupStack::Pop(); // newHandler
       
   329         }
       
   330 
       
   331 
       
   332     nickList.Reset();
       
   333     iContactList.FillRemoveNickListL( nickList );
       
   334     if ( 0 != nickList.Count() )
       
   335         {
       
   336         MPEngOutgoingTransactionHandler* newHandler =
       
   337             CPEngContactListMngTransRemoveId::NewLC( iContactList,
       
   338                                                      iSessionSlotId,
       
   339                                                      iCSPVersion,
       
   340                                                      iOperationId );
       
   341 
       
   342         iAdditionalHandlers.AppendL( newHandler );
       
   343         CleanupStack::Pop(); // newHandler
       
   344         }
       
   345 
       
   346 
       
   347     CleanupStack::PopAndDestroy(); // nickList
       
   348     }
       
   349 
       
   350 
       
   351 //  End of File
       
   352 
       
   353 
       
   354 
       
   355 
       
   356 
       
   357 
       
   358 
       
   359 
       
   360 
       
   361 
       
   362 
       
   363 
       
   364 
       
   365 
       
   366 
       
   367 
       
   368 
       
   369 
       
   370 
       
   371 
       
   372