diff -r 000000000000 -r ba25891c3a9e iaupdate/IAD/engine/controller/src/iaupdatefwnodeimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/engine/controller/src/iaupdatefwnodeimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,434 @@ +/* +* Copyright (c) 2007-2009 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 module contains the implementation of CIAUpdateFwNode class +* member functions. +* +*/ + + + +#include +#include +#include +#include +#include +#include + +#include "iaupdatefwnodeimpl.h" +#include "iaupdatecontrollerimpl.h" +#include "iaupdatefwpurchaseoperation.h" +#include "iaupdatefwnodeobserver.h" +#include "iaupdatenodedetails.h" +#include "iaupdatedebug.h" + + +// ----------------------------------------------------------------------------- +// CIAUpdateFwNode::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CIAUpdateFwNode* CIAUpdateFwNode::NewLC( + MNcdNode* aNode, + CIAUpdateController& aController, + MIAUpdateFwNode::TFwUpdateType aFwType ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::NewLC() begin"); + + CIAUpdateFwNode* self = + new( ELeave ) CIAUpdateFwNode( aController, aFwType ); + CleanupStack::PushL( self ); + self->ConstructL( aNode ); + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::NewLC() end"); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateFwNode::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CIAUpdateFwNode* CIAUpdateFwNode::NewL( + MNcdNode* aNode, + CIAUpdateController& aController, + MIAUpdateFwNode::TFwUpdateType aFwType ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::NewL() begin"); + + CIAUpdateFwNode* self = + CIAUpdateFwNode::NewLC( aNode, aController, aFwType ); + CleanupStack::Pop( self ); + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::NewL() end"); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateFwNode::CIAUpdateFwNode +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CIAUpdateFwNode::CIAUpdateFwNode( CIAUpdateController& aController, + MIAUpdateFwNode::TFwUpdateType aFwType ) +: CIAUpdateBaseNode( aController ), + iType( aFwType ) + { + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateFwNode::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CIAUpdateFwNode::ConstructL( MNcdNode* aNode ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::ConstructL() begin"); + + // Let the parent handle it all. + CIAUpdateBaseNode::ConstructL( aNode ); + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::ConstructL() end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateFwNode::~CIAUpdateFwNode +// Destructor +// ----------------------------------------------------------------------------- +// +CIAUpdateFwNode::~CIAUpdateFwNode() + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::~CIAUpdateFwNode() begin"); + + if ( iPurchaseOperation ) + { + // Because purchase operation exists, set the cancelling flag on. + // Then, observer callbacks are not called when the deletion of + // the object cancels the operation. + // Also, notice that instead of directly using the error code given + // to callbacks, we use the local cancel flag. So, we can handle cases + // when operation was able to finish and cancellation did not occur even + // if it was requested. That would most likely never occur, but better to + // be safe than sorry,. + iCancelling = ETrue; + // Notice, that callback function will delete the iPurchaseOperation. + // So, do not call delete instead of cancel operation here because then + // delete would be called twice for the same pointer. Instead, just use + // the CancelOperation function call. + iPurchaseOperation->CancelOperation(); + // There should not be any need to call delete after cancel above. + // But, insert it here just in case the operation functionality changes. + // It does not hurt to call it here now + // because pointer should always be NULL already. + delete iPurchaseOperation; + } + + delete iContentUrl; + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::~CIAUpdateFwNode() end"); + } + + +// --------------------------------------------------------------------------- +// MIAUpdateFwNode functions +// +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::FwType +// +// --------------------------------------------------------------------------- +// +MIAUpdateFwNode::TFwUpdateType CIAUpdateFwNode::FwType() const + { + return iType; + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::FwVersion1 +// +// --------------------------------------------------------------------------- +// +const TDesC& CIAUpdateFwNode::FwVersion1() const + { + return Details().FwVersion1(); + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::FwVersion2 +// +// --------------------------------------------------------------------------- +// +const TDesC& CIAUpdateFwNode::FwVersion2() const + { + return Details().FwVersion2(); + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::FwVersion3 +// +// --------------------------------------------------------------------------- +// +const TDesC& CIAUpdateFwNode::FwVersion3() const + { + return Details().FwVersion3(); + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::InitDownloadDataL +// +// --------------------------------------------------------------------------- +// +TBool CIAUpdateFwNode::InitDownloadDataL( MIAUpdateFwNodeObserver& aObserver ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::InitDownloadDataL() begin"); + + if ( iPurchaseOperation ) + { + IAUPDATE_TRACE("[IAUPDATE] ERROR: KErrInUse, operation already going on."); + User::Leave( KErrInUse ); + } + + // Create new purchase operation and start it if purchase is necessary. + IAUPDATE_TRACE("[IAUPDATE] Create new purchase operation"); + CIAUpdateContentOperation* tmpPurchaseOperation( + CIAUpdateFwPurchaseOperation::NewLC( *this, *this ) ); + TBool operationStarted( + tmpPurchaseOperation->StartOperationL() ); + + if ( operationStarted ) + { + IAUPDATE_TRACE("[IAUPDATE] Operation started"); + + // Ownership will be transferred below to the member variable. + // So, do not leve the operation into the stack. + CleanupStack::Pop( tmpPurchaseOperation ); + + // Now, that function can not leave, set the member variable values. + // These values are required when the asynchronous purcahse operation + // completes and callback functions are called. + iPurchaseOperation = tmpPurchaseOperation; + iObserver = &aObserver; + } + else + { + // Because operation was not started, + // delete the operation object. + CleanupStack::PopAndDestroy( tmpPurchaseOperation ); + tmpPurchaseOperation = NULL; + } + + IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateFwNode::InitDownloadDataL() end: %d", + operationStarted); + + return operationStarted; + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::ContentUrl +// +// --------------------------------------------------------------------------- +// +const TDesC& CIAUpdateFwNode::ContentUrl() const + { + if ( !iContentUrl ) + { + return KNullDesC(); + } + + return *iContentUrl; + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::NodeType +// +// --------------------------------------------------------------------------- +// +MIAUpdateAnyNode::TNodeType CIAUpdateFwNode::NodeType() const + { + return MIAUpdateAnyNode::ENodeTypeFw; + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::Base +// +// --------------------------------------------------------------------------- +// +MIAUpdateBaseNode& CIAUpdateFwNode::Base() + { + return *this; + } + + +// --------------------------------------------------------------------------- +// MIAUpdateContentOperationObserver functions +// +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::ContentOperationComplete +// +// --------------------------------------------------------------------------- +// +void CIAUpdateFwNode::ContentOperationComplete( CIAUpdateBaseNode& /*aNode*/, + TInt aError ) + { + IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateFwNode::ContentOperationComplete() begin: %d", + aError); + + delete iPurchaseOperation; + iPurchaseOperation = NULL; + + // Use the temporary variable here for the observer because, in some cases, + // the observer may delete this object when callback is called and no + // member variables should be used after that. + MIAUpdateFwNodeObserver* tmpObserver( iObserver ); + // Do not delete observer because it is not owned here. + // Just set it to NULL. + iObserver = NULL; + + if ( !iCancelling ) + { + IAUPDATE_TRACE("[IAUPDATE] Operation not cancelled."); + + // Because operation was not cancelled, + // set the URL if everything went OK. + if ( aError == KErrNone ) + { + // If URL can not be set, then replace KErrNone value of aError + // with the leave error. So, that value will be given for the observer. + TRAP( aError, SetContentUrlL() ); + } + + IAUPDATE_TRACE_1("[IAUPDATE] Inform observer: %d", aError); + tmpObserver->InitDownloadDataComplete( *this, aError ); + } + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::ContentOperationComplete() end"); + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::ContentOperationProgress +// +// --------------------------------------------------------------------------- +// +void CIAUpdateFwNode::ContentOperationProgress( CIAUpdateBaseNode& /*aNode*/, + TInt /*aProgress*/, + TInt /*aMaxProgress*/ ) + { + + } + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode functions +// +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::SetContentUrlL +// +// --------------------------------------------------------------------------- +// +void CIAUpdateFwNode::SetContentUrlL() + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::SetContentUrlL() begin"); + + // Before trying to set the new values for content URL, + // delete old values. + delete iContentUrl; + iContentUrl = NULL; + + CNcdPurchaseDetails* details( PurchaseDetailsLC() ); + + TArray< MNcdPurchaseDownloadInfo* > downloadInfos( + details->DownloadInfoL() ); + if ( downloadInfos.Count() == 0 ) + { + IAUPDATE_TRACE("[IAUPDATE] ERROR: KErrNotFound, no download info"); + User::Leave( KErrNotFound ); + } + else + { + IAUPDATE_TRACE_1("[IAUPDATE] Download info count: %d", + downloadInfos.Count()); + // Always use the first download info even if there exists + // multiple of them. + MNcdPurchaseDownloadInfo* info( downloadInfos[ 0 ] ); + // Get the content uri and insert it to the member variable. + iContentUrl = info->ContentUri().AllocL(); + IAUPDATE_TRACE_1("[IAUPDATE] Content uri set: %S", + iContentUrl); + } + + CleanupStack::PopAndDestroy( details ); + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::SetContentUrlL() end"); + } + +// --------------------------------------------------------------------------- +// CIAUpdateFwNode::SetNameL +// +// --------------------------------------------------------------------------- +// +void CIAUpdateFwNode::SetNameL( const MNcdNodeMetadata& /*aMetaData*/ ) + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::SetNameL() begin"); + RTelServer telServer; + CleanupClosePushL( telServer ); + User::LeaveIfError( telServer.Connect() ); + RTelServer::TPhoneInfo teleinfo; + User::LeaveIfError( telServer.GetPhoneInfo( 0, teleinfo ) ); + RMobilePhone phone; + CleanupClosePushL( phone ); + User::LeaveIfError( phone.Open( telServer, teleinfo.iName ) ); + User::LeaveIfError(phone.Initialise()); + TUint32 teleidentityCaps; + phone.GetIdentityCaps( teleidentityCaps ); + RMobilePhone::TMobilePhoneIdentityV1 telid; + TRequestStatus status; + phone.GetPhoneId( status, telid ); + User::WaitForRequest( status ); + delete iName; + iName = NULL; + if ( status==KErrNone ) + { + iName = telid.iModel.AllocL(); + } + else + { + iName = KNullDesC().AllocL(); + } + CleanupStack::PopAndDestroy( &phone ); + CleanupStack::PopAndDestroy( &telServer ); + + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateFwNode::SetNameL() end"); + }