diff -r 000000000000 -r 094583676ce7 IMPSengine/client/src/impsgrouphandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IMPSengine/client/src/impsgrouphandler.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,507 @@ +/* +* 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 + +#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