diff -r 000000000000 -r 094583676ce7 PECengine/PresenceManager2/SrcAttribute/CPEngAttributeFetchOp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/PresenceManager2/SrcAttribute/CPEngAttributeFetchOp.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2004 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: this class is an operation handler for fetching attributes from network. +* +*/ + +// INCLUDE FILES +#include "CPEngAttributeFetchOp.h" +#include "CPEngNWSessionSlotStorageProxy.h" +#include "MPEngPresenceAttrManager.h" +#include "MPEngAdvTransactionStatus2.h" +#include "PEngAttrLibFactory.h" + + + +#include +#include +#include + + + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::NewL() +// ----------------------------------------------------------------------------- +CPEngAttributeFetchOp* CPEngAttributeFetchOp::NewL( TInt aPriority, + CPEngAttributeTransaction2& aInterface, + CPEngNWSessionSlotStorageProxy& aUsedSlot, + TBool aResultAsLocalObjects, + const MDesCArray& aPresenceIDs, + const TArray& aTypes, + MPEngAttributeTransactionObserver2& aObserver, + RPEngManagerClient& aServer ) + { + CPEngAttributeFetchOp* self = new ( ELeave ) CPEngAttributeFetchOp( aPriority, + aInterface, + aObserver, + aServer ); + CleanupStack::PushL( self ); + self->ConstructL( aUsedSlot, + aPresenceIDs, + aTypes, + aResultAsLocalObjects ); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::~CPEngAttributeFetchOp() +// ----------------------------------------------------------------------------- +CPEngAttributeFetchOp::~CPEngAttributeFetchOp() + { + CActive::Cancel(); + + iResultModels.ResetAndDestroy(); + + if ( iAttrManager ) + { + iAttrManager->Close(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::CPEngAttributeFetchOp() +// ----------------------------------------------------------------------------- +CPEngAttributeFetchOp::CPEngAttributeFetchOp( TInt aPriority, + CPEngAttributeTransaction2& aInterface, + MPEngAttributeTransactionObserver2& aObserver, + RPEngManagerClient& aServer ) + : CPEngAsyncOperation( aPriority, aServer ), + iInterface( aInterface ), + iObserver( aObserver ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::ConstructL() +// ----------------------------------------------------------------------------- +void CPEngAttributeFetchOp::ConstructL( CPEngNWSessionSlotStorageProxy& aUsedSlot, + const MDesCArray& aPresenceIDs, + const TArray& aTypes, + TBool aResultAsLocalObjects ) + { + CPEngAsyncOperation::BaseConstructL( aUsedSlot ); + iAttrManager = PEngAttrLibFactory::AttributeManagerInstanceL( aUsedSlot.BaseId() ); + + + TInt ii; + TInt jj; + + + //Verify attribute types + const TInt typesCount( aTypes.Count() ); + if ( typesCount == 0 ) + { + User::Leave( KErrArgument ); + } + + + for ( ii = 0; ii < typesCount - 1; ii++ ) + { + for ( jj = ii + 1 ; jj < typesCount; jj++ ) + { + if ( aTypes[ii] == aTypes[jj] ) + { + User::Leave( KErrAlreadyExists ); + } + } + } + + //Check every type can be used in NW operation + for ( ii = 0; ii < typesCount; ii++ ) + { + User::LeaveIfError( iAttrManager->ValidNetworkAttribute( aTypes[ii] ) ); + } + + + //Verify presence ID's + const TInt presenceIDCount( aPresenceIDs.MdcaCount() ); + if ( presenceIDCount == 0 ) + { + User::Leave( KErrArgument ); + } + + for ( ii = 0; ii < presenceIDCount - 1; ii++ ) + { + for ( jj = ii + 1; jj < presenceIDCount; jj++ ) + { + if ( aPresenceIDs.MdcaPoint( ii ) == + aPresenceIDs.MdcaPoint( jj ) ) + { + User::Leave( KErrAlreadyExists ); + } + } + } + + //Generate the request + HBufC16* data = iAttrManager->PackFetchRequestL( aPresenceIDs, + aTypes ); + + if ( aResultAsLocalObjects ) + { + InitTransaction( data, EPEngTransOpAttributeFetchToObjects ); + } + else + { + InitTransaction( data, EPEngTransOpAttributeFetchToCache ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::Fetch() +// ----------------------------------------------------------------------------- +void CPEngAttributeFetchOp::Fetch() + { + IssueTransaction(); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::GetFetchedAttributes() +// ----------------------------------------------------------------------------- +TInt CPEngAttributeFetchOp::GetFetchedAttributes( + RPointerArray< MPEngPresenceAttrModel2>& aModels ) + { + const TInt count = iResultModels.Count(); + for ( TInt ii = 0; ii < count; ii++ ) + { + MPEngPresenceAttrModel2* m = iResultModels[ 0 ]; + TInt err = aModels.Append( m ); + if ( err != KErrNone ) + { + return err; + } + + iResultModels.Remove( 0 ); + } + + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::DoHandleOpSuccessL() +// ----------------------------------------------------------------------------- +void CPEngAttributeFetchOp::DoHandleOpSuccessL( MPEngAdvTransactionStatus2& aStatus, + TInt aTransactionOperation ) + + { + if ( aTransactionOperation == EPEngTransOpAttributeFetchToObjects ) + { + TPtrC16 dataResult( NULL, 0 ); + aStatus.GetFirstDataResultByOperation( EPEngTransOpAttributeFetchToObjects, + dataResult ); + if ( dataResult.Length() > 0 ) + { + iAttrManager->UnpackModelArrayL( dataResult, + EPEngInstanceOptionsNone, + iResultModels ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::DoHandleOpFailure() +// ----------------------------------------------------------------------------- +void CPEngAttributeFetchOp::DoHandleOpFailure( + MPEngAdvTransactionStatus2& /*aStatus*/, + TInt /*aTransactionOperation*/ ) + { + iResultModels.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttributeFetchOp::DoNotifyObserver() +// ----------------------------------------------------------------------------- +TPEngAsyncOpResult CPEngAttributeFetchOp::DoNotifyObserver( + MPEngAdvTransactionStatus2& aStatus, + TInt aTransactionOperation ) + { + TRAPD( err, iObserver.HandleAttributeTransactionCompleteL( + aStatus, + iInterface, + aTransactionOperation ) ); + if ( err != KErrNone ) + { + iObserver.HandleAttributeTransactionError( err, + iInterface, + aTransactionOperation ); + } + + return EPEngAsyncOpCompleted; + } + + + +// End of file