ncdengine/provider/server/src/ncdcreateaccesspointoperationimpl.cpp
changeset 0 ba25891c3a9e
--- /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 <s32mem.h>
+#include <apmstd.h>
+
+#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<CNcdParserImpl*>( 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<TUint32> 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;
+
+    }