IMPSengine/client/src/impsgrouphandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:41:52 +0200
changeset 0 094583676ce7
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
* handler class for imps group feature.
*
*/


// INCLUDE FILES
#include <e32std.h>

#include "impsgroupcli.h"
#include "impsgrouphandler.h"
#include "impsgrouppropsint.h"
#include "impsfields.h"
#include "impserrors.h"
#include "impsservercommon.h"
#include "impsdataaccessor.h"
#include "impscdatautils.h"
#include "impsutils.h"
#include "impserrors.h"
#include "WVEngineInternalCRKeys.h"

// CONSTANTS
const TInt KArraySize = 4;

// MACROS
#ifndef _DEBUG
#define _NO_IMPS_LOGGING_
#endif

// ================= MEMBER FUNCTIONS =======================

// ----------------------------------------------------------------------------
// CImpsGroupHandler2::CImpsGroupHandler2
// ----------------------------------------------------------------------------
CImpsGroupHandler2::CImpsGroupHandler2( 
    TInt aPriority, 
    RImpsGroupClient2& aClient  ) :
    // The base class adds this to the scheduler
    CImpsHandler2( aPriority, aClient )
    {
    }

// ----------------------------------------------------------------------------
// CImpsGroupHandler2::NewL
// ----------------------------------------------------------------------------
CImpsGroupHandler2* CImpsGroupHandler2::NewL( 
     RImpsGroupClient2& aClient,
     TInt aPriority )
     {

      // Perform the construction.
      CImpsGroupHandler2* self = new (ELeave)
            CImpsGroupHandler2( aPriority, aClient);

      CleanupStack::PushL( self );
      self->CImpsHandler2::ConstructL();
      CleanupStack::Pop( self );

      return self;
     }
       
// ----------------------------------------------------------------------------
// CImpsGroupHandler2::~CImpsGroupHandler2()
// ----------------------------------------------------------------------------
 CImpsGroupHandler2::~CImpsGroupHandler2()
     {
     }


// ----------------------------------------------------------------------------
// CImpsGroupHandler2::HandleEventL()
// ----------------------------------------------------------------------------
void CImpsGroupHandler2::HandleEventL( CImpsFields* aErrorFields )
    {
    SImpsEventData* event = (SImpsEventData*)iEventData.Ptr(); 

#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::HandleEventL opid=%d cli=%d"), 
         event->iOpCode, (TInt)&iClient );
#endif

    // LeaveGroupResponse is a special case because of it can contain
    // reasonable data although having status code unequal 200.
    // First one is SAP initiated leavegroup response
    if ( event->iReqMesType == EImpsMessageNone &&  
         event->iMessageType == EImpsLeaveGroupRes )
        {
         TInt error = Imps_ERROR_BASE - event->iStatus ;
         if( error >= 800 && error < 900 
             || event->iStatus == KErrNone || error == 200 ) 
            {
            // NOTE
            // in case of sap initiated LeaveGroupResponse
            // the client needs the error code, so we need to
            // deliver it by calling also the error handler
            HandleErrorEventL( event->iOpCode, event->iStatus, aErrorFields );
            // call now the reqular handler
            HandleGroupEventL( ); 
            }
         else 
            {
            // If it is some other error code that 800-900 
            // then handle it as an error
            HandleErrorEventL( event->iOpCode, event->iStatus, aErrorFields );
            }
        }

    else 
        {
        if ( event->iStatus != ( Imps_ERROR_BASE - 200 ) &&
             event->iStatus != KErrNone )
            {
#ifndef _NO_IMPS_LOGGING_
            CImpsClientLogger::Log(
                _L("CImpsGroupHandler2: error event-iStatus=%d"), 
                event->iStatus);
#endif
            HandleErrorEventL( event->iOpCode, event->iStatus, aErrorFields );
            }
            // Call regular observer
            // iStatus is error code or message size
        else if ( iStatus >= 0 )
            {
            HandleGroupEventL( ); 
            }
        }
    }

// ----------------------------------------------------------------------------
// CImpsGroupHandler2::HandleGroupEventL()
// ----------------------------------------------------------------------------
void CImpsGroupHandler2::HandleGroupEventL( )
    {

#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::HandleGroupEventL begins"));
#endif

    SImpsEventData* event = (SImpsEventData*)iEventData.Ptr();
    RImpsGroupClient2& client = (RImpsGroupClient2&)iClient;
    MImpsGroupHandler2* handler = client.Handler();

    TInt err( KErrNone );

#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2: msgType= %x opId= %d"),event->iMessageType, event->iOpCode );
#endif
    // We are not interested in if the message is response or push message
    // Just worry about message type from now on.

    CImpsDataAccessor* myAccessor = CImpsDataAccessor::NewLC( iFields ); // << 

    // call appropriate observer method
    switch ( event->iMessageType )
        {
        case EImpsStatus:
            {
            TRAP( err, handler->HandleCompleteL(
                    event->iOpCode,
                    *client.CspIdentifier() ));
            };
            break;
        case EImpsJoinGroupRes:
            {
            CDesCArrayFlat* users = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( users );
            CDesCArrayFlat* screenNames = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( screenNames );
            TPtrC welcomeText;
            welcomeText.Set( KNullDesC );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                                        myKey, 
                            KJoinGroupResponseElements, 
                            sizeof( KJoinGroupResponseElements ) /
                            sizeof( KJoinGroupResponseElements[0] ) );

            // Get CSP version
            TReal version (0);
            TRAPD( err, version = TImpsDataUtils::GetCenRepRealValueL( 
       			KCRUIDWVEngineVariation, KWVEngineCspVersion )	);
       		// CSP 1.2 UserMapList
    	    if ( !err && version == 1.2 )
    	        {
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::JoinGroupResponse version 1.2") );
#endif
                myKey->AddL( CREATEKEY( EImpsKeyUserMapList, 0 ) ); 
                TImpsCDataUtils::GetUserMapListL( myKey, 
                                               myAccessor, users, screenNames );
                myKey->PopL( ); // Pop out the UserMapList
                }
            // CSP 1.1 UserList
            else
                {
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::JoinGroupResponse version 1.1") );
#endif 
                myKey->AddL( CREATEKEY( EImpsKeyUserList, 0 ) ); 
            TImpsCDataUtils::GetUserListL( myKey, 
                                           myAccessor, users, screenNames );
            myKey->PopL( ); // Pop out the UserList
                }
            myKey->AddL( CREATEKEY( EImpsKeyWelcomeNote, 0 ) );
            myKey->AddL( CREATEKEY( EImpsKeyContentData, 0 ) );
            TDesC* temp = NULL;
            if( myAccessor->RestoreDescL( myKey, temp ) )
                welcomeText.Set( *temp );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::calls HandleJoinL"));
#endif
            TRAP( err, handler->HandleJoinL(
                event->iOpCode,
                *users,
                *screenNames,
                welcomeText,
                *iClient.CspIdentifier() ));
            CleanupStack::PopAndDestroy( 3 ); // users, screennames, myKey
            };
            break;
        case EImpsLeaveGroupRes:
            {
            TPtrC groupId;
            groupId.Set( KNullDesC );
            TPtrC description;
            description.Set( KNullDesC );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                                    myKey, 
                                    KLeaveGroupGroupIdElements, 
                                    sizeof( KLeaveGroupGroupIdElements ) /
                                    sizeof( KLeaveGroupGroupIdElements[0] ) );
            myKey->AddL( CREATEKEY( EImpsKeyGroupID, 0 ) );
            TDesC* temp = NULL;
            if( myAccessor->RestoreDescL( myKey, temp ) )
                groupId.Set( *temp );

            myKey->PopL( );
            myKey->AddL( CREATEKEY( EImpsKeyResult, 0 ) );
            myKey->AddL( CREATEKEY( EImpsKeyDescription, 0 ) );
            TDesC* temp2 = NULL;
            if( myAccessor->RestoreDescL( myKey, temp2 ) )
                description.Set( *temp2 );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::calls HandleLeaveL"));
#endif
            TRAP( err, handler->HandleLeaveL(
                event->iOpCode,
                groupId,
                description,
                *iClient.CspIdentifier() ));
            CleanupStack::PopAndDestroy( 1 ); // mykey
            }
            break;
        case EImpsGroupMembersRes:
            {
            CDesCArrayFlat* users = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( users );
            CDesCArrayFlat* screenNames = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( screenNames );
            CDesCArrayFlat* groupModerators = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( groupModerators );
            CDesCArrayFlat* groupAdmins = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( groupAdmins );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                                myKey, 
                                KGroupMembersUserListElements, 
                                sizeof( KGroupMembersUserListElements ) /
                            sizeof( KGroupMembersUserListElements[0] ) );
            myKey->AddL( CREATEKEY( EImpsKeyUserList, 0 ) );
            TImpsCDataUtils::GetUserListL( myKey, myAccessor, users, screenNames );
            myKey->PopL( 2 ); // Pop out the Users and userList
            TImpsCDataUtils::GetModAndAdmL( myKey, myAccessor,
                                            groupModerators, groupAdmins );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: calls HandleGroupMembersL"));
#endif
            TRAP( err, handler->HandleGroupMembersL(
                event->iOpCode,
                *users,
                *screenNames,
                *groupModerators,
                *groupAdmins,
                *iClient.CspIdentifier() ));
            // users, screennames, group moderators, group admins, mykey
            CleanupStack::PopAndDestroy( 5 ); 
            }
            break;
        case EImpsGroupPropertiesRes:
            {
            CImpsCommonGroupPropsInt* comP = CImpsCommonGroupPropsInt::NewL( );
            CleanupStack::PushL( comP );
            CImpsPrivateGroupPropsInt* priP = CImpsPrivateGroupPropsInt::NewL( );
            CleanupStack::PushL( priP );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                                            myKey, 
                                            KGroupPropElements, 
                                            sizeof( KGroupPropElements ) /
                                            sizeof( KGroupPropElements[0] ) );
            TImpsCDataUtils::GetGroupPropertiesL( myKey, myAccessor, comP, priP );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: calls HandleGroupPropertiesL(GroupProperties)"));
#endif
            TRAP( err, handler->HandleGroupPropertiesL(
                event->iOpCode,
                KNullDesC,
                *comP,
                *priP,
                *iClient.CspIdentifier() ));
            CleanupStack::PopAndDestroy( 3 ); // comP, pri, myKey
            }
            break;
        case EImpsGroupChangeNotice:
            {
            CImpsCommonGroupPropsInt* comP = CImpsCommonGroupPropsInt::NewL( );
            CleanupStack::PushL( comP );
            CImpsPrivateGroupPropsInt* priP = CImpsPrivateGroupPropsInt::NewL( );
            CleanupStack::PushL( priP );
            TPtrC groupId;
            groupId.Set( KNullDesC );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                                            myKey, 
                                            KGroupChangeNoticeElements, 
                                            sizeof( KGroupChangeNoticeElements ) /
                                            sizeof( KGroupChangeNoticeElements[0] ) );
            myKey->AddL( CREATEKEY( EImpsKeyGroupID, 0 ) );
            TDesC* temp = NULL;
            if( myAccessor->RestoreDescL( myKey, temp ) )
                groupId.Set( *temp );

            myKey->PopL( );
            TImpsCDataUtils::GetGroupPropertiesL( myKey, myAccessor, comP, priP );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: calls HandleGroupPropertiesL(GroupChange)"));
#endif
            TRAP( err, handler->HandleGroupPropertiesL(
                event->iOpCode,
                groupId,
                *comP,
                *priP,
                *iClient.CspIdentifier()));
            CleanupStack::PopAndDestroy( 3 ); // comP, pri, myKey
            }
            break;
        case EImpsGroupRejectListRes:
            {
            CDesCArrayFlat* users = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( users );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                                    myKey, 
                                    KGroupRejectUserListElements, 
                                    sizeof( KGroupRejectUserListElements ) /
                                    sizeof( KGroupRejectUserListElements[0] ) );
            TImpsCDataUtils::GetUsersL( myKey, myAccessor, users );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: calls HandleRejectListL"));
#endif
            TRAP( err, handler->HandleRejectListL(
                event->iOpCode,
                *users,
                *iClient.CspIdentifier()));
            CleanupStack::PopAndDestroy( 2 ); // users myKey
            }
            break;
        case EImpsSubsGroupNoticeRes:
            {
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: calls HandleSubscriptionL"));
#endif
            TRAP( err, handler->HandleSubscriptionL(
                event->iOpCode,
                event->iAux,
                *iClient.CspIdentifier() ));
            }
            break;

        case EImpsNewUsers:
            {
            CDesCArrayFlat* users = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( users );
            CDesCArrayFlat* screenNames = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( screenNames );
            TPtrC groupId;
            groupId.Set( KNullDesC );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                                myKey, 
                                KGroupChangeNoticeJoinedElements, 
                                sizeof( KGroupChangeNoticeJoinedElements ) /
                                sizeof( KGroupChangeNoticeJoinedElements[0] ) );
            // Get CSP version
            TReal version (0);
            TRAPD( err, version = TImpsDataUtils::GetCenRepRealValueL( 
       			KCRUIDWVEngineVariation, KWVEngineCspVersion )	);
       		// CSP 1.2 UserMapList
    	    if ( !err && version == 1.2 )
    	        {
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::Handle new users version 1.2") );
#endif
                myKey->AddL( CREATEKEY( EImpsKeyUserMapList, 0 ) ); 
                TImpsCDataUtils::GetUserMapListL( myKey, 
                                               myAccessor, users, screenNames );
                myKey->PopL( ); // Pop out the UserMapList
                }
            // CSP 1.1 UserList
            else
                { 
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2::Handle new users version 1.1") );
#endif
                myKey->AddL( CREATEKEY( EImpsKeyUserList, 0 ) ); 
                TImpsCDataUtils::GetUserListL( myKey, 
                                               myAccessor, users, screenNames );
                myKey->PopL( ); // Pop out the UserList
                }
                
            myKey->PopL( 1 ); // Pop out Joined 
            myKey->AddL( CREATEKEY( EImpsKeyGroupID, 0 ) );
            TDesC* temp = NULL;
            if( myAccessor->RestoreDescL( myKey, temp ) )
                groupId.Set( *temp );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: calls HandleNewUsersL"));
#endif
            TRAP( err, handler->HandleNewUsersL(
                groupId,
                *users,
                *screenNames,
                *iClient.CspIdentifier() ));
            CleanupStack::PopAndDestroy( 3 ); // users, screenNames, myKey
            }
            break;

        case EImpsLeftUsers:
            {
            CDesCArrayFlat* users = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( users );
            CDesCArrayFlat* screenNames = new ( ELeave )CDesCArrayFlat( KArraySize );
            CleanupStack::PushL( screenNames );
            TPtrC groupId;
            groupId.Set( KNullDesC );

            CImpsKey* myKey = CImpsKey::NewLC();
            TImpsCDataUtils::AddValuesFromArrayL( 
                            myKey, 
                            KGroupChangeNoticeLeftElements, 
                            sizeof( KGroupChangeNoticeLeftElements ) /
                            sizeof( KGroupChangeNoticeLeftElements[0] ) );
            TImpsCDataUtils::GetUserListL( myKey, myAccessor, users, screenNames );
            myKey->PopL( 2 );  // Pop out Left and UserList
            myKey->AddL( CREATEKEY( EImpsKeyGroupID, 0 ) );
            TDesC* temp = NULL;
            if( myAccessor->RestoreDescL( myKey, temp ) )
                groupId.Set( *temp );
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: calls HandleLeftUsersL"));
#endif
            TRAP( err, handler->HandleLeftUsersL(
                groupId,
                *users,
                *screenNames,
                *iClient.CspIdentifier() ));
            CleanupStack::PopAndDestroy( 3 ); // myKey, users, screenNames
            }
            break;

        default:
#ifndef _NO_IMPS_LOGGING_
     CImpsClientLogger::Log(_L("CImpsGroupHandler2:: default branch"));
#endif
                __ASSERT_DEBUG( 0 == 1,
                                User::Panic( KImpsPanicCategory,
                                            EImpsCorrupted ) ); 
            User::Leave( KErrNotSupported );
            break;
        }
    CleanupStack::PopAndDestroy( 1 );  // >>> data accessor

    }


//  End of File