IMPSengine/client/src/impsgrouphandler.cpp
changeset 0 094583676ce7
--- /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 <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