diff -r 000000000000 -r 094583676ce7 IMPSengine/client/src/impsfundcommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IMPSengine/client/src/impsfundcommand.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,363 @@ +/* +* 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: +* fundemental commander class. +* +*/ + + +// INCLUDE FILES +#include "impsfundcli.h" +#include "impsfundCommand.h" +#include "impsutils.h" +#include "impsdatautils.h" +#include "ImpsPacked.h" + +// MACROS +#ifndef _DEBUG +#define _NO_IMPS_LOGGING_ +#endif + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::CImpsFundCommand2 +// ---------------------------------------------------------------------------- +CImpsFundCommand2::CImpsFundCommand2( TInt aPriority, RImpsFundClient2& aClient ): + CActive( aPriority ), + iClient( aClient ), + iMessagePtr() + { + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::NewL +// ---------------------------------------------------------------------------- +CImpsFundCommand2* CImpsFundCommand2::NewL( RImpsFundClient2& aClient ) + { + CImpsFundCommand2* self = new (ELeave) CImpsFundCommand2( + EPriorityUserInput, aClient); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::ConstructL +// ---------------------------------------------------------------------------- +void CImpsFundCommand2::ConstructL() + { + iKey = CImpsKey::NewL(); + iImpsFields = CImpsFields::NewL(); + iDataAccessor = CImpsDataAccessor::NewL( iImpsFields ); + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::~CImpsFundCommand2 +// ---------------------------------------------------------------------------- +CImpsFundCommand2::~CImpsFundCommand2() + { + //Cancel any outstanding requests + Cancel(); + ResetMembers(); + delete iKey; + delete iImpsFields; + delete iDataAccessor; + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::StartRunL +// ---------------------------------------------------------------------------- +void CImpsFundCommand2::StartRunL() + { + iState = 0; + if ( IsActive() ) + { + User::Leave( KErrServerBusy ); + } + // Set this active object active + iStatus = KRequestPending; + SetActive(); + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::RunL +// ---------------------------------------------------------------------------- +void CImpsFundCommand2::RunL() + { + #ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsFundCommand2: RunL %d" ), iStatus.Int() ); + #endif + MImpsErrorHandler2* ehandler = iClient.ErrorHandler(); + // Errors are handled here. + // Successful cases are handled by CImpsFundHandler. + if ( iStatus == KErrNone ) + { + return; + } + // Handler should be registered + if ( ehandler ) + { + TInt err( KErrNone ); + TRAP( err, ehandler->HandleErrorL( iStatus.Int(), iOpId, NULL, NULL, *iClient.CspIdentifier() )); + } + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::DoCancel +// ---------------------------------------------------------------------------- + +void CImpsFundCommand2::DoCancel() + { + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::InitialiseL +// ---------------------------------------------------------------------------- +void CImpsFundCommand2::InitialiseL( const TImpsContent* aElementArray, + const TUint aArraySize ) + { + ResetMembers(); + TImpsDataUtils::AddValuesFromArrayL( iKey, aElementArray, aArraySize ); + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::SetUserIDsL +// There is no count check here, since client does not +// call this function in case the array is empty. +// ---------------------------------------------------------------------------- +void CImpsFundCommand2::SetUserIDsL( const MDesCArray* aUserIDs ) + { + #ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsFundCommand2::SetUserIDsL()" ) ); + #endif + TUint count = aUserIDs->MdcaCount(); + for( TUint i = 0;i < count;i++ ) + { + TPtrC userID = aUserIDs->MdcaPoint( i ); + #ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( + _L( " User ID no. %d: \"%S\"" ), i, &userID ); + #endif + iKey->AddL( CREATEKEY( EImpsKeyUser, i ) ); + iKey->AddL( CREATEKEY( EImpsKeyUserID, 0 ) ); + iDataAccessor->StoreDescL( iKey, userID ); + iKey->PopL( 2 ); + } + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::MakeSearchPairListL +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::MakeSearchPairListL( const CSearchPairs& aSearchPairs ) + { + #ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsFundCommand2::MakeSearchPairListL" ) ); + #endif + TInt index = 0; + TInt count = aSearchPairs.Count(); + CImpsSearchRequest* request = NULL; + for( TInt i = 0;i < count;i++ ) + { + request = aSearchPairs.At( i ); + TPtrC value = request->Value(); + if( value.Length() != 0 ) + { + #ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( + _L( " Value of the search pair no. %d: \"%S\"" ), i, &value ); + #endif + //Must use a separate index variable in order + //no to mix up the sequence in the iKey member. + iKey->AddL( CREATEKEY( EImpsKeySearchPairList, index ) ); + iKey->AddL( CREATEKEY( EImpsKeySearchElement, 0 ) ); + iDataAccessor->StoreIntegerL( iKey, request->Element() ); + iKey->PopL(); //search element + iKey->AddL( CREATEKEY( EImpsKeySearchString, 0 ) ); + iDataAccessor->StoreDescL( iKey, request->Value() ); + iKey->PopL( 2 ); + index++; + } + #ifndef _NO_IMPS_LOGGING_ + else + { + CImpsClientLogger::Log( _L( " Value no. %d is empty!" ), i ); + } + #endif + } + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::InsertEmptyElementL +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::InsertEmptyElementL( const TImpsContent aElementName, + const TInt aIndex ) + { + iKey->AddL( CREATEKEY( aElementName, aIndex ) ); + iDataAccessor->StoreEmptyL( iKey ); + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::SetScreenNamesL +// There is no count check here, since client does not +// call this function in case the arrays are empty. +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::SetScreenNamesL( const MDesCArray* aScreenNames, + const MDesCArray* aGroupNames ) + { + #ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsFundCommand2::SetScreenNamesL()" ) ); + #endif + TUint count = aScreenNames->MdcaCount(); + for( TUint i = 0;i < count;i++ ) + { + iKey->AddL( CREATEKEY( EImpsKeyScreenName, i ) ); + iKey->AddL( CREATEKEY( EImpsKeySName, 0 ) ); + //Store the SName + TPtrC SName = aScreenNames->MdcaPoint( i ); + #ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( " SName no. %d: \"%S\"" ), i, &SName ); + #endif + iDataAccessor->StoreDescL( iKey, SName ); + iKey->PopL(); + //Store the GroupID + iKey->AddL( CREATEKEY( EImpsKeyGroupID, 0 ) ); + #ifndef _NO_IMPS_LOGGING_ + TPtrC groupID = aGroupNames->MdcaPoint( i ); + CImpsClientLogger::Log( + _L( " GroupID no. %d: \"%S\"" ), i, &groupID ); + #endif + iDataAccessor->StoreDescL( iKey, aGroupNames->MdcaPoint( i ) ); + iKey->PopL(); + } + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::InsertDescriptorElementL +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::InsertDescriptorElementL( const TDesC& aElementValue, + const TImpsContent aElementName, + const TInt aIndex ) + { + iKey->AddL( CREATEKEY( aElementName, aIndex ) ); + iDataAccessor->StoreDescL( iKey, aElementValue ); + iKey->PopL(); + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::InsertBooleanElementL +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::InsertBooleanElementL( const TBool aElementValue, + const TImpsContent aElementName, + const TInt aIndex ) + { + iKey->AddL( CREATEKEY( aElementName, aIndex ) ); + iDataAccessor->StoreBooleanL( iKey, aElementValue ); + iKey->PopL(); + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::InsertIntegerElementL +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::InsertIntegerElementL( const TInt aElementValue, + const TImpsContent aElementName, + const TInt aIndex ) + { + iKey->AddL( CREATEKEY( aElementName, aIndex ) ); + iDataAccessor->StoreIntegerL( iKey, aElementValue ); + iKey->PopL(); + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::ResetMembers +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::ResetMembers() + { + iArraySize = 0; + delete iMessage; + iMessage = NULL; + iMessagePtr.Set( KNullDesC8 ); + if (iKey != NULL) + { + iKey->Reset(); + } + if (iImpsFields != NULL) + { + iImpsFields->Reset(); + } + } + +// ----------------------------------------------------------------------------- +// CImpsFundCommand2::PackAndSendL +// ----------------------------------------------------------------------------- +void CImpsFundCommand2::PackAndSendL( const TImpsMessageType aMessageType, + const TInt aOpId ) + { + iOpId = aOpId; + delete iMessage; + iMessage = NULL; + HBufC8* buffer = HBufC8::NewLC( iImpsFields->Size() ); // << buffer + iImpsFields->SetMessageType( aMessageType ); + TImpsPackedEntity packedMessage( buffer ); + TInt error = packedMessage.PackEntity( *iImpsFields ); + if( error == KErrNone ) + { + TImpsServRequest req = ServerRequestTypeL( aMessageType ); + StartRunL(); + iMessage = buffer; + CleanupStack::Pop(); // >> buffer + iMessagePtr.Set( iMessage->Des() ); + iClient.SendReceive( req, TIpcArgs( &iMessagePtr, iOpId ), iStatus ); + } + else + { + iImpsFields->Reset(); + User::Leave( error ); // >> buffer deleted from CleanupStack + } + } + +// ---------------------------------------------------------------------------- +// CImpsFundCommand2::ServerRequestTypeL +// ---------------------------------------------------------------------------- +TImpsServRequest CImpsFundCommand2::ServerRequestTypeL( + const TImpsMessageType aMessageType ) + { + TImpsServRequest ret = EImpsServNone; + switch( aMessageType ) + { + case EImpsSearchReq: + case EImpsStopSearchReq: + case EImpsSearchRes: + ret = EImpsServFundSearch; + break; + case EImpsInviteReq: + case EImpsInviteRes: + case EImpsInviteUserReq: + case EImpsInviteUserRes: + case EImpsCancelInviteReq: + case EImpsCancelInviteUserReq: + ret = EImpsServFundInvite; + break; + default: + User::Leave( ret ); + } + return ret; + } + + +// End of File + +