ximpfw/presence/srcpresenceoperations/presencewatching/operationsubscribepresentitypresence.cpp
author hgs
Wed, 03 Nov 2010 09:32:20 +0530
changeset 51 61fad867f68e
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2006 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: implementation of COperationSubscribePresentityPresence
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <ximpprotocolconnection.h>
hgs
parents:
diff changeset
    20
#include <protocolpresencewatching.h>
hgs
parents:
diff changeset
    21
#include <protocolpresencefeatures.h>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include "operationsubscribepresentitypresence.h"
hgs
parents:
diff changeset
    24
#include "presenceinfofilterimp.h"
hgs
parents:
diff changeset
    25
#include "ximpidentityimp.h"
hgs
parents:
diff changeset
    26
#include "ximpobjecthelpers.h"
hgs
parents:
diff changeset
    27
#include "documentutils.h"
hgs
parents:
diff changeset
    28
#include "presencedatacacheimp.h"
hgs
parents:
diff changeset
    29
#include "ximppanics.h"
hgs
parents:
diff changeset
    30
#include "operationsynthesisesubscriptionevent.h"
hgs
parents:
diff changeset
    31
#include "ximprestrictedobjectcollectionimp.h"
hgs
parents:
diff changeset
    32
#include "ximphost.h"
hgs
parents:
diff changeset
    33
#include "ximpstatusimp.h"
hgs
parents:
diff changeset
    34
#include "ximppsccontextimp.h"
hgs
parents:
diff changeset
    35
#include "protocolpresencedatahostimp.h"
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
#include "ximptrace.h"
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
// ============================ MEMBER FUNCTIONS =============================
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    42
// COperationSubscribePresentityPresence::COperationSubscribePresentityPresence()
hgs
parents:
diff changeset
    43
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    44
//
hgs
parents:
diff changeset
    45
EXPORT_C COperationSubscribePresentityPresence::COperationSubscribePresentityPresence()
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
// COperationSubscribePresentityPresence::~COperationSubscribePresentityPresence()
hgs
parents:
diff changeset
    52
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    53
//
hgs
parents:
diff changeset
    54
COperationSubscribePresentityPresence::~COperationSubscribePresentityPresence()
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    delete iPif;
hgs
parents:
diff changeset
    57
    delete iMergedPif;
hgs
parents:
diff changeset
    58
    delete iIdentity;
hgs
parents:
diff changeset
    59
    if( iSubItem )
hgs
parents:
diff changeset
    60
        {
hgs
parents:
diff changeset
    61
        iSubItem->Close();
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
// COperationSubscribePresentityPresence::ConstructL()
hgs
parents:
diff changeset
    67
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    68
//
hgs
parents:
diff changeset
    69
void COperationSubscribePresentityPresence::ConstructL( const TDesC8& aParamPck )
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    RXIMPObjOwningPtrArray< HBufC8 > packArray;
hgs
parents:
diff changeset
    72
    CleanupClosePushL( packArray );
hgs
parents:
diff changeset
    73
    TXIMPHBuf8Packer::UnPackArrayL( packArray, aParamPck );
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    iIdentity = CXIMPIdentityImp::NewLC();
hgs
parents:
diff changeset
    76
    CleanupStack::Pop( iIdentity );
hgs
parents:
diff changeset
    77
    TXIMPObjectPacker< CXIMPIdentityImp >::UnPackL( *iIdentity, *( packArray[ 0 ] ) );
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    iPif = CPresenceInfoFilterImp::NewLC();
hgs
parents:
diff changeset
    80
    CleanupStack::Pop( iPif );
hgs
parents:
diff changeset
    81
    TXIMPObjectPacker< CPresenceInfoFilterImp >::UnPackL( *iPif, *( packArray[ 1 ] ) );
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
    CleanupStack::PopAndDestroy(); // packArray
hgs
parents:
diff changeset
    84
    }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    88
// COperationSubscribePresentityPresence::ProcessL()
hgs
parents:
diff changeset
    89
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
//
hgs
parents:
diff changeset
    91
void COperationSubscribePresentityPresence::ProcessL()
hgs
parents:
diff changeset
    92
    {
hgs
parents:
diff changeset
    93
    TRACE(_L("COperationSubscribePresentityPresence::ProcessL()" ) );
hgs
parents:
diff changeset
    94
    CXIMPOperationBase::ProcessL();
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    // MatchAddressTo( subscriptions, iIdentity )
hgs
parents:
diff changeset
    97
    CPresentityPresenceSubscriptionItem& subItem =
hgs
parents:
diff changeset
    98
                iMyHost->PresenceDataAccess().PresenceDataCache().PresentityPresenceSubscriptionItemLC( *iIdentity );
hgs
parents:
diff changeset
    99
    CleanupStack::Pop(); // subItem
hgs
parents:
diff changeset
   100
    iSubItem = &subItem;
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
    // Get the subscription status
hgs
parents:
diff changeset
   103
    // Notice that if there is more than one client and clients are using identity
hgs
parents:
diff changeset
   104
    // which will alternate for request complete, this will affect wrong logic mapping
hgs
parents:
diff changeset
   105
    // for subscription operation. 
hgs
parents:
diff changeset
   106
    
hgs
parents:
diff changeset
   107
    // For example: Client 1 is subscription "name" and server alters it to name@domain.com
hgs
parents:
diff changeset
   108
    // Client 2 subscribes with "name" and it will get subscription status ENotSubscribedAtAll
hgs
parents:
diff changeset
   109
    // when it should get ESubscribedForOtherCtxOnly.
hgs
parents:
diff changeset
   110
    iSubscriptionStatus = iSubItem->SubscriptionStatus( iContext );
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    MProtocolPresenceWatching& watching = iMyHost->GetConnection().ProtocolPresenceFeatures().PresenceWatching();
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    switch( iSubscriptionStatus )
hgs
parents:
diff changeset
   115
        {
hgs
parents:
diff changeset
   116
        case CPresentityPresenceSubscriptionItem::ENotSubscribedAtAll:
hgs
parents:
diff changeset
   117
            {
hgs
parents:
diff changeset
   118
            TRACE(_L("COperationSubscribePresentityPresence::ProcessL() not subscribed" ) );
hgs
parents:
diff changeset
   119
            iMergedPif = TXIMPObjectCloner< CPresenceInfoFilterImp >::CloneL( *iPif );
hgs
parents:
diff changeset
   120
            // If this leaves, subscription is not created
hgs
parents:
diff changeset
   121
            watching.DoSubscribePresentityPresenceL( iSubItem->Identity(),
hgs
parents:
diff changeset
   122
                    *iMergedPif,
hgs
parents:
diff changeset
   123
                    iReqId );
hgs
parents:
diff changeset
   124
            break;
hgs
parents:
diff changeset
   125
            }
hgs
parents:
diff changeset
   126
        case CPresentityPresenceSubscriptionItem::ESubscribedForOtherCtxOnly:
hgs
parents:
diff changeset
   127
            {
hgs
parents:
diff changeset
   128
            TRACE(_L("COperationSubscribePresentityPresence::ProcessL() subscribed for other ctx" ) );
hgs
parents:
diff changeset
   129
            // Aggregate subscription and context pifs
hgs
parents:
diff changeset
   130
            // Check aggregate and if needed.. update subscription
hgs
parents:
diff changeset
   131
            iMergedPif = DocumentUtils::InfoFilterUnionL( iSubItem->SubscriptionPif(), *iPif );
hgs
parents:
diff changeset
   132
            if( iMergedPif->Contains( iSubItem->SubscriptionPif() ) )
hgs
parents:
diff changeset
   133
                {
hgs
parents:
diff changeset
   134
                TRACE(_L("COperationSubscribePresentityPresence::ProcessL() DoUpdatePresentityPresenceSubscriptionPifL 1" ) );
hgs
parents:
diff changeset
   135
                // If this leaves, subscription is not created
hgs
parents:
diff changeset
   136
                watching.DoUpdatePresentityPresenceSubscriptionPifL( *iIdentity, *iMergedPif, iReqId );
hgs
parents:
diff changeset
   137
                }
hgs
parents:
diff changeset
   138
            else
hgs
parents:
diff changeset
   139
                {
hgs
parents:
diff changeset
   140
                TRACE(_L("COperationSubscribePresentityPresence::ProcessL() FakeCompleteRequest" ) );
hgs
parents:
diff changeset
   141
                iMyHost->FakeCompleteRequest( iReqId, KErrNone );
hgs
parents:
diff changeset
   142
                }
hgs
parents:
diff changeset
   143
            break;
hgs
parents:
diff changeset
   144
            }
hgs
parents:
diff changeset
   145
        case CPresentityPresenceSubscriptionItem::ESubscribedForCtxOnly:
hgs
parents:
diff changeset
   146
        case CPresentityPresenceSubscriptionItem::ESubscribedForCtxAndOthers:
hgs
parents:
diff changeset
   147
            {
hgs
parents:
diff changeset
   148
            TRACE(_L("COperationSubscribePresentityPresence::ProcessL() subscribed" ) );
hgs
parents:
diff changeset
   149
            CPresenceInfoFilterImp* oldPif = 
hgs
parents:
diff changeset
   150
                    iContext->PresenceInfoFilter( MXIMPPscContext::EPresentityPresenceFilter, iIdentity );
hgs
parents:
diff changeset
   151
            CPresenceInfoFilterImp& oldMergedPif = iSubItem->SubscriptionPif();
hgs
parents:
diff changeset
   152
            TBool fake( ETrue );
hgs
parents:
diff changeset
   153
            TBool makeUnion( EFalse );
hgs
parents:
diff changeset
   154
            if( !oldPif )
hgs
parents:
diff changeset
   155
                {
hgs
parents:
diff changeset
   156
                TRACE(_L("COperationSubscribePresentityPresence::ProcessL() no old pif" ) );
hgs
parents:
diff changeset
   157
                makeUnion = ETrue;
hgs
parents:
diff changeset
   158
                }
hgs
parents:
diff changeset
   159
            else if ( *oldPif != *iPif ) 
hgs
parents:
diff changeset
   160
                {
hgs
parents:
diff changeset
   161
                makeUnion = ETrue;
hgs
parents:
diff changeset
   162
                }
hgs
parents:
diff changeset
   163
            if( makeUnion )
hgs
parents:
diff changeset
   164
                {
hgs
parents:
diff changeset
   165
                iDoNotForce = ETrue;
hgs
parents:
diff changeset
   166
                CPresenceInfoFilterImp* withoutPif = 
hgs
parents:
diff changeset
   167
                            iSubItem->CollectSubscriptionPifWithoutCtxL( iContext );
hgs
parents:
diff changeset
   168
                iMergedPif = DocumentUtils::InfoFilterUnionL( *withoutPif, *iPif );
hgs
parents:
diff changeset
   169
                if( iMergedPif->Contains( oldMergedPif ) )
hgs
parents:
diff changeset
   170
                    {
hgs
parents:
diff changeset
   171
                    fake = EFalse;
hgs
parents:
diff changeset
   172
                    TRACE(_L("COperationSubscribePresentityPresence::ProcessL() DoUpdatePresentityPresenceSubscriptionPifL 2" ) );
hgs
parents:
diff changeset
   173
                    watching.DoUpdatePresentityPresenceSubscriptionPifL( *iIdentity, *iMergedPif, iReqId );
hgs
parents:
diff changeset
   174
                    }
hgs
parents:
diff changeset
   175
                }
hgs
parents:
diff changeset
   176
            else
hgs
parents:
diff changeset
   177
                {
hgs
parents:
diff changeset
   178
                iMergedPif = TXIMPObjectCloner< CPresenceInfoFilterImp >::CloneL( oldMergedPif );
hgs
parents:
diff changeset
   179
                }
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
            if( fake )
hgs
parents:
diff changeset
   182
                {
hgs
parents:
diff changeset
   183
                TRACE(_L("COperationSubscribePresentityPresence::ProcessL() FakeCompleteRequest" ) );
hgs
parents:
diff changeset
   184
                iMyHost->FakeCompleteRequest( iReqId, KErrNone );
hgs
parents:
diff changeset
   185
                }
hgs
parents:
diff changeset
   186
            break;
hgs
parents:
diff changeset
   187
            }
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
        XIMP_DEFAULT_CASE_UNSUPPORTED( NXIMPPrivPanic::EInvalidSubscriptionStatus );
hgs
parents:
diff changeset
   190
        }
hgs
parents:
diff changeset
   191
    }
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   194
// COperationSubscribePresentityPresence::RequestCompletedL()
hgs
parents:
diff changeset
   195
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   196
//
hgs
parents:
diff changeset
   197
void COperationSubscribePresentityPresence::RequestCompletedL()
hgs
parents:
diff changeset
   198
    {
hgs
parents:
diff changeset
   199
    TRACE(_L("COperationSubscribePresentityPresence::RequestCompletedL()" ) );
hgs
parents:
diff changeset
   200
    CXIMPOperationBase::RequestCompletedL();
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
    if( iStatusObj->ResultCode() == KErrNone )
hgs
parents:
diff changeset
   203
        {
hgs
parents:
diff changeset
   204
        if( iSubscriptionStatus == CPresentityPresenceSubscriptionItem::ENotSubscribedAtAll )
hgs
parents:
diff changeset
   205
            {
hgs
parents:
diff changeset
   206
            TRACE(_L("COperationSubscribePresentityPresence::RequestCompletedL() ENotSubscribedAtAll" ) );
hgs
parents:
diff changeset
   207
            MXIMPBase* object = NULL; 
hgs
parents:
diff changeset
   208
            iObjCollection->GetByType( object, MXIMPIdentity::KInterfaceId );
hgs
parents:
diff changeset
   209
            if( object )
hgs
parents:
diff changeset
   210
                {
hgs
parents:
diff changeset
   211
                TRACE(_L("COperationSubscribePresentityPresence::RequestCompletedL() identity change" ) );
hgs
parents:
diff changeset
   212
                delete iIdentity;
hgs
parents:
diff changeset
   213
                iIdentity = TXIMPGetImpClassOrPanic< CXIMPIdentityImp >::From( *object );
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
                // Got altered identity. If it differs from original
hgs
parents:
diff changeset
   216
                // we'll create a new subscription item and close the old.
hgs
parents:
diff changeset
   217
                CPresentityPresenceSubscriptionItem& altSubItem = 
hgs
parents:
diff changeset
   218
                    iMyHost->PresenceDataAccess().PresenceDataCache().PresentityPresenceSubscriptionItemLC( *iIdentity );
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
                iSubItem->Close();
hgs
parents:
diff changeset
   221
                iSubItem = &altSubItem;
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
                CleanupStack::Pop(); // altSubItem                    
hgs
parents:
diff changeset
   224
                }            
hgs
parents:
diff changeset
   225
            }
hgs
parents:
diff changeset
   226
            
hgs
parents:
diff changeset
   227
        if( iSubscriptionStatus == CPresentityPresenceSubscriptionItem::ENotSubscribedAtAll ||
hgs
parents:
diff changeset
   228
            iSubscriptionStatus == CPresentityPresenceSubscriptionItem::ESubscribedForOtherCtxOnly )
hgs
parents:
diff changeset
   229
            {
hgs
parents:
diff changeset
   230
            TRACE(_L("COperationSubscribePresentityPresence::RequestCompletedL() calling iSubItem->AddSubscriberL" ) );
hgs
parents:
diff changeset
   231
            TInt error ( KErrNone );
hgs
parents:
diff changeset
   232
            TRAP( error, iSubItem->AddSubscriberL( iContext ) );
hgs
parents:
diff changeset
   233
            TRACE_1( _L("COperationSubscribePresentityPresence::RequestCompletedL():  iSubItem->AddSubscriberL : error =%d"), error );
hgs
parents:
diff changeset
   234
            }
hgs
parents:
diff changeset
   235
            
hgs
parents:
diff changeset
   236
        iContext->SetPresenceInfoFilterL( MXIMPPscContext::EPresentityPresenceFilter,
hgs
parents:
diff changeset
   237
                iPif, iIdentity );
hgs
parents:
diff changeset
   238
        iPif = NULL;
hgs
parents:
diff changeset
   239
        iSubItem->SetSubscriptionPif( iMergedPif );
hgs
parents:
diff changeset
   240
        iMergedPif = NULL;
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
        SynthesiseEventL();
hgs
parents:
diff changeset
   243
        }
hgs
parents:
diff changeset
   244
    }
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   248
// COperationSubscribePresentityPresence::Type()
hgs
parents:
diff changeset
   249
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   250
//
hgs
parents:
diff changeset
   251
TInt
hgs
parents:
diff changeset
   252
    COperationSubscribePresentityPresence::Type() const
hgs
parents:
diff changeset
   253
    {
hgs
parents:
diff changeset
   254
    return NPresenceOps::EPrSubscribePresentityPresence;
hgs
parents:
diff changeset
   255
    }
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   258
// COperationSubscribePresentityPresence::SynthesiseEventL()
hgs
parents:
diff changeset
   259
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   260
//
hgs
parents:
diff changeset
   261
void COperationSubscribePresentityPresence::SynthesiseEventL()
hgs
parents:
diff changeset
   262
    {
hgs
parents:
diff changeset
   263
    TBool force =
hgs
parents:
diff changeset
   264
    ( iSubscriptionStatus == CPresentityPresenceSubscriptionItem::ESubscribedForCtxOnly ||
hgs
parents:
diff changeset
   265
      iSubscriptionStatus == CPresentityPresenceSubscriptionItem::ESubscribedForCtxAndOthers ) ? ETrue : EFalse;
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
    COperationSynthesiseSubscriptionEvent* synthOp =
hgs
parents:
diff changeset
   268
            new ( ELeave ) COperationSynthesiseSubscriptionEvent(
hgs
parents:
diff changeset
   269
                COperationSynthesiseSubscriptionEvent::EPresentityPresence, force && !iDoNotForce  );
hgs
parents:
diff changeset
   270
    CleanupStack::PushL( synthOp );
hgs
parents:
diff changeset
   271
    synthOp->BaseConstructL( TXIMPRequestId(), iContext );
hgs
parents:
diff changeset
   272
    synthOp->ConstructL( *iIdentity );
hgs
parents:
diff changeset
   273
    iMyHost->AddNewOperationL( *synthOp );
hgs
parents:
diff changeset
   274
    CleanupStack::Pop( synthOp );
hgs
parents:
diff changeset
   275
    }
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
// End of file