ximpfw/presence/srcpresencecache/presencecacheclient/presencecacheclientnotification.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) 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:  Implementation for presence cache client.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <e32std.h>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <prescachereadhandler.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "presencecacheclientnotification.h"
hgs
parents:
diff changeset
    23
#include "presencecachedefs.h"
hgs
parents:
diff changeset
    24
#include "ximpobjecthelpers.h"
hgs
parents:
diff changeset
    25
#include "presenceinfoimp.h"
hgs
parents:
diff changeset
    26
#include "presencebuddyinfoimp.h"
hgs
parents:
diff changeset
    27
#include "personpresenceinfoimp.h"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// ============================ MEMBER FUNCTIONS =============================
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    32
// CPresenceCacheClientNotification::NewL
hgs
parents:
diff changeset
    33
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    34
//
hgs
parents:
diff changeset
    35
CPresenceCacheClientNotification* CPresenceCacheClientNotification::NewL(
hgs
parents:
diff changeset
    36
    CPresenceCacheClient& aClient)
hgs
parents:
diff changeset
    37
    {
hgs
parents:
diff changeset
    38
    CPresenceCacheClientNotification* self = new(ELeave)CPresenceCacheClientNotification(aClient);
hgs
parents:
diff changeset
    39
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    40
    self->ConstructL();
hgs
parents:
diff changeset
    41
    CleanupStack::Pop();
hgs
parents:
diff changeset
    42
    return self;    
hgs
parents:
diff changeset
    43
    }
hgs
parents:
diff changeset
    44
    
hgs
parents:
diff changeset
    45
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
// CPresenceCacheClientNotification::~CPresenceCacheClientNotification
hgs
parents:
diff changeset
    47
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
//
hgs
parents:
diff changeset
    49
CPresenceCacheClientNotification::~CPresenceCacheClientNotification()
hgs
parents:
diff changeset
    50
    {
hgs
parents:
diff changeset
    51
    Cancel();
hgs
parents:
diff changeset
    52
    }
hgs
parents:
diff changeset
    53
    
hgs
parents:
diff changeset
    54
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    55
// CPresenceCacheClientNotification::CPresenceCacheClientNotification
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    57
//
hgs
parents:
diff changeset
    58
CPresenceCacheClientNotification::CPresenceCacheClientNotification(CPresenceCacheClient& aClient)
hgs
parents:
diff changeset
    59
: CActive( EPriorityStandard ), iClient( aClient ), iNotificationSubscribed( EFalse )
hgs
parents:
diff changeset
    60
    {        
hgs
parents:
diff changeset
    61
    }
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    64
// CPresenceCacheClientNotification::ConstructL
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
//
hgs
parents:
diff changeset
    67
void CPresenceCacheClientNotification::ConstructL()
hgs
parents:
diff changeset
    68
    {
hgs
parents:
diff changeset
    69
    CActiveScheduler::Add( this );   
hgs
parents:
diff changeset
    70
    }
hgs
parents:
diff changeset
    71
    
hgs
parents:
diff changeset
    72
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    73
// CPresenceCacheClientNotification::RunL
hgs
parents:
diff changeset
    74
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    75
//
hgs
parents:
diff changeset
    76
void CPresenceCacheClientNotification::RunL()
hgs
parents:
diff changeset
    77
    {    
hgs
parents:
diff changeset
    78
    TInt origStatus = iStatus.Int();
hgs
parents:
diff changeset
    79
    
hgs
parents:
diff changeset
    80
    MPresCacheReadHandler* client = ClientNotifyHandler();    
hgs
parents:
diff changeset
    81
    
hgs
parents:
diff changeset
    82
    if ( origStatus )
hgs
parents:
diff changeset
    83
        {
hgs
parents:
diff changeset
    84
        iNotificationSubscribed = EFalse;        
hgs
parents:
diff changeset
    85
        TRAP_IGNORE( client->HandlePresenceNotificationL( origStatus, NULL ));
hgs
parents:
diff changeset
    86
        }
hgs
parents:
diff changeset
    87
    else
hgs
parents:
diff changeset
    88
        {
hgs
parents:
diff changeset
    89
        StartNotifySubscription();        
hgs
parents:
diff changeset
    90
        PreseneceFromServerToClientL( *client, iSizePckg() );
hgs
parents:
diff changeset
    91
        }              
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
// ----------------------------------------------------------
hgs
parents:
diff changeset
    94
// CPresenceCacheClientNotification::RunError
hgs
parents:
diff changeset
    95
// ----------------------------------------------------------
hgs
parents:
diff changeset
    96
//
hgs
parents:
diff changeset
    97
TInt CPresenceCacheClientNotification::RunError( TInt aError )
hgs
parents:
diff changeset
    98
    {         
hgs
parents:
diff changeset
    99
    if ( KErrServerTerminated == aError )
hgs
parents:
diff changeset
   100
        {
hgs
parents:
diff changeset
   101
        // When server is terminated we notify the clienrt about that
hgs
parents:
diff changeset
   102
        iNotificationSubscribed = EFalse;         
hgs
parents:
diff changeset
   103
        MPresCacheReadHandler* client = ClientNotifyHandler();
hgs
parents:
diff changeset
   104
        TRAP_IGNORE( client->HandlePresenceNotificationL( aError, NULL ));        
hgs
parents:
diff changeset
   105
        }
hgs
parents:
diff changeset
   106
    else
hgs
parents:
diff changeset
   107
        {
hgs
parents:
diff changeset
   108
        // StartNotifySubscription is already called.
hgs
parents:
diff changeset
   109
        }
hgs
parents:
diff changeset
   110
    return KErrNone;    
hgs
parents:
diff changeset
   111
    } 
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   114
// CPresenceCacheClientNotification::DoCancel
hgs
parents:
diff changeset
   115
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   116
//
hgs
parents:
diff changeset
   117
void CPresenceCacheClientNotification::DoCancel()
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
    // TODO: consider when this is safe
hgs
parents:
diff changeset
   120
    iClient.SendReceive( NRequest::ECancelWaitingForNotification );
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   124
// CPresenceCacheClientNotification::SubscribePresenceBuddyChangeL
hgs
parents:
diff changeset
   125
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   126
//    
hgs
parents:
diff changeset
   127
TInt CPresenceCacheClientNotification::SubscribePresenceBuddyChangeL(
hgs
parents:
diff changeset
   128
	const MXIMPIdentity& aIdentity)
hgs
parents:
diff changeset
   129
    {       
hgs
parents:
diff changeset
   130
    if ( !iNotificationSubscribed )
hgs
parents:
diff changeset
   131
        {
hgs
parents:
diff changeset
   132
        StartNotifySubscription();
hgs
parents:
diff changeset
   133
        }
hgs
parents:
diff changeset
   134
    
hgs
parents:
diff changeset
   135
    HBufC8* myIdPack = iClient.PackIdentityLC(aIdentity);                
hgs
parents:
diff changeset
   136
                      
hgs
parents:
diff changeset
   137
    // Package message arguments before sending to the server
hgs
parents:
diff changeset
   138
    TIpcArgs args;
hgs
parents:
diff changeset
   139
    args.Set(1, myIdPack);  
hgs
parents:
diff changeset
   140
        
hgs
parents:
diff changeset
   141
    TInt err = iClient.SendReceive( NRequest::ESubscribeBuddyPresenceChange, args ); 
hgs
parents:
diff changeset
   142
    CleanupStack::PopAndDestroy( myIdPack );    
hgs
parents:
diff changeset
   143
        
hgs
parents:
diff changeset
   144
    return err;
hgs
parents:
diff changeset
   145
    }
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   148
// CPresenceCacheClientNotification::UnsubscribePresenceBuddyChangeL
hgs
parents:
diff changeset
   149
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   150
//    
hgs
parents:
diff changeset
   151
void CPresenceCacheClientNotification::UnsubscribePresenceBuddyChangeL(
hgs
parents:
diff changeset
   152
	const MXIMPIdentity& aIdentity)
hgs
parents:
diff changeset
   153
    {           
hgs
parents:
diff changeset
   154
    HBufC8* myIdPack = iClient.PackIdentityLC(aIdentity);                
hgs
parents:
diff changeset
   155
                      
hgs
parents:
diff changeset
   156
    // Package message arguments before sending to the server
hgs
parents:
diff changeset
   157
    TIpcArgs args;
hgs
parents:
diff changeset
   158
    args.Set(1, myIdPack);  
hgs
parents:
diff changeset
   159
        
hgs
parents:
diff changeset
   160
    TInt err = iClient.SendReceive( NRequest::EUnSubscribeBuddyPresenceChange, args );        
hgs
parents:
diff changeset
   161
    CleanupStack::PopAndDestroy( myIdPack );
hgs
parents:
diff changeset
   162
    User::LeaveIfError( err );
hgs
parents:
diff changeset
   163
    }
hgs
parents:
diff changeset
   164
 
hgs
parents:
diff changeset
   165
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   166
// CPresenceCacheClientNotification::StartNotifySubscriptionL
hgs
parents:
diff changeset
   167
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   168
//    
hgs
parents:
diff changeset
   169
void CPresenceCacheClientNotification::StartNotifySubscription()
hgs
parents:
diff changeset
   170
    {                                    
hgs
parents:
diff changeset
   171
    // Package message arguments before sending to the server
hgs
parents:
diff changeset
   172
    SetActive();
hgs
parents:
diff changeset
   173
    TIpcArgs args(&iSizePckg);            
hgs
parents:
diff changeset
   174
    iClient.SendReceive( NRequest::EWaitingForNotification, args, iStatus );
hgs
parents:
diff changeset
   175
    iNotificationSubscribed = ETrue;
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   179
// CPresenceCacheClientNotification::ClientNotifyHandler
hgs
parents:
diff changeset
   180
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   181
//    
hgs
parents:
diff changeset
   182
MPresCacheReadHandler* CPresenceCacheClientNotification::ClientNotifyHandler()
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
	return iClient.iNotifyClient;
hgs
parents:
diff changeset
   185
    }
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   188
// CPresenceCacheClientNotification::PreseneceFromServerToClientL
hgs
parents:
diff changeset
   189
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   190
//    
hgs
parents:
diff changeset
   191
void CPresenceCacheClientNotification::PreseneceFromServerToClientL( 
hgs
parents:
diff changeset
   192
    MPresCacheReadHandler& aClient, TInt aSize )
hgs
parents:
diff changeset
   193
    {       
hgs
parents:
diff changeset
   194
    CPresenceBuddyInfoImp* buddyInfo(NULL);
hgs
parents:
diff changeset
   195
    buddyInfo = CPresenceBuddyInfoImp::NewLC();
hgs
parents:
diff changeset
   196
    HBufC8* presInfoDes = HBufC8::NewLC( aSize );
hgs
parents:
diff changeset
   197
    TPtr8 ptrBuf( presInfoDes->Des() );
hgs
parents:
diff changeset
   198
    TInt err = iClient.SendReceive( NRequest::EGetLastNotifiedtPacket, TIpcArgs( &ptrBuf ));    
hgs
parents:
diff changeset
   199
    if ( !err )
hgs
parents:
diff changeset
   200
        {
hgs
parents:
diff changeset
   201
        TXIMPObjectPacker< CPresenceBuddyInfoImp >::UnPackL( *buddyInfo, *presInfoDes );
hgs
parents:
diff changeset
   202
        CleanupStack::PopAndDestroy( presInfoDes );                          
hgs
parents:
diff changeset
   203
        aClient.HandlePresenceNotificationL( KErrNone, buddyInfo );
hgs
parents:
diff changeset
   204
        CleanupStack::Pop( buddyInfo );         
hgs
parents:
diff changeset
   205
        }
hgs
parents:
diff changeset
   206
    else
hgs
parents:
diff changeset
   207
        {
hgs
parents:
diff changeset
   208
        CleanupStack::PopAndDestroy( presInfoDes );         
hgs
parents:
diff changeset
   209
        CleanupStack::PopAndDestroy( buddyInfo );          
hgs
parents:
diff changeset
   210
        }
hgs
parents:
diff changeset
   211
    }
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
// end of file