diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/server/src/ncdcreateaccesspointoperationimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/server/src/ncdcreateaccesspointoperationimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,343 @@ +/* +* Copyright (c) 2006-2008 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: +* +*/ + + +#include "ncdcreateaccesspointoperationimpl.h" + +#include +#include + +#include "catalogsbasemessage.h" +#include "catalogsutils.h" +#include "catalogscontext.h" +#include "catalogsaccesspointmanager.h" +#include "ncdproviderdefines.h" +#include "ncdparserfactory.h" +#include "ncdparser.h" + +#include "ncd_cp_query.h" +#include "ncd_cp_queryelement.h" +#include "ncd_cp_queryoption.h" +#include "ncd_cp_detail.h" +#include "ncd_cp_clientconfiguration.h" +#include "ncd_cp_error.h" +#include "ncd_cp_serverdetails.h" +#include "ncd_cp_actionrequest.h" +#include "ncd_cp_queryresponseimpl.h" +#include "ncdparserimpl.h" +#include "ncd_parser_cp_clientconfiguration.h" +#include "ncdgeneralmanager.h" + +#include "catalogsdebug.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CNcdCreateAccessPointOperation* CNcdCreateAccessPointOperation::NewL( + HBufC* aAccessPointData, + MNcdOperationRemoveHandler& aRemoveHandler, + CNcdGeneralManager& aGeneralManager, + MCatalogsSession& aSession ) + { + CNcdCreateAccessPointOperation* self = + new( ELeave ) CNcdCreateAccessPointOperation( + aRemoveHandler, + aGeneralManager, + aSession ); + + CleanupClosePushL( *self ); + self->ConstructL( aAccessPointData ); + CleanupStack::Pop(); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CNcdCreateAccessPointOperation::~CNcdCreateAccessPointOperation() + { + DLTRACEIN(( "" )); + delete iParser; + delete iAccessPointData; + + } + + +// --------------------------------------------------------------------------- +// Cancel +// --------------------------------------------------------------------------- +// +void CNcdCreateAccessPointOperation::Cancel() + { + DLTRACEIN(( "" )); + if ( iParser ) + { + iParser->CancelParsing(); + } + iOperationState = EStateCancelled; + + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdCreateAccessPointOperation::ParseError( TInt aErrorCode ) + { + DLTRACEIN(("error:%d", aErrorCode )); + + // Handle error only if not handling an error already + // (cancellation of parsing may cause an unnecessary call to this function). + if( iError == KErrNone ) + { + iError = aErrorCode; + + if ( iParser ) + { + iParser->CancelParsing(); + } + + iOperationState = EStateComplete; + RunOperation(); + } + } + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CNcdCreateAccessPointOperation::ParseCompleteL( TInt aError ) + { + DLTRACEIN(("error: %d", aError )); + + if ( aError == KErrNone ) + { + ParseAccessPointDataL(); + } + + delete iParser; + iParser = NULL; + + iOperationState = EStateComplete; + iError = aError; + + RunOperation(); + } + + +// --------------------------------------------------------------------------- +// RunOperation +// --------------------------------------------------------------------------- +// +TInt CNcdCreateAccessPointOperation::RunOperation() + { + DLTRACEIN(( "Pending message: %X", iPendingMessage )); + + if ( !iPendingMessage ) + { + DLTRACE(("No pending message")); + return KErrNotReady; + } + + // One trap to rule them all + TRAPD( err, HandleStateL() ); + + HandleError( err ); + DLTRACEOUT(("err: %d", err)); + return err; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdCreateAccessPointOperation::HandleStateL() + { + DLTRACEIN(("")); + switch( iOperationState ) + { + case EStateRunning: + { + StartParsingL(); + break; + } + + + case EStateComplete: + { + if ( !iError && !iAccessPoint ) + { + DLERROR(("No accesspoint was created, error KErrNotFound")); + iError = KErrNotFound; + } + + // Returns false if there was no error + if ( !HandleError( iError ) ) + { + DLTRACE(("Completing the operation")); + iProgress.iProgress = iAccessPoint; + CNcdBaseOperation::CompleteMessage( + iPendingMessage, + ENCDOperationMessageCompletionComplete, + iProgress, + KErrNone ); + } + break; + } + + default: + { + DLTRACE(("Default")); + break; + } + } + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CNcdCreateAccessPointOperation::HandleError( TInt aError ) + { + DLTRACEIN(("aError: %d", aError )); + if ( aError != KErrNone ) + { + DLERROR(("Error %d occurred", aError )); + iError = aError; + iOperationState = EStateCancelled; + Cancel(); + if ( iPendingMessage ) + { + // ignoring error because operation already failed + CNcdBaseOperation::CompleteMessage( iPendingMessage, + ENCDOperationMessageCompletionError, iError ); + } + return ETrue; + } + return EFalse; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdCreateAccessPointOperation::StartParsingL() + { + DLTRACEIN(("")); + // create parser + delete iParser; + iParser = NULL; + iParser = NcdParserFactory::CreateParserL( NULL ); + + MNcdParserObserverBundle& observers = iParser->Observers(); + observers.SetParserObserver( this ); + + + iSubParser = + CNcdConfigurationProtocolClientConfigurationParser::NewL( + observers, *static_cast( iParser ), 0 ); + + iParser->BeginAsyncL( iSubParser ); // ownership is transferred + + DLTRACE(("Start parsing the data")); + iParser->ParseL( *iAccessPointData ); + // Inform parser that no more data will be sent + iParser->EndL(); + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CNcdCreateAccessPointOperation::ParseAccessPointDataL() + { + DLTRACEIN(("")); + // Ownership is transferred here + MNcdConfigurationProtocolClientConfiguration* configuration = + iSubParser->ClientConfiguration(); + + if ( !configuration ) + { + DLTRACEOUT(("No configuration")); + return; + } + + CleanupDeletePushL( configuration ); + DASSERT( iPendingMessage ); + + RArray accesspoints; + CleanupClosePushL( accesspoints ); + // Parse access point data from client configuration response. + iGeneralManager.AccessPointManager().ParseAccessPointDataFromClientConfL( + *configuration, + iPendingMessage->Session().Context().FamilyId(), + ETrue, + &accesspoints ); + + iAccessPoint = 0; + + if ( accesspoints.Count() ) + { + DLTRACE(("%d accesspoints were created", accesspoints.Count() )); + iAccessPoint = accesspoints[0]; + DLTRACE(("iAccessPoint: %d", iAccessPoint )); + } + + CleanupStack::PopAndDestroy( 2, configuration ); // accesspoints, aConfiguration + } + + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CNcdCreateAccessPointOperation::CNcdCreateAccessPointOperation( + MNcdOperationRemoveHandler& aRemoveHandler, + CNcdGeneralManager& aGeneralManager, + MCatalogsSession& aSession ) + : + CNcdBaseOperation( aGeneralManager, &aRemoveHandler, ECreateAccessPointOperation, + aSession ) + { + } + + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CNcdCreateAccessPointOperation::ConstructL( + HBufC* aAccessPointData ) + { + DLTRACEIN( ( "" ) ); + + // Call ConstructL for the base class + CNcdBaseOperation::ConstructL(); + + iAccessPointData = aAccessPointData; + + }