--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IMPSengine/client/src/impsfundhandler.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,489 @@
+/*
+* 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 fundemental feature.
+*
+*/
+
+
+// INCLUDE FILES
+#include "impsfundcli.h"
+#include "impsfundhandler.h"
+#include "impsutils.h"
+#include "impscdatautils.h"
+#include "impserrors.h"
+#include "impscommonenums.h"
+
+// MACROS
+#ifndef _DEBUG
+#define _NO_IMPS_LOGGING_
+#endif
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::CImpsFundHandler2
+// ----------------------------------------------------------------------------
+CImpsFundHandler2::CImpsFundHandler2( TInt aPriority, RImpsFundClient2& aClient ):
+ // The base class adds this to the scheduler
+ CImpsHandler2( aPriority, aClient), iClient( aClient )
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::NewL
+// ----------------------------------------------------------------------------
+CImpsFundHandler2* CImpsFundHandler2::NewL( RImpsFundClient2& aClient,
+ TInt aPriority )
+ {
+ CImpsFundHandler2* self = new (ELeave) CImpsFundHandler2( aPriority ,
+ aClient);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::~CImpsFundHandler2
+// ----------------------------------------------------------------------------
+CImpsFundHandler2::~CImpsFundHandler2()
+ {
+ delete iDataAccessor;
+ delete iKey;
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::HandleEventL
+// ----------------------------------------------------------------------------
+void CImpsFundHandler2::HandleEventL( CImpsFields* aErrorFields )
+ {
+ // get the event data from server thread.
+ SImpsEventData* event = (SImpsEventData*)iEventData.Ptr();
+#ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log(_L("CImpsFundHandler2::HandleEventL opid=%d cli=%d"),
+ event->iOpCode, (TInt)&iClient );
+#endif
+ if ( event->iStatus != ( Imps_ERROR_BASE - 200 ) &&
+ event->iStatus != KErrNone )
+ {
+ HandleErrorEventL( event->iOpCode, event->iStatus, aErrorFields );
+ }
+ // Call regular observer
+ // iStatus is error code or message size
+ else if ( iStatus >= 0 )
+ {
+ HandleFundamentalEventL( );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::HandleFundamentalEventL
+// ----------------------------------------------------------------------------
+void CImpsFundHandler2::HandleFundamentalEventL( )
+ {
+ // get the event data from server thread.
+
+ MImpsSearchHandler2* searchhandler = NULL;
+ SImpsEventData* event = ( SImpsEventData* )iEventData.Ptr();
+ TInt err( KErrNone );
+ //This must be a "response" to search stop
+ if( event->iMessageType == EImpsStatus &&
+ event->iRequestType == EImpsServFundSearch )
+ {
+ searchhandler = iClient.SearchHandler();
+ //Notice: Status message does not include a search ID, which is the
+ //third parameter in HandleSearchStoppedL() method. In future, it
+ //might be a good idea to expand the event structure so that a
+ //response could always be mapped to the correct request regardless
+ //of the message type. For now, just send a meaningless magic number 0.
+ if( searchhandler != NULL )
+ {
+#ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( "CImpsFundHandler2:: calls HandleSearchStoppedL opid=%d"),
+ event->iOpCode );
+#endif
+ TRAP( err, searchhandler->HandleSearchStoppedL( event->iOpCode,
+ /*event->iStatus,*/ KErrNone, *iClient.CspIdentifier() ));
+ }
+ else
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log(_L("Search handler not instantiated!"));
+ #endif
+ return;
+ }
+ }
+ else
+ {
+ MImpsInviteHandler2* invitehandler = iClient.InviteHandler();
+ switch( event->iMessageType )
+ {
+ case EImpsSearchRes:
+ HandleSearchResponseL( event->iOpCode );
+ break;
+ case EImpsInviteUserReq:
+ HandleInviteRequestL();
+ break;
+ case EImpsInviteRes:
+ HandleInviteResponseL();
+ break;
+ case EImpsCancelInviteUserReq:
+ HandleInviteCancelL();
+ break;
+ default:
+ if( invitehandler != NULL)
+ {
+#ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( "CImpsFundHandler2:: calls HandleCompleteL opid=%d"),
+ event->iOpCode );
+#endif
+ TRAP( err, invitehandler->HandleCompleteL( event->iOpCode, /*event->iStatus,*/ *iClient.CspIdentifier() ));
+ }
+ else
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log
+ ( _L( "Invite handler not instantiated!" ) );
+ #endif
+ return;
+ }
+ break;
+ }
+ iKey->Reset();
+ }
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( "CImpsFundHandler2::HandleFundamentalEventL ends" ) );
+ #endif
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::HandleSearchResponseL
+// ----------------------------------------------------------------------------
+void CImpsFundHandler2::HandleSearchResponseL( const TInt aOpId )
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log
+ ( _L( "CImpsFundHandler2::HandleSearchResponseL()" ) );
+ #endif
+ MImpsSearchHandler2* search = iClient.SearchHandler();
+ if( search != NULL )
+ {
+ TImpsSearchResultType resultType = EImpsUserResult;
+ const TImpsContent* content = KSearchResponseElements;
+ TImpsDataUtils::AddValuesFromArrayL( iKey, content,
+ sizeof( KSearchResponseElements ) /
+ sizeof( KSearchResponseElements[0] ) );
+ TInt searchId = IntegerElementL( EImpsKeySearchID, 0 ); //search ID
+ TInt index = IntegerElementL( EImpsKeySearchIndex, 0 );
+ TInt results = IntegerElementL( EImpsKeySearchFindings, 0 );
+ TBool complete = BooleanElementL( EImpsKeyCompletionFlag, 0 );
+ CPtrC16Array* resultArray = results > 0 ? SearchResultsLC( resultType ) : NULL;
+
+ TInt err( KErrNone );
+ TRAP( err, search->HandleSearchL( aOpId,
+ searchId, index,
+ results, complete,
+ resultType, resultArray, *iClient.CspIdentifier() ));
+ if( resultArray != NULL )
+ CleanupStack::PopAndDestroy(); //resultArray
+ }
+ else
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( " Search handler not instantiated!" ) );
+ #endif
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::HandleInviteRequestL
+// ----------------------------------------------------------------------------
+void CImpsFundHandler2::HandleInviteRequestL()
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log
+ ( _L( "CImpsFundHandler2::HandleInviteRequestL()" ) );
+ #endif
+ MImpsInviteHandler2* invite = iClient.InviteHandler();
+ if( invite != NULL )
+ {
+ TInt err( KErrNone );
+
+ const TImpsContent* content = KInviteUserRequestElements;
+ TImpsDataUtils::AddValuesFromArrayL( iKey, content,
+ sizeof( KInviteUserRequestElements ) /
+ sizeof( KInviteUserRequestElements[0] ) );
+
+ TInt inviteType = IntegerElementL( EImpsKeyInviteType, 0 );
+ TPtrC inviteID = DescriptorElementL( EImpsKeyInviteID, 0 );
+ TPtrC reason = DescriptorElementL( EImpsKeyInviteNote, 0 );
+ TInt validity = IntegerElementL( EImpsKeyValidity, 0 );
+ TPtrC groupName;
+ groupName.Set( DescriptorElementL( EImpsKeyGroupID, 0 ) );//gr
+
+ iKey->AddL( CREATEKEY( EImpsKeySender, 0 ) );
+ iKey->AddL( CREATEKEY( EImpsKeyUser, 0 ) );
+ TPtrC userID = DescriptorElementL( EImpsKeyUserID, 0 );
+ if ( inviteType == EImpsGR )
+ {
+ TPtrC sName;
+ if( userID.Length() == 0 )
+ {
+ iKey->PopL(); //user
+ iKey->AddL( CREATEKEY( EImpsKeyGroup, 0 ) ); // group
+ iKey->AddL( CREATEKEY( EImpsKeyScreenName, 0 ) ); // ScreenName //gr
+ sName.Set( DescriptorElementL( EImpsKeySName, 0 ) );
+ groupName.Set( DescriptorElementL( EImpsKeyGroupID, 0 ) );
+ }
+ TRAP( err, invite->HandleGroupInviteL( inviteID, userID, sName, groupName,
+ reason, validity,
+ *iClient.CspIdentifier() ) );
+ }
+ else if ( inviteType == EImpsIM )
+ {
+ invite->HandleImInviteL( inviteID, userID, reason,
+ validity, *iClient.CspIdentifier());
+ }
+ else if ( inviteType == EImpsSC )
+ {
+ CDesCArrayFlat* urlList = new ( ELeave ) CDesCArrayFlat( 4 );
+ CleanupStack::PushL( urlList );
+ TImpsCDataUtils::GetUrlListL( iDataAccessor, urlList );
+ TRAP( err, invite->HandleContentInviteL( inviteID, userID, urlList,
+ reason, validity, *iClient.CspIdentifier()));
+ CleanupStack::PopAndDestroy();
+ }
+ else
+ {
+#ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( "CImpsFundHandler2: ERROR Unknown invite type %d" ), inviteType );
+#endif
+ User::Leave( KErrCorrupt );
+ }
+
+
+ }
+ else
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( "Invite handler not instantiated!" ) );
+ #endif
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::HandleInviteResponseL
+// ----------------------------------------------------------------------------
+void CImpsFundHandler2::HandleInviteResponseL()
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log
+ ( _L( "CImpsFundHandler2::HandleInviteResponseL()" ) );
+ #endif
+ MImpsInviteHandler2* invite = iClient.InviteHandler();
+ if( invite != NULL )
+ {
+ TPtrC sName;
+ TPtrC groupName;
+ const TImpsContent* content = KInviteResponseElements;
+ TImpsDataUtils::AddValuesFromArrayL( iKey, content,
+ sizeof( KInviteResponseElements ) /
+ sizeof( KInviteResponseElements[0] ) );
+ TPtrC inviteID = DescriptorElementL( EImpsKeyInviteID, 0 );
+ TBool accept = BooleanElementL( EImpsKeyAcceptance, 0 );
+ TPtrC response = DescriptorElementL( EImpsKeyResponseNote, 0 );
+ iKey->AddL( CREATEKEY( EImpsKeySender, 0 ) ); // sender
+ iKey->AddL( CREATEKEY( EImpsKeyUser, 0 ) ); // user
+ TPtrC userID = DescriptorElementL( EImpsKeyUserID, 0 );
+ if( userID.Length() == 0 )
+ {
+ iKey->PopL(); //user
+ iKey->AddL( CREATEKEY( EImpsKeyGroup, 0 ) ); // group
+ iKey->AddL( CREATEKEY( EImpsKeyScreenName, 0 ) ); //screenName
+ sName.Set( DescriptorElementL( EImpsKeySName, 0 ) );
+ groupName.Set( DescriptorElementL( EImpsKeyGroupID, 0 ) );
+ }
+ TInt err( KErrNone );
+ TRAP( err, invite->HandleInviteResponseL( inviteID, accept, userID,
+ sName, groupName, response, *iClient.CspIdentifier() ));
+ }
+ else
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( "Invite handler not instantiated!" ) );
+ #endif
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::HandleInviteCancelL
+// ----------------------------------------------------------------------------
+void CImpsFundHandler2::HandleInviteCancelL()
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log
+ ( _L( "CImpsFundHandler2::HandleInviteCancelL()" ) );
+ #endif
+ MImpsInviteHandler2* invite = iClient.InviteHandler();
+ if( invite != NULL )
+ {
+ TPtrC sName;
+ TPtrC groupName;
+ const TImpsContent* content = KInviteCancelUserRequestElements;
+ TImpsDataUtils::AddValuesFromArrayL( iKey, content,
+ sizeof( KInviteCancelUserRequestElements ) /
+ sizeof( KInviteCancelUserRequestElements[0] ) );
+ TPtrC inviteID = DescriptorElementL( EImpsKeyInviteID, 0 );
+ TPtrC response = DescriptorElementL( EImpsKeyInviteNote, 0 );
+ iKey->AddL( CREATEKEY( EImpsKeySender, 0 ) ); // sender
+ iKey->AddL( CREATEKEY( EImpsKeyUser, 0 ) ); // user
+ TPtrC userID = DescriptorElementL( EImpsKeyUserID, 0 );
+ if( userID.Length() == 0 )
+ {
+ iKey->PopL(); //user
+ iKey->AddL( CREATEKEY( EImpsKeyGroup, 0 ) ); //group
+ iKey->AddL( CREATEKEY( EImpsKeyScreenName, 0 ) ); //screenName
+ sName.Set( DescriptorElementL( EImpsKeyGroupID, 0 ) );
+ //screenName, group
+ groupName.Set( DescriptorElementL( EImpsKeySName, 0 ) );
+ }
+ TInt err( KErrNone );
+ TRAP( err, invite->HandleInviteCancelL( inviteID, userID, sName,
+ groupName, response,
+ *iClient.CspIdentifier() ));
+ }
+ else
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( "Invite handler not instantiated!" ) );
+ #endif
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::SearchResultsLC
+// ----------------------------------------------------------------------------
+CPtrC16Array* CImpsFundHandler2::SearchResultsLC(
+ TImpsSearchResultType& aResultType )
+ {
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( " CImpsFundHandler2::SearchResultsLC()" ) );
+ #endif
+ TBool moreResults = ETrue;
+ const TInt KArraySize = 5;
+ CPtrC16Array* results = new ( ELeave ) CPtrC16Array( KArraySize );
+ CleanupStack::PushL( results );
+ iKey->AddL( CREATEKEY( EImpsKeySearchResult, 0 ) ); //*** search result
+ iKey->AddL( CREATEKEY( EImpsKeyUserList, 0 ) ); //*** user list
+ if( iDataAccessor->CheckBranchExistenceL( iKey ) )
+ {
+ aResultType = EImpsUserResult;
+ for( TInt i = 0;moreResults;i++ )
+ {
+ iKey->AddL( CREATEKEY( EImpsKeyUser, i ) ); //*** user
+ TPtrC userId = DescriptorElementL( EImpsKeyUserID, 0 );
+ if( userId.Length() > 0 )
+ {
+ results->AppendL( userId );
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( " Result no. %d: \"%S\"" ), i, &userId );
+ #endif
+ }
+ else
+ {
+ moreResults = EFalse;
+ }
+ iKey->PopL(); //user
+ }
+ iKey->PopL( 2 ); //user list, search result
+ }
+ else
+ {
+ aResultType = EImpsGroupResult;
+ iKey->PopL(); //user list
+ iKey->AddL( CREATEKEY( EImpsKeyGroupList, 0 ) ); //*** group list
+ for( TInt i(0); moreResults; ++i )
+ {
+ TPtrC groupId = DescriptorElementL( EImpsKeyGroupID, i );
+ if( groupId.Length() > 0 )
+ {
+ results->AppendL( groupId );
+ #ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log( _L( " Result no. %d: \"%S\"" ), i, &groupId );
+ #endif
+ }
+ else
+ {
+ moreResults = EFalse;
+ }
+ }
+ iKey->PopL( 2 ); //group list, search result
+ }
+ return results;
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::DescriptorElementL
+// ----------------------------------------------------------------------------
+TPtrC CImpsFundHandler2::DescriptorElementL( const TImpsContent aContent,
+ const TInt aIndex )
+ {
+ TDesC* ret = NULL;
+ iKey->AddL( CREATEKEY( aContent, aIndex ) );
+ iDataAccessor->RestoreDescL( iKey, ret );
+ iKey->PopL();
+ return ret != NULL ? TPtrC( *ret ) : TPtrC();
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::BooleanElementL
+// ----------------------------------------------------------------------------
+TBool CImpsFundHandler2::BooleanElementL( const TImpsContent aContent,
+ const TInt aIndex )
+ {
+ TBool ret;
+ iKey->AddL( CREATEKEY( aContent, aIndex ) );
+ iDataAccessor->RestoreBooleanL( iKey, ret );
+ iKey->PopL();
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::IntegerElementL
+// ----------------------------------------------------------------------------
+TInt CImpsFundHandler2::IntegerElementL( const TImpsContent aContent,
+ const TInt aIndex )
+ {
+ TInt ret = 0;
+ iKey->AddL( CREATEKEY( aContent, aIndex ) );
+ iDataAccessor->RestoreIntegerL( iKey, ret );
+ iKey->PopL();
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsFundHandler2::ConstructL
+// ----------------------------------------------------------------------------
+
+void CImpsFundHandler2::ConstructL()
+ {
+ CImpsHandler2::ConstructL( );
+ iDataAccessor = CImpsDataAccessor::NewL( iFields );
+ iKey = CImpsKey::NewL();
+ }
+
+// End of File
+
+